From 9d4fab5c8fc0cfaecc47133e8f4d1ee2a1a0f19a Mon Sep 17 00:00:00 2001 From: Daniel Weaver Date: Wed, 28 Aug 2019 03:37:15 +0000 Subject: [PATCH 0001/1053] Pass check_vjp, add VJP grad and Jac, use fun(y0, t, *args) syntax --- jax/experimental/ode.py | 233 ++++++++++++++++++++++++++++++---------- 1 file changed, 178 insertions(+), 55 deletions(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index 06a6c1015a4c..fed802d9336c 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -18,6 +18,8 @@ autograd/diff library and the Dormand-Prince method for adaptive integration stepsize calculation. Provides improved integration accuracy over fixed stepsize integration methods. + +Adjoint algorithm based on Appendix C of https://arxiv.org/pdf/1806.07366.pdf """ from __future__ import absolute_import @@ -198,28 +200,33 @@ def optimal_step_size(last_step, last_step / factor,) -@functools.partial(jax.jit, static_argnums=(0, 1)) -def odeint(ofunc, args, y0, t, rtol=1.4e-8, atol=1.4e-8): +@functools.partial(jax.jit, static_argnums=(0,)) +def odeint(ofunc, y0, t, *args, **kwargs): """Adaptive stepsize (Dormand-Prince) Runge-Kutta odeint implementation. Args: ofunc: Function to evaluate `yt = ofunc(y, t, *args)` that returns the time derivative of `y`. - args: Additional arguments to `ofunc`. y0: initial value for the state. t: Timespan for `ofunc` evaluation like `np.linspace(0., 10., 101)`. - rtol: Relative local error tolerance for solver. - atol: Absolute local error tolerance for solver. + *args: Additional arguments to `ofunc` beyond y0 and t. + **kwargs: Two relevant keyword arguments: + 'rtol': Relative local error tolerance for solver. + 'atol': Absolute local error tolerance for solver. + Returns: Integrated system values at each timepoint. """ + rtol = kwargs.get('rtol', 1.4e-8) + atol = kwargs.get('atol', 1.4e-8) + @functools.partial(jax.jit, static_argnums=(0,)) - def _fori_body_fun(func, i, val, rtol=1.4e-8, atol=1.4e-8): + def _fori_body_fun(func, i, val): """Internal fori_loop body to interpolate an integral at each timestep.""" t, cur_y, cur_f, cur_t, dt, last_t, interp_coeff, solution = val cur_y, cur_f, cur_t, dt, last_t, interp_coeff = jax.lax.while_loop( lambda x: x[2] < t[i], - functools.partial(_while_body_fun, func, rtol=rtol, atol=atol), + functools.partial(_while_body_fun, func), (cur_y, cur_f, cur_t, dt, last_t, interp_coeff)) relative_output_time = (t[i] - last_t) / (cur_t - last_t) @@ -231,7 +238,7 @@ def _fori_body_fun(func, i, val, rtol=1.4e-8, atol=1.4e-8): out_x)) @functools.partial(jax.jit, static_argnums=(0,)) - def _while_body_fun(func, x, atol=atol, rtol=rtol): + def _while_body_fun(func, x): """Internal while_loop body to determine interpolation coefficients.""" cur_y, cur_f, cur_t, dt, last_t, interp_coeff = x next_t = cur_t + dt @@ -265,24 +272,33 @@ def _while_body_fun(func, x, atol=atol, rtol=rtol): y0)))[-1] -def grad_odeint(ofunc, args): - """Return a function that calculates `vjp(odeint(func(y, t, args))`. +def vjp_odeint(ofunc, y0, t, *args, **kwargs): + """Return a function that calculates `vjp(odeint(func(y, t, *args))`. Args: ofunc: Function `ydot = ofunc(y, t, *args)` to compute the time derivative of `y`. - args: Additional arguments to `ofunc`. + y0: initial value for the state. + t: Timespan for `ofunc` evaluation like `np.linspace(0., 10., 101)`. + *args: Additional arguments to `ofunc` beyond y0 and t. + **kwargs: Two relevant keyword arguments: + 'rtol': Relative local error tolerance for solver. + 'atol': Absolute local error tolerance for solver. Returns: - VJP function `vjp = vjp_all(g, yt, t)` where `yt = ofunc(y, t, *args)` + VJP function `vjp = vjp_all(g)` where `yt = ofunc(y, t, *args)` and g is used for VJP calculation. To evaluate the gradient w/ the VJP, - supply `g = np.ones_like(yt)`. + supply `g = np.ones_like(yt)`. To evaluate the reverse Jacobian do a vmap + over the standard basis of yt. """ + rtol = kwargs.get('rtol', 1.4e-8) + atol = kwargs.get('atol', 1.4e-8) + flat_args, unravel_args = ravel_pytree(args) flat_func = lambda y, t, flat_args: ofunc(y, t, *unravel_args(flat_args)) @jax.jit - def aug_dynamics(augmented_state, t): + def aug_dynamics(augmented_state, t, flat_args): """Original system augmented with vjp_y, vjp_t and vjp_args.""" state_len = int(np.floor_divide( augmented_state.shape[0] - flat_args.shape[0] - 1, 2)) @@ -291,7 +307,7 @@ def aug_dynamics(augmented_state, t): dy_dt, vjpfun = jax.vjp(flat_func, y, t, flat_args) return np.hstack([np.ravel(dy_dt), np.hstack(vjpfun(-adjoint))]) - rev_aug_dynamics = lambda y, t: -aug_dynamics(y, -t) + rev_aug_dynamics = lambda y, t, flat_args: -aug_dynamics(y, -t, flat_args) @jax.jit def _fori_body_fun(i, val): @@ -301,13 +317,19 @@ def _fori_body_fun(i, val): this_t = rev_t[i] this_tarray = rev_tarray[i, :] this_gi = rev_gi[i, :] - this_gim1 = rev_gi[i-1, :] + # this is g[i-1, :] when g has been reversed + this_gim1 = rev_gi[i+1, :] state_len = this_yt.shape[0] vjp_cur_t = np.dot(flat_func(this_yt, this_t, flat_args), this_gi) vjp_t0 = vjp_t0 - vjp_cur_t # Run augmented system backwards to the previous observation. aug_y0 = np.hstack((this_yt, vjp_y, vjp_t0, vjp_args)) - aug_ans = odeint(rev_aug_dynamics, (), aug_y0, this_tarray) + aug_ans = odeint(rev_aug_dynamics, + aug_y0, + this_tarray, + flat_args, + rtol=rtol, + atol=atol) vjp_y = aug_ans[1][state_len:2*state_len] + this_gim1 vjp_t0 = aug_ans[1][2*state_len] vjp_args = aug_ans[1][2*state_len+1:] @@ -316,19 +338,19 @@ def _fori_body_fun(i, val): @jax.jit def vjp_all(g, yt, t): - """Calculate the VJP g * Jac(odeint(ofunc(yt, t, *args), t).""" - rev_yt = yt[-1:0:-1, :] - rev_t = t[-1:0:-1] + """Calculate the VJP g * Jac(odeint(ofunc, y0, t, *args)).""" + rev_yt = yt[-1::-1, :] + rev_t = t[-1::-1] rev_tarray = -np.array([t[-1:0:-1], t[-2::-1]]).T - rev_gi = g[-1:0:-1, :] + rev_gi = g[-1::-1, :] - vjp_y = rev_gi[-1, :] + vjp_y = g[-1, :] vjp_t0 = 0. vjp_args = np.zeros_like(flat_args) time_vjp_list = np.zeros_like(t) result = jax.lax.fori_loop(0, - rev_t.shape[0], + rev_t.shape[0]-1, _fori_body_fun, (rev_yt, rev_t, @@ -341,41 +363,70 @@ def vjp_all(g, yt, t): time_vjp_list = jax.ops.index_update(result[-1], -1, result[-3]) vjp_times = np.hstack(time_vjp_list)[::-1] - return None, result[-4], vjp_times, unravel_args(result[-2]) - return jax.jit(vjp_all) + return tuple([result[-4], vjp_times] + list(result[-2])) + + primals_out = odeint(flat_func, y0, t, flat_args) + vjp_fun = lambda g: vjp_all(g, primals_out, t) + + return primals_out, vjp_fun + + +def my_odeint_grad(fun): + """Calculate the Jacobian of an odeint.""" + @jax.jit + def _gradfun(*args, **kwargs): + ys, pullback = vjp_odeint(fun, *args, **kwargs) + my_grad = pullback(np.ones_like(ys)) + return my_grad + return _gradfun -def test_grad_odeint(): +def my_odeint_jacrev(fun): + """Calculate the Jacobian of an odeint.""" + @jax.jit + def _jacfun(*args, **kwargs): + ys, pullback = vjp_odeint(fun, *args, **kwargs) + my_jac = jax.vmap(pullback)(jax.api._std_basis(ys)) + my_jac = jax.api.tree_map( + functools.partial(jax.api._unravel_array_into_pytree, ys, 0), my_jac) + my_jac = jax.api.tree_transpose( + jax.api.tree_structure(args), jax.api.tree_structure(ys), my_jac) + return my_jac + return _jacfun + + +def nd(f, x, eps=0.0001): + flat_x, unravel = ravel_pytree(x) + dim = len(flat_x) + g = onp.zeros_like(flat_x) + for i in range(dim): + d = onp.zeros_like(flat_x) + d[i] = eps + g[i] = (f(unravel(flat_x + d)) - f(unravel(flat_x - d))) / (2.0 * eps) + return g + + +def test_grad_vjp_odeint(): """Compare numerical and exact differentiation of a simple odeint.""" - def nd(f, x, eps=0.0001): - flat_x, unravel = ravel_pytree(x) - dim = len(flat_x) - g = onp.zeros_like(flat_x) - for i in range(dim): - d = onp.zeros_like(flat_x) - d[i] = eps - g[i] = (f(unravel(flat_x + d)) - f(unravel(flat_x - d))) / (2.0 * eps) - return g def f(y, t, arg1, arg2): return -np.sqrt(t) - y + arg1 - np.mean((y + arg2)**2) def onearg_odeint(args): return np.sum( - odeint(f, args[2], args[0], args[1], atol=1e-8, rtol=1e-8)) + odeint(f, *args, atol=1e-8, rtol=1e-8)) dim = 10 t0 = 0.1 t1 = 0.2 y0 = np.linspace(0.1, 0.9, dim) - fargs = (0.1, 0.2) + arg1 = 0.1 + arg2 = 0.2 + wrap_args = (y0, np.array([t0, t1]), arg1, arg2) - numerical_grad = nd(onearg_odeint, (y0, np.array([t0, t1]), fargs)) - ys = odeint(f, fargs, y0, np.array([t0, t1]), atol=1e-8, rtol=1e-8) - ode_vjp = grad_odeint(f, fargs) - g = np.ones_like(ys) - exact_grad, _ = ravel_pytree(ode_vjp(g, ys, np.array([t0, t1]))) + numerical_grad = nd(onearg_odeint, wrap_args) + exact_grad, _ = ravel_pytree(my_odeint_grad(f)(*wrap_args)) assert np.allclose(numerical_grad, exact_grad) @@ -403,7 +454,7 @@ def f(y, t, arg1, arg2): y0 = np.array([1.]) fargs = (1.0, 0.0) - ys = odeint(f, fargs, y0, ts, atol=0.001, rtol=0.001) + ys = odeint(f, y0, ts, *fargs, atol=0.001, rtol=0.001) # Set up figure. fig = plt.figure(figsize=(8, 6), facecolor='white') @@ -416,17 +467,29 @@ def f(y, t, arg1, arg2): plt.show() -def pend(y, t, b, c): +@jax.jit +def pend(y, t, arg1, arg2): """Simple pendulum system for odeint testing.""" del t theta, omega = y - dydt = np.array([omega, -b*omega - c*np.sin(theta)]) + dydt = np.array([omega, -arg1*omega - arg2*np.sin(theta)]) return dydt -def benchmark_odeint(fun, args, y0, tspace): +@jax.jit +def swoop(y, t, arg1, arg2): + return np.array(y - np.sin(t) - np.cos(t) * arg1 + arg2) + + +@jax.jit +def decay(y, t, arg1, arg2): + return -np.sqrt(t) - y + arg1 - np.mean((y + arg2)**2) + + + +def benchmark_odeint(fun, y0, tspace, *args): """Time performance of JAX odeint method against scipy.integrate.odeint.""" - n_trials = 10 + n_trials = 5 for k in range(n_trials): start = time.time() scipy_result = osp_integrate.odeint(fun, y0, tspace, args) @@ -435,10 +498,7 @@ def benchmark_odeint(fun, args, y0, tspace): k+1, n_trials, end-start)) for k in range(n_trials): start = time.time() - jax_result = odeint(fun, - args, - np.asarray(y0), - np.asarray(tspace)) + jax_result = odeint(fun, np.array(y0), np.array(tspace), *args) jax_result.block_until_ready() end = time.time() print('JAX odeint elapsed time ({} of {}): {}'.format( @@ -451,12 +511,75 @@ def benchmark_odeint(fun, args, y0, tspace): def pend_benchmark_odeint(): _, _ = benchmark_odeint(pend, - (0.25, 9.8), (onp.pi - 0.1, 0.0), - onp.linspace(0., 10., 101)) + onp.linspace(0., 10., 101), + 0.25, + 9.8) + + +def test_odeint_grad(): + """Test the gradient behavior of various ODE integrations.""" + def _test_odeint_grad(func, *args): + def onearg_odeint(fargs): + return np.sum(odeint(func, *fargs)) + + numerical_grad = nd(onearg_odeint, args) + exact_grad, _ = ravel_pytree(my_odeint_grad(func)(*args)) + assert np.allclose(numerical_grad, exact_grad) + + ts = np.array((0.1, 0.2)) + y0 = np.linspace(0.1, 0.9, 10) + big_y0 = np.linspace(1.1, 10.9, 10) + + # check pend() + for cond in ( + (np.array((onp.pi - 0.1, 0.0)), ts, 0.25, 0.98), + (np.array((onp.pi * 0.1, 0.0)), ts, 0.1, 0.4), + ): + _test_odeint_grad(pend, *cond) + + # check swoop + for cond in ( + (y0, ts, 0.1, 0.2), + (big_y0, ts, 0.1, 0.3), + ): + _test_odeint_grad(swoop, *cond) + + # check decay + for cond in ( + (y0, ts, 0.1, 0.2), + (big_y0, ts, 0.1, 0.3), + ): + _test_odeint_grad(decay, *cond) + + +def test_odeint_vjp(): + """Use check_vjp to check odeint VJP calculations.""" + + # check pend() + y = np.array([np.pi - 0.1, 0.0]) + t = np.linspace(0., 10., 11) + b = 0.25 + c = 9.8 + wrap_args = (y, t, b, c) + pend_odeint_wrap = lambda y, t, *args: odeint(pend, y, t, *args) + pend_vjp_wrap = lambda *wrap_args: vjp_odeint(pend, *wrap_args) + jax.test_util.check_vjp(pend_odeint_wrap, pend_vjp_wrap, wrap_args) + + # check swoop() + y = np.array([0.1]) + t = np.linspace(0., 10., 11) + arg1 = 0.1 + arg2 = 0.2 + wrap_args = (y, t, arg1, arg2) + swoop_odeint_wrap = lambda y, t, *args: odeint(swoop, y, t, *args) + swoop_vjp_wrap = lambda *wrap_args: vjp_odeint(swoop, *wrap_args) + jax.test_util.check_vjp(swoop_odeint_wrap, swoop_vjp_wrap, wrap_args) + + # decay() check_vjp hangs! if __name__ == '__main__': - test_grad_odeint() - + test_odeint_grad() + test_odeint_vjp() From ae2c39d081d29b6abe8eefff5c755f0f0abaad57 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Sat, 31 Aug 2019 02:13:12 +0100 Subject: [PATCH 0002/1053] Added custom jvp for np.linalg.det For faster gradient computation for determinants, added closed-form expressing for Jacobian-vector product. Still needs a test. --- jax/numpy/linalg.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index aad84415dffa..973780de3aa5 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -86,9 +86,11 @@ def slogdet(a): @_wraps(onp.linalg.det) +@custom_transforms def det(a): sign, logdet = slogdet(a) return sign * np.exp(logdet) +defjvp(det, lambda g, ans, x: np.trace(np.dot(g, np.linalg.inv(x)))*ans) @_wraps(onp.linalg.eig) From 1c264db3a35c92cf987bc588a37f6b9a0dbc1177 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Sat, 31 Aug 2019 03:18:24 +0100 Subject: [PATCH 0003/1053] Slightly cleaner implementation of jvp for det Replaced np.dot/np.linalg.inv with a single np.linalg.solve --- jax/numpy/linalg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 973780de3aa5..0a429336667d 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -90,7 +90,7 @@ def slogdet(a): def det(a): sign, logdet = slogdet(a) return sign * np.exp(logdet) -defjvp(det, lambda g, ans, x: np.trace(np.dot(g, np.linalg.inv(x)))*ans) +defjvp(det, lambda g, ans, x: np.trace(np.linalg.solve(x, g))*ans) @_wraps(onp.linalg.eig) From 3427d2cb20abdc01b4398036285d89f2894eb6f1 Mon Sep 17 00:00:00 2001 From: Daniel Weaver Date: Fri, 30 Aug 2019 22:23:11 +0000 Subject: [PATCH 0004/1053] Add `build_odeint` for odeint VJP setup, plus a test --- jax/experimental/ode.py | 59 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index fed802d9336c..f074af9bda51 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -35,6 +35,7 @@ import jax.lax import jax.numpy as np import jax.ops +from jax.test_util import check_vjp import matplotlib.pyplot as plt import numpy as onp import scipy.integrate as osp_integrate @@ -372,6 +373,34 @@ def vjp_all(g, yt, t): return primals_out, vjp_fun +def build_odeint(ofunc, rtol=1.4e-8, atol=1.4e-8): + """Return `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)`. + + Given the function ofunc(y, t, *args), return the jitted function + `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)` with + the VJP of `f` defined using `vjp_odeint`, where: + + `y0` is the initial condition of the ODE integration, + `t` is the time course of the integration, and + `*args` are all other arguments to `ofunc`. + + Args: + ofunc: The function to be wrapped into an ODE integration. + rtol: relative local error tolerance for solver. + atol: absolute local error tolerance for solver. + + Returns: + `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)` + """ + ct_odeint = jax.custom_transforms( + lambda y0, t, *args: odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol)) + + v = lambda y0, t, *args: vjp_odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol) + jax.defvjp_all(ct_odeint, v) + + return jax.jit(ct_odeint) + + def my_odeint_grad(fun): """Calculate the Jacobian of an odeint.""" @jax.jit @@ -483,8 +512,7 @@ def swoop(y, t, arg1, arg2): @jax.jit def decay(y, t, arg1, arg2): - return -np.sqrt(t) - y + arg1 - np.mean((y + arg2)**2) - + return -np.sqrt(t) - y + arg1 - np.mean((y + arg2)**2) def benchmark_odeint(fun, y0, tspace, *args): @@ -563,8 +591,8 @@ def test_odeint_vjp(): c = 9.8 wrap_args = (y, t, b, c) pend_odeint_wrap = lambda y, t, *args: odeint(pend, y, t, *args) - pend_vjp_wrap = lambda *wrap_args: vjp_odeint(pend, *wrap_args) - jax.test_util.check_vjp(pend_odeint_wrap, pend_vjp_wrap, wrap_args) + pend_vjp_wrap = lambda y, t, *args: vjp_odeint(pend, y, t, *args) + check_vjp(pend_odeint_wrap, pend_vjp_wrap, wrap_args) # check swoop() y = np.array([0.1]) @@ -573,12 +601,31 @@ def test_odeint_vjp(): arg2 = 0.2 wrap_args = (y, t, arg1, arg2) swoop_odeint_wrap = lambda y, t, *args: odeint(swoop, y, t, *args) - swoop_vjp_wrap = lambda *wrap_args: vjp_odeint(swoop, *wrap_args) - jax.test_util.check_vjp(swoop_odeint_wrap, swoop_vjp_wrap, wrap_args) + swoop_vjp_wrap = lambda y, t, *args: vjp_odeint(swoop, y, t, *args) + check_vjp(swoop_odeint_wrap, swoop_vjp_wrap, wrap_args) # decay() check_vjp hangs! +def test_defvjp_all(): + """Use build_odeint to check odeint VJP calculations.""" + n_trials = 5 + swoop_build = build_odeint(swoop) + jacswoop = jax.jit(jax.jacrev(swoop_build)) + y = np.array([0.1]) + t = np.linspace(0., 2., 11) + arg1 = 0.1 + arg2 = 0.2 + wrap_args = (y, t, arg1, arg2) + for k in range(n_trials): + start = time.time() + rslt = jacswoop(*wrap_args) + rslt.block_until_ready() + end = time.time() + print('JAX jacrev elapsed time ({} of {}): {}'.format( + k+1, n_trials, end-start)) + + if __name__ == '__main__': test_odeint_grad() From b819bff1d3afe74320eba451dd3d79fc6854c8d6 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Thu, 5 Sep 2019 15:22:36 +0100 Subject: [PATCH 0005/1053] Imports for custom_transforms and defjvp Can't really do this if we don't have the right imports... --- jax/numpy/linalg.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 0a429336667d..5e004d7e0cc0 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -27,6 +27,7 @@ from .lax_numpy import _not_implemented from .lax_numpy import _wraps from . import lax_numpy as np +from ..api import custom_transforms, defjvp from ..util import get_module_functions from ..lib import xla_bridge From dbea4b6f976d9963854017bb5f5c30d84a27c022 Mon Sep 17 00:00:00 2001 From: Roman Novak <44512421+romanngg@users.noreply.github.com> Date: Fri, 6 Sep 2019 20:30:30 -0700 Subject: [PATCH 0006/1053] Fix typos Hit these when trying to debug NaNs, appear to be just typos. --- jax/interpreters/xla.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 14c8429a6cfb..f44be5a1a96e 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -197,7 +197,7 @@ def compile_jaxpr(jaxpr, device_assignment, backend, axis_env, const_vals, *abst if axis_env.nreps > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") - raise ValueErrr(msg.format(axis_env.nreps, xb.device_count(backend))) + raise ValueError(msg.format(axis_env.nreps, xb.device_count(backend))) arg_shapes = tuple(map(aval_to_xla_shape, abstract_args)) built_c = jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), *arg_shapes) compile_opts = xb.get_compile_options(num_replicas=axis_env.nreps, @@ -401,14 +401,14 @@ def _execute_compiled(compiled, backend, handlers, *args): device_num, = compiled.DeviceOrdinals() input_bufs = [device_put(x, device_num, backend=backend) for x in args] out_bufs = compiled.Execute(input_bufs).destructure() - if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_buf) + if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] def _execute_replicated(compiled, backend, handlers, *args): input_bufs = [[device_put(x, i, backend=backend) for x in args] for i in compiled.DeviceOrdinals()] out_bufs = compiled.ExecutePerReplica(input_bufs)[0].destructure() - if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_buf) + if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] From 302dcc7e741ba18176ffaa92aefddbb44277b412 Mon Sep 17 00:00:00 2001 From: Roman Novak <44512421+romanngg@users.noreply.github.com> Date: Fri, 6 Sep 2019 20:47:02 -0700 Subject: [PATCH 0007/1053] Fix `check_nans` method --- jax/interpreters/xla.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index f44be5a1a96e..307d00762735 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -174,12 +174,12 @@ def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): if FLAGS.jax_debug_nans: check_nans(prim, out_buf) return result_handler(out_buf) -def check_nans(prim, buf): +def check_nans(prim, bufs): if prim.multiple_results: - shapes = buf.shape().tuple_shapes() - _map(partial(_check_nans, prim.name), shapes, buf.destructure()) + for buf in bufs: + _check_nans(prim.name, buf.shape(), buf) else: - _check_nans(prim.name, buf.shape(), buf) + _check_nans(prim.name, bufs.shape(), bufs) def _check_nans(name, xla_shape, buf): if xla_shape.is_tuple(): From bcad02ff8a3aa6b60d88786614fd8d123e1baf36 Mon Sep 17 00:00:00 2001 From: Daniel Weaver Date: Mon, 9 Sep 2019 19:54:10 +0000 Subject: [PATCH 0008/1053] Remove 64-bit mode for GPU performance --- jax/experimental/ode.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index f074af9bda51..05cd9818d92b 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -30,7 +30,6 @@ import time import jax -from jax.config import config from jax.flatten_util import ravel_pytree import jax.lax import jax.numpy as np @@ -40,8 +39,6 @@ import numpy as onp import scipy.integrate as osp_integrate -config.update('jax_enable_x64', True) - # Dopri5 Butcher tableaux alpha = np.array([1 / 5, 3 / 10, 4 / 5, 8 / 9, 1., 1., 0]) From 74f6269ee945276ccc3fdaf7089cce3638a3bc18 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 9 Sep 2019 17:47:15 -0700 Subject: [PATCH 0009/1053] make jvp only form JVPTracers with nonzero tangent fixes #1316 --- jax/interpreters/ad.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 201a7e4d64ff..cf7242cce0c8 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -61,7 +61,9 @@ def jvp_subtrace(master, primals, tangents): for x in list(primals) + list(tangents): if isinstance(x, Tracer): assert x.trace.level < trace.level - ans = yield map(partial(JVPTracer, trace), primals, tangents), {} + in_tracers = [JVPTracer(trace, x, t) if t is not zero else x + for x, t in zip(primals, tangents)] + ans = yield in_tracers, {} out_tracers = map(trace.full_raise, ans) yield unzip2([(out_tracer.primal, out_tracer.tangent) for out_tracer in out_tracers]) From 84992b5ba717bbdf3d4039a6a93e924d8d9d4fa9 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 9 Sep 2019 18:25:16 -0700 Subject: [PATCH 0010/1053] add test for issue #1316 --- tests/lax_control_flow_test.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index fc5ef8aa2aa0..342096e6ad00 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -972,6 +972,15 @@ def testWhileCondConstant(self): out = lax.while_loop(lambda _: False, lambda _: (), ()) # doesn't crash self.assertEqual(out, ()) + def testIssue1316(self): + def f(carry, _): + c, key = carry + key, _ = random.split(key) + return (c, key), () + + key = random.PRNGKey(0) + api.grad(lambda c: lax.scan(f, (c, key), onp.ones(3))[0][0])(0.) # doesn't crash + if __name__ == '__main__': absltest.main() From 65f80d6ab23de9436b2b2132b8d0af67938a7ca1 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 10 Sep 2019 07:56:11 -0700 Subject: [PATCH 0011/1053] bump version number for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 87c8dcd98f0f..cfb6eaf19be2 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.44" +__version__ = "0.1.45" From b4b14b7e2b3cdd8b6fff33cb1aefc5f5ea0e8f9b Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 10 Sep 2019 13:58:23 -0700 Subject: [PATCH 0012/1053] remove broadcasts from _dot_general_batch_rule --- jax/lax/lax.py | 44 ++++++++++++++++++++++++++---------------- tests/batching_test.py | 5 +++++ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index fa39f0d49c3a..aba5a9c4fc3f 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2236,35 +2236,45 @@ def _dot_general_transpose_rhs(g, x, dimension_numbers, precision): def _dot_general_batch_rule(batched_args, batch_dims, dimension_numbers, precision): + # there are three kinds of dimensions in a dot_general: + # - contraction dimensions appear in lhs and rhs but not the result + # - batch dimensions appear in lhs, rhs, and result + # - tensor product dimensions appear in the result and one of lhs or rhs (lhs_contract, rhs_contract), (lhs_batch, rhs_batch) = dimension_numbers lhs, rhs = batched_args lbd, rbd = batch_dims assert lbd is not None or rbd is not None - - if lbd is not None: + if lbd is not None and rbd is not None: + # adding a batch dimension if lbd != 0: lhs = batching.moveaxis(lhs, lbd, 0) - lbd = 0 - else: - assert rbd is not None - lhs = broadcast(lhs, (rhs.shape[rbd],)) - lhs_contract = tuple(onp.add(1, lhs_contract)) - lhs_batch = (0,) + tuple(onp.add(1, lhs_batch)) - - if rbd is not None: if rbd != 0: rhs = batching.moveaxis(rhs, rbd, 0) - rbd = 0 + lhs_batch = (0,) + tuple(onp.add(1, lhs_batch)) + rhs_batch = (0,) + tuple(onp.add(1, rhs_batch)) + lhs_contract = tuple(onp.add(1, lhs_contract)) + rhs_contract = tuple(onp.add(1, rhs_contract)) + result_batch_dim = 0 else: - assert lbd is not None - rhs = broadcast(rhs, (lhs.shape[lbd],)) - rhs_contract = tuple(onp.add(1, rhs_contract)) - rhs_batch = (0,) + tuple(onp.add(1, rhs_batch)) - + # adding a tensor product dimension + if lbd is not None: + # make sure it's the last lhs dimension to avoid changing batch dims + if lbd != lhs.ndim - 1: + lhs = batching.moveaxis(lhs, lbd, lhs.ndim - 1) + # lhs tensor product dims in result come after batch dims + result_batch_dim = lhs.ndim - len(lhs_contract) - 1 + else: + # make sure it's the last rhs dimension to avoid changing batch dims + if rbd != rhs.ndim - 1: + rhs = batching.moveaxis(rhs, rbd, rhs.ndim - 1) + # rhs tensor product dims in result come after batch dims + lhs tensor + # product dims + result_batch_dim = (lhs.ndim - len(lhs_contract) - len(lhs_batch) + + rhs.ndim - len(rhs_contract) - 1) new_dimension_numbers = [(lhs_contract, rhs_contract), (lhs_batch, rhs_batch)] batched_out = dot_general(lhs, rhs, new_dimension_numbers, precision=precision) - return batched_out, 0 + return batched_out, result_batch_dim def _dot_general_translation_rule(c, lhs, rhs, dimension_numbers, precision): return c.DotGeneral(lhs, rhs, dimension_numbers, diff --git a/tests/batching_test.py b/tests/batching_test.py index 21f5b4b43ce0..22bc6ebd6f1c 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -291,6 +291,11 @@ def testDot4(self): ans = vmap(np.dot, in_axes=(1, None))(xs, ys) expected = onp.einsum('ij,i->j', xs, ys) self.assertAllClose(ans, expected, check_dtypes=False) + + def testDot5(self): + f = vmap(partial(np.einsum, 'ij,j->i'), (None, 0)) + jaxpr = make_jaxpr(f)(np.zeros((1000, 1000)), np.zeros((1000, 1000))) + assert "broadcast" not in str(jaxpr) def testPad(self): R = onp.random.RandomState(0).randn From 53d4283df5327474da0b8f88daead556042039d9 Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Tue, 10 Sep 2019 23:25:12 -0700 Subject: [PATCH 0013/1053] fix xla shape-checking error message --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 307d00762735..d695fad0a241 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -162,7 +162,7 @@ def primitive_computation(prim, *xla_shapes, **params): try: return c.Build() except RuntimeError as e: - msg = (e.message + "\n" + msg = (" ".join(map(str, e.args)) + "\n" "This is a bug in JAX's shape-checking rules; please report it!\n" "https://github.com/google/jax/issues\n") raise RuntimeError(msg) From a5f67d553d9b6c49d3a5f476d99d819ce6607303 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 11 Sep 2019 08:19:26 -0400 Subject: [PATCH 0014/1053] Fix incorrect slogdet parity calculation in presence of batch dimensions. --- jax/numpy/linalg.py | 5 +++-- tests/linalg_test.py | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index aad84415dffa..be7a9682054a 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -60,6 +60,7 @@ def svd(a, full_matrices=True, compute_uv=True): @_wraps(onp.linalg.slogdet) +@jit def slogdet(a): a = _promote_arg_dtypes(np.asarray(a)) dtype = lax.dtype(a) @@ -72,10 +73,10 @@ def slogdet(a): is_zero = np.any(diag == np.array(0, dtype=dtype), axis=-1) parity = np.count_nonzero(pivot != np.arange(a_shape[-1]), axis=-1) if np.iscomplexobj(a): - sign = np.prod(diag / np.abs(diag)) + sign = np.prod(diag / np.abs(diag), axis=-1) else: sign = np.array(1, dtype=dtype) - parity = parity + np.count_nonzero(diag < 0) + parity = parity + np.count_nonzero(diag < 0, axis=-1) sign = np.where(is_zero, np.array(0, dtype=dtype), sign * np.array(-2 * (parity % 2) + 1, dtype=dtype)) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 95bf853d3dd9..9520908a79a6 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -99,19 +99,27 @@ def testDet(self, n, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": - "_n={}".format(jtu.format_shape_dtype_string((n,n), dtype)), - "n": n, "dtype": dtype, "rng": rng} - for n in [0, 4, 10, 200] + "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng": rng} + for shape in [(0, 0), (1, 1), (3, 3), (4, 4), (10, 10), (200, 200), + (2, 2, 2), (2, 3, 3), (3, 2, 2)] for dtype in float_types + complex_types for rng in [jtu.rand_default()])) - def testSlogdet(self, n, dtype, rng): + def testSlogdet(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) - args_maker = lambda: [rng((n, n), dtype)] + args_maker = lambda: [rng(shape, dtype)] self._CheckAgainstNumpy(onp.linalg.slogdet, np.linalg.slogdet, args_maker, check_dtypes=True, tol=1e-3) self._CompileAndCheck(np.linalg.slogdet, args_maker, check_dtypes=True) + def testIssue1213(self): + for n in range(5): + mat = np.array([onp.diag(onp.ones([5], dtype=onp.float32))*(-.01)] * 2) + args_maker = lambda: [mat] + self._CheckAgainstNumpy(onp.linalg.slogdet, np.linalg.slogdet, args_maker, + check_dtypes=True, tol=1e-3) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format( jtu.format_shape_dtype_string(shape, dtype)), From 6f0e244e9abf949ee2a0f801f36a3b15a1b28d5e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 11 Sep 2019 06:01:32 -0700 Subject: [PATCH 0015/1053] fix vmap-of-pmap bug thanks @romanngg and @inoryy --- jax/interpreters/batching.py | 5 +++-- tests/pmap_test.py | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index ed76af12579b..01fcdb7d3337 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -139,10 +139,11 @@ def process_map(self, map_primitive, f, tracers, params): is_batched = tuple(d is not not_mapped for d in dims) vals = [moveaxis(x, d, 1) if d is not not_mapped and d != 1 else x for x, d in zip(vals, dims)] - dims = tuple(not_mapped if d is not_mapped else 1 for d in dims) + dims = tuple(not_mapped if d is not_mapped else 0 for d in dims) f, dims_out = batch_subtrace(f, self.master, dims) vals_out = map_primitive.bind(f, *vals, **params) - return [BatchTracer(self, v, d) for v, d in zip(vals_out, dims_out())] + dims_out = tuple(d + 1 if d is not not_mapped else d for d in dims_out()) + return [BatchTracer(self, v, d) for v, d in zip(vals_out, dims_out)] def post_process_call(self, call_primitive, out_tracers, params): vals, dims = unzip2((t.val, t.batch_dim) for t in out_tracers) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 9053969822fb..c2971f46f27e 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -27,6 +27,7 @@ from jax import test_util as jtu from jax import core from jax import lax +from jax import random from jax.api import (pmap, soft_pmap, jit, vmap, jvp, grad, make_jaxpr, linearize, device_put) from jax.lib import xla_bridge @@ -473,6 +474,22 @@ def testVmapOfPmap(self): bx = vmap(f1)(ax) self.assertAllClose(ax, bx, check_dtypes=False) + def testVmapOfPmap2(self): + N_DEVICES = xla_bridge.device_count() + keys = random.split(random.PRNGKey(1), 13) # [13, 2] + + @pmap + def g(key): + params = random.normal(key, ()) + return 0. + + @vmap + def s(keys): + keys = np.broadcast_to(keys, (N_DEVICES,) + keys.shape) + return g(keys) + + s(keys) + def testVmapOfPmapNonLeadingAxis(self): device_count = xla_bridge.device_count() f0 = lambda x: x From 37323c13ff3abbc8e140142755de809249d2cbff Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 11 Sep 2019 06:22:25 -0700 Subject: [PATCH 0016/1053] check output shape in testVmapOfPmap2 --- tests/pmap_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index c2971f46f27e..51bab05412ef 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -488,7 +488,8 @@ def s(keys): keys = np.broadcast_to(keys, (N_DEVICES,) + keys.shape) return g(keys) - s(keys) + ans = s(keys) # doesn't crash + self.assertEqual(ans.shape, (13, N_DEVICES)) def testVmapOfPmapNonLeadingAxis(self): device_count = xla_bridge.device_count() From 4ee28cf95af6d59731725e5b4bd2ba462e013db0 Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Wed, 11 Sep 2019 14:15:38 -0700 Subject: [PATCH 0017/1053] Make pxla.axis_index return signed indices for type compatibility with other jax indices. --- jax/interpreters/pxla.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 8cb119692fae..ab725f9c3851 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -274,15 +274,19 @@ def _axis_index_partial_eval(trace, _, **params): # This partial_eval rule adds the axis_index primitive into the jaxpr formed # during pmap lowering. It is like the standard JaxprTrace.process_primitive # rule except that we don't attempt to lower out of the trace. - out_aval = ShapedArray((), onp.uint32) + out_aval = ShapedArray((), onp.int32) out_tracer = pe.JaxprTracer(trace, pe.PartialVal((out_aval, core.unit)), None) eqn = core.new_jaxpr_eqn([], [out_tracer], axis_index_p, (), params) out_tracer.recipe = eqn return out_tracer +def _axis_index_translation_rule(c, hard_size, soft_size, axis_name): + unsigned_index = c.Rem(c.ReplicaId(), + c.Constant(onp.array(hard_size, onp.uint32))) + return c.ConvertElementType(unsigned_index, xb.dtype_to_etype(onp.int32)) + axis_index_p = core.Primitive('axis_index') -xla.translations[axis_index_p] = lambda c, hard_size, soft_size, axis_name: \ - c.Rem(c.ReplicaId(), c.Constant(onp.array(hard_size, onp.uint32))) +xla.translations[axis_index_p] = _axis_index_translation_rule pe.custom_partial_eval_rules[axis_index_p] = _axis_index_partial_eval From 0c3e9ce22a3f79139738376ab294f9649b9261b4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 29 Aug 2019 14:29:49 -0700 Subject: [PATCH 0018/1053] sketch of root w/ parameterized solvers Co-authored-by: Stephan Hoyer --- jax/lax/lax_control_flow.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 679762a32e31..a3bdc23b5b1e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -822,3 +822,27 @@ def body(i, dst): return fori_loop(0, num, body, dst) masking.masking_rules[lax.concatenate_p] = _concat_masking_rule + + +def root(f, initial_guess, solve=solve, tangent_solve=tangent_solve): + guess_flat, in_tree = tree_flatten((initial_guess,)) + guess_avals = tuple(_map(_abstractify, guess_flat)) + jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_tree, guess_avals) + assert out_tree == in_tree + out_flat = root_p.bind(*consts, jaxpr=jaxpr, solve=solve, + tangent_solve=tangent_solve) + return tree_unflatten(out_tree, out_flat) + +def _root_abstract_eval(*args, **kwargs): + del kwargs # Unused. + return args + +def _root_impl(*args, **kwargs): + jaxpr, solve, _ = split_dict(kwargs, ['jaxpr', 'solve', 'tangent_solve']) + f = core.jaxpr_as_fun(jaxpr) + return solve(f, args) + +root_p = core.Primitive('root') +root_p.multiple_results = True +root_p.def_impl = _root_impl +xla.initial_style_translations[scan_p] = xla.lower_fun(_root_impl, initial_style=True) From 495230463eef7d6ffecfe1d790e40d5b5fc7fc70 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 11 Sep 2019 21:24:50 -0700 Subject: [PATCH 0019/1053] Finish filling out lax.root --- jax/lax/lax_control_flow.py | 105 +++++++++++++++++++++++++++++---- tests/lax_control_flow_test.py | 44 ++++++++++++++ 2 files changed, 137 insertions(+), 12 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index a3bdc23b5b1e..3c2dea3b0392 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -42,7 +42,7 @@ from jax.util import (partial, unzip2, safe_map, safe_zip, split_list, split_dict, cache) from jax.tree_util import (tree_flatten, tree_unflatten, treedef_is_leaf, - treedef_children) + treedef_children, treedef_tuple, tree_map) from jax import ad_util _map = safe_map @@ -824,25 +824,106 @@ def body(i, dst): masking.masking_rules[lax.concatenate_p] = _concat_masking_rule -def root(f, initial_guess, solve=solve, tangent_solve=tangent_solve): +def root(f, initial_guess, solve, tangent_solve): + """Differentiably solve for the roots of a function. + + Args: + f: function for which to find a root. Should return a tree of arrays with + the same structure as its input argument. + initial_guess: initial guess for a zero of f. + solve: callable that takes two positional arguments, f and initial_guess, + and returns a solution with the same structure as initial_guess such + that func(solution) = 0. In other words, the following is assumed to be + true (but not checked): + solution = solve(f, initial_guess) + error = f(solution) + assert all(error == 0) + tangent_solve: callable that takes two positional arguments, a linear + function ``f`` and a tree of array(s) ``y`` with the same structure as + initial_guess, and returns a solution ``x`` such that ``f(x)=y``: + + - For scalar ``y``, use ``lambda f, y: y / f(1.0)``. + - For vector ``y``, you could use a linear solve with the Jacobian, if + dimensionality of ``y`` is not too large: + ``lambda f, y: np.linalg.solve(jacobian(f)(y), y)``. + + Returns: + The result of calling solve(f, initial_guess) with gradients defined via + implicit differentiation assuming f(solve(f, initial_guess)) = 0. + """ guess_flat, in_tree = tree_flatten((initial_guess,)) guess_avals = tuple(_map(_abstractify, guess_flat)) jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_tree, guess_avals) - assert out_tree == in_tree - out_flat = root_p.bind(*consts, jaxpr=jaxpr, solve=solve, - tangent_solve=tangent_solve) + assert treedef_tuple([out_tree]) == in_tree + out_flat = root_p.bind(*itertools.chain(consts, guess_flat), + tree=out_tree, num_consts=len(consts), + jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) return tree_unflatten(out_tree, out_flat) + def _root_abstract_eval(*args, **kwargs): - del kwargs # Unused. - return args + return args[kwargs['num_consts']:] + + +def _solve_flat(solve, f_jaxpr, consts, guess_flat, tree): + + def f(x): + x_flat, treedef = tree_flatten(x) + assert treedef == tree + error_flat = core.jaxpr_as_fun(f_jaxpr)(*itertools.chain(consts, x_flat)) + return tree_unflatten(tree, error_flat) + + initial_guess = tree_unflatten(tree, guess_flat) + out = solve(f, initial_guess) + out_flat, out_tree = tree_flatten(out) + assert out_tree == tree + return out_flat + def _root_impl(*args, **kwargs): - jaxpr, solve, _ = split_dict(kwargs, ['jaxpr', 'solve', 'tangent_solve']) - f = core.jaxpr_as_fun(jaxpr) - return solve(f, args) + tree, num_consts, jaxpr, solve, _ = split_dict( + kwargs, ['tree', 'num_consts', 'jaxpr', 'solve', 'tangent_solve']) + + consts = args[:num_consts] + guess = args[num_consts:] + return _solve_flat(solve, jaxpr, consts, guess, tree) + + +def _root_jvp( + primals, tangents, tree, num_consts, jaxpr, solve, tangent_solve): + # F(u(m), m) = 0 # system of equations in m + # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 + # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) + + consts = primals[:num_consts] + guess = primals[num_consts:] + solution = _solve_flat(solve, jaxpr, consts, guess, tree) + + unchecked_zeros, f_jvp = ad.vjp( + lu.wrap_init(core.jaxpr_as_fun(jaxpr)), consts + tuple(solution) + ) + + def calc_grad_wrt_solution(x): + x_flat, treedef = tree_flatten(x) + assert treedef == tree + y_flat = f_jvp(*x_flat)[num_consts:] + return tree_unflatten(tree, y_flat) + + grad_wrt_params = tree_unflatten( + tree, f_jvp(*tangents[:num_consts])[:num_consts]) + grad_solution, grad_tree = tree_flatten(tree_map( + operator.neg, tangent_solve(calc_grad_wrt_solution, grad_wrt_params), + )) + assert grad_tree == tree + return solution, grad_solution + +def _root_batch(args, dims, **params): + return batching.batch_fun(lu.wrap_init(_root_impl, params), args, dims) + root_p = core.Primitive('root') root_p.multiple_results = True -root_p.def_impl = _root_impl -xla.initial_style_translations[scan_p] = xla.lower_fun(_root_impl, initial_style=True) +root_p.def_impl(_root_impl) +ad.primitive_jvps[root_p] = _root_jvp +xla.initial_style_translations[root_p] = xla.lower_fun(_root_impl, initial_style=True) +batching.primitive_batchers[root_p] = _root_batch diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 342096e6ad00..cc27a81a1bbc 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -981,6 +981,50 @@ def f(carry, _): key = random.PRNGKey(0) api.grad(lambda c: lax.scan(f, (c, key), onp.ones(3))[0][0])(0.) # doesn't crash + def test_root(self): + + def scalar_solve(f, y): + return y / f(1.0) + + def binary_search(func, x0, low=0.0, high=100.0, tolerance=1e-6): + del x0 # unused + + def cond(state): + low, high = state + return high - low > tolerance + + def body(state): + low, high = state + midpoint = 0.5 * (low + high) + update_upper = func(midpoint) > 0 + low = np.where(update_upper, low, midpoint) + high = np.where(update_upper, midpoint, high) + return (low, high) + + solution, _ = lax.while_loop(cond, body, (low, high)) + return solution + + def sqrt_cubed(x, tangent_solve=scalar_solve): + f = lambda y: y ** 2 - x ** 3 + return lax.root(f, 0.0, binary_search, tangent_solve) + + value, grad = api.value_and_grad(sqrt_cubed)(5.0) + self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) + self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) + + inputs = np.array([4.0, 5.0]) + results = api.vmap(sqrt_cubed)(inputs) + self.assertAllClose(results, inputs ** 1.5, check_dtypes=False) + + def nd_solve(f, y): + g = lambda z: f(z.reshape(y.shape)).ravel() + jacobian = api.jacobian(g)(y.ravel()) + return np.linalg.solve(jacobian, y.ravel()).reshape(y.shape) + + sqrt_cubed_alt = partial(sqrt_cubed, tangent_solve=nd_solve) + value, grad = api.value_and_grad(sqrt_cubed_alt)(5.0) + self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) + if __name__ == '__main__': absltest.main() From 12509c913c6ff019cb909e85f47bf93ec82132d7 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 11 Sep 2019 21:26:07 -0700 Subject: [PATCH 0020/1053] Remove jax.api._custom_implicit_solve --- jax/api.py | 53 ----------------------------------------------- tests/api_test.py | 35 ------------------------------- 2 files changed, 88 deletions(-) diff --git a/jax/api.py b/jax/api.py index c039a0312539..37ef7189a944 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1809,56 +1809,3 @@ def abstractify(x): out = pe.abstract_eval_fun(fun.call_wrapped, *map(abstractify, args_flat)) out = [ShapeDtypeStruct(x.shape, x.dtype) for x in out] return tree_unflatten(out_tree(), out) - - -def _custom_implicit_solve(solve, tangent_solve): - """Define gradients for a function that performs an implicit solve. - - Note: this isn't ready for widespread use yet -- it does not handle closed - over values inside solve yet. - - Args: - solve: callable that takes two positional arguments, func and params, and - returns a solution such that func(params, solution) = 0. In other words, - the following is assumed to be true (but not checked): - solution = solve(func, params) - error = func(solution, params) - assert tree_all(tree_map(partial(np.allclose, 0.0), error) - tangent_solve: callable that takes two positional arguments, a linear - function ``f`` and (possibly nested) array(s) ``y``, and returns a - solution ``x`` such that ``f(x)=y``: - - - For scalar ``y``, use ``lambda f, y: y / f(1.0)``. - - For vector ``y``, you could use a linear solve with the Jacobian, if - dimensionality of ``y`` is not too large: - ``lambda f, y: np.linalg.solve(jacobian(f)(y), y)``. - - Returns: - Wrapped version of solve with JVP and VJPs defined with respect to - ``params`` via implicit differentaion, rather than differntiating through - the solve. - """ - @wraps(solve) - def wrapper(func, params): - - @custom_transforms - def solve_impl(params): - return solve(func, params) - - @partial(defjvp_all, solve_impl) - def solve_impl_jvp(primals, tangents): - # F(u(m), m) = 0 # system of equations in m - # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 - # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) - params, = primals - grad_params, = tangents - solution = solve_impl(params) - unchecked_zeros, f_jvp = vjp(func, solution, params) - grad_solution = tree_map( - lambda x: -x, - tangent_solve(lambda p: f_jvp(p)[0], f_jvp(grad_params)[1]) - ) - return solution, grad_solution - - return solve_impl(params) - return wrapper diff --git a/tests/api_test.py b/tests/api_test.py index fb19708a9aa3..bb6cb67ac0c3 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -885,41 +885,6 @@ def f(x): xla_comp = api.xla_computation(f) xla_comp(np.arange(8)).GetHloText() # doesn't crash - def test_custom_implicit_solve(self): - - def scalar_solve(f, y): - return y / f(1.0) - - def _binary_search(func, params, low=0.0, high=100.0, tolerance=1e-6): - def cond(state): - low, high = state - return high - low > tolerance - - def body(state): - low, high = state - midpoint = 0.5 * (low + high) - update_upper = func(midpoint, params) > 0 - low = np.where(update_upper, low, midpoint) - high = np.where(update_upper, midpoint, high) - return (low, high) - - solution, _ = lax.while_loop(cond, body, (low, high)) - return solution - - binary_search = api._custom_implicit_solve(_binary_search, scalar_solve) - sqrt_cubed = lambda y, x: y ** 2 - x ** 3 - value, grad = api.value_and_grad(binary_search, argnums=1)(sqrt_cubed, 5.0) - self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) - self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) - - def scalar_solve2(f, y): - y_1d = y[np.newaxis] - return np.linalg.solve(api.jacobian(f)(y_1d), y_1d).squeeze() - - binary_search = api._custom_implicit_solve(_binary_search, scalar_solve2) - grad = api.grad(binary_search, argnums=1)(sqrt_cubed, 5.0) - self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) - def test_jit_device_assignment(self): raise unittest.SkipTest("Temporarily disabled while device API is being changed.") device_num = xb.device_count() - 1 From ec192d0aa7b306e04642ab4369c898289d98a38d Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 11 Sep 2019 21:36:31 -0700 Subject: [PATCH 0021/1053] root docstring --- jax/lax/lax_control_flow.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 3c2dea3b0392..9b6e7bac62db 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -831,21 +831,22 @@ def root(f, initial_guess, solve, tangent_solve): f: function for which to find a root. Should return a tree of arrays with the same structure as its input argument. initial_guess: initial guess for a zero of f. - solve: callable that takes two positional arguments, f and initial_guess, - and returns a solution with the same structure as initial_guess such - that func(solution) = 0. In other words, the following is assumed to be - true (but not checked): + solve: function to solve for the roots of f. Should take two positional + arguments, f and initial_guess, and return a solution with the same + structure as initial_guess such that func(solution) = 0. In other words, + the following is assumed to be true (but not checked): solution = solve(f, initial_guess) error = f(solution) assert all(error == 0) - tangent_solve: callable that takes two positional arguments, a linear - function ``f`` and a tree of array(s) ``y`` with the same structure as - initial_guess, and returns a solution ``x`` such that ``f(x)=y``: + tangent_solve: function to solve the tangent system. Should takes two + positional arguments, a linear function ``g`` and a tree of array(s) + ``y`` with the same structure as initial_guess, and returns a solution + ``x`` such that ``g(x)=y``: - - For scalar ``y``, use ``lambda f, y: y / f(1.0)``. + - For scalar ``y``, use ``lambda g, y: y / g(1.0)``. - For vector ``y``, you could use a linear solve with the Jacobian, if dimensionality of ``y`` is not too large: - ``lambda f, y: np.linalg.solve(jacobian(f)(y), y)``. + ``lambda g, y: np.linalg.solve(jacobian(g)(y), y)``. Returns: The result of calling solve(f, initial_guess) with gradients defined via From d737cc99ce8da88dbede58ddd4d46986f14133b5 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 11 Sep 2019 21:51:50 -0700 Subject: [PATCH 0022/1053] disclaimer about root as a low-level API --- jax/lax/lax_control_flow.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 9b6e7bac62db..5f4cb85d8bb9 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -825,19 +825,25 @@ def body(i, dst): def root(f, initial_guess, solve, tangent_solve): - """Differentiably solve for the roots of a function. + """Differentiably solve for a roots of a function. + + This is a low-level routine, mostly intended for internal use in JAX. + Gradients of root() are defined with respect to closed-over variables from + the provided function f. Args: - f: function for which to find a root. Should return a tree of arrays with - the same structure as its input argument. + f: function for which to find a root. Should accept a single argument, + return a tree of arrays with the same structure as its input. initial_guess: initial guess for a zero of f. solve: function to solve for the roots of f. Should take two positional arguments, f and initial_guess, and return a solution with the same structure as initial_guess such that func(solution) = 0. In other words, - the following is assumed to be true (but not checked): + the following is assumed to be true (but not checked):: + solution = solve(f, initial_guess) error = f(solution) assert all(error == 0) + tangent_solve: function to solve the tangent system. Should takes two positional arguments, a linear function ``g`` and a tree of array(s) ``y`` with the same structure as initial_guess, and returns a solution @@ -850,7 +856,7 @@ def root(f, initial_guess, solve, tangent_solve): Returns: The result of calling solve(f, initial_guess) with gradients defined via - implicit differentiation assuming f(solve(f, initial_guess)) = 0. + implicit differentiation assuming ``f(solve(f, initial_guess)) == 0``. """ guess_flat, in_tree = tree_flatten((initial_guess,)) guess_avals = tuple(_map(_abstractify, guess_flat)) From 2b2da814e7ce858683943994dc113e0742ca4007 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 11 Sep 2019 22:01:18 -0700 Subject: [PATCH 0023/1053] Remove notebooks/gufuncs.ipynb It's now redundant with jax.experimental.vectorize, and I'd rather keep it in one place. --- jax/experimental/vectorize.py | 4 +- notebooks/README.md | 3 - notebooks/gufuncs.ipynb | 722 ---------------------------------- 3 files changed, 2 insertions(+), 727 deletions(-) delete mode 100644 notebooks/gufuncs.ipynb diff --git a/jax/experimental/vectorize.py b/jax/experimental/vectorize.py index 9c5cb16b6ffb..422fdedeb0e1 100644 --- a/jax/experimental/vectorize.py +++ b/jax/experimental/vectorize.py @@ -11,9 +11,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Extending JAX's vmap to work like NumPY's gufuncs. +"""Extending JAX's vmap to work like NumPy's gufuncs. -From the `example notebook `_ by `Stephan Hoyer `_. +By `Stephan Hoyer `_ What is a gufunc? ================= diff --git a/notebooks/README.md b/notebooks/README.md index cb3a2b1984b9..0d07ca8d57a4 100644 --- a/notebooks/README.md +++ b/notebooks/README.md @@ -12,8 +12,6 @@ Use the links below to open any of these for interactive exploration in colab. - [vmapped log-probabilities][vmapped log-probs] - demonstrates the utility of __vmap__ for Bayesian inference. - - [gufuncs via vmap][gufuncs] - how to implement NumPy-like gufuncs using __vmap__. - - [Neural Networks with TFDS Data][neural_network_with_tfds_data] - training a simple neural net with [tensorflow datasets][tfds]. - [Neural Networks and Data Loading][neural_network_and_data_loading] - training a simple neural net using a pytorch dataloader. @@ -25,7 +23,6 @@ Use the links below to open any of these for interactive exploration in colab. [quickstart]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/quickstart.ipynb [Common_Gotchas_in_JAX]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb -[gufuncs]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/gufuncs.ipynb [maml]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/maml.ipynb [gmegdd]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb [vmapped log-probs]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/vmapped%20log-probs.ipynb diff --git a/notebooks/gufuncs.ipynb b/notebooks/gufuncs.ipynb deleted file mode 100644 index 7ba78d4f3ca3..000000000000 --- a/notebooks/gufuncs.ipynb +++ /dev/null @@ -1,722 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "JAX generalized ufuncs.ipynb", - "version": "0.3.2", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "accelerator": "GPU" - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "435_M09vl3NA", - "colab_type": "text" - }, - "source": [ - "# Extending JAX's vmap to work like NumPy's gufuncs\n", - "\n", - "by [Stephan Hoyer](https://github.com/shoyer)\n", - "\n", - "## What is a gufunc?\n", - "\n", - "[Generalized universal functions](https://docs.scipy.org/doc/numpy-1.15.0/reference/c-api.generalized-ufuncs.html) (\"gufuncs\") are one of my favorite abstractions from NumPy. They generalize NumPy's [broadcasting rules](https://docs.scipy.org/doc/numpy-1.15.0/user/basics.broadcasting.html) to handle non-scalar operations. When a gufuncs is applied to arrays, there are:\n", - "- \"core dimensions\" over which an operation is defined.\n", - "- \"broadcast dimensions\" over which operations can be automatically vectorized.\n", - "\n", - "A string [signature](https://docs.scipy.org/doc/numpy-1.15.0/reference/c-api.generalized-ufuncs.html#details-of-signature) associated with each gufunc controls how this happens by indicating how core dimensions are mapped between inputs and outputs. The syntax is easiest to understand by looking at a few examples:\n", - "\n", - "- Addition: `(),()->()`\n", - "- 1D inner product: `(i),(i)->()`\n", - "- 1D sum: `(i)->()`\n", - "- Matrix multiplcation: `(m,n),(n,k)->(m,k)`\n", - "\n", - "## Why write gufuncs?\n", - "\n", - "From a user perspective, gufuncs are nice because they're guaranteed to vectorize in a consistent and general fashion. For example, by default gufuncs use the last dimensions of arrays as core dimensions, but you can control that explicitly with the `axis` or `axes` arguments.\n", - "\n", - "From a developer perspective, gufuncs are nice because they simply your work: you only need to think about the core logic of your function, not how it handles arbitrary dimensional input. You can just write that down in a simple, declarative way.\n", - "\n", - "## JAX makes it easy to write high-level performant code\n", - "\n", - "Unfortunately, writing NumPy gufuncs today is somewhat non-trivial. Your options today are:\n", - "\n", - "1. Write the inner loops yourself in C.\n", - "2. [`np.vectorize`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html) creates something kind of like a gufunc, but it's painfully slow: the outer loop is performed in Python.\n", - "3. [`numba.guvectorize`](https://numba.pydata.org/numba-doc/dev/user/vectorize.html) can work well, if you don't need further code transformations like automatic differentiation.\n", - "\n", - "JAX's `vmap` contains all the core functionality we need to write functions that work like gufuncs. JAX gufuncs play nicely with other transformations like `grad` and `jit`.\n", - "\n", - "## A simple example\n", - "\n", - "Consider a simple example from data preprocessing, centering an array.\n", - "\n", - "Here's how we might write a vectorized version using NumPy:\n", - "```python\n", - "def center(array, axis=-1):\n", - " # array can have any number of dimensions\n", - " bias = np.mean(array, axis=axis)\n", - " debiased = array - np.expand_dims(bias, axis)\n", - " return bias, debiased\n", - "```\n", - "\n", - "And here's how we could write a vectorized version using JAX gufuncs:\n", - "```python\n", - "@vectorize('(n)->(),(n)')\n", - "def center(array):\n", - " # array is always a 1D vector\n", - " bias = np.mean(array)\n", - " debiased = array - bias\n", - " return bias, debiased\n", - "```\n", - "\n", - "See the difference?\n", - "- Instead of needing to think about broadcasting while writing the entire function, we can write the function assuming the input is always a vector.\n", - "- We get the `axis` argument automatically, without needing to write it ourselves.\n", - "- As a bonus, the decorator makes the function self-documenting: a reader immediately knows that it handles higher dimensional input and output correctly.\n", - "\n", - "For more examples (and the implementation) see below." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "k40qkuQdkqFg", - "colab_type": "text" - }, - "source": [ - "## Implementation\n", - "\n", - "### License\n", - "\n", - "Copyright 2018 Google LLC.\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n", - "\n", - "https://www.apache.org/licenses/LICENSE-2.0\n", - "\n", - "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4QrBJNYG5ECU", - "colab_type": "text" - }, - "source": [ - "### Imports" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "p-rYDdqL1uZP", - "colab_type": "code", - "colab": {} - }, - "source": [ - "from jax import grad, jit, vmap\n", - "import jax.numpy as jnp\n", - "import numpy as np\n", - "import re" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tU2rwIOZmT0Q", - "colab_type": "text" - }, - "source": [ - "### Copied from `numpy.lib.function_base`" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "lBVIP3O2kkqY", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# See http://docs.scipy.org/doc/numpy/reference/c-api.generalized-ufuncs.html\n", - "_DIMENSION_NAME = r'\\w+'\n", - "_CORE_DIMENSION_LIST = '(?:{0:}(?:,{0:})*)?'.format(_DIMENSION_NAME)\n", - "_ARGUMENT = r'\\({}\\)'.format(_CORE_DIMENSION_LIST)\n", - "_ARGUMENT_LIST = '{0:}(?:,{0:})*'.format(_ARGUMENT)\n", - "_SIGNATURE = '^{0:}->{0:}$'.format(_ARGUMENT_LIST)\n", - "\n", - "\n", - "def _parse_gufunc_signature(signature):\n", - " \"\"\"\n", - " Parse string signatures for a generalized universal function.\n", - "\n", - " Arguments\n", - " ---------\n", - " signature : string\n", - " Generalized universal function signature, e.g., ``(m,n),(n,p)->(m,p)``\n", - " for ``np.matmul``.\n", - "\n", - " Returns\n", - " -------\n", - " Tuple of input and output core dimensions parsed from the signature, each\n", - " of the form List[Tuple[str, ...]].\n", - " \"\"\"\n", - " if not re.match(_SIGNATURE, signature):\n", - " raise ValueError(\n", - " 'not a valid gufunc signature: {}'.format(signature))\n", - " return tuple([tuple(re.findall(_DIMENSION_NAME, arg))\n", - " for arg in re.findall(_ARGUMENT, arg_list)]\n", - " for arg_list in signature.split('->'))\n", - "\n", - "\n", - "\n", - "def _update_dim_sizes(dim_sizes, arg, core_dims):\n", - " \"\"\"\n", - " Incrementally check and update core dimension sizes for a single argument.\n", - "\n", - " Arguments\n", - " ---------\n", - " dim_sizes : Dict[str, int]\n", - " Sizes of existing core dimensions. Will be updated in-place.\n", - " arg : ndarray\n", - " Argument to examine.\n", - " core_dims : Tuple[str, ...]\n", - " Core dimensions for this argument.\n", - " \"\"\"\n", - " if not core_dims:\n", - " return\n", - "\n", - " num_core_dims = len(core_dims)\n", - " if arg.ndim < num_core_dims:\n", - " raise ValueError(\n", - " '%d-dimensional argument does not have enough '\n", - " 'dimensions for all core dimensions %r'\n", - " % (arg.ndim, core_dims))\n", - "\n", - " core_shape = arg.shape[-num_core_dims:]\n", - " for dim, size in zip(core_dims, core_shape):\n", - " if dim in dim_sizes:\n", - " if size != dim_sizes[dim]:\n", - " raise ValueError(\n", - " 'inconsistent size for core dimension %r: %r vs %r'\n", - " % (dim, size, dim_sizes[dim]))\n", - " else:\n", - " dim_sizes[dim] = size\n", - "\n", - "\n", - "def _parse_input_dimensions(args, input_core_dims):\n", - " \"\"\"\n", - " Parse broadcast and core dimensions for vectorize with a signature.\n", - "\n", - " Arguments\n", - " ---------\n", - " args : Tuple[ndarray, ...]\n", - " Tuple of input arguments to examine.\n", - " input_core_dims : List[Tuple[str, ...]]\n", - " List of core dimensions corresponding to each input.\n", - "\n", - " Returns\n", - " -------\n", - " broadcast_shape : Tuple[int, ...]\n", - " Common shape to broadcast all non-core dimensions to.\n", - " dim_sizes : Dict[str, int]\n", - " Common sizes for named core dimensions.\n", - " \"\"\"\n", - " broadcast_args = []\n", - " dim_sizes = {}\n", - " for arg, core_dims in zip(args, input_core_dims):\n", - " _update_dim_sizes(dim_sizes, arg, core_dims)\n", - " ndim = arg.ndim - len(core_dims)\n", - " dummy_array = np.lib.stride_tricks.as_strided(0, arg.shape[:ndim])\n", - " broadcast_args.append(dummy_array)\n", - " broadcast_shape = np.lib.stride_tricks._broadcast_shape(*broadcast_args)\n", - " return broadcast_shape, dim_sizes\n", - "\n", - "\n", - "def _calculate_shapes(broadcast_shape, dim_sizes, list_of_core_dims):\n", - " \"\"\"Helper for calculating broadcast shapes with core dimensions.\"\"\"\n", - " return [broadcast_shape + tuple(dim_sizes[dim] for dim in core_dims)\n", - " for core_dims in list_of_core_dims]\n", - "\n", - " \n", - "# adapted from np.vectorize (again authored by shoyer@)\n", - "def broadcast_with_core_dims(args, input_core_dims, output_core_dims):\n", - " if len(args) != len(input_core_dims):\n", - " raise TypeError('wrong number of positional arguments: '\n", - " 'expected %r, got %r'\n", - " % (len(input_core_dims), len(args)))\n", - "\n", - " broadcast_shape, dim_sizes = _parse_input_dimensions(\n", - " args, input_core_dims)\n", - " input_shapes = _calculate_shapes(broadcast_shape, dim_sizes,\n", - " input_core_dims)\n", - " args = [jnp.broadcast_to(arg, shape)\n", - " for arg, shape in zip(args, input_shapes)]\n", - " return args" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aa_Gh3K_PQkY", - "colab_type": "text" - }, - "source": [ - "### Handle the `axis` argument" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "MLeFHhVoPT4h", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def verify_axis_is_supported(input_core_dims, output_core_dims):\n", - " all_core_dims = set()\n", - " for input_or_output_core_dims in [input_core_dims, output_core_dims]:\n", - " for core_dims in input_or_output_core_dims:\n", - " all_core_dims.update(core_dims)\n", - " if len(core_dims) > 1:\n", - " raise ValueError('only one gufuncs with one core dim support axis')\n", - "\n", - "\n", - "def reorder_inputs(args, axis, input_core_dims):\n", - " return tuple(jnp.moveaxis(arg, axis, -1) if core_dims else arg\n", - " for arg, core_dims in zip(args, input_core_dims))\n", - "\n", - "\n", - "def reorder_outputs(result, axis, output_core_dims):\n", - " if not isinstance(result, tuple):\n", - " result = (result,)\n", - " result = tuple(jnp.moveaxis(res, -1, axis) if core_dims else res\n", - " for res, core_dims in zip(result, output_core_dims))\n", - " if len(result) == 1:\n", - " (result,) = result\n", - " return result" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Uik9GA76lZjY", - "colab_type": "text" - }, - "source": [ - "### Core implementation\n", - "\n", - "This is the only part that uses `vmap`" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "z-FgQaW02_WN", - "colab_type": "code", - "colab": {} - }, - "source": [ - "import functools\n", - "\n", - "\n", - "def vectorize(signature):\n", - " \"\"\"Vectorize a function using JAX.\"\"\"\n", - " input_core_dims, output_core_dims = _parse_gufunc_signature(signature)\n", - " \n", - " def decorator(func):\n", - " @functools.wraps(func)\n", - " def wrapper(*args, axis=None):\n", - "\n", - " if axis is not None:\n", - " verify_axis_is_supported(input_core_dims, output_core_dims)\n", - " args = reorder_inputs(args, axis, input_core_dims)\n", - "\n", - " broadcast_args = broadcast_with_core_dims(\n", - " args, input_core_dims, output_core_dims)\n", - " num_batch_dims = len(broadcast_args[0].shape) - len(input_core_dims[0])\n", - "\n", - " vectorized_func = func\n", - " for _ in range(num_batch_dims):\n", - " vectorized_func = vmap(vectorized_func)\n", - " result = vectorized_func(*broadcast_args)\n", - "\n", - " if axis is not None:\n", - " result = reorder_outputs(result, axis, output_core_dims)\n", - "\n", - " return result\n", - " return wrapper\n", - " return decorator" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EWDCFZiqmY9A", - "colab_type": "text" - }, - "source": [ - "## Test cases\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "W-jCowsgj_Tg", - "colab_type": "text" - }, - "source": [ - "### matmul" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "gSJ7G_da4ArE", - "colab_type": "code", - "colab": {} - }, - "source": [ - "matmat = vectorize('(n,m),(m,k)->(n,k)')(jnp.dot)\n", - "matvec = vectorize('(n,m),(m)->(n)')(jnp.dot)\n", - "vecmat = vectorize('(m),(m,k)->(k)')(jnp.dot)\n", - "vecvec = vectorize('(m),(m)->()')(jnp.dot)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "CI-vJzjMfPXS", - "colab_type": "code", - "colab": {} - }, - "source": [ - "assert matmat(np.zeros((2, 3)), np.zeros((3, 4))).shape == (2, 4)\n", - "assert matmat(np.zeros((2, 3)), np.zeros((1, 3, 4))).shape == (1, 2, 4)\n", - "assert matmat(np.zeros((5, 2, 3)), np.zeros((1, 3, 4))).shape == (5, 2, 4)\n", - "assert matmat(np.zeros((6, 5, 2, 3)), np.zeros((3, 4))).shape == (6, 5, 2, 4)\n", - "\n", - "assert matvec(np.zeros((2, 3)), np.zeros((3,))).shape == (2,)\n", - "assert matvec(np.zeros((2, 3)), np.zeros((1, 3))).shape == (1, 2)\n", - "assert matvec(np.zeros((4, 2, 3)), np.zeros((1, 3))).shape == (4, 2)\n", - "assert matvec(np.zeros((5, 4, 2, 3)), np.zeros((1, 3))).shape == (5, 4, 2)\n", - "\n", - "assert vecvec(np.zeros((3,)), np.zeros((3,))).shape == ()\n", - "assert vecvec(np.zeros((2, 3)), np.zeros((3,))).shape == (2,)\n", - "assert vecvec(np.zeros((4, 2, 3)), np.zeros((3,))).shape == (4, 2) " - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "u5xKzwoRkKuR", - "colab_type": "text" - }, - "source": [ - "### magnitude" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Rcbol3OHkKUQ", - "colab_type": "code", - "colab": {} - }, - "source": [ - "@vectorize('(n)->()')\n", - "def magnitude(x):\n", - " return jnp.dot(x, x)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "DBtX_QDwkMbI", - "colab_type": "code", - "colab": {} - }, - "source": [ - "assert magnitude(np.arange(3.0)).shape == ()\n", - "assert magnitude(np.arange(6.0).reshape(2, 3)).shape == (2,)\n", - "assert magnitude(np.arange(6.0).reshape(1, 2, 3)).shape == (1, 2,)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LFlyTMg0kCm5", - "colab_type": "text" - }, - "source": [ - "### mean" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "m5HrLVmehaHx", - "colab_type": "code", - "colab": {} - }, - "source": [ - "mean = vectorize('(n)->()')(jnp.mean)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "QBtnkLwnhhJY", - "colab_type": "code", - "colab": {} - }, - "source": [ - "assert mean(np.zeros((3,))).shape == ()\n", - "assert mean(np.zeros((2, 3,))).shape == (2,)\n", - "assert mean(np.zeros((2, 3,)), axis=0).shape == (3,)\n", - "assert mean(np.zeros((1, 2, 3, 4))).shape == (1, 2, 3)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3Tio9LvjCCvt", - "colab_type": "text" - }, - "source": [ - "### add a new axis" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Q0d0cE91CGZ9", - "colab_type": "code", - "colab": {} - }, - "source": [ - "@vectorize('()->(n)')\n", - "def stack_plus_minus(x):\n", - " return jnp.stack([x, -x])" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "IFxLKJqzCNp0", - "colab_type": "code", - "colab": {} - }, - "source": [ - "assert stack_plus_minus(np.zeros(())).shape == (2,)\n", - "assert stack_plus_minus(np.zeros((3,))).shape == (3, 2)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hAMhRkK4kEzw", - "colab_type": "text" - }, - "source": [ - "### center" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "bDsjXm7MitcX", - "colab_type": "code", - "colab": {} - }, - "source": [ - "@vectorize('(n)->(),(n)')\n", - "def center(array):\n", - " bias = jnp.mean(array)\n", - " debiased = array - bias\n", - " return bias, debiased" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "MSyxOrUPixDI", - "colab_type": "code", - "outputId": "b8b9a933-de11-41cf-975e-94883f6e50d6", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "b, a = center(jnp.arange(3))\n", - "print(np.array(a), np.array(b))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "[-1. 0. 1.] 1.0\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "7UZGOS8FGT_D", - "colab_type": "code", - "outputId": "1f376e28-b373-42c0-9b3a-85bb6ad741b1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "X = jnp.arange(12).reshape((3, 4))\n", - "X" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "DeviceArray([[ 0, 1, 2, 3],\n", - " [ 4, 5, 6, 7],\n", - " [ 8, 9, 10, 11]], dtype=int32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 18 - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "n2Fz91ptjM_7", - "colab_type": "code", - "outputId": "7ce0096e-701a-486f-e909-94d4a7731ae1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "b, a = center(X, axis=1)\n", - "print(np.array(a), np.array(b))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "[[-1.5 -0.5 0.5 1.5]\n", - " [-1.5 -0.5 0.5 1.5]\n", - " [-1.5 -0.5 0.5 1.5]] [1.5 5.5 9.5]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "G-AyCkAK4RKT", - "colab_type": "code", - "outputId": "8c797205-3f70-4870-f738-9383427c0911", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "b, a = center(X, axis=0)\n", - "print(np.array(a), np.array(b))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "[[-4. -4. -4. -4.]\n", - " [ 0. 0. 0. 0.]\n", - " [ 4. 4. 4. 4.]] [4. 5. 6. 7.]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "_FhnjYMUjZgI", - "colab_type": "code", - "outputId": "2871d362-67dc-4ebc-ceb8-f057969d33c8", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "# NOTE: using the wrapped function directly silently gives the wrong result!\n", - "b, a = center.__wrapped__(X)\n", - "print(np.array(a), np.array(b))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "[[-5.5 -4.5 -3.5 -2.5]\n", - " [-1.5 -0.5 0.5 1.5]\n", - " [ 2.5 3.5 4.5 5.5]] 5.5\n" - ], - "name": "stdout" - } - ] - } - ] -} From e7b2037929c1a517f50f07fa879eb3a2e1248e0f Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 12 Sep 2019 12:22:01 -0700 Subject: [PATCH 0024/1053] Fix encoding on Python 2 --- jax/lax/lax_control_flow.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 5f4cb85d8bb9..c827df136ecc 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); From 9584dbe12a9cf8b537f494adbee494ec36af5c34 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 12 Sep 2019 12:27:59 -0700 Subject: [PATCH 0025/1053] docstring clarification --- jax/lax/lax_control_flow.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index c827df136ecc..50f268641f55 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -845,10 +845,11 @@ def root(f, initial_guess, solve, tangent_solve): error = f(solution) assert all(error == 0) - tangent_solve: function to solve the tangent system. Should takes two - positional arguments, a linear function ``g`` and a tree of array(s) - ``y`` with the same structure as initial_guess, and returns a solution - ``x`` such that ``g(x)=y``: + tangent_solve: function to solve the tangent system. Should take two + positional arguments, a linear function ``g`` (the function ``f`` + linearized at its root) and a tree of array(s) ``y`` with the same + structure as initial_guess, and return a solution ``x`` such that + ``g(x)=y``: - For scalar ``y``, use ``lambda g, y: y / g(1.0)``. - For vector ``y``, you could use a linear solve with the Jacobian, if From 0e5b5d3f2de4a298716ea7c0e8069cb029204b08 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 12 Sep 2019 15:33:30 -0700 Subject: [PATCH 0026/1053] Error checking for tree structures in root --- jax/lax/lax_control_flow.py | 66 +++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 50f268641f55..f16137753c40 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -32,7 +32,7 @@ from jax.lax import lax from jax import linear_util as lu from jax.abstract_arrays import ShapedArray, raise_to_shaped -from jax.api_util import flatten_fun_nokwargs +from jax.api_util import flatten_fun_nokwargs, apply_flat_fun_nokwargs from jax.interpreters import ad from jax.interpreters import partial_eval as pe from jax.interpreters import xla @@ -43,7 +43,7 @@ from jax.util import (partial, unzip2, safe_map, safe_zip, split_list, split_dict, cache) from jax.tree_util import (tree_flatten, tree_unflatten, treedef_is_leaf, - treedef_children, treedef_tuple, tree_map) + treedef_children, tree_map) from jax import ad_util _map = safe_map @@ -860,10 +860,15 @@ def root(f, initial_guess, solve, tangent_solve): The result of calling solve(f, initial_guess) with gradients defined via implicit differentiation assuming ``f(solve(f, initial_guess)) == 0``. """ - guess_flat, in_tree = tree_flatten((initial_guess,)) + guess_flat, in_args_tree = tree_flatten((initial_guess,)) guess_avals = tuple(_map(_abstractify, guess_flat)) - jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_tree, guess_avals) - assert treedef_tuple([out_tree]) == in_tree + jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, guess_avals) + in_tree, = treedef_children(in_args_tree) + if in_tree != out_tree: + raise TypeError( + "f output pytree structure must match initial_guess, got {} and {}." + .format(out_tree, in_tree) + ) out_flat = root_p.bind(*itertools.chain(consts, guess_flat), tree=out_tree, num_consts=len(consts), jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) @@ -875,17 +880,20 @@ def _root_abstract_eval(*args, **kwargs): def _solve_flat(solve, f_jaxpr, consts, guess_flat, tree): - - def f(x): - x_flat, treedef = tree_flatten(x) - assert treedef == tree - error_flat = core.jaxpr_as_fun(f_jaxpr)(*itertools.chain(consts, x_flat)) - return tree_unflatten(tree, error_flat) - + f = partial( + apply_flat_fun_nokwargs, + partial(core.jaxpr_as_fun(f_jaxpr), *consts), + (tree, tree), + ) initial_guess = tree_unflatten(tree, guess_flat) out = solve(f, initial_guess) + out_flat, out_tree = tree_flatten(out) - assert out_tree == tree + if out_tree != tree: + raise TypeError( + "solve output pytree structure must match initial_guess, got {} and {}" + .format(out_tree, tree)) + return out_flat @@ -900,30 +908,32 @@ def _root_impl(*args, **kwargs): def _root_jvp( primals, tangents, tree, num_consts, jaxpr, solve, tangent_solve): - # F(u(m), m) = 0 # system of equations in m - # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 - # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) - consts = primals[:num_consts] guess = primals[num_consts:] solution = _solve_flat(solve, jaxpr, consts, guess, tree) + # F(u(m), m) = 0 # system of equations in m + # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 + # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) unchecked_zeros, f_jvp = ad.vjp( lu.wrap_init(core.jaxpr_as_fun(jaxpr)), consts + tuple(solution) ) + calc_grad_f_wrt_solution = partial( + apply_flat_fun_nokwargs, + lambda *xs: f_jvp(*xs)[num_consts:], + (tree, tree), + ) + grad_f_wrt_params = tree_unflatten( + tree, f_jvp(*tangents[:num_consts])[:num_consts]) + negative_grad = tangent_solve(calc_grad_f_wrt_solution, grad_f_wrt_params) - def calc_grad_wrt_solution(x): - x_flat, treedef = tree_flatten(x) - assert treedef == tree - y_flat = f_jvp(*x_flat)[num_consts:] - return tree_unflatten(tree, y_flat) + negative_grad_flat, out_tree = tree_flatten(negative_grad) + if out_tree != tree: + raise TypeError( + "tangent_solve output pytree structure must match initial_guess, " + "got {} and {}".format(out_tree, tree)) - grad_wrt_params = tree_unflatten( - tree, f_jvp(*tangents[:num_consts])[:num_consts]) - grad_solution, grad_tree = tree_flatten(tree_map( - operator.neg, tangent_solve(calc_grad_wrt_solution, grad_wrt_params), - )) - assert grad_tree == tree + grad_solution = _map(operator.neg, negative_grad_flat) return solution, grad_solution def _root_batch(args, dims, **params): From 5d3910f275616e41f5dbc352fd5782ed5168adb1 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 12 Sep 2019 15:47:15 -0700 Subject: [PATCH 0027/1053] Tests for error checking in lax.root --- tests/lax_control_flow_test.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index cc27a81a1bbc..136b962d9df6 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1025,6 +1025,19 @@ def nd_solve(f, y): value, grad = api.value_and_grad(sqrt_cubed_alt)(5.0) self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) + def test_root_errors(self): + with self.assertRaisesRegexp(TypeError, "f output pytree"): + lax.root(lambda x: (x, x), 0.0, lambda f, x: x, lambda f, x: x) + with self.assertRaisesRegexp(TypeError, "solve output pytree"): + lax.root(lambda x: x, 0.0, lambda f, x: (x, x), lambda f, x: x) + + def dummy_root_usage(x): + f = lambda y: x - y + return lax.root(f, 0.0, lambda f, x: x, lambda f, x: (x, x)) + + with self.assertRaisesRegexp(TypeError, "tangent_solve output pytree"): + api.jvp(dummy_root_usage, (0.0,), (0.0,)) + if __name__ == '__main__': absltest.main() From db5b922f2efa0c733920ad506cd1344311bd66a6 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 12 Sep 2019 16:00:08 -0700 Subject: [PATCH 0028/1053] Test and fix higher order derivatives in root --- jax/lax/lax_control_flow.py | 32 +++++++++++++------------------- tests/lax_control_flow_test.py | 2 ++ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index f16137753c40..004ce0b03908 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -879,13 +879,16 @@ def _root_abstract_eval(*args, **kwargs): return args[kwargs['num_consts']:] -def _solve_flat(solve, f_jaxpr, consts, guess_flat, tree): +def _root_impl(*args, **kwargs): + tree, num_consts, jaxpr, solve, _ = split_dict( + kwargs, ['tree', 'num_consts', 'jaxpr', 'solve', 'tangent_solve']) + f = partial( apply_flat_fun_nokwargs, - partial(core.jaxpr_as_fun(f_jaxpr), *consts), + partial(core.jaxpr_as_fun(jaxpr), *args[:num_consts]), (tree, tree), ) - initial_guess = tree_unflatten(tree, guess_flat) + initial_guess = tree_unflatten(tree, args[num_consts:]) out = solve(f, initial_guess) out_flat, out_tree = tree_flatten(out) @@ -897,35 +900,26 @@ def _solve_flat(solve, f_jaxpr, consts, guess_flat, tree): return out_flat -def _root_impl(*args, **kwargs): - tree, num_consts, jaxpr, solve, _ = split_dict( - kwargs, ['tree', 'num_consts', 'jaxpr', 'solve', 'tangent_solve']) - - consts = args[:num_consts] - guess = args[num_consts:] - return _solve_flat(solve, jaxpr, consts, guess, tree) - - def _root_jvp( primals, tangents, tree, num_consts, jaxpr, solve, tangent_solve): - consts = primals[:num_consts] - guess = primals[num_consts:] - solution = _solve_flat(solve, jaxpr, consts, guess, tree) + solution = root_p.bind(*primals, tree=tree, num_consts=num_consts, + jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) # F(u(m), m) = 0 # system of equations in m # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) unchecked_zeros, f_jvp = ad.vjp( - lu.wrap_init(core.jaxpr_as_fun(jaxpr)), consts + tuple(solution) + lu.wrap_init(core.jaxpr_as_fun(jaxpr)), + primals[:num_consts] + tuple(solution) ) - calc_grad_f_wrt_solution = partial( + f_linearized = partial( apply_flat_fun_nokwargs, lambda *xs: f_jvp(*xs)[num_consts:], (tree, tree), ) - grad_f_wrt_params = tree_unflatten( + params_jvp = tree_unflatten( tree, f_jvp(*tangents[:num_consts])[:num_consts]) - negative_grad = tangent_solve(calc_grad_f_wrt_solution, grad_f_wrt_params) + negative_grad = tangent_solve(f_linearized, params_jvp) negative_grad_flat, out_tree = tree_flatten(negative_grad) if out_tree != tree: diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 136b962d9df6..4a6d061efc61 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1012,6 +1012,8 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) + jtu.check_grads(sqrt_cubed, (5.0,), order=2) + inputs = np.array([4.0, 5.0]) results = api.vmap(sqrt_cubed)(inputs) self.assertAllClose(results, inputs ** 1.5, check_dtypes=False) From 5ffddc182e883b497478b2dac7558c23b000b6ff Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 13 Sep 2019 10:37:41 -0400 Subject: [PATCH 0029/1053] JIT-compile index and index-update expressions. Improves the performance of indexing in op-by-op mode. --- jax/numpy/lax_numpy.py | 33 ++++++++++++++++++++++++++++++--- jax/ops/scatter.py | 13 +++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0c14536ef755..baa37cd85556 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -48,6 +48,7 @@ from ..interpreters.xla import DeviceArray from .. import lax from ..util import partial, get_module_functions, unzip2, prod as _prod +from ..lib import pytree from ..lib import xla_bridge from ..lib import xla_client @@ -2403,6 +2404,12 @@ def _rewriting_take(arr, idx): # All supported cases of indexing can be implemented as an XLA gather, # followed by an optional reverse and a reshape. arr = asarray(arr) + treedef, static_idx, dynamic_idx = _split_index_for_jit(idx) + return _gather(arr, treedef, static_idx, dynamic_idx) + +@partial(jit, static_argnums=(1, 2)) +def _gather(arr, treedef, static_idx, dynamic_idx): + idx = _merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx) indexer = _index_to_gather(shape(arr), idx) # shared with _scatter_update y = lax.gather(arr, indexer.gather_indices, indexer.dnums, @@ -2438,7 +2445,11 @@ def _rewriting_take(arr, idx): "newaxis_dims", ]) -def _index_to_gather(x_shape, idx): +def _split_index_for_jit(idx): + """Splits indices into necessarily-static and dynamic parts. + + Used to pass indices into `jit`-ted function. + """ # Convert list indices to tuples in cases (deprecated by NumPy.) idx = _eliminate_deprecated_list_indexing(idx) @@ -2446,6 +2457,24 @@ def _index_to_gather(x_shape, idx): # indexing logic to handle them. idx = _expand_bool_indices(idx) + leaves, treedef = pytree.flatten(idx) + dynamic = [None] * len(leaves) + static = [None] * len(leaves) + for i, x in enumerate(leaves): + if isinstance(x, slice) or x is Ellipsis: + static[i] = x + else: + dynamic[i] = x + return treedef, tuple(static), dynamic + +def _merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx): + """Recombines indices that were split by _split_index_for_jit.""" + return treedef.unflatten([s or d for (s, d) in zip(static_idx, dynamic_idx)]) + +def _int(aval): + return not aval.shape and onp.issubdtype(aval.dtype, onp.integer) + +def _index_to_gather(x_shape, idx): # Remove ellipses and add trailing slice(None)s. idx = _canonicalize_tuple_index(len(x_shape), idx) @@ -2475,8 +2504,6 @@ def _index_to_gather(x_shape, idx): advanced_indexes, idx_advanced_axes, x_advanced_axes = zip(*advanced_pairs) advanced_axes_are_contiguous = onp.all(onp.diff(idx_advanced_axes) == 1) - _int = lambda aval: not aval.shape and onp.issubdtype(aval.dtype, onp.integer) - x_axis = 0 # Current axis in x. y_axis = 0 # Current axis in y, before collapsing. See below. collapsed_y_axis = 0 # Current axis in y, after collapsing. diff --git a/jax/ops/scatter.py b/jax/ops/scatter.py index db95c3ec8efc..b38a4e02cf25 100644 --- a/jax/ops/scatter.py +++ b/jax/ops/scatter.py @@ -19,10 +19,12 @@ from __future__ import print_function import collections +from functools import partial import numpy as onp from .. import lax +from ..api import jit from ..numpy import lax_numpy as np @@ -48,11 +50,18 @@ def _scatter_update(x, idx, y, scatter_op): x = np.asarray(x) y = np.asarray(y) - y = lax.convert_element_type(y, lax.dtype(x)) - # XLA gathers and scatters are very similar in structure; the scatter logic # is more or less a transpose of the gather equivalent. + treedef, static_idx, dynamic_idx = np._split_index_for_jit(idx) + return _scatter_impl(x, y, scatter_op, treedef, static_idx, dynamic_idx) + + +@partial(jit, static_argnums=(2, 3, 4)) +def _scatter_impl(x, y, scatter_op, treedef, static_idx, dynamic_idx): + y = lax.convert_element_type(y, lax.dtype(x)) + + idx = np._merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx) indexer = np._index_to_gather(np.shape(x), idx) # Broadcast `y` to the slice output shape. From 723456bc82f6ca3cc5dfa80395fa53ab854cee26 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 13 Sep 2019 13:39:39 -0400 Subject: [PATCH 0030/1053] Slice objects are unhashable, so unpack them into tuples for forming static arguments. --- jax/numpy/lax_numpy.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index baa37cd85556..a7f4bb21d5af 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2461,15 +2461,26 @@ def _split_index_for_jit(idx): dynamic = [None] * len(leaves) static = [None] * len(leaves) for i, x in enumerate(leaves): - if isinstance(x, slice) or x is Ellipsis: + if x is Ellipsis: static[i] = x + elif isinstance(x, slice): + # slice objects aren't hashable. + static[i] = (x.start, x.stop, x.step) else: dynamic[i] = x return treedef, tuple(static), dynamic def _merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx): """Recombines indices that were split by _split_index_for_jit.""" - return treedef.unflatten([s or d for (s, d) in zip(static_idx, dynamic_idx)]) + idx = [] + for s, d in zip(static_idx, dynamic_idx): + if d is not None: + idx.append(d) + elif isinstance(s, tuple): + idx.append(slice(s[0], s[1], s[2])) + else: + idx.append(s) + return treedef.unflatten(idx) def _int(aval): return not aval.shape and onp.issubdtype(aval.dtype, onp.integer) From ae329dcdf422b5e96d7120514840c054a90cf7b5 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 13 Sep 2019 13:44:11 -0400 Subject: [PATCH 0031/1053] Add a DeviceArray._unstack() method that unpacks an array along its major dimension. Use it to implement pxla's shard_arg method for DeviceArrays; this is faster than slicing out each element one by one. --- jax/interpreters/pxla.py | 9 ++++++++- jax/numpy/lax_numpy.py | 7 +++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index ab725f9c3851..72e6bf4c0042 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -86,9 +86,16 @@ def shard_args(backend, device_ordinals, assignments, axis_size, args): def _shard_array(x, ordinals, assignments, backend=None): nrep = len(ordinals) return (xla.device_put(x[assignments[r]], ordinals[r], backend=backend) for r in range(nrep)) -for _t in it.chain(array_types, [xla.DeviceArray]): +for _t in array_types: shard_arg_handlers[_t] = _shard_array +def _shard_device_array(x, ordinals, assignments, backend=None): + nrep = len(ordinals) + xs = x._unstack() + return (xla.device_put(xs[assignments[r]], ordinals[r], backend=backend) + for r in range(nrep)) +shard_arg_handlers[xla.DeviceArray] = _shard_device_array + def shard_aval(size, aval): try: return shard_aval_handlers[type(aval)](size, aval) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0c14536ef755..1e5e76a88210 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3031,3 +3031,10 @@ def _unimplemented_setitem(self, i, x): setattr(DeviceArray, "broadcast", lax.broadcast) setattr(DeviceArray, "broadcast_in_dim", lax.broadcast_in_dim) setattr(DeviceArray, "split", split) + +@jit +def _unstack(x): + if x.ndim == 0: + raise ValueError("Argument to _unstack must be non-scalar") + return [lax.index_in_dim(x, i, keepdims=False) for i in range(x.shape[0])] +setattr(DeviceArray, "_unstack", _unstack) From bfd70b96f97fca29a3fc07ba9bc07ba0562e3e35 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 13 Sep 2019 13:46:01 -0700 Subject: [PATCH 0032/1053] Relax tolerance (apparently needed on Travis) --- tests/lax_control_flow_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 4a6d061efc61..e70964aa83b4 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1012,7 +1012,7 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) - jtu.check_grads(sqrt_cubed, (5.0,), order=2) + jtu.check_grads(sqrt_cubed, (5.0,), order=2, rtol=1e-3) inputs = np.array([4.0, 5.0]) results = api.vmap(sqrt_cubed)(inputs) From c2750c1be91a9e5f68c29ff92a5c95f07fa47006 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Sat, 14 Sep 2019 14:30:45 +0100 Subject: [PATCH 0033/1053] Extended jvp for det to handle inputs with >2 dims --- jax/numpy/linalg.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 5e004d7e0cc0..2b43097778e6 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -86,12 +86,16 @@ def slogdet(a): return sign, np.real(logdet) +def _jvp_det(g, ans, x): + return np.trace(np.linalg.solve(x, g), axis1=-1, axis2=-2)*ans + + @_wraps(onp.linalg.det) @custom_transforms def det(a): sign, logdet = slogdet(a) return sign * np.exp(logdet) -defjvp(det, lambda g, ans, x: np.trace(np.linalg.solve(x, g))*ans) +defjvp(det, _jvp_det) @_wraps(onp.linalg.eig) From 0171eb7c68fc80c38a8f2eacd6ad48c3a7976631 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Sat, 14 Sep 2019 14:35:27 +0100 Subject: [PATCH 0034/1053] Replace jvp for det with jvp for slogdet --- jax/numpy/linalg.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 2b43097778e6..0a4d1b5d7b66 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -60,7 +60,14 @@ def svd(a, full_matrices=True, compute_uv=True): return lax_linalg.svd(a, full_matrices, compute_uv) +def _jvp_slogdet(g, ans, x): + jvp_sign = np.zeros(x.shape[:-2]) + jvp_logdet = np.trace(np.linalg.solve(x, g), axis1=-1, axis2=-2) + return jvp_sign, jvp_logdet + + @_wraps(onp.linalg.slogdet) +@custom_transforms def slogdet(a): a = _promote_arg_dtypes(np.asarray(a)) dtype = lax.dtype(a) @@ -84,18 +91,13 @@ def slogdet(a): is_zero, np.array(-np.inf, dtype=dtype), np.sum(np.log(np.abs(diag)), axis=-1)) return sign, np.real(logdet) - - -def _jvp_det(g, ans, x): - return np.trace(np.linalg.solve(x, g), axis1=-1, axis2=-2)*ans +defjvp(slogdet, _jvp_slogdet) @_wraps(onp.linalg.det) -@custom_transforms def det(a): sign, logdet = slogdet(a) return sign * np.exp(logdet) -defjvp(det, _jvp_det) @_wraps(onp.linalg.eig) From c8eb5f657df4241a8e59eb589d6b981d8a8b6530 Mon Sep 17 00:00:00 2001 From: xysun Date: Sat, 14 Sep 2019 21:24:28 +0100 Subject: [PATCH 0035/1053] pretty much works --- jax/numpy/lax_numpy.py | 62 +++++++++++++++++++++++++++++++++++++++-- tests/lax_numpy_test.py | 31 +++++++++++++++++++++ 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0c14536ef755..ba34e4016599 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1682,11 +1682,11 @@ def ix_(*args): return tuple(output) -@_wraps(onp.repeat) -def repeat(a, repeats, axis=None): + +def _repeat_scalar(a, repeats, axis=None): if not isscalar(repeats): raise NotImplementedError( - "np.repeat implementation only supports scalar repeats") + "_repeat_scalar implementation only supports scalar repeats") if axis is None or isscalar(a): a = ravel(a) axis = 0 @@ -1710,6 +1710,62 @@ def repeat(a, repeats, axis=None): lax.broadcast_in_dim(a, broadcast_shape, broadcast_dims), a_shape) +@_wraps(onp.repeat) +def repeat(a, repeats, axis=None): + ''' + :param repeats: int or array of ints + largely same logic as `PyArray_Repeat` in https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/item_selection.c + ''' + # use the faster `_repeat_scalar` when possible + if isscalar(repeats): + return _repeat_scalar(a, repeats, axis) + repeats_raveled = ravel(repeats) + if size(repeats_raveled) == 1: + return _repeat_scalar(a, list(repeats_raveled)[0], axis) + + if axis is None or isscalar(a): + a = ravel(a) + axis = 0 + + # repeats must match the dimension along the requested axis + a_shape = list(a.shape) + n = a_shape[axis] + if size(repeats_raveled) != n: + raise ValueError("repeats shape {} does not match the dimension on axis {}".format( + repeats_raveled.shape, n + )) + + # construct the total elements after repeat along the axis + total = sum(repeats_raveled) + + # construct return array + new_shape = a_shape.copy() + new_shape[axis] = total + + ret = ravel(onp.zeros(new_shape, a.dtype)) # use numpy array for in place update + # first we flatten the original array + a_flattened = ravel(a) + # size of each chunk to copy + chunk = 1 + for i in range(axis+1, ndim(a)): + chunk *= a_shape[i] + # then we copy `chunk` until axis + n_outer = 1 + for i in range(0, axis): + n_outer *= a_shape[i] + old_data_ptr = 0 + new_data_ptr = 0 + for i in range(0, n_outer): + for j in range(0, n): + tmp = repeats_raveled[j] + for k in range(0, tmp): + # copy `chunk` data + ret[new_data_ptr:new_data_ptr+chunk] = a_flattened[old_data_ptr:old_data_ptr+chunk] + new_data_ptr += chunk + old_data_ptr += chunk + + # then we reshape back to jax array + return reshape(array(ret), new_shape) @_wraps(onp.tri) def tri(N, M=None, k=0, dtype=None): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index b03f4fe3c1d0..ae996c96071f 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -729,6 +729,37 @@ def testRepeat(self, axis, shape, dtype, repeats, rng): self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + def testIssue1233(self): + ''' + Following numpy test suite at https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_multiarray.py `testRepeat` + ''' + tol = 1e-5 + + m = [1,2,3,4,5,6] + + for repeats in [2, [1,3,2,1,1,2], [2], lnp.array([1,3,2,1,1,2]), lnp.array([2])]: + lax_ans = lnp.repeat(lnp.array(m), repeats) + numpy_ans = onp.repeat(onp.array(m), repeats) + + self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + + m_rect_lax = lnp.array(m).reshape((2,3)) + m_rect_numpy = onp.array(m).reshape((2,3)) + + for repeats in [2, [2,1], [2], lnp.array([2,1]), lnp.array([2])]: + lax_ans = lnp.repeat(m_rect_lax, repeats, axis=0) + numpy_ans = onp.repeat(m_rect_numpy, repeats, axis=0) + + self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + + for repeats in [2, [1,3,2], [2], lnp.array([1,3,2]), lnp.array([2])]: + lax_ans = lnp.repeat(m_rect_lax, repeats, axis=1) + numpy_ans = onp.repeat(m_rect_numpy, repeats, axis=1) + + self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + + # TODO: test jit compile using self._CompileAndCheck + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "op={}_shape=[{}]_axis={}_out_dtype={}".format( op, jtu.format_shape_dtype_string(shape, dtype), axis, out_dtype), From 3c2003b24e2ab281d899cef2f4a76627e8b839b9 Mon Sep 17 00:00:00 2001 From: xysun Date: Sat, 14 Sep 2019 21:57:46 +0100 Subject: [PATCH 0036/1053] jit works! --- jax/numpy/lax_numpy.py | 15 +++++++-------- tests/lax_numpy_test.py | 13 +++++++++++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ba34e4016599..ad320567f6df 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1735,21 +1735,21 @@ def repeat(a, repeats, axis=None): repeats_raveled.shape, n )) - # construct the total elements after repeat along the axis + # total elements after repeat along the axis total = sum(repeats_raveled) - # construct return array new_shape = a_shape.copy() new_shape[axis] = total - ret = ravel(onp.zeros(new_shape, a.dtype)) # use numpy array for in place update - # first we flatten the original array + ret = ravel(zeros(new_shape, a.dtype)) a_flattened = ravel(a) + # size of each chunk to copy chunk = 1 for i in range(axis+1, ndim(a)): chunk *= a_shape[i] - # then we copy `chunk` until axis + + # copy `chunk` until axis n_outer = 1 for i in range(0, axis): n_outer *= a_shape[i] @@ -1760,12 +1760,11 @@ def repeat(a, repeats, axis=None): tmp = repeats_raveled[j] for k in range(0, tmp): # copy `chunk` data - ret[new_data_ptr:new_data_ptr+chunk] = a_flattened[old_data_ptr:old_data_ptr+chunk] + ret = lax.dynamic_update_slice(ret, lax.dynamic_slice(a_flattened, [old_data_ptr], [chunk]), [new_data_ptr]) new_data_ptr += chunk old_data_ptr += chunk - # then we reshape back to jax array - return reshape(array(ret), new_shape) + return reshape(ret, new_shape) @_wraps(onp.tri) def tri(N, M=None, k=0, dtype=None): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index ae996c96071f..cb5bdefe9c1e 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -736,6 +736,7 @@ def testIssue1233(self): tol = 1e-5 m = [1,2,3,4,5,6] + args_maker = lambda: [lnp.array(m)] for repeats in [2, [1,3,2,1,1,2], [2], lnp.array([1,3,2,1,1,2]), lnp.array([2])]: lax_ans = lnp.repeat(lnp.array(m), repeats) @@ -743,22 +744,30 @@ def testIssue1233(self): self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + lnp_fun = lambda arg: lnp.repeat(arg, repeats = repeats) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + m_rect_lax = lnp.array(m).reshape((2,3)) m_rect_numpy = onp.array(m).reshape((2,3)) + args_maker = lambda: [m_rect_lax] for repeats in [2, [2,1], [2], lnp.array([2,1]), lnp.array([2])]: lax_ans = lnp.repeat(m_rect_lax, repeats, axis=0) numpy_ans = onp.repeat(m_rect_numpy, repeats, axis=0) + lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=0) + self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) for repeats in [2, [1,3,2], [2], lnp.array([1,3,2]), lnp.array([2])]: lax_ans = lnp.repeat(m_rect_lax, repeats, axis=1) numpy_ans = onp.repeat(m_rect_numpy, repeats, axis=1) - self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=1) - # TODO: test jit compile using self._CompileAndCheck + self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "op={}_shape=[{}]_axis={}_out_dtype={}".format( From f356e376c243793a6385dd6f59ee45eac505075f Mon Sep 17 00:00:00 2001 From: xysun Date: Sat, 14 Sep 2019 22:01:36 +0100 Subject: [PATCH 0037/1053] simplify test --- tests/lax_numpy_test.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index cb5bdefe9c1e..1f91e28d5658 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -731,29 +731,28 @@ def testRepeat(self, axis, shape, dtype, repeats, rng): def testIssue1233(self): ''' - Following numpy test suite at https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_multiarray.py `testRepeat` + Following numpy test suite from `test_repeat` at https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_multiarray.py ''' tol = 1e-5 - m = [1,2,3,4,5,6] - args_maker = lambda: [lnp.array(m)] + m = lnp.array([1,2,3,4,5,6]) + args_maker = lambda: [m] for repeats in [2, [1,3,2,1,1,2], [2], lnp.array([1,3,2,1,1,2]), lnp.array([2])]: - lax_ans = lnp.repeat(lnp.array(m), repeats) - numpy_ans = onp.repeat(onp.array(m), repeats) + lax_ans = lnp.repeat(m, repeats) + numpy_ans = onp.repeat(m, repeats) self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) lnp_fun = lambda arg: lnp.repeat(arg, repeats = repeats) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) - m_rect_lax = lnp.array(m).reshape((2,3)) - m_rect_numpy = onp.array(m).reshape((2,3)) - args_maker = lambda: [m_rect_lax] + m_rect = m.reshape((2,3)) + args_maker = lambda: [m_rect] for repeats in [2, [2,1], [2], lnp.array([2,1]), lnp.array([2])]: - lax_ans = lnp.repeat(m_rect_lax, repeats, axis=0) - numpy_ans = onp.repeat(m_rect_numpy, repeats, axis=0) + lax_ans = lnp.repeat(m_rect, repeats, axis=0) + numpy_ans = onp.repeat(m_rect, repeats, axis=0) lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=0) @@ -761,8 +760,8 @@ def testIssue1233(self): self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) for repeats in [2, [1,3,2], [2], lnp.array([1,3,2]), lnp.array([2])]: - lax_ans = lnp.repeat(m_rect_lax, repeats, axis=1) - numpy_ans = onp.repeat(m_rect_numpy, repeats, axis=1) + lax_ans = lnp.repeat(m_rect, repeats, axis=1) + numpy_ans = onp.repeat(m_rect, repeats, axis=1) lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=1) From 175226e73cce6c0f3a3e0a7c6be8889762c772e9 Mon Sep 17 00:00:00 2001 From: xysun Date: Sat, 14 Sep 2019 22:07:54 +0100 Subject: [PATCH 0038/1053] refactor tests --- tests/lax_numpy_test.py | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 1f91e28d5658..a801cd2aaf36 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -734,39 +734,30 @@ def testIssue1233(self): Following numpy test suite from `test_repeat` at https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_multiarray.py ''' tol = 1e-5 + + def test_single(m, args_maker, repeats, axis): + lax_ans = lnp.repeat(m, repeats, axis) + numpy_ans = onp.repeat(m, repeats, axis) + + self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) + + lnp_fun = lambda arg: lnp.repeat(arg, repeats = repeats, axis=axis) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) m = lnp.array([1,2,3,4,5,6]) args_maker = lambda: [m] for repeats in [2, [1,3,2,1,1,2], [2], lnp.array([1,3,2,1,1,2]), lnp.array([2])]: - lax_ans = lnp.repeat(m, repeats) - numpy_ans = onp.repeat(m, repeats) - - self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) - - lnp_fun = lambda arg: lnp.repeat(arg, repeats = repeats) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + test_single(m, args_maker, repeats, None) m_rect = m.reshape((2,3)) args_maker = lambda: [m_rect] for repeats in [2, [2,1], [2], lnp.array([2,1]), lnp.array([2])]: - lax_ans = lnp.repeat(m_rect, repeats, axis=0) - numpy_ans = onp.repeat(m_rect, repeats, axis=0) - - lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=0) - - self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + test_single(m_rect, args_maker, repeats, axis=0) for repeats in [2, [1,3,2], [2], lnp.array([1,3,2]), lnp.array([2])]: - lax_ans = lnp.repeat(m_rect, repeats, axis=1) - numpy_ans = onp.repeat(m_rect, repeats, axis=1) - - lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=1) - - self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + test_single(m_rect, args_maker, repeats, axis=1) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "op={}_shape=[{}]_axis={}_out_dtype={}".format( From 0f03afc5e3243cdb9cb6aaa00d5a6cad5e300544 Mon Sep 17 00:00:00 2001 From: xysun Date: Sat, 14 Sep 2019 22:32:45 +0100 Subject: [PATCH 0039/1053] python2.7 compatible --- jax/numpy/lax_numpy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ad320567f6df..b2fd40a967c0 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1738,7 +1738,7 @@ def repeat(a, repeats, axis=None): # total elements after repeat along the axis total = sum(repeats_raveled) - new_shape = a_shape.copy() + new_shape = a_shape[:] new_shape[axis] = total ret = ravel(zeros(new_shape, a.dtype)) From 5b6b72c2fb38c331199afef391a498662d4565f7 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Sep 2019 08:45:58 -0700 Subject: [PATCH 0040/1053] fix broadcasting bug in rem jvp, fixes #1350 --- jax/lax/lax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index fc713efcd23f..2b6500cf470c 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1725,7 +1725,7 @@ def _div_transpose_rule(cotangent, x, y): rem_p = standard_binop([_num, _num], 'rem') ad.defjvp(rem_p, lambda g, x, y: _brcast(g, y), - lambda g, x, y: mul(neg(g), floor(div(x, y)))) + lambda g, x, y: mul(_brcast(neg(g), x), floor(div(x, y)))) def _broadcasting_select(c, which, x, y): From e945c9c11eb8b00d7c5fa80b472c181950aed946 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Sep 2019 09:24:00 -0700 Subject: [PATCH 0041/1053] add some 'manual' lax.rem autodiff tests --- tests/lax_test.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index a5492ef78bd7..236cadca16fc 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1501,8 +1501,6 @@ def grad_test_spec(op, nargs, order, rng, dtypes, name=None, tol=None): dtypes=[onp.float64]), grad_test_spec(lax.round, nargs=1, order=2, rng=jtu.rand_default(), dtypes=[onp.float64]), - # grad_test_spec(lax.rem, nargs=2, order=2, rng=jtu.rand_default(), - # dtypes=[onp.float64]), # TODO(mattjj): enable grad_test_spec(lax.exp, nargs=1, order=2, rng=jtu.rand_small(), dtypes=[onp.float64, onp.complex64]), @@ -2287,6 +2285,22 @@ def f2(x, y): expected = onp.array(0.0) self.assertAllClose(ans, expected, check_dtypes=False) + # TODO(mattjj): make this a more systematic test + def testRemainder(self): + rng = onp.random.RandomState(0) + x = rng.uniform(-0.9, 9, size=(3, 4)) + y = rng.uniform(0.7, 1.9, size=(3, 1)) + assert not set(onp.unique(x)) & set(onp.unique(y)) + tol = 1e-1 if num_float_bits(onp.float64) == 32 else 1e-3 + check_grads(lax.rem, (x, y), 2, ["fwd", "rev"], tol, tol) + + rng = onp.random.RandomState(0) + x = rng.uniform(-0.9, 9, size=(1, 4)) + y = rng.uniform(0.7, 1.9, size=(3, 4)) + assert not set(onp.unique(x)) & set(onp.unique(y)) + tol = 1e-1 if num_float_bits(onp.float64) == 32 else 1e-3 + check_grads(lax.rem, (x, y), 2, ["fwd", "rev"], tol, tol) + def all_bdims(*shapes): bdims = (itertools.chain([None], range(len(shape) + 1)) for shape in shapes) From 78c70ecd0ccacc64531ddc22f2eab161bd0218fc Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 11 Sep 2019 21:57:54 -0700 Subject: [PATCH 0042/1053] add dynamic shape envs --- jax/api.py | 23 ++++++++------ jax/interpreters/masking.py | 61 ++++++++++++++++++++++++++----------- tests/masking_test.py | 22 ++++++++++++- 3 files changed, 78 insertions(+), 28 deletions(-) diff --git a/jax/api.py b/jax/api.py index c039a0312539..145bef4e4a85 100644 --- a/jax/api.py +++ b/jax/api.py @@ -872,22 +872,25 @@ def pfun(*args): def mask(fun, in_shapes, out_shape): - in_shapes_flat, in_shapes_tree = tree_flatten(in_shapes) - out_shapes_flat, out_shapes_tree = tree_flatten(out_shape) + in_shapes, in_shapes_tree = tree_flatten(in_shapes) + out_shapes, out_shapes_tree = tree_flatten(out_shape) - def wrapped_fun(args, logical_shape_env): + unique_ids, in_shapes = masking.rename_ids(in_shapes) + out_shapes = masking.remap_ids(unique_ids, out_shapes) + + def wrapped_fun(args, logical_env): + logical_env = {unique_ids[name] : val for name, val in logical_env.items()} f = lu.wrap_init(fun) args_flat, in_tree = tree_flatten(args) assert in_tree == in_shapes_tree - padded_shape_env = _bind_shapes(in_shapes_flat, [x.shape for x in args_flat]) - shape_envs = masking.ShapeEnvs(logical_shape_env, padded_shape_env) + padded_env = _bind_shapes(in_shapes, [x.shape for x in args_flat]) flat_fun, out_tree = flatten_fun_nokwargs(f, in_tree) - outs, out_shapes_ = masking.mask_fun(flat_fun, shape_envs, args_flat, - in_shapes_flat) - if not out_shapes_flat == list(out_shapes_): + outs, out_shapes_ = masking.mask_fun( + flat_fun, logical_env, padded_env, args_flat, in_shapes) + if not out_shapes == list(out_shapes_): raise TypeError("pytree mismatch") - if not all(out.shape == masking.eval_shape_expr(padded_shape_env, expr) - for out, expr in zip(outs, out_shapes_flat)): + if not all(out.shape == masking.eval_shape_expr(padded_env, expr) + for out, expr in zip(outs, out_shapes)): raise masking.ShapeError return tree_unflatten(out_tree(), outs) return wrapped_fun diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 864b4e74bc6d..ddbc846c9c81 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -14,6 +14,7 @@ from __future__ import print_function +from contextlib import contextmanager from collections import defaultdict, Counter, namedtuple from functools import partial, wraps import itertools as it @@ -41,24 +42,54 @@ def prod(xs): ### main transformation functions -def mask_fun(fun, shape_envs, in_vals, shape_exprs): +ShapeEnvs = namedtuple("ShapeEnvs", ["logical", "padded"]) +shape_envs = ShapeEnvs({}, {}) + +@contextmanager +def extend_shape_envs(logical_env, padded_env): + global shape_envs + new_logical = dict(it.chain(shape_envs.logical.items(), logical_env.items())) + new_padded = dict(it.chain(shape_envs.padded.items(), padded_env.items())) + shape_envs, prev = ShapeEnvs(new_logical, new_padded), shape_envs + yield + shape_envs = prev + +def shape_as_value(expr): + return eval_shape_expr(shape_envs.logical, expr) + +def padded_shape_as_value(expr): + return eval_shape_expr(shape_envs.padded, expr) + + +def mask_fun(fun, logical_env, padded_env, in_vals, shape_exprs): with core.new_master(MaskTrace) as master: - fun, out_shapes = mask_subtrace(fun, master, shape_envs) - out_vals = fun.call_wrapped(in_vals, shape_exprs) + fun, out_shapes = mask_subtrace(fun, master) + with extend_shape_envs(logical_env, padded_env): + out_vals = fun.call_wrapped(in_vals, shape_exprs) del master return out_vals, out_shapes() @lu.transformation_with_aux -def mask_subtrace(master, shape_envs, in_vals, shape_exprs): +def mask_subtrace(master, in_vals, shape_exprs): trace = MaskTrace(master, core.cur_sublevel()) - in_tracers = map(partial(MaskTracer, trace, shape_envs), - in_vals, shape_exprs) + in_tracers = map(partial(MaskTracer, trace), in_vals, shape_exprs) outs = yield in_tracers, {} out_tracers = map(trace.full_raise, outs) out_vals, out_shapes = unzip2((t.val, t.shape_expr) for t in out_tracers) yield out_vals, out_shapes +def rename_ids(shapes): + names = defaultdict(object) + return names, remap_ids(names, shapes) + +def remap_ids(names, shapes): + return [ShapeExpr(Poly({Mon({names[id] : deg for id, deg in mon.items()}) + : coeff for mon, coeff in poly.items()}) + for poly in shape_expr) + for shape_expr in shapes] + + ### shape expressions # Shape expressions model tuples of formal polynomials with integer @@ -174,14 +205,11 @@ def __getitem__(self, idx): ### automasking tracer machinery -ShapeEnvs = namedtuple("ShapeEnvs", ["logical", "padded"]) - class MaskTracer(Tracer): - __slots__ = ["val", "shape_expr", "shape_envs"] + __slots__ = ["val", "shape_expr"] - def __init__(self, trace, shape_envs, val, shape_expr): + def __init__(self, trace, val, shape_expr): self.trace = trace - self.shape_envs = shape_envs self.val = val self.shape_expr = shape_expr @@ -197,16 +225,15 @@ def full_lower(self): class MaskTrace(Trace): def pure(self, val): - return MaskTracer(self, None, val, ShapeExpr(*onp.shape(val))) + return MaskTracer(self, val, ShapeExpr(*onp.shape(val))) def lift(self, val): - return MaskTracer(self, None, val, ShapeExpr(*onp.shape(val))) + return MaskTracer(self, val, ShapeExpr(*onp.shape(val))) def sublift(self, val): - return MaskTracer(self, val.shape_envs, val.val, val.shape_expr) + return MaskTracer(self, val.val, val.shape_expr) def process_primitive(self, primitive, tracers, params): - shape_envs = next(t.shape_envs for t in tracers if t.shape_envs is not None) vals, shape_exprs = unzip2((t.val, t.shape_expr) for t in tracers) if primitive in shape_parameterized_primitive_rules: rule = shape_parameterized_primitive_rules[primitive] @@ -216,9 +243,9 @@ def process_primitive(self, primitive, tracers, params): logical_shapes = map(partial(eval_shape_expr, shape_envs.logical), shape_exprs) out = masking_rules[primitive](vals, logical_shapes, **params) if not primitive.multiple_results: - return MaskTracer(self, shape_envs, out, out_shape) + return MaskTracer(self, out, out_shape) else: - return map(partial(MaskTracer, self, shape_envs), out, out_shape) + return map(partial(MaskTracer, self), out, out_shape) def process_call(self, call_primitive, f, tracers, params): raise NotImplementedError # TODO mask-of-jit diff --git a/tests/masking_test.py b/tests/masking_test.py index 8b25989e98c6..acff44625adc 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -17,13 +17,14 @@ from __future__ import print_function from functools import partial +from unittest import SkipTest import numpy as onp from absl.testing import absltest from absl.testing import parameterized from jax import test_util as jtu -from jax.interpreters.masking import ShapeError +from jax.interpreters.masking import ShapeError, shape_as_value from jax import mask, vmap, jit, Shape, shapecheck, s_ from jax import lax import jax.numpy as np @@ -182,6 +183,25 @@ def dot(x, y): expected = onp.dot(x[:2, :2], y[:2, :2]) self.assertAllClose(ans[:2, :2], expected, check_dtypes=False) + def test_mean(self): + @partial(mask, in_shapes=[Shape('n')], out_shape=Shape()) + def padded_sum(x): + return np.sum(x) / shape_as_value(x.shape)[0] + + ans = padded_sum([np.array([3, 1, 4, 1, 5])], dict(n=3)) + expected = 8 / 3 + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_arange(self): + raise SkipTest("not yet implemented") + @partial(mask, in_shapes=[Shape('n')], out_shape=Shape('n')) + def padded_add(x): + return x + lax.iota(x.shape[0]) + + ans = padded_add([np.array([3, 1, 4, 1, 5])], dict(n=3)) + expected = onp.array([3, 2, 6]) + self.assertAllClose(ans[:3], expected, check_dtypes=False) + if __name__ == '__main__': absltest.main() From 283299649b6cb82cda846350b973105f5a4aded7 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 13 Sep 2019 14:36:33 -0700 Subject: [PATCH 0043/1053] add a 'monomorphic dim' symbol, bug fixes --- jax/api.py | 59 ++++++++++++++++-------- jax/interpreters/masking.py | 79 ++++++++++++++++++++----------- jax/lax/lax.py | 2 +- tests/masking_test.py | 92 ++++++++++++++++++++++++------------- 4 files changed, 154 insertions(+), 78 deletions(-) diff --git a/jax/api.py b/jax/api.py index 145bef4e4a85..403d7dd50fe6 100644 --- a/jax/api.py +++ b/jax/api.py @@ -60,7 +60,7 @@ from .interpreters import batching from .interpreters import parallel from .interpreters import masking -from .interpreters.masking import Shape, s_, shapecheck +from .interpreters.masking import shapecheck from .config import flags, config map = safe_map @@ -872,48 +872,71 @@ def pfun(*args): def mask(fun, in_shapes, out_shape): - in_shapes, in_shapes_tree = tree_flatten(in_shapes) - out_shapes, out_shapes_tree = tree_flatten(out_shape) + in_specs, in_shapes_tree = tree_flatten(in_shapes) + out_specs, out_shapes_tree = tree_flatten(out_shape) - unique_ids, in_shapes = masking.rename_ids(in_shapes) - out_shapes = masking.remap_ids(unique_ids, out_shapes) + in_specs = map(masking.parse_spec, in_specs) + out_specs = map(masking.parse_spec, out_specs) + + unique_ids = collections.defaultdict(object) + in_specs = map(partial(_remap_ids, unique_ids), in_specs) + out_specs = map(partial(_remap_ids, unique_ids), out_specs) def wrapped_fun(args, logical_env): - logical_env = {unique_ids[name] : val for name, val in logical_env.items()} - f = lu.wrap_init(fun) args_flat, in_tree = tree_flatten(args) - assert in_tree == in_shapes_tree + if in_tree != in_shapes_tree: raise TypeError("pytree mismatch") + logical_env = {unique_ids[name] : val for name, val in logical_env.items()} + in_shapes = map(masking.finalize_spec, in_specs, map(onp.shape, args_flat)) padded_env = _bind_shapes(in_shapes, [x.shape for x in args_flat]) + f = lu.wrap_init(fun) flat_fun, out_tree = flatten_fun_nokwargs(f, in_tree) outs, out_shapes_ = masking.mask_fun( flat_fun, logical_env, padded_env, args_flat, in_shapes) + if not out_tree() == out_shapes_tree: raise TypeError("pytree mismatch") + out_shapes = map(masking.finalize_spec, out_specs, map(onp.shape, outs)) if not out_shapes == list(out_shapes_): - raise TypeError("pytree mismatch") - if not all(out.shape == masking.eval_shape_expr(padded_env, expr) + raise masking.ShapeError + if not all(onp.shape(out) == masking.eval_shape_expr(padded_env, expr) for out, expr in zip(outs, out_shapes)): raise masking.ShapeError return tree_unflatten(out_tree(), outs) return wrapped_fun +def _remap_ids(names, shape_spec): + ShapeSpec, Poly, Mon = masking.ShapeSpec, masking.Poly, masking.Mon + mdim = masking.monomorphic_dim + return ShapeSpec(Poly({Mon({names[id] : deg for id, deg in mon.items()}) + : coeff for mon, coeff in poly.items()}) + if poly is not mdim else mdim for poly in shape_spec) + def _bind_shapes(shape_exprs, shapes): env = {} - for binders, shape in zip(shape_exprs, shapes): - for poly, d in zip(binders, shape): - (binder,), = poly - if env.setdefault(binder, d) != d: raise masking.ShapeError + for shape_expr, shape in zip(shape_exprs, shapes): + for poly, d in zip(shape_expr, shape): + if masking.is_constant(poly): + continue + else: + (binder,), = poly # TODO generalize to handle striding + if env.setdefault(binder, d) != d: raise masking.ShapeError return env @curry def shapecheck(in_shapes, out_shape, fun): - in_shapes_flat, in_tree = tree_flatten(in_shapes) - out_shapes_flat, out_tree = tree_flatten(out_shape) + in_shapes, in_tree = tree_flatten(in_shapes) + in_shapes = map(masking.parse_spec, in_shapes) + out_shapes, out_tree = tree_flatten(out_shape) + out_shapes = map(masking.parse_spec, out_shapes) flat_fun, out_tree_ = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) - out_shapes_flat_ = masking.shapecheck(flat_fun, in_shapes_flat) + out_shapes_ = masking.shapecheck(flat_fun, in_shapes) if out_tree != out_tree_(): raise TypeError("pytree mismatch") - if out_shapes_flat != out_shapes_flat_: raise masking.ShapeError + if not all(map(_shape_spec_consistent, out_shapes, out_shapes_)): + raise masking.ShapeError return fun +def _shape_spec_consistent(spec, expr): + return all(a == b for a, b in zip(spec, expr) if a is not masking.monomorphic_dim) + def jvp(fun, primals, tangents): """Computes a (forward-mode) Jacobian-vector product of `fun`. diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index ddbc846c9c81..0bdfb9ebf834 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -43,7 +43,7 @@ def prod(xs): ### main transformation functions ShapeEnvs = namedtuple("ShapeEnvs", ["logical", "padded"]) -shape_envs = ShapeEnvs({}, {}) +shape_envs = ShapeEnvs({}, {}) # TODO(mattjj): make this a stack for efficiency @contextmanager def extend_shape_envs(logical_env, padded_env): @@ -72,24 +72,14 @@ def mask_fun(fun, logical_env, padded_env, in_vals, shape_exprs): @lu.transformation_with_aux def mask_subtrace(master, in_vals, shape_exprs): trace = MaskTrace(master, core.cur_sublevel()) - in_tracers = map(partial(MaskTracer, trace), in_vals, shape_exprs) + in_tracers = [MaskTracer(trace, x, s).full_lower() + for x, s in zip(in_vals, shape_exprs)] outs = yield in_tracers, {} out_tracers = map(trace.full_raise, outs) out_vals, out_shapes = unzip2((t.val, t.shape_expr) for t in out_tracers) yield out_vals, out_shapes -def rename_ids(shapes): - names = defaultdict(object) - return names, remap_ids(names, shapes) - -def remap_ids(names, shapes): - return [ShapeExpr(Poly({Mon({names[id] : deg for id, deg in mon.items()}) - : coeff for mon, coeff in poly.items()}) - for poly in shape_expr) - for shape_expr in shapes] - - ### shape expressions # Shape expressions model tuples of formal polynomials with integer @@ -132,10 +122,16 @@ def __str__(self): def __lt__(self, other): # sort by total degree, then lexicographically on indets - self_key = sum(self.values()), tuple(sorted(self)) - other_key = sum(other.values()), tuple(sorted(other)) + self_key = self.degree(), tuple(sorted(self)) + other_key = other.degree(), tuple(sorted(other)) return self_key < other_key + def degree(self): + return sum(self.values()) + +def concrete_shape(shape): + return ShapeExpr((Poly({Mon(): int(d)}) for d in shape)) + def eval_shape_expr(env, expr): return tuple(eval_dim_expr(env, poly) for poly in expr) @@ -143,30 +139,49 @@ def eval_dim_expr(env, poly): return sum(coeff * prod([env[id] ** deg for id, deg in mon.items()]) for mon, coeff in poly.items()) +def is_constant(poly): + try: + ([], _), = poly.items() + return True + except (ValueError, TypeError): + return False + class ShapeError(Exception): pass # To denote some shape expressions (for annotations) we use a small language. # -# data Shape = Shape [Dim] +# data ShapeSpec = ShapeSpec [Dim] # data Dim = Id Str # | Lit Int # | Mul Dim Dim # | Add Dim Dim - +# | MonomorphicDim +# # We'll also make a simple concrete syntax for annotation. The grammar is # # shape_spec ::= '(' dims ')' # dims ::= dim ',' dims | '' -# dim ::= str | int | dim '*' dim | dim '+' dim +# dim ::= str | int | dim '*' dim | dim '+' dim | '_' +# +# ShapeSpecs encode ShapeExprs but can have some monomorphic dims inside them, +# which must be replaced with concrete shapes when known. + +class ShapeSpec(list): + def __str__(self): + return 'ShapeSpec({})'.format(', '.join(map(str, self))) + +def finalize_spec(spec, shape): + return ShapeExpr(parse_lit(d) if e is monomorphic_dim else e + for e, d in zip(spec, shape)) def parse_spec(spec=''): if not spec: - return ShapeExpr(()) + return ShapeSpec(()) if spec[0] == '(': if spec[-1] != ')': raise SyntaxError(spec) spec = spec[1:-1] dims = map(parse_dim, spec.replace(' ', '').strip(',').split(',')) - return ShapeExpr(dims) + return ShapeSpec(dims) def parse_dim(spec): if '+' in spec: @@ -179,6 +194,8 @@ def parse_dim(spec): return parse_lit(spec) elif spec in identifiers: return parse_id(spec) + elif spec == '_': + return monomorphic_dim else: raise SyntaxError(spec) digits = frozenset(string.digits) @@ -187,13 +204,15 @@ def parse_dim(spec): def parse_id(name): return Poly({Mon({name: 1}): 1}) def parse_lit(val_str): return Poly({Mon(): int(val_str)}) +class MonomorphicDim(object): + def __str__(self): return '_' +monomorphic_dim = MonomorphicDim() + # Two convenient ways to provide shape annotations: -# 1. Shape('(m, n)') +# 1. '(m, n)' # 2. s_['m', 'n'] -Shape = parse_spec - class S_(object): def __getitem__(self, idx): if type(idx) is tuple: @@ -217,18 +236,21 @@ def __init__(self, trace, val, shape_expr): def aval(self): return ShapedArray(self.shape_expr, self.val.dtype) + def is_pure(self): + return all(is_constant(poly) for poly in self.shape_expr) + def full_lower(self): - if all(type(s) is int for s in self.shape_expr): + if self.is_pure(): return core.full_lower(self.val) else: return self class MaskTrace(Trace): def pure(self, val): - return MaskTracer(self, val, ShapeExpr(*onp.shape(val))) + return MaskTracer(self, val, concrete_shape(onp.shape(val))) def lift(self, val): - return MaskTracer(self, val, ShapeExpr(*onp.shape(val))) + return MaskTracer(self, val, concrete_shape(onp.shape(val))) def sublift(self, val): return MaskTracer(self, val.val, val.shape_expr) @@ -300,6 +322,7 @@ def check_subtrace(master, in_shapes): yield [t.shape_expr for t in out_tracers] +# TODO(mattjj): add dtypes? class ShapeCheckTracer(Tracer): __slots__ = ["shape_expr"] @@ -316,10 +339,10 @@ def full_lower(self): class ShapeCheckTrace(Trace): def pure(self, val): - return ShapeCheckTracer(self, Shape(*onp.shape(val)), onp.result_type(val)) + return ShapeCheckTracer(self, concrete_shape(onp.shape(val))) def lift(self, val): - return ShapeCheckTracer(self, Shape(*onp.shape(val)), onp.result_type(val)) + return ShapeCheckTracer(self, concrete_shape(onp.shape(val))) def sublift(self, val): return ShapeCheckTracer(self, val.shape_expr) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2b6500cf470c..0e4b6998cffb 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3355,7 +3355,7 @@ def _masking_defreducer(prim, identity_like): def _reducer_polymorphic_shape_rule(shape_exprs, axes, **unused_params): shape_expr, = shape_exprs - return ShapeExpr(*(d for i, d in enumerate(shape_expr) if i not in axes)) + return ShapeExpr([d for i, d in enumerate(shape_expr) if i not in axes]) def _reducer_masking_rule(prim, identity_like, padded_vals, logical_shapes, axes, input_shape): diff --git a/tests/masking_test.py b/tests/masking_test.py index acff44625adc..c1c785a93d9a 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -24,8 +24,8 @@ from absl.testing import parameterized from jax import test_util as jtu -from jax.interpreters.masking import ShapeError, shape_as_value -from jax import mask, vmap, jit, Shape, shapecheck, s_ +from jax.interpreters.masking import ShapeError, shape_as_value, parse_spec +from jax import mask, vmap, jit, shapecheck from jax import lax import jax.numpy as np @@ -38,48 +38,53 @@ class MaskingTest(jtu.JaxTestCase): - def test_shape_parsing(self): - self.assertEqual(str(Shape('(m, n)')), 'ShapeExpr(m, n)') - self.assertEqual(str(Shape('(m * n)')), 'ShapeExpr(m n)') - self.assertEqual(str(Shape('m * n')), 'ShapeExpr(m n)') - self.assertEqual(str(Shape('(m * n,)')), 'ShapeExpr(m n)') - self.assertEqual(str(Shape('(3, m)')), 'ShapeExpr(3, m)') - self.assertEqual(str(Shape('(3 * m)')), 'ShapeExpr(3 m)') - self.assertEqual(str(Shape('m')), 'ShapeExpr(m)') - self.assertEqual(str(Shape('')), 'ShapeExpr()') - self.assertEqual(str(Shape('m + n')), 'ShapeExpr(m + n)') - self.assertEqual(str(Shape('m + n * k')), 'ShapeExpr(m + k n)') - self.assertEqual(str(Shape('m + 3 * k')), 'ShapeExpr(3 k + m)') + @parameterized.parameters([ + ['(m, n)', 'ShapeSpec(m, n)'], + ['(m * n)', 'ShapeSpec(m n)'], + ['m * n', 'ShapeSpec(m n)'], + ['(m * n,)', 'ShapeSpec(m n)'], + ['(3, m)', 'ShapeSpec(3, m)'], + ['(3 * m)', 'ShapeSpec(3 m)'], + ['m', 'ShapeSpec(m)'], + ['', 'ShapeSpec()'], + ['m + n', 'ShapeSpec(m + n)'], + ['m + n * k', 'ShapeSpec(m + k n)'], + ['m + 3 * k', 'ShapeSpec(3 k + m)'], + ['', 'ShapeSpec()'], + ['_', 'ShapeSpec(_)'], + ]) + def test_shape_parsing(self, spec, ans): + self.assertEqual(str(parse_spec(spec)), ans) def test_dot_shape_checking(self): - @shapecheck((s_['m', 'n'], s_['n']), s_['m']) + @shapecheck(['(m, n)', 'n'], 'm') def matvec(A, b): return np.dot(A, b) def thunk(): - @shapecheck((s_['m', 'n'], s_['n']), s_['m']) + @shapecheck(['(m, n)', 'n'], 'm') def matvec(A, b): return np.dot(b, A) self.assertRaisesRegex(ShapeError, "", thunk) def test_flatten_shape_checking(self): - @shapecheck((s_['m', 'n'],), s_['m * n']) + @shapecheck(['(m, n)'], 'm * n') def flatten(x): return lax.reshape(x, (x.shape[0] * x.shape[1],)) def test_concatenate_shape_checking(self): - @shapecheck((s_['m'], s_['n'], s_['m']), s_['3*m + n']) + @shapecheck(['m', 'n', 'm'], '3*m + n') def cat(x, y, z): return lax.concatenate([x, y, x, z], 0) def thunk(): - @shapecheck((s_['m'], s_['n'], s_['m']), s_['3*m + n']) + @shapecheck(['m', 'n', 'm'], '3*m + n') def cat(x, y, z): return lax.concatenate([x, y, x], 0) self.assertRaisesRegex(ShapeError, "", thunk) def test_sum(self): - @partial(mask, in_shapes=[Shape('n')], out_shape=Shape()) + @partial(mask, in_shapes=['n'], out_shape='') def padded_sum(x): return np.sum(x) @@ -92,7 +97,7 @@ def padded_sum(x): self.assertAllClose(ans, expected, check_dtypes=False) def test_sum_vmap(self): - @partial(mask, in_shapes=[Shape('n')], out_shape=Shape()) + @partial(mask, in_shapes=['n'], out_shape='') def padded_sum(x): return np.sum(x) @@ -101,7 +106,7 @@ def padded_sum(x): self.assertAllClose(ans, expected, check_dtypes=False) def test_add(self): - @partial(mask, in_shapes=[Shape('n'), Shape('n')], out_shape=Shape('n')) + @partial(mask, in_shapes=['n', 'n'], out_shape='n') def addvecs(x, y): return x + y @@ -115,7 +120,7 @@ def addvecs(x, y): self.assertRaisesRegex(ShapeError, "", thunk) def test_scan(self): - @partial(mask, in_shapes=[Shape('n')], out_shape=Shape()) + @partial(mask, in_shapes=['n'], out_shape='') def cumsum(arr): out, _ = lax.scan(lambda c, x: (c + x, ()), 0, arr) return out @@ -125,7 +130,7 @@ def cumsum(arr): self.assertAllClose(ans, expected, check_dtypes=False) def test_scan_vmap(self): - @partial(mask, in_shapes=[Shape('n')], out_shape=Shape()) + @partial(mask, in_shapes=['n'], out_shape='') def cumsum(arr): out, _ = lax.scan(lambda c, x: (c + x, ()), 0, arr) return out @@ -135,7 +140,7 @@ def cumsum(arr): self.assertAllClose(ans, expected, check_dtypes=False) def test_scan_jit(self): - @partial(mask, in_shapes=[Shape('n')], out_shape=Shape()) + @partial(mask, in_shapes=['n'], out_shape='') def cumsum(arr): out, _ = lax.scan(lambda c, x: (c + x, ()), 0, arr) return out @@ -161,8 +166,7 @@ def jit_cumsum(args, shape_env): self.assertAllClose(ans, expected, check_dtypes=False) def test_concatenate(self): - @partial(mask, in_shapes=[Shape('n'), Shape('m'), Shape('n')], - out_shape=Shape('m + 2 * n')) + @partial(mask, in_shapes=['n', 'm', 'n'], out_shape='m + 2 * n') def cat(x, y, z): return lax.concatenate([x, y, z], 0) @@ -172,8 +176,7 @@ def cat(x, y, z): self.assertAllClose(ans[:4], expected, check_dtypes=False) def test_dot(self): - @partial(mask, in_shapes=[Shape('(m, k)'), Shape(('k, n'))], - out_shape=[Shape('(m, n)')]) + @partial(mask, in_shapes=['(m, k)', '(k, n)'], out_shape='(m, n)') def dot(x, y): return lax.dot(x, y) @@ -184,7 +187,7 @@ def dot(x, y): self.assertAllClose(ans[:2, :2], expected, check_dtypes=False) def test_mean(self): - @partial(mask, in_shapes=[Shape('n')], out_shape=Shape()) + @partial(mask, in_shapes=['n'], out_shape='') def padded_sum(x): return np.sum(x) / shape_as_value(x.shape)[0] @@ -192,9 +195,36 @@ def padded_sum(x): expected = 8 / 3 self.assertAllClose(ans, expected, check_dtypes=False) + def test_monomorphic(self): + @partial(mask, in_shapes=['(_, n)'], out_shape='') + def padded_sum(x): + return np.sum(x) + + ans = padded_sum([np.array([[3, 4], [5, 6]])], dict(n=1)) + expected = 8 + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_monomorphic2(self): + @partial(mask, in_shapes=['(_, n)'], out_shape='n') + def padded_sum(x): + return np.sum(x, axis=0) + + ans = padded_sum([np.array([[3, 4], [5, 6]])], dict(n=2)) + expected = np.array([8, 10]) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_monomorphic3(self): + @partial(mask, in_shapes=['(_, n)'], out_shape='_') + def padded_sum(x): + return np.sum(x, axis=1) + + ans = padded_sum([np.array([[3, 4], [5, 6]])], dict(n=1)) + expected = np.array([3, 5]) + self.assertAllClose(ans, expected, check_dtypes=False) + def test_arange(self): raise SkipTest("not yet implemented") - @partial(mask, in_shapes=[Shape('n')], out_shape=Shape('n')) + @partial(mask, in_shapes=['n'], out_shape='n') def padded_add(x): return x + lax.iota(x.shape[0]) From b71181d3c08eb3c89403e14068843aeb401144ad Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 13 Sep 2019 16:30:22 -0700 Subject: [PATCH 0044/1053] start writing nesting test --- jax/interpreters/masking.py | 15 ++++++++++++--- jax/lax/lax.py | 8 +++++--- tests/masking_test.py | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 0bdfb9ebf834..8972eb1b47c2 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -55,10 +55,16 @@ def extend_shape_envs(logical_env, padded_env): shape_envs = prev def shape_as_value(expr): - return eval_shape_expr(shape_envs.logical, expr) + if type(expr) is ShapeExpr: + return eval_shape_expr(shape_envs.logical, expr) + else: + return expr def padded_shape_as_value(expr): - return eval_shape_expr(shape_envs.padded, expr) + if type(expr) is ShapeExpr: + return eval_shape_expr(shape_envs.padded, expr) + else: + return expr def mask_fun(fun, logical_env, padded_env, in_vals, shape_exprs): @@ -130,7 +136,10 @@ def degree(self): return sum(self.values()) def concrete_shape(shape): - return ShapeExpr((Poly({Mon(): int(d)}) for d in shape)) + if type(shape) is ShapeExpr: + return shape + else: + return ShapeExpr((Poly({Mon(): d}) for d in shape)) def eval_shape_expr(env, expr): return tuple(eval_dim_expr(env, poly) for poly in expr) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 0e4b6998cffb..6c7dd3cefabe 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3361,11 +3361,12 @@ def _reducer_masking_rule(prim, identity_like, padded_vals, logical_shapes, axes, input_shape): del input_shape # Unused. (padded_val,), (logical_shape,) = padded_vals, logical_shapes - masks = [broadcasted_iota(onp.int32, padded_val.shape, i) < d + padded_shape = masking.padded_shape_as_value(padded_val.shape) + masks = [broadcasted_iota(onp.int32, padded_shape, i) < d for i, d in enumerate(logical_shape) if i in axes] mask = _reduce(operator.and_, masks) masked_val = select(mask, padded_val, identity_like(padded_val)) - return prim.bind(masked_val, axes=axes, input_shape=padded_val.shape) + return prim.bind(masked_val, axes=axes, input_shape=padded_shape) reduce_p = standard_reduction_primitive(_reduce_shape_rule, _input_dtype, 'reduce', _reduce_translation_rule) @@ -4010,7 +4011,8 @@ def _tie_in_batch_rule(batched_args, batch_dims): xla.translations[tie_in_p] = lambda c, x, y: y ad.deflinear(tie_in_p, _tie_in_transpose_rule) batching.primitive_batchers[tie_in_p] = _tie_in_batch_rule - +masking.shape_rules[tie_in_p] = lambda shape_exprs: shape_exprs[1] +masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] shaped_identity_p = Primitive('shape_id') shaped_identity_p.def_impl(lambda x, shape: x) diff --git a/tests/masking_test.py b/tests/masking_test.py index c1c785a93d9a..004dd2e61312 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -222,8 +222,23 @@ def padded_sum(x): expected = np.array([3, 5]) self.assertAllClose(ans, expected, check_dtypes=False) + def test_nesting(self): + raise SkipTest("not yet implemented") + + @partial(mask, in_shapes=['n'], out_shape='') + def padded_sum(x): + return np.sum(x) + + @partial(mask, in_shapes=['n'], out_shape='') + def padded_sum2(x): + return padded_sum([x], dict(n=2)) + + ans = padded_sum2([np.array([3, 1, 4, 1])], dict(n=1)) + import ipdb; ipdb.set_trace() + def test_arange(self): raise SkipTest("not yet implemented") + @partial(mask, in_shapes=['n'], out_shape='n') def padded_add(x): return x + lax.iota(x.shape[0]) From 6e22b418e3b625efa5b58a41b29c84476dbca486 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Sep 2019 14:11:15 -0700 Subject: [PATCH 0045/1053] skip problematic tests on tpu --- tests/lax_numpy_indexing_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 996469ca7ba1..ebdbbc9e63ad 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -856,6 +856,7 @@ def testMixedAdvancedIndexing(self, shape, dtype, update_shape, update_dtype, for update_shape in _broadcastable_shapes(_update_shape(shape, indexer)) for update_dtype in ([dtype] if op == UpdateOps.ADD else float_dtypes) for rng in [jtu.rand_default()])) + @jtu.skip_on_devices("tpu") # TODO(mattjj,phawkins): tpu issues def testStaticIndexingGrads(self, shape, dtype, update_shape, update_dtype, rng, indexer, op): jax_op = ops.index_update if op == UpdateOps.UPDATE else ops.index_add From 4f5dcb0017af48896f0b07ffba29854dfaab0b0d Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 15 Sep 2019 14:51:14 -0700 Subject: [PATCH 0046/1053] Don't reuse SyntaxError in masking.py This exception type is really intended for errors in *Python* syntax. In particular, IPython will add extra lines to the stack-trace to try to show the original line of Python where the error came from. Compare: In [2]: raise ValueError --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in ----> 1 raise ValueError ValueError: In [3]: raise SyntaxError Traceback (most recent call last): File "/Users/shoyer/miniconda3/envs/jax-py37/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "", line 1, in raise SyntaxError File "", line unknown SyntaxError So I think it's better just to define our own `ShapeSyntaxError`. --- jax/interpreters/masking.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 864b4e74bc6d..6f87a867f5e9 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -114,6 +114,8 @@ def eval_dim_expr(env, poly): class ShapeError(Exception): pass +class ShapeSyntaxError(Exception): pass + # To denote some shape expressions (for annotations) we use a small language. # # data Shape = Shape [Dim] @@ -132,7 +134,7 @@ def parse_spec(spec=''): if not spec: return ShapeExpr(()) if spec[0] == '(': - if spec[-1] != ')': raise SyntaxError(spec) + if spec[-1] != ')': raise ShapeSyntaxError(spec) spec = spec[1:-1] dims = map(parse_dim, spec.replace(' ', '').strip(',').split(',')) return ShapeExpr(dims) @@ -149,7 +151,7 @@ def parse_dim(spec): elif spec in identifiers: return parse_id(spec) else: - raise SyntaxError(spec) + raise ShapeSyntaxError(spec) digits = frozenset(string.digits) identifiers = frozenset(string.ascii_lowercase) From b54f80994b5a2434758584039de3b43e19676941 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 16 Sep 2019 08:45:10 -0700 Subject: [PATCH 0047/1053] Don't issue NaNs for LU decomposition of singular matrices. --- jax/lax_linalg.py | 17 ++++++----------- tests/linalg_test.py | 14 ++++++++------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 32bdd186e532..b7328825005e 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -418,7 +418,7 @@ def _lu_unblocked(a): """Unblocked LU decomposition, as a rolled loop.""" m, n = a.shape def body(k, state): - pivot, perm, a, error = state + pivot, perm, a = state m_idx = np.arange(m) n_idx = np.arange(n) @@ -436,23 +436,21 @@ def body(k, state): # a[k+1:, k] /= a[k, k], adapted for loop-invariant shapes x = a[k, k] - error = error | lax.eq(x, np._constant_like(a, 0)) a = ops.index_update(a, ops.index[:, k], np.where(m_idx > k, a[:, k] / x, a[:, k])) # a[k+1:, k+1:] -= np.outer(a[k+1:, k], a[k, k+1:]) a = a - np.where((m_idx[:, None] > k) & (n_idx > k), np.outer(a[:, k], a[k, :]), np.array(0, dtype=a.dtype)) - return pivot, perm, a, error + return pivot, perm, a pivot = np.zeros((min(m, n),), dtype=np.int32) perm = np.arange(m, dtype=np.int32) - error = np.array(False, np.bool_) if m == 0 and n == 0: # If the array is empty, the loop body never executes but tracing it to a # jaxpr fails because the indexing cannot succeed. - return (pivot, perm, a, error) - return lax.fori_loop(0, min(m, n), body, (pivot, perm, a, error)) + return (pivot, perm, a) + return lax.fori_loop(0, min(m, n), body, (pivot, perm, a)) def _lu_blocked(a, block_size=32): @@ -460,11 +458,9 @@ def _lu_blocked(a, block_size=32): m, n = a.shape r = min(m, n) pivot = np.zeros((r,), dtype=np.int32) - error = np.array(False, np.bool_) for k in range(0, r, block_size): b = min(r - k, block_size) - block_pivot, perm, lu_block, block_error = _lu_unblocked(a[k:, k:k+b]) - error = error | block_error + block_pivot, perm, lu_block = _lu_unblocked(a[k:, k:k+b]) a = ops.index_update(a, ops.index[k:, k:k+b], lu_block) a = ops.index_update(a, ops.index[k:, :k], a[perm + k, :k]) @@ -480,7 +476,6 @@ def _lu_blocked(a, block_size=32): a, ops.index[k+b:, k+b:], -lax.dot(a[k+b:, k:k+b], a[k:k+b, k+b:], precision=lax.Precision.HIGHEST)) - a = np.where(error, lax.full_like(a, np.nan), a) return pivot, a def _lu_python(x): @@ -577,7 +572,7 @@ def _lu_cpu_gpu_translation_rule(getrf_impl, c, operand): lu, pivot, info = getrf_impl(c, operand) # Subtract 1 from the pivot to get 0-based indices. pivot = c.Sub(pivot, c.ConstantS32Scalar(1)) - ok = c.Eq(info, c.ConstantS32Scalar(0)) + ok = c.Ge(info, c.ConstantS32Scalar(0)) lu = _broadcasting_select(c, c.Reshape(ok, None, batch_dims + (1, 1)), lu, _nan_like(c, lu)) return c.Tuple(lu, pivot) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 9520908a79a6..c12a7890dd7e 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -97,6 +97,10 @@ def testDet(self, n, dtype, rng): check_dtypes=True, tol=1e-3) self._CompileAndCheck(np.linalg.det, args_maker, check_dtypes=True) + def testDetOfSingularMatrix(self): + x = np.array([[-1., 3./2], [2./3, -1.]], dtype=onp.float32) + self.assertAllClose(onp.float32(0), jsp.linalg.det(x), check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), @@ -538,12 +542,10 @@ def testLu(self, shape, dtype, rng): self.assertAllClose(x, onp.matmul(p, onp.matmul(l, u)), check_dtypes=True) self._CompileAndCheck(jsp.linalg.lu, args_maker, check_dtypes=True) - # TODO(phawkins): figure out why this test fails on Travis and reenable. - @unittest.skip("Test fails on travis") - def testLuOfSingularMatrixReturnsNans(self): - xs = np.array([[-1., 3./2], [2./3, -1.]]) - lu, _ = jsp.linalg.lu_factor(xs) - self.assertTrue(onp.all(onp.isnan(lu))) + def testLuOfSingularMatrix(self): + x = np.array([[-1., 3./2], [2./3, -1.]], dtype=onp.float32) + p, l, u = jsp.linalg.lu(x) + self.assertAllClose(x, onp.matmul(p, onp.matmul(l, u)), check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": From d30108d7736334be148aa746802e8e2c9c6156c2 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Mon, 16 Sep 2019 20:52:36 +0100 Subject: [PATCH 0048/1053] Added jit to slogdet This resolves the prior merge conflict --- jax/numpy/linalg.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 0a4d1b5d7b66..605e46ba089c 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -68,6 +68,7 @@ def _jvp_slogdet(g, ans, x): @_wraps(onp.linalg.slogdet) @custom_transforms +@jit def slogdet(a): a = _promote_arg_dtypes(np.asarray(a)) dtype = lax.dtype(a) From 3e5f7869eaaeab1691f4b3c843c53f8d19bd0bab Mon Sep 17 00:00:00 2001 From: David Pfau Date: Mon, 16 Sep 2019 21:27:55 +0100 Subject: [PATCH 0049/1053] Fixed prefix for np.linalg.solve --- jax/numpy/linalg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index dc162926d191..7d5388f7aaee 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -62,7 +62,7 @@ def svd(a, full_matrices=True, compute_uv=True): def _jvp_slogdet(g, ans, x): jvp_sign = np.zeros(x.shape[:-2]) - jvp_logdet = np.trace(np.linalg.solve(x, g), axis1=-1, axis2=-2) + jvp_logdet = np.trace(solve(x, g), axis1=-1, axis2=-2) return jvp_sign, jvp_logdet From 45a02f39f0fffc485e843d1ce68b76f52b768793 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 16 Sep 2019 13:57:07 -0700 Subject: [PATCH 0050/1053] Temporarily remove `jit` decorator on gather/scatter ops. --- jax/numpy/lax_numpy.py | 4 +++- jax/ops/scatter.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 1b718f1d724b..64233939af6b 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2407,7 +2407,9 @@ def _rewriting_take(arr, idx): treedef, static_idx, dynamic_idx = _split_index_for_jit(idx) return _gather(arr, treedef, static_idx, dynamic_idx) -@partial(jit, static_argnums=(1, 2)) +# TODO(phawkins): re-enable jit after fixing excessive recompilation for +# slice indexes (e.g., slice(0, 5, None), slice(10, 15, None), etc.). +# @partial(jit, static_argnums=(1, 2)) def _gather(arr, treedef, static_idx, dynamic_idx): idx = _merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx) indexer = _index_to_gather(shape(arr), idx) # shared with _scatter_update diff --git a/jax/ops/scatter.py b/jax/ops/scatter.py index b38a4e02cf25..067ebfed47a4 100644 --- a/jax/ops/scatter.py +++ b/jax/ops/scatter.py @@ -57,7 +57,9 @@ def _scatter_update(x, idx, y, scatter_op): return _scatter_impl(x, y, scatter_op, treedef, static_idx, dynamic_idx) -@partial(jit, static_argnums=(2, 3, 4)) +# TODO(phawkins): re-enable jit after fixing excessive recompilation for +# slice indexes (e.g., slice(0, 5, None), slice(10, 15, None), etc.). +# @partial(jit, static_argnums=(2, 3, 4)) def _scatter_impl(x, y, scatter_op, treedef, static_idx, dynamic_idx): y = lax.convert_element_type(y, lax.dtype(x)) From 0e7ea7e37938b91f6fc833387a929a1faa5ad9a3 Mon Sep 17 00:00:00 2001 From: Nikita Kitaev Date: Mon, 16 Sep 2019 14:30:28 -0700 Subject: [PATCH 0051/1053] Reduce memory usage for argmax (fixes #1330) --- jax/numpy/lax_numpy.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 64233939af6b..eab6f7cc896e 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2232,8 +2232,9 @@ def argmin(a, axis=None): def _argminmax(op, a, axis): shape = [1] * a.ndim shape[axis] = a.shape[axis] - idxs = onp.arange(a.shape[axis]).reshape(shape) + idxs = lax.tie_in(a, arange(a.shape[axis])).reshape(shape) maxval = onp.iinfo(xla_bridge.canonicalize_dtype(idxs.dtype)).max + maxval = lax.tie_in(a, maxval) mask_idxs = where(lax._eq_meet(a, op(a, axis, keepdims=True)), idxs, maxval) return min(mask_idxs, axis) From 13b1bca94fef09b2399b5597d69ca61e0d79b995 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Sep 2019 14:49:31 -0700 Subject: [PATCH 0052/1053] prevent device_put from being staged into jaxprs --- jax/interpreters/xla.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index d695fad0a241..9c9c2261bb67 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -681,8 +681,7 @@ def _device_put_impl(x, device_num=0, backend=None): device_put_p = core.Primitive('device_put') device_put_p.def_impl(_device_put_impl) -device_put_p.def_abstract_eval(lambda x, **kwargs: x) -translations[device_put_p] = lambda c, x, **kwargs: x +pe.custom_partial_eval_rules[device_put_p] = lambda trace, x, **params: x ad.deflinear(device_put_p, lambda cotangent, **kwargs: [cotangent]) From 6662da827591aba302995fb39c66e342cdefbf55 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Sep 2019 15:47:43 -0700 Subject: [PATCH 0053/1053] tweaks to simplify masked jaxprs, rnn test --- jax/interpreters/masking.py | 42 ++++++++++++--- jax/lax/lax.py | 14 +++-- jax/lax/lax_control_flow.py | 11 ++-- tests/masking_test.py | 100 +++++++++++++++++++++++++++++++++--- 4 files changed, 142 insertions(+), 25 deletions(-) diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 63842bd18d1f..a0c84f3723b3 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -98,6 +98,11 @@ def mask_subtrace(master, in_vals, shape_exprs): class ShapeExpr(tuple): # type ShapeExpr = [Poly] def __str__(self): return 'ShapeExpr({})'.format(', '.join(map(str, self))) + def __getitem__(self, idx): + if type(idx) is int: + return super(ShapeExpr, self).__getitem__(idx) + else: + return ShapeExpr(super(ShapeExpr, self).__getitem__(idx)) class Poly(Counter): # type Poly = Map Mon Int -- monomials to coeffs def __mul__(p1, p2): @@ -145,8 +150,25 @@ def eval_shape_expr(env, expr): return tuple(eval_dim_expr(env, poly) for poly in expr) def eval_dim_expr(env, poly): - return sum(coeff * prod([env[id] ** deg for id, deg in mon.items()]) - for mon, coeff in poly.items()) + terms = [mul(coeff, prod([pow(env[id], deg) for id, deg in mon.items()])) + for mon, coeff in poly.items()] + return sum(terms) if len(terms) > 1 else terms[0] + +def pow(x, deg): + try: + deg = int(deg) + except: + return x ** deg + else: + return 1 if deg == 0 else x if deg == 1 else x ** deg + +def mul(coeff, mon): + try: + coeff = int(coeff) + except: + return coeff * mon + else: + return 0 if coeff == 0 else mon if coeff == 1 else coeff * mon def is_constant(poly): try: @@ -162,7 +184,7 @@ class ShapeSyntaxError(Exception): pass # To denote some shape expressions (for annotations) we use a small language. # # data ShapeSpec = ShapeSpec [Dim] -# data Dim = Id Str +# data Dim = Id PyObj # | Lit Int # | Mul Dim Dim # | Add Dim Dim @@ -295,10 +317,10 @@ def vectorized_shape_rule(shape_exprs, **unused_params): shape_expr, = shape_exprs return shape_expr -def vectorized_masking_rule(prim, padded_vals, logical_shapes): +def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): del logical_shapes # Unused. padded_val, = padded_vals - return prim.bind(padded_val) + return prim.bind(padded_val, **params) def defbinop(prim): @@ -307,8 +329,14 @@ def defbinop(prim): def binop_shape_rule(shape_exprs): x_shape_expr, y_shape_expr = shape_exprs - if not x_shape_expr == y_shape_expr: raise ShapeError - return x_shape_expr + if x_shape_expr == y_shape_expr: + return x_shape_expr + elif not x_shape_expr: + return y_shape_expr + elif not y_shape_expr: + return x_shape_expr + else: + raise ShapeError def binop_masking_rule(prim, padded_vals, logical_shapes): del logical_shapes # Unused. diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 6c7dd3cefabe..083a619521f0 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3349,15 +3349,15 @@ def _reduction_computation(c, jaxpr, backend, consts, init_value): out, = xla.jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, (), *args) return subc.Build(out) -def _masking_defreducer(prim, identity_like): +def _masking_defreducer(prim, identity): masking.shape_rules[prim] = _reducer_polymorphic_shape_rule - masking.masking_rules[prim] = partial(_reducer_masking_rule, prim, identity_like) + masking.masking_rules[prim] = partial(_reducer_masking_rule, prim, identity) def _reducer_polymorphic_shape_rule(shape_exprs, axes, **unused_params): shape_expr, = shape_exprs return ShapeExpr([d for i, d in enumerate(shape_expr) if i not in axes]) -def _reducer_masking_rule(prim, identity_like, padded_vals, logical_shapes, +def _reducer_masking_rule(prim, identity, padded_vals, logical_shapes, axes, input_shape): del input_shape # Unused. (padded_val,), (logical_shape,) = padded_vals, logical_shapes @@ -3365,7 +3365,7 @@ def _reducer_masking_rule(prim, identity_like, padded_vals, logical_shapes, masks = [broadcasted_iota(onp.int32, padded_shape, i) < d for i, d in enumerate(logical_shape) if i in axes] mask = _reduce(operator.and_, masks) - masked_val = select(mask, padded_val, identity_like(padded_val)) + masked_val = select(mask, padded_val, identity(padded_shape, padded_val.dtype)) return prim.bind(masked_val, axes=axes, input_shape=padded_shape) reduce_p = standard_reduction_primitive(_reduce_shape_rule, _input_dtype, 'reduce', @@ -3395,7 +3395,8 @@ def _reduce_sum_transpose_rule(cotangent, input_shape, axes): 'reduce_sum', _reduce_sum_translation_rule) ad.deflinear(reduce_sum_p, _reduce_sum_transpose_rule) batching.defreducer(reduce_sum_p) -_masking_defreducer(reduce_sum_p, zeros_like_array) +_masking_defreducer(reduce_sum_p, + lambda shape, dtype: onp.broadcast_to(onp.array(0, dtype), shape)) def _reduce_prod_shape_rule(operand, axes): @@ -4262,6 +4263,9 @@ def conv_transpose_shape_tuple(lhs_shape, rhs_shape, window_strides, padding, def _check_shapelike(fun_name, arg_name, obj): """Check that `obj` is a shape-like value (e.g. tuple of nonnegative ints).""" + if (type(obj) is masking.ShapeExpr + or type(obj) is tuple and any(type(d) is masking.Poly for d in obj)): + return obj if not isinstance(obj, (tuple, list, onp.ndarray)): msg = "{} {} must be of type tuple/list/ndarray, got {}." raise TypeError(msg.format(fun_name, arg_name, type(obj))) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 679762a32e31..7fab7eabb667 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -440,8 +440,9 @@ def scan(f, init, xs): raise ValueError(msg.format([x.shape[0] for x in xs_flat])) carry_avals = tuple(_map(_abstractify, init_flat)) - xs_avals = _map(_abstractify, xs_flat) - x_avals = tuple(ShapedArray(aval.shape[1:], aval.dtype) for aval in xs_avals) + x_shapes = [masking.padded_shape_as_value(x.shape[1:]) for x in xs_flat] + x_dtypes = [x.dtype for x in xs_flat] + x_avals = tuple(_map(ShapedArray, x_shapes, x_dtypes)) jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_tree, carry_avals + x_avals) carry_avals_out, y_avals = split_list(jaxpr.out_avals, [num_carry]) if tuple(carry_avals_out) != carry_avals: @@ -698,10 +699,6 @@ def _scan_batching_rule(args, dims, forward, length, jaxpr, num_consts, def _scan_polymorphic_shape_rule(shape_exprs, forward, length, jaxpr, num_consts, num_carry, linear): const_shexprs, init_shexprs, xs_shexprs = split_list(shape_exprs, [num_consts, num_carry]) - if (any(any(type(d) is Id for d in shexpr) for shexpr in const_shexprs) - or any(any(type(d) is Id for d in shexpr) for shexpr in init_shexprs) - or any(any(type(d) is Id for d in shexpr[1:]) for shexpr in xs_shexprs)): - raise NotImplementedError _, y_avals = split_list(jaxpr.out_avals, [num_carry]) ys_shapes = [ShapeExpr(length, *y_aval.shape) for y_aval in y_avals] return init_shexprs + ys_shapes @@ -750,7 +747,7 @@ def scan_bind(*args, **kwargs): xs_avals = _map(partial(_promote_aval_rank, length), x_avals) assert all(_map(typecheck, consts_avals, consts)) assert all(_map(typecheck, init_avals, init)) - assert all(_map(typecheck, xs_avals, xs)) + # assert all(_map(typecheck, xs_avals, xs)) # check that output carry type matches input carry type carry_avals, _ = split_list(jaxpr.out_avals, [num_carry]) assert all(_map(typematch, init_avals, carry_avals)) diff --git a/tests/masking_test.py b/tests/masking_test.py index 004dd2e61312..e4c6887abfd7 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -25,7 +25,7 @@ from jax import test_util as jtu from jax.interpreters.masking import ShapeError, shape_as_value, parse_spec -from jax import mask, vmap, jit, shapecheck +from jax import mask, vmap, jit, grad, shapecheck from jax import lax import jax.numpy as np @@ -222,6 +222,87 @@ def padded_sum(x): expected = np.array([3, 5]) self.assertAllClose(ans, expected, check_dtypes=False) + def test_rnn(self): + n = 3 + + @partial(mask, in_shapes=['(_, _)', '(t, _)'], out_shape='_') + def rnn(W, xs): + def step(h, x): + new_h = np.dot(W, h) + np.dot(W, x) + return new_h, () + predicted, _ = lax.scan(step, np.zeros(n), xs) + return predicted + + rng = onp.random.RandomState(0) + W = onp.eye(n) + xs = rng.randn(10, n) + ans = rnn([W, xs], dict(t=4)) + expected = xs[:4].sum(0) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_rnn_grad(self): + n = 3 + + @partial(mask, in_shapes=['(_, _)', '(t, _)', '_'], out_shape='') + def rnn(W, xs, target): + def step(h, x): + new_h = np.tanh(np.dot(W, h) + np.dot(W, x)) + return new_h, () + predicted, _ = lax.scan(step, np.zeros(n), xs) + return np.sum((predicted - target)**2) + + rng = onp.random.RandomState(0) + W = rng.randn(n, n) + xs = rng.randn(10, n) + y = rng.randn(n) + + ans = grad(lambda W: rnn([W, xs, y], dict(t=4)))(W) + + def rnn_reference(W, xs, target): + h = np.zeros(n) + for x in xs: + h = np.tanh(np.dot(W, h) + np.dot(W, x)) + predicted = h + return np.sum((predicted - target)**2) + + expected = grad(lambda W: rnn_reference(W, xs[:4], y))(W) + + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_ragged_batched_rnn(self): + n = 3 + + @partial(mask, in_shapes=('(_, _)', '(t, _)', '_'), out_shape='') + def rnn(W, xs, target): + def step(h, x): + new_h = np.tanh(np.dot(W, h) + np.dot(W, x)) + return new_h, () + predicted, _ = lax.scan(step, np.zeros(n), xs) + return np.sum((predicted - target)**2) + + rng = onp.random.RandomState(0) + W = rng.randn(n, n) + seqs = rng.randn(3, 10, n) + ts = np.array([2, 5, 4]) + ys = rng.randn(3, n) + + ans = grad(lambda W: vmap(rnn, ((None, 0, 0), 0))((W, seqs, ys), dict(t=ts)).sum())(W) + + def rnn_reference(W, seqs, targets): + total_loss = 0 + for xs, target in zip(seqs, targets): + h = np.zeros(n) + for x in xs: + h = np.tanh(np.dot(W, h) + np.dot(W, x)) + predicted = h + total_loss = total_loss + np.sum((predicted - target)**2) + return total_loss + + seqs_ = [xs[:t] for xs, t in zip(seqs, ts)] + expected = grad(lambda W: rnn_reference(W, seqs_, ys).sum())(W) + + self.assertAllClose(ans, expected, check_dtypes=False) + def test_nesting(self): raise SkipTest("not yet implemented") @@ -229,12 +310,19 @@ def test_nesting(self): def padded_sum(x): return np.sum(x) - @partial(mask, in_shapes=['n'], out_shape='') - def padded_sum2(x): - return padded_sum([x], dict(n=2)) + batched_sum = vmap(padded_sum) - ans = padded_sum2([np.array([3, 1, 4, 1])], dict(n=1)) - import ipdb; ipdb.set_trace() + @partial(mask, in_shapes=['(m, _)', 'm'], out_shape='') + def fun(x, ns): + return batched_sum([x], dict(n=ns)).sum() + + x = np.array([[3, 1, 4, 1], + [5, 9, 2, 6], + [5, 3, 5, 8]]) + ns = np.array([2, 3, 2]) + ans = fun([x, ns], dict(m=2)) + expected = 3+1 + 5+9+2 + self.assertAllClose(ans, expected, check_dtypes=False) def test_arange(self): raise SkipTest("not yet implemented") From 99b9e48580d62da65f13bf533687c4d337e37902 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Sep 2019 16:30:42 -0700 Subject: [PATCH 0054/1053] python2 fix for ShapeExpr slicing --- jax/interpreters/masking.py | 6 ++++++ jax/lax/lax.py | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index a0c84f3723b3..bebb271a796e 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -57,12 +57,18 @@ def extend_shape_envs(logical_env, padded_env): def shape_as_value(expr): if type(expr) is ShapeExpr: return eval_shape_expr(shape_envs.logical, expr) + elif type(expr) is tuple and any(type(d) is Poly for d in expr): + return tuple(eval_dim_expr(shape_envs.logical, d) if type(d) is Poly else d + for d in expr) else: return expr def padded_shape_as_value(expr): if type(expr) is ShapeExpr: return eval_shape_expr(shape_envs.padded, expr) + elif type(expr) is tuple and any(type(d) is Poly for d in expr): + return tuple(eval_dim_expr(shape_envs.padded, d) if type(d) is Poly else d + for d in expr) else: return expr diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 083a619521f0..713f94f559a5 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -82,7 +82,8 @@ def _canonicalize_shape(shape): A tuple of integers. """ # TODO(mattjj): this next check is a temporary workaround for masking - if type(shape) is ShapeExpr or any(type(d) is masking.Poly for d in shape): + if (type(shape) is ShapeExpr + or type(shape) is tuple and any(type(d) is masking.Poly for d in shape)): return shape try: return tuple(map(operator.index, shape)) From 145b2c3194fb17d5796597dda6b19013822afb89 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 17 Sep 2019 08:34:01 -0700 Subject: [PATCH 0055/1053] bump version number for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index cfb6eaf19be2..567f15afd9b3 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.45" +__version__ = "0.1.46" From dda0c806c18f057fc734a0e6ec800584c334c365 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Tue, 17 Sep 2019 18:55:11 +0100 Subject: [PATCH 0056/1053] Added test case for sloget gradient --- tests/linalg_test.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index c12a7890dd7e..29b6873cdbcd 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -116,6 +116,18 @@ def testSlogdet(self, shape, dtype, rng): self._CheckAgainstNumpy(onp.linalg.slogdet, np.linalg.slogdet, args_maker, check_dtypes=True, tol=1e-3) self._CompileAndCheck(np.linalg.slogdet, args_maker, check_dtypes=True) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng": rng} + for shape in [(1, 1), (4, 4), (5, 5), (50, 50), (2, 7, 7)] + for dtype in float_types + complex_types + for rng in [jtu.rand_default()])) + def testSlogdetGrad(self, shape, dtype, rng): + _skip_if_unsupported_type(dtype) + a = rng(shape, dtype) + jtu.check_grads(np.linalg.slogdet, (a,), 2) def testIssue1213(self): for n in range(5): From 3c18245e64856eb8ffb7b859f8d29246c055a869 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Tue, 17 Sep 2019 18:57:51 +0100 Subject: [PATCH 0057/1053] Removed complex types from slogdet grad test --- tests/linalg_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 29b6873cdbcd..75ddfa20ac78 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -122,7 +122,7 @@ def testSlogdet(self, shape, dtype, rng): "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype, "rng": rng} for shape in [(1, 1), (4, 4), (5, 5), (50, 50), (2, 7, 7)] - for dtype in float_types + complex_types + for dtype in float_types for rng in [jtu.rand_default()])) def testSlogdetGrad(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) From 7a347dede9beba964c15144bc42da6cfe988d18b Mon Sep 17 00:00:00 2001 From: David Pfau Date: Tue, 17 Sep 2019 18:58:34 +0100 Subject: [PATCH 0058/1053] Added TODO to fix slogdet grad for complex types --- jax/numpy/linalg.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 7d5388f7aaee..5fa2d971a05e 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -60,6 +60,7 @@ def svd(a, full_matrices=True, compute_uv=True): return lax_linalg.svd(a, full_matrices, compute_uv) +# TODO(pfau): make this work for complex types def _jvp_slogdet(g, ans, x): jvp_sign = np.zeros(x.shape[:-2]) jvp_logdet = np.trace(solve(x, g), axis1=-1, axis2=-2) From 1e8746ab1f2fb0da55be53475571de09b2ddfb85 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Tue, 17 Sep 2019 19:03:50 +0100 Subject: [PATCH 0059/1053] Shrink largest test in slogdet grad --- tests/linalg_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 75ddfa20ac78..a7c43ef41180 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -121,7 +121,7 @@ def testSlogdet(self, shape, dtype, rng): {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype, "rng": rng} - for shape in [(1, 1), (4, 4), (5, 5), (50, 50), (2, 7, 7)] + for shape in [(1, 1), (4, 4), (5, 5), (25, 25), (2, 7, 7)] for dtype in float_types for rng in [jtu.rand_default()])) def testSlogdetGrad(self, shape, dtype, rng): From f25cfafef00663a2d2cd9d20f5fe1deef92662ab Mon Sep 17 00:00:00 2001 From: David Pfau Date: Wed, 18 Sep 2019 11:05:17 +0100 Subject: [PATCH 0060/1053] Reduced tolerance for slogdet grad test --- tests/linalg_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index a7c43ef41180..de47b444f0f8 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -127,7 +127,7 @@ def testSlogdet(self, shape, dtype, rng): def testSlogdetGrad(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) a = rng(shape, dtype) - jtu.check_grads(np.linalg.slogdet, (a,), 2) + jtu.check_grads(np.linalg.slogdet, (a,), 2, atol=1e-3, rtol=1e-3) def testIssue1213(self): for n in range(5): From fd4c3029d8e42fd1244ccdc075c9571428f4d464 Mon Sep 17 00:00:00 2001 From: David Pfau Date: Wed, 18 Sep 2019 12:28:57 +0100 Subject: [PATCH 0061/1053] Further relaxed the tolerance of slogdet grad test --- tests/linalg_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index de47b444f0f8..faf7f2f21d1d 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -127,7 +127,7 @@ def testSlogdet(self, shape, dtype, rng): def testSlogdetGrad(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) a = rng(shape, dtype) - jtu.check_grads(np.linalg.slogdet, (a,), 2, atol=1e-3, rtol=1e-3) + jtu.check_grads(np.linalg.slogdet, (a,), 2, atol=1e-3, rtol=1e-1) def testIssue1213(self): for n in range(5): From daf5b1cbdedfcd408e86c37d8ac920ddb68534ce Mon Sep 17 00:00:00 2001 From: David Pfau Date: Wed, 18 Sep 2019 13:08:27 +0100 Subject: [PATCH 0062/1053] Relaxed test tolerance even more --- tests/linalg_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index faf7f2f21d1d..111d2e3cbe7f 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -127,7 +127,7 @@ def testSlogdet(self, shape, dtype, rng): def testSlogdetGrad(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) a = rng(shape, dtype) - jtu.check_grads(np.linalg.slogdet, (a,), 2, atol=1e-3, rtol=1e-1) + jtu.check_grads(np.linalg.slogdet, (a,), 2, atol=1e-1, rtol=1e-1) def testIssue1213(self): for n in range(5): From 7f60da95e22f47010bb961d6caa8576c14c3a81b Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 18 Sep 2019 11:39:55 -0700 Subject: [PATCH 0063/1053] Minimal docstring for lax.cond This could be improved further by adding Args/Returns, but this should suffice for most purposes. --- jax/lax/lax_control_flow.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 7fab7eabb667..4558e47d112f 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -277,6 +277,16 @@ def _while_loop_batching_rule(args, dims, cond_nconsts, cond_jaxpr, ### cond def cond(pred, true_operand, true_fun, false_operand, false_fun): + """Conditionally apply ``true_fun`` or ``false_fun``. + + Has equivalent semantics to this Python implementation:: + + def cond(pred, true_operand, true_fun, false_operand, false_fun): + if pred: + return true_fun(true_operand) + else: + return false_fun(false_operand) + """ true_ops, true_tree = tree_flatten((true_operand,)) true_avals = tuple(_map(_abstractify, true_ops)) true_jaxpr, true_consts, out_tree = _initial_style_jaxpr(true_fun, true_tree, true_avals) From b39179c88723742b89ba05e6e789b53bf5737e0f Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 18 Sep 2019 23:55:31 -0700 Subject: [PATCH 0064/1053] better abs jvp --- jax/lax/lax.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 713f94f559a5..147e97c25493 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1636,9 +1636,14 @@ def _conj_transpose_rule(t, x, input_dtype): ad.primitive_transposes[conj_p] = _conj_transpose_rule abs_p = unop(_complex_basetype, _num, 'abs') -ad.defjvp2(abs_p, - lambda g, ans, x: - div(_maybe_real(mul(g, _maybe_conj(x))), _replace_zero(ans))) + +def _abs_jvp_rule(g, ans, x): + if _iscomplex(x): + return _maybe_real(mul(g, div(_maybe_conj(x), + _replace_zero(convert_element_type(ans, _dtype(x)))))) + else: + return select(ge(x, _zero(x)), g, neg(g)) +ad.defjvp2(abs_p, _abs_jvp_rule) _maybe_conj = lambda x: conj(x) if _iscomplex(x) else x _maybe_real = lambda x: real(x) if _iscomplex(x) else x From 942d4e721758b7bfe5ef339a57595ae2e0117497 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 18 Sep 2019 23:55:40 -0700 Subject: [PATCH 0065/1053] restore more stable softplus --- jax/nn/functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index 870581738d48..d035fba5933e 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -28,7 +28,7 @@ # activations def relu(x): return np.maximum(x, 0) -def softplus(x): return np.log1p(np.exp(x)) +def softplus(x): return np.logaddexp(x, 0) def soft_sign(x): return x / (np.abs(x) + 1) def sigmoid(x): return expit(x) def swish(x): return x * sigmoid(x) From 16484ccbed49d1afeb08b3f6311476c19b49b604 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Thu, 19 Sep 2019 15:02:03 -0700 Subject: [PATCH 0066/1053] add a "Citing JAX" section to the README. fixes #1359 --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index f71b07999ca8..5cd57aba43e2 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ open](https://github.com/google/jax) by a growing number of * [How it works](#how-it-works) * [What we're working on](#what-were-working-on) * [Current gotchas](#current-gotchas) +* [Citing JAX](#citing-jax) ## Quickstart: Colab in the Cloud Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: @@ -767,6 +768,30 @@ Some stand-out gotchas that might surprise NumPy users: See [the notebook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb) for much more information. +## Citing JAX + +To cite this repository: + +``` +@software{jax2018github, + author = {James Bradbury and Roy Frostig and Peter Hawkins and Matthew James Johnson and Chris Leary and Dougal Maclaurin and Skye Wanderman-Milne}, + title = {{JAX}: composable transformations of {P}ython+{N}um{P}y programs}, + url = {http://github.com/google/jax}, + version = {0.1.46}, + year = {2018}, +} +``` + +In the above bibtex entry, names are in alphabetical order, the version number +is intended to be that from [jax/version.py](../blob/master/jax/version.py), and +the year corresponds to the project's open-source release. + +A nascent version of JAX, supporting only automatic differentiation and +compilation to XLA, was described in a [paper that appeared at SysML +2018](https://www.sysml.cc/doc/2018/146.pdf). We're currently working on +covering JAX's ideas and capabilities in a more comprehensive and up-to-date +paper. + ## Contributors So far, JAX includes lots of help and [contributions](https://github.com/google/jax/graphs/contributors). In addition to the code contributions reflected on GitHub, JAX has benefitted substantially from the advice of From 6fd938d8a02f066680d9c354b868d76769589b9e Mon Sep 17 00:00:00 2001 From: xysun Date: Fri, 20 Sep 2019 10:25:16 +0100 Subject: [PATCH 0067/1053] no more nested loops of dynamic_update_slice! --- jax/numpy/lax_numpy.py | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index b2fd40a967c0..c7bb1539f305 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1714,12 +1714,11 @@ def _repeat_scalar(a, repeats, axis=None): def repeat(a, repeats, axis=None): ''' :param repeats: int or array of ints - largely same logic as `PyArray_Repeat` in https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/item_selection.c ''' - # use the faster `_repeat_scalar` when possible + # use `_repeat_scalar` when possible if isscalar(repeats): return _repeat_scalar(a, repeats, axis) - repeats_raveled = ravel(repeats) + repeats_raveled = ravel(array(repeats)) # make sure it's jax's array type if size(repeats_raveled) == 1: return _repeat_scalar(a, list(repeats_raveled)[0], axis) @@ -1735,34 +1734,29 @@ def repeat(a, repeats, axis=None): repeats_raveled.shape, n )) - # total elements after repeat along the axis + # calculating the new shape total = sum(repeats_raveled) new_shape = a_shape[:] new_shape[axis] = total - ret = ravel(zeros(new_shape, a.dtype)) a_flattened = ravel(a) - # size of each chunk to copy - chunk = 1 - for i in range(axis+1, ndim(a)): - chunk *= a_shape[i] - - # copy `chunk` until axis - n_outer = 1 - for i in range(0, axis): - n_outer *= a_shape[i] - old_data_ptr = 0 - new_data_ptr = 0 - for i in range(0, n_outer): - for j in range(0, n): - tmp = repeats_raveled[j] - for k in range(0, tmp): - # copy `chunk` data - ret = lax.dynamic_update_slice(ret, lax.dynamic_slice(a_flattened, [old_data_ptr], [chunk]), [new_data_ptr]) - new_data_ptr += chunk - old_data_ptr += chunk + ''' + main algorithm: + first break down raveled input array into list of chunks; each chunk is the unit of repeat + then tile the repeats to have same length as the list of chunks + finally repeat each unit x number of times according to the tiled repeat list + ''' + chunks = product(a_shape[:axis+1]).item() + a_splitted = split(a_flattened, chunks) + repeats_tiled = tile(repeats_raveled, chunks // len(repeats_raveled)) + + ret = array([], dtype=a.dtype) + for i, repeat in enumerate(repeats_tiled): + if not isinstance(repeat, int): + repeat = repeat.item() + ret = concatenate((ret, tile(a_splitted[i], repeat))) return reshape(ret, new_shape) From 5c5560c83b719e9b0b597197a2a62fa5b2f29881 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 20 Sep 2019 07:01:01 -0700 Subject: [PATCH 0068/1053] add JaxprTrace.post_process_map, fixes #1369 --- jax/interpreters/partial_eval.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 69d4ffbd9e88..23493de5aaf5 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -143,6 +143,8 @@ def process_map(self, map_primitive, f, tracers, params): return out_tracers def post_process_call(self, call_primitive, out_tracers, params): + if call_primitive in map_primitives: + return self.post_process_map(call_primitive, out_tracers, params) jaxpr, consts, env = tracers_to_jaxpr([], out_tracers) out_pvs, out_pv_consts = unzip2(t.pval for t in out_tracers) out = out_pv_consts + consts @@ -163,6 +165,31 @@ def todo(x): return out_tracers return out, todo + def post_process_map(self, map_primitive, out_tracers, params): + jaxpr, consts, env = tracers_to_jaxpr([], out_tracers) + out_pvs_reduced, out_pv_consts = unzip2(t.pval for t in out_tracers) + out_pvs = [None if pv is None else _unmapped_aval(params['axis_size'], pv) + for pv in out_pvs_reduced] + out = out_pv_consts + consts + del consts, out_pv_consts + master = self.master + def todo(x): + n = len(jaxpr.outvars) + out_pv_consts, consts = x[:n], x[n:] + trace = JaxprTrace(master, core.cur_sublevel()) + const_tracers = map(trace.new_instantiated_const, consts) + env_tracers = map(trace.full_raise, env) + lifted_jaxpr = closure_convert_jaxpr(jaxpr) + bound_subjaxpr = (lifted_jaxpr, (), env_tracers) + out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) + for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] + eqn = new_jaxpr_eqn(const_tracers, out_tracers, map_primitive, + (bound_subjaxpr,), params) + for t in out_tracers: + t.recipe = eqn + return out_tracers + return out, todo + def _mapped_aval(aval): if aval is core.abstract_unit: return aval From de97ea153f627d517baeda89a6f873877c157133 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 20 Sep 2019 07:01:01 -0700 Subject: [PATCH 0069/1053] add JaxprTrace.post_process_map, fixes #1369 --- jax/interpreters/partial_eval.py | 27 +++++++++++++++++++++++++++ tests/pmap_test.py | 21 +++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 69d4ffbd9e88..23493de5aaf5 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -143,6 +143,8 @@ def process_map(self, map_primitive, f, tracers, params): return out_tracers def post_process_call(self, call_primitive, out_tracers, params): + if call_primitive in map_primitives: + return self.post_process_map(call_primitive, out_tracers, params) jaxpr, consts, env = tracers_to_jaxpr([], out_tracers) out_pvs, out_pv_consts = unzip2(t.pval for t in out_tracers) out = out_pv_consts + consts @@ -163,6 +165,31 @@ def todo(x): return out_tracers return out, todo + def post_process_map(self, map_primitive, out_tracers, params): + jaxpr, consts, env = tracers_to_jaxpr([], out_tracers) + out_pvs_reduced, out_pv_consts = unzip2(t.pval for t in out_tracers) + out_pvs = [None if pv is None else _unmapped_aval(params['axis_size'], pv) + for pv in out_pvs_reduced] + out = out_pv_consts + consts + del consts, out_pv_consts + master = self.master + def todo(x): + n = len(jaxpr.outvars) + out_pv_consts, consts = x[:n], x[n:] + trace = JaxprTrace(master, core.cur_sublevel()) + const_tracers = map(trace.new_instantiated_const, consts) + env_tracers = map(trace.full_raise, env) + lifted_jaxpr = closure_convert_jaxpr(jaxpr) + bound_subjaxpr = (lifted_jaxpr, (), env_tracers) + out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) + for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] + eqn = new_jaxpr_eqn(const_tracers, out_tracers, map_primitive, + (bound_subjaxpr,), params) + for t in out_tracers: + t.recipe = eqn + return out_tracers + return out, todo + def _mapped_aval(aval): if aval is core.abstract_unit: return aval diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 51bab05412ef..83e3ebfcbcdf 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -689,6 +689,27 @@ def testShardedDeviceArrayGetItem(self): z = y[0] # doesn't crash self.assertAllClose(z, 2 * x[0], check_dtypes=False) + def testPostProcessMap(self): + # test came from https://github.com/google/jax/issues/1369 + nrep = xla_bridge.device_count() + + def pmvm(a, b): + a = a.reshape((nrep, -1, a.shape[1])) + func = pmap(lambda z: np.dot(z, b)) + return func(a).reshape(b.shape) + + rng = onp.random.RandomState(0) + a = rng.randn(80, 80) + b = rng.randn(80) + + iters = np.arange(5) + def body(carry, i): + return pmvm(a, carry), i + ans, _ = lax.scan(body, b, iters) + + expected = onp.linalg.matrix_power(a, 5).dot(b) + self.assertAllClose(ans, expected, check_dtypes=False) + class PmapWithDevicesTest(jtu.JaxTestCase): From 36b5af517e4dafcd1158152bb2829d74f4e4759c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 20 Sep 2019 15:35:43 -0700 Subject: [PATCH 0070/1053] don't over-instantiate literals, fixes #1361 Co-authored-by: Dougal Maclaurin --- jax/interpreters/partial_eval.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 69d4ffbd9e88..364fdb7cb0aa 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -36,19 +36,16 @@ def identity(x): return x # A partial value (pval) is modeled as a pair (pv, const), as per # type PVal = (PV, Const) -# data PV = NonePV | AbstractPV AbstractValue +# data PV = Known | Unknown AbstractValue # type Const = MaybeTraced JaxType -# where the NonePV arm indicates a known (constant) value, the AbstractPV arm -# indicates an unknown value. +# where the Known arm indicates a known (constant) value (represented by a None +# payload, and the Unknown arm indicates an unknown value. # Additionally, when the pv is an AbstractValue, then the const must be unit. class JaxprTrace(Trace): def pure(self, val): - if type(val) in core.literalable_types and onp.shape(val) == (): - return JaxprTracer(self, PartialVal((None, val)), Literal(val)) - else: - return self.new_const(val) + return self.new_const(val) def lift(self, val): return self.new_const(val) @@ -76,8 +73,8 @@ def instantiate_const(self, tracer): if isinstance(pv, AbstractValue): return tracer elif pv is None: - if type(tracer.recipe) is Literal: - return self.new_instantiated_literal(tracer.recipe.val) + if type(const) in core.literalable_types and onp.shape(const) == (): + return self.new_instantiated_literal(const) else: return self.new_instantiated_const(const) else: @@ -392,8 +389,7 @@ def tracers_to_jaxpr(in_tracers, out_tracers): env_vars, env_vals = unzip2(env.items()) const_vars, const_vals = unzip2(consts.items()) jaxpr = Jaxpr(const_vars, env_vars, invars, list(map(var, out_tracers)), eqns) - # core.skip_checks or core.check_jaxpr(jaxpr) - core.check_jaxpr(jaxpr) + core.skip_checks or core.check_jaxpr(jaxpr) return jaxpr, const_vals, env_vals From fafe94fa545c7c2f51aba19d53940e0dcd835c74 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 20 Sep 2019 15:42:05 -0700 Subject: [PATCH 0071/1053] add test for #1361 --- tests/lax_control_flow_test.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 342096e6ad00..20b68317bdc4 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -981,6 +981,17 @@ def f(carry, _): key = random.PRNGKey(0) api.grad(lambda c: lax.scan(f, (c, key), onp.ones(3))[0][0])(0.) # doesn't crash + def testIssue1361(self): + @api.jit + def jit_run_scan(x): + def fun(carry, _): + x, _ = carry + return (2 * x, 0.), None + (x, _), _ = lax.scan(fun, (x, 0.), np.arange(3)) + return x + + api.grad(lambda x: jit_run_scan(x))(0.) # doesn't crash + if __name__ == '__main__': absltest.main() From 1a14772e17e9592600e9d6b73fd6be6d4e2c1609 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 20 Sep 2019 15:48:39 -0700 Subject: [PATCH 0072/1053] comment typo fixes --- jax/interpreters/partial_eval.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 364fdb7cb0aa..c9a159b520cc 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -38,9 +38,10 @@ def identity(x): return x # type PVal = (PV, Const) # data PV = Known | Unknown AbstractValue # type Const = MaybeTraced JaxType -# where the Known arm indicates a known (constant) value (represented by a None -# payload, and the Unknown arm indicates an unknown value. -# Additionally, when the pv is an AbstractValue, then the const must be unit. +# where the Known arm, represented by a None, indicates a known (constant) value +# and the Unknown arm, represented by an AbstractValue instance, indicates an +# unknown value. +# When the pv is an AbstractValue, then the const must be unit. class JaxprTrace(Trace): From 17e5783e5f0fb58c12194cf0e556abb7f1ac438d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 20 Sep 2019 20:45:01 -0700 Subject: [PATCH 0073/1053] fix import problems --- tests/linalg_test.py | 6 ++++-- tests/pmap_test.py | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 111d2e3cbe7f..18f3688dff00 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -109,6 +109,7 @@ def testDetOfSingularMatrix(self): (2, 2, 2), (2, 3, 3), (3, 2, 2)] for dtype in float_types + complex_types for rng in [jtu.rand_default()])) + @jtu.skip_on_devices("tpu") def testSlogdet(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) args_maker = lambda: [rng(shape, dtype)] @@ -116,14 +117,15 @@ def testSlogdet(self, shape, dtype, rng): self._CheckAgainstNumpy(onp.linalg.slogdet, np.linalg.slogdet, args_maker, check_dtypes=True, tol=1e-3) self._CompileAndCheck(np.linalg.slogdet, args_maker, check_dtypes=True) - + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype, "rng": rng} - for shape in [(1, 1), (4, 4), (5, 5), (25, 25), (2, 7, 7)] + for shape in [(1, 1), (4, 4), (5, 5), (2, 7, 7)] for dtype in float_types for rng in [jtu.rand_default()])) + @jtu.skip_on_devices("tpu") def testSlogdetGrad(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) a = rng(shape, dtype) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 83e3ebfcbcdf..e1e3d5c88cb0 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -690,6 +690,10 @@ def testShardedDeviceArrayGetItem(self): self.assertAllClose(z, 2 * x[0], check_dtypes=False) def testPostProcessMap(self): + # TODO(mattjj): this fails with multiple devices (unless we add a jit) + # because we assume eager ops (like scan here) can't require more than 1 + # replica. + raise SkipTest("need eager multi-replica support") # test came from https://github.com/google/jax/issues/1369 nrep = xla_bridge.device_count() @@ -698,9 +702,10 @@ def pmvm(a, b): func = pmap(lambda z: np.dot(z, b)) return func(a).reshape(b.shape) + n = nrep * 2 rng = onp.random.RandomState(0) - a = rng.randn(80, 80) - b = rng.randn(80) + a = rng.randn(n, n) + b = rng.randn(n) iters = np.arange(5) def body(carry, i): From 9ef53120d2caf73530d1db0ef4db95baa91b9abb Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Sat, 21 Sep 2019 01:04:26 -0400 Subject: [PATCH 0074/1053] add regression tests --- tests/nn_test.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/nn_test.py diff --git a/tests/nn_test.py b/tests/nn_test.py new file mode 100644 index 000000000000..95cb71ba37ae --- /dev/null +++ b/tests/nn_test.py @@ -0,0 +1,38 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for nn module.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +from absl.testing import parameterized + +import numpy as onp + +from jax import test_util as jtu +from jax.test_util import check_grads +from jax import nn +from jax import random + +from jax.config import config +config.parse_flags_with_absl() + +class NNTest(jtu.JaxTestCase): + def testSoftplusGrad(self): + check_grads(nn.softplus, (1e-8,), 4) + def testSoftplusValue(self): + val = nn.softplus(89.) + self.assertEqual(val, 89.) From 12de81456bf8a41853033b53fbd3bafccc4d9425 Mon Sep 17 00:00:00 2001 From: Helw150 Date: Thu, 14 Mar 2019 14:47:41 +0400 Subject: [PATCH 0075/1053] Simplify nanmean with logical not --- jax/numpy/lax_numpy.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index d7bbf2f0bd7f..bbb990e4553e 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1228,6 +1228,26 @@ def nan_reduction(a, axis=None, out=None, keepdims=False, **kwargs): nansum = _make_nan_reduction(onp.nansum, sum, 0, nan_if_all_nan=False) nanprod = _make_nan_reduction(onp.nanprod, prod, 1, nan_if_all_nan=False) +<<<<<<< HEAD +======= +@_wraps(onp.nanmean) +def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): + if out is not None: + raise ValueError("nanmean does not support the `out` argument.") + # Check and Count all non-NaN values + nan_mask = logical_not(isnan(a)) + normalizer = sum(nan_mask, axis=axis, dtype=int32, keepdims=keepdims) + normalizer = lax.convert_element_type(normalizer, dtype) + #Perform mean calculation + if dtype is None: + if (onp.issubdtype(lax._dtype(a), onp.bool_) or + onp.issubdtype(lax._dtype(a), onp.integer)): + dtype = xla_bridge.canonicalize_dtype(onp.float64) + else: + dtype = lax._dtype(a) + td = true_divide(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) + return lax.convert_element_type(td, dtype) +>>>>>>> 7c6f468... Simplify nanmean with logical not def _make_cumulative_reduction(onp_reduction, window_reduce, init_val, squash_nan=False): From 949e1ddf43c9971d9e37ef8df038c56c50364d27 Mon Sep 17 00:00:00 2001 From: Helw150 Date: Sat, 21 Sep 2019 01:24:48 -0700 Subject: [PATCH 0076/1053] Weird Cherry Pick Remnant --- jax/numpy/lax_numpy.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index bbb990e4553e..094829877e92 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1228,8 +1228,6 @@ def nan_reduction(a, axis=None, out=None, keepdims=False, **kwargs): nansum = _make_nan_reduction(onp.nansum, sum, 0, nan_if_all_nan=False) nanprod = _make_nan_reduction(onp.nanprod, prod, 1, nan_if_all_nan=False) -<<<<<<< HEAD -======= @_wraps(onp.nanmean) def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): if out is not None: @@ -1247,7 +1245,6 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): dtype = lax._dtype(a) td = true_divide(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) return lax.convert_element_type(td, dtype) ->>>>>>> 7c6f468... Simplify nanmean with logical not def _make_cumulative_reduction(onp_reduction, window_reduce, init_val, squash_nan=False): From fa0a684af6a251f96d79dce8beb26a9a436d4cf9 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Sat, 21 Sep 2019 10:11:53 -0400 Subject: [PATCH 0077/1053] address comments --- tests/nn_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/nn_test.py b/tests/nn_test.py index 95cb71ba37ae..0dfeed05d9d4 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -1,4 +1,4 @@ -# Copyright 2018 Google LLC +# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -35,4 +35,4 @@ def testSoftplusGrad(self): check_grads(nn.softplus, (1e-8,), 4) def testSoftplusValue(self): val = nn.softplus(89.) - self.assertEqual(val, 89.) + self.assertAllClose(val, 89.) From 58ed2e31d898c2c64e778c2378e576d97799cf76 Mon Sep 17 00:00:00 2001 From: Roman Novak <44512421+romanngg@users.noreply.github.com> Date: Sun, 22 Sep 2019 15:32:12 -0700 Subject: [PATCH 0078/1053] Make `assertAllClose` work with non-array types. In our application this would make comparing trees with other entries like Nones and enums easier. I may be missing some other issues though, let me know if this change makes sense! --- jax/test_util.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jax/test_util.py b/jax/test_util.py index b4f0911bdb27..9d3865bd322a 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -516,6 +516,8 @@ def assertAllClose(self, x, y, check_dtypes, atol=None, rtol=None): x = onp.asarray(x) y = onp.asarray(y) self.assertArraysAllClose(x, y, check_dtypes, atol=atol, rtol=rtol) + elif x == y: + return else: raise TypeError((type(x), type(y))) From c312729d62d0c4fd9177c231802e97b7842f49e0 Mon Sep 17 00:00:00 2001 From: Helw150 Date: Sun, 22 Sep 2019 21:38:34 -0700 Subject: [PATCH 0079/1053] Refactor and Test based on comments from old PR --- jax/numpy/lax_numpy.py | 11 +++++------ jax/test_util.py | 25 +++++++++++++++++++++++++ tests/lax_numpy_test.py | 3 +++ 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 094829877e92..500295697f3a 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1232,17 +1232,16 @@ def nan_reduction(a, axis=None, out=None, keepdims=False, **kwargs): def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): if out is not None: raise ValueError("nanmean does not support the `out` argument.") + if (onp.issubdtype(lax._dtype(a), onp.bool_) or + onp.issubdtype(lax._dtype(a), onp.integer)): + return mean(a, axis, dtype, out, keepdims) # Check and Count all non-NaN values nan_mask = logical_not(isnan(a)) normalizer = sum(nan_mask, axis=axis, dtype=int32, keepdims=keepdims) normalizer = lax.convert_element_type(normalizer, dtype) - #Perform mean calculation if dtype is None: - if (onp.issubdtype(lax._dtype(a), onp.bool_) or - onp.issubdtype(lax._dtype(a), onp.integer)): - dtype = xla_bridge.canonicalize_dtype(onp.float64) - else: - dtype = lax._dtype(a) + dtype = lax._dtype(a) + #Perform mean calculation td = true_divide(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) return lax.convert_element_type(td, dtype) diff --git a/jax/test_util.py b/jax/test_util.py index b4f0911bdb27..a96db9dd6f9e 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -373,6 +373,31 @@ def rand(shape, dtype): return rand +def rand_some_nan(): + """Return a random sampler that produces nans in floating types.""" + rng = npr.RandomState(1) + base_rand = rand_default() + + def rand(shape, dtype): + """The random sampler function.""" + if not onp.issubdtype(dtype, onp.floating): + # only float types have inf + return base_rand(shape, dtype) + + if onp.issubdtype(dtype, onp.complexfloating): + base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype + return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) + + dims = _dims_of_shape(shape) + nan_flips = rng.rand(*dims) < 0.1 + + vals = base_rand(shape, dtype) + vals = onp.where(nan_flips, onp.nan, vals) + + return _cast_to_shape(onp.asarray(vals, dtype=dtype), shape, dtype) + + return rand + def rand_some_inf_and_nan(): """Return a random sampler that produces infinities in floating types.""" rng = npr.RandomState(1) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index a801cd2aaf36..32ea9f8fc1fb 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -189,6 +189,9 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("sum", 1, number_dtypes, all_shapes, jtu.rand_default(), []), op_record("var", 1, number_dtypes, nonempty_shapes, jtu.rand_default(), []), op_record("std", 1, inexact_dtypes, nonempty_shapes, jtu.rand_default(), []), + op_record("nanmean", 1, number_dtypes, nonempty_shapes, jtu.rand_some_nan(), []), + op_record("nanprod", 1, number_dtypes, all_shapes, jtu.rand_some_nan(), []), + op_record("nansum", 1, number_dtypes, all_shapes, jtu.rand_some_nan(), []), ] JAX_REDUCER_NO_DTYPE_RECORDS = [ From 3d21393d0ca87f7058c82ea1b8a77a4e4ac436e1 Mon Sep 17 00:00:00 2001 From: Helw150 Date: Mon, 23 Sep 2019 08:53:49 -0700 Subject: [PATCH 0080/1053] PR Response Changes --- jax/numpy/lax_numpy.py | 10 ++++------ jax/test_util.py | 16 ++++++++-------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 500295697f3a..a5f174973bba 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1235,15 +1235,13 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): if (onp.issubdtype(lax._dtype(a), onp.bool_) or onp.issubdtype(lax._dtype(a), onp.integer)): return mean(a, axis, dtype, out, keepdims) - # Check and Count all non-NaN values + if dtype is None: + dtype = lax._dtype(a) nan_mask = logical_not(isnan(a)) normalizer = sum(nan_mask, axis=axis, dtype=int32, keepdims=keepdims) normalizer = lax.convert_element_type(normalizer, dtype) - if dtype is None: - dtype = lax._dtype(a) - #Perform mean calculation - td = true_divide(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) - return lax.convert_element_type(td, dtype) + td = lax.divide(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) + return td def _make_cumulative_reduction(onp_reduction, window_reduce, init_val, squash_nan=False): diff --git a/jax/test_util.py b/jax/test_util.py index a96db9dd6f9e..274fcbba51f0 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -380,14 +380,14 @@ def rand_some_nan(): def rand(shape, dtype): """The random sampler function.""" - if not onp.issubdtype(dtype, onp.floating): - # only float types have inf - return base_rand(shape, dtype) - if onp.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) + if not onp.issubdtype(dtype, onp.floating): + # only float types have inf + return base_rand(shape, dtype) + dims = _dims_of_shape(shape) nan_flips = rng.rand(*dims) < 0.1 @@ -405,14 +405,14 @@ def rand_some_inf_and_nan(): def rand(shape, dtype): """The random sampler function.""" - if not onp.issubdtype(dtype, onp.floating): - # only float types have inf - return base_rand(shape, dtype) - if onp.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) + if not onp.issubdtype(dtype, onp.floating): + # only float types have inf + return base_rand(shape, dtype) + dims = _dims_of_shape(shape) posinf_flips = rng.rand(*dims) < 0.1 neginf_flips = rng.rand(*dims) < 0.1 From 92c42ea1fe5b74b52179b2969dd7aea9e769beac Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 23 Sep 2019 12:46:15 -0400 Subject: [PATCH 0081/1053] Use square(x) instead of pow(x, 2) in div JVP. --- jax/lax/lax.py | 2 +- tests/linalg_test.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 713f94f559a5..a0318eed9e41 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1720,7 +1720,7 @@ def _div_transpose_rule(cotangent, x, y): div_p = standard_binop([_num, _num], 'div') ad.defjvp(div_p, lambda g, x, y: div(_brcast(g, y), y), - lambda g, x, y: div(mul(neg(_brcast(g, x)), x), pow(y, _two(y)))) + lambda g, x, y: div(mul(neg(_brcast(g, x)), x), square(y))) ad.primitive_transposes[div_p] = _div_transpose_rule rem_p = standard_binop([_num, _num], 'rem') diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 18f3688dff00..5762f412051e 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -538,6 +538,20 @@ def testIssue1151(self): jac0 = jax.jacobian(np.linalg.solve, argnums=0)(A[0], b[0]) jac1 = jax.jacobian(np.linalg.solve, argnums=1)(A[0], b[0]) + def testIssue1383(self): + seed = jax.random.PRNGKey(0) + tmp = jax.random.uniform(seed, (2,2)) + a = np.dot(tmp, tmp.T) + + def f(inp): + val, vec = np.linalg.eigh(inp) + return np.dot(np.dot(vec, inp), vec.T) + + grad_func = jax.jacfwd(f) + hess_func = jax.jacfwd(grad_func) + cube_func = jax.jacfwd(hess_func) + self.assertFalse(onp.any(onp.isnan(cube_func(a)))) + class ScipyLinalgTest(jtu.JaxTestCase): From 03fb88e49e7e0349a294dbb3fd20933fce3edc67 Mon Sep 17 00:00:00 2001 From: Helw150 Date: Mon, 23 Sep 2019 10:04:31 -0700 Subject: [PATCH 0082/1053] TODOs and wrong name --- jax/numpy/lax_numpy.py | 2 +- jax/test_util.py | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index a5f174973bba..228f4413295d 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1240,7 +1240,7 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): nan_mask = logical_not(isnan(a)) normalizer = sum(nan_mask, axis=axis, dtype=int32, keepdims=keepdims) normalizer = lax.convert_element_type(normalizer, dtype) - td = lax.divide(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) + td = lax.div(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) return td def _make_cumulative_reduction(onp_reduction, window_reduce, init_val, diff --git a/jax/test_util.py b/jax/test_util.py index 274fcbba51f0..23a549354c2c 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -351,6 +351,10 @@ def rand_some_inf(): rng = npr.RandomState(1) base_rand = rand_default() + """ + TODO: Complex numbers are not correctly tested + If blocks should be switched in order, and relevant tests should be fixed + """ def rand(shape, dtype): """The random sampler function.""" if not onp.issubdtype(dtype, onp.floating): @@ -403,16 +407,20 @@ def rand_some_inf_and_nan(): rng = npr.RandomState(1) base_rand = rand_default() + """ + TODO: Complex numbers are not correctly tested + If blocks should be switched in order, and relevant tests should be fixed + """ def rand(shape, dtype): """The random sampler function.""" - if onp.issubdtype(dtype, onp.complexfloating): - base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype - return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) - if not onp.issubdtype(dtype, onp.floating): # only float types have inf return base_rand(shape, dtype) + if onp.issubdtype(dtype, onp.complexfloating): + base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype + return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) + dims = _dims_of_shape(shape) posinf_flips = rng.rand(*dims) < 0.1 neginf_flips = rng.rand(*dims) < 0.1 From d1c66614e81e88d548b6651dc3895029d805d073 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Mon, 23 Sep 2019 13:35:52 -0700 Subject: [PATCH 0083/1053] add a "last" symbol for vmap axis specs, use it in `api.jacfwd`. tests and fixes #1372 Co-authored-by: Matthew Johnson --- jax/api.py | 4 +--- jax/interpreters/batching.py | 7 +++++++ tests/api_test.py | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index 403d7dd50fe6..1afee94891ac 100644 --- a/jax/api.py +++ b/jax/api.py @@ -448,7 +448,7 @@ def jacfun(*args, **kwargs): f_partial, dyn_args = _argnums_partial(f, argnums, args) holomorphic or tree_map(_check_real_input_jacfwd, dyn_args) pushfwd = partial(jvp, f_partial, dyn_args) - y, jac = vmap(pushfwd, out_axes=(None, -1))(_std_basis(dyn_args)) + y, jac = vmap(pushfwd, out_axes=(None, batching.last))(_std_basis(dyn_args)) example_args = dyn_args[0] if isinstance(argnums, int) else dyn_args return tree_map(partial(_unravel_array_into_pytree, example_args, -1), jac) @@ -617,12 +617,10 @@ def _flatten_axes(treedef, axis_tree): dummy = tree_unflatten(treedef, [object()] * treedef.num_leaves) axes = [] add_leaves = lambda i, x: axes.extend([i] * len(tree_flatten(x)[0])) - # TODO(mattjj): remove _replace_nones / list comp after jaxlib 0.1.25 tree_multimap(add_leaves, _replace_nones(axis_tree), dummy) axes = [None if a is _none_proxy else a for a in axes] return axes -# TODO(mattjj): remove this when jaxlib is updated past 0.1.25 def _replace_nones(tuptree): if type(tuptree) in (list, tuple): return tuple(map(_replace_nones, tuptree)) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 01fcdb7d3337..d2848bfe6cab 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -241,9 +241,14 @@ def zeros_like_batched(batched_args, batch_dims): # almost works, except for broadcast, for which raw numpy.ndarrays don't have a # method. To handle that case, the `broadcast` function uses a try/except. +class _Last(object): pass +last = _Last() + def broadcast(x, sz, axis): if core.get_aval(x) is core.abstract_unit: return core.unit + if axis is last: + axis = onp.ndim(x) shape = list(onp.shape(x)) shape.insert(axis, sz) if isinstance(x, onp.ndarray) or onp.isscalar(x): @@ -267,6 +272,8 @@ def matchaxis(sz, src, dst, x): return x elif type(src) == type(dst) == int: return moveaxis(x, src, dst) + elif type(src) == int and dst is last: + return moveaxis(x, src, -1) elif src is not_mapped and dst is not not_mapped: return broadcast(x, sz, dst) else: diff --git a/tests/api_test.py b/tests/api_test.py index fb19708a9aa3..2d67bb9ea699 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -357,6 +357,41 @@ def test_hessian_on_pytrees(self): (onp.array([0., 0.]), onp.array([0., 2.]))) self.assertAllClose(ans, expected, check_dtypes=False) + @jtu.skip_on_devices("tpu") + def test_issue1372(self): + def quad(x): + return np.dot(x, x) + + def f(x, u): + return quad(x) + quad(u) + + x, u = np.ones(5), np.ones(2) + + rev = jacrev + fwd = jacfwd + + # Diagonal entries + self.assertEqual(rev(rev(f, 0), 0)(x, u).shape, (5, 5)) + self.assertEqual(rev(fwd(f, 0), 0)(x, u).shape, (5, 5)) + self.assertEqual(fwd(rev(f, 0), 0)(x, u).shape, (5, 5)) + self.assertEqual(fwd(fwd(f, 0), 0)(x, u).shape, (5, 5)) + self.assertEqual(rev(rev(f, 1), 1)(x, u).shape, (2, 2)) + self.assertEqual(rev(fwd(f, 1), 1)(x, u).shape, (2, 2)) + self.assertEqual(fwd(rev(f, 1), 1)(x, u).shape, (2, 2)) + self.assertEqual(fwd(fwd(f, 1), 1)(x, u).shape, (2, 2)) + + # Off-diagonal entries by reverse-mode on the outside + self.assertEqual(rev(rev(f, 1), 0)(x, u).shape, (2, 5)) + self.assertEqual(rev(fwd(f, 1), 0)(x, u).shape, (2, 5)) + self.assertEqual(rev(rev(f, 0), 1)(x, u).shape, (5, 2)) + self.assertEqual(rev(fwd(f, 0), 1)(x, u).shape, (5, 2)) + + # Off-diagonal entries by forward-mode on the outside + self.assertEqual(fwd(rev(f, 1), 0)(x, u).shape, (2, 5)) + self.assertEqual(fwd(fwd(f, 1), 0)(x, u).shape, (2, 5)) + self.assertEqual(fwd(rev(f, 0), 1)(x, u).shape, (5, 2)) + self.assertEqual(fwd(fwd(f, 0), 1)(x, u).shape, (5, 2)) + def test_disable_jit(self): effects = [] From b70a7800d75ec9384eb564ec33e4ef71c3eebd34 Mon Sep 17 00:00:00 2001 From: Alex Eftimiades Date: Mon, 23 Sep 2019 16:15:41 -0400 Subject: [PATCH 0084/1053] multivariate normal support --- jax/random.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/jax/random.py b/jax/random.py index 97e43eb87722..e030b4c67443 100644 --- a/jax/random.py +++ b/jax/random.py @@ -418,6 +418,15 @@ def _normal(key, shape, dtype): return onp.array(onp.sqrt(2), dtype) * lax.erf_inv(u) +def multivariate_normal(key, shape=(), dtype=onp.float64, mean=0.0, cov=1.0): + return _multivariate_normal(key, shape, dtype) * cov + mean + +@partial(jit, static_argnums=(1, 2)) +def _multivariate_normal(key, shape, dtype, mean, cov): + _check_shape("multivariate_normal", shape) + return normal(key, shape, dtype) * cov + mean + + def truncated_normal(key, lower, upper, shape=(), dtype=onp.float64): """Sample truncated standard normal random values with given shape and dtype. From f9b9146a92617b825d119ed14706fe182cd483a0 Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Tue, 24 Sep 2019 19:20:12 +0200 Subject: [PATCH 0085/1053] Ensure lax.scatter cache hits in op-by-op mode --- jax/lax/lax.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index a0318eed9e41..19106506163e 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -785,6 +785,9 @@ def scatter_max(operand, scatter_indices, updates, dimension_numbers): update_consts=consts, dimension_numbers=dimension_numbers, updates_shape=updates.shape) +# Define this outside of scatter to ensure cache hits. +_scatter_reduction_computation = lambda x, y: y + def scatter(operand, scatter_indices, updates, dimension_numbers): """Scatter-update operator. @@ -809,7 +812,8 @@ def scatter(operand, scatter_indices, updates, dimension_numbers): Returns: An array containing the sum of `operand` and the scattered updates. """ - jaxpr, consts = _reduction_jaxpr(lambda x, y: y, _abstractify(_const(operand, 0))) + jaxpr, consts = _reduction_jaxpr(_scatter_reduction_computation, + _abstractify(_const(operand, 0))) return scatter_p.bind( operand, scatter_indices, updates, update_jaxpr=jaxpr, update_consts=consts, dimension_numbers=dimension_numbers, From f62b9d5cc7964df1dc8e0b9f998adb6b01de727e Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 24 Sep 2019 18:23:09 -0700 Subject: [PATCH 0086/1053] Disable eigh test on TPU. --- tests/linalg_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 5762f412051e..461458e1efe3 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -538,6 +538,7 @@ def testIssue1151(self): jac0 = jax.jacobian(np.linalg.solve, argnums=0)(A[0], b[0]) jac1 = jax.jacobian(np.linalg.solve, argnums=1)(A[0], b[0]) + @jtu.skip_on_devices("tpu") # TODO(phawkins): No eigh implementation on TPU. def testIssue1383(self): seed = jax.random.PRNGKey(0) tmp = jax.random.uniform(seed, (2,2)) From 298d838be151538e03ea175f2d5cd382f08c5b01 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 23 Sep 2019 14:55:11 -0700 Subject: [PATCH 0087/1053] Update error message for eigh. --- jax/lax_linalg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index b7328825005e..853a5a04c5dd 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -212,7 +212,7 @@ def eigh_impl(operand, lower): def eigh_translation_rule(c, operand, lower): raise NotImplementedError( - "Symmetric eigendecomposition is only implemented on the CPU backend") + "Symmetric eigendecomposition is only implemented on the CPU and GPU backends") def eigh_abstract_eval(operand, lower): if isinstance(operand, ShapedArray): From ad03bafb9b611f1b38baa7c34801c60700d99d90 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 6 Sep 2019 11:45:47 -0700 Subject: [PATCH 0088/1053] Change `jit` to take Device object instead of device ordinal. This also changes the name of the argument to `device` from `device_assignment`. --- jax/api.py | 14 ++++++-------- jax/interpreters/pxla.py | 4 ++-- jax/interpreters/xla.py | 18 +++++++++--------- jax/lib/__init__.py | 2 +- jax/lib/xla_bridge.py | 8 -------- tests/api_test.py | 9 ++++----- 6 files changed, 22 insertions(+), 33 deletions(-) diff --git a/jax/api.py b/jax/api.py index 1afee94891ac..9b8756eb3536 100644 --- a/jax/api.py +++ b/jax/api.py @@ -82,7 +82,7 @@ def __init__(self): _thread_local_state = _ThreadLocalState() -def jit(fun, static_argnums=(), device_assignment=None, backend=None): +def jit(fun, static_argnums=(), device=None, backend=None): """Sets up `fun` for just-in-time compilation with XLA. Args: @@ -100,10 +100,10 @@ def jit(fun, static_argnums=(), device_assignment=None, backend=None): different values for these constants will trigger recompilation. If the jitted function is called with fewer positional arguments than indicated by `static_argnums` then an error is raised. Defaults to (). - device_assignment: This is an experimental feature and the API is likely to - change. Optional, an int specifying the device ordinal for which to compile the - function. The default is inherited from XLA's DeviceAssignment logic and is - usually to use device 0. + device: This is an experimental feature and the API is likely to change. + Optional, the Device the jitted function will run on. (Available devices + can be retrieved via ``jax.devices()``.) The default is inherited from + XLA's DeviceAssignment logic and is usually to use ``jax.devices()[0]``. backend: This is an experimental feature and the API is likely to change. Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. @@ -124,8 +124,6 @@ def jit(fun, static_argnums=(), device_assignment=None, backend=None): -0.8574326 -0.7823267 0.7682731 0.59566754] """ _check_callable(fun) - if isinstance(device_assignment, int): - device_assignment = (device_assignment,) if isinstance(static_argnums, int): static_argnums = (static_argnums,) @@ -146,7 +144,7 @@ def f_jitted(*args, **kwargs): args_flat, in_tree = tree_flatten((dyn_args, kwargs)) _check_args(args_flat) flat_fun, out_tree = flatten_fun(f, in_tree) - out = xla.xla_call(flat_fun, *args_flat, device_assignment=device_assignment, backend=backend) + out = xla.xla_call(flat_fun, *args_flat, device=device, backend=backend) return tree_unflatten(out_tree(), out) jitted_name = "jit({}, static_argnums={})" diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 72e6bf4c0042..0bf94e4caae3 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -70,7 +70,7 @@ def shard_args(backend, device_ordinals, assignments, axis_size, args): if type(arg) is ShardedDeviceArray: if nrep == len(arg.device_buffers): for r, buf in enumerate(arg.device_buffers): - buffers[r][a] = (buf if xb.device_ordinal(buf) == device_ordinals[r] + buffers[r][a] = (buf if buf.device_ordinal() == device_ordinals[r] else buf.copy_to_device(device_ordinals[r])) else: for r, buf in enumerate(arg.device_buffers): @@ -382,7 +382,7 @@ def __getitem__(self, idx): def _shard_sharded_device_array(x, ordinals, assignments): n = len(ordinals) if n == len(x.device_buffers): - return (b if xb.device_ordinal(b) == ordinals[r] else b.copy_to_device(ordinals[r]) + return (b if b.device_ordinal() == ordinals[r] else b.copy_to_device(ordinals[r]) for r, b in enumerate(x.device_buffers)) else: return (xla.device_put(x[assignments[r]], ordinals[r]) for r in range(n)) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 9c9c2261bb67..ad3621edc622 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -193,13 +193,14 @@ def _check_nans(name, xla_shape, buf): ### compiling jaxprs -def compile_jaxpr(jaxpr, device_assignment, backend, axis_env, const_vals, *abstract_args): +def compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, *abstract_args): if axis_env.nreps > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") raise ValueError(msg.format(axis_env.nreps, xb.device_count(backend))) arg_shapes = tuple(map(aval_to_xla_shape, abstract_args)) built_c = jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), *arg_shapes) + device_assignment = (device.id,) if device else None compile_opts = xb.get_compile_options(num_replicas=axis_env.nreps, device_assignment=device_assignment) return built_c.Compile(arg_shapes, compile_opts, backend=xb.get_backend(backend)) @@ -361,10 +362,9 @@ def eqn_replicas(eqn): ### xla_call underlying jit def _xla_call_impl(fun, *args, **params): - device_assignment = params['device_assignment'] + device = params['device'] backend = params.get('backend', None) - compiled_fun = _xla_callable(fun, device_assignment, backend, - *map(abstractify, args)) + compiled_fun = _xla_callable(fun, device, backend, *map(abstractify, args)) try: return compiled_fun(*args) except FloatingPointError: @@ -373,7 +373,7 @@ def _xla_call_impl(fun, *args, **params): return fun.call_wrapped(*args) # probably won't return @lu.cache -def _xla_callable(fun, device_assignment, backend, *abstract_args): +def _xla_callable(fun, device, backend, *abstract_args): if FLAGS.jax_log_compiles: print("Compiling {} for args {}.".format(fun.__name__, abstract_args)) pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] @@ -381,7 +381,7 @@ def _xla_callable(fun, device_assignment, backend, *abstract_args): jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) assert not env # no subtraces here (though cond might eventually need them) axis_env = AxisEnv(jaxpr_replicas(jaxpr), [], []) - compiled = compile_jaxpr(jaxpr, device_assignment, backend, axis_env, consts, + compiled = compile_jaxpr(jaxpr, device, backend, axis_env, consts, *abstract_args) del master, consts, jaxpr, env result_handlers = tuple(map(_pval_to_result_handler, pvals)) @@ -419,8 +419,8 @@ def _execute_replicated(compiled, backend, handlers, *args): xla_call_p.def_impl(_xla_call_impl) def _xla_call_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, - in_nodes, device_assignment=None, backend=None): - del device_assignment # Ignored. + in_nodes, device=None, backend=None): + del device # Ignored. subc = xb.make_computation_builder("jaxpr_subcomputation") # TODO(mattjj): name consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] @@ -660,7 +660,7 @@ def _device_put_device_array(x, device_num, backend): # XrtBuffers. Figure out a less risky way to deal with XrtBuffers. if (not hasattr(x.device_buffer, "platform") or xb.get_backend(backend).platform == x.device_buffer.platform()): - if xb.device_ordinal(x.device_buffer) == device_num: + if x.device_buffer.device_ordinal() == device_num: return x.device_buffer else: return x.device_buffer.copy_to_device(device_num) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 87e5e577f138..b8881e326b47 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 26) +_minimum_jaxlib_version = (0, 1, 28) try: from jaxlib import version as jaxlib_version except: diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index b5b3885c1407..75850a9ab70c 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -368,11 +368,3 @@ def _scalar_constant_handler(c, val, canonicalize_types=True): if six.PY2: register_constant_handler(long, _scalar_constant_handler) # noqa: F821 - - -# TODO(skye): use buf.device_ordinal() directly once min jaxlib version is >= 0.1.28 -def device_ordinal(buf): - if version >= (0, 1, 28): - return buf.device_ordinal() - else: - return buf.device() diff --git a/tests/api_test.py b/tests/api_test.py index 2d67bb9ea699..f5a1d6cc71b5 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -955,12 +955,11 @@ def scalar_solve2(f, y): grad = api.grad(binary_search, argnums=1)(sqrt_cubed, 5.0) self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) - def test_jit_device_assignment(self): - raise unittest.SkipTest("Temporarily disabled while device API is being changed.") - device_num = xb.device_count() - 1 - x = api.jit(lambda x: x, device_assignment=device_num)(3.) + def test_jit_device(self): + device = xb.devices()[-1] + x = api.jit(lambda x: x, device=device)(3.) self.assertIsInstance(x, DeviceArray) - self.assertEqual(x.device_buffer.device(), device_num) + self.assertEqual(x.device_buffer.device(), device) def test_jit_of_noncallable(self): jtu.check_raises_regexp(lambda: api.jit(3), TypeError, From ac9049299e79e1ceb49e43aae7d0a3d9f5216bfb Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 24 Sep 2019 21:00:32 -0700 Subject: [PATCH 0089/1053] Add a linear solve test --- tests/lax_control_flow_test.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index e70964aa83b4..dd71ad4c61f0 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -981,7 +981,7 @@ def f(carry, _): key = random.PRNGKey(0) api.grad(lambda c: lax.scan(f, (c, key), onp.ones(3))[0][0])(0.) # doesn't crash - def test_root(self): + def test_root_scalar(self): def scalar_solve(f, y): return y / f(1.0) @@ -1018,14 +1018,24 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): results = api.vmap(sqrt_cubed)(inputs) self.assertAllClose(results, inputs ** 1.5, check_dtypes=False) - def nd_solve(f, y): - g = lambda z: f(z.reshape(y.shape)).ravel() - jacobian = api.jacobian(g)(y.ravel()) - return np.linalg.solve(jacobian, y.ravel()).reshape(y.shape) + def test_root_vector(self): - sqrt_cubed_alt = partial(sqrt_cubed, tangent_solve=nd_solve) - value, grad = api.value_and_grad(sqrt_cubed_alt)(5.0) - self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) + def oracle(func, x0): + del func # unused + return x0 + + def vector_solve(f, y): + return np.linalg.solve(api.jacobian(f)(y), y) + + def linear_solve(a, b): + f = lambda y: np.dot(a, y) - b + x0 = np.linalg.solve(a, b) + return lax.root(f, x0, oracle, vector_solve) + + rng = onp.random.RandomState(0) + a = rng.randn(2, 2) + b = rng.randn(2) + jtu.check_grads(linear_solve, (a, b), order=2, rtol=1e-3) def test_root_errors(self): with self.assertRaisesRegexp(TypeError, "f output pytree"): From b9ff2086e6907c8f7aa4b0883c5449ac8c317660 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 24 Sep 2019 22:41:17 -0700 Subject: [PATCH 0090/1053] fixes --- jax/lax/lax_control_flow.py | 15 +++++++++------ jax/lax_linalg.py | 3 +++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 004ce0b03908..2ff6f2f7d542 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -908,17 +908,20 @@ def _root_jvp( # F(u(m), m) = 0 # system of equations in m # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) - unchecked_zeros, f_jvp = ad.vjp( - lu.wrap_init(core.jaxpr_as_fun(jaxpr)), - primals[:num_consts] + tuple(solution) + unchecked_zeros, f_jvp = api.linearize( + core.jaxpr_as_fun(jaxpr), + *itertools.chain(primals[:num_consts], solution) ) + + params_zeros = _map(ad_util.zeros_like_jaxval, primals[:num_consts]) f_linearized = partial( apply_flat_fun_nokwargs, - lambda *xs: f_jvp(*xs)[num_consts:], + lambda *xs: f_jvp(*itertools.chain(params_zeros, xs)), (tree, tree), ) - params_jvp = tree_unflatten( - tree, f_jvp(*tangents[:num_consts])[:num_consts]) + solution_zeros = _map(ad_util.zeros_like_jaxval, primals[num_consts:]) + params_jvp_flat = f_jvp(*itertools.chain(tangents[:num_consts], solution_zeros)) + params_jvp = tree_unflatten(tree, params_jvp_flat) negative_grad = tangent_solve(f_linearized, params_jvp) negative_grad_flat, out_tree = tree_flatten(negative_grad) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 32bdd186e532..e102a5d9225c 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -72,6 +72,9 @@ def svd(x, full_matrices=True, compute_uv=True): def triangular_solve(a, b, left_side=False, lower=False, transpose_a=False, conjugate_a=False, unit_diagonal=False): + # TODO(shoyer): remove this hack! + if b is ad_util.zero: + return b conjugate_a = conjugate_a and np.issubdtype(lax.dtype(a), np.complexfloating) return triangular_solve_p.bind( a, b, left_side=left_side, lower=lower, transpose_a=transpose_a, From 0f69e45ec5c69c0302fda1e7e3ca8433c576fca3 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 24 Sep 2019 22:44:02 -0700 Subject: [PATCH 0091/1053] fix abstract eval rule --- jax/lax/lax_control_flow.py | 1 + tests/lax_control_flow_test.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 2ff6f2f7d542..e3b1df0d3c87 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -940,6 +940,7 @@ def _root_batch(args, dims, **params): root_p = core.Primitive('root') root_p.multiple_results = True root_p.def_impl(_root_impl) +root_p.def_abstract_eval(_root_abstract_eval) ad.primitive_jvps[root_p] = _root_jvp xla.initial_style_translations[root_p] = xla.lower_fun(_root_impl, initial_style=True) batching.primitive_batchers[root_p] = _root_batch diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index dd71ad4c61f0..806abf4b7b33 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1018,6 +1018,9 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): results = api.vmap(sqrt_cubed)(inputs) self.assertAllClose(results, inputs ** 1.5, check_dtypes=False) + results = api.jit(sqrt_cubed)(5.0) + self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False) + def test_root_vector(self): def oracle(func, x0): @@ -1035,7 +1038,7 @@ def linear_solve(a, b): rng = onp.random.RandomState(0) a = rng.randn(2, 2) b = rng.randn(2) - jtu.check_grads(linear_solve, (a, b), order=2, rtol=1e-3) + jtu.check_grads(linear_solve, (a, b), order=2) def test_root_errors(self): with self.assertRaisesRegexp(TypeError, "f output pytree"): From a44d8e99d8086553081ab4fcf7e77873041dcf78 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 24 Sep 2019 22:48:15 -0700 Subject: [PATCH 0092/1053] restore altered jit test --- tests/api_test.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/api_test.py b/tests/api_test.py index 1ac7648f04e7..aee0c346d911 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -920,10 +920,9 @@ def f(x): xla_comp = api.xla_computation(f) xla_comp(np.arange(8)).GetHloText() # doesn't crash - def test_jit_device_assignment(self): - raise unittest.SkipTest("Temporarily disabled while device API is being changed.") - device_num = xb.device_count() - 1 - x = api.jit(lambda x: x, device_assignment=device_num)(3.) + def test_jit_device(self): + device = xb.devices()[-1] + x = api.jit(lambda x: x, device=device)(3.) self.assertIsInstance(x, DeviceArray) self.assertEqual(x.device_buffer.device(), device) From 7c979e7c28a1a141dee66f0502caf7c15189710d Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Wed, 25 Sep 2019 15:59:52 +0200 Subject: [PATCH 0093/1053] Always test for cache misses on second op-by-op call --- jax/test_util.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jax/test_util.py b/jax/test_util.py index 9d3865bd322a..013b1fd965b6 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -35,6 +35,7 @@ from .util import partial from .tree_util import tree_multimap, tree_all, tree_map, tree_reduce from .lib import xla_bridge +from .interpreters import xla FLAGS = flags.FLAGS @@ -533,6 +534,13 @@ def wrapped_fun(*args): python_should_be_executing = True python_ans = fun(*args) + cache_misses = xla.xla_primitive_callable.cache_info().misses + python_ans = fun(*args) + self.assertEqual( + cache_misses, xla.xla_primitive_callable.cache_info().misses, + "Compilation detected during second call of {} in op-by-op " + "mode.".format(fun)) + cfun = api.jit(wrapped_fun) python_should_be_executing = True monitored_ans = cfun(*args) From d2d0576892a5796daffbb01d288a27f6ba100b65 Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Wed, 25 Sep 2019 16:19:26 +0200 Subject: [PATCH 0094/1053] Ensure cache hits for gcd, lcm --- jax/numpy/lax_numpy.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index d7bbf2f0bd7f..9e0c1f4843fb 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2819,23 +2819,24 @@ def _static_idx(idx, size): # TODO: lower `kaiser` via lax to allow non-constant beta values. kaiser = _wrap_numpy_nullary_function(onp.kaiser) +def _gcd_cond_fn(xs): + x1, x2 = xs + return any(x2 != 0) + +def _gcd_body_fn(xs): + x1, x2 = xs + x1, x2 = (where(x2 != 0, x2, x1), + where(x2 != 0, lax.rem(x1, x2), lax._const(x2, 0))) + return (where(x1 < x2, x2, x1), where(x1 < x2, x1, x2)) @_wraps(getattr(onp, "gcd", None)) def gcd(x1, x2): if (not issubdtype(_dtype(x1), integer) or not issubdtype(_dtype(x2), integer)): raise ValueError("Arguments to gcd must be integers.") - def cond_fn(xs): - x1, x2 = xs - return any(x2 != 0) - def body_fn(xs): - x1, x2 = xs - x1, x2 = (where(x2 != 0, x2, x1), - where(x2 != 0, lax.rem(x1, x2), lax._const(x2, 0))) - return (where(x1 < x2, x2, x1), where(x1 < x2, x1, x2)) x1, x2 = _promote_dtypes(lax.abs(x1), lax.abs(x2)) x1, x2 = broadcast_arrays(x1, x2) - gcd, _ = lax.while_loop(cond_fn, body_fn, (x1, x2)) + gcd, _ = lax.while_loop(_gcd_cond_fn, _gcd_body_fn, (x1, x2)) return gcd From 3610c4aee7c08c4f917a6ccca156f4d5235e0345 Mon Sep 17 00:00:00 2001 From: Dima Kochkov Date: Wed, 25 Sep 2019 10:30:19 -0400 Subject: [PATCH 0095/1053] Fixed typo in initial_step_size method. See the reference in the docstring for details. --- jax/experimental/ode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index 05cd9818d92b..52f8bb6d0edb 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -124,7 +124,7 @@ def initial_step_size(fun, t0, y0, order, rtol, atol, f0): f1 = fun(y1, t0 + h0) d2 = (np.linalg.norm(f1 - f0) / scale) / h0 - h1 = np.where(np.all(np.asarray([d0 <= 1e-15, d1 < 1e-15])), + h1 = np.where(np.all(np.asarray([d1 <= 1e-15, d2 < 1e-15])), np.maximum(1e-6, h0 * 1e-3), (0.01 / np.max(d1 + d2))**order_pow) From 7eaca4d7d5c0eafba4d0813ec36a00a270650bff Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 09:15:14 -0700 Subject: [PATCH 0096/1053] WIP: remove solve --- jax/lax/lax_control_flow.py | 90 +++++++++++++--------------------- tests/lax_control_flow_test.py | 27 ++++------ 2 files changed, 45 insertions(+), 72 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index dcd1086f5fcd..575c961f813b 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -832,26 +832,22 @@ def body(i, dst): masking.masking_rules[lax.concatenate_p] = _concat_masking_rule -def root(f, initial_guess, solve, tangent_solve): +def root(f, solution, tangent_solve): """Differentiably solve for a roots of a function. This is a low-level routine, mostly intended for internal use in JAX. Gradients of root() are defined with respect to closed-over variables from the provided function f. - Args: - f: function for which to find a root. Should accept a single argument, - return a tree of arrays with the same structure as its input. - initial_guess: initial guess for a zero of f. - solve: function to solve for the roots of f. Should take two positional - arguments, f and initial_guess, and return a solution with the same - structure as initial_guess such that func(solution) = 0. In other words, - the following is assumed to be true (but not checked):: - - solution = solve(f, initial_guess) - error = f(solution) - assert all(error == 0) + The gradient is defined under the assumption that every element of + ``f(solution)`` is near zero, but this isn't checked. + Args: + f: differentiable function for which ``solution`` is a root, i.e., + every element in ``f(solution)`` is zero. Should accept a single + argument of (possibly nested) arrays, and return arrays with the same + structure and shapes. + solution: root of ``f``, i.e., ``all(f(solution) == 0)``. tangent_solve: function to solve the tangent system. Should take two positional arguments, a linear function ``g`` (the function ``f`` linearized at its root) and a tree of array(s) ``y`` with the same @@ -864,21 +860,21 @@ def root(f, initial_guess, solve, tangent_solve): ``lambda g, y: np.linalg.solve(jacobian(g)(y), y)``. Returns: - The result of calling solve(f, initial_guess) with gradients defined via - implicit differentiation assuming ``f(solve(f, initial_guess)) == 0``. + The ``solution`` with gradients defined via implicit differentiation ``f`` + assuming ``f(solution) == 0``. """ - guess_flat, in_args_tree = tree_flatten((initial_guess,)) - guess_avals = tuple(_map(_abstractify, guess_flat)) - jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, guess_avals) + solution_flat, in_args_tree = tree_flatten((solution,)) + solution_avals = tuple(_map(_abstractify, solution_flat)) + jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, solution_avals) in_tree, = treedef_children(in_args_tree) if in_tree != out_tree: raise TypeError( - "f output pytree structure must match initial_guess, got {} and {}." + "f() output pytree structure must match solution, got {} and {}." .format(out_tree, in_tree) ) - out_flat = root_p.bind(*itertools.chain(consts, guess_flat), + out_flat = root_p.bind(*itertools.chain(consts, solution_flat), tree=out_tree, num_consts=len(consts), - jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) + jaxpr=jaxpr, tangent_solve=tangent_solve) return tree_unflatten(out_tree, out_flat) @@ -887,58 +883,42 @@ def _root_abstract_eval(*args, **kwargs): def _root_impl(*args, **kwargs): - tree, num_consts, jaxpr, solve, _ = split_dict( - kwargs, ['tree', 'num_consts', 'jaxpr', 'solve', 'tangent_solve']) - - f = partial( - apply_flat_fun_nokwargs, - partial(core.jaxpr_as_fun(jaxpr), *args[:num_consts]), - (tree, tree), - ) - initial_guess = tree_unflatten(tree, args[num_consts:]) - out = solve(f, initial_guess) - - out_flat, out_tree = tree_flatten(out) - if out_tree != tree: - raise TypeError( - "solve output pytree structure must match initial_guess, got {} and {}" - .format(out_tree, tree)) - - return out_flat + return args[kwargs['num_consts']:] def _root_jvp( - primals, tangents, tree, num_consts, jaxpr, solve, tangent_solve): - solution = root_p.bind(*primals, tree=tree, num_consts=num_consts, - jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) + primals, tangents, tree, num_consts, jaxpr, tangent_solve): + params = primals[:num_consts] + solution = primals[num_consts:] + + params_dot = tangents[:num_consts] + # solution_dot is ignored; it's what we're redefining here # F(u(m), m) = 0 # system of equations in m # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) unchecked_zeros, f_jvp = api.linearize( - core.jaxpr_as_fun(jaxpr), - *itertools.chain(primals[:num_consts], solution) + core.jaxpr_as_fun(jaxpr), *(params + solution) ) - params_zeros = _map(ad_util.zeros_like_jaxval, primals[:num_consts]) - f_linearized = partial( + params_zeros = tuple(_map(ad_util.zeros_like_jaxval, params)) + f_linearized_at_solution = partial( apply_flat_fun_nokwargs, - lambda *xs: f_jvp(*itertools.chain(params_zeros, xs)), + lambda *xs: f_jvp(*(params_zeros + xs)), (tree, tree), ) - solution_zeros = _map(ad_util.zeros_like_jaxval, primals[num_consts:]) - params_jvp_flat = f_jvp(*itertools.chain(tangents[:num_consts], solution_zeros)) - params_jvp = tree_unflatten(tree, params_jvp_flat) - negative_grad = tangent_solve(f_linearized, params_jvp) + solution_zeros = tuple(_map(ad_util.zeros_like_jaxval, solution)) + rhs = tree_unflatten(tree, f_jvp(*(params_dot + solution_zeros))) + negative_solution_dot = tangent_solve(f_linearized_at_solution, rhs) - negative_grad_flat, out_tree = tree_flatten(negative_grad) + negative_solution_dot_flat, out_tree = tree_flatten(negative_solution_dot) if out_tree != tree: raise TypeError( - "tangent_solve output pytree structure must match initial_guess, " + "tangent_solve() output pytree structure must match solution, " "got {} and {}".format(out_tree, tree)) - grad_solution = _map(operator.neg, negative_grad_flat) - return solution, grad_solution + solution_dot = _map(operator.neg, negative_solution_dot_flat) + return solution, solution_dot def _root_batch(args, dims, **params): return batching.batch_fun(lu.wrap_init(_root_impl, params), args, dims) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 57f4a17c6d43..09e07b006744 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -997,9 +997,7 @@ def test_root_scalar(self): def scalar_solve(f, y): return y / f(1.0) - def binary_search(func, x0, low=0.0, high=100.0, tolerance=1e-6): - del x0 # unused - + def binary_search(func, low=0.0, high=100.0, tolerance=1e-6): def cond(state): low, high = state return high - low > tolerance @@ -1015,9 +1013,10 @@ def body(state): solution, _ = lax.while_loop(cond, body, (low, high)) return solution - def sqrt_cubed(x, tangent_solve=scalar_solve): + def sqrt_cubed(x): f = lambda y: y ** 2 - x ** 3 - return lax.root(f, 0.0, binary_search, tangent_solve) + x = binary_search(f) + return lax.root(f, 0.0, scalar_solve) value, grad = api.value_and_grad(sqrt_cubed)(5.0) self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) @@ -1034,17 +1033,13 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): def test_root_vector(self): - def oracle(func, x0): - del func # unused - return x0 - def vector_solve(f, y): return np.linalg.solve(api.jacobian(f)(y), y) def linear_solve(a, b): f = lambda y: np.dot(a, y) - b - x0 = np.linalg.solve(a, b) - return lax.root(f, x0, oracle, vector_solve) + x = np.linalg.solve(a, b) + return lax.root(f, x, vector_solve) rng = onp.random.RandomState(0) a = rng.randn(2, 2) @@ -1052,16 +1047,14 @@ def linear_solve(a, b): jtu.check_grads(linear_solve, (a, b), order=2) def test_root_errors(self): - with self.assertRaisesRegexp(TypeError, "f output pytree"): - lax.root(lambda x: (x, x), 0.0, lambda f, x: x, lambda f, x: x) - with self.assertRaisesRegexp(TypeError, "solve output pytree"): - lax.root(lambda x: x, 0.0, lambda f, x: (x, x), lambda f, x: x) + with self.assertRaisesRegexp(TypeError, r"f() output pytree"): + lax.root(lambda x: (x, x), 0.0, lambda f, x: x) def dummy_root_usage(x): f = lambda y: x - y - return lax.root(f, 0.0, lambda f, x: x, lambda f, x: (x, x)) + return lax.root(f, 0.0, lambda f, x: (x, x)) - with self.assertRaisesRegexp(TypeError, "tangent_solve output pytree"): + with self.assertRaisesRegexp(TypeError, r"tangent_solve() output pytree"): api.jvp(dummy_root_usage, (0.0,), (0.0,)) From cd61fbfca3622e9ec84afc4b685141bfb96cc632 Mon Sep 17 00:00:00 2001 From: Daniel Weaver Date: Wed, 25 Sep 2019 16:19:58 +0000 Subject: [PATCH 0097/1053] Add ode library to BUILD file --- jax/BUILD | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/jax/BUILD b/jax/BUILD index fddc9960d8d7..027aeb99dfc8 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -65,3 +65,10 @@ py_library( srcs = ["experimental/lapax.py"], deps = [":jax"], ) + +py_library( + name = "ode", + srcs = ["experimental/ode.py"], + deps = [":jax"], +) + From 5ca9f0a6fe4e5d28ad21931bbacb76f21b165d59 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 15:43:27 -0700 Subject: [PATCH 0098/1053] Revert "WIP: remove solve" This reverts commit 7eaca4d7d5c0eafba4d0813ec36a00a270650bff. --- jax/lax/lax_control_flow.py | 90 +++++++++++++++++++++------------- tests/lax_control_flow_test.py | 27 ++++++---- 2 files changed, 72 insertions(+), 45 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 575c961f813b..dcd1086f5fcd 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -832,22 +832,26 @@ def body(i, dst): masking.masking_rules[lax.concatenate_p] = _concat_masking_rule -def root(f, solution, tangent_solve): +def root(f, initial_guess, solve, tangent_solve): """Differentiably solve for a roots of a function. This is a low-level routine, mostly intended for internal use in JAX. Gradients of root() are defined with respect to closed-over variables from the provided function f. - The gradient is defined under the assumption that every element of - ``f(solution)`` is near zero, but this isn't checked. - Args: - f: differentiable function for which ``solution`` is a root, i.e., - every element in ``f(solution)`` is zero. Should accept a single - argument of (possibly nested) arrays, and return arrays with the same - structure and shapes. - solution: root of ``f``, i.e., ``all(f(solution) == 0)``. + f: function for which to find a root. Should accept a single argument, + return a tree of arrays with the same structure as its input. + initial_guess: initial guess for a zero of f. + solve: function to solve for the roots of f. Should take two positional + arguments, f and initial_guess, and return a solution with the same + structure as initial_guess such that func(solution) = 0. In other words, + the following is assumed to be true (but not checked):: + + solution = solve(f, initial_guess) + error = f(solution) + assert all(error == 0) + tangent_solve: function to solve the tangent system. Should take two positional arguments, a linear function ``g`` (the function ``f`` linearized at its root) and a tree of array(s) ``y`` with the same @@ -860,21 +864,21 @@ def root(f, solution, tangent_solve): ``lambda g, y: np.linalg.solve(jacobian(g)(y), y)``. Returns: - The ``solution`` with gradients defined via implicit differentiation ``f`` - assuming ``f(solution) == 0``. + The result of calling solve(f, initial_guess) with gradients defined via + implicit differentiation assuming ``f(solve(f, initial_guess)) == 0``. """ - solution_flat, in_args_tree = tree_flatten((solution,)) - solution_avals = tuple(_map(_abstractify, solution_flat)) - jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, solution_avals) + guess_flat, in_args_tree = tree_flatten((initial_guess,)) + guess_avals = tuple(_map(_abstractify, guess_flat)) + jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, guess_avals) in_tree, = treedef_children(in_args_tree) if in_tree != out_tree: raise TypeError( - "f() output pytree structure must match solution, got {} and {}." + "f output pytree structure must match initial_guess, got {} and {}." .format(out_tree, in_tree) ) - out_flat = root_p.bind(*itertools.chain(consts, solution_flat), + out_flat = root_p.bind(*itertools.chain(consts, guess_flat), tree=out_tree, num_consts=len(consts), - jaxpr=jaxpr, tangent_solve=tangent_solve) + jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) return tree_unflatten(out_tree, out_flat) @@ -883,42 +887,58 @@ def _root_abstract_eval(*args, **kwargs): def _root_impl(*args, **kwargs): - return args[kwargs['num_consts']:] + tree, num_consts, jaxpr, solve, _ = split_dict( + kwargs, ['tree', 'num_consts', 'jaxpr', 'solve', 'tangent_solve']) + + f = partial( + apply_flat_fun_nokwargs, + partial(core.jaxpr_as_fun(jaxpr), *args[:num_consts]), + (tree, tree), + ) + initial_guess = tree_unflatten(tree, args[num_consts:]) + out = solve(f, initial_guess) + + out_flat, out_tree = tree_flatten(out) + if out_tree != tree: + raise TypeError( + "solve output pytree structure must match initial_guess, got {} and {}" + .format(out_tree, tree)) + return out_flat -def _root_jvp( - primals, tangents, tree, num_consts, jaxpr, tangent_solve): - params = primals[:num_consts] - solution = primals[num_consts:] - params_dot = tangents[:num_consts] - # solution_dot is ignored; it's what we're redefining here +def _root_jvp( + primals, tangents, tree, num_consts, jaxpr, solve, tangent_solve): + solution = root_p.bind(*primals, tree=tree, num_consts=num_consts, + jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) # F(u(m), m) = 0 # system of equations in m # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) unchecked_zeros, f_jvp = api.linearize( - core.jaxpr_as_fun(jaxpr), *(params + solution) + core.jaxpr_as_fun(jaxpr), + *itertools.chain(primals[:num_consts], solution) ) - params_zeros = tuple(_map(ad_util.zeros_like_jaxval, params)) - f_linearized_at_solution = partial( + params_zeros = _map(ad_util.zeros_like_jaxval, primals[:num_consts]) + f_linearized = partial( apply_flat_fun_nokwargs, - lambda *xs: f_jvp(*(params_zeros + xs)), + lambda *xs: f_jvp(*itertools.chain(params_zeros, xs)), (tree, tree), ) - solution_zeros = tuple(_map(ad_util.zeros_like_jaxval, solution)) - rhs = tree_unflatten(tree, f_jvp(*(params_dot + solution_zeros))) - negative_solution_dot = tangent_solve(f_linearized_at_solution, rhs) + solution_zeros = _map(ad_util.zeros_like_jaxval, primals[num_consts:]) + params_jvp_flat = f_jvp(*itertools.chain(tangents[:num_consts], solution_zeros)) + params_jvp = tree_unflatten(tree, params_jvp_flat) + negative_grad = tangent_solve(f_linearized, params_jvp) - negative_solution_dot_flat, out_tree = tree_flatten(negative_solution_dot) + negative_grad_flat, out_tree = tree_flatten(negative_grad) if out_tree != tree: raise TypeError( - "tangent_solve() output pytree structure must match solution, " + "tangent_solve output pytree structure must match initial_guess, " "got {} and {}".format(out_tree, tree)) - solution_dot = _map(operator.neg, negative_solution_dot_flat) - return solution, solution_dot + grad_solution = _map(operator.neg, negative_grad_flat) + return solution, grad_solution def _root_batch(args, dims, **params): return batching.batch_fun(lu.wrap_init(_root_impl, params), args, dims) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 09e07b006744..57f4a17c6d43 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -997,7 +997,9 @@ def test_root_scalar(self): def scalar_solve(f, y): return y / f(1.0) - def binary_search(func, low=0.0, high=100.0, tolerance=1e-6): + def binary_search(func, x0, low=0.0, high=100.0, tolerance=1e-6): + del x0 # unused + def cond(state): low, high = state return high - low > tolerance @@ -1013,10 +1015,9 @@ def body(state): solution, _ = lax.while_loop(cond, body, (low, high)) return solution - def sqrt_cubed(x): + def sqrt_cubed(x, tangent_solve=scalar_solve): f = lambda y: y ** 2 - x ** 3 - x = binary_search(f) - return lax.root(f, 0.0, scalar_solve) + return lax.root(f, 0.0, binary_search, tangent_solve) value, grad = api.value_and_grad(sqrt_cubed)(5.0) self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) @@ -1033,13 +1034,17 @@ def sqrt_cubed(x): def test_root_vector(self): + def oracle(func, x0): + del func # unused + return x0 + def vector_solve(f, y): return np.linalg.solve(api.jacobian(f)(y), y) def linear_solve(a, b): f = lambda y: np.dot(a, y) - b - x = np.linalg.solve(a, b) - return lax.root(f, x, vector_solve) + x0 = np.linalg.solve(a, b) + return lax.root(f, x0, oracle, vector_solve) rng = onp.random.RandomState(0) a = rng.randn(2, 2) @@ -1047,14 +1052,16 @@ def linear_solve(a, b): jtu.check_grads(linear_solve, (a, b), order=2) def test_root_errors(self): - with self.assertRaisesRegexp(TypeError, r"f() output pytree"): - lax.root(lambda x: (x, x), 0.0, lambda f, x: x) + with self.assertRaisesRegexp(TypeError, "f output pytree"): + lax.root(lambda x: (x, x), 0.0, lambda f, x: x, lambda f, x: x) + with self.assertRaisesRegexp(TypeError, "solve output pytree"): + lax.root(lambda x: x, 0.0, lambda f, x: (x, x), lambda f, x: x) def dummy_root_usage(x): f = lambda y: x - y - return lax.root(f, 0.0, lambda f, x: (x, x)) + return lax.root(f, 0.0, lambda f, x: x, lambda f, x: (x, x)) - with self.assertRaisesRegexp(TypeError, r"tangent_solve() output pytree"): + with self.assertRaisesRegexp(TypeError, "tangent_solve output pytree"): api.jvp(dummy_root_usage, (0.0,), (0.0,)) From 6fda7be0558ea2b38477e44aea4d2b246edfa45e Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 15:48:49 -0700 Subject: [PATCH 0099/1053] revert structure of lax.root --- jax/lax/lax_control_flow.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index dcd1086f5fcd..5cebf06f8257 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -909,25 +909,29 @@ def _root_impl(*args, **kwargs): def _root_jvp( primals, tangents, tree, num_consts, jaxpr, solve, tangent_solve): - solution = root_p.bind(*primals, tree=tree, num_consts=num_consts, - jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) + params = primals[:num_consts] + solution = tuple( + root_p.bind(*primals, tree=tree, num_consts=num_consts, + jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) + ) + + params_dot = tangents[:num_consts] # F(u(m), m) = 0 # system of equations in m # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) unchecked_zeros, f_jvp = api.linearize( - core.jaxpr_as_fun(jaxpr), - *itertools.chain(primals[:num_consts], solution) + core.jaxpr_as_fun(jaxpr), *(params + solution) ) - params_zeros = _map(ad_util.zeros_like_jaxval, primals[:num_consts]) + params_zeros = tuple(_map(ad_util.zeros_like_jaxval, params)) f_linearized = partial( apply_flat_fun_nokwargs, - lambda *xs: f_jvp(*itertools.chain(params_zeros, xs)), + lambda *xs: f_jvp(*(params_zeros + xs)), (tree, tree), ) - solution_zeros = _map(ad_util.zeros_like_jaxval, primals[num_consts:]) - params_jvp_flat = f_jvp(*itertools.chain(tangents[:num_consts], solution_zeros)) + solution_zeros = tuple(_map(ad_util.zeros_like_jaxval, solution)) + params_jvp_flat = f_jvp(*(params_dot + solution_zeros)) params_jvp = tree_unflatten(tree, params_jvp_flat) negative_grad = tangent_solve(f_linearized, params_jvp) @@ -937,8 +941,8 @@ def _root_jvp( "tangent_solve output pytree structure must match initial_guess, " "got {} and {}".format(out_tree, tree)) - grad_solution = _map(operator.neg, negative_grad_flat) - return solution, grad_solution + solution_dot = _map(operator.neg, negative_grad_flat) + return solution, solution_dot def _root_batch(args, dims, **params): return batching.batch_fun(lu.wrap_init(_root_impl, params), args, dims) From 8b1a60eeb5f2aebd414d322498a8fdb8ff0c33bc Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 15:51:52 -0700 Subject: [PATCH 0100/1053] Revert hack from lax_linalg.py --- jax/lax_linalg.py | 3 --- tests/lax_control_flow_test.py | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 79aaaf62d973..853a5a04c5dd 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -72,9 +72,6 @@ def svd(x, full_matrices=True, compute_uv=True): def triangular_solve(a, b, left_side=False, lower=False, transpose_a=False, conjugate_a=False, unit_diagonal=False): - # TODO(shoyer): remove this hack! - if b is ad_util.zero: - return b conjugate_a = conjugate_a and np.issubdtype(lax.dtype(a), np.complexfloating) return triangular_solve_p.bind( a, b, left_side=left_side, lower=lower, transpose_a=transpose_a, diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 57f4a17c6d43..27bf2dc25d7d 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1052,16 +1052,16 @@ def linear_solve(a, b): jtu.check_grads(linear_solve, (a, b), order=2) def test_root_errors(self): - with self.assertRaisesRegexp(TypeError, "f output pytree"): + with self.assertRaisesRegex(TypeError, "f output pytree"): lax.root(lambda x: (x, x), 0.0, lambda f, x: x, lambda f, x: x) - with self.assertRaisesRegexp(TypeError, "solve output pytree"): + with self.assertRaisesRegex(TypeError, "solve output pytree"): lax.root(lambda x: x, 0.0, lambda f, x: (x, x), lambda f, x: x) def dummy_root_usage(x): f = lambda y: x - y return lax.root(f, 0.0, lambda f, x: x, lambda f, x: (x, x)) - with self.assertRaisesRegexp(TypeError, "tangent_solve output pytree"): + with self.assertRaisesRegex(TypeError, "tangent_solve output pytree"): api.jvp(dummy_root_usage, (0.0,), (0.0,)) From 854aa287b8fef36a7843743b4f4a8cab80e4569e Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 16:02:25 -0700 Subject: [PATCH 0101/1053] notation --- jax/lax/lax_control_flow.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 5cebf06f8257..193a81164d37 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -925,24 +925,25 @@ def _root_jvp( ) params_zeros = tuple(_map(ad_util.zeros_like_jaxval, params)) - f_linearized = partial( + solution_zeros = tuple(_map(ad_util.zeros_like_jaxval, solution)) + + f_linearized_at_solution = partial( apply_flat_fun_nokwargs, lambda *xs: f_jvp(*(params_zeros + xs)), (tree, tree), ) - solution_zeros = tuple(_map(ad_util.zeros_like_jaxval, solution)) - params_jvp_flat = f_jvp(*(params_dot + solution_zeros)) - params_jvp = tree_unflatten(tree, params_jvp_flat) - negative_grad = tangent_solve(f_linearized, params_jvp) + rhs = tree_unflatten(tree, f_jvp(*(params_dot + solution_zeros))) + solution_dot = tree_map( + operator.neg, tangent_solve(f_linearized_at_solution, rhs) + ) - negative_grad_flat, out_tree = tree_flatten(negative_grad) + solution_dot_flat, out_tree = tree_flatten(solution_dot) if out_tree != tree: raise TypeError( "tangent_solve output pytree structure must match initial_guess, " "got {} and {}".format(out_tree, tree)) - solution_dot = _map(operator.neg, negative_grad_flat) - return solution, solution_dot + return solution, solution_dot_flat def _root_batch(args, dims, **params): return batching.batch_fun(lu.wrap_init(_root_impl, params), args, dims) From 760d696c921ef1d46020dc9959ec68f6b3a276c1 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 16:04:15 -0700 Subject: [PATCH 0102/1053] error messages --- jax/lax/lax_control_flow.py | 6 +++--- tests/lax_control_flow_test.py | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 193a81164d37..22ba7def9b95 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -873,7 +873,7 @@ def root(f, initial_guess, solve, tangent_solve): in_tree, = treedef_children(in_args_tree) if in_tree != out_tree: raise TypeError( - "f output pytree structure must match initial_guess, got {} and {}." + "f() output pytree structure must match initial_guess, got {} and {}." .format(out_tree, in_tree) ) out_flat = root_p.bind(*itertools.chain(consts, guess_flat), @@ -901,7 +901,7 @@ def _root_impl(*args, **kwargs): out_flat, out_tree = tree_flatten(out) if out_tree != tree: raise TypeError( - "solve output pytree structure must match initial_guess, got {} and {}" + "solve() output pytree structure must match initial_guess, got {} and {}" .format(out_tree, tree)) return out_flat @@ -940,7 +940,7 @@ def _root_jvp( solution_dot_flat, out_tree = tree_flatten(solution_dot) if out_tree != tree: raise TypeError( - "tangent_solve output pytree structure must match initial_guess, " + "tangent_solve() output pytree structure must match initial_guess, " "got {} and {}".format(out_tree, tree)) return solution, solution_dot_flat diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 27bf2dc25d7d..10baa9725ef2 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -19,6 +19,7 @@ import collections from functools import partial import itertools +import re from unittest import SkipTest from absl.testing import absltest @@ -1052,16 +1053,17 @@ def linear_solve(a, b): jtu.check_grads(linear_solve, (a, b), order=2) def test_root_errors(self): - with self.assertRaisesRegex(TypeError, "f output pytree"): + with self.assertRaisesRegex(TypeError, re.escape("f() output pytree")): lax.root(lambda x: (x, x), 0.0, lambda f, x: x, lambda f, x: x) - with self.assertRaisesRegex(TypeError, "solve output pytree"): + with self.assertRaisesRegex(TypeError, re.escape("solve() output pytree")): lax.root(lambda x: x, 0.0, lambda f, x: (x, x), lambda f, x: x) def dummy_root_usage(x): f = lambda y: x - y return lax.root(f, 0.0, lambda f, x: x, lambda f, x: (x, x)) - with self.assertRaisesRegex(TypeError, "tangent_solve output pytree"): + with self.assertRaisesRegex( + TypeError, re.escape("tangent_solve() output pytree")): api.jvp(dummy_root_usage, (0.0,), (0.0,)) From 4b53ea25bce0d928a72f31bc695421681e52fe7b Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 16:13:01 -0700 Subject: [PATCH 0103/1053] slightly cleaner --- jax/lax/lax_control_flow.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 22ba7def9b95..b9f5607d1123 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -928,9 +928,7 @@ def _root_jvp( solution_zeros = tuple(_map(ad_util.zeros_like_jaxval, solution)) f_linearized_at_solution = partial( - apply_flat_fun_nokwargs, - lambda *xs: f_jvp(*(params_zeros + xs)), - (tree, tree), + apply_flat_fun_nokwargs, partial(f_jvp, *params_zeros), (tree, tree), ) rhs = tree_unflatten(tree, f_jvp(*(params_dot + solution_zeros))) solution_dot = tree_map( From 41d8a72da302254b30a039d5412af2f17963fd88 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 25 Sep 2019 16:16:01 -0700 Subject: [PATCH 0104/1053] whitespace --- jax/lax/lax_control_flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index b9f5607d1123..a609950a26f9 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -921,7 +921,7 @@ def _root_jvp( # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) unchecked_zeros, f_jvp = api.linearize( - core.jaxpr_as_fun(jaxpr), *(params + solution) + core.jaxpr_as_fun(jaxpr), *(params + solution) ) params_zeros = tuple(_map(ad_util.zeros_like_jaxval, params)) From b24d6cacd3c4c408cd5d19926d346e254127d92a Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Thu, 26 Sep 2019 11:25:51 +0200 Subject: [PATCH 0105/1053] Ensure LU decomposition cache hits in op-by-op --- jax/lax/lax_control_flow.py | 25 ++++++++++++++++--------- jax/lax_linalg.py | 25 +++++++++++++++---------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 4558e47d112f..a01edb99d475 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -79,6 +79,20 @@ class FixedPointError(Exception): pass ### fori_loop and while_loop +@cache() +def _make_fori_cond(upper): + def while_cond_fun(loop_carry): + i, _ = loop_carry + return lax.lt(i, upper) + return while_cond_fun + +@cache() +def _make_fori_body(body_fun): + def while_body_fun(loop_carry): + i, x = loop_carry + return lax.add(i, lax._const(i, 1)), body_fun(i, x) + return while_body_fun + def fori_loop(lower, upper, body_fun, init_val): """Loop from ``lower`` to ``upper`` by reduction to ``while_loop``. @@ -108,15 +122,8 @@ def fori_loop(lower, upper, body_fun, init_val): Returns: Loop value from the final iteration, of type ``a``. """ - def while_cond_fun(loop_carry): - i, _ = loop_carry - return lax.lt(i, upper) - - def while_body_fun(loop_carry): - i, x = loop_carry - return lax.add(i, lax._const(i, 1)), body_fun(i, x) - - _, result = while_loop(while_cond_fun, while_body_fun, (lower, init_val)) + _, result = while_loop(_make_fori_cond(int(upper)), + _make_fori_body(body_fun), (lower, init_val)) return result diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index b7328825005e..a681dbf9f591 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -593,6 +593,17 @@ def _lu_cpu_gpu_translation_rule(getrf_impl, c, operand): _lu_cpu_gpu_translation_rule, cusolver.getrf) +# Define this outside lu_pivots_to_permutation to ensure fori_loop cache hits +def _lu_pivots_body_fn(i, permutation_and_swaps): + permutation, swaps = permutation_and_swaps + batch_dims = swaps.shape[:-1] + j = swaps[..., i] + iotas = np.ix_(*(lax.iota(np.int32, b) for b in batch_dims)) + x = permutation[..., i] + y = permutation[iotas + (j,)] + permutation = ops.index_update(permutation, ops.index[..., i], y) + return ops.index_update(permutation, ops.index[iotas + (j,)], x), swaps + def lu_pivots_to_permutation(swaps, m): """Converts the pivots (row swaps) returned by LU to a permutation. @@ -609,18 +620,12 @@ def lu_pivots_to_permutation(swaps, m): batch_dims = swaps.shape[:-1] k = swaps.shape[-1] - def body_fn(i, permutation): - j = swaps[..., i] - iotas = np.ix_(*(lax.iota(np.int32, b) for b in batch_dims)) - x = permutation[..., i] - y = permutation[iotas + (j,)] - permutation = ops.index_update(permutation, ops.index[..., i], y) - return ops.index_update(permutation, ops.index[iotas + (j,)], x) - permutation = lax.broadcasted_iota(np.int32, batch_dims + (m,), len(batch_dims)) - return lax.fori_loop( - onp.array(0, onp.int32), onp.array(k, onp.int32), body_fn, permutation) + result, _ = lax.fori_loop( + onp.array(0, onp.int32), onp.array(k, onp.int32), _lu_pivots_body_fn, + (permutation, swaps)) + return result # QR decomposition From 806ebd4ed4bab2025b3776908119a1b466e3b962 Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Thu, 26 Sep 2019 13:34:57 +0200 Subject: [PATCH 0106/1053] Fix and test for fori_loop op-by-op caching --- jax/lax/lax_control_flow.py | 19 ++++++++----------- tests/lax_control_flow_test.py | 12 +++++------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index a01edb99d475..da9d53a1090e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -79,18 +79,15 @@ class FixedPointError(Exception): pass ### fori_loop and while_loop -@cache() -def _make_fori_cond(upper): - def while_cond_fun(loop_carry): - i, _ = loop_carry - return lax.lt(i, upper) - return while_cond_fun +def _fori_cond_fun(loop_carry): + i, upper, _ = loop_carry + return lax.lt(i, upper) @cache() -def _make_fori_body(body_fun): +def _fori_body_fun(body_fun): def while_body_fun(loop_carry): - i, x = loop_carry - return lax.add(i, lax._const(i, 1)), body_fun(i, x) + i, upper, x = loop_carry + return lax.add(i, lax._const(i, 1)), upper, body_fun(i, x) return while_body_fun def fori_loop(lower, upper, body_fun, init_val): @@ -122,8 +119,8 @@ def fori_loop(lower, upper, body_fun, init_val): Returns: Loop value from the final iteration, of type ``a``. """ - _, result = while_loop(_make_fori_cond(int(upper)), - _make_fori_body(body_fun), (lower, init_val)) + _, _, result = while_loop(_fori_cond_fun, _fori_body_fun(body_fun), + (lower, upper, init_val)) return result diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 20b68317bdc4..86d94b7f4070 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -300,19 +300,17 @@ def fun(x): self.assertAllClose(ans, expected, check_dtypes=False) def testForiLoopBasic(self): + def body_fun(i, tot): + return lax.add(tot, i) + def count(num): - def body_fun(i, tot): - return lax.add(tot, i) return lax.fori_loop(0, num, body_fun, 0) - cfun = api.jit(count) - self.assertEqual(count(2), 1) - self.assertEqual(count(2), cfun(2)) self.assertEqual(count(3), 3) - self.assertEqual(count(3), cfun(3)) self.assertEqual(count(4), 6) - self.assertEqual(count(4), cfun(4)) + for args_maker in [lambda: [2], lambda: [3], lambda: [4]]: + self._CompileAndCheck(count, args_maker, True) def testForiLoopClosure(self): def count(num): From 57d9fd6ab4608336403e8d98fb4639d19bfb6805 Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Thu, 26 Sep 2019 13:39:35 +0200 Subject: [PATCH 0107/1053] Googly indentation --- jax/lax_linalg.py | 5 ++--- tests/lax_control_flow_test.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index a681dbf9f591..519a083c344f 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -622,9 +622,8 @@ def lu_pivots_to_permutation(swaps, m): permutation = lax.broadcasted_iota(np.int32, batch_dims + (m,), len(batch_dims)) - result, _ = lax.fori_loop( - onp.array(0, onp.int32), onp.array(k, onp.int32), _lu_pivots_body_fn, - (permutation, swaps)) + result, _ = lax.fori_loop(onp.array(0, onp.int32), onp.array(k, onp.int32), + _lu_pivots_body_fn, (permutation, swaps)) return result diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 86d94b7f4070..2a0d395514c7 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -310,7 +310,7 @@ def count(num): self.assertEqual(count(3), 3) self.assertEqual(count(4), 6) for args_maker in [lambda: [2], lambda: [3], lambda: [4]]: - self._CompileAndCheck(count, args_maker, True) + self._CompileAndCheck(count, args_maker, True) def testForiLoopClosure(self): def count(num): From 2206be2952824e81ee910afe33f8fd516a4add10 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 18 Sep 2019 17:21:57 -0700 Subject: [PATCH 0108/1053] Put XLA computation arguments in a tuple if there are many arguments. This works around a TPU issue. This is only done for computations produced by jit or pmap, not primitive or nested computations. --- jax/interpreters/pxla.py | 22 ++++++++++++----- jax/interpreters/xla.py | 53 +++++++++++++++++++++++++++------------- tests/api_test.py | 7 ++++++ tests/pmap_test.py | 11 +++++++++ 4 files changed, 70 insertions(+), 23 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 0bf94e4caae3..130dd2f94523 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -45,7 +45,7 @@ def identity(x): return x -def shard_args(backend, device_ordinals, assignments, axis_size, args): +def shard_args(backend, device_ordinals, assignments, axis_size, tuple_args, args): """Shard an argument data array arg along its leading axis. Args: @@ -79,7 +79,13 @@ def shard_args(backend, device_ordinals, assignments, axis_size, args): bufs = shard_arg_handlers[type(arg)](arg, device_ordinals, assignments, backend=backend) for r, buf in enumerate(bufs): buffers[r][a] = buf + + if tuple_args: + buffers = [[xla.make_tuple(bufs, device_ordinals[r], backend)] + for r, bufs in enumerate(buffers)] + return buffers + shard_arg_handlers = {} shard_arg_handlers[core.Unit] = \ lambda x, ordinals, _, backend=None: [xla.device_put(core.unit, d, backend=backend) for d in ordinals] @@ -167,7 +173,7 @@ def replica_groups(nrep, mesh_spec, mesh_axes): ### the main pmap machinery lowers SPMD jaxprs to multi-replica XLA computations def compile_replicated(jaxpr, backend, axis_name, axis_size, devices, consts, - *abstract_args): + tuple_args, *abstract_args): if devices is None: num_replicas = axis_size * xla.jaxpr_replicas(jaxpr) if num_replicas > xb.device_count(backend): @@ -186,9 +192,10 @@ def compile_replicated(jaxpr, backend, axis_name, axis_size, devices, consts, axis_env = xla.AxisEnv(num_replicas, [axis_name], [axis_size], devices) arg_shapes = list(map(aval_to_xla_shape, abstract_args)) - built_c = xla.jaxpr_computation(jaxpr, backend, axis_env, consts, (), *arg_shapes) + built_c = xla.jaxpr_computation(jaxpr, backend, axis_env, consts, (), arg_shapes, + tuple_args=tuple_args) compiled = built_c.Compile( - arg_shapes, xb.get_compile_options(num_replicas, device_assignment), + compile_options=xb.get_compile_options(num_replicas, device_assignment), backend=xb.get_backend(backend)) return compiled, num_replicas @@ -460,11 +467,14 @@ def dynamic_fun(dummy, *args): results = [handler(None) for handler in handlers] return lambda *_: results else: + # Condense many arguments into single tuple argument to avoid a TPU issue. + tuple_args = len(avals) > 100 compiled, nrep = compile_replicated(jaxpr, backend, axis_name, axis_size, - devices, consts, *avals) + devices, consts, tuple_args, *avals) device_ordinals = compiled.DeviceOrdinals() assignments = assign_shards_to_replicas(nrep, axis_size) - handle_args = partial(shard_args, backend, device_ordinals, assignments, axis_size) + handle_args = partial(shard_args, backend, device_ordinals, assignments, + axis_size, tuple_args) handle_outs = _pvals_to_results_handler(axis_size, nrep, out_pvals) return partial(execute_replicated, compiled, backend, nrep, handle_args, handle_outs) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index ad3621edc622..adcbade99a20 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -134,7 +134,7 @@ def xla_primitive_callable(prim, *abstract_args, **params): handle_result = aval_to_result_handler(aval_out) xla_shapes = tuple(map(aval_to_xla_shape, abstract_args)) built_c = primitive_computation(prim, *xla_shapes, **params) - compiled = built_c.Compile(xla_shapes, xb.get_compile_options(), + compiled = built_c.Compile(compile_options=xb.get_compile_options(), backend=xb.get_backend(backend)) return partial(_execute_compiled_primitive, prim, compiled, backend, handle_result) @@ -190,24 +190,26 @@ def _check_nans(name, xla_shape, buf): msg = "invalid value (nan) encountered in {}" raise FloatingPointError(msg.format(name)) - ### compiling jaxprs -def compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, *abstract_args): +def compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, tuple_args, + *abstract_args): if axis_env.nreps > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") raise ValueError(msg.format(axis_env.nreps, xb.device_count(backend))) arg_shapes = tuple(map(aval_to_xla_shape, abstract_args)) - built_c = jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), *arg_shapes) + built_c = jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes, + tuple_args=tuple_args) device_assignment = (device.id,) if device else None compile_opts = xb.get_compile_options(num_replicas=axis_env.nreps, device_assignment=device_assignment) - return built_c.Compile(arg_shapes, compile_opts, backend=xb.get_backend(backend)) + return built_c.Compile(compile_options=compile_opts, + backend=xb.get_backend(backend)) def build_jaxpr(jaxpr, backend, axis_env, const_vals, *abstract_args): arg_shapes = map(aval_to_xla_shape, abstract_args) - return jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), *arg_shapes) + return jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes) def prefetch(x): if isinstance(x, DeviceArray): @@ -233,12 +235,19 @@ def eqn_literals(eqn): yield v.val def jaxpr_computation(jaxpr, backend, axis_env, const_vals, freevar_shapes, - *arg_shapes): + arg_shapes, tuple_args=False): c = xb.make_computation_builder("jaxpr_computation") # TODO(mattjj): name _map(prefetch, it.chain(const_vals, jaxpr_literals(jaxpr))) consts = _map(c.Constant, const_vals) - freevars = _map(c.ParameterWithShape, freevar_shapes) - args = _map(c.ParameterWithShape, arg_shapes) + if tuple_args: + tuple_shape = xc.Shape.tuple_shape(list(freevar_shapes) + list(arg_shapes)) + tuple_arg = c.ParameterWithShape(tuple_shape) + nfreevars, nargs = len(freevar_shapes), len(arg_shapes) + freevars = [c.GetTupleElement(tuple_arg, i) for i in range(nfreevars)] + args = [c.GetTupleElement(tuple_arg, i + nfreevars) for i in range(nargs)] + else: + freevars = _map(c.ParameterWithShape, freevar_shapes) + args = _map(c.ParameterWithShape, arg_shapes) out_nodes = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, freevars, *args) return c.Build(c.Tuple(*out_nodes)) @@ -377,18 +386,20 @@ def _xla_callable(fun, device, backend, *abstract_args): if FLAGS.jax_log_compiles: print("Compiling {} for args {}.".format(fun.__name__, abstract_args)) pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] + # Condense many arguments into single tuple argument to avoid a TPU issue. + tuple_args = len(abstract_args) > 100 with core.new_master(pe.JaxprTrace, True) as master: jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) assert not env # no subtraces here (though cond might eventually need them) axis_env = AxisEnv(jaxpr_replicas(jaxpr), [], []) compiled = compile_jaxpr(jaxpr, device, backend, axis_env, consts, - *abstract_args) + tuple_args, *abstract_args) del master, consts, jaxpr, env result_handlers = tuple(map(_pval_to_result_handler, pvals)) if axis_env.nreps == 1: - return partial(_execute_compiled, compiled, backend, result_handlers) + return partial(_execute_compiled, compiled, backend, result_handlers, tuple_args) else: - return partial(_execute_replicated, compiled, backend, result_handlers) + return partial(_execute_replicated, compiled, backend, result_handlers, tuple_args) def _pval_to_result_handler(pval): pv, const = pval @@ -397,20 +408,28 @@ def _pval_to_result_handler(pval): else: return aval_to_result_handler(pv) -def _execute_compiled(compiled, backend, handlers, *args): +def _execute_compiled(compiled, backend, handlers, tuple_args, *args): device_num, = compiled.DeviceOrdinals() input_bufs = [device_put(x, device_num, backend=backend) for x in args] + if tuple_args: + input_bufs = [make_tuple(input_bufs, device_num, backend)] out_bufs = compiled.Execute(input_bufs).destructure() if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] -def _execute_replicated(compiled, backend, handlers, *args): - input_bufs = [[device_put(x, i, backend=backend) for x in args] - for i in compiled.DeviceOrdinals()] +def _execute_replicated(compiled, backend, handlers, tuple_args, *args): + input_bufs = [[device_put(x, device_num, backend=backend) for x in args] + for device_num in compiled.DeviceOrdinals()] + if tuple_args: + input_bufs = [[make_tuple(bufs, device_num)] for bufs, device_num in + zip(input_bufs, compiled.DeviceOrdinals())] out_bufs = compiled.ExecutePerReplica(input_bufs)[0].destructure() if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] +def make_tuple(bufs, device_num, backend): + return xb.get_backend(backend).make_tuple(bufs, device_num) + xla_call_p = core.Primitive('xla_call') xla_call_p.multiple_results = True @@ -476,7 +495,7 @@ def f(c, *args, **params): pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, new_params), pvals, instantiate=True) - built_c = jaxpr_computation(jaxpr, backend, axis_env, consts, (), *xla_shapes) + built_c = jaxpr_computation(jaxpr, backend, axis_env, consts, (), xla_shapes) return c.Call(built_c, xla_args) return f diff --git a/tests/api_test.py b/tests/api_test.py index f5a1d6cc71b5..79f8956bdd0a 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -116,6 +116,13 @@ def f(x, y, z): f(1, 2, z=onp.zeros(3)) # doesn't crash + def test_jit_many_args(self): + @jit + def f(args_list): + return sum(args_list) + + self.assertEqual(f(list(range(500))), sum(range(500))) + def test_grad_of_jit(self): side = [] diff --git a/tests/pmap_test.py b/tests/pmap_test.py index e1e3d5c88cb0..f2ca3a01ec09 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -715,6 +715,17 @@ def body(carry, i): expected = onp.linalg.matrix_power(a, 5).dot(b) self.assertAllClose(ans, expected, check_dtypes=False) + def testManyArgs(self): + @pmap + def f(args_list): + return sum(args_list) + + vals = list(range(500)) + ndevices = xla_bridge.device_count() + self.assertAllClose(f(np.array([vals] * ndevices)), + np.array([sum(vals)] * ndevices), + check_dtypes=True) + class PmapWithDevicesTest(jtu.JaxTestCase): From c04f566407157990e5f4adbea81f82cf7b7250fd Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 26 Sep 2019 11:56:22 -0700 Subject: [PATCH 0109/1053] remove extra newline to help copybara --- jax/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/jax/BUILD b/jax/BUILD index 027aeb99dfc8..cb45e1bd87b8 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -71,4 +71,3 @@ py_library( srcs = ["experimental/ode.py"], deps = [":jax"], ) - From dc2ee0de897c3a63cccec1f30c96438580009477 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 19 Sep 2019 11:02:34 -0700 Subject: [PATCH 0110/1053] Add support for multihost pmaps. All participating hosts are assumed to be running the same pmap code. Conceptually, this can be considered a single pmap over an array sharded on its leading pmapped dimension across the hosts. Each host passes its input shard to its pmapped function call, which returns the corresponding output shard (i.e. an array of the same leading dimension size). However, any collective operations will be run across the entire "global" array. If the `devices` argument to pmap is None, the pmap is assumed to be running across all hosts visible to XLA (as returned by jax.host_count()). Each host can pass in an input array of leading dimension size equal to or less than the number of devices local to that host. Note that this doesn't change the current behavior for single-host platforms. If `devices` are specified, the participating hosts are dictated by the devices' host_ids, and each host must pass in an input array of leading dim size equal to the number of local participating devices. Implementation-wise, each host independently compiles the computation, which we assume yields the same executable on all hosts (follow-up work will add more error checking). The hosts must know the global axis size of the sharded array, e.g. to provide the correct replica count to XLA. This is equal to the length of `devices` if specified, but if not, pmap is recursively called (with `devices` specified) to use `psum` to compute the global axis size. --- jax/api.py | 57 +++++++++++++++++++++++++++++++--------- jax/interpreters/pxla.py | 49 ++++++++++++++++++++++++---------- jax/lib/xla_bridge.py | 4 +++ 3 files changed, 83 insertions(+), 27 deletions(-) diff --git a/jax/api.py b/jax/api.py index 9b8756eb3536..3fb31dc83780 100644 --- a/jax/api.py +++ b/jax/api.py @@ -51,7 +51,7 @@ from .util import (unzip2, unzip3, curry, partial, safe_map, safe_zip, WrapHashably, Hashable, prod, split_list) from .lib.xla_bridge import (canonicalize_dtype, device_count, - local_device_count, devices, host_id) + local_device_count, devices, host_id, host_count) from .abstract_arrays import ShapedArray, raise_to_shaped from .interpreters import partial_eval as pe from .interpreters import xla @@ -643,10 +643,23 @@ def pmap(fun, axis_name=None, devices=None, backend=None): pure maps, ``pmap`` enables the use of parallel SPMD collective operations, like all-reduce sum. - The mapped axis size must be less than or equal to the number of XLA devices - available (unless ``devices`` is specified, see below). For nested ``pmap`` - calls, the product of the mapped axis sizes must be less than or equal to the - number of XLA devices. + The mapped axis size must be less than or equal to the number of local XLA + devices available, as returned by ``jax.local_device_count()`` (unless + ``devices`` is specified, see below). For nested ``pmap`` calls, the product + of the mapped axis sizes must be less than or equal to the number of XLA + devices. TODO(skye): support < # local devices on multi-host platforms + + **Multi-host platforms:** On multi-host platforms such as TPU pods, ``pmap`` + is designed to be used in SPMD Python programs, where every host is running + the same Python code such that all hosts run the same pmapped function in the + same order. Each host should still call the pmapped function with mapped axis + size equal to the number of *local* devices (unless ``devices`` is specified, + see below), and an array of the same leading axis size will be returned as + usual. However, any collective operations in ``fun`` will be computed over + *all* participating devices, including those on other hosts, via + device-to-device communication. Conceptually, this can be thought of as + running a pmap over a single array sharded across hosts, where each host + "sees" only its local shard of the input and output. Args: fun: Function to be mapped over argument axes. @@ -654,12 +667,12 @@ def pmap(fun, axis_name=None, devices=None, backend=None): axis so that parallel collectives can be applied. devices: This is an experimental feature and the API is likely to change. Optional, a sequence of Devices to map over. (Available devices can be - retrieved via jax.devices()). If specified, the length of the sequence - must be equal to the size of the mapped axis. Nested ``pmap``s with - ``devices`` specified in either the inner or outer ``pmap`` are not yet - supported. + retrieved via jax.devices()). If specified, the size of the mapped axis + must be equal to the number of local devices in the sequence. Nested + ``pmap`` s with ``devices`` specified in either the inner or outer ``pmap`` + are not yet supported. backend: This is an experimental feature and the API is likely to change. - Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. + Optional, a string representing the xla backend. 'cpu', 'gpu', or 'tpu'. Returns: A parallelized version of ``fun`` with arguments that correspond to those of @@ -721,10 +734,28 @@ def pmap(fun, axis_name=None, devices=None, backend=None): >>> print(doubly_normed.sum((0, 1))) 1.0 + On multi-host platforms, collective operations operate over all devices, + including those those on other hosts. For example, assuming the following code + runs on two hosts with 4 XLA devices each: + + >>> f = lambda x: x + jax.lax.psum(x, axis_name='i') + >>> data = np.arange(4) if jax.host_id() == 0 else np.arange(4,8) + >>> out = pmap(f, axis_name='i')(data) + >>> print(out) + [28 29 30 31] # on host 0 + [32 33 34 35] # on host 1 + + Each host passes in a different length-4 array, corresponding to its 4 local + devices, and the psum operates over all 8 values. Conceptually, the two + length-4 arrays can be thought of as sharded length-16 array (in this example + equivalent to np.arange(8)) that is mapped over, with the length-8 mapped axis + given name 'i'. The pmap call on each host then returns the corresponding + length-4 output shard. + The ``devices`` argument can be used to specify exactly which devices are used - to run the parallel computation. For example, the following code defines - two parallel computations, one which runs on the first six devices and one on - the remaining two: + to run the parallel computation. For example, again assuming a single host + with 8 devices, the following code defines two parallel computations, one + which runs on the first six devices and one on the remaining two: >>> from functools import partial >>> @partial(pmap, axis_name='i', devices=jax.devices()[:6]) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 130dd2f94523..75dc027d8dce 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -22,6 +22,7 @@ import operator as op import threading +from absl import logging import numpy as onp import six from six.moves import reduce @@ -172,32 +173,37 @@ def replica_groups(nrep, mesh_spec, mesh_axes): ### the main pmap machinery lowers SPMD jaxprs to multi-replica XLA computations -def compile_replicated(jaxpr, backend, axis_name, axis_size, devices, consts, - tuple_args, *abstract_args): +def compile_replicated(jaxpr, backend, axis_name, axis_size, global_axis_size, + devices, consts, tuple_args, *abstract_args): + jaxpr_replicas = xla.jaxpr_replicas(jaxpr) + num_local_replicas = axis_size * jaxpr_replicas + num_replicas = global_axis_size * jaxpr_replicas + logging.vlog( + 1, "compile_replicated: axis_size=%d global_axis_size=%d jaxpr_replicas=%d" + % (axis_size, global_axis_size, jaxpr_replicas)) + if devices is None: - num_replicas = axis_size * xla.jaxpr_replicas(jaxpr) if num_replicas > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") raise ValueError(msg.format(num_replicas, xb.device_count(backend))) device_assignment = None else: - assert all(d.host_id == xb.host_id() for d in devices) - if axis_size != len(devices): + assert any(d.host_id == xb.host_id() for d in devices) + if num_replicas != len(devices): raise ValueError("compiling computation that requires %s replicas, " "but %s devices were specified" - % (axis_size, len(devices))) - num_replicas = len(devices) + % (num_replicas, len(devices))) device_assignment = tuple(d.id for d in devices) - axis_env = xla.AxisEnv(num_replicas, [axis_name], [axis_size], devices) + axis_env = xla.AxisEnv(num_replicas, [axis_name], [global_axis_size], devices) arg_shapes = list(map(aval_to_xla_shape, abstract_args)) built_c = xla.jaxpr_computation(jaxpr, backend, axis_env, consts, (), arg_shapes, tuple_args=tuple_args) compiled = built_c.Compile( compile_options=xb.get_compile_options(num_replicas, device_assignment), backend=xb.get_backend(backend)) - return compiled, num_replicas + return compiled, num_local_replicas ### applying parallel primitives in op-by-op Python dispatch @@ -446,9 +452,24 @@ def parallel_callable(fun, backend, axis_name, axis_size, devices, *avals): pvals = [PartialVal((aval, core.unit)) for aval in avals] pval = PartialVal([core.abstract_unit, core.unit]) # dummy value + if devices: + global_axis_size = len(devices) + elif xb.host_count() > 1: + # TODO(skye): relax this constraint or provide functionality for + # automatically passing appropriate `devices`. + if axis_size != xb.local_device_count(): + raise ValueError( + "On multi-host platforms, the input to pmapped functions must have " + "leading axis size equal to the number of local devices if no " + "`devices` argument is specified. Got axis_size=%d, " + "num_local_devices=%d" % (axis_size, xb.local_device_count())) + global_axis_size = xb.device_count() + else: + global_axis_size = axis_size + @lu.wrap_init def dynamic_fun(dummy, *args): - with extend_dynamic_axis_env(axis_name, dummy.trace, axis_size): + with extend_dynamic_axis_env(axis_name, dummy.trace, global_axis_size): return fun.call_wrapped(*args) with core.new_master(JaxprTrace, True) as master: @@ -470,7 +491,8 @@ def dynamic_fun(dummy, *args): # Condense many arguments into single tuple argument to avoid a TPU issue. tuple_args = len(avals) > 100 compiled, nrep = compile_replicated(jaxpr, backend, axis_name, axis_size, - devices, consts, tuple_args, *avals) + global_axis_size, devices, consts, + tuple_args, *avals) device_ordinals = compiled.DeviceOrdinals() assignments = assign_shards_to_replicas(nrep, axis_size) handle_args = partial(shard_args, backend, device_ordinals, assignments, @@ -520,7 +542,7 @@ def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, if axis_env.devices is not None or (axis_env.names and devices is not None): raise ValueError("Nested pmaps with explicit devices argument.") new_env = xla.extend_axis_env(axis_env, axis_name, axis_size) - in_nodes_sharded = list(map(partial(_xla_shard, c, new_env.sizes), in_nodes)) + in_nodes_sharded = list(map(partial(_xla_shard, c), in_nodes)) sharded_outs = xla.jaxpr_subcomp(c, jaxpr, backend, new_env, const_nodes, freevar_nodes, *in_nodes_sharded) outs = [_xla_unshard(c, xla.axis_groups(new_env, axis_name), r) @@ -531,14 +553,13 @@ def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, ad.primitive_transposes[xla_pmap_p] = partial(ad.map_transpose, xla_pmap_p) pe.map_primitives.add(xla_pmap_p) -def _xla_shard(c, sizes, x): +def _xla_shard(c, x): xla_shape = c.GetShape(x) if xla_shape.is_tuple(): assert not xla_shape.tuple_shapes() return x else: dims = list(xla_shape.dimensions()) - assert dims[0] == sizes[-1] start_indices = _xla_shard_start_indices(c, dims[0], len(dims)) return c.Reshape(c.DynamicSlice(x, start_indices, [1] + dims[1:]), None, dims[1:]) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 75850a9ab70c..a23fce90e0e6 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -197,6 +197,10 @@ def host_id(backend=None): return get_backend(backend).host_id() +def host_count(): + return len(set(d.host_id for d in devices())) + + ### utility functions @util.memoize From 796d369efa441400b89ce1c6eea03f2f9420e77d Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 26 Sep 2019 14:51:24 -0700 Subject: [PATCH 0111/1053] Remove licenses() rule comment in BUILD files. Internal tooling doesn't like it. --- jax/BUILD | 2 +- jax/tools/BUILD | 2 +- jaxlib/BUILD | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/BUILD b/jax/BUILD index cb45e1bd87b8..29af5e039209 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -14,7 +14,7 @@ # JAX is Autograd and XLA -licenses(["notice"]) # Apache 2 +licenses(["notice"]) package(default_visibility = ["//visibility:public"]) diff --git a/jax/tools/BUILD b/jax/tools/BUILD index de37400bc6e1..386531605e20 100644 --- a/jax/tools/BUILD +++ b/jax/tools/BUILD @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -licenses(["notice"]) # Apache 2 +licenses(["notice"]) package(default_visibility = ["//visibility:public"]) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index 954cd1040954..3c0487e3d947 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -17,7 +17,7 @@ load("@org_tensorflow//tensorflow/core/platform:default/build_config.bzl", "pyx_library") load("@org_tensorflow//tensorflow:tensorflow.bzl", "pybind_extension") -licenses(["notice"]) # Apache 2 +licenses(["notice"]) package(default_visibility = ["//visibility:public"]) From 226c9e9cd1735f66954610cf3d41f84e77ccf8a2 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 26 Sep 2019 17:10:49 -0700 Subject: [PATCH 0112/1053] nanmean fix --- jax/numpy/lax_numpy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 2c7026c66d22..ee5ffadee305 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1232,11 +1232,11 @@ def nan_reduction(a, axis=None, out=None, keepdims=False, **kwargs): def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): if out is not None: raise ValueError("nanmean does not support the `out` argument.") - if (onp.issubdtype(lax._dtype(a), onp.bool_) or - onp.issubdtype(lax._dtype(a), onp.integer)): + if (onp.issubdtype(_dtype(a), onp.bool_) or + onp.issubdtype(_dtype(a), onp.integer)): return mean(a, axis, dtype, out, keepdims) if dtype is None: - dtype = lax._dtype(a) + dtype = _dtype(a) nan_mask = logical_not(isnan(a)) normalizer = sum(nan_mask, axis=axis, dtype=int32, keepdims=keepdims) normalizer = lax.convert_element_type(normalizer, dtype) From 01f81875623d7548402d0224703a70e9052492b5 Mon Sep 17 00:00:00 2001 From: Xiayun Sun Date: Fri, 27 Sep 2019 17:00:38 +0100 Subject: [PATCH 0113/1053] [Issue1379] convert number predicates to boolean (#1395) * convert number predicates to boolean by checking whether they are equal to zero * one more test * try relative import for python 2.7 * try fixing circular import in python 2.7 take 2 * simplify test; add test for wrong type * more comprehensive tests; block collection type * use numpy to avoid recursive imports --- jax/lax/lax_control_flow.py | 14 ++++++++++++++ tests/lax_control_flow_test.py | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index da9d53a1090e..cd8d9022125c 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -290,7 +290,21 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): return true_fun(true_operand) else: return false_fun(false_operand) + + Pred has to be a scalar type, collection types (list, tuple) are not supported + """ + + if len(onp.shape(pred)) != 0: + raise TypeError("Pred must be a scalar, got {} of shape {}".format(pred, onp.shape(pred))) + + pred_dtype = onp.result_type(pred) + if pred_dtype.kind != 'b': + if pred_dtype.kind in 'iuf': + pred = pred != 0 + else: + msg = ("Pred type must be either boolean or number, got {}") + raise TypeError(msg.format(pred_dtype)) true_ops, true_tree = tree_flatten((true_operand,)) true_avals = tuple(_map(_abstractify, true_ops)) true_jaxpr, true_consts, out_tree = _initial_style_jaxpr(true_fun, true_tree, true_avals) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 2a0d395514c7..fe2039b8c218 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -414,6 +414,25 @@ def false_fun(x): self.assertEqual(fun(4), cfun(4)) self.assertEqual(fun(4), (8, 16)) + def testIssue1379(self): + + def fun(pred): + return lax.cond(pred, pred, lambda x: (True, x), pred, lambda x: (False, x)) + + @api.jit + def cfun(pred): + return fun(pred) + + self.assertEqual(fun(0), cfun(0), (False,0)) + self.assertEqual(fun(0.), cfun(0.), (False,0.)) + self.assertEqual(fun(1), cfun(1), (True,1)) + self.assertEqual(fun(1.), cfun(1.), (True,1.)) + + # test that proper errors are raised for wrong types + for pred in ["abc", [], [1,2]]: + for f in [fun, cfun]: + self.assertRaises(TypeError, f, pred) + def testNestedCond(self): def fun(x): if x < 2: From b82673dcdbd4472b0a531a8918f4fd1e3f6e1eef Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Fri, 27 Sep 2019 12:11:18 -0400 Subject: [PATCH 0114/1053] add check_dtypes --- tests/nn_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/nn_test.py b/tests/nn_test.py index 0dfeed05d9d4..88894ab86408 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -35,4 +35,4 @@ def testSoftplusGrad(self): check_grads(nn.softplus, (1e-8,), 4) def testSoftplusValue(self): val = nn.softplus(89.) - self.assertAllClose(val, 89.) + self.assertAllClose(val, 89., check_dtypes=False) From d6a9202c38ad34bad989335f80caabf71511d261 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 27 Sep 2019 11:17:55 -0700 Subject: [PATCH 0115/1053] test_util._cast_to_shape fix --- jax/test_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/test_util.py b/jax/test_util.py index b02180b437f7..15b284e171de 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -241,7 +241,7 @@ def _cast_to_shape(value, shape, dtype): """Casts `value` to the correct Python type for `shape` and `dtype`.""" if shape is NUMPY_SCALAR_SHAPE: # explicitly cast to NumPy scalar in case `value` is a Python scalar. - return dtype(value) + return onp.dtype(dtype).type(value) elif shape is PYTHON_SCALAR_SHAPE: # explicitly cast to Python scalar via https://stackoverflow.com/a/11389998 return onp.asarray(value).item() From 840effccd0de8490dcb0f4e5a42d9d0d97469ac7 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 27 Sep 2019 11:27:24 -0700 Subject: [PATCH 0116/1053] nanmean + nanprod only work on floating-point types. --- tests/lax_numpy_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 32ea9f8fc1fb..0992f65be209 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -189,8 +189,8 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("sum", 1, number_dtypes, all_shapes, jtu.rand_default(), []), op_record("var", 1, number_dtypes, nonempty_shapes, jtu.rand_default(), []), op_record("std", 1, inexact_dtypes, nonempty_shapes, jtu.rand_default(), []), - op_record("nanmean", 1, number_dtypes, nonempty_shapes, jtu.rand_some_nan(), []), - op_record("nanprod", 1, number_dtypes, all_shapes, jtu.rand_some_nan(), []), + op_record("nanmean", 1, inexact_dtypes, nonempty_shapes, jtu.rand_some_nan(), []), + op_record("nanprod", 1, inexact_dtypes, all_shapes, jtu.rand_some_nan(), []), op_record("nansum", 1, number_dtypes, all_shapes, jtu.rand_some_nan(), []), ] From 03793a8a87fc69d70fb500f72aba21264447b629 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 27 Sep 2019 11:50:21 -0700 Subject: [PATCH 0117/1053] Fix pmap error message. --- jax/interpreters/pxla.py | 9 +++++++++ tests/pmap_test.py | 10 ++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 75dc027d8dce..2a49b52d1103 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -190,6 +190,15 @@ def compile_replicated(jaxpr, backend, axis_name, axis_size, global_axis_size, device_assignment = None else: assert any(d.host_id == xb.host_id() for d in devices) + local_devices = [d for d in devices if d.host_id == xb.host_id()] + assert len(local_devices) > 0 + if num_local_replicas != len(local_devices): + local_devices_str = ", ".join(map(str, local_devices)) + raise ValueError( + "Leading axis size of input to pmapped function must equal the " + "number of local devices passed to pmap. Got axis_size=%d, " + "num_local_devices=%d.\n(Local devices passed to pmap: %s)" + % (axis_size, len(local_devices), local_devices_str)) if num_replicas != len(devices): raise ValueError("compiling computation that requires %s replicas, " "but %s devices were specified" diff --git a/tests/pmap_test.py b/tests/pmap_test.py index f2ca3a01ec09..46726c8ffba5 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -769,13 +769,15 @@ def testBadAxisSizeError(self): f = pmap(lambda x: lax.psum(x, 'i'), axis_name='i', devices=xla_bridge.devices()) with self.assertRaisesRegex( - ValueError, r"compiling computation that requires 1 replicas, " - r"but \d+ devices were specified"): + ValueError, r"Leading axis size of input to pmapped function must " + r"equal the number of local devices passed to pmap. Got axis_size=1, " + r"num_local_devices=\d."): f(np.ones(1)) with self.assertRaisesRegex( - ValueError, r"compiling computation that requires \d+ replicas, " - r"but \d+ devices were specified"): + ValueError, r"Leading axis size of input to pmapped function must " + r"equal the number of local devices passed to pmap. Got axis_size=\d, " + r"num_local_devices=\d."): f(np.ones(xla_bridge.device_count() + 1)) def testNestedPmapsError(self): From 9d4a158485a3d9d6296044e52af5fd8b5bf58b33 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 27 Sep 2019 12:47:39 -0700 Subject: [PATCH 0118/1053] tweak comment in lax.root --- jax/lax/lax_control_flow.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 37054bfccdb1..c9d6d5a85ee8 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -935,9 +935,15 @@ def _root_jvp( params_dot = tangents[:num_consts] - # F(u(m), m) = 0 # system of equations in m - # ∂_0 F(u(m), m) ∂ u(m) + ∂_1 F(u(m), m) = 0 - # ∂ u(m) = - (∂_0 F(u*, m))^{-1} ∂_1 F(u*, m) + # F(m, u) = 0 # system of equations in u, parameterized by m + # # solution is u*(m) defined in a neighborhood + # F(m, u*(m)) = 0 # satisfied in a neighborhood + # + # ∂_0 F(m, u*(m)) + ∂_1 F(m, u*(m)) ∂ u*(m) = 0 # implied by line above + # ∂ u*(m) = - (∂_1 F(m, u*(m)))^{-1} ∂_0 F(m, u*(m)) # rearrange + # + # ∂ u*(m)[v] = - (∂_1 F(m, u*(m)))^{-1} [∂_0 F(m, u*(m))[v]] # jvp + unchecked_zeros, f_jvp = api.linearize( core.jaxpr_as_fun(jaxpr), *(params + solution) ) From 9cf7a0635de9fb8c1d90c86fe71d7230cffa9aa9 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 27 Sep 2019 18:08:55 -0400 Subject: [PATCH 0119/1053] Remove xla_bridge.shape_of and xla_bridge._JaxComputationBuilder.Parameter, which are unused. --- jax/lib/xla_bridge.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index a23fce90e0e6..05a922fc949f 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -244,19 +244,6 @@ def normalize_to_xla_dtypes(val): raise TypeError('Can\'t convert to XLA: {}'.format(val)) -# TODO(mattjj,frostig): try to remove this function -def shape_of(value): - """Given a Python or XLA value, return its canonicalized XLA Shape.""" - if hasattr(value, 'shape') and hasattr(value, 'dtype'): - return Shape.array_shape(canonicalize_dtype(value.dtype), value.shape) - elif onp.isscalar(value): - return shape_of(onp.asarray(value)) - elif isinstance(value, (tuple, list)): - return Shape.tuple_shape(tuple(shape_of(elt) for elt in value)) - else: - raise TypeError('Unexpected type: {}'.format(type(value))) - - class _JaxComputationBuilder(xla_client.ComputationBuilder): """Base class implementing all of JaxComputationBuilder. @@ -271,10 +258,6 @@ def Build(self, *args, **kwargs): return super(_JaxComputationBuilder, self).Build( *args, **kwargs) - def Parameter(self, value, name=None, parameter_num=None): - return super(_JaxComputationBuilder, self).ParameterWithShape( - shape_of(value), name=name, parameter_num=parameter_num) - def NumpyArrayConstant(self, value, canonicalize_types=True): if canonicalize_types: value = normalize_to_xla_dtypes(value) From 9ac5aa1e15dd6d6dbb5a01955ef03885c29fdcb9 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 27 Sep 2019 14:38:16 -0700 Subject: [PATCH 0120/1053] Add jax.local_devices() and jax.host_ids(). --- jax/api.py | 3 ++- jax/lib/xla_bridge.py | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index f78cb598ea5e..6a777822a477 100644 --- a/jax/api.py +++ b/jax/api.py @@ -51,7 +51,8 @@ from .util import (unzip2, unzip3, curry, partial, safe_map, safe_zip, WrapHashably, Hashable, prod, split_list) from .lib.xla_bridge import (canonicalize_dtype, device_count, - local_device_count, devices, host_id, host_count) + local_device_count, devices, local_devices, + host_id, host_ids, host_count) from .abstract_arrays import ShapedArray, raise_to_shaped from .interpreters import partial_eval as pe from .interpreters import xla diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index a23fce90e0e6..0b6b4f1232b6 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -181,6 +181,13 @@ def devices(backend=None): return get_backend(backend).devices() +def local_devices(host_id=None, backend=None): + """Returns a list of devices local to a given host (this host by default).""" + if host_id is None: + host_id = get_backend(backend).host_id() + return [d for d in devices(backend) if d.host_id == host_id] + + def host_id(backend=None): """Returns the integer host ID of this host. @@ -197,8 +204,13 @@ def host_id(backend=None): return get_backend(backend).host_id() -def host_count(): - return len(set(d.host_id for d in devices())) +def host_ids(backend=None): + """Returns a list of all host IDs.""" + return list(set(d.host_id for d in devices(backend))) + + +def host_count(backend=None): + return len(host_ids(backend)) ### utility functions From 1428c11a2c8c661ca5d0b98a4c9282c93395f11c Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 28 Sep 2019 15:05:41 -0400 Subject: [PATCH 0121/1053] Update Jaxlib version to 0.1.29. Bump XLA version. Enable C++14 mode since it is required by the new XLA version. --- WORKSPACE | 6 +++--- build/build.py | 3 +++ jaxlib/version.py | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c4195bef72ae..8c27fabfee5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "8b5004b7b1ef3f744b0f1bd9e923b341124fbe0254891c69604e9fa5f1387575", - strip_prefix = "tensorflow-5f37c0d18df74af37ab880c8762d35d7f49d9583", + sha256 = "11482f1f97c35df67bd74423bc9d0cb6cdb379d74f42533ee8def94e874af842", + strip_prefix = "tensorflow-3697b7d60268ae525f74e0040c86305f99e12bb3", urls = [ - "https://github.com/tensorflow/tensorflow/archive/5f37c0d18df74af37ab880c8762d35d7f49d9583.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/3697b7d60268ae525f74e0040c86305f99e12bb3.tar.gz", ], ) diff --git a/build/build.py b/build/build.py index da0fabc39e10..3d54f9212026 100755 --- a/build/build.py +++ b/build/build.py @@ -190,6 +190,9 @@ def check_bazel_version(bazel_path, min_version, max_version): build --spawn_strategy=standalone build --strategy=Genrule=standalone + +build --cxxopt=-std=c++14 +build --host_cxxopt=-std=c++14 """ diff --git a/jaxlib/version.py b/jaxlib/version.py index ed85395c6c54..5cee11cd83cc 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.28" +__version__ = "0.1.29" From 7a96e50277189cd15a8a0c0a89dc6391319e0e14 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 28 Sep 2019 18:42:52 -0400 Subject: [PATCH 0122/1053] Update README to point to jaxlib 0.1.29. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5cd57aba43e2..532a35ad87bd 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.28-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.29-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From 9bd7330e1f8937637a9c6b01047ae37fe3e57f4c Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 30 Sep 2019 11:00:02 -0700 Subject: [PATCH 0123/1053] Notebooks on RTD (#1121) --- .gitignore | 1 + docs/conf.py | 76 + docs/index.rst | 10 +- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 2329 ++++++++++++++++ docs/notebooks/autodiff_cookbook.ipynb | 1545 +++++++++++ .../notebooks}/quickstart.ipynb | 45 +- docs/requirements.txt | 4 +- notebooks/Common_Gotchas_in_JAX.ipynb | 2355 ----------------- notebooks/autodiff_cookbook.ipynb | 1542 ----------- 9 files changed, 3968 insertions(+), 3939 deletions(-) create mode 100644 docs/notebooks/Common_Gotchas_in_JAX.ipynb create mode 100644 docs/notebooks/autodiff_cookbook.ipynb rename {notebooks => docs/notebooks}/quickstart.ipynb (90%) delete mode 100644 notebooks/Common_Gotchas_in_JAX.ipynb delete mode 100644 notebooks/autodiff_cookbook.ipynb diff --git a/.gitignore b/.gitignore index 63bd9e557089..663be2d9a328 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ build/ dist/ .mypy_cache/ +docs/notebooks/.ipynb_checkpoints/ diff --git a/docs/conf.py b/docs/conf.py index 76eea6e4de90..cbc399c400cf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,6 +59,7 @@ 'sphinx.ext.mathjax', 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', + 'nbsphinx', ] intersphinx_mapping = { @@ -98,6 +99,81 @@ autosummary_generate = True napolean_use_rtype = False +# -- Options for nbsphinx ----------------------------------------------------- + +# Execute notebooks before conversion: 'always', 'never', 'auto' (default) +# TODO(shoyer): switch to executing notebooks as part of the doc build process. +nbsphinx_execute = 'never' + +# Use this kernel instead of the one stored in the notebook metadata: +#nbsphinx_kernel_name = 'python3' + +# List of arguments to be passed to the kernel that executes the notebooks: +# nbsphinx_execute_arguments = [] + +# If True, the build process is continued even if an exception occurs: +#nbsphinx_allow_errors = True + + +# Controls when a cell will time out (defaults to 30; use -1 for no timeout): +#nbsphinx_timeout = 60 + +# Default Pygments lexer for syntax highlighting in code cells: +#nbsphinx_codecell_lexer = 'ipython3' + +# Width of input/output prompts used in CSS: +#nbsphinx_prompt_width = '8ex' + +# If window is narrower than this, input/output prompts are on separate lines: +#nbsphinx_responsive_width = '700px' + +# This is processed by Jinja2 and inserted before each notebook +nbsphinx_prolog = r""" +{% set docname = 'docs/' + env.doc2path(env.docname, base=None) %} + +.. only:: html + + .. role:: raw-html(raw) + :format: html + + .. nbinfo:: + + Interactive online version: + :raw-html:`Open In Colab` + + __ https://github.com/google/jax/blob/ + {{ env.config.release }}/{{ docname }} +""" + +# This is processed by Jinja2 and inserted after each notebook +# nbsphinx_epilog = r""" +# """ + +# Input prompt for code cells. "%s" is replaced by the execution count. +#nbsphinx_input_prompt = 'In [%s]:' + +# Output prompt for code cells. "%s" is replaced by the execution count. +#nbsphinx_output_prompt = 'Out[%s]:' + +# Specify conversion functions for custom notebook formats: +#import jupytext +#nbsphinx_custom_formats = { +# '.Rmd': lambda s: jupytext.reads(s, '.Rmd'), +#} + +# Link or path to require.js, set to empty string to disable +#nbsphinx_requirejs_path = '' + +# Options for loading require.js +#nbsphinx_requirejs_options = {'async': 'async'} + +# mathjax_config = { +# 'TeX': {'equationNumbers': {'autoNumber': 'AMS', 'useLabelIds': True}}, +# } + +# Additional files needed for generating LaTeX/PDF output: +# latex_additional_files = ['references.bib'] + # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for diff --git a/docs/index.rst b/docs/index.rst index 80484ec8093a..a86f5b7c6aa7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -7,6 +7,14 @@ JIT to GPU/TPU, and more. For an introduction to JAX, start at the `JAX GitHub page `_. +.. toctree:: + :maxdepth: 1 + :caption: Tutorials + + notebooks/quickstart + notebooks/autodiff_cookbook + notebooks/Common_Gotchas_in_JAX + .. toctree:: :maxdepth: 1 :caption: Notes @@ -19,7 +27,7 @@ For an introduction to JAX, start at the .. toctree:: :maxdepth: 3 - :caption: Contents + :caption: API documentation jax diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb new file mode 100644 index 000000000000..165cb0e5e118 --- /dev/null +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -0,0 +1,2329 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hjM_sV_AepYf" + }, + "source": [ + "# 🔪 JAX - The Sharp Bits 🔪" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "4k5PVzEo2uJO" + }, + "source": [ + "*levskaya@ mattjj@*\n", + "\n", + "When walking about the countryside of [Italy](https://iaml.it/blog/jax-intro), the people will not hesitate to tell you that __JAX__ has _\"una anima di pura programmazione funzionale\"_.\n", + "\n", + "__JAX__ is a language for __expressing__ and __composing__ __transformations__ of numerical programs. As such it needs to control the _unwanted proliferation_ of __side-effects__ in its programs so that analysis and transformation of its computations remain tractable!\n", + "\n", + "This requires us to write code in a _functional_ style with _explicit_ descriptions of how the state of a program changes, which results in __several important differences__ to how you might be used to programming in Numpy, Tensorflow or Pytorch.\n", + "\n", + "Herein we try to cover the most frequent points of trouble that users encounter when starting out in __JAX__." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "GoK_PCxPeYcy" + }, + "outputs": [], + "source": [ + "import numpy as onp\n", + "from jax import grad, jit\n", + "from jax import lax\n", + "from jax import random\n", + "import jax\n", + "import jax.numpy as np\n", + "import matplotlib as mpl\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib import rcParams\n", + "rcParams['image.interpolation'] = 'nearest'\n", + "rcParams['image.cmap'] = 'viridis'\n", + "rcParams['axes.grid'] = False" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "oBdKtkVW8Lha" + }, + "source": [ + "## 🔪 In-Place Updates" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "JffAqnEW4JEb" + }, + "source": [ + "In Numpy you're used to doing this:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + }, + "colab_type": "code", + "id": "om4xV7_84N9j", + "outputId": "25ed90e1-74f9-420c-ba06-21e5d6a3b58e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "original array:\n", + "[[0. 0. 0.]\n", + " [0. 0. 0.]\n", + " [0. 0. 0.]]\n", + "updated array:\n", + "[[0. 0. 0.]\n", + " [1. 1. 1.]\n", + " [0. 0. 0.]]\n" + ] + } + ], + "source": [ + "numpy_array = onp.zeros((3,3), dtype=np.float32)\n", + "print(\"original array:\")\n", + "print(numpy_array)\n", + "\n", + "# In place, mutating update\n", + "numpy_array[1, :] = 1.0\n", + "print(\"updated array:\")\n", + "print(numpy_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "go3L4x3w4-9p" + }, + "source": [ + "If we try to update a JAX device array in-place, however, we get an __error__! (☉_☉)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 198 + }, + "colab_type": "code", + "id": "2AxeCufq4wAp", + "outputId": "7013374b-041f-4270-db19-cfb4ab992f52" + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "ignored", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# In place update of JAX's array will yield an error!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mjax_array\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: '_FilledConstant' object does not support item assignment" + ] + } + ], + "source": [ + "jax_array = np.zeros((3,3), dtype=np.float32)\n", + "\n", + "# In place update of JAX's array will yield an error!\n", + "jax_array[1, :] = 1.0" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7mo76sS25Wco" + }, + "source": [ + "__What gives?!__ \n", + "\n", + "Allowing mutation of variables in-place makes program analysis and transformation very difficult. JAX requires a pure functional expression of a numerical program. \n", + "\n", + "Instead, JAX offers the _functional_ update functions: __index_update__, __index_add__, __index_min__, __index_max__, and the __index__ helper.\n", + "\n", + "__NB__: _Fancy Indexing_ is __not__ yet supported, but will likely be added to JAX soon.\n", + "\n", + "️⚠️ inside `jit`'d code and `lax.while_loop` or `lax.fori_loop` the __size__ of slices can't be functions of argument _values_ but only functions of argument _shapes_ -- the slice start indices have no such restriction. See the below __Control Flow__ Section for more information on this limitation." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "m5lg1RYq5D9p" + }, + "outputs": [], + "source": [ + "from jax.ops import index, index_add, index_update" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "X2Xjjvd-l8NL" + }, + "source": [ + "### index_update" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "eM6MyndXL2NY" + }, + "source": [ + "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + }, + "colab_type": "code", + "id": "ygUJT49b7BBk", + "outputId": "c1dc7528-4a4a-4ee6-c9a2-c7e39f95ccb1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "original array:\n", + "[[0. 0. 0.]\n", + " [0. 0. 0.]\n", + " [0. 0. 0.]]\n", + "old array unchanged:\n", + "[[0. 0. 0.]\n", + " [0. 0. 0.]\n", + " [0. 0. 0.]]\n", + "new array:\n", + "[[0. 0. 0.]\n", + " [1. 1. 1.]\n", + " [0. 0. 0.]]\n" + ] + } + ], + "source": [ + "jax_array = np.zeros((3, 3))\n", + "print(\"original array:\")\n", + "print(jax_array)\n", + "\n", + "new_jax_array = index_update(jax_array, index[1, :], 1.)\n", + "\n", + "print(\"old array unchanged:\")\n", + "print(jax_array)\n", + "\n", + "print(\"new array:\")\n", + "print(new_jax_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7to-sF8EmC_y" + }, + "source": [ + "### index_add" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "iI5cLY1xMBLs" + }, + "source": [ + "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + }, + "colab_type": "code", + "id": "tsw2svao8FUp", + "outputId": "2492b20d-0b8e-4f61-816d-00b8a08ce29f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "original array:\n", + "[[1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]]\n", + "new array post-addition:\n", + "[[1. 1. 1. 8. 8. 8.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 8. 8. 8.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 8. 8. 8.]]\n" + ] + } + ], + "source": [ + "print(\"original array:\")\n", + "jax_array = np.ones((5, 6))\n", + "print(jax_array)\n", + "\n", + "new_jax_array = index_add(jax_array, index[::2, 3:], 7.)\n", + "print(\"new array post-addition:\")\n", + "print(new_jax_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MUycRNh6e50W" + }, + "source": [ + "## 🔪 Random Numbers" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "O8vvaVt3MRG2" + }, + "source": [ + "> _If all scientific papers whose results are in doubt because of bad \n", + "> `rand()`s were to disappear from library shelves, there would be a \n", + "> gap on each shelf about as big as your fist._ - Numerical Recipes" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Qikt9pPW9L5K" + }, + "source": [ + "### RNGs and State\n", + "You're used to _stateful_ pseudorandom number generators (PRNGs) from numpy and other libraries, which helpfully hide a lot of details under the hood to give you a ready fountain of pseudorandomness:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "rr9FeP41fynt", + "outputId": "180b7c87-7050-4123-dc42-2356da6f14a2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.7117779558041075\n", + "0.014396253746679077\n", + "0.7717174868106601\n" + ] + } + ], + "source": [ + "print(onp.random.random())\n", + "print(onp.random.random())\n", + "print(onp.random.random())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ORMVVGZJgSVi" + }, + "source": [ + "Underneath the hood, numpy uses the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) PRNG to power its pseudorandom functions. The PRNG has a period of $2^{19937-1}$ and at any point can be described by __624 32bit unsigned ints__ and a __position__ indicating how much of this \"entropy\" has been used up." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "7Pyp2ajzfPO2" + }, + "outputs": [], + "source": [ + "onp.random.seed(0)\n", + "rng_state = onp.random.get_state()\n", + "#print(rng_state)\n", + "# --> ('MT19937', array([0, 1, 1812433255, 1900727105, 1208447044,\n", + "# 2481403966, 4042607538, 337614300, ... 614 more numbers..., \n", + "# 3048484911, 1796872496], dtype=uint32), 624, 0, 0.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "aJIxHVXCiM6m" + }, + "source": [ + "This pseudorandom state vector is automagically updated behind the scenes every time a random number is needed, \"consuming\" 2 of the uint32s in the Mersenne twister state vector:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "GAHaDCYafpAF" + }, + "outputs": [], + "source": [ + "_ = onp.random.uniform()\n", + "rng_state = onp.random.get_state()\n", + "#print(rng_state) \n", + "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", + "# ..., 2648828502, 1678096082], dtype=uint32), 2, 0, 0.0)\n", + "\n", + "# Let's exhaust the entropy in this PRNG statevector\n", + "for i in range(311):\n", + " _ = onp.random.uniform()\n", + "rng_state = onp.random.get_state()\n", + "#print(rng_state) \n", + "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", + "# ..., 2648828502, 1678096082], dtype=uint32), 624, 0, 0.0)\n", + "\n", + "# Next call iterates the RNG state for a new batch of fake \"entropy\".\n", + "_ = onp.random.uniform()\n", + "rng_state = onp.random.get_state()\n", + "# print(rng_state) \n", + "# --> ('MT19937', array([1499117434, 2949980591, 2242547484, \n", + "# 4162027047, 3277342478], dtype=uint32), 2, 0, 0.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "N_mWnleNogps" + }, + "source": [ + "The problem with magic PRNG state is that it's hard to reason about how it's being used and updated across different threads, processes, and devices, and it's _very easy_ to screw up when the details of entropy production and consumption are hidden from the end user.\n", + "\n", + "The Mersenne Twister PRNG is also known to have a [number](https://cs.stackexchange.com/a/53475) of problems, it has a large 2.5Kb state size, which leads to problematic [initialization issues](https://dl.acm.org/citation.cfm?id=1276928). It [fails](http://www.pcg-random.org/pdf/toms-oneill-pcg-family-v1.02.pdf) modern BigCrush tests, and is generally slow. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Uvq7nV-j4vKK" + }, + "source": [ + "### JAX PRNG" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "COjzGBpO4tzL" + }, + "source": [ + "\n", + "JAX instead implements an _explicit_ PRNG where entropy production and consumption are handled by explicitly passing and iterating PRNG state. JAX uses a modern [Three-fry counter-based PRNG](https://github.com/google/jax/blob/master/design_notes/prng.md) that's __splittable__. That is, its design allows us to __fork__ the PRNG state into new PRNGs for use with parallel stochastic generation.\n", + "\n", + "The random state is described by two unsigned-int32s that we call a __key__:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "yPHE7KTWgAWs", + "outputId": "6c2db189-d971-4d60-eb6b-c7ee3a4704b7" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0], dtype=uint32)" + ] + }, + "execution_count": 196, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "from jax import random\n", + "key = random.PRNGKey(0)\n", + "key" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "XjYyWYNfq0hW" + }, + "source": [ + "JAX's random functions produce pseudorandom numbers from the PRNG state, but __do not__ change the state! \n", + "\n", + "Reusing the same state will cause __sadness__ and __monotony__, depriving the enduser of __lifegiving chaos__:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "colab_type": "code", + "id": "7zUdQMynoE5e", + "outputId": "9e1e1f08-19c9-4d22-c78f-4d3e113e185d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-0.20584233]\n", + "[0 0]\n", + "[-0.20584233]\n", + "[0 0]\n" + ] + } + ], + "source": [ + "print(random.normal(key, shape=(1,)))\n", + "print(key)\n", + "# No no no!\n", + "print(random.normal(key, shape=(1,)))\n", + "print(key)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hQN9van8rJgd" + }, + "source": [ + "Instead, we __split__ the PRNG to get usable __subkeys__ every time we need a new pseudorandom number:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "ASj0_rSzqgGh", + "outputId": "ea3fae99-6642-4016-b0c0-938214384fe7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "old key [0 0]\n", + " \\---SPLIT --> new key [4146024105 967050713]\n", + " \\--> new subkey [2718843009 1272950319] --> normal [-1.2515389]\n" + ] + } + ], + "source": [ + "print(\"old key\", key)\n", + "key, subkey = random.split(key)\n", + "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", + "print(\" \\---SPLIT --> new key \", key)\n", + "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "tqtFVE4MthO3" + }, + "source": [ + "We propagate the __key__ and make new __subkeys__ whenever we need a new random number:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "jbC34XLor2Ek", + "outputId": "436713d1-06a3-408e-fbaa-1fedeea73c73" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "old key [4146024105 967050713]\n", + " \\---SPLIT --> new key [2384771982 3928867769]\n", + " \\--> new subkey [1278412471 2182328957] --> normal [-0.5866507]\n" + ] + } + ], + "source": [ + "print(\"old key\", key)\n", + "key, subkey = random.split(key)\n", + "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", + "print(\" \\---SPLIT --> new key \", key)\n", + "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "0KLYUluz3lN3" + }, + "source": [ + "We can generate more than one __subkey__ at a time:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "lEi08PJ4tfkX", + "outputId": "7599b43d-930e-4c20-d549-b7694281a59a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-0.37533447]\n", + "[0.9864503]\n", + "[0.1455319]\n" + ] + } + ], + "source": [ + "key, *subkeys = random.split(key, 4)\n", + "for subkey in subkeys:\n", + " print(random.normal(subkey, shape=(1,)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "rg4CpMZ8c3ri" + }, + "source": [ + "## 🔪 Control Flow" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "izLTvT24dAq0" + }, + "source": [ + "### ✔ python control_flow + autodiff ✔\n", + "\n", + "If you just want to apply `grad` to your python functions, you can use regular python control-flow constructs with no problems, as if you were using [Autograd](https://github.com/hips/autograd) (or Pytorch or TF Eager)." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "colab_type": "code", + "id": "aAx0T3F8lLtu", + "outputId": "1f75bb41-2d50-451e-c05d-cb946b580d8d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12.0\n", + "-4.0\n" + ] + } + ], + "source": [ + "def f(x):\n", + " if x < 3:\n", + " return 3. * x ** 2\n", + " else:\n", + " return -4 * x\n", + "\n", + "print(grad(f)(2.)) # ok!\n", + "print(grad(f)(4.)) # ok!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hIfPT7WMmZ2H" + }, + "source": [ + "### python control flow + JIT\n", + "\n", + "Using control flow with `jit` is more complicated, and by default it has more constraints.\n", + "\n", + "This works:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "OZ_BJX0CplNC", + "outputId": "d75b0e66-273d-461a-814d-a95c40d41ef4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24\n" + ] + } + ], + "source": [ + "@jit\n", + "def f(x):\n", + " for i in range(3):\n", + " x = 2 * x\n", + " return x\n", + "\n", + "print(f(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "22RzeJ4QqAuX" + }, + "source": [ + "So does this:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "pinVnmRWp6w6", + "outputId": "f7829934-8cdd-4bba-b540-d9df38c71e95" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.0\n" + ] + } + ], + "source": [ + "@jit\n", + "def g(x):\n", + " y = 0.\n", + " for i in range(x.shape[0]):\n", + " y = y + x[i]\n", + " return y\n", + "\n", + "print(g(np.array([1., 2., 3.])))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "TStltU2dqf8A" + }, + "source": [ + "But this doesn't, at least by default:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + }, + "colab_type": "code", + "id": "9z38AIKclRNM", + "outputId": "f911fb55-f489-4300-f9b1-9142d252f3f9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ERROR: Abstract value passed to `bool`, which requires a concrete value. The function to be transformed can't be traced at the required level of abstraction. If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions instead.\n" + ] + } + ], + "source": [ + "@jit\n", + "def f(x):\n", + " if x < 3:\n", + " return 3. * x ** 2\n", + " else:\n", + " return -4 * x\n", + "\n", + "# This will fail!\n", + "try:\n", + " f(2)\n", + "except Exception as e:\n", + " print(\"ERROR:\", e)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "pIbr4TVPqtDN" + }, + "source": [ + "__What gives!?__\n", + "\n", + "When we `jit`-compile a function, we usually want to compile a version of the function that works for many different argument values, so that we can cache and reuse the compiled code. That way we don't have to re-compile on each function evaluation.\n", + "\n", + "For example, if we evaluate an `@jit` function on the array `np.array([1., 2., 3.], np.float32)`, we might want to compile code that we can reuse to evaluate the function on `np.array([4., 5., 6.], np.float32)` to save on compile time.\n", + "\n", + "To get a view of your Python code that is valid for many different argument values, JAX traces it on _abstract values_ that represent sets of possible inputs. There are [multiple different levels of abstraction](https://github.com/google/jax/blob/master/jax/abstract_arrays.py), and different transformations use different abstraction levels.\n", + "\n", + "By default, `jit` traces your code on the `ShapedArray` abstraction level, where each abstract value represents the set of all array values with a fixed shape and dtype. For example, if we trace using the abstract value `ShapedArray((3,), np.float32)`, we get a view of the function that can be reused for any concrete value in the corresponding set of arrays. That means we can save on compile time.\n", + "\n", + "But there's a tradeoff here: if we trace a Python function on a `ShapedArray((), np.float32)` that isn't committed to a specific concrete value, when we hit a line like `if x < 3`, the expression `x < 3` evaluates to an abstract `ShapedArray((), np.bool_)` that represents the set `{True, False}`. When Python attempts to coerce that to a concrete `True` or `False`, we get an error: we don't know which branch to take, and can't continue tracing! The tradeoff is that with higher levels of abstraction we gain a more general view of the Python code (and thus save on re-compilations), but we require more constraints on the Python code to complete the trace.\n", + "\n", + "The good news is that you can control this tradeoff yourself. By having `jit` trace on more refined abstract values, you can relax the traceability constraints. For example, using the `static_argnums` argument to `jit`, we can specify to trace on concrete values of some arguments. Here's that example function again:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "-Tzp0H7Bt1Sn", + "outputId": "1435a6a3-2b1c-4acd-be81-c1361021f3c4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12.0\n" + ] + } + ], + "source": [ + "def f(x):\n", + " if x < 3:\n", + " return 3. * x ** 2\n", + " else:\n", + " return -4 * x\n", + "\n", + "f = jit(f, static_argnums=(0,))\n", + "\n", + "print(f(2.))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MHm1hIQAvBVs" + }, + "source": [ + "Here's another example, this time involving a loop:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "iwY86_JKvD6b", + "outputId": "469a4aeb-2dbd-4f03-9aef-9fd646a717d7" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(5., dtype=float32)" + ] + }, + "execution_count": 206, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "def f(x, n):\n", + " y = 0.\n", + " for i in range(n):\n", + " y = y + x[i]\n", + " return y\n", + "\n", + "f = jit(f, static_argnums=(1,))\n", + "\n", + "f(np.array([2., 3., 4.]), 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "nSPTOX8DvOeO" + }, + "source": [ + "In effect, the loop gets statically unrolled. JAX can also trace at _higher_ levels of abstraction, like `Unshaped`, but that's not currently the default for any transformation" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "wWdg8LTYwCW3" + }, + "source": [ + "️⚠️ **functions with argument-__value__ dependent shapes**\n", + "\n", + "These control-flow issues also come up in a more subtle way: numerical functions we want to __jit__ can't specialize the shapes of internal arrays on argument _values_ (specializing on argument __shapes__ is ok). As a trivial example, let's make a function whose output happens to depend on the input variable `length`." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "colab_type": "code", + "id": "Tqe9uLmUI_Gv", + "outputId": "dbb43bac-8141-40a3-c760-95656181b598" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4. 4. 4. 4. 4.]\n", + "error! `full` requires shapes to be concrete. If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions instead.\n", + "[4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]\n", + "[4. 4. 4. 4. 4.]\n" + ] + } + ], + "source": [ + "def example_fun(length, val):\n", + " return np.ones((length,)) * val\n", + "# un-jit'd works fine\n", + "print(example_fun(5, 4))\n", + "\n", + "bad_example_jit = jit(example_fun)\n", + "# this will fail:\n", + "try:\n", + " print(bad_example_jit(10, 4))\n", + "except Exception as e:\n", + " print(\"error!\", e)\n", + "# static_argnums tells JAX to recompile on changes at these argument positions:\n", + "good_example_jit = jit(example_fun, static_argnums=(0,))\n", + "# first compile\n", + "print(good_example_jit(10, 4))\n", + "# recompiles\n", + "print(good_example_jit(5, 4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MStx_r2oKxpp" + }, + "source": [ + "`static_argnums` can be handy if `length` in our example rarely changes, but it would be disastrous if it changed a lot! \n", + "\n", + "Lastly, if your function has global side-effects, JAX's tracer can cause weird things to happen. A common gotcha is trying to print arrays inside __jit__'d functions: " + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "m2ABpRd8K094", + "outputId": "06fe7d4e-2c59-4499-c04e-94166916be74" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Traced\n", + "Traced\n" + ] + }, + { + "data": { + "text/plain": [ + "array(4, dtype=int32)" + ] + }, + "execution_count": 12, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "@jit\n", + "def f(x):\n", + " print(x)\n", + " y = 2 * x\n", + " print(y)\n", + " return y\n", + "f(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "uCDcWG4MnVn-" + }, + "source": [ + "### Structured control flow primitives\n", + "\n", + "There are more options for control flow in JAX. Say you want to avoid re-compilations but still want to use control flow that's traceable, and that avoids un-rolling large loops. then you can use these 4 structured control flow primitives:\n", + "\n", + " - `lax.cond` _will be differentiable soon_\n", + " - `lax.while_loop` __non-differentiable__*\n", + " - `lax.fori_loop` __non-differentiable__*\n", + " - `lax.scan` _will be differentiable soon_\n", + "\n", + "*_these can in principle be made to be __forward__-differentiable, but this isn't on the current roadmap._" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Sd9xrLMXeK3A" + }, + "source": [ + "#### cond\n", + "python equivalent:\n", + "\n", + "```\n", + "def cond(pred, true_operand, true_fun, false_operand, false_fun):\n", + " if pred:\n", + " return true_fun(true_operand)\n", + " else:\n", + " return false_fun(false_operand)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "SGxz9JOWeiyH", + "outputId": "b91c6e01-c3a7-41a0-b4d2-f815f273c8a7" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.], dtype=float32)" + ] + }, + "execution_count": 207, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "from jax import lax\n", + "\n", + "operand = np.array([0.])\n", + "lax.cond(True, operand, lambda x: x+1, operand, lambda x: x-1)\n", + "# --> array([1.], dtype=float32)\n", + "lax.cond(False, operand, lambda x: x+1, operand, lambda x: x-1)\n", + "# --> array([-1.], dtype=float32)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "xkOFAw24eOMg" + }, + "source": [ + "#### while_loop\n", + "\n", + "python equivalent:\n", + "```\n", + "def while_loop(cond_fun, body_fun, init_val):\n", + " val = init_val\n", + " while cond_fun(val):\n", + " val = body_fun(val)\n", + " return val\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "jM-D39a-c436", + "outputId": "496ba1d8-e1d9-4432-d44b-c1104e1e966d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(10, dtype=int32)" + ] + }, + "execution_count": 208, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "init_val = 0\n", + "cond_fun = lambda x: x<10\n", + "body_fun = lambda x: x+1\n", + "lax.while_loop(cond_fun, body_fun, init_val)\n", + "# --> array(10, dtype=int32)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "apo3n3HAeQY_" + }, + "source": [ + "#### fori_loop\n", + "python equivalent:\n", + "```\n", + "def fori_loop(start, stop, body_fun, init_val):\n", + " val = init_val\n", + " for i in range(start, stop):\n", + " val = body_fun(i, val)\n", + " return val\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "dt3tUpOmeR8u", + "outputId": "3155b3ce-589c-437c-a456-de81b3db0a64" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(45, dtype=int32)" + ] + }, + "execution_count": 209, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "init_val = 0\n", + "start = 0\n", + "stop = 10\n", + "body_fun = lambda i,x: x+i\n", + "lax.fori_loop(start, stop, body_fun, init_val)\n", + "# --> array(45, dtype=int32)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "SipXS5qiqk8e" + }, + "source": [ + "#### Summary\n", + "\n", + "$$\n", + "\\begin{array} {r|rr} \n", + "\\hline \\\n", + "\\textrm{construct} \n", + "& \\textrm{jit} \n", + "& \\textrm{grad} \\\\\n", + "\\hline \\\n", + "\\textrm{if} & ❌ & ✔ \\\\\n", + "\\textrm{for} & ✔* & ✔\\\\\n", + "\\textrm{while} & ✔* & ✔\\\\\n", + "\\textrm{lax.cond} & ✔ & \\textrm{soon!}\\\\\n", + "\\textrm{lax.while_loop} & ✔ & ❌\\\\\n", + "\\textrm{lax.fori_loop} & ✔ & ❌\\\\\n", + "\\textrm{lax.scan} & \\textrm{soon!} & \\textrm{soon!}\\\\\n", + "\\hline\n", + "\\end{array}\n", + "$$\n", + "
$\\ast$ = argument-__value__-independent loop condition - unrolls the loop
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "bxuUjFVG-v1h" + }, + "source": [ + "## 🔪 Convolutions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "0pcn2LeS-03b" + }, + "source": [ + "JAX and XLA offer the very general N-dimensional __conv_general_dilated__ function, but it's not very obvious how to use it. We'll give some examples of the common use-cases. There are also the convenience functions `lax.conv` and `lax.conv_general_padding` for the most common kinds of convolutions.\n", + "\n", + "A survey of the family of convolutional operators, [a guide to convolutional arithmetic](https://arxiv.org/abs/1603.07285) is highly recommended reading!\n", + "\n", + "Let's define a simple diagonal edge kernel:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + }, + "colab_type": "code", + "id": "Yud1Y3ss-x1K", + "outputId": "1674482b-501a-43eb-91c6-0bef42a73d6d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Edge Conv kernel:\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAADe5JREFUeJzt3X+snmV9x/H3Zy1gJkwqJdKUKj+j\nc24GPEGUxTRDEySGLpEl8IeC0XQ4yZRoMtQEE5Nl6h8uYxpJA0RYDDaCgeNSQ2DAcFmKVFIohSCF\nuLS1EyyuyHSysu/+ODfm8XB+9Xru8zzP0fcrefJc931f576+vdp8ev9sU1VI0pH6vXEXIGllMjwk\nNTE8JDUxPCQ1MTwkNTE8JDUZKjySvDbJXUme7L7XzNPvpSQ7u8/0MGNKmgwZ5jmPJF8CnquqLyS5\nGlhTVX8zR78XqurYIeqUNGGGDY8ngI1VdSDJOuC+qnrjHP0MD+m3zLDh8V9VdXzXDvCzl5dn9TsM\n7AQOA1+oqtvn2d9mYDPAq38/b3vTGUc31ybt+tmJ4y5h4r24d99Pq6ppolYv1iHJ3cBJc2z67OBC\nVVWS+ZLoDVW1P8lpwD1JdlXVU7M7VdUWYAvA1FtfVd+/c8OivwBpPqdvvWLcJUy8H33iU//R+rOL\nhkdVvXu+bUl+kmTdwGnLM/PsY3/3/XSS+4CzgFeEh6SVY9hbtdPAZV37MuCO2R2SrElyTNdeC5wH\nPDbkuJLGbNjw+ALwniRPAu/ulkkyleT6rs8fAjuSPAzcy8w1D8NDWuEWPW1ZSFUdBM6fY/0O4CNd\n+9+BPx5mHEmTxydMJTUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwk\nNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1\nMTwkNeklPJJckOSJJHuSXD3H9mOSbO22P5DklD7GlTQ+Q4dHklXAV4H3Am8GLk3y5lndPgz8rKrO\nAP4e+OKw40oarz6OPM4B9lTV01X1IvBNYNOsPpuAm7r2rcD5SdLD2JLGpI/wWA/sHVje162bs09V\nHQYOASf0MLakMZmoC6ZJNifZkWTHswdfGnc5khbQR3jsBzYMLJ/crZuzT5LVwGuAg7N3VFVbqmqq\nqqZOPGFVD6VJWi59hMeDwJlJTk1yNHAJMD2rzzRwWde+GLinqqqHsSWNyephd1BVh5NcCdwJrAJu\nrKrdST4P7KiqaeAG4J+S7AGeYyZgJK1gQ4cHQFVtA7bNWnfNQPt/gL/oYyxJk2GiLphKWjkMD0lN\nDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0M\nD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU16CY8kFyR5Isme\nJFfPsf3yJM8m2dl9PtLHuJLGZ/WwO0iyCvgq8B5gH/BgkumqemxW161VdeWw40maDH0ceZwD7Kmq\np6vqReCbwKYe9itpgg195AGsB/YOLO8D3j5Hv/cneRfwQ+Cqqto7u0OSzcBmgNev76O0316nb71i\n3CVMvDOu2j7uEibej4b42VFdMP0OcEpV/QlwF3DTXJ2qaktVTVXV1IknrBpRaZJa9BEe+4ENA8sn\nd+t+raoOVtWvusXrgbf1MK6kMeojPB4EzkxyapKjgUuA6cEOSdYNLF4EPN7DuJLGaOgLC1V1OMmV\nwJ3AKuDGqtqd5PPAjqqaBv46yUXAYeA54PJhx5U0Xr1clayqbcC2WeuuGWh/Gvh0H2NJmgw+YSqp\nieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ\n4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIalJL+GR5MYkzyR5\ndJ7tSXJtkj1JHklydh/jShqfvo48vg5csMD29wJndp/NwNd6GlfSmPQSHlV1P/DcAl02ATfXjO3A\n8UnW9TG2pPEY1TWP9cDegeV93brfkGRzkh1Jdjx78KURlSapxURdMK2qLVU1VVVTJ56watzlSFrA\nqMJjP7BhYPnkbp2kFWpU4TENfLC763IucKiqDoxobEnLYHUfO0lyC7ARWJtkH/A54CiAqroO2AZc\nCOwBfgF8qI9xJY1PL+FRVZcusr2Aj/UxlqTJMFEXTCWtHIaHpCaGh6QmhoekJoaHpCaGh6Qmhoek\nJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6Qm\nhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmvYRHkhuTPJPk0Xm2b0xyKMnO7nNNH+NKGp9e/qNr4OvA\nV4CbF+jzvap6X0/jSRqzXo48qup+4Lk+9iVpZejryGMp3pHkYeDHwKeqavfsDkk2A5sBVq1Zw+lb\nrxhheSvLGVdtH3cJ+h03qgumDwFvqKq3Av8I3D5Xp6raUlVTVTW16thXj6g0SS1GEh5V9XxVvdC1\ntwFHJVk7irElLY+RhEeSk5Kka5/TjXtwFGNLWh69XPNIcguwEVibZB/wOeAogKq6DrgY+GiSw8Av\ngUuqqvoYW9J49BIeVXXpItu/wsytXEm/JXzCVFITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NS\nE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1IT\nw0NSE8NDUhPDQ1ITw0NSE8NDUpOhwyPJhiT3Jnksye4kH5+jT5Jcm2RPkkeSnD3suJLGq4//6Pow\n8MmqeijJccAPktxVVY8N9HkvcGb3eTvwte5b0go19JFHVR2oqoe69s+Bx4H1s7ptAm6uGduB45Os\nG3ZsSePT6zWPJKcAZwEPzNq0Htg7sLyPVwaMpBWkt/BIcixwG/CJqnq+cR+bk+xIsuOlF/67r9Ik\nLYNewiPJUcwExzeq6ttzdNkPbBhYPrlb9xuqaktVTVXV1KpjX91HaZKWSR93WwLcADxeVV+ep9s0\n8MHursu5wKGqOjDs2JLGp4+7LecBHwB2JdnZrfsM8HqAqroO2AZcCOwBfgF8qIdxJY3R0OFRVf8G\nZJE+BXxs2LEkTQ6fMJXUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTw\nkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ\n1MTwkNTE8JDUZOjwSLIhyb1JHkuyO8nH5+izMcmhJDu7zzXDjitpvFb3sI/DwCer6qEkxwE/SHJX\nVT02q9/3qup9PYwnaQIMfeRRVQeq6qGu/XPgcWD9sPuVNNlSVf3tLDkFuB94S1U9P7B+I3AbsA/4\nMfCpqto9x89vBjZ3i28BHu2tuH6sBX467iIGWM/CJq0emLya3lhVx7X8YG/hkeRY4F+Bv62qb8/a\n9gfA/1XVC0kuBP6hqs5cZH87qmqql+J6Mmk1Wc/CJq0emLyahqmnl7stSY5i5sjiG7ODA6Cqnq+q\nF7r2NuCoJGv7GFvSePRxtyXADcDjVfXlefqc1PUjyTnduAeHHVvS+PRxt+U84APAriQ7u3WfAV4P\nUFXXARcDH01yGPglcEktfr60pYfa+jZpNVnPwiatHpi8mprr6fWCqaTfHT5hKqmJ4SGpycSER5LX\nJrkryZPd95p5+r008Jj79DLUcUGSJ5LsSXL1HNuPSbK12/5A92zLslpCTZcneXZgXj6yjLXcmOSZ\nJHM+g5MZ13a1PpLk7OWq5QhqGtnrEUt8XWOkc7Rsr5BU1UR8gC8BV3ftq4EvztPvhWWsYRXwFHAa\ncDTwMPDmWX3+Criua18CbF3meVlKTZcDXxnR79O7gLOBR+fZfiHwXSDAucADE1DTRuCfRzQ/64Cz\nu/ZxwA/n+P0a6RwtsaYjnqOJOfIANgE3de2bgD8fQw3nAHuq6umqehH4ZlfXoME6bwXOf/k29Bhr\nGpmquh94boEum4Cba8Z24Pgk68Zc08jU0l7XGOkcLbGmIzZJ4fG6qjrQtf8TeN08/V6VZEeS7Un6\nDpj1wN6B5X28cpJ/3aeqDgOHgBN6ruNIawJ4f3cIfGuSDctYz2KWWu+ovSPJw0m+m+SPRjFgd0p7\nFvDArE1jm6MFaoIjnKM+nvNYsiR3AyfNsemzgwtVVUnmu4f8hqran+Q04J4ku6rqqb5rXWG+A9xS\nVb9K8pfMHBn92ZhrmiQPMfPn5uXXI24HFnw9Yljd6xq3AZ+ogfe8xmmRmo54jkZ65FFV766qt8zx\nuQP4ycuHbt33M/PsY3/3/TRwHzMp2pf9wODf2id36+bsk2Q18BqW92nZRWuqqoNV9atu8XrgbctY\nz2KWMocjVSN+PWKx1zUYwxwtxyskk3TaMg1c1rUvA+6Y3SHJmiTHdO21zDzdOvvfDRnGg8CZSU5N\ncjQzF0Rn39EZrPNi4J7qrjgtk0VrmnW+fBEz57TjMg18sLujcC5waOB0dCxG+XpEN86Cr2sw4jla\nSk1NczSKK9BLvCJ8AvAvwJPA3cBru/VTwPVd+53ALmbuOOwCPrwMdVzIzNXop4DPdus+D1zUtV8F\nfAvYA3wfOG0Ec7NYTX8H7O7m5V7gTctYyy3AAeB/mTlX/zBwBXBFtz3AV7tadwFTI5ifxWq6cmB+\ntgPvXMZa/hQo4BFgZ/e5cJxztMSajniOfDxdUpNJOm2RtIIYHpKaGB6SmhgekpoYHpKaGB6Smhge\nkpr8P9IpB0Tn+nMHAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "# 2D kernel - HWIO layout\n", + "kernel = onp.zeros((3, 3, 3, 3), dtype=np.float32)\n", + "kernel += onp.array([[1, 1, 0],\n", + " [1, 0,-1],\n", + " [0,-1,-1]])[:, :, onp.newaxis, onp.newaxis]\n", + "\n", + "print(\"Edge Conv kernel:\")\n", + "plt.imshow(kernel[:, :, 0, 0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "dITPaPdh_cMI" + }, + "source": [ + "And we'll make a simple synthetic image:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + }, + "colab_type": "code", + "id": "cpbGsIGa_Qyx", + "outputId": "44f0c042-3c74-4f39-9ed2-cd651cbc13fc" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original Image:\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "# NHWC layout\n", + "img = onp.zeros((1, 200, 198, 3), dtype=np.float32)\n", + "for k in range(3):\n", + " x = 30 + 60*k\n", + " y = 20 + 60*k\n", + " img[0, x:x+10, y:y+10, k] = 1.0\n", + "\n", + "print(\"Original Image:\")\n", + "plt.imshow(img[0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_m90y74OWorG" + }, + "source": [ + "### lax.conv and lax.conv_with_general_padding" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Pv9_QPDnWssM" + }, + "source": [ + "These are the simple convenience functions for convolutions\n", + "\n", + "️⚠️ The convenience `lax.conv`, `lax.conv_with_general_padding` helper function assume __NCHW__ images and __IOHW__ kernels." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "kppxbxpZW0nb", + "outputId": "2c872f2b-b71a-4821-d870-0b3a4f1eeee9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 3, 200, 198)\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAJCCAYAAAAlTAh6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGXdJREFUeJzt3X+spndZ5/HPtTPaxKmbtjvdpkKh\nhZQGNd2CYyVRCLtIbYmh4h/Qxigq2UICxGZNFDRZiImJq1a7ullMCQ2Q1AIuVhvTKl3WlWxilSk2\nY6EMTLEN0x3aDgWxxbB2uPaPc81wZjjTDnPOc55hzuuVnJz7+T4/7u/cuc/0Pff3eU6ruwMAQPKv\nlj0BAIBThTACABjCCABgCCMAgCGMAACGMAIAGMIIAGAsLIyq6sqq2ltV+6rqbYvaDwDARqlF/ILH\nqtqW5DNJXplkf5KPJ7m2uz+14TsDANgg2xf0upcn2dfdn0uSqvpAkquTrBlG287c0dvPOWdBUwEA\ntrKnHn88h554sk7ksYsKo2cl+fyq2/uT/NBxJ3HOOfmeX7x+QVMBALay/3vDjSf82KW9+bqqrquq\n3VW1+9ATTy5rGgAARywqjB5OcsGq28+esSO6+6bu3tXdu7aduWNB0wAAOHGLCqOPJ7m4qi6qqu9M\nck2S2xe0LwCADbGQ9xh191NV9ZYkf5FkW5Kbu/uTi9gXAMBGWdSbr9PddyS5Y1GvDwCw0fzmawCA\nIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYw\nAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggA\nYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAh\njAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjAC\nABjCCABgCCMAgCGMAACGMAIAGCcdRlV1QVX9ZVV9qqo+WVW/MOPvrKqHq+re+XrVxk0XAGBxtq/j\nuU8l+cXu/kRVfXeSe6rqrrnvd7v7t9c/PQCAzXPSYdTdB5IcmO1/qqr7kzxroyYGALDZNuQ9RlV1\nYZIXJfmbGXpLVe2pqpur6uyN2AcAwKKtO4yq6swkH05yfXd/Jcm7kjw/yWVZuaJ0w3Ged11V7a6q\n3YeeeHK90wAAWLd1hVFVfUdWouiW7v7jJOnuR7r7UHd/Pcm7k1y+1nO7+6bu3tXdu7aduWM90wAA\n2BDr+VRaJXlPkvu7+3dWjZ+/6mGvSXLfyU8PAGDzrOdTaT+c5KeT/H1V3Ttjv5Lk2qq6LEkneTDJ\nG9c1QwCATbKeT6X9nyS1xl13nPx0AACWx2++BgAYwggAYAgjAIAhjAAAxno+lcZxnHX/ynvSd+5Z\n/C+uPHjpN34H1Jdf2AvfHwCczlwxAgAYwggAYFhKW4AjS2h37/nG4EsuXci+Vi+fnXvJwSTJY3t3\nLmRfAHC6c8UIAGC4YrRIq64S7Xvddy1kF9dfcec3jd2496qF7AsATneuGAEADGEEADCEEQDAEEYA\nAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAM\nYQQAMIQRAMAQRgAAQxgBAIzty57A6ejgpTuSJF9+YR8Zu/6KOxeyr7ee/dCR7d//0nMXsg8A2Cpc\nMQIAGMIIAGBYSluAw0to515ycOH7Wr18dstDP7jw/QHA6cwVIwCAIYwAAIaltAV6bO/OI9s37r1q\niTMBAE6EK0YAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA\nEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABj+3pfoKoeTPJPSQ4leaq7d1XV\nOUk+mOTCJA8meW13f2m9+wIAWKSNumL077v7su7eNbffluSj3X1xko/ObQCAU9qiltKuTvK+2X5f\nkp9Y0H4AADbMRoRRJ/lIVd1TVdfN2HndfWC2v5DkvGOfVFXXVdXuqtp96IknN2AaAADrs+73GCX5\nke5+uKr+bZK7qurTq+/s7q6qPvZJ3X1TkpuS5IznXPBN9wMAbLZ1XzHq7ofn+6NJbktyeZJHqur8\nJJnvj653PwAAi7auMKqqHVX13Ye3k1yR5L4ktyd5/Tzs9Un+dD37AQDYDOtdSjsvyW1Vdfi1/rC7\n/7yqPp7kQ1X1hiQPJXntOvcDALBw6wqj7v5ckn+3xvgXk7xiPa8NALDZ/OZrAIAhjAAAhjACABjC\nCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMA\ngCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACG\nMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMII\nAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCA\nIYwAAIYwAgAY20/2iVV1SZIPrhp6XpL/nOSsJP8xyWMz/ivdfcdJzxAAYJOcdBh1994klyVJVW1L\n8nCS25L8XJLf7e7f3pAZAgBsko1aSntFkge6+6ENej0AgE23UWF0TZJbV91+S1Xtqaqbq+rstZ5Q\nVddV1e6q2n3oiSc3aBoAACdv3WFUVd+Z5NVJ/miG3pXk+VlZZjuQ5Ia1ntfdN3X3ru7ete3MHeud\nBgDAum3EFaOrknyiux9Jku5+pLsPdffXk7w7yeUbsA8AgIXbiDC6NquW0arq/FX3vSbJfRuwDwCA\nhTvpT6UlSVXtSPLKJG9cNfybVXVZkk7y4DH3AQCcstYVRt39ZJJ/c8zYT69rRgAAS+I3XwMADGEE\nADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA\nEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMY\nAQAMYQQAMIQRAMDYvuwJAItz1v11ZHvnnicXuq+Dl+44sv3lF/ZC9wWwKK4YAQAMYQQAMCylwWns\nqOWzu/esfH/JpQvZ1+rls3MvOXhk+7G9OxeyP4BFcMUIAGAIIwCAYSkNtopZQtv3uu9ayMtff8Wd\na47fuPeqhewPYBFcMQIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMA\ngCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAxvZlTwBYnIOX7jiy/eUXdpLk\n+ivuXMi+3nr2Q0e2f/9Lz13IPgAW7YSuGFXVzVX1aFXdt2rsnKq6q6o+O9/PnvGqqt+rqn1Vtaeq\nXryoyQMAbKQTXUp7b5Irjxl7W5KPdvfFST46t5PkqiQXz9d1Sd61/mkCACzeCS2ldffHqurCY4av\nTvLy2X5fkv+d5Jdn/P3d3Unurqqzqur87j6wERMGTtzh5bMkOfeSgwvd1+rls1se+sGF7gtgUdbz\n5uvzVsXOF5KcN9vPSvL5VY/bP2NHqarrqmp3Ve0+9MST65gGAMDG2JBPpc3VoX7GBx79nJu6e1d3\n79p25o5nfgIAwIKt51NpjxxeIquq85M8OuMPJ7lg1eOePWPAEj22d2eS5Ma9Vy15JgCnrvVcMbo9\nyetn+/VJ/nTV+M/Mp9NekuQfvb8IAPh2cEJXjKrq1qy80XpnVe1P8o4kv5HkQ1X1hiQPJXntPPyO\nJK9Ksi/JV5P83AbPGQBgIU70U2nXHueuV6zx2E7y5vVMCgBgGfwvQQAAhjACABjCCABgCCMAgCGM\nAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIA\nGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAI\nIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwA\nAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAY\nwggAYDxjGFXVzVX1aFXdt2rst6rq01W1p6puq6qzZvzCqvrnqrp3vv5gkZMHANhIJ3LF6L1Jrjxm\n7K4k39/dlyb5TJK3r7rvge6+bL7etDHTBABYvGcMo+7+WJLHjxn7SHc/NTfvTvLsBcwNAGBTbcR7\njH4+yZ2rbl9UVX9XVX9VVS893pOq6rqq2l1Vuw898eQGTAMAYH22r+fJVfWrSZ5KcssMHUjynO7+\nYlX9QJI/qarv6+6vHPvc7r4pyU1JcsZzLuj1zAMAYCOc9BWjqvrZJD+e5Ke6u5Oku7/W3V+c7XuS\nPJDkBRswTwCAhTupMKqqK5P8UpJXd/dXV42fW1XbZvt5SS5O8rmNmCgAwKI941JaVd2a5OVJdlbV\n/iTvyMqn0M5IcldVJcnd8wm0lyX5tar6lyRfT/Km7n58zRcGADjFPGMYdfe1awy/5ziP/XCSD693\nUgAAy+A3XwMADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABD\nGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEE\nADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA\nEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMY\nAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwti97AgCc/s66v45s79zz5ML3d/DSHUmSL7+wF74vTi/P\neMWoqm6uqker6r5VY++sqoer6t75etWq+95eVfuqam9V/diiJg4AsNFOZCntvUmuXGP8d7v7svm6\nI0mq6nuTXJPk++Y5/72qtm3UZAEAFukZl9K6+2NVdeEJvt7VST7Q3V9L8g9VtS/J5Un++qRnCMC3\nvaOWz+7e843tl1y6kP0dXkI795KDR8Ye27tzIfvi9LKeN1+/par2zFLb2TP2rCSfX/WY/TP2Tarq\nuqraXVW7Dz2x+PVmAIBncrJh9K4kz09yWZIDSW74Vl+gu2/q7l3dvWvbmTtOchoAABvnpD6V1t2P\nHN6uqncn+bO5+XCSC1Y99NkzBgArVi2f7Xvddy1kF9dfcec3jd2496qF7IvTy0ldMaqq81fdfE2S\nw59Yuz3JNVV1RlVdlOTiJH+7vikCAGyOZ7xiVFW3Jnl5kp1VtT/JO5K8vKouS9JJHkzyxiTp7k9W\n1YeSfCrJU0ne3N2HFjN1AICNdSKfSrt2jeH3PM3jfz3Jr69nUgAAy+B/CQIAMIQRAMAQRgAAQxgB\nAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAw\nti97AgCc/g5euuPI9pdf2Ee2r7/izoXs761nP5Qk+f0vPXchr8/pyxUjAIAhjAAAhqU0ABZu9fLZ\nuZccXPj+Di+h3fLQDy58X5xeXDECABjCCABgWEoDYFM9tnfnke0b9161xJnAN3PFCABgCCMAgCGM\nAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIA\nGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAI\nIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAxjOGUVXdXFWPVtV9q8Y+WFX3zteDVXXvjF9YVf+86r4/\nWOTkAQA20vYTeMx7k/y3JO8/PNDdrzu8XVU3JPnHVY9/oLsv26gJAgBslmcMo+7+WFVduNZ9VVVJ\nXpvkP2zstAAANt9632P00iSPdPdnV41dVFV/V1V/VVUvPd4Tq+q6qtpdVbsPPfHkOqcBALB+J7KU\n9nSuTXLrqtsHkjynu79YVT+Q5E+q6vu6+yvHPrG7b0pyU5Kc8ZwLep3zAABYt5O+YlRV25P8ZJIP\nHh7r7q919xdn+54kDyR5wXonCQCwGdazlPajST7d3fsPD1TVuVW1bbafl+TiJJ9b3xQBADbHiXxc\n/9Ykf53kkqraX1VvmLuuydHLaEnysiR75uP7/yPJm7r78Y2cMADAopzIp9KuPc74z64x9uEkH17/\ntAAANp/ffA0AMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAM\nYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQR\nAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAA\nQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxh\nBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMKq7lz2HVNVjSR5KsjPJwSVP51Ti\neBzN8Tia4/ENjsXRHI+jOR5H24rH47ndfe6JPPCUCKPDqmp3d+9a9jxOFY7H0RyPozke3+BYHM3x\nOJrjcTTH4+lZSgMAGMIIAGCcamF007IncIpxPI7meBzN8fgGx+JojsfRHI+jOR5P45R6jxEAwDKd\naleMAACW5pQIo6q6sqr2VtW+qnrbsuez2arqgqr6y6r6VFV9sqp+YcbfWVUPV9W98/WqZc91s1TV\ng1X19/Pn3j1j51TVXVX12fl+9rLnuRmq6pJV58C9VfWVqrp+K50fVXVzVT1aVfetGlvzfKgVvzd/\nn+ypqhcvb+aLcZzj8VtV9en5M99WVWfN+IVV9c+rzpM/WN7MF+M4x+O4Px9V9fY5P/ZW1Y8tZ9aL\nc5zj8cFVx+LBqrp3xk/78+NbtfSltKraluQzSV6ZZH+Sjye5trs/tdSJbaKqOj/J+d39iar67iT3\nJPmJJK9N8kR3//ZSJ7gEVfVgkl3dfXDV2G8meby7f2MC+uzu/uVlzXEZ5ufl4SQ/lOTnskXOj6p6\nWZInkry/u79/xtY8H+Y/gG9N8qqsHKf/2t0/tKy5L8JxjscVSf5Xdz9VVf8lSeZ4XJjkzw4/7nR0\nnOPxzqzx81FV35vk1iSXJ/meJP8zyQu6+9CmTnqB1joex9x/Q5J/7O5f2wrnx7fqVLhidHmSfd39\nue7+f0k+kOTqJc9pU3X3ge7+xGz/U5L7kzxrubM6JV2d5H2z/b6sxONW84okD3T3Q8ueyGbq7o8l\nefyY4eOdD1dn5T8I3d13Jzlr/vFx2ljreHT3R7r7qbl5d5Jnb/rEluQ458fxXJ3kA939te7+hyT7\nsvLfodPG0x2Pqqqs/KP71k2d1LeRUyGMnpXk86tu788WjoKp9xcl+ZsZestcGr95qywdjU7ykaq6\np6qum7HzuvvAbH8hyXnLmdpSXZOj/0LbqudHcvzzwd8pyc8nuXPV7Yuq6u+q6q+q6qXLmtQSrPXz\nsdXPj5cmeaS7P7tqbKueH2s6FcKIUVVnJvlwkuu7+ytJ3pXk+UkuS3IgyQ1LnN5m+5HufnGSq5K8\neS4NH9Era8Bb6iOVVfWdSV6d5I9maCufH0fZiufD8VTVryZ5KsktM3QgyXO6+0VJ/lOSP6yqf72s\n+W0iPx9ruzZH/+Nqq54fx3UqhNHDSS5YdfvZM7alVNV3ZCWKbunuP06S7n6kuw9199eTvDun2eXe\np9PdD8/3R5PclpU/+yOHl0Tm+6PLm+FSXJXkE939SLK1z49xvPNhy/6dUlU/m+THk/zUxGJmyeiL\ns31PkgeSvGBpk9wkT/PzsZXPj+1JfjLJBw+PbdXz4+mcCmH08SQXV9VF8y/ia5LcvuQ5bapZ831P\nkvu7+3dWja9+X8Rrktx37HNPR1W1Y96EnqrakeSKrPzZb0/y+nnY65P86XJmuDRH/Utvq54fqxzv\nfLg9yc/Mp9NekpU3mR5Y6wVOJ1V1ZZJfSvLq7v7qqvFz5037qarnJbk4yeeWM8vN8zQ/H7cnuaaq\nzqiqi7JyPP52s+e3JD+a5NPdvf/wwFY9P57O9mVPYD5B8ZYkf5FkW5Kbu/uTS57WZvvhJD+d5O8P\nf4Qyya8kubaqLsvKEsGDSd64nOltuvOS3LbSi9me5A+7+8+r6uNJPlRVb0jyUFbeQLglTCC+Mkef\nA7+5Vc6Pqro1ycuT7Kyq/UnekeQ3svb5cEdWPpG2L8lXs/LpvdPKcY7H25OckeSu+dm5u7vflORl\nSX6tqv4lydeTvKm7T/SNyt8WjnM8Xr7Wz0d3f7KqPpTkU1lZcnzz6fSJtGTt49Hd78k3v0cx2QLn\nx7dq6R/XBwA4VZwKS2kAAKcEYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAADj/wNFwYmlDN8g\nuwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "out = lax.conv(np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", + " np.transpose(kernel,[2,3,0,1]), # rhs = IOHW conv kernel tensor\n", + " (1, 1), # window strides\n", + " 'SAME') # padding mode\n", + "print(\"out shape: \", out.shape)\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,0,:,:]);" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "aonr1tWvYCW9", + "outputId": "63727dd7-1758-4aa0-f93f-557758a160a8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 3, 202, 200)\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "out = lax.conv_with_general_padding(\n", + " np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", + " np.transpose(kernel,[2,3,0,1]), # rhs = IOHW conv kernel tensor\n", + " (1, 1), # window strides\n", + " ((2,2),(2,2)), # general padding 2x2\n", + " (1,1), # lhs/image dilation\n", + " (1,1)) # rhs/kernel dilation\n", + "print(\"out shape: \", out.shape)\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,0,:,:]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "lyOwGRez_ycJ" + }, + "source": [ + "### Dimension Numbers define dimensional layout for conv_general_dilated\n", + "\n", + "The important argument is the 3-tuple of axis layout arguments:\n", + "(Input Layout, Kernel Layout, Output Layout)\n", + " - __N__ - batch dimension\n", + " - __H__ - spatial height\n", + " - __W__ - spatial height\n", + " - __C__ - channel dimension\n", + " - __I__ - kernel _input_ channel dimension\n", + " - __O__ - kernel _output_ channel dimension\n", + "\n", + "⚠️ To demonstrate the flexibility of dimension numbers we choose a __NHWC__ image and __HWIO__ kernel convention for `lax.conv_general_dilated` below." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "oXKebfCb_i2B", + "outputId": "0b80fca6-0eb7-4baf-d824-458c3739d052" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ConvDimensionNumbers(lhs_spec=(0, 3, 1, 2), rhs_spec=(3, 2, 0, 1), out_spec=(0, 3, 1, 2))\n" + ] + } + ], + "source": [ + "dn = lax.conv_dimension_numbers(img.shape, # only ndim matters, not shape\n", + " kernel.shape, # only ndim matters, not shape \n", + " ('NHWC', 'HWIO', 'NHWC')) # the important bit\n", + "print(dn)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "elZys_HzFVG6" + }, + "source": [ + "#### SAME padding, no stride, no dilation" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "rgb2T15aFVG6", + "outputId": "93fed3a7-69d2-4046-de2f-487ff34b5ee2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 200, 198, 3)\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "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\nuwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " 'SAME', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape)\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "E4i3TI5JFVG9" + }, + "source": [ + "#### VALID padding, no stride, no dilation" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "1HQwudKVFVG-", + "outputId": "9edf1704-b920-4666-8a49-2db7dd622fd1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 198, 196, 3) DIFFERENT from above!\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAJCCAYAAAAlTAh6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGXFJREFUeJzt3X+spndZ5/HPtTNK4tRNpzvdpkKh\nhZQGNd2qYyVRCLtIbYmh4h/Qxigq2UICxGZNFDRZiImJq1a7ullMCQ2Q1AKK1WbTKl3WlWxilSk2\ntVBGptiG6da2Q0FsMawdrv1jrhme6ZxhxjnnOc845/VKTs79fJ8f93fu3Gf6nvvHaXV3AABI/tWq\nJwAAcLoQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEAjKWFUVVdWVV7q2pfVb19WesBANgotYxf8FhV\n25L8TZJXJdmf5BNJru3uT2/4ygAANsj2JX3u5Un2dffnkqSqPpjk6iRrhtG2s3b09nPOWdJUAICt\n7Jknn8zBp56uk3ntssLouUk+v/B4f5LvO+4kzjkn3/az1y9pKgDAVvZ/b7jxpF+7souvq+q6qtpT\nVXsOPvX0qqYBAHDEssLokSQXLDx+3owd0d03dffu7t697awdS5oGAMDJW1YYfSLJxVV1UVV9c5Jr\nkty+pHUBAGyIpVxj1N3PVNVbk/xJkm1Jbu7uTy1jXQAAG2VZF1+nu+9IcseyPh8AYKP5zdcAAEMY\nAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQA\nMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQ\nRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgB\nAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAw\nhBEAwBBGAABDGAEADGEEADCEEQDAOOUwqqoLqupPq+rTVfWpqvqZGX9XVT1SVffO16s3broAAMuz\nfR3vfSbJz3b3J6vqW5PcU1V3zXO/2d2/vv7pAQBsnlMOo+5+NMmjs/wPVfVAkudu1MQAADbbhlxj\nVFUXJvmuJH8xQ2+tqvuq6uaq2nmc91xXVXuqas/Bp57eiGkAAKzLusOoqs5K8pEk13f3l5O8O8mL\nklyWQ0eUbljrfd19U3fv7u7d287asd5pAACs27rCqKq+KYei6Jbu/oMk6e7Huvtgd38tyXuSXL7+\naQIALN967kqrJO9N8kB3/8bC+PkLL3ttkvtPfXoAAJtnPXelfX+SH0/y11V174z9QpJrq+qyJJ3k\noSRvWtcMAQA2yXruSvs/SWqNp+449ekAAKyO33wNADDWcyqNBWc/8PWDZ7vuW/6vHzhw6dfv5PvS\nS3rp6wOArcARIwCAIYwAAIZTaRvkqNNnd9/39eWXXrqU9S2ePjv3kgNJkif27lrKugBgq3DECABg\nOGK0DAtHifa9/luWsorrr7jzmLEb9161lHUBwFbhiBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMY\nAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQA\nMIQRAMDYvuoJnCkOXLrjyPKXXtJHlq+/4s6lrO9tOx8+svzbX3zBUtYBAFuNI0YAAEMYAQAMp9I2\nyOLps3MvObD09S2ePrvl4e9d+voAYCtwxAgAYAgjAIDhVNoSPLF315HlG/detcKZAAD/HI4YAQAM\nYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQR\nAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAGP7ej+gqh5K8g9JDiZ5prt3\nV9U5ST6U5MIkDyV5XXd/cb3rAgBYpo06YvTvu/uy7t49j9+e5GPdfXGSj81jAIDT2rJOpV2d5P2z\n/P4kP7Kk9QAAbJiNCKNO8tGquqeqrpux87r70Vn+uyTnbcB6AACWat3XGCX5ge5+pKr+bZK7quoz\ni092d1dVP/tNE1HXJcm2nTs3YBoAAOuz7iNG3f3IfH88yW1JLk/yWFWdnyTz/fE13ndTd+/u7t3b\nztqx3mkAAKzbusKoqnZU1bceXk5yRZL7k9ye5A3zsjck+aP1rAcAYDOs91TaeUluq6rDn/W73f3H\nVfWJJB+uqjcmeTjJ69a5HgCApVtXGHX355L8uzXGv5Dklev5bACAzeY3XwMADGEEADCEEQDAEEYA\nAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAM\nYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQR\nAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAA\nQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxh\nBAAwhBEAwBBGAABj+6m+saouSfKhhaEXJvnPSc5O8h+TPDHjv9Ddd5zyDAEANskph1F3701yWZJU\n1bYkjyS5LclPJfnN7v71DZkhAMAm2ahTaa9M8mB3P7xBnwcAsOk2KoyuSXLrwuO3VtV9VXVzVe1c\n6w1VdV1V7amqPQefenqDpgEAcOrWHUZV9c1JXpPk92bo3UlelEOn2R5NcsNa7+vum7p7d3fv3nbW\njvVOAwBg3TbiiNFVST7Z3Y8lSXc/1t0Hu/trSd6T5PINWAcAwNJtRBhdm4XTaFV1/sJzr01y/was\nAwBg6U75rrQkqaodSV6V5E0Lw79aVZcl6SQPPes5AIDT1rrCqLufTvJvnjX24+uaEQDAivjN1wAA\nQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxh\nBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEA\nwBBGAABj+6onACzH2Q/UkeVd9z299PUduHTHkeUvvaSXvj6AZXDECABgCCMAgOFUGpyhjjp9dvd9\nX19+6aVLWd/i6bNzLzmQJHli766lrAtgWRwxAgAYjhjBVrBwlGjf679lKau4/oo7jxm7ce9VS1kX\nwLI4YgQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQA\nMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADC2r3oCwHIcuHTHkeUvvaSPLF9/xZ1L\nWd/bdj58ZPm3v/iCpawDYNkcMQIAGMIIAGA4lQZnqMXTZ+decmDp61s8fXbLw9+79PUBLMNJHTGq\nqpur6vGqun9h7JyququqPjvfd854VdVvVdW+qrqvqr57WZMHANhIJ3sq7X1JrnzW2NuTfKy7L07y\nsXmcJFcluXi+rkvy7vVPEwBg+U7qVFp3f7yqLnzW8NVJXjHL70/yv5P8/Ix/oLs7yd1VdXZVnd/d\nj27EhIF/vif27jqyfOPeq1Y4E4DT23ouvj5vIXb+Lsl5s/zcJJ9feN3+GTtKVV1XVXuqas/Bp55e\nxzQAADbGhtyVNkeH+oQvPPo9N3X37u7eve2sHSd+AwDAkq0njB6rqvOTZL4/PuOPJLlg4XXPmzEA\ngNPaesLo9iRvmOU3JPmjhfGfmLvTXprk711fBAD8S3BSF19X1a05dKH1rqran+SdSX4lyYer6o1J\nHk7yunn5HUlenWRfkq8k+akNnjMAwFKc7F1p1x7nqVeu8dpO8pb1TAoAYBX8L0EAAIYwAgAYwggA\nYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAh\njAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjAC\nABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABg\nCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGM\nAACGMAIAGMIIAGCcMIyq6uaqeryq7l8Y+7Wq+kxV3VdVt1XV2TN+YVX9Y1XdO1+/s8zJAwBspJM5\nYvS+JFc+a+yuJN/Z3Zcm+Zsk71h47sHuvmy+3rwx0wQAWL4ThlF3fzzJk88a+2h3PzMP707yvCXM\nDQBgU23ENUY/neTOhccXVdVfVdWfVdXLNuDzAQA2xfb1vLmqfjHJM0lumaFHkzy/u79QVd+T5A+r\n6ju6+8trvPe6JNclybadO9czDQCADXHKR4yq6ieT/HCSH+vuTpLu/mp3f2GW70nyYJIXr/X+7r6p\nu3d39+5tZ+041WkAAGyYUwqjqroyyc8leU13f2Vh/Nyq2jbLL0xycZLPbcREAQCW7YSn0qrq1iSv\nSLKrqvYneWcO3YX2nCR3VVWS3D13oL08yS9V1T8l+VqSN3f3k2t+MADAaeaEYdTd164x/N7jvPYj\nST6y3kkBAKyC33wNADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABD\nGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEE\nADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA\nEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMY\nAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwtq96AgBsDWc/UEeWd9339NLXd+DSHUeWv/SSXvr6ODM4\nYgQAMBwxAmBTHHWU6O77vr780kuXsr7Fo0TnXnIgSfLE3l1LWRdnjhMeMaqqm6vq8aq6f2HsXVX1\nSFXdO1+vXnjuHVW1r6r2VtUPLWviAAAb7WROpb0vyZVrjP9md182X3ckSVV9e5JrknzHvOe/V9W2\njZosAMAynfBUWnd/vKouPMnPuzrJB7v7q0n+tqr2Jbk8yZ+f8gwBOPMsnD7b9/pvWcoqrr/izmPG\nbtx71VLWxZljPRdfv7Wq7ptTbTtn7LlJPr/wmv0zdoyquq6q9lTVnoNPLf/uBACAEznVMHp3khcl\nuSzJo0lu+Od+QHff1N27u3v3trN2nPgNAABLdkph1N2PdffB7v5akvfk0OmyJHkkyQULL33ejAEA\nnPZOKYyq6vyFh69NcviOtduTXFNVz6mqi5JcnOQv1zdFAIDNccKLr6vq1iSvSLKrqvYneWeSV1TV\nZUk6yUNJ3pQk3f2pqvpwkk8neSbJW7r74HKmDgCwsU7mrrRr1xh+7zd4/S8n+eX1TAoAYBX8L0EA\nAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAY\nwggAYGxf9QQA2BoOXLrjyPKXXtJHlq+/4s6lrO9tOx8+svzbX3zBUtbBmccRIwCAIYwAAIZTaQBs\nisXTZ+decmDp61s8fXbLw9+79PVxZnDECABgCCMAgOFUGgCb7om9u44s37j3qhXOBI7miBEAwBBG\nAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEA\nDGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCE\nEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAADjhGFUVTdX1eNVdf/C2Ieq\n6t75eqiq7p3xC6vqHxee+51lTh4AYCNtP4nXvC/Jf0vygcMD3f36w8tVdUOSv194/YPdfdlGTRAA\nYLOcMIy6++NVdeFaz1VVJXldkv+wsdMCANh8673G6GVJHuvuzy6MXVRVf1VVf1ZVLzveG6vquqra\nU1V7Dj719DqnAQCwfidzKu0buTbJrQuPH03y/O7+QlV9T5I/rKrv6O4vP/uN3X1TkpuS5DnPv6DX\nOQ8AgHU75SNGVbU9yY8m+dDhse7+and/YZbvSfJgkhevd5IAAJthPafSfjDJZ7p7/+GBqjq3qrbN\n8guTXJzkc+ubIgDA5jiZ2/VvTfLnSS6pqv1V9cZ56pocfRotSV6e5L65ff/3k7y5u5/cyAkDACzL\nydyVdu1xxn9yjbGPJPnI+qcFALD5/OZrAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAI\nIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwA\nAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAY\nwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgj\nAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGBUd696DqmqJ5I8nGRXkgMrns7pxPY4lm1y\nLNvkaLbHsWyTY9kmRzvTt8cLuvvck3nhaRFGh1XVnu7evep5nC5sj2PZJseyTY5mexzLNjmWbXI0\n2+PrnEoDABjCCABgnG5hdNOqJ3CasT2OZZscyzY5mu1xLNvkWLbJ0WyPcVpdYwQAsEqn2xEjAICV\nOS3CqKqurKq9VbWvqt6+6vmsQlVdUFV/WlWfrqpPVdXPzPi7quqRqrp3vl696rlulqp6qKr+ev7c\ne2bsnKq6q6o+O993rnqem6WqLlnYD+6tqi9X1fVbbR+pqpur6vGqun9hbM39og75rfm75b6q+u7V\nzXw5jrM9fq2qPjN/5tuq6uwZv7Cq/nFhX/md1c18eY6zTY77c1JV75h9ZG9V/dBqZr1cx9kmH1rY\nHg9V1b0zviX2k+NZ+am0qtqW5G+SvCrJ/iSfSHJtd396pRPbZFV1fpLzu/uTVfWtSe5J8iNJXpfk\nqe7+9ZVOcAWq6qEku7v7wMLYryZ5srt/ZSJ6Z3f//KrmuCrzc/NIku9L8lPZQvtIVb08yVNJPtDd\n3zlja+4X8x+/tyV5dQ5tq//a3d+3qrkvw3G2xxVJ/ld3P1NV/yVJZntcmOR/HH7dmeo42+RdWePn\npKq+PcmtSS5P8m1J/meSF3f3wU2d9JKttU2e9fwNSf6+u39pq+wnx3M6HDG6PMm+7v5cd/+/JB9M\ncvWK57TpuvvR7v7kLP9DkgeSPHe1szotXZ3k/bP8/hyKx63olUke7O6HVz2RzdbdH0/y5LOGj7df\nXJ1D/yHo7r47ydnzj5Azxlrbo7s/2t3PzMO7kzxv0ye2QsfZR47n6iQf7O6vdvffJtmXQ/9dOqN8\no21SVZVD/wi/dVMndZo6HcLouUk+v/B4f7Z4EEytf1eSv5iht84h8Zu30qmjJJ3ko1V1T1VdN2Pn\ndfejs/x3Sc5bzdRW7poc/ZfYVt1HDjvefuHvl+Snk9y58PiiqvqrqvqzqnrZqia1Imv9nNhHkpcl\neay7P7swtmX3k9MhjFhQVWcl+UiS67v7y0neneRFSS5L8miSG1Y4vc32A9393UmuSvKWORR8RB86\nD7zlbqusqm9O8pokvzdDW3kfOcZW3S/WUlW/mOSZJLfM0KNJnt/d35XkPyX53ar616ua3ybzc3J8\n1+bof2ht5f3ktAijR5JcsPD4eTO25VTVN+VQFN3S3X+QJN39WHcf7O6vJXlPzsBDvMfT3Y/M98eT\n3JZDf/bHDp8Kme+Pr26GK3NVkk9292PJ1t5HFhxvv9iyf79U1U8m+eEkPzaxmDld9IVZvifJg0le\nvLJJbqJv8HOyZfeRJKmq7Ul+NMmHDo9t5f0kOT3C6BNJLq6qi+ZfwtckuX3Fc9p0c473vUke6O7f\nWBhfvB7itUnuf/Z7z0RVtWMuQk9V7UhyRQ792W9P8oZ52RuS/NFqZrhSR/3rbqvuI89yvP3i9iQ/\nMXenvTSHLi59dK0POJNU1ZVJfi7Ja7r7Kwvj586F+6mqFya5OMnnVjPLzfUNfk5uT3JNVT2nqi7K\noW3yl5s9vxX6wSSf6e79hwe28n6SJNtXPYG5a+KtSf4kybYkN3f3p1Y8rVX4/iQ/nuSvD98ymeQX\nklxbVZfl0KmBh5K8aTXT23TnJbntUC9me5Lf7e4/rqpPJPlwVb0xycM5dMHgljGR+KocvR/86lba\nR6rq1iSvSLKrqvYneWeSX8na+8UdOXRH2r4kX8mhO/jOKMfZHu9I8pwkd83P0N3d/eYkL0/yS1X1\nT0m+luTN3X2yFyn/i3GcbfKKtX5OuvtTVfXhJJ/OodOObznT7khL1t4m3f3eHHu9YrJF9pPjWfnt\n+gAAp4vT4VQaAMBpQRgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA+P+2dY6FyWLi+wAAAABJ\nRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " 'VALID', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \"DIFFERENT from above!\")\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "VYKZdqLIFVHB" + }, + "source": [ + "#### SAME padding, 2,2 stride, no dilation" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "mKq2-zmmFVHC", + "outputId": "73b80162-fdca-4f6a-ec06-4645d6fdc9f6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 100, 99, 3) <-- half the size of above\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (2,2), # window strides\n", + " 'SAME', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \" <-- half the size of above\")\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "gPxttaiaFVHE" + }, + "source": [ + "#### VALID padding, no stride, rhs kernel dilation ~ Atrous convolution (excessive to illustrate)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "_pGr0x6qFVHF", + "outputId": "a0f489eb-bab7-42c4-c030-fb756f63a4a4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 176, 174, 3)\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "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\nAFSiCACgEkUAAJUoAgCoRBEAQCWKAAAqUQQAUIkiAICqZq216xmamS9Un62urH53x+PswoW43Rfi\nNpftvtBciNt9IW5z2e5z3X+71voTT7XSORFFXzUzJ9Zax3c9xzPtQtzuC3Gby3bveo5n2oW43Rfi\nNpft3vUcB8XbZwAAiSIAgOrci6K7dj3AjlyI230hbnPZ7gvNhbjdF+I2l+0+Es6pc4oAAHblXDtS\nBACwE+dEFM3MzTPziZk5OTOv3vU8h2VmrpmZ98zMR2fmIzPzo5vlV8zMu2fmk5uvz971rAdtZi6a\nmV+fmV/a3L9uZt632ef3zMzFu57xoM3M5TPzjpn5+Mx8bGb+3AWyr1+5+fv94Zl568x8/VHc3zPz\nppl5eGY+vG/Zaffv7Pm5zfZ/cGZesLvJt3OG7f4Hm7/nH5yZfzUzl+977DWb7f7EzHz3bqbe3um2\ne99jr5qZNTNXbu4f6f29Wf4jm33+kZn5+/uWn9f7e+dRNDMXVf9H9ZLq+dXLZub5u53q0DxWvWqt\n9fzqpuoVm219dXXfWuvG6r7N/aPmR6uP7bv/M9Wda60bqt+vXr6TqQ7Xz1b/Zq31p6tva2/7j/S+\nnpmrqr9THV9rfWt1UXVrR3N/v7m6+QnLzrR/X1LduPlze/X6Z2jGw/Dmnrzd766+da31Z6rfql5T\ntfn5dmv1LZvn/JPNz/zz0Zt78nY3M9dUf6n63L7FR3p/z8x3VbdU37bW+pbqH26Wn/f7e+dRVL2w\nOrnW+vRa6yvV29r7H/vIWWs9tNb6wOb2f27vP5JXtbe9d29Wu7v6/t1MeDhm5urqL1c/v7k/1Yuq\nd2xWOYrb/Merv1C9sWqt9ZW11hc74vt641j1x2bmWPWs6qGO4P5ea723+r0nLD7T/r2l+oW15/7q\n8pl57jMz6cE63Xavtf7dWuuxzd37q6s3t2+p3rbWenSt9ZnqZHs/8887Z9jfVXdWP17tP0H3SO/v\n6m9VP73WenSzzsOb5ef9/j4Xouiq6oF9909tlh1pM3Nt9e3V+6rnrLUe2jz0+eo5OxrrsPzj9n5o\n/NHm/jdUX9z3Q/Qo7vPrqi9U/3TztuHPz8ylHfF9vdZ6sL3/1/i59mLoS9WvdfT391edaf9eSD/n\n/mb1rze3j/R2z8wt1YNrrd98wkNHerur51V/fvOW+H+cmT+7WX7eb/e5EEUXnJm5rPqX1Y+ttf7T\n/sfW3uWAR+aSwJn53urhtdav7XqWZ9ix6gXV69da31490hPeKjtq+7pqcw7NLe1F4TdVl3aatxwu\nBEdx/z6Vmfmp9k4TeMuuZzlsM/Os6ier/2XXs+zAseqK9k4D+Z+rt2/eATjvnQtR9GB1zb77V2+W\nHUkz83XtBdFb1lrv3Cz+na8eWt18ffhMzz8PfUf1fTPz2+29Nfqi9s61uXzz9kodzX1+qjq11nrf\n5v472ouko7yvq/5i9Zm11hfWWn9YvbO9vwNHfX9/1Zn275H/OTczf7363uqH1v//WS9Hebuvby/+\nf3Pz8+3q6gMz8yc72ttdez/f3rl5e/D97b0LcGVHYLvPhSj61erGzdUpF7d3kta9O57pUGxK+o3V\nx9Za/2jfQ/dWt21u31a965me7bCstV6z1rp6rXVte/v2P6y1fqh6T/UDm9WO1DZXrbU+Xz0wM9+8\nWfTi6qMd4X298bnqppl51ubv+1e3+0jv733OtH/vrX54c1XSTdWX9r3Ndt6bmZvbe4v8+9Zaf7Dv\noXurW2fmkpm5rr0Tj9+/ixkP2lrrQ2utb1xrXbv5+XaqesHm3/6R3t/VL1bfVTUzz6subu+Xwp7/\n+3uttfM/1fe0d8XCp6qf2vU8h7id/0N7h9M/WP3G5s/3tHeOzX3VJ6t/X12x61kPafu/s/qlze0/\n1d4/lpPVv6gu2fV8h7C9/111YrO/f7F69oWwr6v/rfp49eHqn1WXHMX9Xb21vfOm/rC9/yC+/Ez7\nt5r2rrL9VPWh9q7O2/k2HOB2n2zvXJKv/lx7w771f2qz3Z+oXrLr+Q9yu5/w+G9XV14g+/vi6p9v\n/o1/oHrRUdnfPtEaAKBz4+0zAICdE0UAAIkiAIBKFAEAVKIIAKASRQAAlSgCAKhEEQBAVf8vMwxh\njUiRM0EAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " 'VALID', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (12,12), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape)\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "v-RhEeUfFVHI" + }, + "source": [ + "#### VALID padding, no stride, lhs=input dilation ~ Transposed Convolution" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "B9Ail8ppFVHJ", + "outputId": "03d00b5a-ec38-435a-81f7-79d4737239c0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 399, 395, 3) <-- larger than original!\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "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\njAAAxv8H2emSG61MbfQAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " 'SAME', # padding mode\n", + " (2,2), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \"<-- larger than original!\")\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "A-9OagtrVDyV" + }, + "source": [ + "We can use the last to, for instance, implement _transposed convolutions_:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + }, + "colab_type": "code", + "id": "5EYIj77-NdHE", + "outputId": "d2e82a42-9c8e-4973-f760-511a14805527" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "out shape: (1, 400, 396, 3) <-- transposed_conv\n", + "First output channel:\n" + ] + }, + { + "data": { + "image/png": "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\nVXV3VT1cVQ9V1W/P+LY8Ro6zHtvyGKmq51bVZ6vqi7MefzDjl1TVvfO6b6uq58z42XN7Ze5/4TLn\nv9mOsx4fqqqvrTk+9sz4Gf37ckq6e2lfSXYk+UqSf5fkOUm+mOTFy5zTktbh60me/6yx/5rkhtm+\nIckfL3ueC3z9v57kiiQPnuj1J7k6yV8lqST7kty77Plv0Xq8M8l/Psq+L57fm7OTXDK/TzuW/Ro2\neT0uSHLFbD8vyT/M696Wx8hx1mNbHiPz33nXbJ+V5N757357kmtm/P1J/uNs/6ck75/ta5LctuzX\nsEXr8aEkrznK/mf078upfC37HaMrk6x091e7+1+S3Jpk/5LndLrYn+SW2b4lyauXOJeF6u5PJ/nW\ns4aP9fr3J/lwr7onyblVdcHWzHRrHGM9jmV/klu7+6nu/lqSlaz+Xp0xuvtQd39htr+f5JEkF2ab\nHiPHWY9jOaOPkfnv/OTcPGu+OsnLknxkxp99fDxz3HwkycurqrZougt3nPU4ljP69+VULDuMLkzy\n6Jrbj+X4v+Bnqk7yt1X1+ao6MGPnd/eh2f5mkvOXM7WlOdbr387HzFvnre6b15xa3VbrMac9XpLV\nfwVv+2PkWeuRbNNjpKp2VNX9SZ5IcldW3xX7Tnc/Pbusfc0/Wo+5/7tJfnZrZ7xYz16P7n7m+HjX\nHB83VtXZM3bGHx8na9lhxKpf6+4rkrwqyfVV9etr7+zV9zu37eWD2/31j/cluTTJniSHkrx7udPZ\nelW1K8lHk7ytu7+39r7teIwcZT227THS3Ye7e0+Si7L6btiLljylpXr2elTVLyR5R1bX5ZeSnJfk\nd5c4xdPassPoYJKL19y+aMa2le4+ON+fSPKxrP5iP/7M25nz/YnlzXApjvX6t+Ux092Pz//Y/WuS\nD+THp0K2xXpU1VlZjYA/6+6/nOFte4wcbT22+zGSJN39nSR3J/mVrJ4S2jl3rX3NP1qPuf9nkvzz\nFk91S6xZj6vmFGx391NJ/iTb8PhYr2WH0eeSXD5XDzwnqx+Eu2PJc9pSVXVOVT3vme0kv5Hkwayu\nw7Wz27VJPr6cGS7NsV7/HUneOFdS7Evy3TWnU85Yzzrn/5tZPUaS1fW4Zq60uSTJ5Uk+u9XzW6T5\n/McHkzzS3e9Zc9e2PEaOtR7b9RipqhdU1bmz/dNJXpHVz13dneQ1s9uzj49njpvXJPnUvON4RjjG\nevz9mn9EVFY/b7X2+Dhjf19Oxc4T77I43f10Vb01yd9k9Qq1m7v7oWXOaQnOT/Kx+ezfziR/3t1/\nXVWfS3J7Vb05yTeSvHaJc1yoqvqLJC9N8vyqeizJ7yf5oxz99d+Z1asoVpL8MMmbtnzCC3aM9Xjp\nXF7bWb2K8S1J0t0PVdXtSR5O8nSS67v78DLmvUC/muQNSb40n5tIkt/L9j1GjrUer9+mx8gFSW6p\nqh1Z/cf+7d39iap6OMmtVfWHSf4uqzGZ+f6nVbWS1YscrlnGpBfoWOvxqap6QVavPrs/yXWz/5n+\n+3LS/OVrAICx7FNpAACnDWEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAA4/8Bvw2GDv/f1K0A\nAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "# The following is equivalent to tensorflow:\n", + "# N,H,W,C = img.shape\n", + "# out = tf.nn.conv2d_transpose(img, kernel, (N,2*H,2*W,C), (1,2,2,1))\n", + "\n", + "# transposed conv = 180deg kernel roation plus LHS dilation\n", + "# rotate kernel 180deg:\n", + "kernel_rot = np.rot90(np.rot90(kernel, axes=(0,1)), axes=(0,1))\n", + "# need a custom output padding:\n", + "padding = ((2, 1), (2, 1))\n", + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel_rot, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " padding, # padding mode\n", + " (2,2), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \"<-- transposed_conv\")\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "v8HsE-NCmUxx" + }, + "source": [ + "### 1D Convolutions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "WeP0rw0tm7HK" + }, + "source": [ + "You aren't limited to 2D convolutions, a simple 1D demo is below:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 680 + }, + "colab_type": "code", + "id": "jJ-jcAn3cig-", + "outputId": "614ed589-e097-4bfe-f596-3421e3492698" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "in shapes: (1, 200, 2) (3, 2, 2)\n", + "ConvDimensionNumbers(lhs_spec=(0, 2, 1), rhs_spec=(2, 1, 0), out_spec=(0, 2, 1))\n", + "out shape: (1, 200, 2)\n" + ] + }, + { + "data": { + "image/png": "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\nAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\ndnvvz0uzHuu8mNlXzezO3vM827vtIjP7iJnd1/v4mKzHOQ9m9uQDr/HtZlY1s9ev8utvZm83s2+Z\n2V0Hbot8vS30X3rvBXeY2bOyG3k6Yp7/b5nZ53vP8VYzO9W7/Voz2z/wc/D72Y18djHPPfZn3cx+\nrffaf8HMXpzNqNMT8/zfc+C5f9XMbu/dvmqvfdy5brl+951zK/VHUl7SlyQ9XlJJ0uck3ZD1uOb4\nfC+T9Kze37ckfVHSDZLeLOlXsx7fgo7BVyVdPHLbf5T0xt7f3yjpN7Me5wKOQ17SNyVds8qvv6Tn\nS3qWpLsmvd6SXirpQ5JM0nMlfSrr8c/p+f+gpELv77954Plfe/DrTvqfmOce+bPeex/8nKSypOt6\n54V81s8h7ec/8vn/JOnXV/S1jzvXLdXv/ipWqp4j6X7n3Jedc01J75b08ozHNDfOuQedc5/t/b0m\n6V5JV2Q7qqXwcknv6P39HZL+cYZjWZQfkPQl59y8dyvIlHPubyQ9OnJz3Ov9ckn/04U+KemUmV22\nmJHOR9Tzd8592DnX7v3zk5KuXPjAFiDmtY/zcknvds41nHNfkXS/wvPDiTXu+ZuZSfoJSX+80EEt\nyJhz3VL97q9iqLpC0tcP/PsBeRIyzOxaSTdK+lTvpl/olT3fvqqXv3qcpA+b2W1mdnPvtkuccw/2\n/v5NSZdkM7SFeqUOv6H68vpL8a+3j+8Hr1X4P/S+68zs78zs/5jZ87Ia1JxF/az79to/T9JDzrn7\nDty2kq/9yLluqX73VzFUecnMNiX9qaTXO+eqkv6bpCdIeqakBxWWhVfV9zrnniXpJZJeZ2bPP/hJ\nF9aCV7p3iJmVJL1M0nt7N/n0+h/iw+sdx8zeJKkt6V29mx6UdLVz7kZJvyzpj8ysktX45sTbn/UR\nr9Lh/1St5Gsfca4bWIbf/VUMVd+QdNWBf1/Zu21lmVlR4Q/Zu5xzfyZJzrmHnHMd51xX0v/QCS97\nj+Oc+0bv47ck3arwuT7UL/X2Pn4ruxEuxEskfdY595Dk1+vfE/d6e/N+YGavkfTDkn6yd3JR79LX\nI72/36ZwXtGTMhvkHIz5WffptS9IeoWk9/RvW8XXPupcpyX73V/FUPUZSU80s+t6/3t/paT3Zzym\nueldR3+bpHudc79z4PaD145/VNJdo/ddBWa2YWZb/b8rnLB7l8LX/NW9L3u1pPdlM8KFOfS/VF9e\n/wPiXu/3S/qZ3kqg50raOXCpYGWY2U2S3iDpZc65CwduP21m+d7fHy/piZK+nM0o52PMz/r7Jb3S\nzMpmdp3C5/7pRY9vQV4k6fPOuQf6N6zaax93rtOy/e5nNZN/nn8Uzvr/osJk/qasxzPn5/q9Csud\nd0i6vffnpZL+UNKdvdvfL+myrMc6p+f/eIUrfD4n6e7+6y3psZL+StJ9kj4q6aKsxzrHY7Ah6RFJ\n2wduW9nXX2F4fFBSS+E8iZ+Ne70Vrvx5a++94E5JZ7Ie/5ye//0K54/03wN+v/e1P9b7vbhd0mcl\n/UjW45/Dc4/9WZf0pt5r/wVJL8l6/PN4/r3b/0DSz4187aq99nHnuqX63WebGgAAgBSs4uU/AACA\nhSNUAQAApIBQBQAAkAJCFQAAQAoIVQAAACkgVAEAAKSAUAUAAJCC/w+oKapj4mrseQAAAABJRU5E\nrkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "# 1D kernel - WIO layout\n", + "kernel = onp.array([[[1, 0, -1], [-1, 0, 1]], \n", + " [[1, 1, 1], [-1, -1, -1]]], \n", + " dtype=np.float32).transpose([2,1,0])\n", + "# 1D data - NWC layout\n", + "data = onp.zeros((1, 200, 2), dtype=np.float32)\n", + "for i in range(2):\n", + " for k in range(2):\n", + " x = 35*i + 30 + 60*k\n", + " data[0, x:x+30, k] = 1.0\n", + "\n", + "print(\"in shapes:\", data.shape, kernel.shape)\n", + "\n", + "plt.figure(figsize=(10,5))\n", + "plt.plot(data[0]);\n", + "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", + " ('NWC', 'WIO', 'NWC'))\n", + "print(dn)\n", + "\n", + "out = lax.conv_general_dilated(data, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,), # window strides\n", + " 'SAME', # padding mode\n", + " (1,), # lhs/image dilation\n", + " (1,), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape)\n", + "plt.figure(figsize=(10,5))\n", + "plt.plot(out[0]);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7XOgXqCTmaPa" + }, + "source": [ + "### 3D Convolutions" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 530 + }, + "colab_type": "code", + "id": "QNvSiq5-mcLd", + "outputId": "eecbad0f-f443-43c1-83d6-f8fba22c7383" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "in shapes: (1, 30, 30, 30, 1) (3, 3, 3, 1, 1)\n", + "ConvDimensionNumbers(lhs_spec=(0, 4, 1, 2, 3), rhs_spec=(4, 3, 0, 1, 2), out_spec=(0, 4, 1, 2, 3))\n", + "out shape: (1, 30, 30, 30, 1)\n" + ] + }, + { + "data": { + "image/png": "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\nSObD7ZaPtztu55mb04kxBjrnuB6W6vb3mUV0Fx6F70rF9u4LwMP7IaR3DtoMRQreOUKIWGtxTaKo\nzLrtiC4RcmKKtSUxpsihBFw2nEpm17Rc9h3hNmOMZfCeKUamEEFpnvcDT9Zrxhi++Zk6a1hvt1wN\nA+47cCWw8NtlGfRbeO/49rSEtQZj6oGWSF1jHseZQp3AsEbTWI931fdg8J6ucYhSrBrP066nNw5d\nCnOJTKWw7jzP1wNP+xVZBAwUJazaho+2G36wu0CAQww01vF0tcIbswjue8BS6S6814j8ouIVOVfk\nCqwzKMB4U/0eyNydRpQ2cF5dvuhbdFLcjzPeCYfkEaD3liiJU4pMKfNsveLFas2cM7EUYq4eCx+t\nNzxdrZYlh/eMRXQX3muUgvywJiyCtQZBziY9hSLVYEeoFW7RZ+fgImQpvN4fyWScMRhnedEObNuO\n+znUmWSjQSkuhwGrFK+OB1LJrH3DRdctgvsesojuwnuPMaq6o6lqsKOVZs6RXKrgojWtMeiVJuTq\nRjYlTRahbxwxGdrWMknmLkfmU2bXN3xvvcVozc04cppnWud4Ogw8W62Xg7L3mEV0F957lFJnO8na\nw81n60hvdJ00UIIxmtOYSTkRcsZozbbzKGdIqd5+1IGohNZbQir0zrFp22p8Yy2bpmG9ROe89yyi\nu/De865/g9YKQdM4943xzhwyc8ooDU4Z0IqYM04b5pzYh5k5R4w1fLzZsOs6Xh/23IcZozW7ruPZ\n0rtdOLOI7sJ7zbvbag9TDVpDemeu2HmDymC0x1pLKcL9NHGMkZwL3mqsadiHmcbWMbGrfsAbzUXX\n0zm3CO7CNyyiu/De8+0RMvOOhy+czdK1JeRf+Pz23uOMBqNZN54swlfHA3fzROccnXNLdbvwK1lc\nxhYW/oFMITKnanxujcYYzcvDgcE5lFKcYkArzfXQ441derfvN4u148LCb4IHQ58HS8ub8cTdPAPQ\nGMP1sMIu1e3CIroLC789Ys4ILCu8C++yiO7CwsLCI/JrRXe5DlpYWFh4RBbRXVhYWHhEFtFdWFhY\neEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4\nRBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhE\nFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4ROz/5f5fGyO8sLCwsPCPZ6l0\nFxYWFh6RRXQXFhYWHpFFdBcWFhYekUV0FxYWFh6RRXQXFhYWHpFFdBcWFhYekf8NqyMgE3YvbLEA\nAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvVnMZVtd7v0b3WxX8663qW5X7QYQ\nUOCwP/X4fR/iufiUCzWgwYgK2EW8IeHKLiqJQY0GNeiVRsVAJAE0JhpNNBoU7KLGaDjm6AE3u6ld\ne1f7NqudzWi/i1nUkdCogJtmz19SSb1rrDnWqnrXfNacz3j+/yFSSoyMjIyMPDPIz/UbGBkZGXk2\nMYruyMjIyDPIKLojIyMjzyCj6I6MjIw8g4yiOzIyMvIMov+d8THaMDIyMvKfR3yygfFKd2RkZOQZ\nZBTdkZGRkWeQUXRHRkZGnkFG0R3h9a9/PRcvXmQ2m/H85z+ft7/97ffGPvCBDyClZDKZMJlMuHz5\nMq95zWv4+7//+8/hO/6v5cEHH+R973vf5+18I1/YjKI7wo/+6I/yxBNPsF6v+f3f/33e/OY38w//\n8A/3xi9dusR2u2Wz2fC3f/u3vPCFL+RrvuZr+NM//dPP4bseGfnCZBTdEV70oheR5zkAQgiEEDz6\n6KMf9zwhBJcvX+Ynf/InecMb3sCP/MiPfNI5/+qv/oqXvexl7O3tceXKFd75zncCsFqt+K7v+i6O\njo544IEH+Omf/mlijAC8853v5OUvfzk/+IM/yGKx4KGHHuKP/uiPAPit3/otvvIrv/JjXuMXf/EX\nedWrXvUJX//69eu86lWvYn9/n+c973n8+q//+r2x7/me7+HNb37zvZ8/8IEPcPnyZQC+8zu/kyef\nfJJXvvKVTCYTfu7nfo4nnngCIQS/9mu/xqVLl7h48SK/8Au/8GnPN/LsZhTdEQDe+MY3UlUVL3zh\nC7l48SLf8A3f8Cmf/+pXv5p//Md/ZLfbfdzY1atX+fqv/3re9KY3cefOHT74wQ/y8MMPA/CmN72J\n1WrFY489xp//+Z/zm7/5m7zjHe+4d+zf/d3f8YIXvIDj42N++Id/mO/7vu8jpcQrX/lKPvzhD/PI\nI4/ce+673/1uXvva137C9/ft3/7tXL58mevXr/M7v/M7/NiP/Rh/9md/9u/+P7zrXe/i/vvv5w/+\n4A/Ybrf88A//8L2x97///TzyyCP8yZ/8CW9961v/Q5bBp5pv5NnJKLojAPzyL/8ym82Gv/zLv+TV\nr371vSvfT8alS5dIKbFcLj9u7N3vfjdf93Vfx3d8x3dgjOHg4ICHH36YEALvfe97+dmf/Vmm0ykP\nPvggP/ADP8C73vWue8c+8MADfP/3fz9KKb77u7+bGzducOvWLaqq4pu+6Zt4z3veA8AjjzzChz70\noU94pXvt2jX++q//mre+9a0URcHDDz/MG97wBn7zN3/zM/o/+omf+AnquuYlL3kJ3/u933vvvYyM\n/GcYRXfkHkopXv7yl/PUU0/xK7/yK5/yuU8//TRCCPb29j5u7Nq1azz3uc/9uMePj49xzvHAAw/c\ne+yBBx7g6aefvvfzhQsX7v29qioAttstAK997WvvCd273/1uvvmbv/nec/4t169fZ39/n+l0+klf\n59PhypUrHzPf9evXP6P5Rp6djKI78nF47z+hp/tv+d3f/V2+/Mu/nLquP27sypUrn/D4w8NDjDFc\nvXr13mNPPvkk991333/ofb3iFa+4Z1e85z3v+aTWwqVLlzg9PWWz2XzC16nrmqZp7o3dvHnzY44X\n4hMXE127du1j5rt06dJnNN/Is5NRdJ/l3L59m/e+971st1tCCPzxH/8x73nPe/jar/3aj3tuSomn\nn36at7zlLbz97W/nZ37mZz7hnK973et43/vex2//9m/jvefk5IQPfvCDKKV4zWtew4//+I+z2Wy4\nevUqb3vb23j961//H3qvxhi+9Vu/lR/6oR/i9PSUV7ziFZ/weVeuXOFlL3sZP/qjP0rXdfzTP/0T\nv/Ebv3HvdR5++GH+8A//kNPTU27evMkv/dIvfczx58+f57HHHvu4eX/qp36Kpmn453/+Z97xjnfw\nbd/2bZ/RfCPPUlJKn+rPyBc5t2/fTv/jf/yPNJ/P03Q6TS9+8YvTr/3ar90bf//735+EEKmu61RV\nVbp48WL6lm/5lvQ3f/M3n3Lev/iLv0hf9VVflabTabp8+XJ65zvfmVJK6fT0NL3uda9Lh4eH6fLl\ny+ktb3lLCiGklFJ6xzvekb76q7/6Y+YB0iOPPPIx8wLpjW9846d8/WvXrqVv/MZvTIvFIj3nOc9J\nv/Irv3JvrG3b9JrXvCZNp9P0kpe8JL3tbW9L9913373x3/u930tXrlxJ8/k8/fzP/3x6/PHHE5B+\n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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "# Random 3D kernel - HWDIO layout\n", + "kernel = onp.array([\n", + " [[0, 0, 0], [0, 1, 0], [0, 0, 0]],\n", + " [[0, -1, 0], [-1, 0, -1], [0, -1, 0]], \n", + " [[0, 0, 0], [0, 1, 0], [0, 0, 0]]], \n", + " dtype=np.float32)[:, :, :, onp.newaxis, onp.newaxis]\n", + "\n", + "# 3D data - NHWDC layout\n", + "data = onp.zeros((1, 30, 30, 30, 1), dtype=np.float32)\n", + "x, y, z = onp.mgrid[0:1:30j, 0:1:30j, 0:1:30j]\n", + "data += (onp.sin(2*x*np.pi)*onp.cos(2*y*np.pi)*onp.cos(2*z*np.pi))[None,:,:,:,None]\n", + "\n", + "print(\"in shapes:\", data.shape, kernel.shape)\n", + "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", + " ('NHWDC', 'HWDIO', 'NHWDC'))\n", + "print(dn)\n", + "\n", + "out = lax.conv_general_dilated(data, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1,1), # window strides\n", + " 'SAME', # padding mode\n", + " (1,1,1), # lhs/image dilation\n", + " (1,1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers\n", + "print(\"out shape: \", out.shape)\n", + "\n", + "# Make some simple 3d density plots:\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "def make_alpha(cmap):\n", + " my_cmap = cmap(np.arange(cmap.N))\n", + " my_cmap[:,-1] = np.linspace(0, 1, cmap.N)**3\n", + " return mpl.colors.ListedColormap(my_cmap)\n", + "my_cmap = make_alpha(plt.cm.viridis)\n", + "fig = plt.figure()\n", + "ax = fig.gca(projection='3d')\n", + "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=data.ravel(), cmap=my_cmap)\n", + "ax.axis('off')\n", + "ax.set_title('input')\n", + "fig = plt.figure()\n", + "ax = fig.gca(projection='3d')\n", + "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=out.ravel(), cmap=my_cmap)\n", + "ax.axis('off')\n", + "ax.set_title('3D conv output');" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "DKTMw6tRZyK2" + }, + "source": [ + "## 🔪 NaNs" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ncS0NI4jZrwy" + }, + "source": [ + "### Debugging NaNs\n", + "\n", + "If you want to trace where NaNs are occurring in your functions or gradients, you can turn on the NaN-checker by:\n", + "- setting the `JAX_DEBUG_NANS=True` environment variable.\n", + "- adding from jax.config `import config` and `config.update(\"jax_debug_nans\", True)` near the top of your main file\n", + "- adding `from jax.config import config` and `config.parse_flags_with_absl()` to your main file, then set the option using a command-line flag like `--jax_debug_nans=True`.\n", + "\n", + "This will cause computations to error-out immediately on production of a NaN.\n", + "\n", + "⚠️ You shouldn't have the NaN-checker on if you're not debugging, as it can introduce lots of device-host round-trips and performance regressions!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "YTktlwTTMgFl" + }, + "source": [ + "## 🔪 Double (64bit) precision\n", + "\n", + "At the moment, JAX by default enforces single-precision numbers to mitigate the Numpy API's tendency to aggressively promote operands to `double`. This is the desired behavior for many machine-learning applications, but it may catch you by surprise!" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "CNNGtzM3NDkO", + "outputId": "211d9880-4518-4a7d-f652-e3663274825f" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('float32')" + ] + }, + "execution_count": 14, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", + "x.dtype" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "VcvqzobxNPbd" + }, + "source": [ + "To use double-precision numbers, you need to set the `jax_enable_x64` configuration variable __at startup__. \n", + "\n", + "There are a few ways to do this:\n", + "\n", + "1. You can enable 64bit mode by setting the environment variable `JAX_ENABLE_X64=True`.\n", + "\n", + "2. You can manually set the `jax_enable_x64` configuration flag at startup:\n", + "\n", + "```\n", + "# again, this only works on startup!\n", + "from jax.config import config\n", + "config.update(\"jax_enable_x64\", True)\n", + "```\n", + "\n", + "3. You can parse command-line flags with `absl.app.run(main)`\n", + "\n", + "```\n", + "from jax.config import config\n", + "config.config_with_absl()\n", + "```\n", + "\n", + "4. If you want JAX to run absl parsing for you, i.e. you don't want to do `absl.app.run(main)`, you can instead use\n", + "\n", + "```\n", + "from jax.config import config\n", + "if __name__ == '__main__':\n", + " # calls config.config_with_absl() *and* runs absl parsing\n", + " config.parse_flags_with_absl()\n", + "```\n", + "\n", + "Note that #2-#4 work for _any_ of JAX's configuration options.\n", + "\n", + "We can then confirm that `x64` mode is enabled:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "HqGbBa9Rr-2g" + }, + "outputs": [], + "source": [ + "from jax import numpy as np, random\n", + "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", + "x.dtype # --> dtype('float64')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "6Cks2_gKsXaW" + }, + "source": [ + "### Caveats\n", + "⚠️ XLA doesn't support 64-bit convolutions on all backends!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "WAHjmL0E2XwO" + }, + "source": [ + "## Fin.\n", + "\n", + "If something's not covered here that has caused you weeping and gnashing of teeth, please let us know and we'll extend these introductory _advisos_!" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "Common Gotchas in JAX", + "provenance": [], + "toc_visible": true, + "version": "0.3.2" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb new file mode 100644 index 000000000000..db4a85f98168 --- /dev/null +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -0,0 +1,1545 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Ic1reB4s6vu1" + }, + "source": [ + "# The Autodiff Cookbook\n", + "\n", + "*alexbw@, mattjj@* \n", + "\n", + "JAX has a pretty general automatic differentiation system. In this notebook, we'll go through a whole bunch of neat autodiff ideas that you can cherry pick for your own work, starting with the basics." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "colab_type": "code", + "id": "JTYyZkSO6vuy", + "outputId": "a447ccef-4d24-47e9-e74e-2ee4d3686a03" + }, + "outputs": [], + "source": [ + "import jax.numpy as np\n", + "from jax import grad, jit, vmap\n", + "from jax import random\n", + "\n", + "key = random.PRNGKey(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "YxnjtAGN6vu2" + }, + "source": [ + "## Gradients" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "zqwpfr2vAsvt" + }, + "source": [ + "### Starting with `grad`\n", + "\n", + "You can differentiate a function with `grad`:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "0NLO4Wfknzmk", + "outputId": "bd52f84f-3d72-4881-9163-15654418c498" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.070650816\n" + ] + } + ], + "source": [ + "grad_tanh = grad(np.tanh)\n", + "print(grad_tanh(2.0))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "LGcNfDntoBZI" + }, + "source": [ + "`grad` takes a function and returns a function. If you have a Python function `f` that evaluates the mathematical function $f$, then `grad(f)` is a Python function that evaluates the mathematical function $\\nabla f$. That means `grad(f)(x)` represents the value $\\nabla f(x)$.\n", + "\n", + "Since `grad` operates on functions, you can apply it to its own output to differentiate as many times as you like:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "colab_type": "code", + "id": "RDGk1GDsoawu", + "outputId": "5386f672-16ed-4c49-fe72-0099d855523b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.13621867\n", + "0.25265405\n" + ] + } + ], + "source": [ + "print(grad(grad(np.tanh))(2.0))\n", + "print(grad(grad(grad(np.tanh)))(2.0))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "2rcnpTiinqi8" + }, + "source": [ + "Let's look at computing gradients with `grad` in a linear logistic regression model. First, the setup:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "27TcOT2i6vu5" + }, + "outputs": [], + "source": [ + "def sigmoid(x):\n", + " return 0.5 * (np.tanh(x / 2) + 1)\n", + "\n", + "# Outputs probability of a label being true.\n", + "def predict(W, b, inputs):\n", + " return sigmoid(np.dot(inputs, W) + b)\n", + "\n", + "# Build a toy dataset.\n", + "inputs = np.array([[0.52, 1.12, 0.77],\n", + " [0.88, -1.08, 0.15],\n", + " [0.52, 0.06, -1.30],\n", + " [0.74, -2.49, 1.39]])\n", + "targets = np.array([True, True, False, True])\n", + "\n", + "# Training loss is the negative log-likelihood of the training examples.\n", + "def loss(W, b):\n", + " preds = predict(W, b, inputs)\n", + " label_probs = preds * targets + (1 - preds) * (1 - targets)\n", + " return -np.sum(np.log(label_probs))\n", + "\n", + "# Initialize random model coefficients\n", + "key, W_key, b_key = random.split(key, 3)\n", + "W = random.normal(W_key, (3,))\n", + "b = random.normal(b_key, ())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "8Wk-Yai7ooh1" + }, + "source": [ + "Use the `grad` function with its `argnums` argument to differentiate a function with respect to positional arguments." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 102 + }, + "colab_type": "code", + "id": "bpmd8W8-6vu6", + "outputId": "b009556f-e65c-430a-c967-2522033edd4d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "W_grad [-0.16965586 -0.8774649 -1.4901347 ]\n", + "W_grad [-0.16965586 -0.8774649 -1.4901347 ]\n", + "b_grad -0.2922725\n", + "W_grad [-0.16965586 -0.8774649 -1.4901347 ]\n", + "b_grad -0.2922725\n" + ] + } + ], + "source": [ + "# Differentiate `loss` with respect to the first positional argument:\n", + "W_grad = grad(loss, argnums=0)(W, b)\n", + "print('W_grad', W_grad)\n", + "\n", + "# Since argnums=0 is the default, this does the same thing:\n", + "W_grad = grad(loss)(W, b)\n", + "print('W_grad', W_grad)\n", + "\n", + "# But we can choose different values too, and drop the keyword:\n", + "b_grad = grad(loss, 1)(W, b)\n", + "print('b_grad', b_grad)\n", + "\n", + "# Including tuple values\n", + "W_grad, b_grad = grad(loss, (0, 1))(W, b)\n", + "print('W_grad', W_grad)\n", + "print('b_grad', b_grad)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MDl5UZl4oyzB" + }, + "source": [ + "This `grad` API has a direct correspondence to the excellent notation in Spivak's classic *Calculus on Manifolds* (1965), also used in Sussman and Wisdom's [*Structure and Interpretation of Classical Mechanics*](http://mitpress.mit.edu/sites/default/files/titles/content/sicm_edition_2/book.html) (2015) and their [*Functional Differential Geometry*](https://mitpress.mit.edu/books/functional-differential-geometry) (2013). Both books are open-access. See in particular the \"Prologue\" section of *Functional Differential Geometry* for a defense of this notation.\n", + "\n", + "Essentially, when using the `argnums` argument, if `f` is a Python function for evaluating the mathematical function $f$, then the Python expression `grad(f, i)` evaluates to a Python function for evaluating $\\partial_i f$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "fuz9E2vzro5E" + }, + "source": [ + "### Differentiating with respect to nested lists, tuples, and dicts" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "QQaPja7puMKi" + }, + "source": [ + "Differentiating with respect to standard Python containers just works, so use tuples, lists, and dicts (and arbitrary nesting) however you like." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "IY82kdAe6vu_", + "outputId": "f7d9c99f-bb79-4c50-e106-ccb67180cba8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'b': array(-0.2922725, dtype=float32), 'W': array([-0.16965586, -0.8774649 , -1.4901347 ], dtype=float32)}\n" + ] + } + ], + "source": [ + "def loss2(params_dict):\n", + " preds = predict(params_dict['W'], params_dict['b'], inputs)\n", + " label_probs = preds * targets + (1 - preds) * (1 - targets)\n", + " return -np.sum(np.log(label_probs))\n", + "\n", + "print(grad(loss2)({'W': W, 'b': b}))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "cJ2NxiN58bfI" + }, + "source": [ + "You can [register your own container types](https://github.com/google/jax/issues/446#issuecomment-467105048) to work with not just `grad` but all the JAX transformations (`jit`, `vmap`, etc.)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "PaCHzAtGruBz" + }, + "source": [ + "### Evaluate a function and its gradient using `value_and_grad`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "CSgCjjo-ssnA" + }, + "source": [ + "Another convenient function is `value_and_grad` for efficiently computing both a function's value as well as its gradient's value:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "colab_type": "code", + "id": "RsQSyT5p7OJW", + "outputId": "6a567de9-fa4e-4c54-8dc6-0a6d868693d2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss value 3.0519395\n", + "loss value 3.0519395\n" + ] + } + ], + "source": [ + "from jax import value_and_grad\n", + "loss_value, Wb_grad = value_and_grad(loss, (0, 1))(W, b)\n", + "print('loss value', loss_value)\n", + "print('loss value', loss(W, b))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "rYTrH5tKllC_" + }, + "source": [ + "### Checking against numerical differences\n", + "\n", + "A great thing about derivatives is that they're straightforward to check with finite differences:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "colab_type": "code", + "id": "R8q5RiY3l7Fw", + "outputId": "d87a3b94-8fa7-453d-e1ed-dce15983521f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b_grad_numerical -0.29325485\n", + "b_grad_autodiff -0.2922725\n", + "W_dirderiv_numerical -0.19550323\n", + "W_dirderiv_autodiff -0.19909078\n" + ] + } + ], + "source": [ + "# Set a step size for finite differences calculations\n", + "eps = 1e-4\n", + "\n", + "# Check b_grad with scalar finite differences\n", + "b_grad_numerical = (loss(W, b + eps / 2.) - loss(W, b - eps / 2.)) / eps\n", + "print('b_grad_numerical', b_grad_numerical)\n", + "print('b_grad_autodiff', grad(loss, 1)(W, b))\n", + "\n", + "# Check W_grad with finite differences in a random direction\n", + "key, subkey = random.split(key)\n", + "vec = random.normal(subkey, W.shape)\n", + "unitvec = vec / np.sqrt(np.vdot(vec, vec))\n", + "W_grad_numerical = (loss(W + eps / 2. * unitvec, b) - loss(W - eps / 2. * unitvec, b)) / eps\n", + "print('W_dirderiv_numerical', W_grad_numerical)\n", + "print('W_dirderiv_autodiff', np.vdot(grad(loss)(W, b), unitvec))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "InzB-iiJpVcx" + }, + "source": [ + "JAX provides a simple convenience function that does essentially the same thing, but checks up to any order of differentiation that you like:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "6Ok2LEfQmOuy" + }, + "outputs": [], + "source": [ + "from jax.test_util import check_grads\n", + "check_grads(loss, (W, b), order=2) # check up to 2nd order derivatives" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "id0DXxwt3VJi" + }, + "source": [ + "### Hessian-vector products with `grad`-of-`grad`\n", + "\n", + "One thing we can do with higher-order `grad` is build a Hessian-vector product function. (Later on we'll write an even more efficient implementation that mixes both forward- and reverse-mode, but this one will use pure reverse-mode.)\n", + "\n", + "A Hessian-vector product function can be useful in a [truncated Newton Conjugate-Gradient algorithm](https://en.wikipedia.org/wiki/Truncated_Newton_method) for minimizing smooth convex functions, or for studying the curvature of neural network training objectives (e.g. [1](https://arxiv.org/abs/1406.2572), [2](https://arxiv.org/abs/1811.07062), [3](https://arxiv.org/abs/1706.04454), [4](https://arxiv.org/abs/1802.03451)).\n", + "\n", + "For a scalar-valued function $f : \\mathbb{R}^n \\to \\mathbb{R}$, the Hessian at a point $x \\in \\mathbb{R}^n$ is written as $\\partial^2 f(x)$. A Hessian-vector product function is then able to evaluate\n", + "\n", + "$\\qquad v \\mapsto \\partial^2 f(x) \\cdot v$\n", + "\n", + "for any $v \\in \\mathbb{R}^n$.\n", + "\n", + "The trick is not to instantiate the full Hessian matrix: if $n$ is large, perhaps in the millions or billions in the context of neural networks, then that might be impossible to store.\n", + "\n", + "Luckily, `grad` already gives us a way to write an efficient Hessian-vector product function. We just have to use the identity\n", + "\n", + "$\\qquad \\partial^2 f (x) v = \\partial [x \\mapsto \\partial f(x) \\cdot v] = \\partial g(x)$,\n", + "\n", + "where $g(x) = \\partial f(x) \\cdot v$ is a new scalar-valued function that dots the gradient of $f$ at $x$ with the vector $v$. Nottice that we're only ever differentiating scalar-valued functions of vector-valued arguments, which is exactly where we know `grad` is efficient.\n", + "\n", + "In JAX code, we can just write this:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "Ou5OU-gU9epm" + }, + "outputs": [], + "source": [ + "def hvp(f, x, v):\n", + " return grad(lambda x: np.vdot(grad(f)(x), v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Rb1-5Hpv-ZV0" + }, + "source": [ + "This example shows that you can freely use lexical closure, and JAX will never get perturbed or confused.\n", + "\n", + "We'll check this implementation a few cells down, once we see how to compute dense Hessian matrices. We'll also write an even better version that uses both forward-mode and reverse-mode." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "5A_akvtp8UTu" + }, + "source": [ + "### Jacobians and Hessians using `jacfwd` and `jacrev`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "UP5BbmSm8ZwK" + }, + "source": [ + "You can compute full Jacobian matrices using the `jacfwd` and `jacrev` functions:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 187 + }, + "colab_type": "code", + "id": "cbETzAvKvf5I", + "outputId": "f88e5207-bff4-4d87-8536-2dfe5838c543" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "jacfwd result, with shape (4, 3)\n", + "[[ 0.05981753 0.12883775 0.08857596]\n", + " [ 0.04015912 -0.0492862 0.0068453 ]\n", + " [ 0.1218829 0.01406341 -0.30470726]\n", + " [ 0.00140427 -0.00472519 0.00263776]]\n", + "jacrev result, with shape (4, 3)\n", + "[[ 0.05981753 0.12883775 0.08857595]\n", + " [ 0.04015912 -0.0492862 0.00684531]\n", + " [ 0.1218829 0.01406341 -0.30470726]\n", + " [ 0.00140427 -0.00472519 0.00263776]]\n" + ] + } + ], + "source": [ + "from jax import jacfwd, jacrev\n", + "\n", + "# Isolate the function from the weight matrix to the predictions\n", + "f = lambda W: predict(W, b, inputs)\n", + "\n", + "J = jacfwd(f)(W)\n", + "print(\"jacfwd result, with shape\", J.shape)\n", + "print(J)\n", + "\n", + "J = jacrev(f)(W)\n", + "print(\"jacrev result, with shape\", J.shape)\n", + "print(J)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "iZDL-n_AvgBt" + }, + "source": [ + "These two functions compute the same values (up to machine numerics), but differ in their implementation: `jacfwd` uses forward-mode automatic differentiation, which is more efficient for \"tall\" Jacobian matrices, while `jacrev` uses reverse-mode, which is more efficient for \"wide\" Jacobian matrices. For matrices that are near-square, `jacfwd` probably has an edge over `jacrev`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "zeKlr7Xz8bfm" + }, + "source": [ + "You can also use `jacfwd` and `jacrev` with container types:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 136 + }, + "colab_type": "code", + "id": "eH46Xnm88bfm", + "outputId": "e5b18818-5796-497a-9c30-7cbe6d91e134" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Jacobian from b to logits is\n", + "[0.11503371 0.04563536 0.2343902 0.00189767]\n", + "Jacobian from W to logits is\n", + "[[ 0.05981753 0.12883775 0.08857595]\n", + " [ 0.04015912 -0.0492862 0.00684531]\n", + " [ 0.1218829 0.01406341 -0.30470726]\n", + " [ 0.00140427 -0.00472519 0.00263776]]\n" + ] + } + ], + "source": [ + "def predict_dict(params, inputs):\n", + " return predict(params['W'], params['b'], inputs)\n", + "\n", + "J_dict = jacrev(predict_dict)({'W': W, 'b': b}, inputs)\n", + "for k, v in J_dict.items():\n", + " print(\"Jacobian from {} to logits is\".format(k))\n", + " print(v)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "yH34zjV88bfp" + }, + "source": [ + "For more details on forward- and reverse-mode, as well as how to implement `jacfwd` and `jacrev` as efficiently as possible, read on!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "K6Mpw_7K8bfp" + }, + "source": [ + "Using a composition of two of these functions gives us a way to compute dense Hessian matrices:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 289 + }, + "colab_type": "code", + "id": "n155ypD9rfIZ", + "outputId": "dd6db0a6-af8a-49b3-9599-b9a7c44fc67f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hessian, with shape (4, 3, 3)\n", + "[[[ 0.02285464 0.04922539 0.03384245]\n", + " [ 0.04922538 0.10602392 0.07289143]\n", + " [ 0.03384245 0.07289144 0.05011286]]\n", + "\n", + " [[-0.03195212 0.03921397 -0.00544638]\n", + " [ 0.03921397 -0.04812624 0.0066842 ]\n", + " [-0.00544638 0.0066842 -0.00092836]]\n", + "\n", + " [[-0.01583708 -0.00182736 0.03959271]\n", + " [-0.00182736 -0.00021085 0.00456839]\n", + " [ 0.03959271 0.00456839 -0.09898178]]\n", + "\n", + " [[-0.00103521 0.00348334 -0.00194452]\n", + " [ 0.00348334 -0.01172098 0.00654304]\n", + " [-0.00194452 0.00654304 -0.00365254]]]\n" + ] + } + ], + "source": [ + "def hessian(f):\n", + " return jacfwd(jacrev(f))\n", + "\n", + "H = hessian(f)(W)\n", + "print(\"hessian, with shape\", H.shape)\n", + "print(H)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "wvkk82R6uRoM" + }, + "source": [ + "This shape makes sense: if we start with a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$, then at a point $x \\in \\mathbb{R}^n$ we expect to get the shapes\n", + "* $f(x) \\in \\mathbb{R}^m$, the value of $f$ at $x$,\n", + "* $\\partial f(x) \\in \\mathbb{R}^{m \\times n}$, the Jacobian matrix at $x$,\n", + "* $\\partial^2 f(x) \\in \\mathbb{R}^{m \\times n \\times n}$, the Hessian at $x$,\n", + "\n", + "and so on.\n", + "\n", + "To implement `hessian`, we could have used `jacrev(jacrev(f))` or `jacrev(jacfwd(f))` or any other composition of the two. But forward-over-reverse is typically the most efficient. That's because in the inner Jacobian computation we're often differentiating a function wide Jacobian (maybe like a loss function $f : \\mathbb{R}^n \\to \\mathbb{R}$), while in the outer Jacobian computation we're differentiating a function with a square Jacobian (since $\\nabla f : \\mathbb{R}^n \\to \\mathbb{R}^n$), which is where forward-mode wins out." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "OMmi9cyhs1bj" + }, + "source": [ + "## How it's made: two foundational autodiff functions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "mtSRvouV6vvG" + }, + "source": [ + "### Jacobian-Vector products (JVPs, aka forward-mode autodiff)\n", + "\n", + "JAX includes efficient and general implementations of both forward- and reverse-mode automatic differentiation. The familiar `grad` function is built on reverse-mode, but to explain the difference in the two modes, and when each can be useful, we need a bit of math background.\n", + "\n", + "#### JVPs in math\n", + "\n", + "Mathematically, given a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$, the Jacobian matrix of $f$ evaluated at an input point $x \\in \\mathbb{R}^n$, denoted $\\partial f(x)$, is often thought of as a matrix in $\\mathbb{R}^m \\times \\mathbb{R}^n$:\n", + "\n", + "$\\qquad \\partial f(x) \\in \\mathbb{R}^{m \\times n}$.\n", + "\n", + "But we can also think of $\\partial f(x)$ as a linear map, which maps the tangent space of the domain of $f$ at the point $x$ (which is just another copy of $\\mathbb{R}^n$) to the tangent space of the codomain of $f$ at the point $f(x)$ (a copy of $\\mathbb{R}^m$):\n", + "\n", + "$\\qquad \\partial f(x) : \\mathbb{R}^n \\to \\mathbb{R}^m$.\n", + "\n", + "This map is called the [pushforward map](https://en.wikipedia.org/wiki/Pushforward_(differential)) of $f$ at $x$. The Jacobian matrix is just the matrix for this linear map in a standard basis.\n", + "\n", + "If we don't commit to one specific input point $x$, then we can think of the function $\\partial f$ as first taking an input point and returning the Jacobian linear map at that input point:\n", + "\n", + "$\\qquad \\partial f : \\mathbb{R}^n \\to \\mathbb{R}^n \\to \\mathbb{R}^m$.\n", + "\n", + "In particular, we can uncurry things so that given input point $x \\in \\mathbb{R}^n$ and a tangent vector $v \\in \\mathbb{R}^n$, we get back an output tangent vector in $\\mathbb{R}^m$. We call that mapping, from $(x, v)$ pairs to output tangent vectors, the *Jacobian-vector product*, and write it as\n", + "\n", + "$\\qquad (x, v) \\mapsto \\partial f(x) v$\n", + "\n", + "#### JVPs in JAX code\n", + "\n", + "Back in Python code, JAX's `jvp` function models this transformation. Given a Python function that evaluates $f$, JAX's `jvp` is a way to get a Python function for evaluating $(x, v) \\mapsto (f(x), \\partial f(x) v)$." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "pTncYR6F6vvG" + }, + "outputs": [], + "source": [ + "from jax import jvp\n", + "\n", + "# Isolate the function from the weight matrix to the predictions\n", + "f = lambda W: predict(W, b, inputs)\n", + "\n", + "key, subkey = random.split(key)\n", + "v = random.normal(subkey, W.shape)\n", + "\n", + "# Push forward the vector `v` along `f` evaluated at `W`\n", + "y, u = jvp(f, (W,), (v,))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "m1VJgJYQGfCK" + }, + "source": [ + "In terms of Haskell-like type signatures, we could write\n", + "\n", + "```haskell\n", + "jvp :: (a -> b) -> a -> T a -> (b, T b)\n", + "```\n", + "\n", + "where we use `T a` to denote the type of the tangent space for `a`. In words, `jvp` takes as arguments a function of type `a -> b`, a value of type `a`, and a tangent vector value of type `T a`. It gives back a pair consisting of a value of type `b` and an output tangent vector of type `T b`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "3RpbiasHGD3X" + }, + "source": [ + "The `jvp`-transformed function is evaluated much like the original function, but paired up with each primal value of type `a` it pushes along tangent values of type `T a`. For each primitive numerical operation that the original function would have applied, the `jvp`-transformed function executes a \"JVP rule\" for that primitive that both evaluates the primitive on the primals and applies the primitive's JVP at those primal values.\n", + "\n", + "That evaluation strategy has some immediate implications about computational complexity: since we evaluate JVPs as we go, we don't need to store anything for later, and so the memory cost is independent of the depth of the computation. In addition, the FLOP cost of the `jvp`-transformed function is about 2x the cost of just evaluating the function. Put another way, for a fixed primal point $x$, we can evaluate $v \\mapsto \\partial f(x) \\cdot v$ for about the same cost as evaluating $f$.\n", + "\n", + "That memory complexity sounds pretty compelling! So why don't we see forward-mode very often in machine learning?\n", + "\n", + "To answer that, first think about how you could use a JVP to build a full Jacobian matrix. If we apply a JVP to a one-hot tangent vector, it reveals one column of the Jacobian matrix, corresponding to the nonzero entry we fed in. So we can build a full Jacobian one column at a time, and to get each column costs about the same as one function evaluation. That will be efficient for functions with \"tall\" Jacobians, but inefficient for \"wide\" Jacobians.\n", + "\n", + "If you're doing gradient-based optimization in machine learning, you probably want to minimize a loss function from parameters in $\\mathbb{R}^n$ to a scalar loss value in $\\mathbb{R}$. That means the Jacobian of this function is a very wide matrix: $\\partial f(x) \\in \\mathbb{R}^{1 \\times n}$, which we often identify with the Gradient vector $\\nabla f(x) \\in \\mathbb{R}^n$. Building that matrix one column at a time, with each call taking a similar number of FLOPs to evaluating the original function, sure seems inefficient! In particular, for training neural networks, where $f$ is a training loss function and $n$ can be in the millions or billions, this approach just won't scale.\n", + "\n", + "To do better for functions like this, we just need to use reverse-mode." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "PhkvkZazdXu1" + }, + "source": [ + "### Vector-Jacobian products (VJPs, aka reverse-mode autodiff)\n", + "\n", + "Where forward-mode gives us back a function for evaluating Jacobian-vector products, which we can then use to build Jacobian matrices one column at a time, reverse-mode is a way to get back a function for evaluating vector-Jacobian products (equivalently Jacobian-transpose-vector products), which we can use to build Jacobian matrices one row at a time.\n", + "\n", + "#### VJPs in math\n", + "\n", + "Let's again consider a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$.\n", + "Starting from our notation for JVPs, the notation for VJPs is pretty simple:\n", + "\n", + "$\\qquad (x, v) \\mapsto v \\partial f(x)$,\n", + "\n", + "where $v$ is an element of the cotangent space of $f$ at $x$ (isomorphic to another copy of $\\mathbb{R}^m$). When being rigorous, we should think of $v$ as a linear map $v : \\mathbb{R}^m \\to \\mathbb{R}$, and when we write $v \\partial f(x)$ we mean function composition $v \\circ \\partial f(x)$, where the types work out because $\\partial f(x) : \\mathbb{R}^n \\to \\mathbb{R}^m$. But in the common case we can identify $v$ with a vector in $\\mathbb{R}^m$ and use the two almost interchageably, just like we might sometimes flip between \"column vectors\" and \"row vectors\" without much comment.\n", + "\n", + "With that identification, we can alternatively think of the linear part of a VJP as the transpose (or adjoint conjugate) of the linear part of a JVP:\n", + "\n", + "$\\qquad (x, v) \\mapsto \\partial f(x)^\\mathsf{T} v$.\n", + "\n", + "For a given point $x$, we can write the signature as\n", + "\n", + "$\\qquad \\partial f(x)^\\mathsf{T} : \\mathbb{R}^m \\to \\mathbb{R}^n$.\n", + "\n", + "The corresponding map on cotangent spaces is often called the [pullback](https://en.wikipedia.org/wiki/Pullback_(differential_geometry))\n", + "of $f$ at $x$. The key for our purposes is that it goes from something that looks like the output of $f$ to something that looks like the input of $f$, just like we might expect from a transposed linear function.\n", + "\n", + "#### VJPs in JAX code\n", + "\n", + "Switching from math back to Python, the JAX function `vjp` can take a Python function for evaluating $f$ and give us back a Python function for evaluating the VJP $(x, v) \\mapsto (f(x), v^\\mathsf{T} \\partial f(x))$." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "1tFcRuEzkGRR" + }, + "outputs": [], + "source": [ + "from jax import vjp\n", + "\n", + "# Isolate the function from the weight matrix to the predictions\n", + "f = lambda W: predict(W, b, inputs)\n", + "\n", + "y, vjp_fun = vjp(f, W)\n", + "\n", + "key, subkey = random.split(key)\n", + "u = random.normal(subkey, y.shape)\n", + "\n", + "# Pull back the covector `u` along `f` evaluated at `W`\n", + "v = vjp_fun(u)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "oVOZexCEkvv3" + }, + "source": [ + "In terms of Haskell-like type signatures, we could write\n", + "\n", + "```haskell\n", + "vjp :: (a -> b) -> a -> (b, CT b -> CT a)\n", + "```\n", + "\n", + "where we use `CT a` to denote the type for the cotangent space for `a`. In words, `vjp` takes as arguments a function of type `a -> b` and a point of type `a`, and gives back a pair consisting of a value of type `b` and a linear map of type `CT b -> CT a`.\n", + "\n", + "This is great because it lets us build Jacobian matrices one row at a time, and the FLOP cost for evaluating $(x, v) \\mapsto (f(x), v^\\mathsf{T} \\partial f(x))$ is only about twice the cost of evaluating $f$. In particular, if we want the gradient of a function $f : \\mathbb{R}^n \\to \\mathbb{R}$, we can do it in just one call. That's how `grad` is efficient for gradient-based optimization, even for objectives like neural network training loss functions on millions or billions of parameters.\n", + "\n", + "There's a cost, though: though the FLOPs are friendly, memory scales with the depth of the computation. Also, the implementation is traditionally more complex than that of forward-mode, though JAX has some tricks up its sleeve (that's a story for a future notebook!).\n", + "\n", + "For more on how reverse-mode works, see [this tutorial video from the Deep Learning Summer School in 2017](http://videolectures.net/deeplearning2017_johnson_automatic_differentiation/)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MWHcAPqLdJFn" + }, + "source": [ + "### Hessian-vector products using both forward- and reverse-mode" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "YG3g5C3KdW7H" + }, + "source": [ + "In a previous section, we implemented a Hessian-vector product function just using reverse-mode:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "C70CA-7wdelL" + }, + "outputs": [], + "source": [ + "def hvp(f, x, v):\n", + " return grad(lambda x: np.vdot(grad(f)(x), v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "zJlJbFKCdfd0" + }, + "source": [ + "That's efficient, but we can do even better and save some memory by using forward-mode together with reverse-mode.\n", + "\n", + "Mathematically, given a function $f : \\mathbb{R}^n \\to \\mathbb{R}$ to differentiate, a point $x \\in \\mathbb{R}^n$ at which to linearize the function, and a vector $v \\in \\mathbb{R}^n$, the Hessian-vector product function we want is\n", + "\n", + "$(x, v) \\mapsto \\partial^2 f(x) v$\n", + "\n", + "Consider the helper function $g : \\mathbb{R}^n \\to \\mathbb{R}^n$ defined to be the derivative (or gradient) of $f$, namely $g(x) = \\partial f(x)$. All we need is its JVP, since that will give us\n", + "\n", + "$(x, v) \\mapsto \\partial g(x) v = \\partial^2 f(x) v$.\n", + "\n", + "We can translate that almost directly into code:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "rq3C0reVfAaI" + }, + "outputs": [], + "source": [ + "from jax import jvp, grad\n", + "\n", + "# forward-over-reverse\n", + "def hvp(f, primals, tangents):\n", + " return jvp(grad(f), primals, tangents)[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "XUsye1SwfSFm" + }, + "source": [ + "Even better, since we didn't have to call `np.dot` directly, this `hvp` function works with arrays of any shape and with arbitrary container types (like vectors stored as nested lists/dicts/tuples), and doesn't even have a dependence on `jax.numpy`.\n", + "\n", + "Here's an example of how to use it:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "bmpuQa5_f1Al", + "outputId": "e46e2ac2-5b31-4c0c-dafb-1459bffbe7e7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "def f(X):\n", + " return np.sum(np.tanh(X)**2)\n", + "\n", + "key, subkey1, subkey2 = random.split(key, 3)\n", + "X = random.normal(subkey1, (30, 40))\n", + "V = random.normal(subkey2, (30, 40))\n", + "\n", + "ans1 = hvp(f, (X,), (V,))\n", + "ans2 = np.tensordot(hessian(f)(X), V, 2)\n", + "\n", + "print(np.allclose(ans1, ans2, 1e-4, 1e-4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "aWTii5TyXL5C" + }, + "source": [ + "Another way you might consider writing this is using reverse-over-forward:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "YxwmXZH2XQrw" + }, + "outputs": [], + "source": [ + "# reverse-over-forward\n", + "def hvp_revfwd(f, primals, tangents):\n", + " g = lambda primals: jvp(f, primals, tangents)[1]\n", + " return grad(g)(primals)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "8z-QG_xTXR4I" + }, + "source": [ + "That's not quite as good, though, because forward-mode has less overhead than reverse-mode, and since the outer differentiation operator here has to differentiate a larger computation than the inner one, keeping forward-mode on the outside works best:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + }, + "colab_type": "code", + "id": "lxfv25qTX5gZ", + "outputId": "7ef0894e-99d4-4765-fe5c-b5fcfe6918c5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Forward over reverse\n", + "10 loops, best of 3: 14.3 ms per loop\n", + "Reverse over forward\n", + "10 loops, best of 3: 17.1 ms per loop\n", + "Reverse over reverse\n", + "10 loops, best of 3: 19.6 ms per loop\n", + "Naive full Hessian materialization\n", + "10 loops, best of 3: 99.2 ms per loop\n" + ] + } + ], + "source": [ + "# reverse-over-reverse, only works for single arguments\n", + "def hvp_revrev(f, primals, tangents):\n", + " x, = primals\n", + " v, = tangents\n", + " return grad(lambda x: np.vdot(grad(f)(x), v))(x)\n", + "\n", + "\n", + "print(\"Forward over reverse\")\n", + "%timeit -n10 -r3 hvp(f, (X,), (V,))\n", + "print(\"Reverse over forward\")\n", + "%timeit -n10 -r3 hvp_revfwd(f, (X,), (V,))\n", + "print(\"Reverse over reverse\")\n", + "%timeit -n10 -r3 hvp_revrev(f, (X,), (V,))\n", + "\n", + "print(\"Naive full Hessian materialization\")\n", + "%timeit -n10 -r3 np.tensordot(hessian(f)(X), V, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "xtqSUJgzwQXO" + }, + "source": [ + "## Composing VJPs, JVPs, and `vmap`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "PSL1TciM6vvI" + }, + "source": [ + "### Jacobian-Matrix and Matrix-Jacobian products\n", + "\n", + "Now that we have `jvp` and `vjp` transformations that give us functions to push-forward or pull-back single vectors at a time, we can use JAX's [`vmap` transformation](https://github.com/google/jax#auto-vectorization-with-vmap) to push and pull entire bases at once. In particular, we can use that to write fast matrix-Jacobian and Jacobian-matrix products." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 102 + }, + "colab_type": "code", + "id": "asAWvxVaCmsx", + "outputId": "cf23fb5d-49da-4392-ba49-05a847577a7c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Non-vmapped Matrix-Jacobian product\n", + "10 loops, best of 3: 156 ms per loop\n", + "\n", + "Vmapped Matrix-Jacobian product\n", + "10 loops, best of 3: 6.7 ms per loop\n" + ] + } + ], + "source": [ + "# Isolate the function from the weight matrix to the predictions\n", + "f = lambda W: predict(W, b, inputs)\n", + "\n", + "# Pull back the covectors `m_i` along `f`, evaluated at `W`, for all `i`.\n", + "# First, use a list comprehension to loop over rows in the matrix M.\n", + "def loop_mjp(f, x, M):\n", + " y, vjp_fun = vjp(f, x)\n", + " return np.vstack([vjp_fun(mi) for mi in M])\n", + "\n", + "# Now, use vmap to build a computation that does a single fast matrix-matrix\n", + "# multiply, rather than an outer loop over vector-matrix multiplies.\n", + "def vmap_mjp(f, x, M):\n", + " y, vjp_fun = vjp(f, x)\n", + " return vmap(vjp_fun)(M)\n", + "\n", + "key = random.PRNGKey(0)\n", + "num_covecs = 128\n", + "U = random.normal(key, (num_covecs,) + y.shape)\n", + "\n", + "loop_vs = loop_mjp(f, W, M=U)\n", + "print('Non-vmapped Matrix-Jacobian product')\n", + "%timeit -n10 -r3 loop_mjp(f, W, M=U)\n", + "\n", + "print('\\nVmapped Matrix-Jacobian product')\n", + "vmap_vs = vmap_mjp(f, W, M=U)\n", + "%timeit -n10 -r3 vmap_mjp(f, W, M=U)\n", + "\n", + "assert np.allclose(loop_vs, vmap_vs), 'Vmap and non-vmapped Matrix-Jacobian Products should be identical'" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 102 + }, + "colab_type": "code", + "id": "TDaxsJrlDraK", + "outputId": "88973626-83ff-4293-c47b-070872e76760" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Non-vmapped Jacobian-Matrix product\n", + "10 loops, best of 3: 529 ms per loop\n", + "\n", + "Vmapped Jacobian-Matrix product\n", + "10 loops, best of 3: 5.74 ms per loop\n" + ] + } + ], + "source": [ + "def loop_jmp(f, x, M):\n", + " # jvp immediately returns the primal and tangent values as a tuple,\n", + " # so we'll compute and select the tangents in a list comprehension\n", + " return np.vstack([jvp(f, (W,), (si,))[1] for si in S])\n", + "\n", + "def vmap_jmp(f, x, M):\n", + " _jvp = lambda s: jvp(f, (W,), (s,))[1]\n", + " return vmap(_jvp)(M)\n", + "\n", + "num_vecs = 128\n", + "S = random.normal(key, (num_vecs,) + W.shape)\n", + "\n", + "loop_vs = loop_jmp(f, W, M=S)\n", + "print('Non-vmapped Jacobian-Matrix product')\n", + "%timeit -n10 -r3 loop_jmp(f, W, M=S)\n", + "vmap_vs = vmap_jmp(f, W, M=S)\n", + "print('\\nVmapped Jacobian-Matrix product')\n", + "%timeit -n10 -r3 vmap_jmp(f, W, M=S)\n", + "\n", + "assert np.allclose(loop_vs, vmap_vs), 'Vmap and non-vmapped Jacobian-Matrix products should be identical'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MXFEFBDz6vvL" + }, + "source": [ + "### The implementation of `jacfwd` and `jacrev`\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ZAgUb6sp8bf7" + }, + "source": [ + "Now that we've seen fast Jacobian-matrix and matrix-Jacobian products, it's not hard to guess how to write `jacfwd` and `jacrev`. We just use the same technique to push-forward or pull-back an entire standard basis (isomorphic to an identity matrix) at once." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "HBEzsDH1U5_4" + }, + "outputs": [], + "source": [ + "from jax import jacrev as builtin_jacrev\n", + "\n", + "def our_jacrev(f):\n", + " def jacfun(x):\n", + " y, vjp_fun = vjp(f, x)\n", + " # Use vmap to do a matrix-Jacobian product.\n", + " # Here, the matrix is the Euclidean basis, so we get all\n", + " # entries in the Jacobian at once. \n", + " J, = vmap(vjp_fun, in_axes=0)(np.eye(len(y)))\n", + " return J\n", + " return jacfun\n", + "\n", + "assert np.allclose(builtin_jacrev(f)(W), our_jacrev(f)(W)), 'Incorrect reverse-mode Jacobian results!'" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "Qd9gVZ5t6vvP" + }, + "outputs": [], + "source": [ + "from jax import jacfwd as builtin_jacfwd\n", + "\n", + "def our_jacfwd(f):\n", + " def jacfun(x):\n", + " _jvp = lambda s: jvp(f, (x,), (s,))[1]\n", + " Jt =vmap(_jvp, in_axes=1)(np.eye(len(x)))\n", + " return np.transpose(Jt)\n", + " return jacfun\n", + "\n", + "assert np.allclose(builtin_jacfwd(f)(W), our_jacfwd(f)(W)), 'Incorrect forward-mode Jacobian results!'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7r5_m9Y68bf_" + }, + "source": [ + "Interestingly, [Autograd](https://github.com/hips/autograd) couldn't do this. Our [implementation of reverse-mode `jacobian` in Autograd](https://github.com/HIPS/autograd/blob/96a03f44da43cd7044c61ac945c483955deba957/autograd/differential_operators.py#L60) had to pull back one vector at a time with an outer-loop `map`. Pushing one vector at a time through the computation is much less efficient than batching it all together with `vmap`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "9maev0Nd8bf_" + }, + "source": [ + "Another thing that Autograd couldn't do is `jit`. Interestingly, no matter how much Python dynamism you use in your function to be differentiated, we could always use `jit` on the linear part of the computation. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "_5jDflC08bgB", + "outputId": "483e7276-b6e7-4b09-9476-30fe997fc0d2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(array(3.1415927, dtype=float32),)\n" + ] + } + ], + "source": [ + "def f(x):\n", + " try:\n", + " if x < 3:\n", + " return 2 * x ** 3\n", + " else:\n", + " raise ValueError\n", + " except ValueError:\n", + " return np.pi * x\n", + "\n", + "y, f_vjp = vjp(f, 4.)\n", + "print(jit(f_vjp)(1.))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "3fPWLrxK8bgD" + }, + "source": [ + "## Complex numbers and differentiation" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "2pZOHvrm8bgE" + }, + "source": [ + "JAX is great at complex numbers and differentiation. To support both [holomorphic and non-holomorphic differentiation](https://en.wikipedia.org/wiki/Holomorphic_function), JAX follows [Autograd's convention](https://github.com/HIPS/autograd/blob/master/docs/tutorial.md#complex-numbers) for encoding complex derivatives.\n", + "\n", + "Consider a complex-to-complex function $f: \\mathbb{C} \\to \\mathbb{C}$ that we break down into its component real-to-real functions:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "OaqZ2MuP8bgF" + }, + "outputs": [], + "source": [ + "def f(z):\n", + " x, y = real(z), imag(z)\n", + " return u(x, y), v(x, y) * 1j" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "3XB5oGxl8bgH" + }, + "source": [ + "That is, we've decomposed $f(z) = u(x, y) + v(x, y) i$ where $z = x + y i$. We define `grad(f)` to correspond to" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "hINSv9TS8bgH" + }, + "outputs": [], + "source": [ + "def grad_f(z):\n", + " x, y = real(z), imag(z)\n", + " return grad(u, 0)(x, y) + grad(u, 1)(x, y) * 1j" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "4j0F28bB8bgK" + }, + "source": [ + "In math symbols, that means we define $\\partial f(z) \\triangleq \\partial_0 u(x, y) + \\partial_1 u(x, y)$. So we throw out $v$, ignoring the complex component function of $f$ entirely!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "wLxn8qfC8bgL" + }, + "source": [ + "This convention covers three important cases:\n", + "1. If `f` evaluates a holomorphic function, then we get the usual complex derivative, since $\\partial_0 u = \\partial_1 v$ and $\\partial_1 u = - \\partial_0 v$.\n", + "2. If `f` is evaluates the real-valued loss function of a complex parameter `x`, then we get a result that we can use in gradient-based optimization by taking steps in the direction of the conjugate of `grad(f)(x)`.\n", + "3. If `f` evaluates a real-to-real function, but its implementation uses complex primitives internally (some of which must be non-holomorphic, e.g. FFTs used in convolutions) then we get the same result that an implementation that only used real primitives would have given.\n", + "\n", + "By throwing away `v` entirely, this convention does not handle the case where `f` evaluates a non-holomorphic function and you want to evaluate all of $\\partial_0 u$, $\\partial_1 u$, $\\partial_0 v$, and $\\partial_1 v$ at once. But in that case the answer would have to contain four real values, and so there's no way to express it as a single complex number." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "qmXkI37T8bgL" + }, + "source": [ + "You should expect complex numbers to work everywhere in JAX. Here's differentiating through a Cholesky decomposition of a complex matrix:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "colab_type": "code", + "id": "WrDHHfKI8bgM", + "outputId": "fbc24428-2df8-4d5f-eff1-7a291af56e05" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/jax/numpy/linalg.py:51: UserWarning: numpy.linalg support is experimental and may cause silent failures or wrong outputs\n", + " warnings.warn(_EXPERIMENTAL_WARNING)\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ 1.6623289e+01+0.j , -1.3631358e+00-5.603853j,\n", + " -1.8995681e+00+9.700883j],\n", + " [-1.3631358e+00+5.603853j, -8.9385910e+00+0.j ,\n", + " -5.1351523e+00-6.574377j],\n", + " [-1.8995681e+00-9.700883j, -5.1351523e+00+6.574377j,\n", + " 1.3204273e-02+0.j ]], dtype=complex64)" + ] + }, + "execution_count": 29, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.array([[5., 2.+3j, 5j],\n", + " [2.-3j, 7., 1.+7j],\n", + " [-5j, 1.-7j, 12.]])\n", + "\n", + "def f(X):\n", + " L = np.linalg.cholesky(X)\n", + " return np.sum((L - np.sin(L))**2)\n", + "\n", + "grad(f)(A)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "X_3a2b6M8bgP" + }, + "source": [ + "For primitives' JVP rules, writing the primals as $z = a + bi$ and the tangents as $t = c + di$, we define the Jacobian-vector product $t \\mapsto \\partial f(z) \\cdot t$ as\n", + "\n", + "$t \\mapsto\n", + "\\begin{matrix} \\begin{bmatrix} 1 & 1 \\end{bmatrix} \\\\ ~ \\end{matrix}\n", + "\\begin{bmatrix} \\partial_0 u(a, b) & -\\partial_0 v(a, b) \\\\ - \\partial_1 u(a, b) i & \\partial_1 v(a, b) i \\end{bmatrix}\n", + "\\begin{bmatrix} c \\\\ d \\end{bmatrix}$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "dWwnI2Iz8bgP" + }, + "source": [ + "See Chapter 4 of [Dougal's PhD thesis](https://dougalmaclaurin.com/phd-thesis.pdf) for more details." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Pgr2A60q9gl1" + }, + "source": [ + "## More advanced autodiff\n", + "\n", + "In this notebook, we worked through some easy, and then progressively more complicated, applications of automatic differentiation in JAX. We hope you now feel that taking derivatives in JAX is easy and powerful. \n", + "\n", + "There's a whole world of other autodiff tricks and functionality out there. Topics we didn't cover, but hope to in a \"Advanced Autodiff Cookbook\" include:\n", + "\n", + " - Gauss-Newton Vector Products, linearizing once\n", + " - Custom VJPs and JVPs\n", + " - Efficient derivatives at fixed-points\n", + " - Estimating the trace of a Hessian using random Hessian-vector products.\n", + " - Forward-mode autodiff using only reverse-mode autodiff.\n", + " - Taking derivatives with respect to custom data types.\n", + " - Checkpointing (binomial checkpointing for efficient reverse-mode, not model snapshotting).\n", + " - Optimizing VJPs with Jacobian pre-accumulation." + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "Autodiff Cookbook.ipynb", + "provenance": [], + "toc_visible": true, + "version": "0.3.2" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/notebooks/quickstart.ipynb b/docs/notebooks/quickstart.ipynb similarity index 90% rename from notebooks/quickstart.ipynb rename to docs/notebooks/quickstart.ipynb index 45ba3d7e8800..5cf850aee5ae 100644 --- a/notebooks/quickstart.ipynb +++ b/docs/notebooks/quickstart.ipynb @@ -17,38 +17,6 @@ "accelerator": "GPU" }, "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "logZcM_HEnve", - "colab_type": "text" - }, - "source": [ - "##### Copyright 2018 Google LLC.\n", - "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "QwN47xiBEsKz", - "colab_type": "text" - }, - "source": [ - "Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "you may not use this file except in compliance with the License.\n", - "You may obtain a copy of the License at\n", - "\n", - "https://www.apache.org/licenses/LICENSE-2.0\n", - "\n", - "Unless required by applicable law or agreed to in writing, software\n", - "distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "See the License for the specific language governing permissions and\n", - "limitations under the License." - ] - }, { "cell_type": "markdown", "metadata": { @@ -58,9 +26,7 @@ "source": [ "# JAX Quickstart\n", "\n", - "![](https://raw.githubusercontent.com/google/jax/master/images/jax_logo_250px.png)\n", - "\n", - "#### [JAX](https://github.com/google/jax) is NumPy on the CPU, GPU, and TPU, with great automatic differentiation for high-performance machine learning research.\n", + "**JAX is NumPy on the CPU, GPU, and TPU, with great automatic differentiation for high-performance machine learning research.**\n", "\n", "With its updated version of [Autograd](https://github.com/hips/autograd), JAX\n", "can automatically differentiate native Python and NumPy code. It can\n", @@ -88,7 +54,6 @@ "colab": {} }, "source": [ - "from __future__ import print_function, division\n", "import jax.numpy as np\n", "from jax import grad, jit, vmap\n", "from jax import random" @@ -103,7 +68,7 @@ "id": "FQ89jHCYfhpg" }, "source": [ - "### Multiplying Matrices" + "## Multiplying Matrices" ] }, { @@ -267,7 +232,7 @@ "id": "bTTrTbWvgLUK" }, "source": [ - "### Using `jit` to speed up functions" + "## Using `jit` to speed up functions" ] }, { @@ -328,7 +293,7 @@ "id": "HxpBc4WmfsEU" }, "source": [ - "### Taking derivatives with `grad`\n", + "## Taking derivatives with `grad`\n", "\n", "In addition to evaluating numerical functions, we also want to transform them. One transformation is [automatic differentiation](https://en.wikipedia.org/wiki/Automatic_differentiation). In JAX, just like in [Autograd](https://github.com/HIPS/autograd), you can compute gradients with the `grad` function." ] @@ -435,7 +400,7 @@ "id": "TI4nPsGafxbL" }, "source": [ - "### Auto-vectorization with `vmap`" + "## Auto-vectorization with `vmap`" ] }, { diff --git a/docs/requirements.txt b/docs/requirements.txt index 6fd74ad3282f..ce5ac40797a6 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1 +1,3 @@ -jaxlib \ No newline at end of file +jaxlib +ipykernel +nbsphinx diff --git a/notebooks/Common_Gotchas_in_JAX.ipynb b/notebooks/Common_Gotchas_in_JAX.ipynb deleted file mode 100644 index 6d3c6d3f92e8..000000000000 --- a/notebooks/Common_Gotchas_in_JAX.ipynb +++ /dev/null @@ -1,2355 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "Common Gotchas in JAX", - "version": "0.3.2", - "provenance": [], - "collapsed_sections": [], - "toc_visible": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "accelerator": "GPU" - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "uFfowrpjheff", - "colab_type": "text" - }, - "source": [ - "##### Copyright 2019 Google LLC.\n", - "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "you may not use this file except in compliance with the License.\n", - "You may obtain a copy of the License at\n", - "\n", - "https://www.apache.org/licenses/LICENSE-2.0\n", - "\n", - "Unless required by applicable law or agreed to in writing, software\n", - "distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "See the License for the specific language governing permissions and\n", - "limitations under the License." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hjM_sV_AepYf", - "colab_type": "text" - }, - "source": [ - "# 🔪 JAX - The Sharp Bits 🔪" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4k5PVzEo2uJO", - "colab_type": "text" - }, - "source": [ - "*levskaya@ mattjj@*\n", - "\n", - "When walking about the countryside of [Italy](https://iaml.it/blog/jax-intro), the people will not hesitate to tell you that __JAX__ has _\"una anima di pura programmazione funzionale\"_.\n", - "\n", - "__JAX__ is a language for __expressing__ and __composing__ __transformations__ of numerical programs. As such it needs to control the _unwanted proliferation_ of __side-effects__ in its programs so that analysis and transformation of its computations remain tractable!\n", - "\n", - "This requires us to write code in a _functional_ style with _explicit_ descriptions of how the state of a program changes, which results in __several important differences__ to how you might be used to programming in Numpy, Tensorflow or Pytorch.\n", - "\n", - "Herein we try to cover the most frequent points of trouble that users encounter when starting out in __JAX__." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "n2r1_5_KeiF1", - "colab_type": "text" - }, - "source": [ - "### Imports" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "GoK_PCxPeYcy", - "colab_type": "code", - "colab": {} - }, - "source": [ - "import numpy as onp\n", - "from jax import grad, jit\n", - "from jax import lax\n", - "from jax import random\n", - "import jax\n", - "import jax.numpy as np\n", - "import matplotlib as mpl\n", - "from matplotlib import pyplot as plt\n", - "from matplotlib import rcParams\n", - "rcParams['image.interpolation'] = 'nearest'\n", - "rcParams['image.cmap'] = 'viridis'\n", - "rcParams['axes.grid'] = False" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "oBdKtkVW8Lha", - "colab_type": "text" - }, - "source": [ - "# 🔪 In-Place Updates\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JffAqnEW4JEb", - "colab_type": "text" - }, - "source": [ - "In Numpy you're used to doing this:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "om4xV7_84N9j", - "colab_type": "code", - "outputId": "25ed90e1-74f9-420c-ba06-21e5d6a3b58e", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 153 - } - }, - "source": [ - "numpy_array = onp.zeros((3,3), dtype=np.float32)\n", - "print(\"original array:\")\n", - "print(numpy_array)\n", - "\n", - "# In place, mutating update\n", - "numpy_array[1, :] = 1.0\n", - "print(\"updated array:\")\n", - "print(numpy_array)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "original array:\n", - "[[0. 0. 0.]\n", - " [0. 0. 0.]\n", - " [0. 0. 0.]]\n", - "updated array:\n", - "[[0. 0. 0.]\n", - " [1. 1. 1.]\n", - " [0. 0. 0.]]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "go3L4x3w4-9p", - "colab_type": "text" - }, - "source": [ - "If we try to update a JAX device array in-place, however, we get an __error__! (☉_☉)" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "2AxeCufq4wAp", - "colab_type": "code", - "outputId": "7013374b-041f-4270-db19-cfb4ab992f52", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 198 - } - }, - "source": [ - "jax_array = np.zeros((3,3), dtype=np.float32)\n", - "\n", - "# In place update of JAX's array will yield an error!\n", - "jax_array[1, :] = 1.0" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "error", - "ename": "TypeError", - "evalue": "ignored", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# In place update of JAX's array will yield an error!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mjax_array\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: '_FilledConstant' object does not support item assignment" - ] - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7mo76sS25Wco", - "colab_type": "text" - }, - "source": [ - "__What gives?!__ \n", - "\n", - "Allowing mutation of variables in-place makes program analysis and transformation very difficult. JAX requires a pure functional expression of a numerical program. \n", - "\n", - "Instead, JAX offers the _functional_ update functions: __index_update__, __index_add__, __index_min__, __index_max__, and the __index__ helper.\n", - "\n", - "__NB__: _Fancy Indexing_ is __not__ yet supported, but will likely be added to JAX soon.\n", - "\n", - "️⚠️ inside `jit`'d code and `lax.while_loop` or `lax.fori_loop` the __size__ of slices can't be functions of argument _values_ but only functions of argument _shapes_ -- the slice start indices have no such restriction. See the below __Control Flow__ Section for more information on this limitation." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "m5lg1RYq5D9p", - "colab_type": "code", - "colab": {} - }, - "source": [ - "from jax.ops import index, index_add, index_update" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "X2Xjjvd-l8NL", - "colab_type": "text" - }, - "source": [ - "## index_update" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eM6MyndXL2NY", - "colab_type": "text" - }, - "source": [ - "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "ygUJT49b7BBk", - "colab_type": "code", - "outputId": "c1dc7528-4a4a-4ee6-c9a2-c7e39f95ccb1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 221 - } - }, - "source": [ - "jax_array = np.zeros((3, 3))\n", - "print(\"original array:\")\n", - "print(jax_array)\n", - "\n", - "new_jax_array = index_update(jax_array, index[1, :], 1.)\n", - "\n", - "print(\"old array unchanged:\")\n", - "print(jax_array)\n", - "\n", - "print(\"new array:\")\n", - "print(new_jax_array)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "original array:\n", - "[[0. 0. 0.]\n", - " [0. 0. 0.]\n", - " [0. 0. 0.]]\n", - "old array unchanged:\n", - "[[0. 0. 0.]\n", - " [0. 0. 0.]\n", - " [0. 0. 0.]]\n", - "new array:\n", - "[[0. 0. 0.]\n", - " [1. 1. 1.]\n", - " [0. 0. 0.]]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7to-sF8EmC_y", - "colab_type": "text" - }, - "source": [ - "## index_add" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "iI5cLY1xMBLs", - "colab_type": "text" - }, - "source": [ - "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "tsw2svao8FUp", - "colab_type": "code", - "outputId": "2492b20d-0b8e-4f61-816d-00b8a08ce29f", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 221 - } - }, - "source": [ - "print(\"original array:\")\n", - "jax_array = np.ones((5, 6))\n", - "print(jax_array)\n", - "\n", - "new_jax_array = index_add(jax_array, index[::2, 3:], 7.)\n", - "print(\"new array post-addition:\")\n", - "print(new_jax_array)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "original array:\n", - "[[1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]]\n", - "new array post-addition:\n", - "[[1. 1. 1. 8. 8. 8.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 8. 8. 8.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 8. 8. 8.]]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MUycRNh6e50W", - "colab_type": "text" - }, - "source": [ - "# 🔪 Random Numbers\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "O8vvaVt3MRG2", - "colab_type": "text" - }, - "source": [ - "> _If all scientific papers whose results are in doubt because of bad \n", - "> `rand()`s were to disappear from library shelves, there would be a \n", - "> gap on each shelf about as big as your fist._ - Numerical Recipes" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Qikt9pPW9L5K", - "colab_type": "text" - }, - "source": [ - "## RNGs and State\n", - "You're used to _stateful_ pseudorandom number generators (PRNGs) from numpy and other libraries, which helpfully hide a lot of details under the hood to give you a ready fountain of pseudorandomness:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "rr9FeP41fynt", - "colab_type": "code", - "outputId": "180b7c87-7050-4123-dc42-2356da6f14a2", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "print(onp.random.random())\n", - "print(onp.random.random())\n", - "print(onp.random.random())" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "0.7117779558041075\n", - "0.014396253746679077\n", - "0.7717174868106601\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ORMVVGZJgSVi", - "colab_type": "text" - }, - "source": [ - "Underneath the hood, numpy uses the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) PRNG to power its pseudorandom functions. The PRNG has a period of $2^{19937-1}$ and at any point can be described by __624 32bit unsigned ints__ and a __position__ indicating how much of this \"entropy\" has been used up." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "7Pyp2ajzfPO2", - "colab_type": "code", - "colab": {} - }, - "source": [ - "onp.random.seed(0)\n", - "rng_state = onp.random.get_state()\n", - "#print(rng_state)\n", - "# --> ('MT19937', array([0, 1, 1812433255, 1900727105, 1208447044,\n", - "# 2481403966, 4042607538, 337614300, ... 614 more numbers..., \n", - "# 3048484911, 1796872496], dtype=uint32), 624, 0, 0.0)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aJIxHVXCiM6m", - "colab_type": "text" - }, - "source": [ - "This pseudorandom state vector is automagically updated behind the scenes every time a random number is needed, \"consuming\" 2 of the uint32s in the Mersenne twister state vector:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "GAHaDCYafpAF", - "colab_type": "code", - "colab": {} - }, - "source": [ - "_ = onp.random.uniform()\n", - "rng_state = onp.random.get_state()\n", - "#print(rng_state) \n", - "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", - "# ..., 2648828502, 1678096082], dtype=uint32), 2, 0, 0.0)\n", - "\n", - "# Let's exhaust the entropy in this PRNG statevector\n", - "for i in range(311):\n", - " _ = onp.random.uniform()\n", - "rng_state = onp.random.get_state()\n", - "#print(rng_state) \n", - "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", - "# ..., 2648828502, 1678096082], dtype=uint32), 624, 0, 0.0)\n", - "\n", - "# Next call iterates the RNG state for a new batch of fake \"entropy\".\n", - "_ = onp.random.uniform()\n", - "rng_state = onp.random.get_state()\n", - "# print(rng_state) \n", - "# --> ('MT19937', array([1499117434, 2949980591, 2242547484, \n", - "# 4162027047, 3277342478], dtype=uint32), 2, 0, 0.0)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "N_mWnleNogps", - "colab_type": "text" - }, - "source": [ - "The problem with magic PRNG state is that it's hard to reason about how it's being used and updated across different threads, processes, and devices, and it's _very easy_ to screw up when the details of entropy production and consumption are hidden from the end user.\n", - "\n", - "The Mersenne Twister PRNG is also known to have a [number](https://cs.stackexchange.com/a/53475) of problems, it has a large 2.5Kb state size, which leads to problematic [initialization issues](https://dl.acm.org/citation.cfm?id=1276928). It [fails](http://www.pcg-random.org/pdf/toms-oneill-pcg-family-v1.02.pdf) modern BigCrush tests, and is generally slow. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Uvq7nV-j4vKK", - "colab_type": "text" - }, - "source": [ - "## JAX PRNG" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "COjzGBpO4tzL", - "colab_type": "text" - }, - "source": [ - "\n", - "JAX instead implements an _explicit_ PRNG where entropy production and consumption are handled by explicitly passing and iterating PRNG state. JAX uses a modern [Three-fry counter-based PRNG](https://github.com/google/jax/blob/master/design_notes/prng.md) that's __splittable__. That is, its design allows us to __fork__ the PRNG state into new PRNGs for use with parallel stochastic generation.\n", - "\n", - "The random state is described by two unsigned-int32s that we call a __key__:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "yPHE7KTWgAWs", - "colab_type": "code", - "outputId": "6c2db189-d971-4d60-eb6b-c7ee3a4704b7", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "from jax import random\n", - "key = random.PRNGKey(0)\n", - "key" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([0, 0], dtype=uint32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 196 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "XjYyWYNfq0hW", - "colab_type": "text" - }, - "source": [ - "JAX's random functions produce pseudorandom numbers from the PRNG state, but __do not__ change the state! \n", - "\n", - "Reusing the same state will cause __sadness__ and __monotony__, depriving the enduser of __lifegiving chaos__:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "7zUdQMynoE5e", - "colab_type": "code", - "outputId": "9e1e1f08-19c9-4d22-c78f-4d3e113e185d", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - } - }, - "source": [ - "print(random.normal(key, shape=(1,)))\n", - "print(key)\n", - "# No no no!\n", - "print(random.normal(key, shape=(1,)))\n", - "print(key)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "[-0.20584233]\n", - "[0 0]\n", - "[-0.20584233]\n", - "[0 0]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hQN9van8rJgd", - "colab_type": "text" - }, - "source": [ - "Instead, we __split__ the PRNG to get usable __subkeys__ every time we need a new pseudorandom number:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "ASj0_rSzqgGh", - "colab_type": "code", - "outputId": "ea3fae99-6642-4016-b0c0-938214384fe7", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "print(\"old key\", key)\n", - "key, subkey = random.split(key)\n", - "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", - "print(\" \\---SPLIT --> new key \", key)\n", - "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "old key [0 0]\n", - " \\---SPLIT --> new key [4146024105 967050713]\n", - " \\--> new subkey [2718843009 1272950319] --> normal [-1.2515389]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tqtFVE4MthO3", - "colab_type": "text" - }, - "source": [ - "We propagate the __key__ and make new __subkeys__ whenever we need a new random number:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "jbC34XLor2Ek", - "colab_type": "code", - "outputId": "436713d1-06a3-408e-fbaa-1fedeea73c73", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "print(\"old key\", key)\n", - "key, subkey = random.split(key)\n", - "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", - "print(\" \\---SPLIT --> new key \", key)\n", - "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "old key [4146024105 967050713]\n", - " \\---SPLIT --> new key [2384771982 3928867769]\n", - " \\--> new subkey [1278412471 2182328957] --> normal [-0.5866507]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0KLYUluz3lN3", - "colab_type": "text" - }, - "source": [ - "We can generate more than one __subkey__ at a time:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "lEi08PJ4tfkX", - "colab_type": "code", - "outputId": "7599b43d-930e-4c20-d549-b7694281a59a", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "key, *subkeys = random.split(key, 4)\n", - "for subkey in subkeys:\n", - " print(random.normal(subkey, shape=(1,)))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "[-0.37533447]\n", - "[0.9864503]\n", - "[0.1455319]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "rg4CpMZ8c3ri", - "colab_type": "text" - }, - "source": [ - "# 🔪 Control Flow\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "izLTvT24dAq0", - "colab_type": "text" - }, - "source": [ - "✔ __python control_flow + autodiff__ ✔\n", - "\n", - "If you just want to apply `grad` to your python functions, you can use regular python control-flow constructs with no problems, as if you were using [Autograd](https://github.com/hips/autograd) (or Pytorch or TF Eager)." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "aAx0T3F8lLtu", - "colab_type": "code", - "outputId": "1f75bb41-2d50-451e-c05d-cb946b580d8d", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - } - }, - "source": [ - "def f(x):\n", - " if x < 3:\n", - " return 3. * x ** 2\n", - " else:\n", - " return -4 * x\n", - "\n", - "print(grad(f)(2.)) # ok!\n", - "print(grad(f)(4.)) # ok!" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "12.0\n", - "-4.0\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hIfPT7WMmZ2H", - "colab_type": "text" - }, - "source": [ - "__python control flow + JIT__\n", - "\n", - "Using control flow with `jit` is more complicated, and by default it has more constraints.\n", - "\n", - "This works:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "OZ_BJX0CplNC", - "colab_type": "code", - "outputId": "d75b0e66-273d-461a-814d-a95c40d41ef4", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "@jit\n", - "def f(x):\n", - " for i in range(3):\n", - " x = 2 * x\n", - " return x\n", - "\n", - "print(f(3))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "24\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "22RzeJ4QqAuX", - "colab_type": "text" - }, - "source": [ - "So does this:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "pinVnmRWp6w6", - "colab_type": "code", - "outputId": "f7829934-8cdd-4bba-b540-d9df38c71e95", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "@jit\n", - "def g(x):\n", - " y = 0.\n", - " for i in range(x.shape[0]):\n", - " y = y + x[i]\n", - " return y\n", - "\n", - "print(g(np.array([1., 2., 3.])))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "6.0\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TStltU2dqf8A", - "colab_type": "text" - }, - "source": [ - "But this doesn't, at least by default:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "9z38AIKclRNM", - "colab_type": "code", - "outputId": "f911fb55-f489-4300-f9b1-9142d252f3f9", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 54 - } - }, - "source": [ - "@jit\n", - "def f(x):\n", - " if x < 3:\n", - " return 3. * x ** 2\n", - " else:\n", - " return -4 * x\n", - "\n", - "# This will fail!\n", - "try:\n", - " f(2)\n", - "except Exception as e:\n", - " print(\"ERROR:\", e)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "ERROR: Abstract value passed to `bool`, which requires a concrete value. The function to be transformed can't be traced at the required level of abstraction. If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions instead.\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pIbr4TVPqtDN", - "colab_type": "text" - }, - "source": [ - "__What gives!?__\n", - "\n", - "When we `jit`-compile a function, we usually want to compile a version of the function that works for many different argument values, so that we can cache and reuse the compiled code. That way we don't have to re-compile on each function evaluation.\n", - "\n", - "For example, if we evaluate an `@jit` function on the array `np.array([1., 2., 3.], np.float32)`, we might want to compile code that we can reuse to evaluate the function on `np.array([4., 5., 6.], np.float32)` to save on compile time.\n", - "\n", - "To get a view of your Python code that is valid for many different argument values, JAX traces it on _abstract values_ that represent sets of possible inputs. There are [multiple different levels of abstraction](https://github.com/google/jax/blob/master/jax/abstract_arrays.py), and different transformations use different abstraction levels.\n", - "\n", - "By default, `jit` traces your code on the `ShapedArray` abstraction level, where each abstract value represents the set of all array values with a fixed shape and dtype. For example, if we trace using the abstract value `ShapedArray((3,), np.float32)`, we get a view of the function that can be reused for any concrete value in the corresponding set of arrays. That means we can save on compile time.\n", - "\n", - "But there's a tradeoff here: if we trace a Python function on a `ShapedArray((), np.float32)` that isn't committed to a specific concrete value, when we hit a line like `if x < 3`, the expression `x < 3` evaluates to an abstract `ShapedArray((), np.bool_)` that represents the set `{True, False}`. When Python attempts to coerce that to a concrete `True` or `False`, we get an error: we don't know which branch to take, and can't continue tracing! The tradeoff is that with higher levels of abstraction we gain a more general view of the Python code (and thus save on re-compilations), but we require more constraints on the Python code to complete the trace.\n", - "\n", - "The good news is that you can control this tradeoff yourself. By having `jit` trace on more refined abstract values, you can relax the traceability constraints. For example, using the `static_argnums` argument to `jit`, we can specify to trace on concrete values of some arguments. Here's that example function again:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "-Tzp0H7Bt1Sn", - "colab_type": "code", - "outputId": "1435a6a3-2b1c-4acd-be81-c1361021f3c4", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "def f(x):\n", - " if x < 3:\n", - " return 3. * x ** 2\n", - " else:\n", - " return -4 * x\n", - "\n", - "f = jit(f, static_argnums=(0,))\n", - "\n", - "print(f(2.))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "12.0\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MHm1hIQAvBVs", - "colab_type": "text" - }, - "source": [ - "Here's another example, this time involving a loop:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "iwY86_JKvD6b", - "colab_type": "code", - "outputId": "469a4aeb-2dbd-4f03-9aef-9fd646a717d7", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "def f(x, n):\n", - " y = 0.\n", - " for i in range(n):\n", - " y = y + x[i]\n", - " return y\n", - "\n", - "f = jit(f, static_argnums=(1,))\n", - "\n", - "f(np.array([2., 3., 4.]), 2)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array(5., dtype=float32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 206 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "nSPTOX8DvOeO", - "colab_type": "text" - }, - "source": [ - "In effect, the loop gets statically unrolled. JAX can also trace at _higher_ levels of abstraction, like `Unshaped`, but that's not currently the default for any transformation" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wWdg8LTYwCW3", - "colab_type": "text" - }, - "source": [ - "️⚠️ **functions with argument-__value__ dependent shapes**\n", - "\n", - "These control-flow issues also come up in a more subtle way: numerical functions we want to __jit__ can't specialize the shapes of internal arrays on argument _values_ (specializing on argument __shapes__ is ok). As a trivial example, let's make a function whose output happens to depend on the input variable `length`." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Tqe9uLmUI_Gv", - "colab_type": "code", - "outputId": "dbb43bac-8141-40a3-c760-95656181b598", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - } - }, - "source": [ - "def example_fun(length, val):\n", - " return np.ones((length,)) * val\n", - "# un-jit'd works fine\n", - "print(example_fun(5, 4))\n", - "\n", - "bad_example_jit = jit(example_fun)\n", - "# this will fail:\n", - "try:\n", - " print(bad_example_jit(10, 4))\n", - "except Exception as e:\n", - " print(\"error!\", e)\n", - "# static_argnums tells JAX to recompile on changes at these argument positions:\n", - "good_example_jit = jit(example_fun, static_argnums=(0,))\n", - "# first compile\n", - "print(good_example_jit(10, 4))\n", - "# recompiles\n", - "print(good_example_jit(5, 4))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "[4. 4. 4. 4. 4.]\n", - "error! `full` requires shapes to be concrete. If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions instead.\n", - "[4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]\n", - "[4. 4. 4. 4. 4.]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MStx_r2oKxpp", - "colab_type": "text" - }, - "source": [ - "`static_argnums` can be handy if `length` in our example rarely changes, but it would be disastrous if it changed a lot! \n", - "\n", - "Lastly, if your function has global side-effects, JAX's tracer can cause weird things to happen. A common gotcha is trying to print arrays inside __jit__'d functions: " - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "m2ABpRd8K094", - "colab_type": "code", - "outputId": "06fe7d4e-2c59-4499-c04e-94166916be74", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - } - }, - "source": [ - "@jit\n", - "def f(x):\n", - " print(x)\n", - " y = 2 * x\n", - " print(y)\n", - " return y\n", - "f(2)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Traced\n", - "Traced\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array(4, dtype=int32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 12 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uCDcWG4MnVn-", - "colab_type": "text" - }, - "source": [ - "## Structured control flow primitives\n", - "\n", - "There are more options for control flow in JAX. Say you want to avoid re-compilations but still want to use control flow that's traceable, and that avoids un-rolling large loops. then you can use these 4 structured control flow primitives:\n", - " - `lax.cond` _will be differentiable soon_\n", - " - `lax.while_loop` __non-differentiable__*\n", - " - `lax.fori_loop` __non-differentiable__*\n", - " - `lax.scan` _will be differentiable soon_\n", - "\n", - "*_these can in principle be made to be __forward__-differentiable, but this isn't on the current roadmap._" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Sd9xrLMXeK3A", - "colab_type": "text" - }, - "source": [ - "## cond\n", - "python equivalent:\n", - "\n", - "```\n", - "def cond(pred, true_operand, true_fun, false_operand, false_fun):\n", - " if pred:\n", - " return true_fun(true_operand)\n", - " else:\n", - " return false_fun(false_operand)\n", - "```" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "SGxz9JOWeiyH", - "colab_type": "code", - "outputId": "b91c6e01-c3a7-41a0-b4d2-f815f273c8a7", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "from jax import lax\n", - "\n", - "operand = np.array([0.])\n", - "lax.cond(True, operand, lambda x: x+1, operand, lambda x: x-1)\n", - "# --> array([1.], dtype=float32)\n", - "lax.cond(False, operand, lambda x: x+1, operand, lambda x: x-1)\n", - "# --> array([-1.], dtype=float32)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([-1.], dtype=float32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 207 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "xkOFAw24eOMg", - "colab_type": "text" - }, - "source": [ - "## while_loop\n", - "\n", - "python equivalent:\n", - "```\n", - "def while_loop(cond_fun, body_fun, init_val):\n", - " val = init_val\n", - " while cond_fun(val):\n", - " val = body_fun(val)\n", - " return val\n", - "```" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "jM-D39a-c436", - "colab_type": "code", - "outputId": "496ba1d8-e1d9-4432-d44b-c1104e1e966d", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "init_val = 0\n", - "cond_fun = lambda x: x<10\n", - "body_fun = lambda x: x+1\n", - "lax.while_loop(cond_fun, body_fun, init_val)\n", - "# --> array(10, dtype=int32)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array(10, dtype=int32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 208 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "apo3n3HAeQY_", - "colab_type": "text" - }, - "source": [ - "## fori_loop\n", - "python equivalent:\n", - "```\n", - "def fori_loop(start, stop, body_fun, init_val):\n", - " val = init_val\n", - " for i in range(start, stop):\n", - " val = body_fun(i, val)\n", - " return val\n", - "```" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "dt3tUpOmeR8u", - "colab_type": "code", - "outputId": "3155b3ce-589c-437c-a456-de81b3db0a64", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "init_val = 0\n", - "start = 0\n", - "stop = 10\n", - "body_fun = lambda i,x: x+i\n", - "lax.fori_loop(start, stop, body_fun, init_val)\n", - "# --> array(45, dtype=int32)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array(45, dtype=int32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 209 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SipXS5qiqk8e", - "colab_type": "text" - }, - "source": [ - "## Summary\n", - "\n", - "$$\n", - "\\begin{array} {r|rr} \n", - "\\hline \\\n", - "\\textrm{construct} \n", - "& \\textrm{jit} \n", - "& \\textrm{grad} \\\\\n", - "\\hline \\\n", - "\\textrm{if} & ❌ & ✔ \\\\\n", - "\\textrm{for} & ✔* & ✔\\\\\n", - "\\textrm{while} & ✔* & ✔\\\\\n", - "\\textrm{lax.cond} & ✔ & \\textrm{soon!}\\\\\n", - "\\textrm{lax.while_loop} & ✔ & ❌\\\\\n", - "\\textrm{lax.fori_loop} & ✔ & ❌\\\\\n", - "\\textrm{lax.scan} & \\textrm{soon!} & \\textrm{soon!}\\\\\n", - "\\hline\n", - "\\end{array}\n", - "$$\n", - "
* = argument-__value__-independent loop condition - unrolls the loop
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bxuUjFVG-v1h", - "colab_type": "text" - }, - "source": [ - "# 🔪 Convolutions\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0pcn2LeS-03b", - "colab_type": "text" - }, - "source": [ - "JAX and XLA offer the very general N-dimensional __conv_general_dilated__ function, but it's not very obvious how to use it. We'll give some examples of the common use-cases. There are also the convenience functions `lax.conv` and `lax.conv_general_padding` for the most common kinds of convolutions.\n", - "\n", - "A survey of the family of convolutional operators, [a guide to convolutional arithmetic](https://arxiv.org/abs/1603.07285) is highly recommended reading!\n", - "\n", - "Let's define a simple diagonal edge kernel:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Yud1Y3ss-x1K", - "colab_type": "code", - "outputId": "1674482b-501a-43eb-91c6-0bef42a73d6d", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - } - }, - "source": [ - "# 2D kernel - HWIO layout\n", - "kernel = onp.zeros((3, 3, 3, 3), dtype=np.float32)\n", - "kernel += onp.array([[1, 1, 0],\n", - " [1, 0,-1],\n", - " [0,-1,-1]])[:, :, onp.newaxis, onp.newaxis]\n", - "\n", - "print(\"Edge Conv kernel:\")\n", - "plt.imshow(kernel[:, :, 0, 0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Edge Conv kernel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAADe5JREFUeJzt3X+snmV9x/H3Zy1gJkwqJdKUKj+j\nc24GPEGUxTRDEySGLpEl8IeC0XQ4yZRoMtQEE5Nl6h8uYxpJA0RYDDaCgeNSQ2DAcFmKVFIohSCF\nuLS1EyyuyHSysu/+ODfm8XB+9Xru8zzP0fcrefJc931f576+vdp8ev9sU1VI0pH6vXEXIGllMjwk\nNTE8JDUxPCQ1MTwkNTE8JDUZKjySvDbJXUme7L7XzNPvpSQ7u8/0MGNKmgwZ5jmPJF8CnquqLyS5\nGlhTVX8zR78XqurYIeqUNGGGDY8ngI1VdSDJOuC+qnrjHP0MD+m3zLDh8V9VdXzXDvCzl5dn9TsM\n7AQOA1+oqtvn2d9mYDPAq38/b3vTGUc31ybt+tmJ4y5h4r24d99Pq6ppolYv1iHJ3cBJc2z67OBC\nVVWS+ZLoDVW1P8lpwD1JdlXVU7M7VdUWYAvA1FtfVd+/c8OivwBpPqdvvWLcJUy8H33iU//R+rOL\nhkdVvXu+bUl+kmTdwGnLM/PsY3/3/XSS+4CzgFeEh6SVY9hbtdPAZV37MuCO2R2SrElyTNdeC5wH\nPDbkuJLGbNjw+ALwniRPAu/ulkkyleT6rs8fAjuSPAzcy8w1D8NDWuEWPW1ZSFUdBM6fY/0O4CNd\n+9+BPx5mHEmTxydMJTUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwk\nNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1\nMTwkNeklPJJckOSJJHuSXD3H9mOSbO22P5DklD7GlTQ+Q4dHklXAV4H3Am8GLk3y5lndPgz8rKrO\nAP4e+OKw40oarz6OPM4B9lTV01X1IvBNYNOsPpuAm7r2rcD5SdLD2JLGpI/wWA/sHVje162bs09V\nHQYOASf0MLakMZmoC6ZJNifZkWTHswdfGnc5khbQR3jsBzYMLJ/crZuzT5LVwGuAg7N3VFVbqmqq\nqqZOPGFVD6VJWi59hMeDwJlJTk1yNHAJMD2rzzRwWde+GLinqqqHsSWNyephd1BVh5NcCdwJrAJu\nrKrdST4P7KiqaeAG4J+S7AGeYyZgJK1gQ4cHQFVtA7bNWnfNQPt/gL/oYyxJk2GiLphKWjkMD0lN\nDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0M\nD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU16CY8kFyR5Isme\nJFfPsf3yJM8m2dl9PtLHuJLGZ/WwO0iyCvgq8B5gH/BgkumqemxW161VdeWw40maDH0ceZwD7Kmq\np6vqReCbwKYe9itpgg195AGsB/YOLO8D3j5Hv/cneRfwQ+Cqqto7u0OSzcBmgNev76O0316nb71i\n3CVMvDOu2j7uEibej4b42VFdMP0OcEpV/QlwF3DTXJ2qaktVTVXV1IknrBpRaZJa9BEe+4ENA8sn\nd+t+raoOVtWvusXrgbf1MK6kMeojPB4EzkxyapKjgUuA6cEOSdYNLF4EPN7DuJLGaOgLC1V1OMmV\nwJ3AKuDGqtqd5PPAjqqaBv46yUXAYeA54PJhx5U0Xr1clayqbcC2WeuuGWh/Gvh0H2NJmgw+YSqp\nieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ\n4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIalJL+GR5MYkzyR5\ndJ7tSXJtkj1JHklydh/jShqfvo48vg5csMD29wJndp/NwNd6GlfSmPQSHlV1P/DcAl02ATfXjO3A\n8UnW9TG2pPEY1TWP9cDegeV93brfkGRzkh1Jdjx78KURlSapxURdMK2qLVU1VVVTJ56watzlSFrA\nqMJjP7BhYPnkbp2kFWpU4TENfLC763IucKiqDoxobEnLYHUfO0lyC7ARWJtkH/A54CiAqroO2AZc\nCOwBfgF8qI9xJY1PL+FRVZcusr2Aj/UxlqTJMFEXTCWtHIaHpCaGh6QmhoekJoaHpCaGh6Qmhoek\nJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6Qm\nhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmvYRHkhuTPJPk0Xm2b0xyKMnO7nNNH+NKGp9e/qNr4OvA\nV4CbF+jzvap6X0/jSRqzXo48qup+4Lk+9iVpZejryGMp3pHkYeDHwKeqavfsDkk2A5sBVq1Zw+lb\nrxhheSvLGVdtH3cJ+h03qgumDwFvqKq3Av8I3D5Xp6raUlVTVTW16thXj6g0SS1GEh5V9XxVvdC1\ntwFHJVk7irElLY+RhEeSk5Kka5/TjXtwFGNLWh69XPNIcguwEVibZB/wOeAogKq6DrgY+GiSw8Av\ngUuqqvoYW9J49BIeVXXpItu/wsytXEm/JXzCVFITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NS\nE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1IT\nw0NSE8NDUhPDQ1ITw0NSE8NDUpOhwyPJhiT3Jnksye4kH5+jT5Jcm2RPkkeSnD3suJLGq4//6Pow\n8MmqeijJccAPktxVVY8N9HkvcGb3eTvwte5b0go19JFHVR2oqoe69s+Bx4H1s7ptAm6uGduB45Os\nG3ZsSePT6zWPJKcAZwEPzNq0Htg7sLyPVwaMpBWkt/BIcixwG/CJqnq+cR+bk+xIsuOlF/67r9Ik\nLYNewiPJUcwExzeq6ttzdNkPbBhYPrlb9xuqaktVTVXV1KpjX91HaZKWSR93WwLcADxeVV+ep9s0\n8MHursu5wKGqOjDs2JLGp4+7LecBHwB2JdnZrfsM8HqAqroO2AZcCOwBfgF8qIdxJY3R0OFRVf8G\nZJE+BXxs2LEkTQ6fMJXUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTw\nkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ\n1MTwkNTE8JDUZOjwSLIhyb1JHkuyO8nH5+izMcmhJDu7zzXDjitpvFb3sI/DwCer6qEkxwE/SHJX\nVT02q9/3qup9PYwnaQIMfeRRVQeq6qGu/XPgcWD9sPuVNNlSVf3tLDkFuB94S1U9P7B+I3AbsA/4\nMfCpqto9x89vBjZ3i28BHu2tuH6sBX467iIGWM/CJq0emLya3lhVx7X8YG/hkeRY4F+Bv62qb8/a\n9gfA/1XVC0kuBP6hqs5cZH87qmqql+J6Mmk1Wc/CJq0emLyahqmnl7stSY5i5sjiG7ODA6Cqnq+q\nF7r2NuCoJGv7GFvSePRxtyXADcDjVfXlefqc1PUjyTnduAeHHVvS+PRxt+U84APAriQ7u3WfAV4P\nUFXXARcDH01yGPglcEktfr60pYfa+jZpNVnPwiatHpi8mprr6fWCqaTfHT5hKqmJ4SGpycSER5LX\nJrkryZPd95p5+r008Jj79DLUcUGSJ5LsSXL1HNuPSbK12/5A92zLslpCTZcneXZgXj6yjLXcmOSZ\nJHM+g5MZ13a1PpLk7OWq5QhqGtnrEUt8XWOkc7Rsr5BU1UR8gC8BV3ftq4EvztPvhWWsYRXwFHAa\ncDTwMPDmWX3+Criua18CbF3meVlKTZcDXxnR79O7gLOBR+fZfiHwXSDAucADE1DTRuCfRzQ/64Cz\nu/ZxwA/n+P0a6RwtsaYjnqOJOfIANgE3de2bgD8fQw3nAHuq6umqehH4ZlfXoME6bwXOf/k29Bhr\nGpmquh94boEum4Cba8Z24Pgk68Zc08jU0l7XGOkcLbGmIzZJ4fG6qjrQtf8TeN08/V6VZEeS7Un6\nDpj1wN6B5X28cpJ/3aeqDgOHgBN6ruNIawJ4f3cIfGuSDctYz2KWWu+ovSPJw0m+m+SPRjFgd0p7\nFvDArE1jm6MFaoIjnKM+nvNYsiR3AyfNsemzgwtVVUnmu4f8hqran+Q04J4ku6rqqb5rXWG+A9xS\nVb9K8pfMHBn92ZhrmiQPMfPn5uXXI24HFnw9Yljd6xq3AZ+ogfe8xmmRmo54jkZ65FFV766qt8zx\nuQP4ycuHbt33M/PsY3/3/TRwHzMp2pf9wODf2id36+bsk2Q18BqW92nZRWuqqoNV9atu8XrgbctY\nz2KWMocjVSN+PWKx1zUYwxwtxyskk3TaMg1c1rUvA+6Y3SHJmiTHdO21zDzdOvvfDRnGg8CZSU5N\ncjQzF0Rn39EZrPNi4J7qrjgtk0VrmnW+fBEz57TjMg18sLujcC5waOB0dCxG+XpEN86Cr2sw4jla\nSk1NczSKK9BLvCJ8AvAvwJPA3cBru/VTwPVd+53ALmbuOOwCPrwMdVzIzNXop4DPdus+D1zUtV8F\nfAvYA3wfOG0Ec7NYTX8H7O7m5V7gTctYyy3AAeB/mTlX/zBwBXBFtz3AV7tadwFTI5ifxWq6cmB+\ntgPvXMZa/hQo4BFgZ/e5cJxztMSajniOfDxdUpNJOm2RtIIYHpKaGB6SmhgekpoYHpKaGB6Smhge\nkpr8P9IpB0Tn+nMHAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dITPaPdh_cMI", - "colab_type": "text" - }, - "source": [ - "And we'll make a simple synthetic image:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "cpbGsIGa_Qyx", - "colab_type": "code", - "outputId": "44f0c042-3c74-4f39-9ed2-cd651cbc13fc", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - } - }, - "source": [ - "# NHWC layout\n", - "img = onp.zeros((1, 200, 198, 3), dtype=np.float32)\n", - "for k in range(3):\n", - " x = 30 + 60*k\n", - " y = 20 + 60*k\n", - " img[0, x:x+10, y:y+10, k] = 1.0\n", - "\n", - "print(\"Original Image:\")\n", - "plt.imshow(img[0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Original Image:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_m90y74OWorG", - "colab_type": "text" - }, - "source": [ - "## lax.conv and lax.conv_with_general_padding" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Pv9_QPDnWssM", - "colab_type": "text" - }, - "source": [ - "These are the simple convenience functions for convolutions\n", - "\n", - "️⚠️ The convenience `lax.conv`, `lax.conv_with_general_padding` helper function assume __NCHW__ images and __IOHW__ kernels." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "kppxbxpZW0nb", - "colab_type": "code", - "outputId": "2c872f2b-b71a-4821-d870-0b3a4f1eeee9", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "out = lax.conv(np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", - " np.transpose(kernel,[2,3,0,1]), # rhs = IOHW conv kernel tensor\n", - " (1, 1), # window strides\n", - " 'SAME') # padding mode\n", - "print(\"out shape: \", out.shape)\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,0,:,:]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 3, 200, 198)\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nuwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "aonr1tWvYCW9", - "colab_type": "code", - "outputId": "63727dd7-1758-4aa0-f93f-557758a160a8", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "out = lax.conv_with_general_padding(\n", - " np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", - " np.transpose(kernel,[2,3,0,1]), # rhs = IOHW conv kernel tensor\n", - " (1, 1), # window strides\n", - " ((2,2),(2,2)), # general padding 2x2\n", - " (1,1), # lhs/image dilation\n", - " (1,1)) # rhs/kernel dilation\n", - "print(\"out shape: \", out.shape)\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,0,:,:]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 3, 202, 200)\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lyOwGRez_ycJ", - "colab_type": "text" - }, - "source": [ - "## Dimension Numbers define dimensional layout for conv_general_dilated\n", - "\n", - "The important argument is the 3-tuple of axis layout arguments:\n", - "(Input Layout, Kernel Layout, Output Layout)\n", - " - __N__ - batch dimension\n", - " - __H__ - spatial height\n", - " - __W__ - spatial height\n", - " - __C__ - channel dimension\n", - " - __I__ - kernel _input_ channel dimension\n", - " - __O__ - kernel _output_ channel dimension\n", - "\n", - "⚠️ To demonstrate the flexibility of dimension numbers we choose a __NHWC__ image and __HWIO__ kernel convention for `lax.conv_general_dilated` below." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "oXKebfCb_i2B", - "colab_type": "code", - "outputId": "0b80fca6-0eb7-4baf-d824-458c3739d052", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "dn = lax.conv_dimension_numbers(img.shape, # only ndim matters, not shape\n", - " kernel.shape, # only ndim matters, not shape \n", - " ('NHWC', 'HWIO', 'NHWC')) # the important bit\n", - "print(dn)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "ConvDimensionNumbers(lhs_spec=(0, 3, 1, 2), rhs_spec=(3, 2, 0, 1), out_spec=(0, 3, 1, 2))\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "elZys_HzFVG6", - "colab_type": "text" - }, - "source": [ - "## SAME padding, no stride, no dilation" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "rgb2T15aFVG6", - "colab_type": "code", - "outputId": "93fed3a7-69d2-4046-de2f-487ff34b5ee2", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'SAME', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape)\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 200, 198, 3)\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nuwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E4i3TI5JFVG9", - "colab_type": "text" - }, - "source": [ - "## VALID padding, no stride, no dilation" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "1HQwudKVFVG-", - "colab_type": "code", - "outputId": "9edf1704-b920-4666-8a49-2db7dd622fd1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'VALID', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \"DIFFERENT from above!\")\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 198, 196, 3) DIFFERENT from above!\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "VYKZdqLIFVHB", - "colab_type": "text" - }, - "source": [ - "## SAME padding, 2,2 stride, no dilation" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "mKq2-zmmFVHC", - "colab_type": "code", - "outputId": "73b80162-fdca-4f6a-ec06-4645d6fdc9f6", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (2,2), # window strides\n", - " 'SAME', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \" <-- half the size of above\")\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 100, 99, 3) <-- half the size of above\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gPxttaiaFVHE", - "colab_type": "text" - }, - "source": [ - "## VALID padding, no stride, rhs kernel dilation ~ Atrous convolution (excessive to illustrate)" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "_pGr0x6qFVHF", - "colab_type": "code", - "outputId": "a0f489eb-bab7-42c4-c030-fb756f63a4a4", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'VALID', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (12,12), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape)\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 176, 174, 3)\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nAFSiCACgEkUAAJUoAgCoRBEAQCWKAAAqUQQAUIkiAICqZq216xmamS9Un62urH53x+PswoW43Rfi\nNpftvtBciNt9IW5z2e5z3X+71voTT7XSORFFXzUzJ9Zax3c9xzPtQtzuC3Gby3bveo5n2oW43Rfi\nNpft3vUcB8XbZwAAiSIAgOrci6K7dj3AjlyI230hbnPZ7gvNhbjdF+I2l+0+Es6pc4oAAHblXDtS\nBACwE+dEFM3MzTPziZk5OTOv3vU8h2VmrpmZ98zMR2fmIzPzo5vlV8zMu2fmk5uvz971rAdtZi6a\nmV+fmV/a3L9uZt632ef3zMzFu57xoM3M5TPzjpn5+Mx8bGb+3AWyr1+5+fv94Zl568x8/VHc3zPz\nppl5eGY+vG/Zaffv7Pm5zfZ/cGZesLvJt3OG7f4Hm7/nH5yZfzUzl+977DWb7f7EzHz3bqbe3um2\ne99jr5qZNTNXbu4f6f29Wf4jm33+kZn5+/uWn9f7e+dRNDMXVf9H9ZLq+dXLZub5u53q0DxWvWqt\n9fzqpuoVm219dXXfWuvG6r7N/aPmR6uP7bv/M9Wda60bqt+vXr6TqQ7Xz1b/Zq31p6tva2/7j/S+\nnpmrqr9THV9rfWt1UXVrR3N/v7m6+QnLzrR/X1LduPlze/X6Z2jGw/Dmnrzd766+da31Z6rfql5T\ntfn5dmv1LZvn/JPNz/zz0Zt78nY3M9dUf6n63L7FR3p/z8x3VbdU37bW+pbqH26Wn/f7e+dRVL2w\nOrnW+vRa6yvV29r7H/vIWWs9tNb6wOb2f27vP5JXtbe9d29Wu7v6/t1MeDhm5urqL1c/v7k/1Yuq\nd2xWOYrb/Merv1C9sWqt9ZW11hc74vt641j1x2bmWPWs6qGO4P5ea723+r0nLD7T/r2l+oW15/7q\n8pl57jMz6cE63Xavtf7dWuuxzd37q6s3t2+p3rbWenSt9ZnqZHs/8887Z9jfVXdWP17tP0H3SO/v\n6m9VP73WenSzzsOb5ef9/j4Xouiq6oF9909tlh1pM3Nt9e3V+6rnrLUe2jz0+eo5OxrrsPzj9n5o\n/NHm/jdUX9z3Q/Qo7vPrqi9U/3TztuHPz8ylHfF9vdZ6sL3/1/i59mLoS9WvdfT391edaf9eSD/n\n/mb1rze3j/R2z8wt1YNrrd98wkNHerur51V/fvOW+H+cmT+7WX7eb/e5EEUXnJm5rPqX1Y+ttf7T\n/sfW3uWAR+aSwJn53urhtdav7XqWZ9ix6gXV69da31490hPeKjtq+7pqcw7NLe1F4TdVl3aatxwu\nBEdx/z6Vmfmp9k4TeMuuZzlsM/Os6ier/2XXs+zAseqK9k4D+Z+rt2/eATjvnQtR9GB1zb77V2+W\nHUkz83XtBdFb1lrv3Cz+na8eWt18ffhMzz8PfUf1fTPz2+29Nfqi9s61uXzz9kodzX1+qjq11nrf\n5v472ouko7yvq/5i9Zm11hfWWn9YvbO9vwNHfX9/1Zn275H/OTczf7363uqH1v//WS9Hebuvby/+\nf3Pz8+3q6gMz8yc72ttdez/f3rl5e/D97b0LcGVHYLvPhSj61erGzdUpF7d3kta9O57pUGxK+o3V\nx9Za/2jfQ/dWt21u31a965me7bCstV6z1rp6rXVte/v2P6y1fqh6T/UDm9WO1DZXrbU+Xz0wM9+8\nWfTi6qMd4X298bnqppl51ubv+1e3+0jv733OtH/vrX54c1XSTdWX9r3Ndt6bmZvbe4v8+9Zaf7Dv\noXurW2fmkpm5rr0Tj9+/ixkP2lrrQ2utb1xrXbv5+XaqesHm3/6R3t/VL1bfVTUzz6subu+Xwp7/\n+3uttfM/1fe0d8XCp6qf2vU8h7id/0N7h9M/WP3G5s/3tHeOzX3VJ6t/X12x61kPafu/s/qlze0/\n1d4/lpPVv6gu2fV8h7C9/111YrO/f7F69oWwr6v/rfp49eHqn1WXHMX9Xb21vfOm/rC9/yC+/Ez7\nt5r2rrL9VPWh9q7O2/k2HOB2n2zvXJKv/lx7w771f2qz3Z+oXrLr+Q9yu5/w+G9XV14g+/vi6p9v\n/o1/oHrRUdnfPtEaAKBz4+0zAICdE0UAAIkiAIBKFAEAVKIIAKASRQAAlSgCAKhEEQBAVf8vMwxh\njUiRM0EAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "v-RhEeUfFVHI", - "colab_type": "text" - }, - "source": [ - "## VALID padding, no stride, lhs=input dilation ~ Transposed Convolution" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "B9Ail8ppFVHJ", - "colab_type": "code", - "outputId": "03d00b5a-ec38-435a-81f7-79d4737239c0", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'SAME', # padding mode\n", - " (2,2), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \"<-- larger than original!\")\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 399, 395, 3) <-- larger than original!\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\njAAAxv8H2emSG61MbfQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "A-9OagtrVDyV", - "colab_type": "text" - }, - "source": [ - "We can use the last to, for instance, implement _transposed convolutions_:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "5EYIj77-NdHE", - "colab_type": "code", - "outputId": "d2e82a42-9c8e-4973-f760-511a14805527", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - } - }, - "source": [ - "# The following is equivalent to tensorflow:\n", - "# N,H,W,C = img.shape\n", - "# out = tf.nn.conv2d_transpose(img, kernel, (N,2*H,2*W,C), (1,2,2,1))\n", - "\n", - "# transposed conv = 180deg kernel roation plus LHS dilation\n", - "# rotate kernel 180deg:\n", - "kernel_rot = np.rot90(np.rot90(kernel, axes=(0,1)), axes=(0,1))\n", - "# need a custom output padding:\n", - "padding = ((2, 1), (2, 1))\n", - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel_rot, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " padding, # padding mode\n", - " (2,2), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \"<-- transposed_conv\")\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "out shape: (1, 400, 396, 3) <-- transposed_conv\n", - "First output channel:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nVXV3VT1cVQ9V1W/P+LY8Ro6zHtvyGKmq51bVZ6vqi7MefzDjl1TVvfO6b6uq58z42XN7Ze5/4TLn\nv9mOsx4fqqqvrTk+9sz4Gf37ckq6e2lfSXYk+UqSf5fkOUm+mOTFy5zTktbh60me/6yx/5rkhtm+\nIckfL3ueC3z9v57kiiQPnuj1J7k6yV8lqST7kty77Plv0Xq8M8l/Psq+L57fm7OTXDK/TzuW/Ro2\neT0uSHLFbD8vyT/M696Wx8hx1mNbHiPz33nXbJ+V5N757357kmtm/P1J/uNs/6ck75/ta5LctuzX\nsEXr8aEkrznK/mf078upfC37HaMrk6x091e7+1+S3Jpk/5LndLrYn+SW2b4lyauXOJeF6u5PJ/nW\ns4aP9fr3J/lwr7onyblVdcHWzHRrHGM9jmV/klu7+6nu/lqSlaz+Xp0xuvtQd39htr+f5JEkF2ab\nHiPHWY9jOaOPkfnv/OTcPGu+OsnLknxkxp99fDxz3HwkycurqrZougt3nPU4ljP69+VULDuMLkzy\n6Jrbj+X4v+Bnqk7yt1X1+ao6MGPnd/eh2f5mkvOXM7WlOdbr387HzFvnre6b15xa3VbrMac9XpLV\nfwVv+2PkWeuRbNNjpKp2VNX9SZ5IcldW3xX7Tnc/Pbusfc0/Wo+5/7tJfnZrZ7xYz16P7n7m+HjX\nHB83VtXZM3bGHx8na9lhxKpf6+4rkrwqyfVV9etr7+zV9zu37eWD2/31j/cluTTJniSHkrx7udPZ\nelW1K8lHk7ytu7+39r7teIwcZT227THS3Ye7e0+Si7L6btiLljylpXr2elTVLyR5R1bX5ZeSnJfk\nd5c4xdPassPoYJKL19y+aMa2le4+ON+fSPKxrP5iP/7M25nz/YnlzXApjvX6t+Ux092Pz//Y/WuS\nD+THp0K2xXpU1VlZjYA/6+6/nOFte4wcbT22+zGSJN39nSR3J/mVrJ4S2jl3rX3NP1qPuf9nkvzz\nFk91S6xZj6vmFGx391NJ/iTb8PhYr2WH0eeSXD5XDzwnqx+Eu2PJc9pSVXVOVT3vme0kv5Hkwayu\nw7Wz27VJPr6cGS7NsV7/HUneOFdS7Evy3TWnU85Yzzrn/5tZPUaS1fW4Zq60uSTJ5Uk+u9XzW6T5\n/McHkzzS3e9Zc9e2PEaOtR7b9RipqhdU1bmz/dNJXpHVz13dneQ1s9uzj49njpvXJPnUvON4RjjG\nevz9mn9EVFY/b7X2+Dhjf19Oxc4T77I43f10Vb01yd9k9Qq1m7v7oWXOaQnOT/Kx+ezfziR/3t1/\nXVWfS3J7Vb05yTeSvHaJc1yoqvqLJC9N8vyqeizJ7yf5oxz99d+Z1asoVpL8MMmbtnzCC3aM9Xjp\nXF7bWb2K8S1J0t0PVdXtSR5O8nSS67v78DLmvUC/muQNSb40n5tIkt/L9j1GjrUer9+mx8gFSW6p\nqh1Z/cf+7d39iap6OMmtVfWHSf4uqzGZ+f6nVbWS1YscrlnGpBfoWOvxqap6QVavPrs/yXWz/5n+\n+3LS/OVrAICx7FNpAACnDWEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAA4/8Bvw2GDv/f1K0A\nAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "v8HsE-NCmUxx", - "colab_type": "text" - }, - "source": [ - "## 1D Convolutions" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WeP0rw0tm7HK", - "colab_type": "text" - }, - "source": [ - "You aren't limited to 2D convolutions, a simple 1D demo is below:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "jJ-jcAn3cig-", - "colab_type": "code", - "outputId": "614ed589-e097-4bfe-f596-3421e3492698", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 680 - } - }, - "source": [ - "# 1D kernel - WIO layout\n", - "kernel = onp.array([[[1, 0, -1], [-1, 0, 1]], \n", - " [[1, 1, 1], [-1, -1, -1]]], \n", - " dtype=np.float32).transpose([2,1,0])\n", - "# 1D data - NWC layout\n", - "data = onp.zeros((1, 200, 2), dtype=np.float32)\n", - "for i in range(2):\n", - " for k in range(2):\n", - " x = 35*i + 30 + 60*k\n", - " data[0, x:x+30, k] = 1.0\n", - "\n", - "print(\"in shapes:\", data.shape, kernel.shape)\n", - "\n", - "plt.figure(figsize=(10,5))\n", - "plt.plot(data[0]);\n", - "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", - " ('NWC', 'WIO', 'NWC'))\n", - "print(dn)\n", - "\n", - "out = lax.conv_general_dilated(data, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,), # window strides\n", - " 'SAME', # padding mode\n", - " (1,), # lhs/image dilation\n", - " (1,), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape)\n", - "plt.figure(figsize=(10,5))\n", - "plt.plot(out[0]);" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "in shapes: (1, 200, 2) (3, 2, 2)\n", - "ConvDimensionNumbers(lhs_spec=(0, 2, 1), rhs_spec=(2, 1, 0), out_spec=(0, 2, 1))\n", - "out shape: (1, 200, 2)\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\ndnvvz0uzHuu8mNlXzezO3vM827vtIjP7iJnd1/v4mKzHOQ9m9uQDr/HtZlY1s9ev8utvZm83s2+Z\n2V0Hbot8vS30X3rvBXeY2bOyG3k6Yp7/b5nZ53vP8VYzO9W7/Voz2z/wc/D72Y18djHPPfZn3cx+\nrffaf8HMXpzNqNMT8/zfc+C5f9XMbu/dvmqvfdy5brl+951zK/VHUl7SlyQ9XlJJ0uck3ZD1uOb4\nfC+T9Kze37ckfVHSDZLeLOlXsx7fgo7BVyVdPHLbf5T0xt7f3yjpN7Me5wKOQ17SNyVds8qvv6Tn\nS3qWpLsmvd6SXirpQ5JM0nMlfSrr8c/p+f+gpELv77954Plfe/DrTvqfmOce+bPeex/8nKSypOt6\n54V81s8h7ec/8vn/JOnXV/S1jzvXLdXv/ipWqp4j6X7n3Jedc01J75b08ozHNDfOuQedc5/t/b0m\n6V5JV2Q7qqXwcknv6P39HZL+cYZjWZQfkPQl59y8dyvIlHPubyQ9OnJz3Ov9ckn/04U+KemUmV22\nmJHOR9Tzd8592DnX7v3zk5KuXPjAFiDmtY/zcknvds41nHNfkXS/wvPDiTXu+ZuZSfoJSX+80EEt\nyJhz3VL97q9iqLpC0tcP/PsBeRIyzOxaSTdK+lTvpl/olT3fvqqXv3qcpA+b2W1mdnPvtkuccw/2\n/v5NSZdkM7SFeqUOv6H68vpL8a+3j+8Hr1X4P/S+68zs78zs/5jZ87Ia1JxF/az79to/T9JDzrn7\nDty2kq/9yLluqX73VzFUecnMNiX9qaTXO+eqkv6bpCdIeqakBxWWhVfV9zrnniXpJZJeZ2bPP/hJ\nF9aCV7p3iJmVJL1M0nt7N/n0+h/iw+sdx8zeJKkt6V29mx6UdLVz7kZJvyzpj8ysktX45sTbn/UR\nr9Lh/1St5Gsfca4bWIbf/VUMVd+QdNWBf1/Zu21lmVlR4Q/Zu5xzfyZJzrmHnHMd51xX0v/QCS97\nj+Oc+0bv47ck3arwuT7UL/X2Pn4ruxEuxEskfdY595Dk1+vfE/d6e/N+YGavkfTDkn6yd3JR79LX\nI72/36ZwXtGTMhvkHIz5WffptS9IeoWk9/RvW8XXPupcpyX73V/FUPUZSU80s+t6/3t/paT3Zzym\nueldR3+bpHudc79z4PaD145/VNJdo/ddBWa2YWZb/b8rnLB7l8LX/NW9L3u1pPdlM8KFOfS/VF9e\n/wPiXu/3S/qZ3kqg50raOXCpYGWY2U2S3iDpZc65CwduP21m+d7fHy/piZK+nM0o52PMz/r7Jb3S\nzMpmdp3C5/7pRY9vQV4k6fPOuQf6N6zaax93rtOy/e5nNZN/nn8Uzvr/osJk/qasxzPn5/q9Csud\nd0i6vffnpZL+UNKdvdvfL+myrMc6p+f/eIUrfD4n6e7+6y3psZL+StJ9kj4q6aKsxzrHY7Ah6RFJ\n2wduW9nXX2F4fFBSS+E8iZ+Ne70Vrvx5a++94E5JZ7Ie/5ye//0K54/03wN+v/e1P9b7vbhd0mcl\n/UjW45/Dc4/9WZf0pt5r/wVJL8l6/PN4/r3b/0DSz4187aq99nHnuqX63WebGgAAgBSs4uU/AACA\nhSNUAQAApIBQBQAAkAJCFQAAQAoIVQAAACkgVAEAAKSAUAUAAJCC/w+oKapj4mrseQAAAABJRU5E\nrkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7XOgXqCTmaPa", - "colab_type": "text" - }, - "source": [ - "## 3D Convolutions" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "QNvSiq5-mcLd", - "colab_type": "code", - "outputId": "eecbad0f-f443-43c1-83d6-f8fba22c7383", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 530 - } - }, - "source": [ - "# Random 3D kernel - HWDIO layout\n", - "kernel = onp.array([\n", - " [[0, 0, 0], [0, 1, 0], [0, 0, 0]],\n", - " [[0, -1, 0], [-1, 0, -1], [0, -1, 0]], \n", - " [[0, 0, 0], [0, 1, 0], [0, 0, 0]]], \n", - " dtype=np.float32)[:, :, :, onp.newaxis, onp.newaxis]\n", - "\n", - "# 3D data - NHWDC layout\n", - "data = onp.zeros((1, 30, 30, 30, 1), dtype=np.float32)\n", - "x, y, z = onp.mgrid[0:1:30j, 0:1:30j, 0:1:30j]\n", - "data += (onp.sin(2*x*np.pi)*onp.cos(2*y*np.pi)*onp.cos(2*z*np.pi))[None,:,:,:,None]\n", - "\n", - "print(\"in shapes:\", data.shape, kernel.shape)\n", - "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", - " ('NHWDC', 'HWDIO', 'NHWDC'))\n", - "print(dn)\n", - "\n", - "out = lax.conv_general_dilated(data, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1,1), # window strides\n", - " 'SAME', # padding mode\n", - " (1,1,1), # lhs/image dilation\n", - " (1,1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers\n", - "print(\"out shape: \", out.shape)\n", - "\n", - "# Make some simple 3d density plots:\n", - "from mpl_toolkits.mplot3d import Axes3D\n", - "def make_alpha(cmap):\n", - " my_cmap = cmap(np.arange(cmap.N))\n", - " my_cmap[:,-1] = np.linspace(0, 1, cmap.N)**3\n", - " return mpl.colors.ListedColormap(my_cmap)\n", - "my_cmap = make_alpha(plt.cm.viridis)\n", - "fig = plt.figure()\n", - "ax = fig.gca(projection='3d')\n", - "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=data.ravel(), cmap=my_cmap)\n", - "ax.axis('off')\n", - "ax.set_title('input')\n", - "fig = plt.figure()\n", - "ax = fig.gca(projection='3d')\n", - "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=out.ravel(), cmap=my_cmap)\n", - "ax.axis('off')\n", - "ax.set_title('3D conv output');" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "in shapes: (1, 30, 30, 30, 1) (3, 3, 3, 1, 1)\n", - "ConvDimensionNumbers(lhs_spec=(0, 4, 1, 2, 3), rhs_spec=(4, 3, 0, 1, 2), out_spec=(0, 4, 1, 2, 3))\n", - "out shape: (1, 30, 30, 30, 1)\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nSObD7ZaPtztu55mb04kxBjrnuB6W6vb3mUV0Fx6F70rF9u4LwMP7IaR3DtoMRQreOUKIWGtxTaKo\nzLrtiC4RcmKKtSUxpsihBFw2nEpm17Rc9h3hNmOMZfCeKUamEEFpnvcDT9Zrxhi++Zk6a1hvt1wN\nA+47cCWw8NtlGfRbeO/49rSEtQZj6oGWSF1jHseZQp3AsEbTWI931fdg8J6ucYhSrBrP066nNw5d\nCnOJTKWw7jzP1wNP+xVZBAwUJazaho+2G36wu0CAQww01vF0tcIbswjue8BS6S6814j8ouIVOVfk\nCqwzKMB4U/0eyNydRpQ2cF5dvuhbdFLcjzPeCYfkEaD3liiJU4pMKfNsveLFas2cM7EUYq4eCx+t\nNzxdrZYlh/eMRXQX3muUgvywJiyCtQZBziY9hSLVYEeoFW7RZ+fgImQpvN4fyWScMRhnedEObNuO\n+znUmWSjQSkuhwGrFK+OB1LJrH3DRdctgvsesojuwnuPMaq6o6lqsKOVZs6RXKrgojWtMeiVJuTq\nRjYlTRahbxwxGdrWMknmLkfmU2bXN3xvvcVozc04cppnWud4Ogw8W62Xg7L3mEV0F957lFJnO8na\nw81n60hvdJ00UIIxmtOYSTkRcsZozbbzKGdIqd5+1IGohNZbQir0zrFp22p8Yy2bpmG9ROe89yyi\nu/De865/g9YKQdM4943xzhwyc8ooDU4Z0IqYM04b5pzYh5k5R4w1fLzZsOs6Xh/23IcZozW7ruPZ\n0rtdOLOI7sJ7zbvbag9TDVpDemeu2HmDymC0x1pLKcL9NHGMkZwL3mqsadiHmcbWMbGrfsAbzUXX\n0zm3CO7CNyyiu/De8+0RMvOOhy+czdK1JeRf+Pz23uOMBqNZN54swlfHA3fzROccnXNLdbvwK1lc\nxhYW/oFMITKnanxujcYYzcvDgcE5lFKcYkArzfXQ441derfvN4u148LCb4IHQ58HS8ub8cTdPAPQ\nGMP1sMIu1e3CIroLC789Ys4ILCu8C++yiO7CwsLCI/JrRXe5DlpYWFh4RBbRXVhYWHhEFtFdWFhY\neEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4\nRBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhE\nFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4ROz/5f5fGyO8sLCwsPCPZ6l0\nFxYWFh6RRXQXFhYWHpFFdBcWFhYekUV0FxYWFh6RRXQXFhYWHpFFdBcWFhYekf8NqyMgE3YvbLEA\nAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - }, - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvVnMZVtd7v0b3WxX8663qW5X7QYQ\nUOCwP/X4fR/iufiUCzWgwYgK2EW8IeHKLiqJQY0GNeiVRsVAJAE0JhpNNBoU7KLGaDjm6AE3u6ld\ne1f7NqudzWi/i1nUkdCogJtmz19SSb1rrDnWqnrXfNacz3j+/yFSSoyMjIyMPDPIz/UbGBkZGXk2\nMYruyMjIyDPIKLojIyMjzyCj6I6MjIw8g4yiOzIyMvIMov+d8THaMDIyMvKfR3yygfFKd2RkZOQZ\nZBTdkZGRkWeQUXRHRkZGnkFG0R3h9a9/PRcvXmQ2m/H85z+ft7/97ffGPvCBDyClZDKZMJlMuHz5\nMq95zWv4+7//+8/hO/6v5cEHH+R973vf5+18I1/YjKI7wo/+6I/yxBNPsF6v+f3f/33e/OY38w//\n8A/3xi9dusR2u2Wz2fC3f/u3vPCFL+RrvuZr+NM//dPP4bseGfnCZBTdEV70oheR5zkAQgiEEDz6\n6KMf9zwhBJcvX+Ynf/InecMb3sCP/MiPfNI5/+qv/oqXvexl7O3tceXKFd75zncCsFqt+K7v+i6O\njo544IEH+Omf/mlijAC8853v5OUvfzk/+IM/yGKx4KGHHuKP/uiPAPit3/otvvIrv/JjXuMXf/EX\nedWrXvUJX//69eu86lWvYn9/n+c973n8+q//+r2x7/me7+HNb37zvZ8/8IEPcPnyZQC+8zu/kyef\nfJJXvvKVTCYTfu7nfo4nnngCIQS/9mu/xqVLl7h48SK/8Au/8GnPN/LsZhTdEQDe+MY3UlUVL3zh\nC7l48SLf8A3f8Cmf/+pXv5p//Md/ZLfbfdzY1atX+fqv/3re9KY3cefOHT74wQ/y8MMPA/CmN72J\n1WrFY489xp//+Z/zm7/5m7zjHe+4d+zf/d3f8YIXvIDj42N++Id/mO/7vu8jpcQrX/lKPvzhD/PI\nI4/ce+673/1uXvva137C9/ft3/7tXL58mevXr/M7v/M7/NiP/Rh/9md/9u/+P7zrXe/i/vvv5w/+\n4A/Ybrf88A//8L2x97///TzyyCP8yZ/8CW9961v/Q5bBp5pv5NnJKLojAPzyL/8ym82Gv/zLv+TV\nr371vSvfT8alS5dIKbFcLj9u7N3vfjdf93Vfx3d8x3dgjOHg4ICHH36YEALvfe97+dmf/Vmm0ykP\nPvggP/ADP8C73vWue8c+8MADfP/3fz9KKb77u7+bGzducOvWLaqq4pu+6Zt4z3veA8AjjzzChz70\noU94pXvt2jX++q//mre+9a0URcHDDz/MG97wBn7zN3/zM/o/+omf+AnquuYlL3kJ3/u933vvvYyM\n/GcYRXfkHkopXv7yl/PUU0/xK7/yK5/yuU8//TRCCPb29j5u7Nq1azz3uc/9uMePj49xzvHAAw/c\ne+yBBx7g6aefvvfzhQsX7v29qioAttstAK997WvvCd273/1uvvmbv/nec/4t169fZ39/n+l0+klf\n59PhypUrHzPf9evXP6P5Rp6djKI78nF47z+hp/tv+d3f/V2+/Mu/nLquP27sypUrn/D4w8NDjDFc\nvXr13mNPPvkk991333/ofb3iFa+4Z1e85z3v+aTWwqVLlzg9PWWz2XzC16nrmqZp7o3dvHnzY44X\n4hMXE127du1j5rt06dJnNN/Is5NRdJ/l3L59m/e+971st1tCCPzxH/8x73nPe/jar/3aj3tuSomn\nn36at7zlLbz97W/nZ37mZz7hnK973et43/vex2//9m/jvefk5IQPfvCDKKV4zWtew4//+I+z2Wy4\nevUqb3vb23j961//H3qvxhi+9Vu/lR/6oR/i9PSUV7ziFZ/weVeuXOFlL3sZP/qjP0rXdfzTP/0T\nv/Ebv3HvdR5++GH+8A//kNPTU27evMkv/dIvfczx58+f57HHHvu4eX/qp36Kpmn453/+Z97xjnfw\nbd/2bZ/RfCPPUlJKn+rPyBc5t2/fTv/jf/yPNJ/P03Q6TS9+8YvTr/3ar90bf//735+EEKmu61RV\nVbp48WL6lm/5lvQ3f/M3n3Lev/iLv0hf9VVflabTabp8+XJ65zvfmVJK6fT0NL3uda9Lh4eH6fLl\ny+ktb3lLCiGklFJ6xzvekb76q7/6Y+YB0iOPPPIx8wLpjW9846d8/WvXrqVv/MZvTIvFIj3nOc9J\nv/Irv3JvrG3b9JrXvCZNp9P0kpe8JL3tbW9L9913373x3/u930tXrlxJ8/k8/fzP/3x6/PHHE5B+\n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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "DKTMw6tRZyK2", - "colab_type": "text" - }, - "source": [ - "# 🔪 NaNs\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ncS0NI4jZrwy", - "colab_type": "text" - }, - "source": [ - "### Debugging NaNs\n", - "\n", - "If you want to trace where NaNs are occurring in your functions or gradients, you can turn on the NaN-checker by:\n", - "- setting the `JAX_DEBUG_NANS=True` environment variable.\n", - "- adding from jax.config `import config` and `config.update(\"jax_debug_nans\", True)` near the top of your main file\n", - "- adding `from jax.config import config` and `config.parse_flags_with_absl()` to your main file, then set the option using a command-line flag like `--jax_debug_nans=True`.\n", - "\n", - "This will cause computations to error-out immediately on production of a NaN.\n", - "\n", - "⚠️ You shouldn't have the NaN-checker on if you're not debugging, as it can introduce lots of device-host round-trips and performance regressions!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YTktlwTTMgFl", - "colab_type": "text" - }, - "source": [ - "# 🔪 Double (64bit) precision\n", - "---\n", - "\n", - "At the moment, JAX by default enforces single-precision numbers to mitigate the Numpy API's tendency to aggressively promote operands to `double`. This is the desired behavior for many machine-learning applications, but it may catch you by surprise!" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "CNNGtzM3NDkO", - "colab_type": "code", - "outputId": "211d9880-4518-4a7d-f652-e3663274825f", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", - "x.dtype" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "dtype('float32')" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 14 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "VcvqzobxNPbd", - "colab_type": "text" - }, - "source": [ - "To use double-precision numbers, you need to set the `jax_enable_x64` configuration variable __at startup__. \n", - "\n", - "There are a few ways to do this:\n", - "\n", - "1. You can enable 64bit mode by setting the environment variable `JAX_ENABLE_X64=True`.\n", - "\n", - "2. You can manually set the `jax_enable_x64` configuration flag at startup:\n", - "\n", - "```\n", - "# again, this only works on startup!\n", - "from jax.config import config\n", - "config.update(\"jax_enable_x64\", True)\n", - "```\n", - "\n", - "3. You can parse command-line flags with `absl.app.run(main)`\n", - "\n", - "```\n", - "from jax.config import config\n", - "config.config_with_absl()\n", - "```\n", - "\n", - "4. If you want JAX to run absl parsing for you, i.e. you don't want to do `absl.app.run(main)`, you can instead use\n", - "\n", - "```\n", - "from jax.config import config\n", - "if __name__ == '__main__':\n", - " # calls config.config_with_absl() *and* runs absl parsing\n", - " config.parse_flags_with_absl()\n", - "```\n", - "\n", - "Note that #2-#4 work for _any_ of JAX's configuration options.\n", - "\n", - "We can then confirm that `x64` mode is enabled:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "HqGbBa9Rr-2g", - "colab_type": "code", - "colab": {} - }, - "source": [ - "from jax import numpy as np, random\n", - "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", - "x.dtype # --> dtype('float64')" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6Cks2_gKsXaW", - "colab_type": "text" - }, - "source": [ - "### Caveats\n", - "⚠️ XLA doesn't support 64-bit convolutions on all backends!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WAHjmL0E2XwO", - "colab_type": "text" - }, - "source": [ - "# Fin.\n", - "---\n", - "If something's not covered here that has caused you weeping and gnashing of teeth, please let us know and we'll extend these introductory _advisos_!" - ] - } - ] -} diff --git a/notebooks/autodiff_cookbook.ipynb b/notebooks/autodiff_cookbook.ipynb deleted file mode 100644 index 30bf9bfcdb72..000000000000 --- a/notebooks/autodiff_cookbook.ipynb +++ /dev/null @@ -1,1542 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "Autodiff Cookbook.ipynb", - "version": "0.3.2", - "provenance": [], - "collapsed_sections": [], - "toc_visible": true - }, - "kernelspec": { - "name": "python2", - "display_name": "Python 2" - } - }, - "cells": [ - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "JTYyZkSO6vuy", - "outputId": "a447ccef-4d24-47e9-e74e-2ee4d3686a03", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - } - }, - "source": [ - "from __future__ import print_function, division\n", - "import jax.numpy as np\n", - "from jax import grad, jit, vmap\n", - "from jax import random\n", - "\n", - "key = random.PRNGKey(0)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/jax/lib/xla_bridge.py:122: UserWarning: No GPU found, falling back to CPU.\n", - " warnings.warn('No GPU found, falling back to CPU.')\n" - ], - "name": "stderr" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Ic1reB4s6vu1" - }, - "source": [ - "# The Autodiff Cookbook\n", - "\n", - "*alexbw@, mattjj@* \n", - "\n", - "JAX has a pretty general automatic differentiation system. In this notebook, we'll go through a whole bunch of neat autodiff ideas that you can cherry pick for your own work, starting with the basics." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YxnjtAGN6vu2" - }, - "source": [ - "## Gradients" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "zqwpfr2vAsvt" - }, - "source": [ - "### Starting with `grad`\n", - "\n", - "You can differentiate a function with `grad`:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "0NLO4Wfknzmk", - "outputId": "bd52f84f-3d72-4881-9163-15654418c498", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "grad_tanh = grad(np.tanh)\n", - "print(grad_tanh(2.0))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "0.070650816\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "LGcNfDntoBZI" - }, - "source": [ - "`grad` takes a function and returns a function. If you have a Python function `f` that evaluates the mathematical function $f$, then `grad(f)` is a Python function that evaluates the mathematical function $\\nabla f$. That means `grad(f)(x)` represents the value $\\nabla f(x)$.\n", - "\n", - "Since `grad` operates on functions, you can apply it to its own output to differentiate as many times as you like:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "RDGk1GDsoawu", - "outputId": "5386f672-16ed-4c49-fe72-0099d855523b", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - } - }, - "source": [ - "print(grad(grad(np.tanh))(2.0))\n", - "print(grad(grad(grad(np.tanh)))(2.0))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "-0.13621867\n", - "0.25265405\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "2rcnpTiinqi8" - }, - "source": [ - "Let's look at computing gradients with `grad` in a linear logistic regression model. First, the setup:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "27TcOT2i6vu5", - "colab": {} - }, - "source": [ - "def sigmoid(x):\n", - " return 0.5 * (np.tanh(x / 2) + 1)\n", - "\n", - "# Outputs probability of a label being true.\n", - "def predict(W, b, inputs):\n", - " return sigmoid(np.dot(inputs, W) + b)\n", - "\n", - "# Build a toy dataset.\n", - "inputs = np.array([[0.52, 1.12, 0.77],\n", - " [0.88, -1.08, 0.15],\n", - " [0.52, 0.06, -1.30],\n", - " [0.74, -2.49, 1.39]])\n", - "targets = np.array([True, True, False, True])\n", - "\n", - "# Training loss is the negative log-likelihood of the training examples.\n", - "def loss(W, b):\n", - " preds = predict(W, b, inputs)\n", - " label_probs = preds * targets + (1 - preds) * (1 - targets)\n", - " return -np.sum(np.log(label_probs))\n", - "\n", - "# Initialize random model coefficients\n", - "key, W_key, b_key = random.split(key, 3)\n", - "W = random.normal(W_key, (3,))\n", - "b = random.normal(b_key, ())" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "8Wk-Yai7ooh1" - }, - "source": [ - "Use the `grad` function with its `argnums` argument to differentiate a function with respect to positional arguments." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "bpmd8W8-6vu6", - "outputId": "b009556f-e65c-430a-c967-2522033edd4d", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 102 - } - }, - "source": [ - "# Differentiate `loss` with respect to the first positional argument:\n", - "W_grad = grad(loss, argnums=0)(W, b)\n", - "print('W_grad', W_grad)\n", - "\n", - "# Since argnums=0 is the default, this does the same thing:\n", - "W_grad = grad(loss)(W, b)\n", - "print('W_grad', W_grad)\n", - "\n", - "# But we can choose different values too, and drop the keyword:\n", - "b_grad = grad(loss, 1)(W, b)\n", - "print('b_grad', b_grad)\n", - "\n", - "# Including tuple values\n", - "W_grad, b_grad = grad(loss, (0, 1))(W, b)\n", - "print('W_grad', W_grad)\n", - "print('b_grad', b_grad)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "W_grad [-0.16965586 -0.8774649 -1.4901347 ]\n", - "W_grad [-0.16965586 -0.8774649 -1.4901347 ]\n", - "b_grad -0.2922725\n", - "W_grad [-0.16965586 -0.8774649 -1.4901347 ]\n", - "b_grad -0.2922725\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "MDl5UZl4oyzB" - }, - "source": [ - "This `grad` API has a direct correspondence to the excellent notation in Spivak's classic *Calculus on Manifolds* (1965), also used in Sussman and Wisdom's [*Structure and Interpretation of Classical Mechanics*](http://mitpress.mit.edu/sites/default/files/titles/content/sicm_edition_2/book.html) (2015) and their [*Functional Differential Geometry*](https://mitpress.mit.edu/books/functional-differential-geometry) (2013). Both books are open-access. See in particular the \"Prologue\" section of *Functional Differential Geometry* for a defense of this notation.\n", - "\n", - "Essentially, when using the `argnums` argument, if `f` is a Python function for evaluating the mathematical function $f$, then the Python expression `grad(f, i)` evaluates to a Python function for evaluating $\\partial_i f$." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "fuz9E2vzro5E" - }, - "source": [ - "### Differentiating with respect to nested lists, tuples, and dicts" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "QQaPja7puMKi" - }, - "source": [ - "Differentiating with respect to standard Python containers just works, so use tuples, lists, and dicts (and arbitrary nesting) however you like." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "IY82kdAe6vu_", - "outputId": "f7d9c99f-bb79-4c50-e106-ccb67180cba8", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "def loss2(params_dict):\n", - " preds = predict(params_dict['W'], params_dict['b'], inputs)\n", - " label_probs = preds * targets + (1 - preds) * (1 - targets)\n", - " return -np.sum(np.log(label_probs))\n", - "\n", - "print(grad(loss2)({'W': W, 'b': b}))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "{'b': array(-0.2922725, dtype=float32), 'W': array([-0.16965586, -0.8774649 , -1.4901347 ], dtype=float32)}\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cJ2NxiN58bfI", - "colab_type": "text" - }, - "source": [ - "You can [register your own container types](https://github.com/google/jax/issues/446#issuecomment-467105048) to work with not just `grad` but all the JAX transformations (`jit`, `vmap`, etc.)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "PaCHzAtGruBz" - }, - "source": [ - "### Evaluate a function and its gradient using `value_and_grad`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "CSgCjjo-ssnA" - }, - "source": [ - "Another convenient function is `value_and_grad` for efficiently computing both a function's value as well as its gradient's value:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "RsQSyT5p7OJW", - "outputId": "6a567de9-fa4e-4c54-8dc6-0a6d868693d2", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - } - }, - "source": [ - "from jax import value_and_grad\n", - "loss_value, Wb_grad = value_and_grad(loss, (0, 1))(W, b)\n", - "print('loss value', loss_value)\n", - "print('loss value', loss(W, b))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "loss value 3.0519395\n", - "loss value 3.0519395\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "rYTrH5tKllC_" - }, - "source": [ - "### Checking against numerical differences\n", - "\n", - "A great thing about derivatives is that they're straightforward to check with finite differences:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "R8q5RiY3l7Fw", - "outputId": "d87a3b94-8fa7-453d-e1ed-dce15983521f", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - } - }, - "source": [ - "# Set a step size for finite differences calculations\n", - "eps = 1e-4\n", - "\n", - "# Check b_grad with scalar finite differences\n", - "b_grad_numerical = (loss(W, b + eps / 2.) - loss(W, b - eps / 2.)) / eps\n", - "print('b_grad_numerical', b_grad_numerical)\n", - "print('b_grad_autodiff', grad(loss, 1)(W, b))\n", - "\n", - "# Check W_grad with finite differences in a random direction\n", - "key, subkey = random.split(key)\n", - "vec = random.normal(subkey, W.shape)\n", - "unitvec = vec / np.sqrt(np.vdot(vec, vec))\n", - "W_grad_numerical = (loss(W + eps / 2. * unitvec, b) - loss(W - eps / 2. * unitvec, b)) / eps\n", - "print('W_dirderiv_numerical', W_grad_numerical)\n", - "print('W_dirderiv_autodiff', np.vdot(grad(loss)(W, b), unitvec))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "b_grad_numerical -0.29325485\n", - "b_grad_autodiff -0.2922725\n", - "W_dirderiv_numerical -0.19550323\n", - "W_dirderiv_autodiff -0.19909078\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "InzB-iiJpVcx" - }, - "source": [ - "JAX provides a simple convenience function that does essentially the same thing, but checks up to any order of differentiation that you like:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "6Ok2LEfQmOuy", - "colab": {} - }, - "source": [ - "from jax.test_util import check_grads\n", - "check_grads(loss, (W, b), order=2) # check up to 2nd order derivatives" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "id0DXxwt3VJi" - }, - "source": [ - "### Hessian-vector products with `grad`-of-`grad`\n", - "\n", - "One thing we can do with higher-order `grad` is build a Hessian-vector product function. (Later on we'll write an even more efficient implementation that mixes both forward- and reverse-mode, but this one will use pure reverse-mode.)\n", - "\n", - "A Hessian-vector product function can be useful in a [truncated Newton Conjugate-Gradient algorithm](https://en.wikipedia.org/wiki/Truncated_Newton_method) for minimizing smooth convex functions, or for studying the curvature of neural network training objectives (e.g. [1](https://arxiv.org/abs/1406.2572), [2](https://arxiv.org/abs/1811.07062), [3](https://arxiv.org/abs/1706.04454), [4](https://arxiv.org/abs/1802.03451)).\n", - "\n", - "For a scalar-valued function $f : \\mathbb{R}^n \\to \\mathbb{R}$, the Hessian at a point $x \\in \\mathbb{R}^n$ is written as $\\partial^2 f(x)$. A Hessian-vector product function is then able to evaluate\n", - "\n", - "$\\qquad v \\mapsto \\partial^2 f(x) \\cdot v$\n", - "\n", - "for any $v \\in \\mathbb{R}^n$.\n", - "\n", - "The trick is not to instantiate the full Hessian matrix: if $n$ is large, perhaps in the millions or billions in the context of neural networks, then that might be impossible to store.\n", - "\n", - "Luckily, `grad` already gives us a way to write an efficient Hessian-vector product function. We just have to use the identity\n", - "\n", - "$\\qquad \\partial^2 f (x) v = \\partial [x \\mapsto \\partial f(x) \\cdot v] = \\partial g(x)$,\n", - "\n", - "where $g(x) = \\partial f(x) \\cdot v$ is a new scalar-valued function that dots the gradient of $f$ at $x$ with the vector $v$. Nottice that we're only ever differentiating scalar-valued functions of vector-valued arguments, which is exactly where we know `grad` is efficient.\n", - "\n", - "In JAX code, we can just write this:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "Ou5OU-gU9epm", - "colab": {} - }, - "source": [ - "def hvp(f, x, v):\n", - " return grad(lambda x: np.vdot(grad(f)(x), v))" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Rb1-5Hpv-ZV0" - }, - "source": [ - "This example shows that you can freely use lexical closure, and JAX will never get perturbed or confused.\n", - "\n", - "We'll check this implementation a few cells down, once we see how to compute dense Hessian matrices. We'll also write an even better version that uses both forward-mode and reverse-mode." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "5A_akvtp8UTu" - }, - "source": [ - "## Jacobians and Hessians using `jacfwd` and `jacrev`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "UP5BbmSm8ZwK" - }, - "source": [ - "You can compute full Jacobian matrices using the `jacfwd` and `jacrev` functions:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "cbETzAvKvf5I", - "outputId": "f88e5207-bff4-4d87-8536-2dfe5838c543", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 187 - } - }, - "source": [ - "from jax import jacfwd, jacrev\n", - "\n", - "# Isolate the function from the weight matrix to the predictions\n", - "f = lambda W: predict(W, b, inputs)\n", - "\n", - "J = jacfwd(f)(W)\n", - "print(\"jacfwd result, with shape\", J.shape)\n", - "print(J)\n", - "\n", - "J = jacrev(f)(W)\n", - "print(\"jacrev result, with shape\", J.shape)\n", - "print(J)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "jacfwd result, with shape (4, 3)\n", - "[[ 0.05981753 0.12883775 0.08857596]\n", - " [ 0.04015912 -0.0492862 0.0068453 ]\n", - " [ 0.1218829 0.01406341 -0.30470726]\n", - " [ 0.00140427 -0.00472519 0.00263776]]\n", - "jacrev result, with shape (4, 3)\n", - "[[ 0.05981753 0.12883775 0.08857595]\n", - " [ 0.04015912 -0.0492862 0.00684531]\n", - " [ 0.1218829 0.01406341 -0.30470726]\n", - " [ 0.00140427 -0.00472519 0.00263776]]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "iZDL-n_AvgBt" - }, - "source": [ - "These two functions compute the same values (up to machine numerics), but differ in their implementation: `jacfwd` uses forward-mode automatic differentiation, which is more efficient for \"tall\" Jacobian matrices, while `jacrev` uses reverse-mode, which is more efficient for \"wide\" Jacobian matrices. For matrices that are near-square, `jacfwd` probably has an edge over `jacrev`." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zeKlr7Xz8bfm", - "colab_type": "text" - }, - "source": [ - "You can also use `jacfwd` and `jacrev` with container types:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "eH46Xnm88bfm", - "colab_type": "code", - "outputId": "e5b18818-5796-497a-9c30-7cbe6d91e134", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 136 - } - }, - "source": [ - "def predict_dict(params, inputs):\n", - " return predict(params['W'], params['b'], inputs)\n", - "\n", - "J_dict = jacrev(predict_dict)({'W': W, 'b': b}, inputs)\n", - "for k, v in J_dict.items():\n", - " print(\"Jacobian from {} to logits is\".format(k))\n", - " print(v)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Jacobian from b to logits is\n", - "[0.11503371 0.04563536 0.2343902 0.00189767]\n", - "Jacobian from W to logits is\n", - "[[ 0.05981753 0.12883775 0.08857595]\n", - " [ 0.04015912 -0.0492862 0.00684531]\n", - " [ 0.1218829 0.01406341 -0.30470726]\n", - " [ 0.00140427 -0.00472519 0.00263776]]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yH34zjV88bfp", - "colab_type": "text" - }, - "source": [ - "For more details on forward- and reverse-mode, as well as how to implement `jacfwd` and `jacrev` as efficiently as possible, read on!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "K6Mpw_7K8bfp", - "colab_type": "text" - }, - "source": [ - "Using a composition of two of these functions gives us a way to compute dense Hessian matrices:" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "n155ypD9rfIZ", - "outputId": "dd6db0a6-af8a-49b3-9599-b9a7c44fc67f", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 289 - } - }, - "source": [ - "def hessian(f):\n", - " return jacfwd(jacrev(f))\n", - "\n", - "H = hessian(f)(W)\n", - "print(\"hessian, with shape\", H.shape)\n", - "print(H)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "hessian, with shape (4, 3, 3)\n", - "[[[ 0.02285464 0.04922539 0.03384245]\n", - " [ 0.04922538 0.10602392 0.07289143]\n", - " [ 0.03384245 0.07289144 0.05011286]]\n", - "\n", - " [[-0.03195212 0.03921397 -0.00544638]\n", - " [ 0.03921397 -0.04812624 0.0066842 ]\n", - " [-0.00544638 0.0066842 -0.00092836]]\n", - "\n", - " [[-0.01583708 -0.00182736 0.03959271]\n", - " [-0.00182736 -0.00021085 0.00456839]\n", - " [ 0.03959271 0.00456839 -0.09898178]]\n", - "\n", - " [[-0.00103521 0.00348334 -0.00194452]\n", - " [ 0.00348334 -0.01172098 0.00654304]\n", - " [-0.00194452 0.00654304 -0.00365254]]]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "wvkk82R6uRoM" - }, - "source": [ - "This shape makes sense: if we start with a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$, then at a point $x \\in \\mathbb{R}^n$ we expect to get the shapes\n", - "* $f(x) \\in \\mathbb{R}^m$, the value of $f$ at $x$,\n", - "* $\\partial f(x) \\in \\mathbb{R}^{m \\times n}$, the Jacobian matrix at $x$,\n", - "* $\\partial^2 f(x) \\in \\mathbb{R}^{m \\times n \\times n}$, the Hessian at $x$,\n", - "\n", - "and so on.\n", - "\n", - "To implement `hessian`, we could have used `jacrev(jacrev(f))` or `jacrev(jacfwd(f))` or any other composition of the two. But forward-over-reverse is typically the most efficient. That's because in the inner Jacobian computation we're often differentiating a function wide Jacobian (maybe like a loss function $f : \\mathbb{R}^n \\to \\mathbb{R}$), while in the outer Jacobian computation we're differentiating a function with a square Jacobian (since $\\nabla f : \\mathbb{R}^n \\to \\mathbb{R}^n$), which is where forward-mode wins out." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "OMmi9cyhs1bj" - }, - "source": [ - "## How it's made: two foundational autodiff functions" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "mtSRvouV6vvG" - }, - "source": [ - "### Jacobian-Vector products (JVPs, aka forward-mode autodiff)\n", - "\n", - "JAX includes efficient and general implementations of both forward- and reverse-mode automatic differentiation. The familiar `grad` function is built on reverse-mode, but to explain the difference in the two modes, and when each can be useful, we need a bit of math background.\n", - "\n", - "#### JVPs in math\n", - "\n", - "Mathematically, given a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$, the Jacobian matrix of $f$ evaluated at an input point $x \\in \\mathbb{R}^n$, denoted $\\partial f(x)$, is often thought of as a matrix in $\\mathbb{R}^m \\times \\mathbb{R}^n$:\n", - "\n", - "$\\qquad \\partial f(x) \\in \\mathbb{R}^{m \\times n}$.\n", - "\n", - "But we can also think of $\\partial f(x)$ as a linear map, which maps the tangent space of the domain of $f$ at the point $x$ (which is just another copy of $\\mathbb{R}^n$) to the tangent space of the codomain of $f$ at the point $f(x)$ (a copy of $\\mathbb{R}^m$):\n", - "\n", - "$\\qquad \\partial f(x) : \\mathbb{R}^n \\to \\mathbb{R}^m$.\n", - "\n", - "This map is called the [pushforward map](https://en.wikipedia.org/wiki/Pushforward_(differential)) of $f$ at $x$. The Jacobian matrix is just the matrix for this linear map in a standard basis.\n", - "\n", - "If we don't commit to one specific input point $x$, then we can think of the function $\\partial f$ as first taking an input point and returning the Jacobian linear map at that input point:\n", - "\n", - "$\\qquad \\partial f : \\mathbb{R}^n \\to \\mathbb{R}^n \\to \\mathbb{R}^m$.\n", - "\n", - "In particular, we can uncurry things so that given input point $x \\in \\mathbb{R}^n$ and a tangent vector $v \\in \\mathbb{R}^n$, we get back an output tangent vector in $\\mathbb{R}^m$. We call that mapping, from $(x, v)$ pairs to output tangent vectors, the *Jacobian-vector product*, and write it as\n", - "\n", - "$\\qquad (x, v) \\mapsto \\partial f(x) v$\n", - "\n", - "#### JVPs in JAX code\n", - "\n", - "Back in Python code, JAX's `jvp` function models this transformation. Given a Python function that evaluates $f$, JAX's `jvp` is a way to get a Python function for evaluating $(x, v) \\mapsto (f(x), \\partial f(x) v)$." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "pTncYR6F6vvG", - "colab": {} - }, - "source": [ - "from jax import jvp\n", - "\n", - "# Isolate the function from the weight matrix to the predictions\n", - "f = lambda W: predict(W, b, inputs)\n", - "\n", - "key, subkey = random.split(key)\n", - "v = random.normal(subkey, W.shape)\n", - "\n", - "# Push forward the vector `v` along `f` evaluated at `W`\n", - "y, u = jvp(f, (W,), (v,))" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "m1VJgJYQGfCK" - }, - "source": [ - "In terms of Haskell-like type signatures, we could write\n", - "\n", - "```haskell\n", - "jvp :: (a -> b) -> a -> T a -> (b, T b)\n", - "```\n", - "\n", - "where we use `T a` to denote the type of the tangent space for `a`. In words, `jvp` takes as arguments a function of type `a -> b`, a value of type `a`, and a tangent vector value of type `T a`. It gives back a pair consisting of a value of type `b` and an output tangent vector of type `T b`." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "3RpbiasHGD3X" - }, - "source": [ - "The `jvp`-transformed function is evaluated much like the original function, but paired up with each primal value of type `a` it pushes along tangent values of type `T a`. For each primitive numerical operation that the original function would have applied, the `jvp`-transformed function executes a \"JVP rule\" for that primitive that both evaluates the primitive on the primals and applies the primitive's JVP at those primal values.\n", - "\n", - "That evaluation strategy has some immediate implications about computational complexity: since we evaluate JVPs as we go, we don't need to store anything for later, and so the memory cost is independent of the depth of the computation. In addition, the FLOP cost of the `jvp`-transformed function is about 2x the cost of just evaluating the function. Put another way, for a fixed primal point $x$, we can evaluate $v \\mapsto \\partial f(x) \\cdot v$ for about the same cost as evaluating $f$.\n", - "\n", - "That memory complexity sounds pretty compelling! So why don't we see forward-mode very often in machine learning?\n", - "\n", - "To answer that, first think about how you could use a JVP to build a full Jacobian matrix. If we apply a JVP to a one-hot tangent vector, it reveals one column of the Jacobian matrix, corresponding to the nonzero entry we fed in. So we can build a full Jacobian one column at a time, and to get each column costs about the same as one function evaluation. That will be efficient for functions with \"tall\" Jacobians, but inefficient for \"wide\" Jacobians.\n", - "\n", - "If you're doing gradient-based optimization in machine learning, you probably want to minimize a loss function from parameters in $\\mathbb{R}^n$ to a scalar loss value in $\\mathbb{R}$. That means the Jacobian of this function is a very wide matrix: $\\partial f(x) \\in \\mathbb{R}^{1 \\times n}$, which we often identify with the Gradient vector $\\nabla f(x) \\in \\mathbb{R}^n$. Building that matrix one column at a time, with each call taking a similar number of FLOPs to evaluating the original function, sure seems inefficient! In particular, for training neural networks, where $f$ is a training loss function and $n$ can be in the millions or billions, this approach just won't scale.\n", - "\n", - "To do better for functions like this, we just need to use reverse-mode." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "PhkvkZazdXu1" - }, - "source": [ - "### Vector-Jacobian products (VJPs, aka reverse-mode autodiff)\n", - "\n", - "Where forward-mode gives us back a function for evaluating Jacobian-vector products, which we can then use to build Jacobian matrices one column at a time, reverse-mode is a way to get back a function for evaluating vector-Jacobian products (equivalently Jacobian-transpose-vector products), which we can use to build Jacobian matrices one row at a time.\n", - "\n", - "#### VJPs in math\n", - "\n", - "Let's again consider a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$.\n", - "Starting from our notation for JVPs, the notation for VJPs is pretty simple:\n", - "\n", - "$\\qquad (x, v) \\mapsto v \\partial f(x)$,\n", - "\n", - "where $v$ is an element of the cotangent space of $f$ at $x$ (isomorphic to another copy of $\\mathbb{R}^m$). When being rigorous, we should think of $v$ as a linear map $v : \\mathbb{R}^m \\to \\mathbb{R}$, and when we write $v \\partial f(x)$ we mean function composition $v \\circ \\partial f(x)$, where the types work out because $\\partial f(x) : \\mathbb{R}^n \\to \\mathbb{R}^m$. But in the common case we can identify $v$ with a vector in $\\mathbb{R}^m$ and use the two almost interchageably, just like we might sometimes flip between \"column vectors\" and \"row vectors\" without much comment.\n", - "\n", - "With that identification, we can alternatively think of the linear part of a VJP as the transpose (or adjoint conjugate) of the linear part of a JVP:\n", - "\n", - "$\\qquad (x, v) \\mapsto \\partial f(x)^\\mathsf{T} v$.\n", - "\n", - "For a given point $x$, we can write the signature as\n", - "\n", - "$\\qquad \\partial f(x)^\\mathsf{T} : \\mathbb{R}^m \\to \\mathbb{R}^n$.\n", - "\n", - "The corresponding map on cotangent spaces is often called the [pullback](https://en.wikipedia.org/wiki/Pullback_(differential_geometry))\n", - "of $f$ at $x$. The key for our purposes is that it goes from something that looks like the output of $f$ to something that looks like the input of $f$, just like we might expect from a transposed linear function.\n", - "\n", - "#### VJPs in JAX code\n", - "\n", - "Switching from math back to Python, the JAX function `vjp` can take a Python function for evaluating $f$ and give us back a Python function for evaluating the VJP $(x, v) \\mapsto (f(x), v^\\mathsf{T} \\partial f(x))$." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "1tFcRuEzkGRR", - "colab": {} - }, - "source": [ - "from jax import vjp\n", - "\n", - "# Isolate the function from the weight matrix to the predictions\n", - "f = lambda W: predict(W, b, inputs)\n", - "\n", - "y, vjp_fun = vjp(f, W)\n", - "\n", - "key, subkey = random.split(key)\n", - "u = random.normal(subkey, y.shape)\n", - "\n", - "# Pull back the covector `u` along `f` evaluated at `W`\n", - "v = vjp_fun(u)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "oVOZexCEkvv3" - }, - "source": [ - "In terms of Haskell-like type signatures, we could write\n", - "\n", - "```haskell\n", - "vjp :: (a -> b) -> a -> (b, CT b -> CT a)\n", - "```\n", - "\n", - "where we use `CT a` to denote the type for the cotangent space for `a`. In words, `vjp` takes as arguments a function of type `a -> b` and a point of type `a`, and gives back a pair consisting of a value of type `b` and a linear map of type `CT b -> CT a`.\n", - "\n", - "This is great because it lets us build Jacobian matrices one row at a time, and the FLOP cost for evaluating $(x, v) \\mapsto (f(x), v^\\mathsf{T} \\partial f(x))$ is only about twice the cost of evaluating $f$. In particular, if we want the gradient of a function $f : \\mathbb{R}^n \\to \\mathbb{R}$, we can do it in just one call. That's how `grad` is efficient for gradient-based optimization, even for objectives like neural network training loss functions on millions or billions of parameters.\n", - "\n", - "There's a cost, though: though the FLOPs are friendly, memory scales with the depth of the computation. Also, the implementation is traditionally more complex than that of forward-mode, though JAX has some tricks up its sleeve (that's a story for a future notebook!).\n", - "\n", - "For more on how reverse-mode works, see [this tutorial video from the Deep Learning Summer School in 2017](http://videolectures.net/deeplearning2017_johnson_automatic_differentiation/)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MWHcAPqLdJFn", - "colab_type": "text" - }, - "source": [ - "## Hessian-vector products using both forward- and reverse-mode" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YG3g5C3KdW7H", - "colab_type": "text" - }, - "source": [ - "In a previous section, we implemented a Hessian-vector product function just using reverse-mode:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "C70CA-7wdelL", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def hvp(f, x, v):\n", - " return grad(lambda x: np.vdot(grad(f)(x), v))" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zJlJbFKCdfd0", - "colab_type": "text" - }, - "source": [ - "That's efficient, but we can do even better and save some memory by using forward-mode together with reverse-mode.\n", - "\n", - "Mathematically, given a function $f : \\mathbb{R}^n \\to \\mathbb{R}$ to differentiate, a point $x \\in \\mathbb{R}^n$ at which to linearize the function, and a vector $v \\in \\mathbb{R}^n$, the Hessian-vector product function we want is\n", - "\n", - "$(x, v) \\mapsto \\partial^2 f(x) v$\n", - "\n", - "Consider the helper function $g : \\mathbb{R}^n \\to \\mathbb{R}^n$ defined to be the derivative (or gradient) of $f$, namely $g(x) = \\partial f(x)$. All we need is its JVP, since that will give us\n", - "\n", - "$(x, v) \\mapsto \\partial g(x) v = \\partial^2 f(x) v$.\n", - "\n", - "We can translate that almost directly into code:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "rq3C0reVfAaI", - "colab_type": "code", - "colab": {} - }, - "source": [ - "from jax import jvp, grad\n", - "\n", - "# forward-over-reverse\n", - "def hvp(f, primals, tangents):\n", - " return jvp(grad(f), primals, tangents)[1]" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "XUsye1SwfSFm", - "colab_type": "text" - }, - "source": [ - "Even better, since we didn't have to call `np.dot` directly, this `hvp` function works with arrays of any shape and with arbitrary container types (like vectors stored as nested lists/dicts/tuples), and doesn't even have a dependence on `jax.numpy`.\n", - "\n", - "Here's an example of how to use it:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "bmpuQa5_f1Al", - "colab_type": "code", - "outputId": "e46e2ac2-5b31-4c0c-dafb-1459bffbe7e7", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "def f(X):\n", - " return np.sum(np.tanh(X)**2)\n", - "\n", - "key, subkey1, subkey2 = random.split(key, 3)\n", - "X = random.normal(subkey1, (30, 40))\n", - "V = random.normal(subkey2, (30, 40))\n", - "\n", - "ans1 = hvp(f, (X,), (V,))\n", - "ans2 = np.tensordot(hessian(f)(X), V, 2)\n", - "\n", - "print(np.allclose(ans1, ans2, 1e-4, 1e-4))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "True\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aWTii5TyXL5C", - "colab_type": "text" - }, - "source": [ - "Another way you might consider writing this is using reverse-over-forward:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "YxwmXZH2XQrw", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# reverse-over-forward\n", - "def hvp_revfwd(f, primals, tangents):\n", - " g = lambda primals: jvp(f, primals, tangents)[1]\n", - " return grad(g)(primals)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8z-QG_xTXR4I", - "colab_type": "text" - }, - "source": [ - "That's not quite as good, though, because forward-mode has less overhead than reverse-mode, and since the outer differentiation operator here has to differentiate a larger computation than the inner one, keeping forward-mode on the outside works best:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "lxfv25qTX5gZ", - "colab_type": "code", - "outputId": "7ef0894e-99d4-4765-fe5c-b5fcfe6918c5", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 153 - } - }, - "source": [ - "# reverse-over-reverse, only works for single arguments\n", - "def hvp_revrev(f, primals, tangents):\n", - " x, = primals\n", - " v, = tangents\n", - " return grad(lambda x: np.vdot(grad(f)(x), v))(x)\n", - "\n", - "\n", - "print(\"Forward over reverse\")\n", - "%timeit -n10 -r3 hvp(f, (X,), (V,))\n", - "print(\"Reverse over forward\")\n", - "%timeit -n10 -r3 hvp_revfwd(f, (X,), (V,))\n", - "print(\"Reverse over reverse\")\n", - "%timeit -n10 -r3 hvp_revrev(f, (X,), (V,))\n", - "\n", - "print(\"Naive full Hessian materialization\")\n", - "%timeit -n10 -r3 np.tensordot(hessian(f)(X), V, 2)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Forward over reverse\n", - "10 loops, best of 3: 14.3 ms per loop\n", - "Reverse over forward\n", - "10 loops, best of 3: 17.1 ms per loop\n", - "Reverse over reverse\n", - "10 loops, best of 3: 19.6 ms per loop\n", - "Naive full Hessian materialization\n", - "10 loops, best of 3: 99.2 ms per loop\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "xtqSUJgzwQXO" - }, - "source": [ - "## Composing VJPs, JVPs, and `vmap`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "PSL1TciM6vvI" - }, - "source": [ - "### Jacobian-Matrix and Matrix-Jacobian products\n", - "\n", - "Now that we have `jvp` and `vjp` transformations that give us functions to push-forward or pull-back single vectors at a time, we can use JAX's [`vmap` transformation](https://github.com/google/jax#auto-vectorization-with-vmap) to push and pull entire bases at once. In particular, we can use that to write fast matrix-Jacobian and Jacobian-matrix products." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "asAWvxVaCmsx", - "outputId": "cf23fb5d-49da-4392-ba49-05a847577a7c", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 102 - } - }, - "source": [ - "# Isolate the function from the weight matrix to the predictions\n", - "f = lambda W: predict(W, b, inputs)\n", - "\n", - "# Pull back the covectors `m_i` along `f`, evaluated at `W`, for all `i`.\n", - "# First, use a list comprehension to loop over rows in the matrix M.\n", - "def loop_mjp(f, x, M):\n", - " y, vjp_fun = vjp(f, x)\n", - " return np.vstack([vjp_fun(mi) for mi in M])\n", - "\n", - "# Now, use vmap to build a computation that does a single fast matrix-matrix\n", - "# multiply, rather than an outer loop over vector-matrix multiplies.\n", - "def vmap_mjp(f, x, M):\n", - " y, vjp_fun = vjp(f, x)\n", - " return vmap(vjp_fun)(M)\n", - "\n", - "key = random.PRNGKey(0)\n", - "num_covecs = 128\n", - "U = random.normal(key, (num_covecs,) + y.shape)\n", - "\n", - "loop_vs = loop_mjp(f, W, M=U)\n", - "print('Non-vmapped Matrix-Jacobian product')\n", - "%timeit -n10 -r3 loop_mjp(f, W, M=U)\n", - "\n", - "print('\\nVmapped Matrix-Jacobian product')\n", - "vmap_vs = vmap_mjp(f, W, M=U)\n", - "%timeit -n10 -r3 vmap_mjp(f, W, M=U)\n", - "\n", - "assert np.allclose(loop_vs, vmap_vs), 'Vmap and non-vmapped Matrix-Jacobian Products should be identical'" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Non-vmapped Matrix-Jacobian product\n", - "10 loops, best of 3: 156 ms per loop\n", - "\n", - "Vmapped Matrix-Jacobian product\n", - "10 loops, best of 3: 6.7 ms per loop\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "TDaxsJrlDraK", - "outputId": "88973626-83ff-4293-c47b-070872e76760", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 102 - } - }, - "source": [ - "def loop_jmp(f, x, M):\n", - " # jvp immediately returns the primal and tangent values as a tuple,\n", - " # so we'll compute and select the tangents in a list comprehension\n", - " return np.vstack([jvp(f, (W,), (si,))[1] for si in S])\n", - "\n", - "def vmap_jmp(f, x, M):\n", - " _jvp = lambda s: jvp(f, (W,), (s,))[1]\n", - " return vmap(_jvp)(M)\n", - "\n", - "num_vecs = 128\n", - "S = random.normal(key, (num_vecs,) + W.shape)\n", - "\n", - "loop_vs = loop_jmp(f, W, M=S)\n", - "print('Non-vmapped Jacobian-Matrix product')\n", - "%timeit -n10 -r3 loop_jmp(f, W, M=S)\n", - "vmap_vs = vmap_jmp(f, W, M=S)\n", - "print('\\nVmapped Jacobian-Matrix product')\n", - "%timeit -n10 -r3 vmap_jmp(f, W, M=S)\n", - "\n", - "assert np.allclose(loop_vs, vmap_vs), 'Vmap and non-vmapped Jacobian-Matrix products should be identical'" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Non-vmapped Jacobian-Matrix product\n", - "10 loops, best of 3: 529 ms per loop\n", - "\n", - "Vmapped Jacobian-Matrix product\n", - "10 loops, best of 3: 5.74 ms per loop\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "MXFEFBDz6vvL" - }, - "source": [ - "### The implementation of `jacfwd` and `jacrev`\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZAgUb6sp8bf7", - "colab_type": "text" - }, - "source": [ - "Now that we've seen fast Jacobian-matrix and matrix-Jacobian products, it's not hard to guess how to write `jacfwd` and `jacrev`. We just use the same technique to push-forward or pull-back an entire standard basis (isomorphic to an identity matrix) at once." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "HBEzsDH1U5_4", - "colab": {} - }, - "source": [ - "from jax import jacrev as builtin_jacrev\n", - "\n", - "def our_jacrev(f):\n", - " def jacfun(x):\n", - " y, vjp_fun = vjp(f, x)\n", - " # Use vmap to do a matrix-Jacobian product.\n", - " # Here, the matrix is the Euclidean basis, so we get all\n", - " # entries in the Jacobian at once. \n", - " J, = vmap(vjp_fun, in_axes=0)(np.eye(len(y)))\n", - " return J\n", - " return jacfun\n", - "\n", - "assert np.allclose(builtin_jacrev(f)(W), our_jacrev(f)(W)), 'Incorrect reverse-mode Jacobian results!'" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "Qd9gVZ5t6vvP", - "colab": {} - }, - "source": [ - "from jax import jacfwd as builtin_jacfwd\n", - "\n", - "def our_jacfwd(f):\n", - " def jacfun(x):\n", - " _jvp = lambda s: jvp(f, (x,), (s,))[1]\n", - " Jt =vmap(_jvp, in_axes=1)(np.eye(len(x)))\n", - " return np.transpose(Jt)\n", - " return jacfun\n", - "\n", - "assert np.allclose(builtin_jacfwd(f)(W), our_jacfwd(f)(W)), 'Incorrect forward-mode Jacobian results!'" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7r5_m9Y68bf_", - "colab_type": "text" - }, - "source": [ - "Interestingly, [Autograd](https://github.com/hips/autograd) couldn't do this. Our [implementation of reverse-mode `jacobian` in Autograd](https://github.com/HIPS/autograd/blob/96a03f44da43cd7044c61ac945c483955deba957/autograd/differential_operators.py#L60) had to pull back one vector at a time with an outer-loop `map`. Pushing one vector at a time through the computation is much less efficient than batching it all together with `vmap`." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9maev0Nd8bf_", - "colab_type": "text" - }, - "source": [ - "Another thing that Autograd couldn't do is `jit`. Interestingly, no matter how much Python dynamism you use in your function to be differentiated, we could always use `jit` on the linear part of the computation. For example:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "_5jDflC08bgB", - "colab_type": "code", - "outputId": "483e7276-b6e7-4b09-9476-30fe997fc0d2", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "def f(x):\n", - " try:\n", - " if x < 3:\n", - " return 2 * x ** 3\n", - " else:\n", - " raise ValueError\n", - " except ValueError:\n", - " return np.pi * x\n", - "\n", - "y, f_vjp = vjp(f, 4.)\n", - "print(jit(f_vjp)(1.))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "(array(3.1415927, dtype=float32),)\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3fPWLrxK8bgD", - "colab_type": "text" - }, - "source": [ - "## Complex numbers and differentiation" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2pZOHvrm8bgE", - "colab_type": "text" - }, - "source": [ - "JAX is great at complex numbers and differentiation. To support both [holomorphic and non-holomorphic differentiation](https://en.wikipedia.org/wiki/Holomorphic_function), JAX follows [Autograd's convention](https://github.com/HIPS/autograd/blob/master/docs/tutorial.md#complex-numbers) for encoding complex derivatives.\n", - "\n", - "Consider a complex-to-complex function $f: \\mathbb{C} \\to \\mathbb{C}$ that we break down into its component real-to-real functions:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "OaqZ2MuP8bgF", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def f(z):\n", - " x, y = real(z), imag(z)\n", - " return u(x, y), v(x, y) * 1j" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3XB5oGxl8bgH", - "colab_type": "text" - }, - "source": [ - "That is, we've decomposed $f(z) = u(x, y) + v(x, y) i$ where $z = x + y i$. We define `grad(f)` to correspond to" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "hINSv9TS8bgH", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def grad_f(z):\n", - " x, y = real(z), imag(z)\n", - " return grad(u, 0)(x, y) + grad(u, 1)(x, y) * 1j" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4j0F28bB8bgK", - "colab_type": "text" - }, - "source": [ - "In math symbols, that means we define $\\partial f(z) \\triangleq \\partial_0 u(x, y) + \\partial_1 u(x, y)$. So we throw out $v$, ignoring the complex component function of $f$ entirely!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wLxn8qfC8bgL", - "colab_type": "text" - }, - "source": [ - "This convention covers three important cases:\n", - "1. If `f` evaluates a holomorphic function, then we get the usual complex derivative, since $\\partial_0 u = \\partial_1 v$ and $\\partial_1 u = - \\partial_0 v$.\n", - "2. If `f` is evaluates the real-valued loss function of a complex parameter `x`, then we get a result that we can use in gradient-based optimization by taking steps in the direction of the conjugate of `grad(f)(x)`.\n", - "3. If `f` evaluates a real-to-real function, but its implementation uses complex primitives internally (some of which must be non-holomorphic, e.g. FFTs used in convolutions) then we get the same result that an implementation that only used real primitives would have given.\n", - "\n", - "By throwing away `v` entirely, this convention does not handle the case where `f` evaluates a non-holomorphic function and you want to evaluate all of $\\partial_0 u$, $\\partial_1 u$, $\\partial_0 v$, and $\\partial_1 v$ at once. But in that case the answer would have to contain four real values, and so there's no way to express it as a single complex number." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qmXkI37T8bgL", - "colab_type": "text" - }, - "source": [ - "You should expect complex numbers to work everywhere in JAX. Here's differentiating through a Cholesky decomposition of a complex matrix:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "WrDHHfKI8bgM", - "colab_type": "code", - "outputId": "fbc24428-2df8-4d5f-eff1-7a291af56e05", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 173 - } - }, - "source": [ - "A = np.array([[5., 2.+3j, 5j],\n", - " [2.-3j, 7., 1.+7j],\n", - " [-5j, 1.-7j, 12.]])\n", - "\n", - "def f(X):\n", - " L = np.linalg.cholesky(X)\n", - " return np.sum((L - np.sin(L))**2)\n", - "\n", - "grad(f)(A)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/jax/numpy/linalg.py:51: UserWarning: numpy.linalg support is experimental and may cause silent failures or wrong outputs\n", - " warnings.warn(_EXPERIMENTAL_WARNING)\n" - ], - "name": "stderr" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([[ 1.6623289e+01+0.j , -1.3631358e+00-5.603853j,\n", - " -1.8995681e+00+9.700883j],\n", - " [-1.3631358e+00+5.603853j, -8.9385910e+00+0.j ,\n", - " -5.1351523e+00-6.574377j],\n", - " [-1.8995681e+00-9.700883j, -5.1351523e+00+6.574377j,\n", - " 1.3204273e-02+0.j ]], dtype=complex64)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 29 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "X_3a2b6M8bgP", - "colab_type": "text" - }, - "source": [ - "For primitives' JVP rules, writing the primals as $z = a + bi$ and the tangents as $t = c + di$, we define the Jacobian-vector product $t \\mapsto \\partial f(z) \\cdot t$ as\n", - "\n", - "$t \\mapsto\n", - "\\begin{matrix} \\begin{bmatrix} 1 & 1 \\end{bmatrix} \\\\ ~ \\end{matrix}\n", - "\\begin{bmatrix} \\partial_0 u(a, b) & -\\partial_0 v(a, b) \\\\ - \\partial_1 u(a, b) i & \\partial_1 v(a, b) i \\end{bmatrix}\n", - "\\begin{bmatrix} c \\\\ d \\end{bmatrix}$." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dWwnI2Iz8bgP", - "colab_type": "text" - }, - "source": [ - "See Chapter 4 of [Dougal's PhD thesis](https://dougalmaclaurin.com/phd-thesis.pdf) for more details." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Pgr2A60q9gl1", - "colab_type": "text" - }, - "source": [ - "# More advanced autodiff\n", - "\n", - "In this notebook, we worked through some easy, and then progressively more complicated, applications of automatic differentiation in JAX. We hope you now feel that taking derivatives in JAX is easy and powerful. \n", - "\n", - "There's a whole world of other autodiff tricks and functionality out there. Topics we didn't cover, but hope to in a \"Advanced Autodiff Cookbook\" include:\n", - "\n", - " - Gauss-Newton Vector Products, linearizing once\n", - " - Custom VJPs and JVPs\n", - " - Efficient derivatives at fixed-points\n", - " - Estimating the trace of a Hessian using random Hessian-vector products.\n", - " - Forward-mode autodiff using only reverse-mode autodiff.\n", - " - Taking derivatives with respect to custom data types.\n", - " - Checkpointing (binomial checkpointing for efficient reverse-mode, not model snapshotting).\n", - " - Optimizing VJPs with Jacobian pre-accumulation." - ] - } - ] -} \ No newline at end of file From eb0137be364a0a2cae623c6845484c8e1a60c461 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 27 Sep 2019 17:37:44 -0700 Subject: [PATCH 0124/1053] Add optional `tuple_args` argument to xla_computation. This is useful when using JAX to create an HLO module that is compiled and executed elsewhere. Also fixes a bug in the `tuple_args` logic. --- jax/api.py | 8 ++++++-- jax/interpreters/xla.py | 8 +++++--- tests/api_test.py | 13 +++++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/jax/api.py b/jax/api.py index 6a777822a477..144e94cfda95 100644 --- a/jax/api.py +++ b/jax/api.py @@ -195,7 +195,8 @@ def disable_jit(): _thread_local_state.jit_is_disabled = prev_val -def xla_computation(fun, static_argnums=(), axis_env=None, backend=None): +def xla_computation(fun, static_argnums=(), axis_env=None, backend=None, + tuple_args=False): """Creates a function that produces its XLA computation given example args. Args: @@ -209,6 +210,9 @@ def xla_computation(fun, static_argnums=(), axis_env=None, backend=None): applications of ``jax.pmap``. See the examples below. backend: This is an experimental feature and the API is likely to change. Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. + tuple_args: Optional, defaults to False. If True, the resulting XLA + computation will have a single tuple argument that is unpacked into the + specified function arguments. Returns: A wrapped version of ``fun`` that when applied to example arguments returns a @@ -292,7 +296,7 @@ def computation_maker(*args, **kwargs): pvals = map(pv_like, jax_args) jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) axis_env_ = make_axis_env(xla.jaxpr_replicas(jaxpr)) - return xla.build_jaxpr(jaxpr, backend, axis_env_, consts, + return xla.build_jaxpr(jaxpr, backend, axis_env_, consts, tuple_args, *map(xla.abstractify, jax_args)) return computation_maker diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index adcbade99a20..db29ee4731cb 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -207,9 +207,10 @@ def compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, tuple_args, return built_c.Compile(compile_options=compile_opts, backend=xb.get_backend(backend)) -def build_jaxpr(jaxpr, backend, axis_env, const_vals, *abstract_args): +def build_jaxpr(jaxpr, backend, axis_env, const_vals, tuple_args, *abstract_args): arg_shapes = map(aval_to_xla_shape, abstract_args) - return jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes) + return jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes, + tuple_args=tuple_args) def prefetch(x): if isinstance(x, DeviceArray): @@ -240,7 +241,8 @@ def jaxpr_computation(jaxpr, backend, axis_env, const_vals, freevar_shapes, _map(prefetch, it.chain(const_vals, jaxpr_literals(jaxpr))) consts = _map(c.Constant, const_vals) if tuple_args: - tuple_shape = xc.Shape.tuple_shape(list(freevar_shapes) + list(arg_shapes)) + freevar_shapes, arg_shapes = list(freevar_shapes), list(arg_shapes) + tuple_shape = xc.Shape.tuple_shape(freevar_shapes + arg_shapes) tuple_arg = c.ParameterWithShape(tuple_shape) nfreevars, nargs = len(freevar_shapes), len(arg_shapes) freevars = [c.GetTupleElement(tuple_arg, i) for i in range(nfreevars)] diff --git a/tests/api_test.py b/tests/api_test.py index 7e1325d9868a..59a021032f98 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -921,6 +921,19 @@ def g(x): self.assertIn('replica_groups={{0,1},{2,3},{4,5},{6,7}}', c.GetHloText()) self.assertIn('replica_groups={{0,1,2,3,4,5,6,7}}', c.GetHloText()) + def test_xla_computation_args(self): + def foo(x, y, z): + return x + y + z + + c = api.xla_computation(foo)(1., 2., 3.) + self.assertEqual(len(c.GetProgramShape().parameter_shapes()), 3) + + c = api.xla_computation(foo, tuple_args=True)(1., 2., 3.) + param_shapes = c.GetProgramShape().parameter_shapes() + self.assertEqual(len(param_shapes), 1) + self.assertEqual(param_shapes[0].xla_element_type(), + xb.xla_client.PrimitiveType.TUPLE) + def test_staging_out_multi_replica(self): def f(x): return api.pmap(np.mean)(x) From 08254fe5bca2fc8c29ea31a5812a362897e62693 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 30 Sep 2019 11:12:01 -0700 Subject: [PATCH 0125/1053] Fixup colab notebook URLs --- docs/conf.py | 2 +- notebooks/README.md | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index cbc399c400cf..d2e550af81dd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -139,7 +139,7 @@ .. nbinfo:: Interactive online version: - :raw-html:`Open In Colab` + :raw-html:`Open In Colab` __ https://github.com/google/jax/blob/ {{ env.config.release }}/{{ docname }} diff --git a/notebooks/README.md b/notebooks/README.md index 0d07ca8d57a4..034be2973a7e 100644 --- a/notebooks/README.md +++ b/notebooks/README.md @@ -2,10 +2,6 @@ Use the links below to open any of these for interactive exploration in colab. - - [Quick Start][quickstart] - the first notebook to go through, explores the basic JAX API. - - - [Common Gotchas in JAX][Common_Gotchas_in_JAX] - answers for the most common problems people have while getting used to JAX's way of doing things. - - [MAML][maml] - pedagogical demonstration of Model-Agnostic Meta-Learning in JAX. - [Score Matching][gmegdd] - demonstration of Generative Modeling by Estimating Gradients of the Data Distribution @@ -18,11 +14,9 @@ Use the links below to open any of these for interactive exploration in colab. - [XLA in Python][XLA_in_Python] - interactive exploration of the XLA compiler and computation model in python. +Some of these notebooks were also recently moved into JAX's [online documentation](https://jax.readthedocs.io/en/latest/). - -[quickstart]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/quickstart.ipynb -[Common_Gotchas_in_JAX]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb [maml]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/maml.ipynb [gmegdd]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb [vmapped log-probs]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/vmapped%20log-probs.ipynb From 98054472962d5c08863fe59596333ef744ae6190 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 30 Sep 2019 11:15:37 -0700 Subject: [PATCH 0126/1053] wording --- notebooks/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/README.md b/notebooks/README.md index 034be2973a7e..c050bc8e5395 100644 --- a/notebooks/README.md +++ b/notebooks/README.md @@ -14,7 +14,7 @@ Use the links below to open any of these for interactive exploration in colab. - [XLA in Python][XLA_in_Python] - interactive exploration of the XLA compiler and computation model in python. -Some of these notebooks were also recently moved into JAX's [online documentation](https://jax.readthedocs.io/en/latest/). +Some additional notebooks were recently moved into JAX's [online documentation](https://jax.readthedocs.io/en/latest/). [maml]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/maml.ipynb From 29d18fdceabaf199ed08939e464c1f826f6b7ff6 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 30 Sep 2019 11:17:59 -0700 Subject: [PATCH 0127/1053] wording --- notebooks/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/README.md b/notebooks/README.md index c050bc8e5395..ae50910ed2f3 100644 --- a/notebooks/README.md +++ b/notebooks/README.md @@ -14,7 +14,7 @@ Use the links below to open any of these for interactive exploration in colab. - [XLA in Python][XLA_in_Python] - interactive exploration of the XLA compiler and computation model in python. -Some additional notebooks were recently moved into JAX's [online documentation](https://jax.readthedocs.io/en/latest/). +Some additional notebooks (quickstart, auto-diff cookbook and commona gotchas) were recently moved into JAX's [online documentation](https://jax.readthedocs.io/en/latest/). [maml]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/maml.ipynb From f66aa275a62f62afb038170c486647d1248284ec Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Tue, 1 Oct 2019 17:56:44 +0100 Subject: [PATCH 0128/1053] Rm duplicates from end_nodes in toposort --- jax/util.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jax/util.py b/jax/util.py index f4cfcb1e0015..bd6454627677 100644 --- a/jax/util.py +++ b/jax/util.py @@ -107,6 +107,7 @@ def curry(f): def toposort(end_nodes): if not end_nodes: return [] + end_nodes = _remove_duplicates(end_nodes) child_counts = {} stack = list(end_nodes) @@ -141,6 +142,15 @@ def check_toposort(nodes): assert all(id(parent) in visited for parent in node.parents) visited.add(id(node)) +def _remove_duplicates(node_list): + seen = set() + out = [] + for n in node_list: + if id(n) not in seen: + seen.add(id(n)) + out.append(n) + return out + def split_merge(predicate, xs): sides = list(map(predicate, xs)) lhs = [x for x, s in zip(xs, sides) if s] From a44c1caf212db7309c9ed4e0050d03e7cf7553a5 Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Tue, 1 Oct 2019 22:28:31 +0100 Subject: [PATCH 0129/1053] Use finfo(dtype).tiny as uniform minval Otherwise, using the default clopen uniform for truncated_normal introduces a slight shift of the empirical mean. --- jax/random.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index 97e43eb87722..a726b2a56bef 100644 --- a/jax/random.py +++ b/jax/random.py @@ -441,7 +441,9 @@ def _truncated_normal(key, lower, upper, shape, dtype): sqrt2 = onp.array(onp.sqrt(2), dtype) a = lax.erf(lax.convert_element_type(lower, dtype) / sqrt2) b = lax.erf(lax.convert_element_type(upper, dtype) / sqrt2) - u = uniform(key, shape, dtype) + if not onp.issubdtype(dtype, onp.floating): + raise TypeError("truncated_normal only accepts floating point dtypes.") + u = uniform(key, shape, dtype, minval=onp.finfo(dtype).tiny) return sqrt2 * lax.erf_inv(a + u * (b - a)) From 454320e9c9f118148a31e09f6922cfd05f7712e9 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 2 Oct 2019 14:41:28 +0200 Subject: [PATCH 0130/1053] Added How_JAX_primitives_work colab --- docs/index.rst | 1 + docs/notebooks/How_JAX_primitives_work.ipynb | 1638 ++++++++++++++++++ 2 files changed, 1639 insertions(+) create mode 100644 docs/notebooks/How_JAX_primitives_work.ipynb diff --git a/docs/index.rst b/docs/index.rst index a86f5b7c6aa7..081d3e6349c2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -14,6 +14,7 @@ For an introduction to JAX, start at the notebooks/quickstart notebooks/autodiff_cookbook notebooks/Common_Gotchas_in_JAX + notebooks/How_JAX_primitives_work .. toctree:: :maxdepth: 1 diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb new file mode 100644 index 000000000000..968415025823 --- /dev/null +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -0,0 +1,1638 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "How JAX primitives work.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "vfxqky4PCUnh", + "colab_type": "text" + }, + "source": [ + "# JAX primitives\n", + "\n", + "*necula@google.com*, September 2019.\n", + "\n", + "JAX implements certain transformations of Python functions, e.g., `jit`, `grad`,\n", + "`vmap`, or `pmap`. The Python functions to be transformed must be JAX-traceable, \n", + "which means that as the Python function executes\n", + "the only operations it applies to the data are either inspections of data\n", + "attributes such as shape or type, or special operations called JAX primitives.\n", + "In particular, a JAX-traceable function is sometimes invoked by JAX with\n", + "abstract arguments. An example of a JAX abstract value is `ShapedArray(float32[2,2])`, \n", + "which captures the type and the shape of values, but not the concrete data values.\n", + "JAX primitives know how to operate on both concrete data\n", + "values and on the JAX abstract values.\n", + "\n", + "\n", + "The JAX-transformed functions must themselves be JAX-traceable functions,\n", + "to ensure that these transformations\n", + "can be composed, e.g., `jit(jacfwd(grad(f)))`.\n", + "\n", + "There are pre-defined JAX primitives corresponding to most XLA operations, \n", + "e.g., add, matmul, sin, cos, indexing.\n", + "JAX comes with an implementation of numpy functions in terms of JAX primitives, which means that Python programs\n", + "using JAX’s implementation of numpy are JAX-traceable and therefore transformable.\n", + "Other libraries can be made JAX-traceable by implementing them in terms of JAX primitives.\n", + "\n", + "The set of JAX primitives is extensible. Instead of reimplementing a function in terms of pre-defined JAX primitives,\n", + "one can define a new primitive that encapsulates the behavior of the function.\n", + "\n", + "**The goal of this document is to explain the interface that a JAX primitive must support in order to allow JAX to perform all its transformations.**\n", + "\n", + "Consider that we want to add to JAX support for a multiply-add function with three arguments, defined mathematically\n", + "as \"ma(x, y, z) = x * y + z\". \n", + "This function operates on 3 identically-shaped tensors of floating point \n", + "values and performs the opertions pointwise.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HIJYIHNTD1yI", + "colab_type": "text" + }, + "source": [ + "## Defining new functionality using existing primitives\n", + "\n", + "The easiest way to define new functions is to write them in terms of JAX primitives, or in terms of other\n", + "functions that are themselves written using JAX primitives, e.g., those \n", + "defined in the `jax.lax` module:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "tbOF0LB0EMne", + "colab_type": "code", + "outputId": "f27e2b0e-c33d-40d1-dab8-32502a607056", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + } + }, + "source": [ + "from jax import lax\n", + "from jax import api\n", + "\n", + "def ma_lax(x, y, z):\n", + " \"\"\"Implementation of multiply-add using the jax.lax primitives.\"\"\"\n", + " return lax.add(lax.mul(x, y), z)\n", + "\n", + "\n", + "def sq_add_lax(a, b):\n", + " \"\"\"A square-add function using the newly defined multiply-add.\"\"\"\n", + " return ma_lax(a, a, b)\n", + "\n", + "print(\"sq_add_lax = \", sq_add_lax(2., 10.))\n", + "# Differentiate w.r.t. the first argument\n", + "print(\"grad(sq_add_lax) = \", api.grad(sq_add_lax, argnums=0)(2.0, 10.))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "sq_add_lax = 14.0\n", + "grad(sq_add_lax) = 4.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Cgv60Wm3E_D5", + "colab_type": "text" + }, + "source": [ + "In order to understand how JAX is using internally the primitives,\n", + "we add some helpers for tracing function calls." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mQRQGEGiE53K", + "colab_type": "code", + "cellView": "form", + "colab": {} + }, + "source": [ + "#@title Helper functions (execute this cell)\n", + "import functools\n", + "import traceback\n", + "\n", + "_indentation = 0\n", + "def _trace(msg=None):\n", + " \"\"\"Print a message at current indentation.\"\"\"\n", + " if msg is not None:\n", + " print(\" \" * _indentation + msg)\n", + "\n", + "def _trace_indent(msg=None):\n", + " \"\"\"Print a message and then indent the rest.\"\"\"\n", + " global _indentation\n", + " _trace(msg)\n", + " _indentation = 1 + _indentation\n", + "\n", + "def _trace_unindent(msg=None):\n", + " \"\"\"Unindent then print a message.\"\"\"\n", + " global _indentation\n", + " _indentation = _indentation - 1\n", + " _trace(msg)\n", + "\n", + "def trace(name):\n", + " \"\"\"A decorator for functions to trace arguments and results.\"\"\"\n", + "\n", + " def trace_func(func): # pylint: disable=missing-docstring\n", + " def pp(v):\n", + " \"\"\"Print certain values more succinctly\"\"\"\n", + " vtype = str(type(v))\n", + " if \"jax.lib.xla_bridge._JaxComputationBuilder\" in vtype:\n", + " return \"\"\n", + " elif \"jaxlib.xla_extension.XlaOp\" in vtype:\n", + " return \"\".format(id(v))\n", + " elif (\"partial_eval.JaxprTracer\" in vtype or\n", + " \"batching.BatchTracer\" in vtype or\n", + " \"ad.JVPTracer\" in vtype):\n", + " return \"Traced<{}>\".format(v.aval)\n", + " elif isinstance(v, tuple):\n", + " return \"({})\".format(pp_values(v))\n", + " else:\n", + " return str(v)\n", + " def pp_values(args):\n", + " return \", \".join([pp(arg) for arg in args])\n", + " \n", + " @functools.wraps(func)\n", + " def func_wrapper(*args):\n", + " _trace_indent(\"call {}({})\".format(name, pp_values(args)))\n", + " res = func(*args)\n", + " _trace_unindent(\"|<- {} = {}\".format(name, pp(res)))\n", + " return res\n", + "\n", + " return func_wrapper\n", + "\n", + " return trace_func\n", + "\n", + "class expectNotImplementedError(object):\n", + " \"\"\"Context manager to check for NotImplementedError.\"\"\"\n", + " def __enter__(self): pass\n", + " def __exit__(self, type, value, tb):\n", + " global _indentation\n", + " _indentation = 0\n", + " if type is NotImplementedError:\n", + " print(\"\\nFound expected exception:\")\n", + " traceback.print_exc(limit=3)\n", + " return True\n", + " elif type is None: # No exception\n", + " assert False, \"Expected NotImplementedError\"\n", + " else:\n", + " return False" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Qf4eLrLCFYDl", + "colab_type": "text" + }, + "source": [ + "Instead of using `jax.lax` primitives directly, we can use other functions \n", + "that are already written in terms of those primitives, such as those in `jax.numpy`: " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QhKorz6cFRJb", + "colab_type": "code", + "outputId": "81b1c4b7-7401-4045-9b10-444ff187bc2a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 255 + } + }, + "source": [ + "import jax.numpy as jnp\n", + "import numpy as onp\n", + "\n", + "@trace(\"ma_numpy\")\n", + "def ma_numpy(x, y, z):\n", + " return jnp.add(jnp.multiply(x, y), z)\n", + "\n", + "@trace(\"sq_add_numpy\")\n", + "def sq_add_numpy(a, b):\n", + " return ma_numpy(a, a, b)\n", + "\n", + "print(\"\\nNormal evaluation:\") \n", + "print(\"sq_add_numpy = \", sq_add_numpy(2., 10.))\n", + "print(\"\\nGradient evaluation:\")\n", + "print(\"grad(sq_add_numpy) = \", api.grad(sq_add_numpy)(2.0, 10.))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "\n", + "Normal evaluation:\n", + "call sq_add_numpy(2.0, 10.0)\n", + " call ma_numpy(2.0, 2.0, 10.0)\n", + " |<- ma_numpy = 14.0\n", + "|<- sq_add_numpy = 14.0\n", + "sq_add_numpy = 14.0\n", + "\n", + "Gradient evaluation:\n", + "call sq_add_numpy(Traced, 10.0)\n", + " call ma_numpy(Traced, Traced, 10.0)\n", + " |<- ma_numpy = Traced\n", + "|<- sq_add_numpy = Traced\n", + "grad(sq_add_numpy) = 4.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Sg-D8EdeFn4a", + "colab_type": "text" + }, + "source": [ + "Notice that in the process of computing `grad`, JAX invokes `sq_add_numpy` and\n", + "`ma_numpy` with special arguments `ConcreteArray(...)` (described further \n", + "below in this colab). \n", + "It is important to remember that a JAX-traceable function must be able to \n", + "operate not only on concrete arguments but also on special abstract arguments\n", + "that JAX may use to abstract the function execution.\n", + "\n", + "The JAX traceability property is satisfied as long as the function is written \n", + "in terms of JAX primitives. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WxrQO7-XGLcg", + "colab_type": "text" + }, + "source": [ + "# Defining new JAX primitives\n", + "\n", + "The right way to add support for multiple-add is in terms of existing\n", + "JAX primitives, as shown above. However, in order to demonstrate how JAX\n", + "primitives work let us pretend that we want to add a new primitive to \n", + "JAX for the multiply-add functionality." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "cPqAH1XOGTN4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import core\n", + "ma_p = core.Primitive(\"ma\") # Create the primitive\n", + "\n", + "@trace(\"ma_prim\")\n", + "def ma_prim(x, y, z):\n", + " \"\"\"The JAX-traceable way to use the JAX primitive.\"\"\"\n", + " return ma_p.bind(x, y, z)\n", + "\n", + "@trace(\"sq_add_prim\")\n", + "def sq_add_prim(a, b):\n", + " \"\"\"A square-add function implemented using the new JAX-primitive.\"\"\"\n", + " return ma_prim(a, a, b)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LMzs5PAKGr-4", + "colab_type": "text" + }, + "source": [ + "If we try to call the newly defined functions we get an error, because\n", + "we have not yet told JAX anything about the semantics of the new primitive." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "_X3PAYxhGpWd", + "colab_type": "code", + "outputId": "235a6e34-e5ff-4883-916c-7994aff8ba03", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + } + }, + "source": [ + "with expectNotImplementedError():\n", + " sq_add_prim(2., 10.)\n" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(2.0, 10.0)\n", + " call ma_prim(2.0, 2.0, 10.0)\n", + "\n", + "Found expected exception:\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 2, in \n", + " sq_add_prim(2., 10.)\n", + " File \"\", line 47, in func_wrapper\n", + " res = func(*args)\n", + " File \"\", line 12, in sq_add_prim\n", + " return ma_prim(a, a, b)\n", + "NotImplementedError: Evaluation rule for 'ma' not implemented\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "elha0FdgHSEF", + "colab_type": "text" + }, + "source": [ + "## Primal evaluation rules\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FT34FFAGHARU", + "colab_type": "code", + "outputId": "4ef9f076-09f6-474a-c4e9-db3794969c24", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "@trace(\"ma_impl\")\n", + "def ma_impl(x, y, z):\n", + " \"\"\"Concrete implementation of the primitive.\n", + "\n", + " This function does not need to be JAX traceable.\n", + " Args:\n", + " x, y, z: the concrete arguments of the primitive. Will only be caled with \n", + " concrete values.\n", + " Returns:\n", + " the concrete result of the primitive.\n", + " \"\"\"\n", + " # Note that we can use the original numpy, which is not JAX traceable\n", + " return onp.add(onp.multiply(x, y), z)\n", + "\n", + "# Now we register the primal implementation with JAX\n", + "ma_p.def_impl(ma_impl)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 104 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "G5bstKaeNAVV", + "colab_type": "code", + "outputId": "f822d0f5-fee2-4983-8d2f-edd518fad1be", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 119 + } + }, + "source": [ + "assert sq_add_prim(2., 10.) == 14." + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(2.0, 10.0)\n", + " call ma_prim(2.0, 2.0, 10.0)\n", + " call ma_impl(2.0, 2.0, 10.0)\n", + " |<- ma_impl = 14.0\n", + " |<- ma_prim = 14.0\n", + "|<- sq_add_prim = 14.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "upBf-uAuHhPJ", + "colab_type": "text" + }, + "source": [ + "## JIT\n", + "\n", + "If we now try to use `jit` we get a `NotImplementedError`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QG-LULjiHk4b", + "colab_type": "code", + "outputId": "2cc39be2-b33e-4212-8529-bf8894289125", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + } + }, + "source": [ + "with expectNotImplementedError():\n", + " api.jit(sq_add_prim)(2., 10.)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + "\n", + "Found expected exception:\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 2, in \n", + " api.jit(sq_add_prim)(2., 10.)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 147, in f_jitted\n", + " out = xla.xla_call(flat_fun, *args_flat, device_assignment=device_assignment, backend=backend)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/core.py\", line 569, in call_bind\n", + " outs = primitive.impl(f, *args, **params)\n", + "NotImplementedError: Abstract evaluation for 'ma' not implemented\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rHS1bAGHH44E", + "colab_type": "text" + }, + "source": [ + "### Abstract evaluation rules\n", + "In order to JIT the function, and for other transformations as well, \n", + "JAX first evaluates it abstractly using only the \n", + "shape and type of the arguments. This abstract evaluation serves multiple\n", + "purposes:\n", + " * Gets the sequence of JAX primitives that are used in the computation. This \n", + " sequence will be compiled. \n", + " * Computes the shape and type of all vectors and operations used in the computation. \n", + "\n", + "\n", + "For example, the abstraction of a vector with 3 elements may be `ShapedArray(float32[3])`, or `ConcreteArray([1., 2., 3.])`. \n", + "In the latter case, JAX uses the actual concrete value wrapped as an abstract value. Nevertheless, the abstract evaluation is not supposed to look at the concrete values, but only at the shapes and types.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ctQmEeckIbdo", + "colab_type": "code", + "outputId": "b42e0840-1342-4fb7-effa-da031625d12d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "from jax import abstract_arrays\n", + "@trace(\"ma_abstract_eval\")\n", + "def ma_abstract_eval(xs, ys, zs):\n", + " \"\"\"Abstract evaluation of the primitive.\n", + "\n", + " This function does not need to be JAX traceable. It will be invoked with\n", + " abstractions of the actual arguments. \n", + " Args:\n", + " xs, ys, zs: abstractions of the arguments.\n", + " Result:\n", + " a ShapedArray for the result of the primitive.\n", + " \"\"\"\n", + " assert xs.shape == ys.shape\n", + " assert xs.shape == zs.shape\n", + " return abstract_arrays.ShapedArray(xs.shape, xs.dtype)\n", + "\n", + "# Now we register the abstract evaluation with JAX\n", + "ma_p.def_abstract_eval(ma_abstract_eval)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 107 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RPN88X6YI43A", + "colab_type": "text" + }, + "source": [ + "If we re-attempt to JIT, we see how the abstract evaluation proceeds, but\n", + "we get another error, about missing the actual XLA compilation rule:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eOcNR92SI2h-", + "colab_type": "code", + "outputId": "f900a2d1-f0db-4118-96f8-d15ac536d54a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 289 + } + }, + "source": [ + "with expectNotImplementedError():\n", + " api.jit(sq_add_prim)(2., 10.)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "\n", + "Found expected exception:\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 2, in \n", + " api.jit(sq_add_prim)(2., 10.)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 147, in f_jitted\n", + " out = xla.xla_call(flat_fun, *args_flat, device_assignment=device_assignment, backend=backend)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/core.py\", line 569, in call_bind\n", + " outs = primitive.impl(f, *args, **params)\n", + "NotImplementedError: XLA translation rule for primitive 'ma' not found\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9IOV1R-fJMHp", + "colab_type": "text" + }, + "source": [ + "### XLA Compilation rules\n", + "\n", + "JAX compilation works by compiling each primitive into a graph of XLA operations.\n", + "\n", + "This is biggest hurdle to adding new functionality to JAX, because the \n", + "set of XLA operations is limited, and JAX already has pre-defined primitives\n", + "for each of them." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FYQWSSjKJaWP", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@trace(\"ma_xla_translation\")\n", + "def ma_xla_translation(c, xc, yc, zc):\n", + " \"\"\"The compilation to XLA of the primitive.\n", + "\n", + " Given an XlaBuilder and XlaOps for each argument, return the XlaOp for the\n", + " result of the function.\n", + "\n", + " Does not need to be a JAX-traceable function.\n", + " \"\"\"\n", + " return c.Add(c.Mul(xc, yc), zc)\n", + "\n", + "# Now we register the XLA compilation rule with JAX\n", + "# TODO: for GPU? and TPU?\n", + "from jax import xla\n", + "xla.backend_specific_translations['cpu'][ma_p] = ma_xla_translation" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K98LX-VaJkFu", + "colab_type": "text" + }, + "source": [ + "Now we succeed to JIT. Notice below that JAX first evaluates the function\n", + "abstractly, which triggers the `ma_abstract_eval` function, and \n", + "then compiles the set of primitives it has encountered, including `ma`.\n", + "At this point JAX invokes `ma_xla_translation`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rj3TLsolJgEc", + "colab_type": "code", + "outputId": "e71a362e-0d2d-46e8-b166-bb729e3de6fc", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + } + }, + "source": [ + "assert api.jit(lambda x, y: sq_add_prim(x, y))(2., 10.) == 14." + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Omrez-2_KFfo", + "colab_type": "text" + }, + "source": [ + "Below is another use of `jit` where we differentiate only\n", + "with respect to the first argument. Notice how the second argument to `sq_add_prim` is concrete, which leads\n", + "in the third argument to `ma_abstract_eval` being \n", + "`ConcreteArray`. We see that `ma_abstract_eval` may be used with\n", + "both `ShapedArray` and `ConcreteArray`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mPfTwIBoKOEK", + "colab_type": "code", + "outputId": "1b33b982-bc51-4a94-ac83-891fa3726cdc", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + } + }, + "source": [ + "assert api.jit(lambda x, y: sq_add_prim(x, y), \n", + " static_argnums=1)(2., 10.) == 14." + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, 10.0)\n", + " call ma_prim(Traced, Traced, 10.0)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ConcreteArray(10.0))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_Ya3B5l4J1VA", + "colab_type": "text" + }, + "source": [ + "## Forward differentiation\n", + "\n", + "JAX implements forward differentiation in the form of\n", + "a Jacobian-vector product (see the [JAX autodiff cookbook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/autodiff_cookbook.ipynb#scrollTo=OMmi9cyhs1bj)).\n", + "\n", + "If we attempt now to compute the `jvp` function we get an\n", + "error because we have not yet told JAX how to differentiate\n", + "the `ma` primitive." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OxDx6NQnKwMI", + "colab_type": "code", + "outputId": "c9d0bc5a-6b1b-4849-c68c-47511bdb8924", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 340 + } + }, + "source": [ + "# The second argument `(2., 10.)` are the argument values\n", + "# where we evaluate the Jacobian, and the third `(1., 1.)`\n", + "# are the values of the tangents for the arguments.\n", + "with expectNotImplementedError():\n", + " api.jvp(sq_add_prim, (2., 10.), (1., 1.))\n" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + "\n", + "Found expected exception:\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/ad.py\", line 215, in process_primitive\n", + " jvp = primitive_jvps[primitive]\n", + "KeyError: ma\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"\", line 2, in \n", + " api.jvp(sq_add_prim, (2., 10.), (1., 1.))\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 909, in jvp\n", + " out_primals, out_tangents = ad.jvp(flat_fun).call_wrapped(ps_flat, ts_flat)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/linear_util.py\", line 165, in call_wrapped\n", + " ans = self.f(*args, **dict(self.params, **kwargs))\n", + "NotImplementedError: Forward-mode differentiation rule for 'ma' not implemented\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zxG24C1JMIMM", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import ad\n", + "\n", + "\n", + "@trace(\"ma_value_and_jvp\")\n", + "def ma_value_and_jvp(arg_values, arg_tangents):\n", + " \"\"\"Evaluates the primal output and the tangents (Jacobian-vector product).\n", + "\n", + " Given values of the arguments and perturbation of the arguments (tangents), \n", + " compute the output of the primitive and the perturbation of the output.\n", + "\n", + " This method must be JAX-traceable. JAX may invoke it with abstract values \n", + " for the arguments and tangents.\n", + "\n", + " Args:\n", + " arg_values: a tuple of arguments\n", + " arg_tangents: a tuple with the tangents of the arguments. The tuple has \n", + " the same length as the arg_values. Some of the tangents may also be the \n", + " special value ad.Zero to specify a zero tangent.\n", + " Returns:\n", + " a pair of the primal output and the tangent.\n", + " \"\"\"\n", + " x, y, z = arg_values\n", + " xt, yt, zt = arg_tangents\n", + " _trace(\"Primal evaluation:\")\n", + " # Now we have a JAX-traceable computation of the output. \n", + " # Normally, we can use the ma primtive itself to compute the primal output. \n", + " primal_out = ma_prim(x, y, z)\n", + " \n", + " _trace(\"Tangent evaluation:\")\n", + " # We must use a JAX-traceable way to compute the tangent. It turns out that \n", + " # the output tangent can be computed as (xt * y + x * yt + zt),\n", + " # which we can implement in a JAX-traceable way using the same \"ma_prim\" primitive.\n", + " \n", + " # We do need to deal specially with Zero. Here we just turn it into a \n", + " # proper tensor of 0s (of the same shape as 'x'). \n", + " # An alternative would be to check for Zero and perform algebraic \n", + " # simplification of the output tangent computation.\n", + " def make_zero(tan):\n", + " return lax.zeros_like_array(x) if tan is ad.zero else tan \n", + " \n", + " output_tangent = ma_prim(make_zero(xt), y, ma_prim(x, make_zero(yt), make_zero(zt)))\n", + " return (primal_out, output_tangent)\n", + "\n", + "# Register the forward differentiation rule with JAX \n", + "ad.primitive_jvps[ma_p] = ma_value_and_jvp" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ma3KBkiAMfW1", + "colab_type": "code", + "outputId": "37ff9f08-d141-4381-fadf-3db7e40d8f69", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 357 + } + }, + "source": [ + "# Tangent is: xt*y + x*yt + zt = 1.*2. + 2.*1. + 1. = 5.\n", + "assert api.jvp(sq_add_prim, (2., 10.), (1., 1.)) == (14., 5.)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_value_and_jvp((2.0, 2.0, 10.0), (1.0, 1.0, 1.0))\n", + " Primal evaluation:\n", + " call ma_prim(2.0, 2.0, 10.0)\n", + " call ma_impl(2.0, 2.0, 10.0)\n", + " |<- ma_impl = 14.0\n", + " |<- ma_prim = 14.0\n", + " Tangent evaluation:\n", + " call ma_prim(2.0, 1.0, 1.0)\n", + " call ma_impl(2.0, 1.0, 1.0)\n", + " |<- ma_impl = 3.0\n", + " |<- ma_prim = 3.0\n", + " call ma_prim(1.0, 2.0, 3.0)\n", + " call ma_impl(1.0, 2.0, 3.0)\n", + " |<- ma_impl = 5.0\n", + " |<- ma_prim = 5.0\n", + " |<- ma_value_and_jvp = (14.0, 5.0)\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "69QsEcu-lP4u", + "colab_type": "text" + }, + "source": [ + "TO EXPLAIN: \n", + " * Why is JAX using ConcreteArray in sq_add_prim? There is no abstract evaluation going on here.\n", + " * Not sure how to explain that ma_prim is invoked with ConcreteValue, yet\n", + " we do not call the ma_abstract_eval.\n", + " * I think it would be useful to show the JAXPR here\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Sb6e3ZAHOPHv", + "colab_type": "text" + }, + "source": [ + "### JIT of forward differentiation\n", + "\n", + "We can apply JIT to the forward differentiation function:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hg-hzVu-N-hv", + "colab_type": "code", + "outputId": "4c5ea9c3-9014-4099-98a4-ad06804615b2", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 479 + } + }, + "source": [ + "assert api.jit(lambda arg_values, arg_tangents: \n", + " api.jvp(sq_add_prim, arg_values, arg_tangents))(\n", + " (2., 10.), (1., 1.)) == (14., 5.)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_value_and_jvp((Traced, Traced, Traced), (Traced, Traced, Traced))\n", + " Primal evaluation:\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " Tangent evaluation:\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " |<- ma_value_and_jvp = (Traced, Traced)\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jlZt1_v2mU88", + "colab_type": "text" + }, + "source": [ + "Notice that first we evaluate `ma_value_and_jvp` abstractly, which in turn\n", + "evaluates abstractly both the primal and the tanger evaluation (a total of \n", + "3 invocations of the `ma` primitive). Then we compile the 3 occurrences\n", + "of the primitive." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "555yt6ZIOePB", + "colab_type": "text" + }, + "source": [ + "## Reverse differentiation\n", + "\n", + "If we attempt now to use reverse differentiation we\n", + "see that JAX starts by using the `ma_value_and_jvp` to \n", + "compute the forward differentiation for abstract values, but then runs\n", + "into a `NotImplementedError`. \n", + "\n", + "When computing the reverse differentiation JAX first does abstract evaluation\n", + "of the forward differentiation code `ma_value_and_jvp` to obtain a \n", + "trace of primitives that compute the output tangent. \n", + "Observe that JAX performs this abstract evaluation with concrete values\n", + "for the differentiation point, and abstract values for the tangents. \n", + "Observe also that JAX uses the special abstract tangent value `Zero` for\n", + "the tangent corresponding to the 3rd argument of `ma`. This reflects the \n", + "fact that we do not differentiate w.r.t. the 2nd argument to `sq_add_prim`,\n", + "which flow to 3rd argument to `ma_prim`.\n", + "\n", + "Observe also that during the abstract evaluation of the tangent we pass the \n", + "value 0.0 as the tangent for the 3rd argument. This is due to the use\n", + "of the `make_zero` function in the definition of `ma_value_and_jvp`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8eAVnexaOjBn", + "colab_type": "code", + "outputId": "e18bbb00-01f2-4c10-a71e-e1f36b717046", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 666 + } + }, + "source": [ + "# This is reverse differentiation w.r.t. the first argument of sq_add_prim\n", + "with expectNotImplementedError():\n", + " api.grad(sq_add_prim)(2., 10.)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, 10.0)\n", + " call ma_prim(Traced, Traced, 10.0)\n", + " call ma_value_and_jvp((Traced, Traced, 10.0), (Traced, Traced, Zero))\n", + " Primal evaluation:\n", + " call ma_prim(Traced, Traced, 10.0)\n", + " call ma_impl(2.0, 2.0, 10.0)\n", + " |<- ma_impl = 14.0\n", + " |<- ma_prim = 14.0\n", + " Tangent evaluation:\n", + " call ma_prim(Traced, Traced, 0.0)\n", + " call ma_abstract_eval(ConcreteArray(2.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ConcreteArray(2.0), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " |<- ma_value_and_jvp = (14.0, Traced)\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "\n", + "Found expected exception:\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/ad.py\", line 196, in get_primitive_transpose\n", + " return primitive_transposes[p]\n", + "KeyError: ma\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"\", line 2, in \n", + " api.grad(sq_add_prim)(2., 10.)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 338, in grad_f\n", + " _, g = value_and_grad_f(*args, **kwargs)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 396, in value_and_grad_f\n", + " g = vjp_py(onp.ones((), dtype=dtype))\n", + "NotImplementedError: Reverse-mode differentiation rule for 'ma' not implemented\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fSHLUMDN26AY", + "colab_type": "text" + }, + "source": [ + "The above error is because there is a missing piece for JAX to be able\n", + "to use the forward differentiation code to compute reverse differentiation. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3ibDbGF-PjK9", + "colab_type": "text" + }, + "source": [ + "### Transposition\n", + "\n", + "\n", + "As explained above, when computing reverse differentiation JAX obtains\n", + "a trace of primitives that compute the tangent using forward differentiation.\n", + "Then, **JAX interprets this trace abstractly backwards** and for each \n", + "primitive it applies a **transposition** rule.\n", + "\n", + "To understand what is going on, consider for now a simpler example of the function \"f(x, y) = x * y + y\". Assume we need to differentiate at the point `(2., 4.)`. JAX will produce the following JVP tangent calculation of `ft` from the tangents of the input `xt` and `yt`:\n", + "```\n", + " a = xt * 4.\n", + " b = 2. * yt\n", + " c = a + b\n", + " ft = c + yt\n", + "```\n", + "\n", + "By construction, the tangent calculation is always linear in the input tangents. \n", + "When the tangent calculation uses non-linear operations, such as multiplication,\n", + "one or more of the operands is constant such that the computation is still linear in the non-constant arguments.\n", + "\n", + "JAX will produce the reverse differentiation computation by processing the\n", + "JVP computation backwards. For each operation in the tangent computation,\n", + "it accumulates the cotangents\n", + "of the variables used by the operation, using the cotangent of the result\n", + "of the operation:\n", + "```\n", + " # Initialize cotangents of inputs and intermediate vars\n", + " xct = yct = act = bct = cct = 0\n", + " # Initialize cotangent of the output\n", + " fct = 1.\n", + " # Process \"ft = c + yt\"\n", + " cct += fct\n", + " yct += fct\n", + " # Process \"c = a + b\"\n", + " act += cct\n", + " bct += cct\n", + " # Process \"b = 2. * yt\"\n", + " yct += 2. * bct\n", + " # Process \"a = xt * 4.\"\n", + " xct += act * 4.\n", + "```\n", + "\n", + "One can verify that this computation produces `xct = 4.` and `yct = 3.`, which \n", + "are the partial derivatives of the function f. \n", + "\n", + "JAX knows for each primitive that may appear in a JVP calculation how to transpose it. Conceptually, if the primitive `p(x, y, z)` is linear in the arguments `y` and `z` for a constant value of `x`, e.g., `p(x, y, z) = y*cy + z*cz`, then the transposition of the primitive is:\n", + "```\n", + "p_transpose(out_ct, x, _, _) = (None, out_ct*cy, out_ct*cz)\n", + "```\n", + "\n", + "Notice that `p_transpose` takes the cotangent of the output of the primitive and a value corresponding to each argument of the primitive. For the linear arguments, the transposition gets an undefined `_` value, and for the constant\n", + "arguments it gets the actual constants. The transposition returns a cotangent value for each argument of the primitive, with the value `None` returned \n", + "for the constant arguments.\n", + "\n", + "In particular, \n", + "```\n", + " add_transpose(out_ct, _, _) = (out_ct, out_ct)\n", + " mult_transpose(out_ct, x, _) = (None, x * out_ct)\n", + " mult_transpose(out_ct, _, y) = (out_ct * y, None)\n", + "```\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JaHxFdkRO42r", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@trace(\"ma_transpose\")\n", + "def ma_transpose(ct, x, y, z):\n", + " \"\"\"Evaluates the transpose of a linear primitive.\n", + "\n", + " This method is only used when computing the backward gradient following \n", + " value_and_jvp, and is only needed for primitives that are used in the JVP \n", + " calculation for some other primitive. We need transposition for ma_prim, \n", + " because we have used ma_prim in the computation of the output_tangent in \n", + " ma_value_and_jvp.\n", + "\n", + " In our case, ma is not a linear primitive. However, it is used linearly \n", + " w.r.t. tangents in ma_value_and_jvp:\n", + " output_tangent(xt, yt, zt) = ma_prim(xt, y, ma_prim(x, yt, zt)\n", + " \n", + " Always one of the first two multiplicative arguments are constants.\n", + "\n", + " Args:\n", + " ct: the cotangent of the output of the primitive.\n", + " x, y, z: values of the arguments. The arguments that are used linearly\n", + " get the value ad_undefined_primal. The other arguments get a constant\n", + " value.\n", + " Returns:\n", + " a tuple with the cotangent of the inputs, with the value None\n", + " corresponding to the constant arguments.\n", + " \"\"\"\n", + " if x is not ad.undefined_primal:\n", + " # This use of ma is with a constant \"x\"\n", + " assert y is ad.undefined_primal\n", + " ct_y = ad.zero if ct is ad.zero else ma_prim(x, ct, lax.zeros_like_array(x))\n", + " res = None, ct_y, ct\n", + " else:\n", + " # This use of ma is with a constant \"y\"\n", + " assert x is ad.undefined_primal\n", + " ct_x = ad.zero if ct is ad.zero else ma_prim(ct, y, lax.zeros_like_array(y))\n", + " res = ct_x, None, ct\n", + " return res\n", + "\n", + "\n", + "ad.primitive_transposes[ma_p] = ma_transpose" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PpChox-Jp7wb", + "colab_type": "text" + }, + "source": [ + "Now we can complete the run of the `grad`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "PogPKS4MPevd", + "colab_type": "code", + "outputId": "1b9d124e-03e9-4dcf-c3d8-290117c2c5e6", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 581 + } + }, + "source": [ + "assert api.grad(sq_add_prim)(2., 10.) == 4." + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, 10.0)\n", + " call ma_prim(Traced, Traced, 10.0)\n", + " call ma_value_and_jvp((Traced, Traced, 10.0), (Traced, Traced, Zero))\n", + " Primal evaluation:\n", + " call ma_prim(Traced, Traced, 10.0)\n", + " call ma_impl(2.0, 2.0, 10.0)\n", + " |<- ma_impl = 14.0\n", + " |<- ma_prim = 14.0\n", + " Tangent evaluation:\n", + " call ma_prim(Traced, Traced, 0.0)\n", + " call ma_abstract_eval(ConcreteArray(2.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ConcreteArray(2.0), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " |<- ma_value_and_jvp = (14.0, Traced)\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "call ma_transpose(1.0, _, 2.0, _)\n", + " call ma_prim(1.0, 2.0, 0.0)\n", + " call ma_impl(1.0, 2.0, 0.0)\n", + " |<- ma_impl = 2.0\n", + " |<- ma_prim = 2.0\n", + "|<- ma_transpose = (2.0, None, 1.0)\n", + "call ma_transpose(1.0, 2.0, _, 0.0)\n", + " call ma_prim(2.0, 1.0, 0.0)\n", + " call ma_impl(2.0, 1.0, 0.0)\n", + " |<- ma_impl = 2.0\n", + " |<- ma_prim = 2.0\n", + "|<- ma_transpose = (None, 2.0, 1.0)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8M1xLCXW4fK7", + "colab_type": "text" + }, + "source": [ + "Notice the two calls to `ma_transpose`. They correspond to the two\n", + "uses of `ma_prim` in the computation of the `output_tangent` in `ma_value_and_jvp`. The first call to transpose corresponds to the \n", + "last use of `ma_prim`: `ma_prim(xt, y, ...)` where `y` is the constant 2.0." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EIJs6FYmPg6c", + "colab_type": "text" + }, + "source": [ + "### JIT of reverse differentiation \n", + "\n", + "Notice that the abstract evaluation of the `ma_value_and_jvp` is using only\n", + "abstract values, while in the absensce of JIT we used `ConcreteArray`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FZ-JGbWZPq2-", + "colab_type": "code", + "outputId": "17bf806a-ed25-4a41-f63d-5f7f276b1274", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 649 + } + }, + "source": [ + "assert api.jit(api.grad(sq_add_prim))(2., 10.) == 4." + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_value_and_jvp((Traced, Traced, Traced), (Traced, Traced, Zero))\n", + " Primal evaluation:\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " Tangent evaluation:\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + " |<- ma_value_and_jvp = (Traced, Traced)\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "call ma_transpose(1.0, _, Traced, _)\n", + " call ma_prim(1.0, Traced, Traced)\n", + " call ma_abstract_eval(ConcreteArray(1.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + "|<- ma_transpose = (Traced, None, 1.0)\n", + "call ma_transpose(1.0, Traced, _, Traced)\n", + " call ma_prim(Traced, 1.0, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[]), ConcreteArray(1.0), ConcreteArray(0.0))\n", + " |<- ma_abstract_eval = ShapedArray(float32[])\n", + " |<- ma_prim = Traced\n", + "|<- ma_transpose = (None, Traced, 1.0)\n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-3lqPkdQPvl5", + "colab_type": "text" + }, + "source": [ + "## Batching\n", + "\n", + "The batching transformation takes a point-wise computation and turns it\n", + "into a computation on vectors. If we try it right now, we get a `NotImplementedError`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hFvBR3I9Pzh3", + "colab_type": "code", + "outputId": "26b68bdc-d709-4bc1-937a-b49ca18b585b", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 340 + } + }, + "source": [ + "# The arguments are two vectors instead of two scalars\n", + "with expectNotImplementedError():\n", + " api.vmap(sq_add_prim, in_axes=0, out_axes=0)(onp.array([2., 3.]),\n", + " onp.array([10., 20.]))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + "\n", + "Found expected exception:\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/batching.py\", line 162, in get_primitive_batcher\n", + " return primitive_batchers[p]\n", + "KeyError: ma\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"\", line 3, in \n", + " onp.array([10., 20.]))\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 609, in batched_fun\n", + " lambda: _flatten_axes(out_tree(), out_axes))\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/batching.py\", line 41, in batch\n", + " out_vals, out_dims = batch_fun(fun, in_vals, in_dims)\n", + "NotImplementedError: Batching rule for 'ma' not implemented\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gILasMiP6elR", + "colab_type": "text" + }, + "source": [ + "We need to tell JAX how to evaluate the batched version of the primitive. In this particular case, the `ma_prim` already operates pointwise for any dimension of input vectors. So the" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KQfeqRIrP7zg", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import batching\n", + "\n", + "\n", + "@trace(\"ma_batch\")\n", + "def ma_batch(vector_arg_values, batch_axes):\n", + " \"\"\"Computes the batched version of the primitive.\n", + " \n", + " This must be a JAX-traceable function.\n", + " \n", + " Since the ma primitive already operates on tensors, to batch it we use\n", + " the primitive itself. This works as long as the input are batched along\n", + " the same axes. The result is batched along the axis that the inputs\n", + " are batched.\n", + " \n", + " Args:\n", + " vector_arg_values: a tuple of two arguments, each being a tensor of matching\n", + " shape.\n", + " batch_axes: the axes that are being batched. See vmap documentation.\n", + " Returns:\n", + " a tuple of the result, and the result axis that was batched. \n", + " \"\"\"\n", + " assert batch_axes[0] == batch_axes[1]\n", + " assert batch_axes[0] == batch_axes[2]\n", + " _trace(\"Using ma to compute the batch:\")\n", + " res = ma_prim(*vector_arg_values)\n", + " return res, batch_axes[0]\n", + "\n", + "\n", + "batching.primitive_batchers[ma_p] = ma_batch" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "VwxNk869P_YG", + "colab_type": "code", + "outputId": "e76e1275-1cb2-4d60-d853-5ce8762b6541", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + } + }, + "source": [ + "assert onp.allclose(api.vmap(sq_add_prim, in_axes=0, out_axes=0)(\n", + " onp.array([2., 3.]),\n", + " onp.array([10., 20.])),\n", + " [14., 29.])" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_batch(([2. 3.], [2. 3.], [10. 20.]), (0, 0, 0))\n", + " Using ma to compute the batch:\n", + " call ma_prim([2. 3.], [2. 3.], [10. 20.])\n", + " call ma_impl([2. 3.], [2. 3.], [10. 20.])\n", + " |<- ma_impl = [14. 29.]\n", + " |<- ma_prim = [14. 29.]\n", + " |<- ma_batch = ([14. 29.], 0)\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NmqLlV1TQDCC", + "colab_type": "text" + }, + "source": [ + "### JIT of batching" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xqEdXVUgQCTt", + "colab_type": "code", + "outputId": "3720cac5-31de-49f7-c765-829c3b1919fb", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 238 + } + }, + "source": [ + "assert onp.allclose(api.jit(api.vmap(sq_add_prim, in_axes=0, out_axes=0))\n", + " (onp.array([2., 3.]),\n", + " onp.array([10., 20.])),\n", + " [14., 29.])" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "call sq_add_prim(Traced, Traced)\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_batch((Traced, Traced, Traced), (0, 0, 0))\n", + " Using ma to compute the batch:\n", + " call ma_prim(Traced, Traced, Traced)\n", + " call ma_abstract_eval(ShapedArray(float32[2]), ShapedArray(float32[2]), ShapedArray(float32[2]))\n", + " |<- ma_abstract_eval = ShapedArray(float32[2])\n", + " |<- ma_prim = Traced\n", + " |<- ma_batch = (Traced, 0)\n", + " |<- ma_prim = Traced\n", + "|<- sq_add_prim = Traced\n", + "call ma_xla_translation(, , , )\n", + "|<- ma_xla_translation = \n" + ], + "name": "stdout" + } + ] + } + ] +} \ No newline at end of file From ad3f25b02faf653d14b806a3d16b0c4b7106d96a Mon Sep 17 00:00:00 2001 From: Alex Eftimiades Date: Wed, 2 Oct 2019 09:25:55 -0400 Subject: [PATCH 0131/1053] small cleanup and retrigger tests --- jax/random.py | 2 -- tests/random_test.py | 14 +++++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/jax/random.py b/jax/random.py index 773504fa1cba..cc0f86979f63 100644 --- a/jax/random.py +++ b/jax/random.py @@ -449,8 +449,6 @@ def _multivariate_normal(key, mean, cov, shape, dtype): else: if hasattr(mean, "shape") and mean.ndim > 0: shape = shape + mean.shape[:1] - else: - shape = shape normal_samples = normal(key, shape, dtype) samples = np.sqrt(cov) * normal_samples return samples + mean diff --git a/tests/random_test.py b/tests/random_test.py index 4d7b992d4de2..a31e386d2589 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -368,12 +368,12 @@ def testT(self, df, dtype): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_mean={}_cov={}_{}".format(mean, cov, dtype), - "mean": mean, "cov": cov, "dtype": dtype} + "mean": mean, "cov": cov, "dtype": dtype} for mean in [0, 5, np.asarray([1, 2, 3])] for cov in [.1, 5, np.asarray([4, 5, 6]), - np.asarray([[4.60, 2.86, 2.33], - [2.86, 3.04, 1.74], - [2.33, 1.74, 1.83]])] + np.asarray([[4.60, 2.86, 2.33], + [2.86, 3.04, 1.74], + [2.33, 1.74, 1.83]])] for dtype in [onp.float32, onp.float64])) def testMultivariateNormal(self, mean, cov, dtype): key = random.PRNGKey(0) @@ -388,9 +388,9 @@ def testMultivariateNormal(self, mean, cov, dtype): else: rescale = lambda x: x / np.sqrt(cov) for samples in [uncompiled_samples, compiled_samples]: - self._CheckKolmogorovSmirnovCDF( - rescale(samples - mean).reshape(-1), - scipy.stats.norm().cdf) + self._CheckKolmogorovSmirnovCDF( + rescale(samples - mean).reshape(-1), + scipy.stats.norm().cdf) def testIssue222(self): x = random.randint(random.PRNGKey(10003), (), 0, 0) From 6744389d90a34fd5028063bb63f186fd962afab6 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 2 Oct 2019 15:48:33 +0200 Subject: [PATCH 0132/1053] Fixed links to Colabs in docs/notebooks This is related to recent change https://github.com/google/jax/pull/1121. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 532a35ad87bd..997823b43b8c 100644 --- a/README.md +++ b/README.md @@ -84,13 +84,13 @@ open](https://github.com/google/jax) by a growing number of ## Quickstart: Colab in the Cloud Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: -- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://colab.research.google.com/github/google/jax/blob/master/notebooks/quickstart.ipynb) +- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/quickstart.ipynb) - [Training a Simple Neural Network, with PyTorch Data Loading](https://colab.research.google.com/github/google/jax/blob/master/notebooks/neural_network_and_data_loading.ipynb) - [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/notebooks/neural_network_with_tfds_data.ipynb) And for a deeper dive into JAX: -- [Common gotchas and sharp edges](https://colab.research.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb) -- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/autodiff_cookbook.ipynb) +- [Common gotchas and sharp edges](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb) +- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/autodiff_cookbook.ipynb) - [Directly using XLA in Python](https://colab.research.google.com/github/google/jax/blob/master/notebooks/XLA_in_Python.ipynb) - [MAML Tutorial with JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/maml.ipynb) - [Generative Modeling by Estimating Gradeints of Data Distribution in JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb). From ea67fa8f0970b908b78b3f20e6f7fb83dcab413d Mon Sep 17 00:00:00 2001 From: Alex Eftimiades Date: Wed, 2 Oct 2019 11:08:17 -0400 Subject: [PATCH 0133/1053] fix failing tests with full covariance matrix --- jax/random.py | 2 +- tests/random_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/random.py b/jax/random.py index cc0f86979f63..7d9d70fb28d2 100644 --- a/jax/random.py +++ b/jax/random.py @@ -443,7 +443,7 @@ def _multivariate_normal(key, mean, cov, shape, dtype): shape = shape + cov.shape[:1] normal_samples = normal(key, shape, dtype) if cov.ndim == 2: - samples = np.tensordot(normal_samples, cholesky(cov), axes=1) + samples = np.tensordot(normal_samples, cholesky(cov), axes=(-1, 0)) else: samples = normal_samples * np.sqrt(cov) else: diff --git a/tests/random_test.py b/tests/random_test.py index a31e386d2589..a8d16b65b95e 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -384,7 +384,7 @@ def testMultivariateNormal(self, mean, cov, dtype): compiled_samples = crand(key, mean, cov) if hasattr(cov, "shape") and cov.ndim == 2: inv_scale = scipy.linalg.lapack.dtrtri(onp.linalg.cholesky(cov), lower=True)[0] - rescale = lambda x: x.dot(inv_scale) + rescale = lambda x: onp.tensordot(x, inv_scale, axes=(-1, 1)) else: rescale = lambda x: x / np.sqrt(cov) for samples in [uncompiled_samples, compiled_samples]: From c1057f77ae1a3f647fa177900d0cce560455e1df Mon Sep 17 00:00:00 2001 From: Alex Eftimiades Date: Wed, 2 Oct 2019 11:39:49 -0400 Subject: [PATCH 0134/1053] minor readability cleanup --- jax/random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index 7d9d70fb28d2..cc0f86979f63 100644 --- a/jax/random.py +++ b/jax/random.py @@ -443,7 +443,7 @@ def _multivariate_normal(key, mean, cov, shape, dtype): shape = shape + cov.shape[:1] normal_samples = normal(key, shape, dtype) if cov.ndim == 2: - samples = np.tensordot(normal_samples, cholesky(cov), axes=(-1, 0)) + samples = np.tensordot(normal_samples, cholesky(cov), axes=1) else: samples = normal_samples * np.sqrt(cov) else: From c18d765c89d6aaff47681098ed09a94e33f0eb4a Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Wed, 2 Oct 2019 19:18:49 +0100 Subject: [PATCH 0135/1053] Move epsilon term in optimizers.rmsprop into sqrt The TensorFlow rmsprop code puts epsilon into the sqrt. This makes a large difference on e.g. Deep RL settings, which tend to use very large values of epsilon. --- jax/experimental/optimizers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/experimental/optimizers.py b/jax/experimental/optimizers.py index a7bc03cd94d6..0d74dc39936c 100644 --- a/jax/experimental/optimizers.py +++ b/jax/experimental/optimizers.py @@ -282,7 +282,7 @@ def init(x0): def update(i, g, state): x, avg_sq_grad = state avg_sq_grad = avg_sq_grad * gamma + g**2 * (1. - gamma) - x = x - step_size(i) * g / (np.sqrt(avg_sq_grad) + eps) + x = x - step_size(i) * g / np.sqrt(avg_sq_grad + eps) return x, avg_sq_grad def get_params(state): x, _ = state From ee3fe5f557be7448fe5f35d2a9d27622408534d1 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 2 Oct 2019 14:15:11 -0700 Subject: [PATCH 0136/1053] fix debug_nans for multiple-result primitives --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index db29ee4731cb..7f530cd55c1d 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -176,7 +176,7 @@ def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): def check_nans(prim, bufs): if prim.multiple_results: - for buf in bufs: + for buf in bufs.destructure(): _check_nans(prim.name, buf.shape(), buf) else: _check_nans(prim.name, bufs.shape(), bufs) From 459bd9693388f9e86773c816efa4e0a259b5a4c9 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 2 Oct 2019 15:02:15 -0700 Subject: [PATCH 0137/1053] add basic tests --- tests/debug_nans_test.py | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/debug_nans_test.py diff --git a/tests/debug_nans_test.py b/tests/debug_nans_test.py new file mode 100644 index 000000000000..69b9ca0594c6 --- /dev/null +++ b/tests/debug_nans_test.py @@ -0,0 +1,52 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for --debug_nans.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +from absl.testing import parameterized + +import numpy as onp + +import jax +from jax import test_util as jtu +from jax.test_util import check_grads +from jax import numpy as np +from jax import random + +from jax.config import config +config.parse_flags_with_absl() + +class DebugNaNsTest(jtu.JaxTestCase): + def testSingleResultPrimitive(self): + cfg = config.read("jax_debug_nans") + config.update("jax_debug_nans", True) + A = np.array([[1., 2.], [2., 3.]]) + B = np.tanh(A) + config.update("jax_debug_nans", cfg) + def testMultipleResultPrimitive(self): + cfg = config.read("jax_debug_nans") + config.update("jax_debug_nans", True) + A = np.array([[1., 2.], [2., 3.]]) + D, V = np.linalg.eig(A) + config.update("jax_debug_nans", cfg) + def testJitComputation(self): + cfg = config.read("jax_debug_nans") + config.update("jax_debug_nans", True) + A = np.array([[1., 2.], [2., 3.]]) + B = jax.jit(np.tanh)(A) + config.update("jax_debug_nans", cfg) From be4e156aee0f9423ae27535b449f08da3ac6c6c9 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 2 Oct 2019 15:51:15 -0700 Subject: [PATCH 0138/1053] use setUp and tearDown --- tests/debug_nans_test.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/debug_nans_test.py b/tests/debug_nans_test.py index 69b9ca0594c6..60f452e4f56d 100644 --- a/tests/debug_nans_test.py +++ b/tests/debug_nans_test.py @@ -32,21 +32,18 @@ config.parse_flags_with_absl() class DebugNaNsTest(jtu.JaxTestCase): - def testSingleResultPrimitive(self): - cfg = config.read("jax_debug_nans") + def setUp(self): + self.cfg = config.read("jax_debug_nans") config.update("jax_debug_nans", True) + def tearDown(self): + config.update("jax_debug_nans", self.cfg) + + def testSingleResultPrimitive(self): A = np.array([[1., 2.], [2., 3.]]) B = np.tanh(A) - config.update("jax_debug_nans", cfg) def testMultipleResultPrimitive(self): - cfg = config.read("jax_debug_nans") - config.update("jax_debug_nans", True) A = np.array([[1., 2.], [2., 3.]]) D, V = np.linalg.eig(A) - config.update("jax_debug_nans", cfg) def testJitComputation(self): - cfg = config.read("jax_debug_nans") - config.update("jax_debug_nans", True) A = np.array([[1., 2.], [2., 3.]]) B = jax.jit(np.tanh)(A) - config.update("jax_debug_nans", cfg) From efc3a2c31a00a2139f55ca5ce9f3cf4dac1dea1f Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 2 Oct 2019 15:55:09 -0700 Subject: [PATCH 0139/1053] address comments --- tests/debug_nans_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/debug_nans_test.py b/tests/debug_nans_test.py index 60f452e4f56d..aa0a4508286c 100644 --- a/tests/debug_nans_test.py +++ b/tests/debug_nans_test.py @@ -32,18 +32,22 @@ config.parse_flags_with_absl() class DebugNaNsTest(jtu.JaxTestCase): + def setUp(self): self.cfg = config.read("jax_debug_nans") config.update("jax_debug_nans", True) + def tearDown(self): config.update("jax_debug_nans", self.cfg) def testSingleResultPrimitive(self): A = np.array([[1., 2.], [2., 3.]]) B = np.tanh(A) + def testMultipleResultPrimitive(self): A = np.array([[1., 2.], [2., 3.]]) D, V = np.linalg.eig(A) + def testJitComputation(self): A = np.array([[1., 2.], [2., 3.]]) B = jax.jit(np.tanh)(A) From d174fd660c1ba8bbec5af90a0d6515c74f2143b2 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 2 Oct 2019 16:08:05 -0700 Subject: [PATCH 0140/1053] fix config.update when absl is enabled --- jax/config.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/jax/config.py b/jax/config.py index debe5f0ff8db..706d6f4a8053 100644 --- a/jax/config.py +++ b/jax/config.py @@ -23,10 +23,13 @@ def __init__(self): self.use_absl = False def update(self, name, val): - self.check_exists(name) - if name not in self.values: - raise Exception("Unrecognized config option: {}".format(name)) - self.values[name] = val + if self.use_absl: + setattr(self.absl_flags.FLAGS, name, val) + else: + self.check_exists(name) + if name not in self.values: + raise Exception("Unrecognized config option: {}".format(name)) + self.values[name] = val def read(self, name): if self.use_absl: From dd1e132eaaf93318b42a2b4e8f57a8761ca82629 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 2 Oct 2019 16:10:27 -0700 Subject: [PATCH 0141/1053] test that debug_nans actually finds NaNs --- tests/debug_nans_test.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/debug_nans_test.py b/tests/debug_nans_test.py index aa0a4508286c..95d5dd004a10 100644 --- a/tests/debug_nans_test.py +++ b/tests/debug_nans_test.py @@ -40,14 +40,19 @@ def setUp(self): def tearDown(self): config.update("jax_debug_nans", self.cfg) - def testSingleResultPrimitive(self): + def testSingleResultPrimitiveNoNaN(self): A = np.array([[1., 2.], [2., 3.]]) B = np.tanh(A) - def testMultipleResultPrimitive(self): + def testMultipleResultPrimitiveNoNaN(self): A = np.array([[1., 2.], [2., 3.]]) D, V = np.linalg.eig(A) - def testJitComputation(self): + def testJitComputationNoNaN(self): A = np.array([[1., 2.], [2., 3.]]) B = jax.jit(np.tanh)(A) + + def testSingleResultPrimitiveNaN(self): + A = np.array(0.) + with self.assertRaises(FloatingPointError): + B = 0. / A From 51038457568380ef55d6d86cd54b55b853b8cf93 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 2 Oct 2019 16:35:42 -0700 Subject: [PATCH 0142/1053] unbreak debug_nans on jit --- jax/interpreters/xla.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 7f530cd55c1d..5f5bde37bd15 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -171,12 +171,13 @@ def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): device_num, = compiled.DeviceOrdinals() input_bufs = [device_put(x, device_num, backend=backend) for x in args] out_buf = compiled.Execute(input_bufs) - if FLAGS.jax_debug_nans: check_nans(prim, out_buf) + if FLAGS.jax_debug_nans: + check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) return result_handler(out_buf) def check_nans(prim, bufs): if prim.multiple_results: - for buf in bufs.destructure(): + for buf in bufs: _check_nans(prim.name, buf.shape(), buf) else: _check_nans(prim.name, bufs.shape(), bufs) From 75c2236063f506db1e4b77aa2c3ca599ddd3dc5a Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 3 Oct 2019 11:20:04 +0200 Subject: [PATCH 0143/1053] Addressed comments for the Colab. * Cleaned up use of section levels * Renamed ma to multiply_add and sq_add to square_add * Other minor clarifications * Separated the Colabs into Tutorials and Advanced Tutorials --- .gitignore | 3 + docs/index.rst | 5 + docs/notebooks/How_JAX_primitives_work.ipynb | 793 ++++++++++--------- 3 files changed, 411 insertions(+), 390 deletions(-) diff --git a/.gitignore b/.gitignore index 663be2d9a328..983e7049ab0d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ build/ dist/ .mypy_cache/ docs/notebooks/.ipynb_checkpoints/ +docs/_autosummary +.idea + diff --git a/docs/index.rst b/docs/index.rst index 081d3e6349c2..90579012fcf8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,6 +13,11 @@ For an introduction to JAX, start at the notebooks/quickstart notebooks/autodiff_cookbook + +.. toctree:: + :maxdepth: 1 + :caption: Advanced Tutorials + notebooks/Common_Gotchas_in_JAX notebooks/How_JAX_primitives_work diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 968415025823..775cfac01681 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -5,7 +5,8 @@ "colab": { "name": "How JAX primitives work.ipynb", "provenance": [], - "collapsed_sections": [] + "collapsed_sections": [], + "toc_visible": true }, "kernelspec": { "name": "python3", @@ -52,7 +53,7 @@ "**The goal of this document is to explain the interface that a JAX primitive must support in order to allow JAX to perform all its transformations.**\n", "\n", "Consider that we want to add to JAX support for a multiply-add function with three arguments, defined mathematically\n", - "as \"ma(x, y, z) = x * y + z\". \n", + "as \"multiply_add(x, y, z) = x * y + z\". \n", "This function operates on 3 identically-shaped tensors of floating point \n", "values and performs the opertions pointwise.\n", "\n", @@ -66,7 +67,7 @@ "colab_type": "text" }, "source": [ - "## Defining new functionality using existing primitives\n", + "## Using existing primitives\n", "\n", "The easiest way to define new functions is to write them in terms of JAX primitives, or in terms of other\n", "functions that are themselves written using JAX primitives, e.g., those \n", @@ -78,38 +79,46 @@ "metadata": { "id": "tbOF0LB0EMne", "colab_type": "code", - "outputId": "f27e2b0e-c33d-40d1-dab8-32502a607056", + "outputId": "3fb1c8a7-7a4c-4a3a-f7ff-37b7dc740528", "colab": { "base_uri": "https://localhost:8080/", - "height": 51 + "height": 105 } }, "source": [ "from jax import lax\n", "from jax import api\n", "\n", - "def ma_lax(x, y, z):\n", + "def multiply_add_lax(x, y, z):\n", " \"\"\"Implementation of multiply-add using the jax.lax primitives.\"\"\"\n", " return lax.add(lax.mul(x, y), z)\n", "\n", "\n", - "def sq_add_lax(a, b):\n", + "def square_add_lax(a, b):\n", " \"\"\"A square-add function using the newly defined multiply-add.\"\"\"\n", - " return ma_lax(a, a, b)\n", + " return multiply_add_lax(a, a, b)\n", "\n", - "print(\"sq_add_lax = \", sq_add_lax(2., 10.))\n", + "print(\"square_add_lax = \", square_add_lax(2., 10.))\n", "# Differentiate w.r.t. the first argument\n", - "print(\"grad(sq_add_lax) = \", api.grad(sq_add_lax, argnums=0)(2.0, 10.))" + "print(\"grad(square_add_lax) = \", api.grad(square_add_lax, argnums=0)(2.0, 10.))" ], - "execution_count": 0, + "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ - "sq_add_lax = 14.0\n", - "grad(sq_add_lax) = 4.0\n" + "square_add_lax = 14.0\n", + "grad(square_add_lax) = 4.0\n" ], "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/jax/lib/xla_bridge.py:115: UserWarning: No GPU/TPU found, falling back to CPU.\n", + " warnings.warn('No GPU/TPU found, falling back to CPU.')\n" + ], + "name": "stderr" } ] }, @@ -222,7 +231,7 @@ "metadata": { "id": "QhKorz6cFRJb", "colab_type": "code", - "outputId": "81b1c4b7-7401-4045-9b10-444ff187bc2a", + "outputId": "aba3cef3-6bcc-4eb3-c7b3-34e405f2f82a", "colab": { "base_uri": "https://localhost:8080/", "height": 255 @@ -232,38 +241,38 @@ "import jax.numpy as jnp\n", "import numpy as onp\n", "\n", - "@trace(\"ma_numpy\")\n", - "def ma_numpy(x, y, z):\n", + "@trace(\"multiply_add_numpy\")\n", + "def multiply_add_numpy(x, y, z):\n", " return jnp.add(jnp.multiply(x, y), z)\n", "\n", - "@trace(\"sq_add_numpy\")\n", - "def sq_add_numpy(a, b):\n", - " return ma_numpy(a, a, b)\n", + "@trace(\"square_add_numpy\")\n", + "def square_add_numpy(a, b):\n", + " return multiply_add_numpy(a, a, b)\n", "\n", "print(\"\\nNormal evaluation:\") \n", - "print(\"sq_add_numpy = \", sq_add_numpy(2., 10.))\n", + "print(\"square_add_numpy = \", square_add_numpy(2., 10.))\n", "print(\"\\nGradient evaluation:\")\n", - "print(\"grad(sq_add_numpy) = \", api.grad(sq_add_numpy)(2.0, 10.))" + "print(\"grad(square_add_numpy) = \", api.grad(square_add_numpy)(2.0, 10.))" ], - "execution_count": 0, + "execution_count": 3, "outputs": [ { "output_type": "stream", "text": [ "\n", "Normal evaluation:\n", - "call sq_add_numpy(2.0, 10.0)\n", - " call ma_numpy(2.0, 2.0, 10.0)\n", - " |<- ma_numpy = 14.0\n", - "|<- sq_add_numpy = 14.0\n", - "sq_add_numpy = 14.0\n", + "call square_add_numpy(2.0, 10.0)\n", + " call multiply_add_numpy(2.0, 2.0, 10.0)\n", + " |<- multiply_add_numpy = 14.0\n", + "|<- square_add_numpy = 14.0\n", + "square_add_numpy = 14.0\n", "\n", "Gradient evaluation:\n", - "call sq_add_numpy(Traced, 10.0)\n", - " call ma_numpy(Traced, Traced, 10.0)\n", - " |<- ma_numpy = Traced\n", - "|<- sq_add_numpy = Traced\n", - "grad(sq_add_numpy) = 4.0\n" + "call square_add_numpy(Traced, 10.0)\n", + " call multiply_add_numpy(Traced, Traced, 10.0)\n", + " |<- multiply_add_numpy = Traced\n", + "|<- square_add_numpy = Traced\n", + "grad(square_add_numpy) = 4.0\n" ], "name": "stdout" } @@ -276,8 +285,8 @@ "colab_type": "text" }, "source": [ - "Notice that in the process of computing `grad`, JAX invokes `sq_add_numpy` and\n", - "`ma_numpy` with special arguments `ConcreteArray(...)` (described further \n", + "Notice that in the process of computing `grad`, JAX invokes `square_add_numpy` and\n", + "`multiply_add_numpy` with special arguments `ConcreteArray(...)` (described further \n", "below in this colab). \n", "It is important to remember that a JAX-traceable function must be able to \n", "operate not only on concrete arguments but also on special abstract arguments\n", @@ -294,7 +303,7 @@ "colab_type": "text" }, "source": [ - "# Defining new JAX primitives\n", + "## Defining new JAX primitives\n", "\n", "The right way to add support for multiple-add is in terms of existing\n", "JAX primitives, as shown above. However, in order to demonstrate how JAX\n", @@ -311,17 +320,21 @@ }, "source": [ "from jax import core\n", - "ma_p = core.Primitive(\"ma\") # Create the primitive\n", + "multiply_add_p = core.Primitive(\"multiply_add\") # Create the primitive\n", "\n", - "@trace(\"ma_prim\")\n", - "def ma_prim(x, y, z):\n", - " \"\"\"The JAX-traceable way to use the JAX primitive.\"\"\"\n", - " return ma_p.bind(x, y, z)\n", + "@trace(\"multiply_add_prim\")\n", + "def multiply_add_prim(x, y, z):\n", + " \"\"\"The JAX-traceable way to use the JAX primitive.\n", + " \n", + " Note that the traced arguments must be passed as positional arguments\n", + " to `bind`. \n", + " \"\"\"\n", + " return multiply_add_p.bind(x, y, z)\n", "\n", - "@trace(\"sq_add_prim\")\n", - "def sq_add_prim(a, b):\n", + "@trace(\"square_add_prim\")\n", + "def square_add_prim(a, b):\n", " \"\"\"A square-add function implemented using the new JAX-primitive.\"\"\"\n", - " return ma_prim(a, a, b)" + " return multiply_add_prim(a, a, b)" ], "execution_count": 0, "outputs": [] @@ -342,7 +355,7 @@ "metadata": { "id": "_X3PAYxhGpWd", "colab_type": "code", - "outputId": "235a6e34-e5ff-4883-916c-7994aff8ba03", + "outputId": "90ea2c6a-9ef3-40ea-e9a3-3ab1cfc59fc8", "colab": { "base_uri": "https://localhost:8080/", "height": 221 @@ -350,15 +363,15 @@ }, "source": [ "with expectNotImplementedError():\n", - " sq_add_prim(2., 10.)\n" + " square_add_prim(2., 10.)\n" ], - "execution_count": 0, + "execution_count": 5, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(2.0, 10.0)\n", - " call ma_prim(2.0, 2.0, 10.0)\n", + "call square_add_prim(2.0, 10.0)\n", + " call multiply_add_prim(2.0, 2.0, 10.0)\n", "\n", "Found expected exception:\n" ], @@ -368,13 +381,13 @@ "output_type": "stream", "text": [ "Traceback (most recent call last):\n", - " File \"\", line 2, in \n", - " sq_add_prim(2., 10.)\n", - " File \"\", line 47, in func_wrapper\n", + " File \"\", line 2, in \n", + " square_add_prim(2., 10.)\n", + " File \"\", line 47, in func_wrapper\n", " res = func(*args)\n", - " File \"\", line 12, in sq_add_prim\n", - " return ma_prim(a, a, b)\n", - "NotImplementedError: Evaluation rule for 'ma' not implemented\n" + " File \"\", line 16, in square_add_prim\n", + " return multiply_add_prim(a, a, b)\n", + "NotImplementedError: Evaluation rule for 'multiply_add' not implemented\n" ], "name": "stderr" } @@ -387,7 +400,7 @@ "colab_type": "text" }, "source": [ - "## Primal evaluation rules\n", + "### Primal evaluation rules\n", "\n", "\n" ] @@ -397,15 +410,15 @@ "metadata": { "id": "FT34FFAGHARU", "colab_type": "code", - "outputId": "4ef9f076-09f6-474a-c4e9-db3794969c24", + "outputId": "4c54f1c2-8a50-4788-90e1-06aee412c43b", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ - "@trace(\"ma_impl\")\n", - "def ma_impl(x, y, z):\n", + "@trace(\"multiply_add_impl\")\n", + "def multiply_add_impl(x, y, z):\n", " \"\"\"Concrete implementation of the primitive.\n", "\n", " This function does not need to be JAX traceable.\n", @@ -419,21 +432,21 @@ " return onp.add(onp.multiply(x, y), z)\n", "\n", "# Now we register the primal implementation with JAX\n", - "ma_p.def_impl(ma_impl)" + "multiply_add_p.def_impl(multiply_add_impl)" ], - "execution_count": 0, + "execution_count": 6, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": { "tags": [] }, - "execution_count": 104 + "execution_count": 6 } ] }, @@ -442,26 +455,26 @@ "metadata": { "id": "G5bstKaeNAVV", "colab_type": "code", - "outputId": "f822d0f5-fee2-4983-8d2f-edd518fad1be", + "outputId": "deb94d5b-dfea-4e6f-9ec2-70b416c996c5", "colab": { "base_uri": "https://localhost:8080/", "height": 119 } }, "source": [ - "assert sq_add_prim(2., 10.) == 14." + "assert square_add_prim(2., 10.) == 14." ], - "execution_count": 0, + "execution_count": 7, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(2.0, 10.0)\n", - " call ma_prim(2.0, 2.0, 10.0)\n", - " call ma_impl(2.0, 2.0, 10.0)\n", - " |<- ma_impl = 14.0\n", - " |<- ma_prim = 14.0\n", - "|<- sq_add_prim = 14.0\n" + "call square_add_prim(2.0, 10.0)\n", + " call multiply_add_prim(2.0, 2.0, 10.0)\n", + " call multiply_add_impl(2.0, 2.0, 10.0)\n", + " |<- multiply_add_impl = 14.0\n", + " |<- multiply_add_prim = 14.0\n", + "|<- square_add_prim = 14.0\n" ], "name": "stdout" } @@ -474,7 +487,7 @@ "colab_type": "text" }, "source": [ - "## JIT\n", + "### JIT\n", "\n", "If we now try to use `jit` we get a `NotImplementedError`:" ] @@ -484,23 +497,23 @@ "metadata": { "id": "QG-LULjiHk4b", "colab_type": "code", - "outputId": "2cc39be2-b33e-4212-8529-bf8894289125", + "outputId": "d4ef4406-8dae-4c96-97ca-b662340474ee", "colab": { "base_uri": "https://localhost:8080/", - "height": 221 + "height": 241 } }, "source": [ "with expectNotImplementedError():\n", - " api.jit(sq_add_prim)(2., 10.)" + " api.jit(square_add_prim)(2., 10.)" ], - "execution_count": 0, + "execution_count": 8, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", "\n", "Found expected exception:\n" ], @@ -510,13 +523,13 @@ "output_type": "stream", "text": [ "Traceback (most recent call last):\n", - " File \"\", line 2, in \n", - " api.jit(sq_add_prim)(2., 10.)\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 147, in f_jitted\n", + " File \"\", line 2, in \n", + " api.jit(square_add_prim)(2., 10.)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 149, in f_jitted\n", " out = xla.xla_call(flat_fun, *args_flat, device_assignment=device_assignment, backend=backend)\n", " File \"/usr/local/lib/python3.6/dist-packages/jax/core.py\", line 569, in call_bind\n", " outs = primitive.impl(f, *args, **params)\n", - "NotImplementedError: Abstract evaluation for 'ma' not implemented\n" + "NotImplementedError: Abstract evaluation for 'multiply_add' not implemented\n" ], "name": "stderr" } @@ -529,7 +542,7 @@ "colab_type": "text" }, "source": [ - "### Abstract evaluation rules\n", + "#### Abstract evaluation rules\n", "In order to JIT the function, and for other transformations as well, \n", "JAX first evaluates it abstractly using only the \n", "shape and type of the arguments. This abstract evaluation serves multiple\n", @@ -548,7 +561,7 @@ "metadata": { "id": "ctQmEeckIbdo", "colab_type": "code", - "outputId": "b42e0840-1342-4fb7-effa-da031625d12d", + "outputId": "e751d0cc-460e-4ffd-df2e-fdabf9cffdc2", "colab": { "base_uri": "https://localhost:8080/", "height": 34 @@ -556,8 +569,8 @@ }, "source": [ "from jax import abstract_arrays\n", - "@trace(\"ma_abstract_eval\")\n", - "def ma_abstract_eval(xs, ys, zs):\n", + "@trace(\"multiply_add_abstract_eval\")\n", + "def multiply_add_abstract_eval(xs, ys, zs):\n", " \"\"\"Abstract evaluation of the primitive.\n", "\n", " This function does not need to be JAX traceable. It will be invoked with\n", @@ -572,21 +585,21 @@ " return abstract_arrays.ShapedArray(xs.shape, xs.dtype)\n", "\n", "# Now we register the abstract evaluation with JAX\n", - "ma_p.def_abstract_eval(ma_abstract_eval)" + "multiply_add_p.def_abstract_eval(multiply_add_abstract_eval)" ], - "execution_count": 0, + "execution_count": 9, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": { "tags": [] }, - "execution_count": 107 + "execution_count": 9 } ] }, @@ -606,27 +619,27 @@ "metadata": { "id": "eOcNR92SI2h-", "colab_type": "code", - "outputId": "f900a2d1-f0db-4118-96f8-d15ac536d54a", + "outputId": "356ef229-3703-4696-cc3d-7c05de405fb0", "colab": { "base_uri": "https://localhost:8080/", - "height": 289 + "height": 309 } }, "source": [ "with expectNotImplementedError():\n", - " api.jit(sq_add_prim)(2., 10.)" + " api.jit(square_add_prim)(2., 10.)" ], - "execution_count": 0, + "execution_count": 10, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", "\n", "Found expected exception:\n" ], @@ -636,13 +649,13 @@ "output_type": "stream", "text": [ "Traceback (most recent call last):\n", - " File \"\", line 2, in \n", - " api.jit(sq_add_prim)(2., 10.)\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 147, in f_jitted\n", + " File \"\", line 2, in \n", + " api.jit(square_add_prim)(2., 10.)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 149, in f_jitted\n", " out = xla.xla_call(flat_fun, *args_flat, device_assignment=device_assignment, backend=backend)\n", " File \"/usr/local/lib/python3.6/dist-packages/jax/core.py\", line 569, in call_bind\n", " outs = primitive.impl(f, *args, **params)\n", - "NotImplementedError: XLA translation rule for primitive 'ma' not found\n" + "NotImplementedError: XLA translation rule for primitive 'multiply_add' not found\n" ], "name": "stderr" } @@ -655,13 +668,13 @@ "colab_type": "text" }, "source": [ - "### XLA Compilation rules\n", + "#### XLA Compilation rules\n", "\n", "JAX compilation works by compiling each primitive into a graph of XLA operations.\n", "\n", "This is biggest hurdle to adding new functionality to JAX, because the \n", "set of XLA operations is limited, and JAX already has pre-defined primitives\n", - "for each of them." + "for most of them. However, XLA includes a `CustomCall` operation that can be used to encapsulate arbitrary functionality defined using C++." ] }, { @@ -672,8 +685,8 @@ "colab": {} }, "source": [ - "@trace(\"ma_xla_translation\")\n", - "def ma_xla_translation(c, xc, yc, zc):\n", + "@trace(\"multiply_add_xla_translation\")\n", + "def multiply_add_xla_translation(c, xc, yc, zc):\n", " \"\"\"The compilation to XLA of the primitive.\n", "\n", " Given an XlaBuilder and XlaOps for each argument, return the XlaOp for the\n", @@ -686,7 +699,7 @@ "# Now we register the XLA compilation rule with JAX\n", "# TODO: for GPU? and TPU?\n", "from jax import xla\n", - "xla.backend_specific_translations['cpu'][ma_p] = ma_xla_translation" + "xla.backend_specific_translations['cpu'][multiply_add_p] = multiply_add_xla_translation" ], "execution_count": 0, "outputs": [] @@ -699,9 +712,9 @@ }, "source": [ "Now we succeed to JIT. Notice below that JAX first evaluates the function\n", - "abstractly, which triggers the `ma_abstract_eval` function, and \n", - "then compiles the set of primitives it has encountered, including `ma`.\n", - "At this point JAX invokes `ma_xla_translation`." + "abstractly, which triggers the `multiply_add_abstract_eval` function, and \n", + "then compiles the set of primitives it has encountered, including `multiply_add`.\n", + "At this point JAX invokes `multiply_add_xla_translation`." ] }, { @@ -709,28 +722,28 @@ "metadata": { "id": "rj3TLsolJgEc", "colab_type": "code", - "outputId": "e71a362e-0d2d-46e8-b166-bb729e3de6fc", + "outputId": "e384bee4-1e9c-4344-f49c-d3b5ec08eb32", "colab": { "base_uri": "https://localhost:8080/", - "height": 153 + "height": 173 } }, "source": [ - "assert api.jit(lambda x, y: sq_add_prim(x, y))(2., 10.) == 14." + "assert api.jit(lambda x, y: square_add_prim(x, y))(2., 10.) == 14." ], - "execution_count": 0, + "execution_count": 12, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n" + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n" ], "name": "stdout" } @@ -744,9 +757,9 @@ }, "source": [ "Below is another use of `jit` where we differentiate only\n", - "with respect to the first argument. Notice how the second argument to `sq_add_prim` is concrete, which leads\n", - "in the third argument to `ma_abstract_eval` being \n", - "`ConcreteArray`. We see that `ma_abstract_eval` may be used with\n", + "with respect to the first argument. Notice how the second argument to `square_add_prim` is concrete, which leads\n", + "in the third argument to `multiply_add_abstract_eval` being \n", + "`ConcreteArray`. We see that `multiply_add_abstract_eval` may be used with\n", "both `ShapedArray` and `ConcreteArray`." ] }, @@ -755,29 +768,29 @@ "metadata": { "id": "mPfTwIBoKOEK", "colab_type": "code", - "outputId": "1b33b982-bc51-4a94-ac83-891fa3726cdc", + "outputId": "b293b9b6-a2f9-48f5-f7eb-d4f99c3d905b", "colab": { "base_uri": "https://localhost:8080/", - "height": 153 + "height": 173 } }, "source": [ - "assert api.jit(lambda x, y: sq_add_prim(x, y), \n", + "assert api.jit(lambda x, y: square_add_prim(x, y), \n", " static_argnums=1)(2., 10.) == 14." ], - "execution_count": 0, + "execution_count": 13, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, 10.0)\n", - " call ma_prim(Traced, Traced, 10.0)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ConcreteArray(10.0))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n" + "call square_add_prim(Traced, 10.0)\n", + " call multiply_add_prim(Traced, Traced, 10.0)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ConcreteArray(10.0))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n" ], "name": "stdout" } @@ -790,14 +803,14 @@ "colab_type": "text" }, "source": [ - "## Forward differentiation\n", + "### Forward differentiation\n", "\n", "JAX implements forward differentiation in the form of\n", "a Jacobian-vector product (see the [JAX autodiff cookbook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/autodiff_cookbook.ipynb#scrollTo=OMmi9cyhs1bj)).\n", "\n", "If we attempt now to compute the `jvp` function we get an\n", "error because we have not yet told JAX how to differentiate\n", - "the `ma` primitive." + "the `multiply_add` primitive." ] }, { @@ -805,7 +818,7 @@ "metadata": { "id": "OxDx6NQnKwMI", "colab_type": "code", - "outputId": "c9d0bc5a-6b1b-4849-c68c-47511bdb8924", + "outputId": "ce659ef3-c03c-4856-f252-49ec4b6eb964", "colab": { "base_uri": "https://localhost:8080/", "height": 340 @@ -816,15 +829,15 @@ "# where we evaluate the Jacobian, and the third `(1., 1.)`\n", "# are the values of the tangents for the arguments.\n", "with expectNotImplementedError():\n", - " api.jvp(sq_add_prim, (2., 10.), (1., 1.))\n" + " api.jvp(square_add_prim, (2., 10.), (1., 1.))\n" ], - "execution_count": 0, + "execution_count": 14, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", "\n", "Found expected exception:\n" ], @@ -834,20 +847,20 @@ "output_type": "stream", "text": [ "Traceback (most recent call last):\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/ad.py\", line 215, in process_primitive\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/ad.py\", line 217, in process_primitive\n", " jvp = primitive_jvps[primitive]\n", - "KeyError: ma\n", + "KeyError: multiply_add\n", "\n", "During handling of the above exception, another exception occurred:\n", "\n", "Traceback (most recent call last):\n", - " File \"\", line 2, in \n", - " api.jvp(sq_add_prim, (2., 10.), (1., 1.))\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 909, in jvp\n", + " File \"\", line 2, in \n", + " api.jvp(square_add_prim, (2., 10.), (1., 1.))\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 978, in jvp\n", " out_primals, out_tangents = ad.jvp(flat_fun).call_wrapped(ps_flat, ts_flat)\n", " File \"/usr/local/lib/python3.6/dist-packages/jax/linear_util.py\", line 165, in call_wrapped\n", " ans = self.f(*args, **dict(self.params, **kwargs))\n", - "NotImplementedError: Forward-mode differentiation rule for 'ma' not implemented\n" + "NotImplementedError: Forward-mode differentiation rule for 'multiply_add' not implemented\n" ], "name": "stderr" } @@ -864,8 +877,8 @@ "from jax import ad\n", "\n", "\n", - "@trace(\"ma_value_and_jvp\")\n", - "def ma_value_and_jvp(arg_values, arg_tangents):\n", + "@trace(\"multiply_add_value_and_jvp\")\n", + "def multiply_add_value_and_jvp(arg_values, arg_tangents):\n", " \"\"\"Evaluates the primal output and the tangents (Jacobian-vector product).\n", "\n", " Given values of the arguments and perturbation of the arguments (tangents), \n", @@ -887,12 +900,12 @@ " _trace(\"Primal evaluation:\")\n", " # Now we have a JAX-traceable computation of the output. \n", " # Normally, we can use the ma primtive itself to compute the primal output. \n", - " primal_out = ma_prim(x, y, z)\n", + " primal_out = multiply_add_prim(x, y, z)\n", " \n", " _trace(\"Tangent evaluation:\")\n", " # We must use a JAX-traceable way to compute the tangent. It turns out that \n", " # the output tangent can be computed as (xt * y + x * yt + zt),\n", - " # which we can implement in a JAX-traceable way using the same \"ma_prim\" primitive.\n", + " # which we can implement in a JAX-traceable way using the same \"multiply_add_prim\" primitive.\n", " \n", " # We do need to deal specially with Zero. Here we just turn it into a \n", " # proper tensor of 0s (of the same shape as 'x'). \n", @@ -901,11 +914,11 @@ " def make_zero(tan):\n", " return lax.zeros_like_array(x) if tan is ad.zero else tan \n", " \n", - " output_tangent = ma_prim(make_zero(xt), y, ma_prim(x, make_zero(yt), make_zero(zt)))\n", + " output_tangent = multiply_add_prim(make_zero(xt), y, multiply_add_prim(x, make_zero(yt), make_zero(zt)))\n", " return (primal_out, output_tangent)\n", "\n", "# Register the forward differentiation rule with JAX \n", - "ad.primitive_jvps[ma_p] = ma_value_and_jvp" + "ad.primitive_jvps[multiply_add_p] = multiply_add_value_and_jvp" ], "execution_count": 0, "outputs": [] @@ -915,7 +928,7 @@ "metadata": { "id": "ma3KBkiAMfW1", "colab_type": "code", - "outputId": "37ff9f08-d141-4381-fadf-3db7e40d8f69", + "outputId": "f34cbbc6-20d9-48ca-9a9a-b5d91a972cdd", "colab": { "base_uri": "https://localhost:8080/", "height": 357 @@ -923,33 +936,33 @@ }, "source": [ "# Tangent is: xt*y + x*yt + zt = 1.*2. + 2.*1. + 1. = 5.\n", - "assert api.jvp(sq_add_prim, (2., 10.), (1., 1.)) == (14., 5.)" + "assert api.jvp(square_add_prim, (2., 10.), (1., 1.)) == (14., 5.)" ], - "execution_count": 0, + "execution_count": 16, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_value_and_jvp((2.0, 2.0, 10.0), (1.0, 1.0, 1.0))\n", + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_value_and_jvp((2.0, 2.0, 10.0), (1.0, 1.0, 1.0))\n", " Primal evaluation:\n", - " call ma_prim(2.0, 2.0, 10.0)\n", - " call ma_impl(2.0, 2.0, 10.0)\n", - " |<- ma_impl = 14.0\n", - " |<- ma_prim = 14.0\n", + " call multiply_add_prim(2.0, 2.0, 10.0)\n", + " call multiply_add_impl(2.0, 2.0, 10.0)\n", + " |<- multiply_add_impl = 14.0\n", + " |<- multiply_add_prim = 14.0\n", " Tangent evaluation:\n", - " call ma_prim(2.0, 1.0, 1.0)\n", - " call ma_impl(2.0, 1.0, 1.0)\n", - " |<- ma_impl = 3.0\n", - " |<- ma_prim = 3.0\n", - " call ma_prim(1.0, 2.0, 3.0)\n", - " call ma_impl(1.0, 2.0, 3.0)\n", - " |<- ma_impl = 5.0\n", - " |<- ma_prim = 5.0\n", - " |<- ma_value_and_jvp = (14.0, 5.0)\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n" + " call multiply_add_prim(2.0, 1.0, 1.0)\n", + " call multiply_add_impl(2.0, 1.0, 1.0)\n", + " |<- multiply_add_impl = 3.0\n", + " |<- multiply_add_prim = 3.0\n", + " call multiply_add_prim(1.0, 2.0, 3.0)\n", + " call multiply_add_impl(1.0, 2.0, 3.0)\n", + " |<- multiply_add_impl = 5.0\n", + " |<- multiply_add_prim = 5.0\n", + " |<- multiply_add_value_and_jvp = (14.0, 5.0)\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n" ], "name": "stdout" } @@ -963,9 +976,9 @@ }, "source": [ "TO EXPLAIN: \n", - " * Why is JAX using ConcreteArray in sq_add_prim? There is no abstract evaluation going on here.\n", - " * Not sure how to explain that ma_prim is invoked with ConcreteValue, yet\n", - " we do not call the ma_abstract_eval.\n", + " * Why is JAX using ConcreteArray in square_add_prim? There is no abstract evaluation going on here.\n", + " * Not sure how to explain that multiply_add_prim is invoked with ConcreteValue, yet\n", + " we do not call the multiply_add_abstract_eval.\n", " * I think it would be useful to show the JAXPR here\n", " " ] @@ -977,7 +990,7 @@ "colab_type": "text" }, "source": [ - "### JIT of forward differentiation\n", + "#### JIT of forward differentiation\n", "\n", "We can apply JIT to the forward differentiation function:" ] @@ -987,7 +1000,7 @@ "metadata": { "id": "hg-hzVu-N-hv", "colab_type": "code", - "outputId": "4c5ea9c3-9014-4099-98a4-ad06804615b2", + "outputId": "38d32067-e152-4046-ad80-7f95a31ba628", "colab": { "base_uri": "https://localhost:8080/", "height": 479 @@ -995,40 +1008,40 @@ }, "source": [ "assert api.jit(lambda arg_values, arg_tangents: \n", - " api.jvp(sq_add_prim, arg_values, arg_tangents))(\n", + " api.jvp(square_add_prim, arg_values, arg_tangents))(\n", " (2., 10.), (1., 1.)) == (14., 5.)" ], - "execution_count": 0, + "execution_count": 17, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_value_and_jvp((Traced, Traced, Traced), (Traced, Traced, Traced))\n", + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_value_and_jvp((Traced, Traced, Traced), (Traced, Traced, Traced))\n", " Primal evaluation:\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", " Tangent evaluation:\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " |<- ma_value_and_jvp = (Traced, Traced)\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n" + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " |<- multiply_add_value_and_jvp = (Traced, Traced)\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n" ], "name": "stdout" } @@ -1041,7 +1054,7 @@ "colab_type": "text" }, "source": [ - "Notice that first we evaluate `ma_value_and_jvp` abstractly, which in turn\n", + "Notice that first we evaluate `multiply_add_value_and_jvp` abstractly, which in turn\n", "evaluates abstractly both the primal and the tanger evaluation (a total of \n", "3 invocations of the `ma` primitive). Then we compile the 3 occurrences\n", "of the primitive." @@ -1054,26 +1067,26 @@ "colab_type": "text" }, "source": [ - "## Reverse differentiation\n", + "### Reverse differentiation\n", "\n", "If we attempt now to use reverse differentiation we\n", - "see that JAX starts by using the `ma_value_and_jvp` to \n", + "see that JAX starts by using the `multiply_add_value_and_jvp` to \n", "compute the forward differentiation for abstract values, but then runs\n", "into a `NotImplementedError`. \n", "\n", "When computing the reverse differentiation JAX first does abstract evaluation\n", - "of the forward differentiation code `ma_value_and_jvp` to obtain a \n", + "of the forward differentiation code `multiply_add_value_and_jvp` to obtain a \n", "trace of primitives that compute the output tangent. \n", "Observe that JAX performs this abstract evaluation with concrete values\n", "for the differentiation point, and abstract values for the tangents. \n", "Observe also that JAX uses the special abstract tangent value `Zero` for\n", "the tangent corresponding to the 3rd argument of `ma`. This reflects the \n", - "fact that we do not differentiate w.r.t. the 2nd argument to `sq_add_prim`,\n", - "which flow to 3rd argument to `ma_prim`.\n", + "fact that we do not differentiate w.r.t. the 2nd argument to `square_add_prim`,\n", + "which flow to 3rd argument to `multiply_add_prim`.\n", "\n", "Observe also that during the abstract evaluation of the tangent we pass the \n", "value 0.0 as the tangent for the 3rd argument. This is due to the use\n", - "of the `make_zero` function in the definition of `ma_value_and_jvp`." + "of the `make_zero` function in the definition of `multiply_add_value_and_jvp`." ] }, { @@ -1081,42 +1094,42 @@ "metadata": { "id": "8eAVnexaOjBn", "colab_type": "code", - "outputId": "e18bbb00-01f2-4c10-a71e-e1f36b717046", + "outputId": "e4ee89cf-ab4a-4505-9817-fa978a2865ab", "colab": { "base_uri": "https://localhost:8080/", "height": 666 } }, "source": [ - "# This is reverse differentiation w.r.t. the first argument of sq_add_prim\n", + "# This is reverse differentiation w.r.t. the first argument of square_add_prim\n", "with expectNotImplementedError():\n", - " api.grad(sq_add_prim)(2., 10.)" + " api.grad(square_add_prim)(2., 10.)" ], - "execution_count": 0, + "execution_count": 18, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, 10.0)\n", - " call ma_prim(Traced, Traced, 10.0)\n", - " call ma_value_and_jvp((Traced, Traced, 10.0), (Traced, Traced, Zero))\n", + "call square_add_prim(Traced, 10.0)\n", + " call multiply_add_prim(Traced, Traced, 10.0)\n", + " call multiply_add_value_and_jvp((Traced, Traced, 10.0), (Traced, Traced, Zero))\n", " Primal evaluation:\n", - " call ma_prim(Traced, Traced, 10.0)\n", - " call ma_impl(2.0, 2.0, 10.0)\n", - " |<- ma_impl = 14.0\n", - " |<- ma_prim = 14.0\n", + " call multiply_add_prim(Traced, Traced, 10.0)\n", + " call multiply_add_impl(2.0, 2.0, 10.0)\n", + " |<- multiply_add_impl = 14.0\n", + " |<- multiply_add_prim = 14.0\n", " Tangent evaluation:\n", - " call ma_prim(Traced, Traced, 0.0)\n", - " call ma_abstract_eval(ConcreteArray(2.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ConcreteArray(2.0), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " |<- ma_value_and_jvp = (14.0, Traced)\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", + " call multiply_add_prim(Traced, Traced, 0.0)\n", + " call multiply_add_abstract_eval(ConcreteArray(2.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ConcreteArray(2.0), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " |<- multiply_add_value_and_jvp = (14.0, Traced)\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", "\n", "Found expected exception:\n" ], @@ -1126,20 +1139,20 @@ "output_type": "stream", "text": [ "Traceback (most recent call last):\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/ad.py\", line 196, in get_primitive_transpose\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/ad.py\", line 198, in get_primitive_transpose\n", " return primitive_transposes[p]\n", - "KeyError: ma\n", + "KeyError: multiply_add\n", "\n", "During handling of the above exception, another exception occurred:\n", "\n", "Traceback (most recent call last):\n", - " File \"\", line 2, in \n", - " api.grad(sq_add_prim)(2., 10.)\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 338, in grad_f\n", + " File \"\", line 2, in \n", + " api.grad(square_add_prim)(2., 10.)\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 340, in grad_f\n", " _, g = value_and_grad_f(*args, **kwargs)\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 396, in value_and_grad_f\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 398, in value_and_grad_f\n", " g = vjp_py(onp.ones((), dtype=dtype))\n", - "NotImplementedError: Reverse-mode differentiation rule for 'ma' not implemented\n" + "NotImplementedError: Reverse-mode differentiation rule for 'multiply_add' not implemented\n" ], "name": "stderr" } @@ -1163,7 +1176,7 @@ "colab_type": "text" }, "source": [ - "### Transposition\n", + "#### Transposition\n", "\n", "\n", "As explained above, when computing reverse differentiation JAX obtains\n", @@ -1236,19 +1249,19 @@ "colab": {} }, "source": [ - "@trace(\"ma_transpose\")\n", - "def ma_transpose(ct, x, y, z):\n", + "@trace(\"multiply_add_transpose\")\n", + "def multiply_add_transpose(ct, x, y, z):\n", " \"\"\"Evaluates the transpose of a linear primitive.\n", "\n", " This method is only used when computing the backward gradient following \n", " value_and_jvp, and is only needed for primitives that are used in the JVP \n", - " calculation for some other primitive. We need transposition for ma_prim, \n", - " because we have used ma_prim in the computation of the output_tangent in \n", - " ma_value_and_jvp.\n", + " calculation for some other primitive. We need transposition for multiply_add_prim, \n", + " because we have used multiply_add_prim in the computation of the output_tangent in \n", + " multiply_add_value_and_jvp.\n", "\n", - " In our case, ma is not a linear primitive. However, it is used linearly \n", - " w.r.t. tangents in ma_value_and_jvp:\n", - " output_tangent(xt, yt, zt) = ma_prim(xt, y, ma_prim(x, yt, zt)\n", + " In our case, multiply_add is not a linear primitive. However, it is used linearly \n", + " w.r.t. tangents in multiply_add_value_and_jvp:\n", + " output_tangent(xt, yt, zt) = multiply_add_prim(xt, y, multiply_add_prim(x, yt, zt)\n", " \n", " Always one of the first two multiplicative arguments are constants.\n", "\n", @@ -1262,19 +1275,19 @@ " corresponding to the constant arguments.\n", " \"\"\"\n", " if x is not ad.undefined_primal:\n", - " # This use of ma is with a constant \"x\"\n", + " # This use of multiply_add is with a constant \"x\"\n", " assert y is ad.undefined_primal\n", - " ct_y = ad.zero if ct is ad.zero else ma_prim(x, ct, lax.zeros_like_array(x))\n", + " ct_y = ad.zero if ct is ad.zero else multiply_add_prim(x, ct, lax.zeros_like_array(x))\n", " res = None, ct_y, ct\n", " else:\n", - " # This use of ma is with a constant \"y\"\n", + " # This use of multiply_add is with a constant \"y\"\n", " assert x is ad.undefined_primal\n", - " ct_x = ad.zero if ct is ad.zero else ma_prim(ct, y, lax.zeros_like_array(y))\n", + " ct_x = ad.zero if ct is ad.zero else multiply_add_prim(ct, y, lax.zeros_like_array(y))\n", " res = ct_x, None, ct\n", " return res\n", "\n", "\n", - "ad.primitive_transposes[ma_p] = ma_transpose" + "ad.primitive_transposes[multiply_add_p] = multiply_add_transpose" ], "execution_count": 0, "outputs": [] @@ -1294,52 +1307,52 @@ "metadata": { "id": "PogPKS4MPevd", "colab_type": "code", - "outputId": "1b9d124e-03e9-4dcf-c3d8-290117c2c5e6", + "outputId": "d33328d4-3e87-45b5-9b31-21ad624b67af", "colab": { "base_uri": "https://localhost:8080/", "height": 581 } }, "source": [ - "assert api.grad(sq_add_prim)(2., 10.) == 4." + "assert api.grad(square_add_prim)(2., 10.) == 4." ], - "execution_count": 0, + "execution_count": 20, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, 10.0)\n", - " call ma_prim(Traced, Traced, 10.0)\n", - " call ma_value_and_jvp((Traced, Traced, 10.0), (Traced, Traced, Zero))\n", + "call square_add_prim(Traced, 10.0)\n", + " call multiply_add_prim(Traced, Traced, 10.0)\n", + " call multiply_add_value_and_jvp((Traced, Traced, 10.0), (Traced, Traced, Zero))\n", " Primal evaluation:\n", - " call ma_prim(Traced, Traced, 10.0)\n", - " call ma_impl(2.0, 2.0, 10.0)\n", - " |<- ma_impl = 14.0\n", - " |<- ma_prim = 14.0\n", + " call multiply_add_prim(Traced, Traced, 10.0)\n", + " call multiply_add_impl(2.0, 2.0, 10.0)\n", + " |<- multiply_add_impl = 14.0\n", + " |<- multiply_add_prim = 14.0\n", " Tangent evaluation:\n", - " call ma_prim(Traced, Traced, 0.0)\n", - " call ma_abstract_eval(ConcreteArray(2.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ConcreteArray(2.0), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " |<- ma_value_and_jvp = (14.0, Traced)\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", - "call ma_transpose(1.0, _, 2.0, _)\n", - " call ma_prim(1.0, 2.0, 0.0)\n", - " call ma_impl(1.0, 2.0, 0.0)\n", - " |<- ma_impl = 2.0\n", - " |<- ma_prim = 2.0\n", - "|<- ma_transpose = (2.0, None, 1.0)\n", - "call ma_transpose(1.0, 2.0, _, 0.0)\n", - " call ma_prim(2.0, 1.0, 0.0)\n", - " call ma_impl(2.0, 1.0, 0.0)\n", - " |<- ma_impl = 2.0\n", - " |<- ma_prim = 2.0\n", - "|<- ma_transpose = (None, 2.0, 1.0)\n" + " call multiply_add_prim(Traced, Traced, 0.0)\n", + " call multiply_add_abstract_eval(ConcreteArray(2.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ConcreteArray(2.0), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " |<- multiply_add_value_and_jvp = (14.0, Traced)\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", + "call multiply_add_transpose(1.0, _, 2.0, _)\n", + " call multiply_add_prim(1.0, 2.0, 0.0)\n", + " call multiply_add_impl(1.0, 2.0, 0.0)\n", + " |<- multiply_add_impl = 2.0\n", + " |<- multiply_add_prim = 2.0\n", + "|<- multiply_add_transpose = (2.0, None, 1.0)\n", + "call multiply_add_transpose(1.0, 2.0, _, 0.0)\n", + " call multiply_add_prim(2.0, 1.0, 0.0)\n", + " call multiply_add_impl(2.0, 1.0, 0.0)\n", + " |<- multiply_add_impl = 2.0\n", + " |<- multiply_add_prim = 2.0\n", + "|<- multiply_add_transpose = (None, 2.0, 1.0)\n" ], "name": "stdout" } @@ -1352,9 +1365,9 @@ "colab_type": "text" }, "source": [ - "Notice the two calls to `ma_transpose`. They correspond to the two\n", - "uses of `ma_prim` in the computation of the `output_tangent` in `ma_value_and_jvp`. The first call to transpose corresponds to the \n", - "last use of `ma_prim`: `ma_prim(xt, y, ...)` where `y` is the constant 2.0." + "Notice the two calls to `multiply_add_transpose`. They correspond to the two\n", + "uses of `multiply_add_prim` in the computation of the `output_tangent` in `multiply_add_value_and_jvp`. The first call to transpose corresponds to the \n", + "last use of `multiply_add_prim`: `multiply_add_prim(xt, y, ...)` where `y` is the constant 2.0." ] }, { @@ -1364,9 +1377,9 @@ "colab_type": "text" }, "source": [ - "### JIT of reverse differentiation \n", + "#### JIT of reverse differentiation \n", "\n", - "Notice that the abstract evaluation of the `ma_value_and_jvp` is using only\n", + "Notice that the abstract evaluation of the `multiply_add_value_and_jvp` is using only\n", "abstract values, while in the absensce of JIT we used `ConcreteArray`." ] }, @@ -1375,56 +1388,56 @@ "metadata": { "id": "FZ-JGbWZPq2-", "colab_type": "code", - "outputId": "17bf806a-ed25-4a41-f63d-5f7f276b1274", + "outputId": "e42b5222-9c3e-4853-e13a-874f6605d178", "colab": { "base_uri": "https://localhost:8080/", "height": 649 } }, "source": [ - "assert api.jit(api.grad(sq_add_prim))(2., 10.) == 4." + "assert api.jit(api.grad(square_add_prim))(2., 10.) == 4." ], - "execution_count": 0, + "execution_count": 21, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_value_and_jvp((Traced, Traced, Traced), (Traced, Traced, Zero))\n", + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_value_and_jvp((Traced, Traced, Traced), (Traced, Traced, Zero))\n", " Primal evaluation:\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", " Tangent evaluation:\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ConcreteArray(0.0))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - " |<- ma_value_and_jvp = (Traced, Traced)\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", - "call ma_transpose(1.0, _, Traced, _)\n", - " call ma_prim(1.0, Traced, Traced)\n", - " call ma_abstract_eval(ConcreteArray(1.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - "|<- ma_transpose = (Traced, None, 1.0)\n", - "call ma_transpose(1.0, Traced, _, Traced)\n", - " call ma_prim(Traced, 1.0, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[]), ConcreteArray(1.0), ConcreteArray(0.0))\n", - " |<- ma_abstract_eval = ShapedArray(float32[])\n", - " |<- ma_prim = Traced\n", - "|<- ma_transpose = (None, Traced, 1.0)\n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n" + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ShapedArray(float32[]), ShapedArray(float32[]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + " |<- multiply_add_value_and_jvp = (Traced, Traced)\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", + "call multiply_add_transpose(1.0, _, Traced, _)\n", + " call multiply_add_prim(1.0, Traced, Traced)\n", + " call multiply_add_abstract_eval(ConcreteArray(1.0), ShapedArray(float32[]), ConcreteArray(0.0))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + "|<- multiply_add_transpose = (Traced, None, 1.0)\n", + "call multiply_add_transpose(1.0, Traced, _, Traced)\n", + " call multiply_add_prim(Traced, 1.0, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[]), ConcreteArray(1.0), ConcreteArray(0.0))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[])\n", + " |<- multiply_add_prim = Traced\n", + "|<- multiply_add_transpose = (None, Traced, 1.0)\n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n" ], "name": "stdout" } @@ -1437,7 +1450,7 @@ "colab_type": "text" }, "source": [ - "## Batching\n", + "### Batching\n", "\n", "The batching transformation takes a point-wise computation and turns it\n", "into a computation on vectors. If we try it right now, we get a `NotImplementedError`:" @@ -1448,25 +1461,25 @@ "metadata": { "id": "hFvBR3I9Pzh3", "colab_type": "code", - "outputId": "26b68bdc-d709-4bc1-937a-b49ca18b585b", + "outputId": "434608bc-281f-4d3b-83bd-eaaf3b51b1cd", "colab": { "base_uri": "https://localhost:8080/", - "height": 340 + "height": 360 } }, "source": [ "# The arguments are two vectors instead of two scalars\n", "with expectNotImplementedError():\n", - " api.vmap(sq_add_prim, in_axes=0, out_axes=0)(onp.array([2., 3.]),\n", + " api.vmap(square_add_prim, in_axes=0, out_axes=0)(onp.array([2., 3.]),\n", " onp.array([10., 20.]))" ], - "execution_count": 0, + "execution_count": 22, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", "\n", "Found expected exception:\n" ], @@ -1476,20 +1489,20 @@ "output_type": "stream", "text": [ "Traceback (most recent call last):\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/batching.py\", line 162, in get_primitive_batcher\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/batching.py\", line 163, in get_primitive_batcher\n", " return primitive_batchers[p]\n", - "KeyError: ma\n", + "KeyError: multiply_add\n", "\n", "During handling of the above exception, another exception occurred:\n", "\n", "Traceback (most recent call last):\n", - " File \"\", line 3, in \n", + " File \"\", line 3, in \n", " onp.array([10., 20.]))\n", - " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 609, in batched_fun\n", + " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 611, in batched_fun\n", " lambda: _flatten_axes(out_tree(), out_axes))\n", " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/batching.py\", line 41, in batch\n", " out_vals, out_dims = batch_fun(fun, in_vals, in_dims)\n", - "NotImplementedError: Batching rule for 'ma' not implemented\n" + "NotImplementedError: Batching rule for 'multiply_add' not implemented\n" ], "name": "stderr" } @@ -1502,7 +1515,7 @@ "colab_type": "text" }, "source": [ - "We need to tell JAX how to evaluate the batched version of the primitive. In this particular case, the `ma_prim` already operates pointwise for any dimension of input vectors. So the" + "We need to tell JAX how to evaluate the batched version of the primitive. In this particular case, the `multiply_add_prim` already operates pointwise for any dimension of input vectors. So the batched version can use the same `multiple_add_prim` implementation." ] }, { @@ -1516,16 +1529,16 @@ "from jax import batching\n", "\n", "\n", - "@trace(\"ma_batch\")\n", - "def ma_batch(vector_arg_values, batch_axes):\n", + "@trace(\"multiply_add_batch\")\n", + "def multiply_add_batch(vector_arg_values, batch_axes):\n", " \"\"\"Computes the batched version of the primitive.\n", " \n", " This must be a JAX-traceable function.\n", " \n", - " Since the ma primitive already operates on tensors, to batch it we use\n", - " the primitive itself. This works as long as the input are batched along\n", - " the same axes. The result is batched along the axis that the inputs\n", - " are batched.\n", + " Since the multiply_add primitive already operates pointwise on arbitrary\n", + " dimension tensors, to batch it we can use the primitive itself. This works as\n", + " long as both the inputs have the same dimensions and are batched along the\n", + " same axes. The result is batched along the axis that the inputs are batched.\n", " \n", " Args:\n", " vector_arg_values: a tuple of two arguments, each being a tensor of matching\n", @@ -1536,12 +1549,12 @@ " \"\"\"\n", " assert batch_axes[0] == batch_axes[1]\n", " assert batch_axes[0] == batch_axes[2]\n", - " _trace(\"Using ma to compute the batch:\")\n", - " res = ma_prim(*vector_arg_values)\n", + " _trace(\"Using multiply_add to compute the batch:\")\n", + " res = multiply_add_prim(*vector_arg_values)\n", " return res, batch_axes[0]\n", "\n", "\n", - "batching.primitive_batchers[ma_p] = ma_batch" + "batching.primitive_batchers[multiply_add_p] = multiply_add_batch" ], "execution_count": 0, "outputs": [] @@ -1551,34 +1564,34 @@ "metadata": { "id": "VwxNk869P_YG", "colab_type": "code", - "outputId": "e76e1275-1cb2-4d60-d853-5ce8762b6541", + "outputId": "9d22c921-5803-4d33-9e88-b6e439ba9738", "colab": { "base_uri": "https://localhost:8080/", - "height": 204 + "height": 224 } }, "source": [ - "assert onp.allclose(api.vmap(sq_add_prim, in_axes=0, out_axes=0)(\n", + "assert onp.allclose(api.vmap(square_add_prim, in_axes=0, out_axes=0)(\n", " onp.array([2., 3.]),\n", " onp.array([10., 20.])),\n", " [14., 29.])" ], - "execution_count": 0, + "execution_count": 24, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_batch(([2. 3.], [2. 3.], [10. 20.]), (0, 0, 0))\n", - " Using ma to compute the batch:\n", - " call ma_prim([2. 3.], [2. 3.], [10. 20.])\n", - " call ma_impl([2. 3.], [2. 3.], [10. 20.])\n", - " |<- ma_impl = [14. 29.]\n", - " |<- ma_prim = [14. 29.]\n", - " |<- ma_batch = ([14. 29.], 0)\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n" + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_batch(([2. 3.], [2. 3.], [10. 20.]), (0, 0, 0))\n", + " Using multiply_add to compute the batch:\n", + " call multiply_add_prim([2. 3.], [2. 3.], [10. 20.])\n", + " call multiply_add_impl([2. 3.], [2. 3.], [10. 20.])\n", + " |<- multiply_add_impl = [14. 29.]\n", + " |<- multiply_add_prim = [14. 29.]\n", + " |<- multiply_add_batch = ([14. 29.], 0)\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n" ], "name": "stdout" } @@ -1591,7 +1604,7 @@ "colab_type": "text" }, "source": [ - "### JIT of batching" + "#### JIT of batching" ] }, { @@ -1599,36 +1612,36 @@ "metadata": { "id": "xqEdXVUgQCTt", "colab_type": "code", - "outputId": "3720cac5-31de-49f7-c765-829c3b1919fb", + "outputId": "9c22fd9c-919c-491d-bbeb-32c241b808fa", "colab": { "base_uri": "https://localhost:8080/", - "height": 238 + "height": 258 } }, "source": [ - "assert onp.allclose(api.jit(api.vmap(sq_add_prim, in_axes=0, out_axes=0))\n", + "assert onp.allclose(api.jit(api.vmap(square_add_prim, in_axes=0, out_axes=0))\n", " (onp.array([2., 3.]),\n", " onp.array([10., 20.])),\n", " [14., 29.])" ], - "execution_count": 0, + "execution_count": 25, "outputs": [ { "output_type": "stream", "text": [ - "call sq_add_prim(Traced, Traced)\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_batch((Traced, Traced, Traced), (0, 0, 0))\n", - " Using ma to compute the batch:\n", - " call ma_prim(Traced, Traced, Traced)\n", - " call ma_abstract_eval(ShapedArray(float32[2]), ShapedArray(float32[2]), ShapedArray(float32[2]))\n", - " |<- ma_abstract_eval = ShapedArray(float32[2])\n", - " |<- ma_prim = Traced\n", - " |<- ma_batch = (Traced, 0)\n", - " |<- ma_prim = Traced\n", - "|<- sq_add_prim = Traced\n", - "call ma_xla_translation(, , , )\n", - "|<- ma_xla_translation = \n" + "call square_add_prim(Traced, Traced)\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_batch((Traced, Traced, Traced), (0, 0, 0))\n", + " Using multiply_add to compute the batch:\n", + " call multiply_add_prim(Traced, Traced, Traced)\n", + " call multiply_add_abstract_eval(ShapedArray(float32[2]), ShapedArray(float32[2]), ShapedArray(float32[2]))\n", + " |<- multiply_add_abstract_eval = ShapedArray(float32[2])\n", + " |<- multiply_add_prim = Traced\n", + " |<- multiply_add_batch = (Traced, 0)\n", + " |<- multiply_add_prim = Traced\n", + "|<- square_add_prim = Traced\n", + "call multiply_add_xla_translation(, , , )\n", + "|<- multiply_add_xla_translation = \n" ], "name": "stdout" } From 7bc0f70f8708f6375eab6687fb4e84e25c955fbb Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 3 Oct 2019 11:59:51 +0200 Subject: [PATCH 0144/1053] Fix the title to show nicely in sphinx --- docs/notebooks/How_JAX_primitives_work.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 775cfac01681..26d9da17c336 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -21,9 +21,9 @@ "colab_type": "text" }, "source": [ - "# JAX primitives\n", + "# How JAX primitives work\n", "\n", - "*necula@google.com*, September 2019.\n", + "*necula@google.com*, October 2019.\n", "\n", "JAX implements certain transformations of Python functions, e.g., `jit`, `grad`,\n", "`vmap`, or `pmap`. The Python functions to be transformed must be JAX-traceable, \n", From d21efd3cc75fa765183847546a353e6070cf711c Mon Sep 17 00:00:00 2001 From: joaogui1 Date: Thu, 3 Oct 2019 11:04:09 -0300 Subject: [PATCH 0145/1053] Fixes the parameters descriptions --- jax/numpy/lax_numpy.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ee5ffadee305..3cff5ed3ea01 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -272,6 +272,22 @@ def wrap(op): "{summary}\n\nLAX-backend implementation of :func:`{fun}`. " "Original docstring below.\n\n{body}".format( summary=summary, fun=fun.__name__, body=body)) + + begin_idx = docstr.find("Parameters") + begin_idx += docstr[begin_idx:].find("--\n") + 2 + end_idx = docstr.find("Returns") + + parameters = docstr[begin_idx:end_idx] + param_list = parameters.replace('\n ', '@@').split('\n') + + for idx, p in enumerate(param_list): + param, *_ = p.split(' : ') + if param not in op.__code__.co_varnames: + param_list[idx] = '' + param_list = [param for param in param_list if param != ''] + parameters = '\n'.join(param_list).replace('@@', '\n ') + docstr = docstr[:begin_idx + 1] + parameters + docstr[end_idx - 2:] + op.__name__ = fun.__name__ op.__doc__ = docstr finally: From 2a8575bf04db2e642dddf32df7b2932929e33d0d Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 3 Oct 2019 10:36:29 -0700 Subject: [PATCH 0146/1053] Bump jaxlib version to 0.1.30 and update WORKSPACE. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c27fabfee5f..7709e621efbb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "11482f1f97c35df67bd74423bc9d0cb6cdb379d74f42533ee8def94e874af842", - strip_prefix = "tensorflow-3697b7d60268ae525f74e0040c86305f99e12bb3", + sha256 = "b313eee4b585821bd2a9b15b9fa858a87d6f581635d433ccf30161d1d74427d9", + strip_prefix = "tensorflow-b1c0035cc1c3536698506460e5ab328aa84fefb1", urls = [ - "https://github.com/tensorflow/tensorflow/archive/3697b7d60268ae525f74e0040c86305f99e12bb3.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/b1c0035cc1c3536698506460e5ab328aa84fefb1.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index 5cee11cd83cc..2edefb338cbe 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.29" +__version__ = "0.1.30" From 57e39ce9386e26bb60fcd7bf425860de20a0647d Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 2 Oct 2019 17:51:00 +0200 Subject: [PATCH 0147/1053] Added support for testing Colab notebooks. Testing is done by running "jupyter nbconvert --to notebook" and then parsing the resulting notebook to look for errors. One can declare expected errors, and the test will fail if those are missing. In the process of doig this, found and fixed a bug in the autodiff_cookbook notebook. --- .travis.yml | 5 ++ README.md | 10 +++ docs/notebooks/autodiff_cookbook.ipynb | 2 +- tests/notebooks_test.py | 104 +++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 tests/notebooks_test.py diff --git a/.travis.yml b/.travis.yml index a77a7d287da4..e4d8a9437cea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,12 @@ before_install: - conda config --add channels conda-forge install: - conda install --yes python=$TRAVIS_PYTHON_VERSION pip six protobuf>=3.6.0 absl-py opt_einsum numpy scipy pytest-xdist fastcache + # The following are needed to test the Colab notebooks + - conda install --yes python=$TRAVIS_PYTHON_VERSION jupyter matplotlib - pip install jaxlib - pip install -v . script: - pytest -n 1 tests examples -W ignore + - if [[ "$TRAVIS_PYTHON_VERSION" > "3" ]]; then + python -m unittest tests/notebooks_test.py; + fi diff --git a/README.md b/README.md index 532a35ad87bd..bb52dd3f8d9c 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,16 @@ file directly to see more detailed information about the cases being run: python tests/lax_numpy_test.py --num_generated_cases=5 ``` +To test the Colab notebooks, you should install the following additional packages: +``` +pip install jupyter matplotlib +``` + +and then run +``` +python -m unittest tests/notebooks_test.py +``` + ## Reference documentation For details about the JAX API, see the diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index db4a85f98168..301756af368e 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -1462,7 +1462,7 @@ " L = np.linalg.cholesky(X)\n", " return np.sum((L - np.sin(L))**2)\n", "\n", - "grad(f)(A)" + "grad(f, holomorphic=True)(A)" ] }, { diff --git a/tests/notebooks_test.py b/tests/notebooks_test.py new file mode 100644 index 000000000000..4a9e0e468809 --- /dev/null +++ b/tests/notebooks_test.py @@ -0,0 +1,104 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import re +import subprocess +import sys +import tempfile + +import nbformat + +from jax import test_util as jtu +from jax.config import config +config.parse_flags_with_absl() + + +class NotebooksTest(jtu.JaxTestCase): + """Tests the notebooks.""" + + def _execute_notebook(self, + notebook_path, + expected_errors=None): + """Execute a notebook, check for errors. + + Params: + notebook_path: the path to the .ipynb notebook to execute, relative to + the "jax" project root. + expected_errors: a list of expected errors. Each element of the list + is a pair of a pattern present in the cell source and + a pattern present in the expected error output. The patterns + are searched as regular expressions. + + Returns: + asserts that exactly the expected errors are found. + """ + jax_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + expected_errors = expected_errors if expected_errors else [] + with tempfile.NamedTemporaryFile(suffix=".ipynb") as notebook_out: + args = ["jupyter", "nbconvert", + "--to", "notebook", "--execute", + "--ExecutePreprocessor.timeout=60", + "--allow-errors", + "--output", notebook_out.name, os.path.join(jax_path, notebook_path)] + subprocess.check_call(args) + + notebook_out.seek(0) + nb = nbformat.read(notebook_out, nbformat.current_nbformat) + + # Keep a dict with the errors we are still expecting. Indexed by the + # pair of (cell_pattern, error_pattern). Value is the error message. + still_expecting_errors = { + expected: + "Did not find error matching '{}' in cell matching '{}".format(expected[1], + expected[0]) + for expected in expected_errors} + error_messages = [] # Collect error messages for unexpected errors + for cell in nb.cells: + if "outputs" in cell: + for output in cell["outputs"]: + if output.output_type == "error": + # Found an error + for (cell_pattern, error_pattern) in expected_errors: + if (re.search(cell_pattern, cell.source, re.MULTILINE) and + re.search(error_pattern, output.evalue, re.MULTILINE)): + # This was an expected error + del still_expecting_errors[(cell_pattern, error_pattern)] + break + else: + error_messages.append("Unexpected error in cell (execution count {}):\n{}\n\ngot error:\n{}\n".format( + cell.execution_count, + cell.source, + output.evalue)) + + if still_expecting_errors: + error_messages.extend(still_expecting_errors.values()) + + self.assertMultiLineEqual("", "\n".join(error_messages)) + + def test_quickstart_notebook(self): + self._execute_notebook(os.path.abspath("docs/notebooks/quickstart.ipynb")) + + def test_common_gotchas_notebook(self): + self._execute_notebook( + os.path.abspath("docs/notebooks/Common_Gotchas_in_JAX.ipynb"), + expected_errors=[ + ("In place update of JAX's array will yield an error", + "JAX arrays are immutable") + ]) + + def test_autodiff_cookbook_notebook(self): + self._execute_notebook( + os.path.abspath("docs/notebooks/autodiff_cookbook.ipynb"), + expected_errors=[]) \ No newline at end of file From 0fdf377343b19649d5ca4636da489e8ae22bad0a Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 2 Oct 2019 21:44:14 +0200 Subject: [PATCH 0148/1053] Switched testing to using sphinx (part of the documentation generation) --- .travis.yml | 7 +- README.md | 11 +-- docs/README.md | 13 ++- docs/conf.py | 3 +- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 3 + tests/notebooks_test.py | 104 --------------------- 6 files changed, 21 insertions(+), 120 deletions(-) delete mode 100644 tests/notebooks_test.py diff --git a/.travis.yml b/.travis.yml index e4d8a9437cea..c3e89cc1f8c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,12 +21,13 @@ before_install: - conda config --add channels conda-forge install: - conda install --yes python=$TRAVIS_PYTHON_VERSION pip six protobuf>=3.6.0 absl-py opt_einsum numpy scipy pytest-xdist fastcache - # The following are needed to test the Colab notebooks - - conda install --yes python=$TRAVIS_PYTHON_VERSION jupyter matplotlib - pip install jaxlib - pip install -v . + # The following are needed to test the Colab notebooks and the documentation building + - conda install --yes -c conda-forge pandoc ipykernel + - conda install --yes sphinx sphinx_rtd_theme nbsphinx jupyter_client matplotlib script: - pytest -n 1 tests examples -W ignore - if [[ "$TRAVIS_PYTHON_VERSION" > "3" ]]; then - python -m unittest tests/notebooks_test.py; + sphinx-build -M html docs build; fi diff --git a/README.md b/README.md index bb52dd3f8d9c..01c95301c44c 100644 --- a/README.md +++ b/README.md @@ -225,15 +225,8 @@ file directly to see more detailed information about the cases being run: python tests/lax_numpy_test.py --num_generated_cases=5 ``` -To test the Colab notebooks, you should install the following additional packages: -``` -pip install jupyter matplotlib -``` - -and then run -``` -python -m unittest tests/notebooks_test.py -``` +The Colab notebooks are tested for errors as part of the documentation build. +See [docs/README.md](docs/README.md) for instructions. ## Reference documentation diff --git a/docs/README.md b/docs/README.md index cc2fb4b7cc43..86e3ce1a9bc5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,14 @@ -To rebuild the documentation, install the `sphinx` and `sphinx_rtd_theme` pip -packages and then run: +To rebuild the documentation, install the following Python packages: +``` +pip install sphinx sphinx_rtd_theme nbsphinx fastcache ipykernel +``` + +Install also `pandoc`: +``` +sudo apt-get install pandoc +``` + +and then run: ``` sphinx-build -M html . build diff --git a/docs/conf.py b/docs/conf.py index d2e550af81dd..46c8b9390869 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -102,8 +102,7 @@ # -- Options for nbsphinx ----------------------------------------------------- # Execute notebooks before conversion: 'always', 'never', 'auto' (default) -# TODO(shoyer): switch to executing notebooks as part of the doc build process. -nbsphinx_execute = 'never' +nbsphinx_execute = 'always' # Use this kernel instead of the one stored in the notebook metadata: #nbsphinx_kernel_name = 'python3' diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 165cb0e5e118..7d5eba62c22d 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -132,6 +132,9 @@ "colab_type": "code", "id": "2AxeCufq4wAp", "outputId": "7013374b-041f-4270-db19-cfb4ab992f52" + "tags": [ + "raises-exception", + ] }, "outputs": [ { diff --git a/tests/notebooks_test.py b/tests/notebooks_test.py deleted file mode 100644 index 4a9e0e468809..000000000000 --- a/tests/notebooks_test.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright 2018 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import re -import subprocess -import sys -import tempfile - -import nbformat - -from jax import test_util as jtu -from jax.config import config -config.parse_flags_with_absl() - - -class NotebooksTest(jtu.JaxTestCase): - """Tests the notebooks.""" - - def _execute_notebook(self, - notebook_path, - expected_errors=None): - """Execute a notebook, check for errors. - - Params: - notebook_path: the path to the .ipynb notebook to execute, relative to - the "jax" project root. - expected_errors: a list of expected errors. Each element of the list - is a pair of a pattern present in the cell source and - a pattern present in the expected error output. The patterns - are searched as regular expressions. - - Returns: - asserts that exactly the expected errors are found. - """ - jax_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - expected_errors = expected_errors if expected_errors else [] - with tempfile.NamedTemporaryFile(suffix=".ipynb") as notebook_out: - args = ["jupyter", "nbconvert", - "--to", "notebook", "--execute", - "--ExecutePreprocessor.timeout=60", - "--allow-errors", - "--output", notebook_out.name, os.path.join(jax_path, notebook_path)] - subprocess.check_call(args) - - notebook_out.seek(0) - nb = nbformat.read(notebook_out, nbformat.current_nbformat) - - # Keep a dict with the errors we are still expecting. Indexed by the - # pair of (cell_pattern, error_pattern). Value is the error message. - still_expecting_errors = { - expected: - "Did not find error matching '{}' in cell matching '{}".format(expected[1], - expected[0]) - for expected in expected_errors} - error_messages = [] # Collect error messages for unexpected errors - for cell in nb.cells: - if "outputs" in cell: - for output in cell["outputs"]: - if output.output_type == "error": - # Found an error - for (cell_pattern, error_pattern) in expected_errors: - if (re.search(cell_pattern, cell.source, re.MULTILINE) and - re.search(error_pattern, output.evalue, re.MULTILINE)): - # This was an expected error - del still_expecting_errors[(cell_pattern, error_pattern)] - break - else: - error_messages.append("Unexpected error in cell (execution count {}):\n{}\n\ngot error:\n{}\n".format( - cell.execution_count, - cell.source, - output.evalue)) - - if still_expecting_errors: - error_messages.extend(still_expecting_errors.values()) - - self.assertMultiLineEqual("", "\n".join(error_messages)) - - def test_quickstart_notebook(self): - self._execute_notebook(os.path.abspath("docs/notebooks/quickstart.ipynb")) - - def test_common_gotchas_notebook(self): - self._execute_notebook( - os.path.abspath("docs/notebooks/Common_Gotchas_in_JAX.ipynb"), - expected_errors=[ - ("In place update of JAX's array will yield an error", - "JAX arrays are immutable") - ]) - - def test_autodiff_cookbook_notebook(self): - self._execute_notebook( - os.path.abspath("docs/notebooks/autodiff_cookbook.ipynb"), - expected_errors=[]) \ No newline at end of file From 4210192d8f3490c6483fcb49e5215e00fbd32088 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Thu, 3 Oct 2019 12:01:13 -0700 Subject: [PATCH 0149/1053] fix two typos in orthogonal init --- jax/nn/initializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/nn/initializers.py b/jax/nn/initializers.py index c621eee8f1d3..0fa93766c69a 100644 --- a/jax/nn/initializers.py +++ b/jax/nn/initializers.py @@ -86,13 +86,13 @@ def orthogonal(scale=1.0, column_axis=-1): def init(key, shape, dtype=np.float32): if len(shape) < 2: raise ValueError("orthogonal initializer requires at least a 2D shape") - n_rows, n_cols = onp.prod(shape) / shape[column_axis], shape[column_axis] + n_rows, n_cols = onp.prod(shape) // shape[column_axis], shape[column_axis] matrix_shape = (n_cols, n_rows) if n_rows < n_cols else (n_rows, n_cols) A = random.normal(key, matrix_shape, dtype) Q, R = np.linalg.qr(A) Q *= np.sign(np.diag(R)) # needed for a uniform distribution if n_rows < n_cols: Q = Q.T - Q = np.reshape(Q, np.delete(shape, column_axis) + (shape[column_axis],)) + Q = np.reshape(Q, onp.delete(shape, column_axis) + (shape[column_axis],)) Q = np.moveaxis(Q, -1, column_axis) return scale * Q return init From 23f06b417f4f150049aaf229aa5a7251a9d24a63 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Thu, 3 Oct 2019 12:01:21 -0700 Subject: [PATCH 0150/1053] add initializer tests --- tests/nn_test.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/tests/nn_test.py b/tests/nn_test.py index 88894ab86408..97e6f0dc0b85 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -17,6 +17,9 @@ from __future__ import division from __future__ import print_function +import collections +import itertools + from absl.testing import absltest from absl.testing import parameterized @@ -30,9 +33,50 @@ from jax.config import config config.parse_flags_with_absl() -class NNTest(jtu.JaxTestCase): +class NNFunctionsTest(jtu.JaxTestCase): + def testSoftplusGrad(self): check_grads(nn.softplus, (1e-8,), 4) + def testSoftplusValue(self): val = nn.softplus(89.) self.assertAllClose(val, 89., check_dtypes=False) + +InitializerRecord = collections.namedtuple( + "InitializerRecord", + ["name", "initializer", "shapes"]) + +ALL_SHAPES = [(2,), (2, 2), (2, 3), (3, 2), (2, 3, 4), (4, 3, 2), (2, 3, 4, 5)] + +def initializer_record(name, initializer, min_dims=2, max_dims=4): + shapes = [shape for shape in ALL_SHAPES + if min_dims <= len(shape) <= max_dims] + + return InitializerRecord(name, initializer, shapes) + +INITIALIZER_RECS = [ + initializer_record("uniform", nn.initializers.uniform(), 1), + initializer_record("normal", nn.initializers.normal(), 1), + initializer_record("he_normal", nn.initializers.he_normal()), + initializer_record("he_uniform", nn.initializers.he_uniform()), + initializer_record("glorot_normal", nn.initializers.glorot_normal()), + initializer_record("glorot_uniform", nn.initializers.glorot_uniform()), + initializer_record("lecun_normal", nn.initializers.lecun_normal()), + initializer_record("lecun_uniform", nn.initializers.lecun_uniform()), + initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2) +] + +class NNInitializersTest(jtu.JaxTestCase): + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_{}_{}".format( + rec.name, + jtu.format_shape_dtype_string(shape, dtype)), + "initializer": rec.initializer, "rng": random.PRNGKey(0), + "shape": shape, "dtype": dtype} + for rec in INITIALIZER_RECS + for shape in rec.shapes + for dtype in [onp.float32, onp.float64])) + def testInitializer(self, initializer, rng, shape, dtype): + val = initializer(rng, shape, dtype) \ No newline at end of file From aa35f8b00d6f4ab035b2119db7e59373de69dcb7 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Thu, 3 Oct 2019 12:06:07 -0700 Subject: [PATCH 0151/1053] more initializer aliases --- jax/nn/initializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/nn/initializers.py b/jax/nn/initializers.py index 0fa93766c69a..14c0367bb435 100644 --- a/jax/nn/initializers.py +++ b/jax/nn/initializers.py @@ -69,8 +69,8 @@ def init(key, shape, dtype=np.float32): raise ValueError("invalid distribution for variance scaling initializer") return init -glorot_uniform = partial(variance_scaling, 1.0, "fan_avg", "uniform") -glorot_normal = partial(variance_scaling, 1.0, "fan_avg", "truncated_normal") +xavier_uniform = glorot_uniform = partial(variance_scaling, 1.0, "fan_avg", "uniform") +xavier_normal = glorot_normal = partial(variance_scaling, 1.0, "fan_avg", "truncated_normal") lecun_uniform = partial(variance_scaling, 1.0, "fan_in", "uniform") lecun_normal = partial(variance_scaling, 1.0, "fan_in", "truncated_normal") kaiming_uniform = he_uniform = partial(variance_scaling, 2.0, "fan_in", "uniform") From db3b0dd03683dd744f33ea7b50e53a4cf5854c23 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Thu, 3 Oct 2019 14:02:45 -0700 Subject: [PATCH 0152/1053] fix missing delimiter in notebook source --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 7d5eba62c22d..657f48bbd459 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -131,7 +131,7 @@ }, "colab_type": "code", "id": "2AxeCufq4wAp", - "outputId": "7013374b-041f-4270-db19-cfb4ab992f52" + "outputId": "7013374b-041f-4270-db19-cfb4ab992f52", "tags": [ "raises-exception", ] From 7f98682f2440ef8d8fb9988195f27b53b897998c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 3 Oct 2019 14:21:28 -0700 Subject: [PATCH 0153/1053] Update README to point to jaxlib-0.1.30 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38d8a2a71da2..3c16c1b8c607 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.29-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.30-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From e8bf56df9822d1e16bafe59ca80f296a4da3c1f0 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 3 Oct 2019 14:27:23 -0700 Subject: [PATCH 0154/1053] Refactor pytree munging inside lax.root. (#1414) * Refactor pytree munging inside lax.root. The primitive's implementation and JVP rules are now 100% pytree free. * Linearize multiple times in _root_jvp to avoid zeros * Revisions per review --- jax/lax/lax_control_flow.py | 107 +++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index c9d6d5a85ee8..dd9d0b5cb95f 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -850,6 +850,38 @@ def body(i, dst): masking.masking_rules[lax.concatenate_p] = _concat_masking_rule +def _flatten_higher_order_func( + f, tree, error_template="Expected {}, got {}", +): + """Flatten a higher order function ``f`` of the form ``f(g, x)``. + + ``f`` must have the type signature: + + .. code-block:: haskell + + f :: (a -> a) -> a -> a + + ```a`` many be any arbitrary fixed pytree structure. The returned function has + the same structure as ``f``, except every appearence of ``a`` is replaced by a + flat sequence of arrays in the style used internally by JAX primitives + (variadic ``*args`` arguments in function calls, lists in return values). + """ + def flat_fun(flat_g, *args_flat): + args = tree_unflatten(tree, args_flat) + g = partial(apply_flat_fun_nokwargs, flat_g, (tree, tree)) + out = f(g, args) + out_flat, out_tree = tree_flatten(out) + if out_tree != tree: + raise TypeError(error_template.format(tree, out_tree)) + return out_flat + return flat_fun + + +def _root_tree_error_template(func_name): + return (func_name + "() output pytree structure must match initial_guess, " + + "got {} and {}.") + + def root(f, initial_guess, solve, tangent_solve): """Differentiably solve for a roots of a function. @@ -888,15 +920,19 @@ def root(f, initial_guess, solve, tangent_solve): guess_flat, in_args_tree = tree_flatten((initial_guess,)) guess_avals = tuple(_map(_abstractify, guess_flat)) jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, guess_avals) + in_tree, = treedef_children(in_args_tree) if in_tree != out_tree: - raise TypeError( - "f() output pytree structure must match initial_guess, got {} and {}." - .format(out_tree, in_tree) - ) + raise TypeError(_root_tree_error_template("f").format(out_tree, in_tree)) + + solve_flat = _flatten_higher_order_func( + solve, in_tree, _root_tree_error_template("solve")) + tangent_solve_flat = _flatten_higher_order_func( + tangent_solve, in_tree, _root_tree_error_template("tangent_solve")) + out_flat = root_p.bind(*itertools.chain(consts, guess_flat), - tree=out_tree, num_consts=len(consts), - jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) + num_consts=len(consts), jaxpr=jaxpr, solve=solve_flat, + tangent_solve=tangent_solve_flat) return tree_unflatten(out_tree, out_flat) @@ -905,34 +941,17 @@ def _root_abstract_eval(*args, **kwargs): def _root_impl(*args, **kwargs): - tree, num_consts, jaxpr, solve, _ = split_dict( - kwargs, ['tree', 'num_consts', 'jaxpr', 'solve', 'tangent_solve']) - - f = partial( - apply_flat_fun_nokwargs, - partial(core.jaxpr_as_fun(jaxpr), *args[:num_consts]), - (tree, tree), - ) - initial_guess = tree_unflatten(tree, args[num_consts:]) - out = solve(f, initial_guess) + num_consts, jaxpr, solve, _ = split_dict( + kwargs, ['num_consts', 'jaxpr', 'solve', 'tangent_solve']) + params, initial_guess = split_list(args, [num_consts]) + f = partial(core.jaxpr_as_fun(jaxpr), *params) + return solve(f, *initial_guess) - out_flat, out_tree = tree_flatten(out) - if out_tree != tree: - raise TypeError( - "solve() output pytree structure must match initial_guess, got {} and {}" - .format(out_tree, tree)) - return out_flat - - -def _root_jvp( - primals, tangents, tree, num_consts, jaxpr, solve, tangent_solve): +def _root_jvp(primals, tangents, num_consts, jaxpr, solve, tangent_solve): params = primals[:num_consts] - solution = tuple( - root_p.bind(*primals, tree=tree, num_consts=num_consts, - jaxpr=jaxpr, solve=solve, tangent_solve=tangent_solve) - ) - + solution = tuple(root_p.bind(*primals, num_consts=num_consts, jaxpr=jaxpr, + solve=solve, tangent_solve=tangent_solve)) params_dot = tangents[:num_consts] # F(m, u) = 0 # system of equations in u, parameterized by m @@ -944,28 +963,16 @@ def _root_jvp( # # ∂ u*(m)[v] = - (∂_1 F(m, u*(m)))^{-1} [∂_0 F(m, u*(m))[v]] # jvp - unchecked_zeros, f_jvp = api.linearize( - core.jaxpr_as_fun(jaxpr), *(params + solution) - ) - - params_zeros = tuple(_map(ad_util.zeros_like_jaxval, params)) - solution_zeros = tuple(_map(ad_util.zeros_like_jaxval, solution)) + f = core.jaxpr_as_fun(jaxpr) + f_fixed_params = lambda *solution: f(*(params + solution)) + f_fixed_solution = lambda *params: f(*(params + solution)) - f_linearized_at_solution = partial( - apply_flat_fun_nokwargs, partial(f_jvp, *params_zeros), (tree, tree), - ) - rhs = tree_unflatten(tree, f_jvp(*(params_dot + solution_zeros))) - solution_dot = tree_map( - operator.neg, tangent_solve(f_linearized_at_solution, rhs) - ) + _, rhs = ad.jvp(lu.wrap_init(f_fixed_solution)).call_wrapped(params, params_dot) + _, f_jvp_wrt_solution = api.linearize(f_fixed_params, *solution) + solution_dot = [-x for x in tangent_solve(f_jvp_wrt_solution, *rhs)] - solution_dot_flat, out_tree = tree_flatten(solution_dot) - if out_tree != tree: - raise TypeError( - "tangent_solve() output pytree structure must match initial_guess, " - "got {} and {}".format(out_tree, tree)) + return solution, solution_dot - return solution, solution_dot_flat def _root_batch(args, dims, **params): return batching.batch_fun(lu.wrap_init(_root_impl, params), args, dims) From 5201c36348a2bf7a229f387e707ede767ed3a39d Mon Sep 17 00:00:00 2001 From: Fabian Pedregosa Date: Thu, 3 Oct 2019 20:20:50 -0400 Subject: [PATCH 0155/1053] Typo: Gradeints -> Gradients --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c16c1b8c607..485c5a05395b 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ And for a deeper dive into JAX: - [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/autodiff_cookbook.ipynb) - [Directly using XLA in Python](https://colab.research.google.com/github/google/jax/blob/master/notebooks/XLA_in_Python.ipynb) - [MAML Tutorial with JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/maml.ipynb) -- [Generative Modeling by Estimating Gradeints of Data Distribution in JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb). +- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb). ## Installation JAX is written in pure Python, but it depends on XLA, which needs to be compiled From 59343b1a23bfc5445287744b1f7df89e6f5f1011 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Thu, 3 Oct 2019 17:56:25 -0700 Subject: [PATCH 0156/1053] provide lax primitive + src line as XLA debuginfo --- jax/core.py | 39 +++++++++++++++++++++------------------ jax/interpreters/xla.py | 14 +++++++++++++- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/jax/core.py b/jax/core.py index aa14c94a96c5..5d4539500694 100644 --- a/jax/core.py +++ b/jax/core.py @@ -85,6 +85,8 @@ def new_jaxpr_eqn(*args): JaxprEqn = namedtuple('JaxprEqn', ['eqn_id', 'invars', 'outvars', 'primitive', 'bound_subjaxprs', 'params']) +JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn)) + class Literal(object): __slots__ = ["val", "hash"] @@ -616,26 +618,27 @@ def write_env(env, v): map(read, jaxpr.outvars) -def pp_jaxpr(jaxpr): - def print_vars(vs): +def pp_vars(vs): return ' '.join(map(str, vs)) - def pp_eqn(eqn): - lhs = print_vars(eqn.outvars) - pp_subexpr = pp('') - if eqn.bound_subjaxprs: - for subjaxpr, const_vars, bound_vars in eqn.bound_subjaxprs: - pp_subexpr = pp_subexpr + ( - pp_jaxpr(subjaxpr).indent(2) - >> pp(' [ {} ; {} ]'.format(print_vars(const_vars), - print_vars(bound_vars)))) - return (pp('{} = '.format(lhs)) >> - pp(eqn.primitive.name) >> pp_kv_pairs(eqn.params.items()) - >> pp(' ') >> pp(print_vars(eqn.invars))) + pp_subexpr - - return (pp('{{ lambda {} ; {} ; {}.'.format(print_vars(jaxpr.constvars), - print_vars(jaxpr.freevars), - print_vars(jaxpr.invars))) + +def pp_eqn(eqn): + lhs = pp_vars(eqn.outvars) + pp_subexpr = pp('') + if eqn.bound_subjaxprs: + for subjaxpr, const_vars, bound_vars in eqn.bound_subjaxprs: + pp_subexpr = pp_subexpr + ( + pp_jaxpr(subjaxpr).indent(2) + >> pp(' [ {} ; {} ]'.format(pp_vars(const_vars), + pp_vars(bound_vars)))) + return (pp('{} = '.format(lhs)) >> + pp(eqn.primitive.name) >> pp_kv_pairs(eqn.params.items()) + >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr + +def pp_jaxpr(jaxpr): + + return (pp('{{ lambda {} ; {} ; {}.'.format(pp_vars(jaxpr.constvars), + pp_vars(jaxpr.freevars), + pp_vars(jaxpr.invars))) + ((pp('let ') >> vcat(map(pp_eqn, jaxpr.eqns))) + pp('in {} }}'.format(jaxpr.outvars))).indent(2)) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 5f5bde37bd15..af9f4e20d098 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -142,7 +142,12 @@ def xla_primitive_callable(prim, *abstract_args, **params): def primitive_computation(prim, *xla_shapes, **params): backend = params.get('backend', None) new_params = {k: params[k] for k in params if k != 'backend'} - c = xb.make_computation_builder("primitive_computation") # TODO(name) + c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) + c.SetOpMetadata(xc.CurrentSourceInfoMetadata( + op_type=prim.name, + op_name=prim.name, + skip_frames=6 + )) platform = xb.get_backend(backend).platform xla_args = map(c.ParameterWithShape, xla_shapes) if prim in backend_specific_translations[platform]: @@ -159,6 +164,7 @@ def primitive_computation(prim, *xla_shapes, **params): rule(c, AxisEnv(), *xla_args, backend=backend, **new_params) # side-effect on c else: raise NotImplementedError("XLA translation rule for {} not found".format(prim)) + c.ClearOpMetadata() try: return c.Build() except RuntimeError as e: @@ -273,6 +279,11 @@ def write(v, node): _map(write, jaxpr.freevars, freevars) _map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: + c.SetOpMetadata(xc.CurrentSourceInfoMetadata( + op_type=eqn.primitive.name, + op_name=str(eqn), + skip_frames=10 + )) in_nodes = list(map(read, eqn.invars)) if eqn.primitive in backend_specific_translations[platform]: rule = backend_specific_translations[platform][eqn.primitive] @@ -306,6 +317,7 @@ def write(v, node): c.GetShape(ans) # force xla to do shape error checking out_nodes = xla_destructure(c, ans) if eqn.primitive.multiple_results else [ans] + c.ClearOpMetadata() _map(write, eqn.outvars, out_nodes) return _map(read, jaxpr.outvars) From f20521326b39ff34c8c65d38464c39a658ab42a5 Mon Sep 17 00:00:00 2001 From: Dan Weaver Date: Thu, 3 Oct 2019 23:43:34 -0700 Subject: [PATCH 0157/1053] Fix typo in initial_step_size d2 calculation (#1428) --- jax/experimental/ode.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index 52f8bb6d0edb..b004e010d263 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -122,9 +122,9 @@ def initial_step_size(fun, t0, y0, order, rtol, atol, f0): y1 = y0 + h0 * f0 f1 = fun(y1, t0 + h0) - d2 = (np.linalg.norm(f1 - f0) / scale) / h0 + d2 = np.linalg.norm((f1 - f0) / scale) / h0 - h1 = np.where(np.all(np.asarray([d1 <= 1e-15, d2 < 1e-15])), + h1 = np.where(np.all(np.asarray([d1 <= 1e-15, d2 <= 1e-15])), np.maximum(1e-6, h0 * 1e-3), (0.01 / np.max(d1 + d2))**order_pow) From ef886c7fcc204859eb75ad4291d985a8092501df Mon Sep 17 00:00:00 2001 From: George Necula Date: Fri, 4 Oct 2019 11:56:06 +0200 Subject: [PATCH 0158/1053] Update docs/notebooks/How_JAX_primitives_work.ipynb Co-Authored-By: James Bradbury --- docs/notebooks/How_JAX_primitives_work.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 26d9da17c336..13597f0289cd 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -1515,7 +1515,7 @@ "colab_type": "text" }, "source": [ - "We need to tell JAX how to evaluate the batched version of the primitive. In this particular case, the `multiply_add_prim` already operates pointwise for any dimension of input vectors. So the batched version can use the same `multiple_add_prim` implementation." + "We need to tell JAX how to evaluate the batched version of the primitive. In this particular case, the `multiply_add_prim` already operates pointwise for any dimension of input vectors. So the batched version can use the same `multiply_add_prim` implementation." ] }, { @@ -1648,4 +1648,4 @@ ] } ] -} \ No newline at end of file +} From 73144fafb546d8bc7c2b3e14d549d8bfb3a0f507 Mon Sep 17 00:00:00 2001 From: George Necula Date: Fri, 4 Oct 2019 11:58:07 +0200 Subject: [PATCH 0159/1053] Update docs/notebooks/How_JAX_primitives_work.ipynb Co-Authored-By: James Bradbury --- docs/notebooks/How_JAX_primitives_work.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 13597f0289cd..d13b20da172b 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -305,7 +305,7 @@ "source": [ "## Defining new JAX primitives\n", "\n", - "The right way to add support for multiple-add is in terms of existing\n", + "The right way to add support for multiply-add is in terms of existing\n", "JAX primitives, as shown above. However, in order to demonstrate how JAX\n", "primitives work let us pretend that we want to add a new primitive to \n", "JAX for the multiply-add functionality." From d344c6f5e47eeea245fc0b3b48555e86ded70965 Mon Sep 17 00:00:00 2001 From: Alex Eftimiades Date: Fri, 4 Oct 2019 09:57:17 -0400 Subject: [PATCH 0160/1053] Update jax/random.py Fix typo Co-Authored-By: James Bradbury --- jax/random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index cc0f86979f63..3dd8c5e41a1b 100644 --- a/jax/random.py +++ b/jax/random.py @@ -429,7 +429,7 @@ def _multivariate_normal(key, mean, cov, shape, dtype): Args: key: a PRNGKey used as the random key. - mean: optional, a scalar or array of mean values along each diminsion + mean: optional, a scalar or array of mean values along each dimension cov: optional, a scalar (isotropic), vector (diagonal covariance matrix), or full covariance matrix shape: optional, a tuple of nonnegative integers representing the shape. From c4e4199508aa899d79975ed0f05cee27c495e7c8 Mon Sep 17 00:00:00 2001 From: George Necula Date: Fri, 4 Oct 2019 17:38:36 +0200 Subject: [PATCH 0161/1053] Fix typo in notebook JSON (#1441) Perhaps this is the reason why readthedocs does not show the link to the notebook? --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 657f48bbd459..817826dadb8c 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -133,7 +133,7 @@ "id": "2AxeCufq4wAp", "outputId": "7013374b-041f-4270-db19-cfb4ab992f52", "tags": [ - "raises-exception", + "raises-exception" ] }, "outputs": [ From 4e6385f8a64d426addf7f5f7db5632f7b7cbfe79 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Fri, 4 Oct 2019 11:59:06 -0700 Subject: [PATCH 0162/1053] remove source lines (caching makes them ~useless) --- jax/core.py | 3 +-- jax/interpreters/xla.py | 13 +++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jax/core.py b/jax/core.py index 5d4539500694..7aa58d050c79 100644 --- a/jax/core.py +++ b/jax/core.py @@ -85,7 +85,7 @@ def new_jaxpr_eqn(*args): JaxprEqn = namedtuple('JaxprEqn', ['eqn_id', 'invars', 'outvars', 'primitive', 'bound_subjaxprs', 'params']) -JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn)) +JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn))[:-1] class Literal(object): __slots__ = ["val", "hash"] @@ -635,7 +635,6 @@ def pp_eqn(eqn): >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr def pp_jaxpr(jaxpr): - return (pp('{{ lambda {} ; {} ; {}.'.format(pp_vars(jaxpr.constvars), pp_vars(jaxpr.freevars), pp_vars(jaxpr.invars))) + diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index af9f4e20d098..088aec6d1295 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -143,10 +143,12 @@ def primitive_computation(prim, *xla_shapes, **params): backend = params.get('backend', None) new_params = {k: params[k] for k in params if k != 'backend'} c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) - c.SetOpMetadata(xc.CurrentSourceInfoMetadata( + c.SetOpMetadata(xc.OpMetadata( op_type=prim.name, - op_name=prim.name, - skip_frames=6 + op_name=str(core.new_jaxpr_eqn( + [chr(ord('a') + i) for i in range(len(xla_shapes))], + [chr(ord('a') + len(xla_shapes))], + prim, (), params)) )) platform = xb.get_backend(backend).platform xla_args = map(c.ParameterWithShape, xla_shapes) @@ -279,10 +281,9 @@ def write(v, node): _map(write, jaxpr.freevars, freevars) _map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: - c.SetOpMetadata(xc.CurrentSourceInfoMetadata( + c.SetOpMetadata(xc.OpMetadata( op_type=eqn.primitive.name, - op_name=str(eqn), - skip_frames=10 + op_name=str(eqn) )) in_nodes = list(map(read, eqn.invars)) if eqn.primitive in backend_specific_translations[platform]: From a0bb2c0ea452975be76e0ba2c6055f5be4439aa3 Mon Sep 17 00:00:00 2001 From: joao guilherme Date: Fri, 4 Oct 2019 22:19:31 -0300 Subject: [PATCH 0163/1053] Add a pylintrc to make it easier to use linter (#1442) --- jax/numpy/lax_numpy.py | 4 +--- pylintrc | 46 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 pylintrc diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ee5ffadee305..3281b7b40e35 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -103,13 +103,11 @@ def __instancecheck__(self, instance): except AttributeError: return isinstance(instance, _arraylike_types) -# pylint: disable=invalid-name class ndarray(six.with_metaclass(_ArrayMeta, onp.ndarray)): def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, order=None): raise TypeError("jax.numpy.ndarray() should not be instantiated explicitly." " Use jax.numpy.array, or jax.numpy.zeros instead.") -# pylint: enable=invalid-name isscalar = onp.isscalar @@ -3142,4 +3140,4 @@ def _unstack(x): if x.ndim == 0: raise ValueError("Argument to _unstack must be non-scalar") return [lax.index_in_dim(x, i, keepdims=False) for i in range(x.shape[0])] -setattr(DeviceArray, "_unstack", _unstack) +setattr(DeviceArray, "_unstack", _unstack) \ No newline at end of file diff --git a/pylintrc b/pylintrc new file mode 100644 index 000000000000..cc63cd2c1da2 --- /dev/null +++ b/pylintrc @@ -0,0 +1,46 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist=numpy + + +[MESSAGES CONTROL] + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=missing-docstring, + too-many-locals, + invalid-name, + redefined-outer-name, + redefined-builtin, + protected-name, + no-else-return, + fixme, + protected-access, + too-many-arguments, + blacklisted-name, + too-few-public-methods, + unnecessary-lambda, + + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[FORMAT] + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=" " \ No newline at end of file From 505caaae5aaeeef76d125f73012e9961c0ebf692 Mon Sep 17 00:00:00 2001 From: joaogui1 Date: Fri, 4 Oct 2019 22:39:35 -0300 Subject: [PATCH 0164/1053] fixed selu --- jax/nn/functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index d035fba5933e..5b67c0f2b173 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -51,7 +51,7 @@ def selu(x): """Scaled exponential linear unit activation""" alpha = 1.6732632423543772848170429916717 scale = 1.0507009873554804934193349852946 - return scale * leaky_relu(x, alpha) + return scale * elu(x, alpha) @jarrett def gelu(x): From 41457633ccf8517c553109627d7a55e03a14ebf4 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 7 Oct 2019 18:07:55 +0200 Subject: [PATCH 0165/1053] Increase readthedocs/nbsphinx timeout It seems tht RTD is timing out when compiling the How_JAX_primitives_work noteboook. --- README.md | 1 + docs/conf.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 485c5a05395b..28f3f2ea9d4b 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ And for a deeper dive into JAX: - [Directly using XLA in Python](https://colab.research.google.com/github/google/jax/blob/master/notebooks/XLA_in_Python.ipynb) - [MAML Tutorial with JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/maml.ipynb) - [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb). +[How JAX primitives work](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/How_JAX_primitives_work.ipynb) ## Installation JAX is written in pure Python, but it depends on XLA, which needs to be compiled diff --git a/docs/conf.py b/docs/conf.py index 46c8b9390869..6200cdd9bee0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -115,7 +115,7 @@ # Controls when a cell will time out (defaults to 30; use -1 for no timeout): -#nbsphinx_timeout = 60 +nbsphinx_timeout = 60 # Default Pygments lexer for syntax highlighting in code cells: #nbsphinx_codecell_lexer = 'ipython3' From f30fc7c626a1c1b05627f3352f61216ddd36cb16 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 7 Oct 2019 16:09:23 -0700 Subject: [PATCH 0166/1053] Add a .readthedocs.yml file I think we need the leading dot for RTD to recognize it. We currently get warnings in our build log: "Configure your documentation builds! Adding a .readthedocs.yml file to your project is the recommended way to configure your documentation builds. You can declare dependencies, set up submodules, and many other great features." --- readthedocs.yml => .readthedocs.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename readthedocs.yml => .readthedocs.yml (100%) diff --git a/readthedocs.yml b/.readthedocs.yml similarity index 100% rename from readthedocs.yml rename to .readthedocs.yml From cd29780fe68f1b096f21f4f3b8d4fb3b2785c0e4 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Mon, 7 Oct 2019 16:55:17 -0700 Subject: [PATCH 0167/1053] minor README formatting and grammar adjustment --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 485c5a05395b..f486376f1298 100644 --- a/README.md +++ b/README.md @@ -340,10 +340,10 @@ Because `jit` aims to specialize Python functions only on shapes and dtypes during tracing, rather than on concrete values, Python control flow that depends on concrete values won’t be able to execute and will instead raise an error. If you want compiled control flow, use structured control flow primitives like -lax.cond and lax.while_loop. Some indexing features, like slice-based indexing -`A[i:i+5]` for argument-dependent `i`, or boolean-based indexing `A[bool_ind]` -for argument-dependent `bool_ind`, produce abstract values of unknown shape and -are thus unsupported in `jit` functions. +`lax.cond` and `lax.while_loop`. Some indexing features, like slice-based +indexing, e.g. `A[i:i+5]` for argument-dependent `i`, or boolean-based indexing, +e.g. `A[bool_ind]` for argument-dependent `bool_ind`, produce abstract values of +unknown shape and are thus unsupported in `jit` functions. In general, JAX is intended to be used with a functional style of Python programming. Functions passed to transformations like `grad` and `jit` are From b7335be27d02d2243b3d63cd8701fc6881cf2776 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 7 Oct 2019 16:57:00 -0700 Subject: [PATCH 0168/1053] update to version 2 schema --- .readthedocs.yml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index dbdb739f2b3b..c97d251a5d62 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,7 +1,20 @@ -build: - image: latest +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details -python: - version: 3.6 +# Required +version: 2 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/conf.py -requirements_file: docs/requirements.txt +# Optionally build your docs in additional formats such as PDF and ePub +formats: + - htmlzip + +# Optionally set the version of Python and requirements required to build your docs +python: + version: 3.7 + install: + - requirements: docs/requirements.txt From d3fa506ed0742318155155ea37055daf7c032aa2 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 8 Oct 2019 09:38:32 -0700 Subject: [PATCH 0169/1053] Bump jaxlib version to 0.1.31 and update WORKSPACE. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7709e621efbb..17fe767ce231 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "b313eee4b585821bd2a9b15b9fa858a87d6f581635d433ccf30161d1d74427d9", - strip_prefix = "tensorflow-b1c0035cc1c3536698506460e5ab328aa84fefb1", + sha256 = "0b32b9238d6c0a3e51ccef6898a1f03d2798556911070f9783d4c5bf2841c7b3", + strip_prefix = "tensorflow-0477de84487e970554cc974e42b55ba4e597afa5", urls = [ - "https://github.com/tensorflow/tensorflow/archive/b1c0035cc1c3536698506460e5ab328aa84fefb1.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/0477de84487e970554cc974e42b55ba4e597afa5.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index 2edefb338cbe..87aed6c83ea4 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.30" +__version__ = "0.1.31" From 59ae24e87459429f18b0acb6626a1fb3465c41c8 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 8 Oct 2019 09:57:21 -0700 Subject: [PATCH 0170/1053] Remove build_mac_jaxlib.yml for now to see if that's causing spurious workflows. --- .github/workflows/build_mac_jaxlib.yml | 34 -------------------------- 1 file changed, 34 deletions(-) delete mode 100644 .github/workflows/build_mac_jaxlib.yml diff --git a/.github/workflows/build_mac_jaxlib.yml b/.github/workflows/build_mac_jaxlib.yml deleted file mode 100644 index 8a9a6c1e32c9..000000000000 --- a/.github/workflows/build_mac_jaxlib.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Python package - -on: - push: - tags: - - workflow_test - -jobs: - build: - - runs-on: macOS-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 - with: - python-version: 2.7 - - uses: actions/setup-python@v1 - with: - python-version: 3.5 - - uses: actions/setup-python@v1 - with: - python-version: 3.6 - - uses: actions/setup-python@v1 - with: - python-version: 3.7 - - run: brew install pyenv - - run: brew install pyenv-virtualenv - - - run: build/build_jaxlib_wheels_macos.sh - - - uses: actions/upload-artifact@master - with: - name: wheels - path: build/dist/ From bc0e79767b94dd5d82091cdf9402e9388a1429d6 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 8 Oct 2019 10:57:36 -0700 Subject: [PATCH 0171/1053] fix XLA metadata for primitives with many args --- jax/core.py | 20 ++++++++++++++++++++ jax/interpreters/partial_eval.py | 21 +-------------------- jax/interpreters/xla.py | 5 +++-- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/jax/core.py b/jax/core.py index 7aa58d050c79..f189b54d1888 100644 --- a/jax/core.py +++ b/jax/core.py @@ -19,6 +19,7 @@ from operator import attrgetter from contextlib import contextmanager from collections import namedtuple, Counter, defaultdict +import itertools as it from weakref import ref import threading import types @@ -87,6 +88,25 @@ def new_jaxpr_eqn(*args): JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn))[:-1] +class Var(object): + def __init__(self, count, suffix): + self.count = count + self.suffix = suffix + + def __repr__(self): + rem = self.count + s = '' + while True: + rem, i = rem // 26, rem % 26 + s = chr(97 + i % 26) + s + if not rem: + break + return s + self.suffix + +def gensym(suffix): + counter = it.count() + return lambda: Var(next(counter), suffix) + class Literal(object): __slots__ = ["val", "hash"] diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 63bcb71cdcd9..f2d00f9b4e7e 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -382,7 +382,7 @@ def eqn_tracer_to_var(var, eqn): def tracers_to_jaxpr(in_tracers, out_tracers): - newvar = gensym('') + newvar = core.gensym('') t_to_var = defaultdict(newvar) var = lambda t: t_to_var[id(t)] sorted_tracers = toposort(out_tracers) @@ -421,25 +421,6 @@ def tracers_to_jaxpr(in_tracers, out_tracers): return jaxpr, const_vals, env_vals -def gensym(suffix): - counter = it.count() - return lambda: Var(next(counter), suffix) - -class Var(object): - def __init__(self, count, suffix): - self.count = count - self.suffix = suffix - - def __repr__(self): - rem = self.count - s = '' - while True: - rem, i = rem // 26, rem % 26 - s = chr(97 + i % 26) + s - if not rem: - break - return s + self.suffix - def eqn_parents(eqn): subjaxpr_tracers = [it.chain(c, f) for _, c, f in eqn.bound_subjaxprs] return list(it.chain(eqn.invars, *subjaxpr_tracers)) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 088aec6d1295..b65652e92ad5 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -143,11 +143,12 @@ def primitive_computation(prim, *xla_shapes, **params): backend = params.get('backend', None) new_params = {k: params[k] for k in params if k != 'backend'} c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) + newvar = core.gensym('') c.SetOpMetadata(xc.OpMetadata( op_type=prim.name, op_name=str(core.new_jaxpr_eqn( - [chr(ord('a') + i) for i in range(len(xla_shapes))], - [chr(ord('a') + len(xla_shapes))], + [newvar() for i in range(len(xla_shapes))], + [newvar()], prim, (), params)) )) platform = xb.get_backend(backend).platform From 245d29b40d77bdb5fefcb596251f316dfcdead93 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 8 Oct 2019 11:08:42 -0700 Subject: [PATCH 0172/1053] add test for the case that failed --- tests/lax_control_flow_test.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index cae6429af2e9..2bdb5fa2a614 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -72,6 +72,17 @@ def loop(init): self.assertEqual(cloop(2), limit - 2) self.assertEqual(cloop(3), limit - 3) + def testWhileWithManyArgs(self): + nargs = 256 + + def loop_cond(state): + return lax.lt(state[0], 2) + + def loop_body(state): + return tuple(lax.add(s, 1) for s in state) + + _ = lax.while_loop(loop_cond, loop_body, (0,) * nargs) + def testNestedWhile(self): def outer_loop(num): # pylint: disable=missing-docstring From 62b459d1ac222de77528b2333c978cae2b983c00 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 8 Oct 2019 16:09:50 -0400 Subject: [PATCH 0173/1053] Use the XLA HLO implementation of symmetric Eigendecomposition as a fallback for backends that don't have a custom kernel. --- jax/lax_linalg.py | 14 +++++++++++--- tests/linalg_test.py | 25 +++++++++++++------------ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index a36335d211e4..7668e28e6e09 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -35,6 +35,7 @@ from jax.lax import (standard_primitive, standard_unop, binop_dtype_rule, _float, _complex, _input_dtype, _broadcasting_select) from jax.lib import xla_bridge as xb +from jax.lib import xla_client from jax.lib import lapack from jax.lib import cusolver @@ -211,8 +212,14 @@ def eigh_impl(operand, lower): return v, w def eigh_translation_rule(c, operand, lower): - raise NotImplementedError( - "Symmetric eigendecomposition is only implemented on the CPU and GPU backends") + shape = c.GetShape(operand) + dims = shape.dimensions() + if dims[-1] == 0: + return c.Tuple(operand, c.Reshape(operand, None, dims[:-1])) + if not lower: + n = len(dims) + operand = c.Transpose(operand, list(range(n - 2)) + [n - 1, n - 2]) + return c.Eigh(operand) def eigh_abstract_eval(operand, lower): if isinstance(operand, ShapedArray): @@ -281,6 +288,7 @@ def eigh_batching_rule(batched_args, batch_dims, lower): eigh_p.def_abstract_eval(eigh_abstract_eval) xla.translations[eigh_p] = eigh_translation_rule ad.primitive_jvps[eigh_p] = eigh_jvp_rule +batching.primitive_batchers[eigh_p] = eigh_batching_rule _cpu_syevd = lapack.syevd @@ -289,7 +297,7 @@ def eigh_batching_rule(batched_args, batch_dims, lower): xla.backend_specific_translations['gpu'][eigh_p] = partial( _eigh_cpu_gpu_translation_rule, cusolver.syevd) -batching.primitive_batchers[eigh_p] = eigh_batching_rule + diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 461458e1efe3..6a3c39cd9a17 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -189,11 +189,14 @@ def testEigBatching(self, shape, dtype, rng): for dtype in float_types + complex_types for lower in [False, True] for rng in [jtu.rand_default()])) - # TODO(phawkins): enable when there is an eigendecomposition implementation - # for TPU. - @jtu.skip_on_devices("tpu") def testEigh(self, n, dtype, lower, rng): _skip_if_unsupported_type(dtype) + tol = 30 + if jtu.device_under_test() == "tpu": + if onp.issubdtype(dtype, onp.complexfloating): + raise unittest.SkipTest("No complex eigh on TPU") + # TODO(phawkins): this tolerance is unpleasantly high. + tol = 1500 args_maker = lambda: [rng((n, n), dtype)] uplo = "L" if lower else "U" @@ -208,7 +211,7 @@ def norm(x): w, v = np.linalg.eigh(onp.tril(a) if lower else onp.triu(a), UPLO=uplo, symmetrize_input=False) self.assertTrue(norm(onp.eye(n) - onp.matmul(onp.conj(T(v)), v)) < 5) - self.assertTrue(norm(onp.matmul(a, v) - w * v) < 30) + self.assertTrue(norm(onp.matmul(a, v) - w * v) < tol) self._CompileAndCheck(partial(np.linalg.eigh, UPLO=uplo), args_maker, check_dtypes=True, rtol=1e-3) @@ -222,9 +225,6 @@ def norm(x): for dtype in float_types + complex_types for rng in [jtu.rand_default()] for lower in [True, False])) - # TODO(phawkins): enable when there is an eigendecomposition implementation - # for TPU. - @jtu.skip_on_devices("tpu") def testEighGrad(self, shape, dtype, rng, lower): self.skipTest("Test fails with numeric errors.") uplo = "L" if lower else "U" @@ -250,8 +250,8 @@ def testEighGrad(self, shape, dtype, rng, lower): for rng in [jtu.rand_default()] for lower in [True, False] for eps in [1e-4])) - # TODO(phawkins): enable when there is an eigendecomposition implementation - # for TPU. + # TODO(phawkins): enable when there is a complex eigendecomposition + # implementation for TPU. @jtu.skip_on_devices("tpu") def testEighGradVectorComplex(self, shape, dtype, rng, lower, eps): _skip_if_unsupported_type(dtype) @@ -290,9 +290,11 @@ def testEighGradVectorComplex(self, shape, dtype, rng, lower, eps): for shape in [(1, 1), (4, 4), (5, 5)] for dtype in float_types + complex_types for rng in [jtu.rand_default()])) - @jtu.skip_on_devices("tpu") def testEighBatching(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) + if (jtu.device_under_test() == "tpu" and + onp.issubdtype(dtype, onp.complexfloating)): + raise unittest.SkipTest("No complex eigh on TPU") shape = (10,) + shape args = rng(shape, dtype) args = (args + onp.conj(T(args))) / 2 @@ -517,7 +519,7 @@ def args_maker(): self._CompileAndCheck(np.linalg.inv, args_maker, check_dtypes=True) # Regression test for incorrect type for eigenvalues of a complex matrix. - @jtu.skip_on_devices("tpu") # TODO(phawkins): No eigh implementation on TPU. + @jtu.skip_on_devices("tpu") # TODO(phawkins): No complex eigh implementation on TPU. def testIssue669(self): def test(x): val, vec = np.linalg.eigh(x) @@ -538,7 +540,6 @@ def testIssue1151(self): jac0 = jax.jacobian(np.linalg.solve, argnums=0)(A[0], b[0]) jac1 = jax.jacobian(np.linalg.solve, argnums=1)(A[0], b[0]) - @jtu.skip_on_devices("tpu") # TODO(phawkins): No eigh implementation on TPU. def testIssue1383(self): seed = jax.random.PRNGKey(0) tmp = jax.random.uniform(seed, (2,2)) From 2308d0f29f9d4f5d7c15de5a7dec628ba90333ad Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 8 Oct 2019 14:20:40 -0700 Subject: [PATCH 0174/1053] Revert "Remove build_mac_jaxlib.yml for now to see if that's causing spurious workflows." This reverts commit 59ae24e87459429f18b0acb6626a1fb3465c41c8. --- .github/workflows/build_mac_jaxlib.yml | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/build_mac_jaxlib.yml diff --git a/.github/workflows/build_mac_jaxlib.yml b/.github/workflows/build_mac_jaxlib.yml new file mode 100644 index 000000000000..8a9a6c1e32c9 --- /dev/null +++ b/.github/workflows/build_mac_jaxlib.yml @@ -0,0 +1,34 @@ +name: Python package + +on: + push: + tags: + - workflow_test + +jobs: + build: + + runs-on: macOS-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-python@v1 + with: + python-version: 2.7 + - uses: actions/setup-python@v1 + with: + python-version: 3.5 + - uses: actions/setup-python@v1 + with: + python-version: 3.6 + - uses: actions/setup-python@v1 + with: + python-version: 3.7 + - run: brew install pyenv + - run: brew install pyenv-virtualenv + + - run: build/build_jaxlib_wheels_macos.sh + + - uses: actions/upload-artifact@master + with: + name: wheels + path: build/dist/ From 54807b42addba538cb0c1f18d7a5c2d08a952821 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 8 Oct 2019 14:28:14 -0700 Subject: [PATCH 0175/1053] Revert "Add a pylintrc to make it easier to use linter (#1442)" This reverts commit a0bb2c0ea452975be76e0ba2c6055f5be4439aa3. Temporarily reverting this to see if it's causing the github workflow failures. --- jax/numpy/lax_numpy.py | 4 +++- pylintrc | 46 ------------------------------------------ 2 files changed, 3 insertions(+), 47 deletions(-) delete mode 100644 pylintrc diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 3281b7b40e35..ee5ffadee305 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -103,11 +103,13 @@ def __instancecheck__(self, instance): except AttributeError: return isinstance(instance, _arraylike_types) +# pylint: disable=invalid-name class ndarray(six.with_metaclass(_ArrayMeta, onp.ndarray)): def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, order=None): raise TypeError("jax.numpy.ndarray() should not be instantiated explicitly." " Use jax.numpy.array, or jax.numpy.zeros instead.") +# pylint: enable=invalid-name isscalar = onp.isscalar @@ -3140,4 +3142,4 @@ def _unstack(x): if x.ndim == 0: raise ValueError("Argument to _unstack must be non-scalar") return [lax.index_in_dim(x, i, keepdims=False) for i in range(x.shape[0])] -setattr(DeviceArray, "_unstack", _unstack) \ No newline at end of file +setattr(DeviceArray, "_unstack", _unstack) diff --git a/pylintrc b/pylintrc deleted file mode 100644 index cc63cd2c1da2..000000000000 --- a/pylintrc +++ /dev/null @@ -1,46 +0,0 @@ -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code -extension-pkg-whitelist=numpy - - -[MESSAGES CONTROL] - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -disable=missing-docstring, - too-many-locals, - invalid-name, - redefined-outer-name, - redefined-builtin, - protected-name, - no-else-return, - fixme, - protected-access, - too-many-arguments, - blacklisted-name, - too-few-public-methods, - unnecessary-lambda, - - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[FORMAT] - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=" " \ No newline at end of file From d99851af34f3f3ecf2373716420b8ed3a2062438 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 8 Oct 2019 14:39:36 -0700 Subject: [PATCH 0176/1053] Revert "Revert "Add a pylintrc to make it easier to use linter (#1442)"" This reverts commit 54807b42addba538cb0c1f18d7a5c2d08a952821. --- jax/numpy/lax_numpy.py | 4 +--- pylintrc | 46 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 pylintrc diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ee5ffadee305..3281b7b40e35 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -103,13 +103,11 @@ def __instancecheck__(self, instance): except AttributeError: return isinstance(instance, _arraylike_types) -# pylint: disable=invalid-name class ndarray(six.with_metaclass(_ArrayMeta, onp.ndarray)): def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, order=None): raise TypeError("jax.numpy.ndarray() should not be instantiated explicitly." " Use jax.numpy.array, or jax.numpy.zeros instead.") -# pylint: enable=invalid-name isscalar = onp.isscalar @@ -3142,4 +3140,4 @@ def _unstack(x): if x.ndim == 0: raise ValueError("Argument to _unstack must be non-scalar") return [lax.index_in_dim(x, i, keepdims=False) for i in range(x.shape[0])] -setattr(DeviceArray, "_unstack", _unstack) +setattr(DeviceArray, "_unstack", _unstack) \ No newline at end of file diff --git a/pylintrc b/pylintrc new file mode 100644 index 000000000000..cc63cd2c1da2 --- /dev/null +++ b/pylintrc @@ -0,0 +1,46 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist=numpy + + +[MESSAGES CONTROL] + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=missing-docstring, + too-many-locals, + invalid-name, + redefined-outer-name, + redefined-builtin, + protected-name, + no-else-return, + fixme, + protected-access, + too-many-arguments, + blacklisted-name, + too-few-public-methods, + unnecessary-lambda, + + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[FORMAT] + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=" " \ No newline at end of file From 1c731df878346dcc4954267f5d0a7f97384a616d Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 8 Oct 2019 14:40:51 -0700 Subject: [PATCH 0177/1053] Remove build_mac_jaxlib.yml again as it seems to cause workflow failures. --- .github/workflows/build_mac_jaxlib.yml | 34 -------------------------- 1 file changed, 34 deletions(-) delete mode 100644 .github/workflows/build_mac_jaxlib.yml diff --git a/.github/workflows/build_mac_jaxlib.yml b/.github/workflows/build_mac_jaxlib.yml deleted file mode 100644 index 8a9a6c1e32c9..000000000000 --- a/.github/workflows/build_mac_jaxlib.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Python package - -on: - push: - tags: - - workflow_test - -jobs: - build: - - runs-on: macOS-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 - with: - python-version: 2.7 - - uses: actions/setup-python@v1 - with: - python-version: 3.5 - - uses: actions/setup-python@v1 - with: - python-version: 3.6 - - uses: actions/setup-python@v1 - with: - python-version: 3.7 - - run: brew install pyenv - - run: brew install pyenv-virtualenv - - - run: build/build_jaxlib_wheels_macos.sh - - - uses: actions/upload-artifact@master - with: - name: wheels - path: build/dist/ From 658882513e4736554a07388c2f13e4d03d60b656 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 8 Oct 2019 13:06:43 -0700 Subject: [PATCH 0178/1053] avoid more transposes in dot_general batch rule --- jax/lax/lax.py | 21 ++++++++++++++++----- tests/batching_test.py | 10 +++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 785281658238..b67baa636ee3 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2268,14 +2268,25 @@ def _dot_general_batch_rule(batched_args, batch_dims, dimension_numbers, else: # adding a tensor product dimension if lbd is not None: - # make sure it's the last lhs dimension to avoid changing batch dims - if lbd != lhs.ndim - 1: + if lhs_batch == () or lbd > onp.max(lhs_batch): + # can avoid transposes + bump_lhs_contract = onp.greater_equal(lhs_contract, lbd) + lhs_contract = tuple(onp.add(lhs_contract, bump_lhs_contract)) + result_batch_dim = lbd - len(lhs_contract) + sum(bump_lhs_contract) + else: + # move the new dimension to the end of lhs to avoid changing batch dims lhs = batching.moveaxis(lhs, lbd, lhs.ndim - 1) # lhs tensor product dims in result come after batch dims result_batch_dim = lhs.ndim - len(lhs_contract) - 1 else: - # make sure it's the last rhs dimension to avoid changing batch dims - if rbd != rhs.ndim - 1: + if rhs_batch == () or rbd > onp.max(rhs_batch): + # can avoid transposes + bump_rhs_contract = onp.greater_equal(rhs_contract, rbd) + rhs_contract = tuple(onp.add(rhs_contract, bump_rhs_contract)) + result_batch_dim = (rbd + (lhs.ndim - len(lhs_contract) - len(lhs_batch)) + - (len(rhs_contract) - sum(bump_rhs_contract))) + else: + # move the new dimension to the end of rhs to avoid changing batch dims rhs = batching.moveaxis(rhs, rbd, rhs.ndim - 1) # rhs tensor product dims in result come after batch dims + lhs tensor # product dims @@ -2284,7 +2295,7 @@ def _dot_general_batch_rule(batched_args, batch_dims, dimension_numbers, new_dimension_numbers = [(lhs_contract, rhs_contract), (lhs_batch, rhs_batch)] batched_out = dot_general(lhs, rhs, new_dimension_numbers, precision=precision) - return batched_out, result_batch_dim + return batched_out, int(result_batch_dim) def _dot_general_translation_rule(c, lhs, rhs, dimension_numbers, precision): return c.DotGeneral(lhs, rhs, dimension_numbers, diff --git a/tests/batching_test.py b/tests/batching_test.py index 22bc6ebd6f1c..95cc49df3158 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -233,7 +233,6 @@ def testDotGeneral(self): y = R(3, 10, 5, 6) fun = lambda x, y: lax.dot_general(x, y, [((2,), (1,)), ((0,), (0,))]) ans = vmap(fun, in_axes=(2, 1))(x, y) - fun = lambda x, y: lax.dot_general(x, y, [((2,), (1,)), ((0,), (0,))]) expected = onp.stack([fun(x[..., i, :], y[:, i, ...]) for i in range(10)]) self.assertAllClose(ans, expected, check_dtypes=True) @@ -241,7 +240,6 @@ def testDotGeneral(self): y = R(3, 5, 6) fun = lambda x, y: lax.dot_general(x, y, [((2,), (1,)), ((0,), (0,))]) ans = vmap(fun, in_axes=(3, None))(x, y) - fun = lambda x, y: lax.dot_general(x, y, [((2,), (1,)), ((0,), (0,))]) expected = onp.stack([fun(x[..., i], y) for i in range(10)]) self.assertAllClose(ans, expected, check_dtypes=True) @@ -249,10 +247,16 @@ def testDotGeneral(self): y = R(3, 5, 10, 6) fun = lambda x, y: lax.dot_general(x, y, [((2,), (1,)), ((0,), (0,))]) ans = vmap(fun, in_axes=(None, 2))(x, y) - fun = lambda x, y: lax.dot_general(x, y, [((2,), (1,)), ((0,), (0,))]) expected = onp.stack([fun(x, y[..., i, :]) for i in range(10)]) self.assertAllClose(ans, expected, check_dtypes=True) + x = R(4) + y = R(4, 10) + fun = lambda x, y: lax.dot_general(x, y, [((0,), (0,)), ((), ())]) + ans = vmap(fun, in_axes=(None, 1))(x, y) + expected = onp.stack([fun(x, y[..., i]) for i in range(10)]) + self.assertAllClose(ans, expected, check_dtypes=True) + def testDot(self): # these tests are based on @shoyer's notebook studying gufuncs From 096a52a3a3e50fc8cbc2802997da7fbb0c297eee Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 8 Oct 2019 14:22:51 -0700 Subject: [PATCH 0179/1053] add dot_general masking rules --- jax/lax/lax.py | 43 +++++++++++++++++++++++++++++++++++++++++++ tests/masking_test.py | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index b67baa636ee3..3fcdbbb07c8e 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2301,12 +2301,55 @@ def _dot_general_translation_rule(c, lhs, rhs, dimension_numbers, precision): return c.DotGeneral(lhs, rhs, dimension_numbers, precision_config=_precision_config(precision)) +def _dot_general_polymorphic_shape_rule(shape_exprs, dimension_numbers, + precision): + del precision # Unused. + lhs_shape, rhs_shape = shape_exprs + lhs_ndim, rhs_ndim = len(lhs_shape), len(rhs_shape) + (lhs_contract, rhs_contract), (lhs_batch, rhs_batch) = dimension_numbers + + lhs_batch_shape = [lhs_shape[d] for d in lhs_batch] + rhs_batch_shape = [rhs_shape[d] for d in rhs_batch] + if lhs_batch_shape != rhs_batch_shape: raise ShapeError + + lhs_contract_shape = [lhs_shape[d] for d in lhs_contract] + rhs_contract_shape = [rhs_shape[d] for d in rhs_contract] + if lhs_contract_shape != rhs_contract_shape: raise ShapeError + + lhs_tensorprod_shape = [lhs_shape[d] for d in range(lhs_ndim) + if d not in lhs_batch and d not in lhs_contract] + rhs_tensorprod_shape = [rhs_shape[d] for d in range(rhs_ndim) + if d not in rhs_batch and d not in rhs_contract] + return ShapeExpr( + lhs_batch_shape + lhs_tensorprod_shape + rhs_tensorprod_shape) + +def _dot_general_masking_rule(padded_vals, logical_shapes, dimension_numbers, + precision): + lhs, rhs = padded_vals + lhs_shape, rhs_shape = logical_shapes + lhs_ndim, rhs_ndim = len(lhs_shape), len(rhs_shape) + (lhs_contract, rhs_contract), (lhs_batch, rhs_batch) = dimension_numbers + + # we need only mask the lhs contraction dimensions + if len(lhs_contract) == 0: + return dot_general(lhs, rhs, dimension_numbers, precision=precision) + else: + masks = [broadcasted_iota(onp.int32, lhs.shape, d) < lhs_shape[d] + for d in lhs_contract] + mask_intersection = masks[0] + for mask in masks[1:]: + mask_intersection &= mask + masked_lhs = select(mask_intersection, lhs, zeros_like_array(lhs)) + return dot_general(masked_lhs, rhs, dimension_numbers, precision=precision) + dot_general_p = standard_primitive(_dot_general_shape_rule, _dot_general_dtype_rule, 'dot_general', _dot_general_translation_rule) ad.defbilinear(dot_general_p, _dot_general_transpose_lhs, _dot_general_transpose_rhs) batching.primitive_batchers[dot_general_p] = _dot_general_batch_rule +masking.shape_rules[dot_general_p] = _dot_general_polymorphic_shape_rule +masking.masking_rules[dot_general_p] = _dot_general_masking_rule def _broadcast_shape_rule(operand, sizes): diff --git a/tests/masking_test.py b/tests/masking_test.py index e4c6887abfd7..8e72d3468f7c 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -64,7 +64,7 @@ def matvec(A, b): def thunk(): @shapecheck(['(m, n)', 'n'], 'm') def matvec(A, b): - return np.dot(b, A) + return lax.dot_general(A, b, [((0,), (0,)), ((), ())]) self.assertRaisesRegex(ShapeError, "", thunk) def test_flatten_shape_checking(self): From 6d29c4e3521181b755b5cce522f4589ae390664d Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 8 Oct 2019 14:23:30 -0700 Subject: [PATCH 0180/1053] remove dot primitive in favor of dot_general --- jax/lax/lax.py | 171 +++------------------------------------- jax/lax/lax_parallel.py | 6 -- 2 files changed, 12 insertions(+), 165 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 3fcdbbb07c8e..4ecfc2ada19d 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -508,7 +508,12 @@ def dot(lhs, rhs, precision=None): rhs = broadcast(rhs, (1,)) return reduce(mul(lhs, rhs), _zero(lhs), add, (len(lhs_shape) - 1,)) - return dot_p.bind(lhs, rhs, precision=_canonicalize_precision(precision)) + if 1 <= lhs.ndim <= 2 and 1 <= rhs.ndim <= 2 and lhs.shape[-1] == rhs.shape[0]: + return dot_general(lhs, rhs, (((lhs.ndim - 1,), (0,)), ((), ())), + precision=precision) + else: + raise TypeError("Incompatible shapes for dot: got {} and {}.".format( + lhs.shape, rhs.shape)) def dot_general(lhs, rhs, dimension_numbers, precision=None): """More general contraction operator. @@ -2019,109 +2024,6 @@ def _reshape_axis_out_of(src, size1, x): shape[src:src+1] = [size1, size2] return reshape(x, shape) - -def _dot_shape_rule(lhs, rhs, precision): - if lhs.ndim == 0 or rhs.ndim == 0: - msg = "Dot only supports rank 1 or above, got shapes {} and {}." - raise TypeError(msg.format(lhs.shape, rhs.shape)) - if lhs.ndim > 2 or rhs.ndim > 2: - msg = "Dot only supports rank 2 or less, got shapes {} and {}." - raise TypeError(msg.format(lhs.shape, rhs.shape)) - - def require(shape_cond): - if not shape_cond: - msg = "Incompatible shapes for dot: got {} and {}." - raise TypeError(msg.format(lhs.shape, rhs.shape)) - - if lhs.ndim == rhs.ndim == 1: - require(lhs.shape == rhs.shape) - return () - elif lhs.ndim == rhs.ndim == 2: - require(lhs.shape[1] == rhs.shape[0]) - return (lhs.shape[0], rhs.shape[1]) - elif rhs.ndim == 1: - require(lhs.shape[-1] == rhs.shape[0]) - return lhs.shape[:-1] - else: - require(lhs.shape[-1] == rhs.shape[-2]) - return lhs.shape[:-1] + rhs.shape[:-2] + rhs.shape[-1:] - -def _dot_transpose_lhs(t, rhs, precision): - if onp.ndim(t) == onp.ndim(rhs) == 2: - return dot(t, transpose(rhs, (1, 0)), precision=precision) - elif onp.ndim(t) == 1 and onp.ndim(rhs) == 2: - return dot(rhs, t, precision=precision) - elif onp.ndim(t) == onp.ndim(rhs) == 1: - return _outer(t, rhs) - elif onp.ndim(t) == 0 or onp.ndim(rhs) == 0: - return mul(t, rhs) - else: - raise TypeError - -def _dot_transpose_rhs(t, lhs, precision): - if onp.ndim(lhs) == onp.ndim(t) == 2: - return dot(transpose(lhs, (1, 0)), t) - elif onp.ndim(lhs) == 2 and onp.ndim(t) == 1: - return dot(t, lhs, precision=precision) - elif onp.ndim(t) == onp.ndim(lhs) == 1: - return _outer(lhs, t) - elif onp.ndim(t) == 0 or onp.ndim(lhs) == 0: - return mul(t, lhs) - else: - raise TypeError - -def _outer(x, y): - assert onp.ndim(x) == onp.ndim(y) == 1 - return mul(reshape(x, (x.shape[0], 1)), reshape(y, (1, y.shape[0]))) - -def _dot_batch_rule(batched_args, batch_dims, precision=None): - lhs, rhs = batched_args - lbd, rbd = batch_dims - T = lambda x: transpose(x, onp.arange(onp.ndim(x))[::-1]) - - # in some cases, we can call dot instead of dot_general - if max(onp.ndim(lhs), onp.ndim(rhs)) <= 2: - if rbd is None: - assert lbd in (0, 1) - if lbd == 0: - return dot(lhs, rhs, precision=precision), 0 - else: - return dot(T(rhs), lhs, precision=precision), onp.ndim(rhs) - 1 - - if lbd is None: - assert rbd in (0, 1) - if rbd == onp.ndim(rhs) - 1: - return dot(lhs, rhs, precision=precision), onp.ndim(lhs) - 1 - else: - return dot(rhs, T(lhs), precision=precision), 0 - - assert lbd is not None and rbd is not None - assert lhs.ndim == rhs.ndim == 2 # dot only supports rank 1 and above - lhs = batching.moveaxis(lhs, lbd, 0) - rhs = batching.moveaxis(rhs, rbd, 0) - out = dot_general(lhs, rhs, [((1,), (1,)), ((0,), (0,))], - precision=precision) - return out, 0 - - if lbd is None: - assert rbd is not None - lhs = broadcast(lhs, (rhs.shape[rbd],)) - else: - lhs = batching.moveaxis(lhs, lbd, 0) - lhs_batch = (0,) - lhs_contracting = (onp.ndim(lhs) - 1,) - - if rbd is None: - assert lbd is not None - rhs = broadcast(rhs, (lhs.shape[0],)) - else: - rhs = batching.moveaxis(rhs, rbd, 0) - rhs_batch = (0,) - rhs_contracting = (onp.arange(1, onp.ndim(rhs))[-2:][0],) - - dim_nums = [(lhs_contracting, rhs_contracting), (lhs_batch, rhs_batch)] - return dot_general(lhs, rhs, dim_nums, precision=precision), 0 - def _precision_config(precision): if precision is not None: config = xla_client.PrecisionConfig() @@ -2129,55 +2031,6 @@ def _precision_config(precision): return config return None -def _dot_translation_rule(c, lhs, rhs, precision): - return c.Dot(lhs, rhs, precision_config=_precision_config(precision)) - -def _dot_polymorphic_shape_rule(shape_exprs, precision): - del precision # Unused. - lhs_shape, rhs_shape = shape_exprs - lhs_ndim, rhs_ndim = len(lhs_shape), len(rhs_shape) - - if lhs_ndim == rhs_ndim == 1: - if not lhs_shape == rhs_shape: raise ShapeError - return ShapeExpr(()) - elif lhs_ndim == rhs_ndim == 2: - if not lhs_shape[1] == rhs_shape[0]: raise ShapeError - return ShapeExpr((lhs_shape[0], rhs_shape[1])) - elif rhs_ndim == 1: - if not lhs_shape[1] == rhs_shape[0]: raise ShapeError - return ShapeExpr((lhs_shape[0],)) - else: - if not lhs_shape[0] == rhs_shape[0]: raise ShapeError - return ShapeExpr((rhs_shape[1],)) - -def _dot_masking_rule(padded_vals, logical_shapes, precision): - lhs, rhs = padded_vals - lhs_shape, rhs_shape = logical_shapes - lhs_ndim, rhs_ndim = len(lhs_shape), len(rhs_shape) - - if lhs_ndim == rhs_ndim == 1: - masked_lhs = select(iota(onp.int32, lhs.shape[0]) < lhs_shape[0], - lhs, zeros_like_array(lhs)) - return dot_p.bind(masked_lhs, rhs, precision=precision) - elif lhs_ndim == rhs_ndim == 2: - # TODO could avoid select if we check whether contracted axis is masked - masked_lhs = select(broadcasted_iota(onp.int32, lhs.shape, 1) < lhs_shape[1], - lhs, zeros_like_array(lhs)) - return dot_p.bind(masked_lhs, rhs, precision=precision) - elif rhs_ndim == 1: - raise NotImplementedError - else: - raise NotImplementedError - - -_dot_dtype_rule = partial(binop_dtype_rule, _input_dtype, [_num, _num], 'dot') -dot_p = standard_primitive(_dot_shape_rule, _dot_dtype_rule, 'dot', - _dot_translation_rule) -ad.defbilinear(dot_p, _dot_transpose_lhs, _dot_transpose_rhs) -batching.primitive_batchers[dot_p] = _dot_batch_rule -masking.shape_rules[dot_p] = _dot_polymorphic_shape_rule -masking.masking_rules[dot_p] = _dot_masking_rule - def _dot_general_shape_rule(lhs, rhs, dimension_numbers, precision): (lhs_contracting, rhs_contracting), (lhs_batch, rhs_batch) = dimension_numbers @@ -2276,8 +2129,8 @@ def _dot_general_batch_rule(batched_args, batch_dims, dimension_numbers, else: # move the new dimension to the end of lhs to avoid changing batch dims lhs = batching.moveaxis(lhs, lbd, lhs.ndim - 1) - # lhs tensor product dims in result come after batch dims - result_batch_dim = lhs.ndim - len(lhs_contract) - 1 + # lhs tensor product dims in result come after batch dims + result_batch_dim = lhs.ndim - len(lhs_contract) - 1 else: if rhs_batch == () or rbd > onp.max(rhs_batch): # can avoid transposes @@ -2288,10 +2141,10 @@ def _dot_general_batch_rule(batched_args, batch_dims, dimension_numbers, else: # move the new dimension to the end of rhs to avoid changing batch dims rhs = batching.moveaxis(rhs, rbd, rhs.ndim - 1) - # rhs tensor product dims in result come after batch dims + lhs tensor - # product dims - result_batch_dim = (lhs.ndim - len(lhs_contract) - len(lhs_batch) + - rhs.ndim - len(rhs_contract) - 1) + # rhs tensor product dims in result come after batch dims + lhs tensor + # product dims + result_batch_dim = (lhs.ndim - len(lhs_contract) - len(lhs_batch) + + rhs.ndim - len(rhs_contract) - 1) new_dimension_numbers = [(lhs_contract, rhs_contract), (lhs_batch, rhs_batch)] batched_out = dot_general(lhs, rhs, new_dimension_numbers, precision=precision) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 4aa0e45f9dc5..032df53b1633 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -411,11 +411,6 @@ def _defidentity(prim, argnum=0): _defreducer(lax.reduce_min_p, pmin_p) -def _dot_papply_rule(name, size, vals, dims, precision): - x, _ = vals - dim_nums = [((x.ndim,), (0,)), ((), ())] - return _dot_general_papply_rule(name, size, vals, dims, dim_nums, precision) - def _dot_general_papply_rule(name, size, vals, dims, dimension_numbers, precision): x, y = vals @@ -700,7 +695,6 @@ def _gather_papply_rule( raise NotImplementedError -parallel.papply_primitive_rules[lax.dot_p] = _dot_papply_rule parallel.papply_primitive_rules[lax.dot_general_p] = _dot_general_papply_rule parallel.papply_primitive_rules[lax.reshape_p] = _reshape_papply_rule parallel.papply_primitive_rules[lax.transpose_p] = _transpose_papply_rule From c9d984b32851ce4880f0d32938ede25a95d922c3 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 9 Oct 2019 13:44:13 +0200 Subject: [PATCH 0181/1053] Fixed the readthedocs documentation build Had to extend the docs/requirements.txt file to install matplotlb (needed by the Gotchas notebook) and ".", needed by everything. This results in a reduction of the sphinx warnings from 3300 to 1200! --- docs/requirements.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index ce5ac40797a6..c9679b3f1265 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,8 @@ jaxlib ipykernel nbsphinx +# The next packages are for readthedocs +matplotlib +# Must install jax itself for notebook execution to work +. + From e42c0106059fcb918fb88e05237639d6800caf0b Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 3 Oct 2019 11:56:57 +0200 Subject: [PATCH 0182/1053] Create developer documentation. * Moved out of README.md some developer-only stuff to docs/developer.rst. * Added documentation about building the documentation --- README.md | 76 ------------------------ docs/conf.py | 1 - docs/developer.rst | 144 +++++++++++++++++++++++++++++++++++++++++++++ docs/index.rst | 6 ++ 4 files changed, 150 insertions(+), 77 deletions(-) create mode 100644 docs/developer.rst diff --git a/README.md b/README.md index 4c819c375ca3..3c1c473a80f3 100644 --- a/README.md +++ b/README.md @@ -149,82 +149,6 @@ if you run into any errors or problems with the prebuilt wheels. ### Building JAX from source -First, obtain the JAX source code. - -```bash -git clone https://github.com/google/jax -cd jax -``` - -You must also install some prerequisites: -* a C++ compiler (g++ or clang) -* Numpy -* Scipy -* Cython - -On Ubuntu 18.04 or Debian you can install the necessary prerequisites with: -``` -sudo apt-get install g++ python python3-dev python3-numpy python3-scipy cython3 -``` -If you are building on a Mac, make sure XCode and the XCode command line tools -are installed. - -You can also install the necessary Python dependencies using `pip`: -``` -pip install numpy scipy cython -``` - -To build `jaxlib` with CUDA support, you can run - -```bash -python build/build.py --enable_cuda -pip install -e build # installs jaxlib (includes XLA) -pip install -e . # installs jax (pure Python) -``` - -See `python build/build.py --help` for configuration options, including ways to -specify the paths to CUDA and CUDNN, which you must have installed. The build -also depends on NumPy, and a compiler toolchain corresponding to that of -Ubuntu 16.04 or newer. - -To build `jaxlib` without CUDA GPU support (CPU only), drop the `--enable_cuda`: - -```bash -python build/build.py -pip install -e build # installs jaxlib (includes XLA) -pip install -e . # installs jax -``` - -To upgrade to the latest version from GitHub, just run `git pull` from the JAX -repository root, and rebuild by running `build.py` if necessary. You shouldn't have -to reinstall because `pip install -e` sets up symbolic links from site-packages -into the repository. - -## Running the tests - -To run all the JAX tests, we recommend using `pytest-xdist`, which can run tests in -parallel. First, install `pytest-xdist` by running `pip install pytest-xdist`. -Then, from the repository root directory run - -```bash -pytest -n auto tests -``` - -JAX generates test cases combinatorially, and you can control the number of -cases that are generated and checked for each test (default 10): - -```bash -JAX_NUM_GENERATED_CASES=100 pytest -n auto tests -``` - -You can run a more specific set of tests using -[`pytest`](https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests)'s -built-in selection mechanisms, or alternatively you can run a specific test -file directly to see more detailed information about the cases being run: - -```bash -python tests/lax_numpy_test.py --num_generated_cases=5 -``` The Colab notebooks are tested for errors as part of the documentation build. See [docs/README.md](docs/README.md) for instructions. diff --git a/docs/conf.py b/docs/conf.py index 6200cdd9bee0..19489a27bfca 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -74,7 +74,6 @@ # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # -# source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The master toctree document. diff --git a/docs/developer.rst b/docs/developer.rst new file mode 100644 index 000000000000..d8bae701a1e4 --- /dev/null +++ b/docs/developer.rst @@ -0,0 +1,144 @@ +Building from source +==================== + +First, obtain the JAX source code. + +.. code-block:: shell + + git clone https://github.com/google/jax + cd jax + + +You must also install some prerequisites: + * a C++ compiler (g++ or clang) + * Numpy + * Scipy + * Cython + +On Ubuntu 18.04 or Debian you can install the necessary prerequisites with: + +.. code-block:: shell + + sudo apt-get install g++ python python3-dev python3-numpy python3-scipy cython3 + + +If you are building on a Mac, make sure XCode and the XCode command line tools +are installed. + +You can also install the necessary Python dependencies using ``pip``: + +.. code-block:: shell + + pip install numpy scipy cython + + +To build ``jaxlib`` with CUDA support, you can run + +.. code-block:: shell + + python build/build.py --enable_cuda + pip install -e build # installs jaxlib (includes XLA) + pip install -e . # installs jax (pure Python) + + +See ``python build/build.py --help`` for configuration options, including ways to +specify the paths to CUDA and CUDNN, which you must have installed. The build +also depends on NumPy, and a compiler toolchain corresponding to that of +Ubuntu 16.04 or newer. + +To build ``jaxlib`` without CUDA GPU support (CPU only), drop the ``--enable_cuda``: + +.. code-block:: shell + + python build/build.py + pip install -e build # installs jaxlib (includes XLA) + pip install -e . # installs jax + + +To upgrade to the latest version from GitHub, just run ``git pull`` from the JAX +repository root, and rebuild by running ``build.py`` if necessary. You shouldn't have +to reinstall because ``pip install -e`` sets up symbolic links from site-packages +into the repository. + +Running the tests +================= + +To run all the JAX tests, we recommend using ``pytest-xdist``, which can run tests in +parallel. First, install ``pytest-xdist`` by running ``pip install pytest-xdist``. +Then, from the repository root directory run + +.. code-block:: shell + + pytest -n auto tests + + +JAX generates test cases combinatorially, and you can control the number of +cases that are generated and checked for each test (default 10): + +.. code-block:: shell + + JAX_NUM_GENERATED_CASES=100 pytest -n auto tests + + +You can run a more specific set of tests using +`pytest `_'s +built-in selection mechanisms, or alternatively you can run a specific test +file directly to see more detailed information about the cases being run: + +.. code-block:: shell + + python tests/lax_numpy_test.py --num_generated_cases=5 + + +Update documentation +==================== + +To rebuild the documentation, +install the ``sphinx`` and ``sphinx_rtd_theme`` pip +packages and then run at the top-level: + +.. code-block:: shell + + sphinx-build -M html docs docs/build + + +You can then see the generated documentation in +``docs/build/html/index.html``. + +Documentation building on readthedocs.io +---------------------------------------- + +JAX's auto-generated documentations is at `jax.readthedocs.io `_. + +The documentation building is controlled for the entire project by the +`readthedocs JAX settings `_. The current settings +trigger a documentation build as soon as code is pushed to the GitHub ``master`` branch. +For each code version, the building process is driven by the +:file:`.readthedocs.yml` and the ``docs/conf.py`` configuration files. + +For each automated documentation build you can see the +`documentation build logs `_. + +If you want to test the documentation generation on Readthedocs, you can push code to the ``test-docs`` +branch. That branch is also built automatically, and you can +see the generated documentation `here `_. + +For a local test, I was able to do it in a fresh directory by replaying the commands +I saw in the Readthedocs logs: + +.. code-block:: shell + + mkvirtualenv jax-docs # A new virtualenv + mkdir jax-docs # A new directory + cd jax-docs + git clone --no-single-branch --depth 50 https://github.com/google/jax + cd jax + git checkout --force origin/test-docs + git clean -d -f -f + + python -m pip install --upgrade --no-cache-dir pip + python -m pip install --upgrade --no-cache-dir -I Pygments==2.3.1 setuptools==41.0.1 docutils==0.14 mock==1.0.1 pillow==5.4.1 alabaster>=0.7,<0.8,!=0.7.5 commonmark==0.8.1 recommonmark==0.5.0 'sphinx<2' 'sphinx-rtd-theme<0.5' 'readthedocs-sphinx-ext<1.1' + python -m pip install --exists-action=w --no-cache-dir -r docs/requirements.txt + + python `which sphinx-build` -T -E -b html -d _build/doctrees-readthedocs -D language=en . _build/html + diff --git a/docs/index.rst b/docs/index.rst index 90579012fcf8..e08e930ee60d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -31,6 +31,12 @@ For an introduction to JAX, start at the profiling rank_promotion_warning +.. toctree:: + :maxdepth: 2 + :caption: Developer documentation + + developer + .. toctree:: :maxdepth: 3 :caption: API documentation From a9d9504348a9e8cfa2c858968ab38c8d90857153 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 9 Oct 2019 17:45:09 +0200 Subject: [PATCH 0183/1053] Fixes to the documentation * Included "Building from source" in README.md * Added references from docs/README.md to docs/developer.rst --- README.md | 9 ++++++--- docs/README.md | 17 ++--------------- docs/developer.rst | 1 + 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 3c1c473a80f3..04eca29294c9 100644 --- a/README.md +++ b/README.md @@ -148,16 +148,19 @@ Please let us know on [the issue tracker](https://github.com/google/jax/issues) if you run into any errors or problems with the prebuilt wheels. ### Building JAX from source +See [Building JAX from source](https://jax.readthedocs.io/en/latest/developer.html#building-from-source). -The Colab notebooks are tested for errors as part of the documentation build. -See [docs/README.md](docs/README.md) for instructions. - ## Reference documentation For details about the JAX API, see the [reference documentation](https://jax.readthedocs.io/). +## Developer documentation + +For getting started as a JAX developer, see the +[developer documentation](https://jax.readthedocs.io/en/latest/developer.html). + ## A brief tour ```python diff --git a/docs/README.md b/docs/README.md index 86e3ce1a9bc5..12e00425592f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,15 +1,2 @@ -To rebuild the documentation, install the following Python packages: -``` -pip install sphinx sphinx_rtd_theme nbsphinx fastcache ipykernel -``` - -Install also `pandoc`: -``` -sudo apt-get install pandoc -``` - -and then run: - -``` -sphinx-build -M html . build -``` +To rebuild the documentation, +see [Update Documentation](https://jax.readthedocs.io/en/latest/developer.html#update-documentation). diff --git a/docs/developer.rst b/docs/developer.rst index d8bae701a1e4..00667f0eab70 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -89,6 +89,7 @@ file directly to see more detailed information about the cases being run: python tests/lax_numpy_test.py --num_generated_cases=5 +The Colab notebooks are tested for errors as part of the documentation build. Update documentation ==================== From d83200ca539b04ab3acf7b0a155b1c431c3c8bad Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 9 Oct 2019 14:34:46 -0400 Subject: [PATCH 0184/1053] Make eigh JVP work for batched inputs. --- jax/lax_linalg.py | 4 ++-- tests/linalg_test.py | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 7668e28e6e09..be5beeb87613 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -268,12 +268,12 @@ def eigh_jvp_rule(primals, tangents, lower): w = w.astype(a.dtype) eye_n = np.eye(a.shape[-1], dtype=a.dtype) # carefully build reciprocal delta-eigenvalue matrix, avoiding NaNs. - Fmat = np.reciprocal(eye_n + w - w[..., np.newaxis]) - eye_n + Fmat = np.reciprocal(eye_n + w[..., np.newaxis, :] - w[..., np.newaxis]) - eye_n # eigh impl doesn't support batch dims, but future-proof the grad. dot = lax.dot if a.ndim == 2 else lax.batch_matmul vdag_adot_v = dot(dot(_H(v), a_dot), v) dv = dot(v, np.multiply(Fmat, vdag_adot_v)) - dw = np.diagonal(vdag_adot_v) + dw = np.diagonal(vdag_adot_v, axis1=-2, axis2=-1) return (v, w), (dv, dw) def eigh_batching_rule(batched_args, batch_dims, lower): diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 6a3c39cd9a17..76b5bc704d0d 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -221,7 +221,7 @@ def norm(x): "_shape={}_lower={}".format(jtu.format_shape_dtype_string(shape, dtype), lower), "shape": shape, "dtype": dtype, "rng": rng, "lower":lower} - for shape in [(1, 1), (4, 4), (5, 5), (50, 50)] + for shape in [(1, 1), (4, 4), (5, 5), (50, 50), (2, 10, 10)] for dtype in float_types + complex_types for rng in [jtu.rand_default()] for lower in [True, False])) @@ -229,8 +229,9 @@ def testEighGrad(self, shape, dtype, rng, lower): self.skipTest("Test fails with numeric errors.") uplo = "L" if lower else "U" a = rng(shape, dtype) - a = (a + onp.conj(a.T)) / 2 - a = onp.tril(a) if lower else onp.triu(a) + a = (a + onp.conj(T(a))) / 2 + ones = onp.ones((a.shape[-1], a.shape[-1]), dtype=dtype) + a *= onp.tril(ones) if lower else onp.triu(ones) # Gradient checks will fail without symmetrization as the eigh jvp rule # is only correct for tangents in the symmetric subspace, whereas the # checker checks against unconstrained (co)tangents. From b8a547361463f6fd16602d042beae0336416ad21 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 9 Oct 2019 15:05:54 -0400 Subject: [PATCH 0185/1053] Add experimental support for XLA infeed/outfeed. --- jax/abstract_arrays.py | 7 +++ jax/interpreters/pxla.py | 2 +- jax/interpreters/xla.py | 66 ++++++++++++++++++------- jax/lax/lax.py | 102 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 154 insertions(+), 23 deletions(-) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 0ea1992fbb4f..7ef590837349 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -164,6 +164,11 @@ def str_short(self): return str(self.val) +class AbstractToken(core.AbstractValue): pass + +abstract_token = AbstractToken() + + def make_shaped_array(x): dtype = xla_bridge.canonicalize_dtype(onp.result_type(x)) return ShapedArray(onp.shape(x), dtype) @@ -197,6 +202,8 @@ def raise_to_shaped(aval): return ShapedArray(aval.shape, aval.dtype) elif aval is core.abstract_unit: return core.abstract_unit + elif aval is abstract_token: + return abstract_token else: raise TypeError(type(aval)) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 2a49b52d1103..16b3b5d6615e 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -208,7 +208,7 @@ def compile_replicated(jaxpr, backend, axis_name, axis_size, global_axis_size, axis_env = xla.AxisEnv(num_replicas, [axis_name], [global_axis_size], devices) arg_shapes = list(map(aval_to_xla_shape, abstract_args)) built_c = xla.jaxpr_computation(jaxpr, backend, axis_env, consts, (), arg_shapes, - tuple_args=tuple_args) + tuple_args=tuple_args, inner=False) compiled = built_c.Compile( compile_options=xb.get_compile_options(num_replicas, device_assignment), backend=xb.get_backend(backend)) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index b65652e92ad5..3e9760858e6c 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -31,8 +31,9 @@ from .. import ad_util from .. import tree_util from .. import linear_util as lu -from ..abstract_arrays import (ConcreteArray, ShapedArray, make_shaped_array, - array_types, raise_to_shaped) +from ..abstract_arrays import (ConcreteArray, ShapedArray, AbstractToken, + make_shaped_array, array_types, raise_to_shaped, + abstract_token) from ..core import valid_jaxtype, Literal from ..util import partial, partialmethod, cache, safe_map, prod, unzip2 from ..lib import xla_bridge as xb @@ -152,7 +153,7 @@ def primitive_computation(prim, *xla_shapes, **params): prim, (), params)) )) platform = xb.get_backend(backend).platform - xla_args = map(c.ParameterWithShape, xla_shapes) + xla_args = (_parameter_or_create_token(c, shape) for shape in xla_shapes) if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] rule(c, *xla_args, **new_params) # return val set as a side-effect on c @@ -178,7 +179,8 @@ def primitive_computation(prim, *xla_shapes, **params): def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): device_num, = compiled.DeviceOrdinals() - input_bufs = [device_put(x, device_num, backend=backend) for x in args] + input_bufs = [device_put(x, device_num, backend=backend) for x in args + if x is not token] out_buf = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) @@ -202,7 +204,7 @@ def _check_nans(name, xla_shape, buf): ### compiling jaxprs -def compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, tuple_args, +def _compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, tuple_args, *abstract_args): if axis_env.nreps > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " @@ -210,7 +212,7 @@ def compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, tuple_args, raise ValueError(msg.format(axis_env.nreps, xb.device_count(backend))) arg_shapes = tuple(map(aval_to_xla_shape, abstract_args)) built_c = jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes, - tuple_args=tuple_args) + tuple_args=tuple_args, inner=False) device_assignment = (device.id,) if device else None compile_opts = xb.get_compile_options(num_replicas=axis_env.nreps, device_assignment=device_assignment) @@ -220,7 +222,7 @@ def compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, tuple_args, def build_jaxpr(jaxpr, backend, axis_env, const_vals, tuple_args, *abstract_args): arg_shapes = map(aval_to_xla_shape, abstract_args) return jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes, - tuple_args=tuple_args) + tuple_args=tuple_args, inner=False) def prefetch(x): if isinstance(x, DeviceArray): @@ -245,21 +247,37 @@ def eqn_literals(eqn): if type(v) is core.Literal: yield v.val +def _parameter_or_create_token(c, shape): + # Token values cannot be passed as parameters to top-level computations. + # Instead, we manufacture a fresh token as an argument. However, tokens make + # sense and are allowed as arguments to inner computations. + if shape.xla_element_type() == xc.PrimitiveType.TOKEN: + return c.CreateToken() + else: + return c.ParameterWithShape(shape) + def jaxpr_computation(jaxpr, backend, axis_env, const_vals, freevar_shapes, - arg_shapes, tuple_args=False): + arg_shapes, tuple_args=False, inner=False): + # If inner is True, tokens can be passed as parameters; if inner is False, + # token parameters become CreateToken instructions. c = xb.make_computation_builder("jaxpr_computation") # TODO(mattjj): name _map(prefetch, it.chain(const_vals, jaxpr_literals(jaxpr))) consts = _map(c.Constant, const_vals) if tuple_args: - freevar_shapes, arg_shapes = list(freevar_shapes), list(arg_shapes) - tuple_shape = xc.Shape.tuple_shape(freevar_shapes + arg_shapes) + freevar_shapes = list(freevar_shapes) + arg_shapes = list(arg_shapes) + tuple_shape = xc.Shape.tuple_shape( + [s for s in it.chain(freevar_shapes, arg_shapes) + if s.xla_element_type() != xc.PrimitiveType.TOKEN]) tuple_arg = c.ParameterWithShape(tuple_shape) nfreevars, nargs = len(freevar_shapes), len(arg_shapes) freevars = [c.GetTupleElement(tuple_arg, i) for i in range(nfreevars)] args = [c.GetTupleElement(tuple_arg, i + nfreevars) for i in range(nargs)] else: - freevars = _map(c.ParameterWithShape, freevar_shapes) - args = _map(c.ParameterWithShape, arg_shapes) + make_parameter = (c.ParameterWithShape if inner + else partial(_parameter_or_create_token, c)) + freevars = _map(make_parameter, freevar_shapes) + args = _map(make_parameter, arg_shapes) out_nodes = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, freevars, *args) return c.Build(c.Tuple(*out_nodes)) @@ -409,8 +427,8 @@ def _xla_callable(fun, device, backend, *abstract_args): jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) assert not env # no subtraces here (though cond might eventually need them) axis_env = AxisEnv(jaxpr_replicas(jaxpr), [], []) - compiled = compile_jaxpr(jaxpr, device, backend, axis_env, consts, - tuple_args, *abstract_args) + compiled = _compile_jaxpr(jaxpr, device, backend, axis_env, consts, + tuple_args, *abstract_args) del master, consts, jaxpr, env result_handlers = tuple(map(_pval_to_result_handler, pvals)) if axis_env.nreps == 1: @@ -427,7 +445,8 @@ def _pval_to_result_handler(pval): def _execute_compiled(compiled, backend, handlers, tuple_args, *args): device_num, = compiled.DeviceOrdinals() - input_bufs = [device_put(x, device_num, backend=backend) for x in args] + input_bufs = [device_put(x, device_num, backend=backend) for x in args + if x is not token] if tuple_args: input_bufs = [make_tuple(input_bufs, device_num, backend)] out_bufs = compiled.Execute(input_bufs).destructure() @@ -435,8 +454,9 @@ def _execute_compiled(compiled, backend, handlers, tuple_args, *args): return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] def _execute_replicated(compiled, backend, handlers, tuple_args, *args): - input_bufs = [[device_put(x, device_num, backend=backend) for x in args] - for device_num in compiled.DeviceOrdinals()] + input_bufs = [ + [device_put(x, device_num, backend=backend) for x in args if x is not token] + for device_num in compiled.DeviceOrdinals()] if tuple_args: input_bufs = [[make_tuple(bufs, device_num)] for bufs, device_num in zip(input_bufs, compiled.DeviceOrdinals())] @@ -512,7 +532,8 @@ def f(c, *args, **params): pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, new_params), pvals, instantiate=True) - built_c = jaxpr_computation(jaxpr, backend, axis_env, consts, (), xla_shapes) + built_c = jaxpr_computation(jaxpr, backend, axis_env, consts, (), + xla_shapes, inner=True) return c.Call(built_c, xla_args) return f @@ -525,6 +546,15 @@ def _aval_from_xla_shape(xla_shape): ### device-persistent data +class Token(object): pass +token = Token() + +pytype_aval_mappings[Token] = lambda _: abstract_token +xla_shape_handlers[AbstractToken] = lambda _: xc.Shape.token_shape() +xla_result_handlers[AbstractToken] = lambda _: lambda _: token +canonicalize_dtype_handlers[Token] = lambda x: x + + class DeviceValue(object): """A DeviceValue represents a value backed by device memory.""" __slots__ = ["aval", "device_buffer", "__weakref__"] diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 4ecfc2ada19d..b9da24e53245 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -37,7 +37,8 @@ from ..config import flags from ..core import Primitive from ..abstract_arrays import (UnshapedArray, ShapedArray, ConcreteArray, - array_types, make_shaped_array, raise_to_shaped) + AbstractToken, array_types, make_shaped_array, + raise_to_shaped, abstract_token) from ..interpreters import partial_eval as pe from ..interpreters import xla from ..interpreters import pxla @@ -47,6 +48,7 @@ from ..interpreters.masking import ShapeExpr, ShapeError from ..util import curry, cache, safe_zip, unzip2, prod from ..tree_util import build_tree, tree_unflatten, tree_map +from ..lib import pytree from ..lib import xla_bridge from ..lib import xla_client @@ -3708,9 +3710,9 @@ def _select_and_gather_add_translation( canonicalize_types=False) if double_word_reduction: - # XLA doesn't yet implement ReduceWindow on tuples (Google bug b/73062247), so - # we implement a pair-wise ReduceWindow by packing two k-bit values into - # 2k-bit unsigned integer using bit tricks. + # XLA doesn't yet implement ReduceWindow on tuples (Google bug b/73062247), so + # we implement a pair-wise ReduceWindow by packing two k-bit values into + # 2k-bit unsigned integer using bit tricks. word_dtype = _UINT_DTYPES[nbits] double_word_dtype = _UINT_DTYPES[nbits * 2] word_type = xla_client.dtype_to_etype(word_dtype) @@ -4054,6 +4056,98 @@ def _stop_gradient_batch_rule(batched_args, batch_dims): ad.primitive_jvps[stop_gradient_p] = _stop_gradient_jvp_rule batching.primitive_batchers[stop_gradient_p] = _stop_gradient_batch_rule +def create_token(x): + """Creates an XLA token value with no preconditions for sequencing effects. + + Experimental. + + Args: + x: a dummy argument used to tie the CreateToken operator into a trace. The + value of `x` is ignored. + """ + # x is a dummy argument used to tie the operator into a trace. + return create_token_p.bind(x) + +create_token_p = Primitive("create_token") +create_token_p.def_impl(partial(xla.apply_primitive, create_token_p)) +create_token_p.def_abstract_eval(lambda _: abstract_token) +xla.translations[create_token_p] = lambda c, _: c.CreateToken() + +def after_all(*operands): + """Merges one or more XLA token values. Experimental. + + Wraps the XLA AfterAll operator.""" + return after_all_p.bind(*operands) + +def _after_all_abstract_eval(*operands): + if any(x is not abstract_token for x in operands): + raise TypeError("Arguments to after_all must be tokens") + return abstract_token + + +def _after_all_translation_rule(c, *operands): + return c.AfterAll(operands) + +after_all_p = Primitive("after_all") +after_all_p.def_impl(partial(xla.apply_primitive, after_all_p)) +after_all_p.def_abstract_eval(_after_all_abstract_eval) +xla.translations[after_all_p] = _after_all_translation_rule + + +def infeed(token, shape=None): + """Consumes an infeed value of `shape` from the host. Experimental. + + `token` is used to sequence infeed and outfeed effects. + """ + flat_shapes, treedef = pytree.flatten(shape) + for shape in flat_shapes: + if not isinstance(shape, ShapedArray): + raise TypeError("shapes argument to infeed must be a pytree of " + "ShapedArray values, got {}".format(shapes)) + xs_and_token = infeed_p.bind(token, shapes=tuple(flat_shapes)) + return (treedef.unflatten(xs_and_token[:-1]), xs_and_token[-1]) + +def _infeed_abstract_eval(token, shapes=None): + if token is not abstract_token: + raise TypeError("First argument to infeed must be a token") + return shapes + (abstract_token,) + + +def _infeed_translation_rule(c, token, shapes=None): + shape = tuple(map(xla.aval_to_xla_shape, shapes)) + xs_and_token = c.Infeed(xla_client.Shape.tuple_shape(shape), token) + xs = c.GetTupleElement(xs_and_token, 0) + token = c.GetTupleElement(xs_and_token, 1) + outs = [c.GetTupleElement(xs, i) for i in range(len(shapes))] + [token] + return c.Tuple(*outs) + +infeed_p = Primitive("infeed") +infeed_p.multiple_results = True +infeed_p.def_impl(partial(xla.apply_primitive, infeed_p)) +infeed_p.def_abstract_eval(_infeed_abstract_eval) +xla.translations[infeed_p] = _infeed_translation_rule + +def outfeed(token, xs): + """Outfeeds value `xs` to the host. Experimental. + + `token` is used to sequence infeed and outfeed effects. + """ + flat_xs, _ = pytree.flatten(xs) + return outfeed_p.bind(token, *flat_xs) + +def _outfeed_abstract_eval(token, *xs): + if token is not abstract_token: + raise TypeError("First argument to outfeed must be a token") + return abstract_token + + +def _outfeed_translation_rule(c, token, *xs): + return c.Outfeed(c.Tuple(*xs), token) + +outfeed_p = Primitive("outfeed") +outfeed_p.def_impl(partial(xla.apply_primitive, outfeed_p)) +outfeed_p.def_abstract_eval(_outfeed_abstract_eval) +xla.translations[outfeed_p] = _outfeed_translation_rule ### util From 0f8c33de306b2194c1762e51c8bfa018ca83f220 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 9 Oct 2019 16:18:11 -0400 Subject: [PATCH 0186/1053] Add infeed test case. --- tests/infeed_test.py | 93 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 tests/infeed_test.py diff --git a/tests/infeed_test.py b/tests/infeed_test.py new file mode 100644 index 000000000000..606a7f0153e8 --- /dev/null +++ b/tests/infeed_test.py @@ -0,0 +1,93 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import threading + +from absl.testing import absltest +import jax +from jax import lax, numpy as np +from jax.config import config +from jax.lib import xla_client +import jax.test_util +import numpy as onp + +config.parse_flags_with_absl() +FLAGS = config.FLAGS + +class InfeedTest(jax.test_util.JaxTestCase): + + def testInfeed(self): + @jax.jit + def f(x): + token = lax.create_token(x) + (y,), token = lax.infeed( + token, shape=(jax.ShapedArray((3, 4), np.float32),)) + (z,), _ = lax.infeed( + token, shape=(jax.ShapedArray((3, 1, 1), np.float32),)) + return x + y + z + + x = onp.float32(1.5) + y = onp.reshape(onp.arange(12, dtype=onp.float32), (3, 4)) # onp.random.randn(3, 4).astype(onp.float32) + z = onp.random.randn(3, 1, 1).astype(onp.float32) + xla_client.transfer_to_infeed((y,)) + xla_client.transfer_to_infeed((z,)) + self.assertAllClose(f(x), x + y + z, check_dtypes=True) + + def testInfeedThenOutfeed(self): + @jax.jit + def f(x): + token = lax.create_token(x) + y, token = lax.infeed( + token, shape=jax.ShapedArray((3, 4), np.float32)) + token = lax.outfeed(token, y + onp.float32(1)) + return lax.tie_in(token, x - 1) + + x = onp.float32(7.5) + y = onp.random.randn(3, 4).astype(onp.float32) + execution = threading.Thread(target=lambda: f(x)) + execution.start() + xla_client.transfer_to_infeed((y,)) + out, = xla_client.transfer_from_outfeed(xla_client.shape_from_pyval((y,))) + execution.join() + self.assertAllClose(out, y + onp.float32(1), check_dtypes=True) + + def testInfeedThenOutfeedInALoop(self): + def doubler(_, token): + y, token = lax.infeed( + token, shape=jax.ShapedArray((3, 4), np.float32)) + return lax.outfeed(token, y * onp.float32(2)) + + @jax.jit + def f(n): + token = lax.create_token(n) + token = lax.fori_loop(0, n, doubler, token) + return lax.tie_in(token, n) + + n = 10 + execution = threading.Thread(target=lambda: f(n)) + execution.start() + for _ in range(n): + x = onp.random.randn(3, 4).astype(onp.float32) + xla_client.transfer_to_infeed((x,)) + y, = xla_client.transfer_from_outfeed(xla_client.shape_from_pyval((x,))) + self.assertAllClose(y, x * onp.float32(2), check_dtypes=True) + execution.join() + + +if __name__ == '__main__': + absltest.main() From 1aa82ea6826cc1e3706cfe278b0caa053ece7ea0 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 9 Oct 2019 16:52:09 -0400 Subject: [PATCH 0187/1053] Clarify comment about token passing. --- jax/interpreters/xla.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 3e9760858e6c..49c530077a64 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -248,9 +248,14 @@ def eqn_literals(eqn): yield v.val def _parameter_or_create_token(c, shape): - # Token values cannot be passed as parameters to top-level computations. - # Instead, we manufacture a fresh token as an argument. However, tokens make - # sense and are allowed as arguments to inner computations. + # XLA does not allow token values to be passed as parameters to top-level + # computations, but in JAX that's a reasonable and expected thing to do. + # It should not matter where you put `jit` or if you omit it entirely. + # When calling into an "outermost" computation, we pass JAX Token objects by + # calling CreateToken() to make an XLA token that stands in for the JAX token. + # The manufactured tokens correspond one-to-one with parameters. + # Similarly when returning a token to JAX, we ignore what XLA gives us and + # manufacture a Token object. if shape.xla_element_type() == xc.PrimitiveType.TOKEN: return c.CreateToken() else: From 6e55c4e7bac26778543c988f8a2de2df9b0fd326 Mon Sep 17 00:00:00 2001 From: Dan Weaver Date: Wed, 9 Oct 2019 15:00:27 -0700 Subject: [PATCH 0188/1053] Move variables inside functions to avoid flags errors, remove matplotlib dependency (#1479) --- jax/experimental/ode.py | 64 ++++++++++++----------------------------- 1 file changed, 19 insertions(+), 45 deletions(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index b004e010d263..0595f6ac2eea 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -35,34 +35,17 @@ import jax.numpy as np import jax.ops from jax.test_util import check_vjp -import matplotlib.pyplot as plt import numpy as onp import scipy.integrate as osp_integrate -# Dopri5 Butcher tableaux -alpha = np.array([1 / 5, 3 / 10, 4 / 5, 8 / 9, 1., 1., 0]) -beta = np.array( - [[1 / 5, 0, 0, 0, 0, 0, 0], - [3 / 40, 9 / 40, 0, 0, 0, 0, 0], - [44 / 45, -56 / 15, 32 / 9, 0, 0, 0, 0], - [19372 / 6561, -25360 / 2187, 64448 / 6561, -212 / 729, 0, 0, 0], - [9017 / 3168, -355 / 33, 46732 / 5247, 49 / 176, -5103 / 18656, 0, 0], - [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, 0]]) -c_sol = np.array([35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, - 0]) -c_error = np.array([35 / 384 - 1951 / 21600, 0, 500 / 1113 - 22642 / 50085, - 125 / 192 - 451 / 720, -2187 / 6784 - -12231 / 42400, - 11 / 84 - 649 / 6300, -1. / 60.]) -dps_c_mid = np.array([ - 6025192743 / 30085553152 / 2, 0, 51252292925 / 65400821598 / 2, - -2691868925 / 45128329728 / 2, 187940372067 / 1594534317056 / 2, - -1776094331 / 19743644256 / 2, 11237099 / 235043384 / 2]) - - @jax.jit def interp_fit_dopri(y0, y1, k, dt): # Fit a polynomial to the results of a Runge-Kutta step. + dps_c_mid = np.array([ + 6025192743 / 30085553152 / 2, 0, 51252292925 / 65400821598 / 2, + -2691868925 / 45128329728 / 2, 187940372067 / 1594534317056 / 2, + -1776094331 / 19743644256 / 2, 11237099 / 235043384 / 2]) y_mid = y0 + dt * np.dot(dps_c_mid, k) return np.array(fit_4th_order_polynomial(y0, y1, y_mid, k[0], k[-1], dt)) @@ -151,6 +134,21 @@ def runge_kutta_step(func, y0, f0, t0, dt): y1_error: estimated error at t1 k: list of Runge-Kutta coefficients `k` used for calculating these terms. """ + # Dopri5 Butcher tableaux + alpha = np.array([1 / 5, 3 / 10, 4 / 5, 8 / 9, 1., 1., 0]) + beta = np.array( + [[1 / 5, 0, 0, 0, 0, 0, 0], + [3 / 40, 9 / 40, 0, 0, 0, 0, 0], + [44 / 45, -56 / 15, 32 / 9, 0, 0, 0, 0], + [19372 / 6561, -25360 / 2187, 64448 / 6561, -212 / 729, 0, 0, 0], + [9017 / 3168, -355 / 33, 46732 / 5247, 49 / 176, -5103 / 18656, 0, 0], + [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, 0]]) + c_sol = np.array([35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, + 0]) + c_error = np.array([35 / 384 - 1951 / 21600, 0, 500 / 1113 - 22642 / 50085, + 125 / 192 - 451 / 720, -2187 / 6784 - -12231 / 42400, + 11 / 84 - 649 / 6300, -1. / 60.]) + def _fori_body_fun(i, val): ti = t0 + dt * alpha[i-1] yi = y0 + dt * np.dot(beta[i-1, :], val) @@ -469,30 +467,6 @@ def plot_gradient_field(ax, func, xlimits, ylimits, numticks=30): ax.set_ylim(ylimits) -def plot_demo(): - """Demo plot of simple ode integration and gradient field.""" - def f(y, t, arg1, arg2): - return y - np.sin(t) - np.cos(t) * arg1 + arg2 - - t0 = 0. - t1 = 5.0 - ts = np.linspace(t0, t1, 100) - y0 = np.array([1.]) - fargs = (1.0, 0.0) - - ys = odeint(f, y0, ts, *fargs, atol=0.001, rtol=0.001) - - # Set up figure. - fig = plt.figure(figsize=(8, 6), facecolor='white') - ax = fig.add_subplot(111, frameon=False) - f_no_args = lambda y, t: f(y, t, *fargs) - plot_gradient_field(ax, f_no_args, xlimits=[t0, t1], ylimits=[-1.1, 1.1]) - ax.plot(ts, ys, 'g-') - ax.set_xlabel('t') - ax.set_ylabel('y') - plt.show() - - @jax.jit def pend(y, t, arg1, arg2): """Simple pendulum system for odeint testing.""" From fb433fb9d2e4f9053a718d341213a77e44fc186a Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 9 Oct 2019 16:25:37 -0700 Subject: [PATCH 0189/1053] preserve precision config in dot_general transpose --- jax/lax/lax.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 4ecfc2ada19d..010a58ac9939 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2088,7 +2088,8 @@ def _dot_general_transpose_lhs(g, y, dimension_numbers, precision, dims = ((ans_y, y_kept), (ans_batch, y_batch)) x_contract_sorted_by_y = list(onp.take(x_contract, onp.argsort(y_contract))) out_axes = onp.argsort(list(x_batch) + x_kept + x_contract_sorted_by_y) - return transpose(dot_general(g, y, dims), tuple(out_axes)) + return transpose(dot_general(g, y, dims, precision=precision), + tuple(out_axes)) def _dot_general_transpose_rhs(g, x, dimension_numbers, precision): (x_contract, y_contract), (x_batch, y_batch) = dimension_numbers From 9d2f25cf1ac484e203731ee9f88d66c764475145 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 9 Oct 2019 17:02:11 -0700 Subject: [PATCH 0190/1053] add test --- jax/lax/lax.py | 1 + tests/lax_test.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 010a58ac9939..e6c530d48d3d 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -400,6 +400,7 @@ def concatenate(operands, dimension): operand_shapes=tuple(o.shape for o in operands)) Precision = xla_client.PrecisionConfig.Precision +Precision.__str__ = lambda precision: precision.name def conv_general_dilated(lhs, rhs, window_strides, padding, lhs_dilation=None, rhs_dilation=None, dimension_numbers=None, diff --git a/tests/lax_test.py b/tests/lax_test.py index 236cadca16fc..54727fc9bcdb 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1812,6 +1812,11 @@ def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng): dot = partial(lax.dot, precision=lax.Precision.HIGHEST) check_grads_bilinear(dot, (lhs, rhs), order=2, modes=["fwd", "rev"], atol=tol, rtol=tol) + # check that precision config is preserved + result, pullback = api.vjp(dot, lhs, rhs) + gresult = lax.zeros_like_array(result) + s = str(api.make_jaxpr(pullback)(gresult)) + assert "precision=HIGHEST" in s @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -1837,6 +1842,11 @@ def testDotGeneralContractAndBatchGrads(self, lhs_shape, rhs_shape, dtype, precision=lax.Precision.HIGHEST) check_grads_bilinear(dot_general, (lhs, rhs), order=2, modes=["fwd", "rev"], atol=tol, rtol=tol) + # check that precision config is preserved + result, pullback = api.vjp(dot_general, lhs, rhs) + gresult = lax.zeros_like_array(result) + s = str(api.make_jaxpr(pullback)(gresult)) + assert "precision=HIGHEST" in s @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_dtype={}_broadcast_sizes={}".format( From ed1bd5fccd060d4d277121abc012f92ecb96672c Mon Sep 17 00:00:00 2001 From: Alex Eftimiades Date: Thu, 10 Oct 2019 09:29:57 -0400 Subject: [PATCH 0191/1053] test cases for ValueError with wrong shape; one test case with negative mean --- jax/random.py | 3 +++ tests/random_test.py | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/jax/random.py b/jax/random.py index cc0f86979f63..0ed069433178 100644 --- a/jax/random.py +++ b/jax/random.py @@ -437,6 +437,9 @@ def _multivariate_normal(key, mean, cov, shape, dtype): A random array with latent dimension of (max(asarray(mean).ndim, asarray(cov).ndim)),) """ _check_shape("multivariate_normal", shape) + if hasattr(mean, "shape"): + if mean.ndim > 1: + raise ValueError("Mean cannot have more than 1 dimension.") if hasattr(cov, "shape") and cov.ndim > 0: if cov.ndim > 2: raise ValueError("Covariance matrix cannot have more than 2 dimensions.") diff --git a/tests/random_test.py b/tests/random_test.py index a8d16b65b95e..1d551a6d7193 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -369,16 +369,21 @@ def testT(self, df, dtype): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_mean={}_cov={}_{}".format(mean, cov, dtype), "mean": mean, "cov": cov, "dtype": dtype} - for mean in [0, 5, np.asarray([1, 2, 3])] + for mean in [0, 5, np.asarray([1, -2, 3]), np.asarray([[1]])] for cov in [.1, 5, np.asarray([4, 5, 6]), np.asarray([[4.60, 2.86, 2.33], [2.86, 3.04, 1.74], - [2.33, 1.74, 1.83]])] + [2.33, 1.74, 1.83]]), + np.asarray([[[1]]])] for dtype in [onp.float32, onp.float64])) def testMultivariateNormal(self, mean, cov, dtype): key = random.PRNGKey(0) rand = lambda key, mean, cov: random.multivariate_normal(key, mean, cov, (1000,), dtype) crand = api.jit(rand) + if hasattr(cov, "shape") and cov.ndim > 2 or hasattr(mean, "shape") and mean.ndim > 1: + self.assertRaises(ValueError, lambda: rand(key, mean, cov)) + self.assertRaises(ValueError, lambda: crand(key, mean, cov)) + return uncompiled_samples = rand(key, mean, cov) compiled_samples = crand(key, mean, cov) From fffec81474fb90862a9032dc7ef1d4e8b0d16569 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 10 Oct 2019 10:19:43 -0400 Subject: [PATCH 0192/1053] Register OrderedDict as a pytree type. --- jax/tree_util.py | 12 ++++++++---- tests/tree_util_tests.py | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/jax/tree_util.py b/jax/tree_util.py index 353b773b9000..378a07a3b4f5 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -37,13 +37,12 @@ from __future__ import print_function import functools -from collections import namedtuple -import itertools as it +import collections from six.moves import reduce from .lib import pytree -from .util import unzip2, partial, safe_map +from .util import partial, safe_zip def tree_map(f, tree): @@ -121,7 +120,7 @@ def treedef_tuple(trees): return pytree.tuple(list(trees)) def treedef_children(treedef): - return treedef.children() + return treedef.children() register_pytree_node = pytree.register_node @@ -134,6 +133,11 @@ def tree_reduce(f, tree): def tree_all(tree): return all(tree_leaves(tree)) +register_pytree_node( + collections.OrderedDict, + lambda x: (list(x.values()), list(x.keys())), + lambda keys, values: collections.OrderedDict(safe_zip(keys, values))) + class Partial(functools.partial): """A version of functools.partial that works in pytrees. diff --git a/tests/tree_util_tests.py b/tests/tree_util_tests.py index c4fde9bc1aa4..af6ea0c05967 100644 --- a/tests/tree_util_tests.py +++ b/tests/tree_util_tests.py @@ -62,6 +62,7 @@ def __repr__(self): ([3, ATuple(foo=(3, ATuple(foo=3, bar=None)), bar={"baz": 34})],), ([AnObject(3, None, [4, "foo"])],), ({"a": 1, "b": 2},), + (collections.OrderedDict([("foo", 34), ("baz", 101), ("something", -42)]),) ] From c82477862cf1a47222b7e579b47e9ea10f979afc Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 10 Oct 2019 08:27:21 -0700 Subject: [PATCH 0193/1053] Speedup JVP for triangular solve (#1466) * Speedup JVP for triangular solve There is still room for improvement, e.g., by combining the currently separate JVPs for a and b into a single expression (which will allow for saving an inner triangular solve when both arguments are being differentiated), but this is already significantly faster in the typical case of only solving a single vector. On my laptop's CPU, I measure 2.98 ms before vs 1.18 ms after on a 500x500 matrix: rs = onp.random.RandomState(0) a = rs.randn(500, 500) b = rs.randn(500) @jax.jit def loss(a, b): return np.sum(jax.scipy.linalg.solve_triangular(a, b)) grad = jax.jit(jax.grad(loss)) %timeit jax.device_get(grad(a, b)) * comment * Optimal order for left_side=False, too * Test the JVP for lax_linalg.triangular_solve directly --- jax/lax_linalg.py | 24 +++++++++++++++++++---- tests/linalg_test.py | 46 ++++++++++++++++++++++++++------------------ 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index be5beeb87613..7a20b5846164 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -327,18 +328,33 @@ def triangular_solve_jvp_rule_a( g_a, ans, a, b, left_side, lower, transpose_a, conjugate_a, unit_diagonal): if g_a is ad_util.zero: return ad_util.zero + m, n = b.shape[-2:] k = 1 if unit_diagonal else 0 g_a = np.tril(g_a, k=-k) if lower else np.triu(g_a, k=k) g_a = lax.neg(g_a) g_a = np.swapaxes(g_a, -1, -2) if transpose_a else g_a g_a = np.conj(g_a) if conjugate_a else g_a - tmp = triangular_solve(a, g_a, left_side, lower, transpose_a, conjugate_a, - unit_diagonal) dot = lax.dot if g_a.ndim == 2 else lax.batch_matmul + + def a_inverse(rhs): + return triangular_solve(a, rhs, left_side, lower, transpose_a, conjugate_a, + unit_diagonal) + + # triangular_solve is about the same cost as matrix multplication (~n^2 FLOPs + # for matrix/vector inputs). Order these operations in whichever order is + # cheaper. if left_side: - return dot(tmp, ans) + assert g_a.shape[-2:] == a.shape[-2:] == (m, m) and ans.shape[-2:] == (m, n) + if m > n: + return a_inverse(dot(g_a, ans)) # A^{-1} (∂A X) + else: + return dot(a_inverse(g_a), ans) # (A^{-1} ∂A) X else: - return dot(ans, tmp) + assert g_a.shape[-2:] == a.shape[-2:] == (n, n) and ans.shape[-2:] == (m, n) + if m < n: + return a_inverse(dot(ans, g_a)) # (X ∂A) A^{-1} + else: + return dot(ans, a_inverse(g_a)) # X (∂A A^{-1}) def triangular_solve_transpose_rule( cotangent, a, b, left_side, lower, transpose_a, conjugate_a, diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 76b5bc704d0d..ef8149fce7ac 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -30,6 +30,7 @@ import jax import jax.lib from jax import jit, grad, jvp, vmap +from jax import lax_linalg from jax import numpy as np from jax import scipy as jsp from jax import test_util as jtu @@ -752,33 +753,40 @@ def testSolveTriangular(self, lower, transpose_a, unit_diagonal, lhs_shape, @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": - "_lhs={}_rhs={}_lower={}_transposea={}_unit_diagonal={}".format( - jtu.format_shape_dtype_string(lhs_shape, dtype), - jtu.format_shape_dtype_string(rhs_shape, dtype), - lower, transpose_a, unit_diagonal), - "lower": lower, "transpose_a": transpose_a, - "unit_diagonal": unit_diagonal, "lhs_shape": lhs_shape, - "rhs_shape": rhs_shape, "dtype": dtype, "rng": rng} + "_A={}_B={}_lower={}_transposea={}_conja={}_unitdiag={}_leftside={}".format( + jtu.format_shape_dtype_string(a_shape, dtype), + jtu.format_shape_dtype_string(b_shape, dtype), + lower, transpose_a, conjugate_a, unit_diagonal, left_side), + "lower": lower, "transpose_a": transpose_a, "conjugate_a": conjugate_a, + "unit_diagonal": unit_diagonal, "left_side": left_side, + "a_shape": a_shape, "b_shape": b_shape, "dtype": dtype, "rng": rng} for lower in [False, True] for unit_diagonal in [False, True] for dtype in float_types + complex_types - for transpose_a in ( - [0, 1] if onp.issubdtype(dtype, np.floating) else [0, 1, 2]) - for lhs_shape, rhs_shape in [ - ((4, 4), (4,)), - ((4, 4), (4, 3)), - ((2, 8, 8), (2, 8, 10)), + for transpose_a in [False, True] + for conjugate_a in ( + [False] if onp.issubdtype(dtype, np.floating) else [False, True]) + for left_side, a_shape, b_shape in [ + (False, (4, 4), (1, 4,)), + (False, (3, 3), (4, 3)), + (True, (4, 4), (4, 1)), + (True, (4, 4), (4, 3)), + (True, (2, 8, 8), (2, 8, 10)), ] for rng in [jtu.rand_default()])) @jtu.skip_on_devices("tpu") # TODO(phawkins): Test fails on TPU. - def testSolveTriangularGrad(self, lower, transpose_a, unit_diagonal, - lhs_shape, rhs_shape, dtype, rng): + def testTriangularSolveGrad( + self, lower, transpose_a, conjugate_a, unit_diagonal, left_side, a_shape, + b_shape, dtype, rng): _skip_if_unsupported_type(dtype) - A = np.tril(rng(lhs_shape, dtype) + 5 * onp.eye(lhs_shape[-1], dtype=dtype)) + # Test lax_linalg.triangular_solve instead of scipy.linalg.solve_triangular + # because it exposes more options. + A = np.tril(rng(a_shape, dtype) + 5 * onp.eye(a_shape[-1], dtype=dtype)) A = A if lower else T(A) - B = rng(rhs_shape, dtype) - f = partial(jsp.linalg.solve_triangular, lower=lower, trans=transpose_a, - unit_diagonal=unit_diagonal) + B = rng(b_shape, dtype) + f = partial(lax_linalg.triangular_solve, lower=lower, + transpose_a=transpose_a, conjugate_a=conjugate_a, + unit_diagonal=unit_diagonal, left_side=left_side) jtu.check_grads(f, (A, B), 2, rtol=2e-2, eps=1e-3) From 66098189e50f36732021e5fa7c12c609c2068e09 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 10 Oct 2019 13:13:21 -0400 Subject: [PATCH 0194/1053] Emit a better error if mismatched axis sizes are passed to pmap. --- jax/interpreters/pxla.py | 4 +++- tests/pmap_test.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 16b3b5d6615e..c17f3804d403 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -111,7 +111,9 @@ def shard_aval(size, aval): shard_aval_handlers = {} shard_aval_handlers[core.AbstractUnit] = lambda size, x: x def _shard_abstract_array(size, x): - assert x.shape[0] == size + if x.shape[0] != size: + raise ValueError("Axis size {} does not match leading dimension of " + "shape {}".format(size, x.shape)) return ShapedArray(x.shape[1:], x.dtype) shard_aval_handlers[ShapedArray] = _shard_abstract_array diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 46726c8ffba5..091501abca0f 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -80,6 +80,13 @@ def sum_and_broadcast(x, axis): expected = sum_and_broadcast(sum_and_broadcast(x, 0), 1) self.assertAllClose(ans, expected, check_dtypes=False) + def testMismatchedAxisSizes(self): + n = xla_bridge.device_count() + f = pmap(lambda x, y: x + y) + jtu.check_raises_regexp( + lambda: f(onp.random.randn(n), onp.random.randn(n - 1)), ValueError, + "Axis size .* does not match leading dimension of shape .*") + @parameterized.named_parameters( {"testcase_name": "_mesh={}".format(device_mesh_shape), "device_mesh_shape": device_mesh_shape} From 78132c150dd1189b48e3c1e13b03a8ec4c858a27 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 10 Oct 2019 15:19:17 -0400 Subject: [PATCH 0195/1053] Document all_to_all and ppermute. --- docs/jax.lax.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index 5909f95e0a69..9b3ddb183b3e 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -143,7 +143,9 @@ Parallelism support is experimental. .. autosummary:: :toctree: _autosummary + all_to_all psum pmax pmin ppermute + pswapaxes From d238b1f487053b99a119d31d3606b4ee4bbf84cb Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 10 Oct 2019 16:22:37 -0400 Subject: [PATCH 0196/1053] Update XLA release to include GPU memory corruption fix. https://github.com/tensorflow/tensorflow/commit/f616f0662c1703b31e78630fd4cfe638adb2642c --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17fe767ce231..ba534587a7d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "0b32b9238d6c0a3e51ccef6898a1f03d2798556911070f9783d4c5bf2841c7b3", - strip_prefix = "tensorflow-0477de84487e970554cc974e42b55ba4e597afa5", + sha256 = "147dc4fdad3f8dda7498838482b21a0ea7a0ab73ada3056e2ddf21213c88849d", + strip_prefix = "tensorflow-f616f0662c1703b31e78630fd4cfe638adb2642c", urls = [ - "https://github.com/tensorflow/tensorflow/archive/0477de84487e970554cc974e42b55ba4e597afa5.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/f616f0662c1703b31e78630fd4cfe638adb2642c.tar.gz", ], ) From 27afa128d29d2e7fb6f5c4dd810b1910d5073ea5 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 11 Oct 2019 09:16:02 -0400 Subject: [PATCH 0197/1053] Fix rendering of jax.eval_shape docs. --- jax/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index 144e94cfda95..4ec0fda589fd 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1808,7 +1808,7 @@ def eval_shape(fun, *args, **kwargs): """Compute the shape/dtype of ``fun(*args, **kwargs)`` without any FLOPs. This utility function is useful for performing shape inference. Its - input/output behavior is defined by: + input/output behavior is defined by:: def eval_shape(fun, *args, **kwargs): out = fun(*args, **kwargs) From 245f40678ed79ff958481dd87b10e03673bdeaa6 Mon Sep 17 00:00:00 2001 From: joaogui1 Date: Fri, 11 Oct 2019 16:25:23 -0300 Subject: [PATCH 0198/1053] Adds dirichlet to __init__.py, making it usable --- jax/scipy/stats/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/scipy/stats/__init__.py b/jax/scipy/stats/__init__.py index 5dfc33885d45..995253050276 100644 --- a/jax/scipy/stats/__init__.py +++ b/jax/scipy/stats/__init__.py @@ -16,6 +16,7 @@ from . import bernoulli from . import beta from . import cauchy +from . import dirichlet from . import expon from . import gamma from . import laplace From 5585dda9fe653358ddb8dc7054531bfb162271e1 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 11 Oct 2019 14:07:16 -0700 Subject: [PATCH 0199/1053] Change device_put to take a `device` argument instead of `device_num`. (#1463) --- jax/api.py | 4 +-- jax/interpreters/pxla.py | 53 +++++++++++++++++++------------------- jax/interpreters/xla.py | 55 +++++++++++++++++++++------------------- jax/lib/__init__.py | 2 +- tests/api_test.py | 12 +++++++++ 5 files changed, 71 insertions(+), 55 deletions(-) diff --git a/jax/api.py b/jax/api.py index 4ec0fda589fd..9b2a4c0e9486 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1222,8 +1222,8 @@ def jaxpr_maker(*args, **kwargs): return jaxpr_maker -def device_put(x, device_num=0, backend=None): - return tree_map(lambda y: xla.device_put_p.bind(y, device_num=device_num, backend=backend), x) +def device_put(x, device=None, backend=None): + return tree_map(lambda y: xla.device_put_p.bind(y, device=device, backend=backend), x) # TODO(mattjj): consider revising diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index c17f3804d403..5352241e6715 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -46,24 +46,24 @@ def identity(x): return x -def shard_args(backend, device_ordinals, assignments, axis_size, tuple_args, args): +def shard_args(backend, devices, assignments, axis_size, tuple_args, args): """Shard an argument data array arg along its leading axis. Args: - device_ordinals: list of integers of length num_replicas mapping a logical - replica index to a physical device number. + devices: list of Devices of length num_replicas mapping a logical replica + index to a physical device. assignments: replica to shard assignment. axis_size: int, size of the axis to be sharded. args: a sequence of JaxTypes representing arguments to be sharded along their leading axes (or the leading axess of their leaves in the tuple - case) and placed on the devices indicated by `device_ordinals`. + case) and placed on `devices`. Returns: - A list of device buffers with the same length as `device_ordinals` indexed - by replica number, so that the nth element is the argument to be passed to - the nth replica. + A list of device buffers with the same length as `devices` indexed by + replica number, so that the nth element is the argument to be passed to the + nth replica. """ - nargs, nrep = len(args), len(device_ordinals) + nargs, nrep = len(args), len(devices) buffers = [[None] * nargs for _ in range(nrep)] for a, arg in enumerate(args): # The shard_arg_handlers allow an extensible set of types to be sharded, but @@ -71,35 +71,36 @@ def shard_args(backend, device_ordinals, assignments, axis_size, tuple_args, arg if type(arg) is ShardedDeviceArray: if nrep == len(arg.device_buffers): for r, buf in enumerate(arg.device_buffers): - buffers[r][a] = (buf if buf.device_ordinal() == device_ordinals[r] - else buf.copy_to_device(device_ordinals[r])) + buffers[r][a] = (buf if buf.device() == devices[r] + else buf.copy_to_device(devices[r])) else: for r, buf in enumerate(arg.device_buffers): - buffers[r][a] = xla.device_put(x[assignments[r]], ordinals[r], backend=backend) + buffers[r][a] = xla.device_put(x[assignments[r]], devices[r], backend=backend) else: - bufs = shard_arg_handlers[type(arg)](arg, device_ordinals, assignments, backend=backend) + bufs = shard_arg_handlers[type(arg)](arg, devices, assignments, backend=backend) for r, buf in enumerate(bufs): buffers[r][a] = buf if tuple_args: - buffers = [[xla.make_tuple(bufs, device_ordinals[r], backend)] + buffers = [[xla.make_tuple(bufs, devices[r], backend)] for r, bufs in enumerate(buffers)] return buffers shard_arg_handlers = {} shard_arg_handlers[core.Unit] = \ - lambda x, ordinals, _, backend=None: [xla.device_put(core.unit, d, backend=backend) for d in ordinals] -def _shard_array(x, ordinals, assignments, backend=None): - nrep = len(ordinals) - return (xla.device_put(x[assignments[r]], ordinals[r], backend=backend) for r in range(nrep)) + lambda x, devices, _, backend=None: [ + xla.device_put(core.unit, d, backend=backend) for d in devices] +def _shard_array(x, devices, assignments, backend=None): + nrep = len(devices) + return (xla.device_put(x[assignments[r]], devices[r], backend=backend) for r in range(nrep)) for _t in array_types: shard_arg_handlers[_t] = _shard_array -def _shard_device_array(x, ordinals, assignments, backend=None): - nrep = len(ordinals) +def _shard_device_array(x, devices, assignments, backend=None): + nrep = len(devices) xs = x._unstack() - return (xla.device_put(xs[assignments[r]], ordinals[r], backend=backend) + return (xla.device_put(xs[assignments[r]], devices[r], backend=backend) for r in range(nrep)) shard_arg_handlers[xla.DeviceArray] = _shard_device_array @@ -403,13 +404,13 @@ def __getitem__(self, idx): # This handler code is effectively dead because we in-lined it in shard_args for # performance reasons. -def _shard_sharded_device_array(x, ordinals, assignments): - n = len(ordinals) +def _shard_sharded_device_array(x, devices, assignments): + n = len(devices) if n == len(x.device_buffers): - return (b if b.device_ordinal() == ordinals[r] else b.copy_to_device(ordinals[r]) + return (b if b.device() == devices[r] else b.copy_to_device(devices[r]) for r, b in enumerate(x.device_buffers)) else: - return (xla.device_put(x[assignments[r]], ordinals[r]) for r in range(n)) + return (xla.device_put(x[assignments[r]], devices[r]) for r in range(n)) shard_arg_handlers[ShardedDeviceArray] = _shard_sharded_device_array core.pytype_aval_mappings[ShardedDeviceArray] = ConcreteArray @@ -504,9 +505,9 @@ def dynamic_fun(dummy, *args): compiled, nrep = compile_replicated(jaxpr, backend, axis_name, axis_size, global_axis_size, devices, consts, tuple_args, *avals) - device_ordinals = compiled.DeviceOrdinals() + local_devices = compiled.local_devices() assignments = assign_shards_to_replicas(nrep, axis_size) - handle_args = partial(shard_args, backend, device_ordinals, assignments, + handle_args = partial(shard_args, backend, local_devices, assignments, axis_size, tuple_args) handle_outs = _pvals_to_results_handler(axis_size, nrep, out_pvals) return partial(execute_replicated, compiled, backend, nrep, handle_args, handle_outs) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 49c530077a64..674915d9ce04 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -78,17 +78,19 @@ def array_result_handler(aval): return partial(DeviceArray, raise_to_shaped(aval xla_result_handlers[ShapedArray] = array_result_handler xla_result_handlers[ConcreteArray] = array_result_handler -def device_put(x, device_num=0, backend=None): +def device_put(x, device=None, backend=None): x = canonicalize_dtype(x) try: - return device_put_handlers[type(x)](x, device_num, backend=backend) + return device_put_handlers[type(x)](x, device, backend=backend) except KeyError: raise TypeError("No device_put handler for type: {}".format(type(x))) + device_put_handlers = {} device_put_handlers[core.Unit] = \ - lambda _, n, backend=None: xc.Buffer.from_pyval((), n, backend=xb.get_backend(backend)) -def _device_put_array(x, n, backend=None): - return xc.Buffer.from_pyval(x, n, backend=xb.get_backend(backend)) + lambda _, device, backend=None: xc.Buffer.from_pyval( + (), device, backend=xb.get_backend(backend)) +def _device_put_array(x, device, backend=None): + return xc.Buffer.from_pyval(x, device, backend=xb.get_backend(backend)) for _t in array_types: device_put_handlers[_t] = _device_put_array @@ -178,8 +180,8 @@ def primitive_computation(prim, *xla_shapes, **params): raise RuntimeError(msg) def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): - device_num, = compiled.DeviceOrdinals() - input_bufs = [device_put(x, device_num, backend=backend) for x in args + device, = compiled.local_devices() + input_bufs = [device_put(x, device, backend=backend) for x in args if x is not token] out_buf = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: @@ -449,28 +451,28 @@ def _pval_to_result_handler(pval): return aval_to_result_handler(pv) def _execute_compiled(compiled, backend, handlers, tuple_args, *args): - device_num, = compiled.DeviceOrdinals() - input_bufs = [device_put(x, device_num, backend=backend) for x in args + device, = compiled.local_devices() + input_bufs = [device_put(x, device, backend=backend) for x in args if x is not token] if tuple_args: - input_bufs = [make_tuple(input_bufs, device_num, backend)] + input_bufs = [make_tuple(input_bufs, device, backend)] out_bufs = compiled.Execute(input_bufs).destructure() if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] def _execute_replicated(compiled, backend, handlers, tuple_args, *args): input_bufs = [ - [device_put(x, device_num, backend=backend) for x in args if x is not token] - for device_num in compiled.DeviceOrdinals()] + [device_put(x, device, backend=backend) for x in args if x is not token] + for device in compiled.local_devices()] if tuple_args: - input_bufs = [[make_tuple(bufs, device_num)] for bufs, device_num in - zip(input_bufs, compiled.DeviceOrdinals())] + input_bufs = [[make_tuple(bufs, device)] for bufs, device in + zip(input_bufs, compiled.local_devices())] out_bufs = compiled.ExecutePerReplica(input_bufs)[0].destructure() if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] -def make_tuple(bufs, device_num, backend): - return xb.get_backend(backend).make_tuple(bufs, device_num) +def make_tuple(bufs, device, backend): + return xb.get_backend(backend).make_tuple(bufs, device) xla_call_p = core.Primitive('xla_call') @@ -726,29 +728,29 @@ def _device_array_constant_handler(c, val, canonicalize_types=True): return c.Constant(onp.asarray(val), canonicalize_types=canonicalize_types) xb.register_constant_handler(DeviceArray, _device_array_constant_handler) -def _device_put_device_array(x, device_num, backend): +def _device_put_device_array(x, device, backend): # TODO(skye): we're assuming the DeviceBuffers without "platform" are # XrtBuffers. Figure out a less risky way to deal with XrtBuffers. if (not hasattr(x.device_buffer, "platform") or xb.get_backend(backend).platform == x.device_buffer.platform()): - if x.device_buffer.device_ordinal() == device_num: + if device is None or x.device_buffer.device() == device: return x.device_buffer else: - return x.device_buffer.copy_to_device(device_num) + return x.device_buffer.copy_to_device(device) else: # Buffers from different XLA backends are passed through the host. - return xc.Buffer.from_pyval(x, device_num, backend=xb.get_backend(backend)) + return xc.Buffer.from_pyval(x, device, backend=xb.get_backend(backend)) device_put_handlers[DeviceArray] = _device_put_device_array -def _device_put_impl(x, device_num=0, backend=None): +def _device_put_impl(x, device=None, backend=None): try: a = abstractify(x) except TypeError: raise TypeError("Argument '{}' of type {} is not a valid JAX type" .format(x, type(x))) handler = aval_to_result_handler(a) - return handler(device_put(x, device_num, backend=backend)) + return handler(device_put(x, device, backend=backend)) device_put_p = core.Primitive('device_put') device_put_p.def_impl(_device_put_impl) @@ -765,16 +767,17 @@ def copy_to_host_async(self): pass def constant_handler(c, constant_instance, canonicalize_types=True): assert False -def _instantiate_device_constant(const, device_num=0, backend=None, cutoff=1e6): +def _instantiate_device_constant(const, device=None, backend=None, cutoff=1e6): # dispatch an XLA Computation to build the constant on the device if it's # large, or alternatively build it on the host and transfer it if it's small assert isinstance(const, DeviceConstant) - if const.size > cutoff and device_num == 0: + if const.size > cutoff: c = xb.make_computation_builder("constant_instantiating_computation") xla_const = const.constant_handler(c, const) - opts = xb.get_compile_options(device_assignment=(device_num,)) + device_assignment = (device.id,) if device else None + opts = xb.get_compile_options(device_assignment=device_assignment) compiled = c.Build(xla_const).Compile((), opts, backend=xb.get_backend(backend)) return compiled.Execute(()) else: - return xc.Buffer.from_pyval(onp.asarray(const), device_num, + return xc.Buffer.from_pyval(onp.asarray(const), device, backend=xb.get_backend(backend)) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index b8881e326b47..d890436fa457 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 28) +_minimum_jaxlib_version = (0, 1, 31) try: from jaxlib import version as jaxlib_version except: diff --git a/tests/api_test.py b/tests/api_test.py index 59a021032f98..ed61d672c96d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -290,6 +290,18 @@ def test_device_put_and_get(self): self.assertIsInstance(y2[1][1], onp.ndarray) assert onp.all(y2[1][1] == 3 * x) + def test_device_put_across_devices(self): + if xb.device_count() == 1: + raise unittest.SkipTest("this test requires multiple devices") + d1, d2 = xb.local_devices()[:2] + x = api.device_put(onp.array([1,2,3]), device=d1) + self.assertEqual(x.device_buffer.device(), d1) + y = api.device_put(x, device=d2) + self.assertEqual(y.device_buffer.device(), d2) + # Make sure these don't crash + api.device_put(x) + api.device_put(y) + @jtu.skip_on_devices("tpu") def test_jacobian(self): R = onp.random.RandomState(0).randn From 858a411982f64ec021785669d28054d67058adc9 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 13 Oct 2019 09:34:51 +0200 Subject: [PATCH 0200/1053] Add a separate build matrix entry for documentation testing. (#1495) * Add a separate build matrix entry for documentation testing. This way we parallelize the unit tests with the documentation tests. --- .travis.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c3e89cc1f8c0..8f2d5413cdc8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,11 @@ python: env: - JAX_ENABLE_X64=0 JAX_NUM_GENERATED_CASES=25 - JAX_ENABLE_X64=1 JAX_NUM_GENERATED_CASES=25 +matrix: + include: + - python: "3.7" + env: JAX_ENABLE_X64=1 JAX_ONLY_DOCUMENTATION=true + before_install: - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh -O miniconda.sh; @@ -24,10 +29,13 @@ install: - pip install jaxlib - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - - conda install --yes -c conda-forge pandoc ipykernel - - conda install --yes sphinx sphinx_rtd_theme nbsphinx jupyter_client matplotlib + - if [[ "$JAX_ONLY_DOCUMENTATION" != "" ]]; then + conda install --yes -c conda-forge pandoc ipykernel; + conda install --yes sphinx sphinx_rtd_theme nbsphinx jupyter_client matplotlib; + fi script: - - pytest -n 1 tests examples -W ignore - - if [[ "$TRAVIS_PYTHON_VERSION" > "3" ]]; then - sphinx-build -M html docs build; + - if [[ "$JAX_ONLY_DOCUMENTATION" == "" ]]; then + pytest -n 1 tests examples -W ignore ; + else + sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html; fi From d6bc62bd6b56d2c37f77807c45475bd1821a95f1 Mon Sep 17 00:00:00 2001 From: joaogui1 Date: Sun, 13 Oct 2019 20:30:32 -0300 Subject: [PATCH 0201/1053] Fixes Readme links to notebooks --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 04eca29294c9..2346b8c2339a 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ are instances of such transformations. Another is [`vmap`](#auto-vectorization-w for automatic vectorization, with more to come. This is a research project, not an official Google product. Expect bugs and -[sharp edges](https://colab.research.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb). +[sharp edges](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb). Please help by trying it out, [reporting bugs](https://github.com/google/jax/issues), and letting us know what you think! @@ -232,7 +232,7 @@ print("Trained loss: {:0.2f}".format(loss(weights, inputs, targets))) ``` To see more, check out the [quickstart -notebook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/quickstart.ipynb), +notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/quickstart.ipynb), a [simple MNIST classifier example](https://github.com/google/jax/blob/master/examples/mnist_classifier.py) and the rest of the [JAX @@ -680,13 +680,13 @@ code to compile and end-to-end optimize much bigger functions. ## Current gotchas For a survey of current gotchas, with examples and explanations, we highly -recommend reading the [Gotchas Notebook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb). +recommend reading the [Gotchas Notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb). Some stand-out gotchas that might surprise NumPy users: 1. JAX enforces single-precision (32-bit, e.g. `float32`) values by default, and to enable double-precision (64-bit, e.g. `float64`) one needs to set the `jax_enable_x64` variable **at startup** (or set the environment variable - `JAX_ENABLE_X64=True`, see [the Gotchas Notebook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb#scrollTo=YTktlwTTMgFl)) + `JAX_ENABLE_X64=True`, see [the Gotchas Notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb#scrollTo=YTktlwTTMgFl)) 2. Some of NumPy's dtype promotion semantics involving a mix of Python scalars and NumPy types aren't preserved, namely `np.add(1, np.array([2], np.float32)).dtype` is `float64` rather than `float32`. @@ -697,7 +697,7 @@ Some stand-out gotchas that might surprise NumPy users: reasons](https://github.com/google/jax/blob/master/design_notes/prng.md), and non-reuse (linearity) is not yet checked. -See [the notebook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/Common_Gotchas_in_JAX.ipynb) for much more information. +See [the notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb) for much more information. ## Citing JAX From 16219358e2dbd94aa4d152daa7eb4da03157cf00 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 14 Oct 2019 09:49:10 -0700 Subject: [PATCH 0202/1053] Remove unnecessary zero checks from JVP rules in lax_linalg (#1490) I'm pretty sure all of these are dead code that can no longer be triggered, e.g., as evidenced by their use of no longer existing `core.pack` and `ad.TangentTuple`. --- jax/lax_linalg.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 7a20b5846164..1c90de1c3a13 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -103,9 +103,6 @@ def cholesky_jvp_rule(primals, tangents): sigma_dot, = tangents L = np.tril(cholesky_p.bind(x)) - if sigma_dot is ad_util.zero: - return L, ad_util.zero - # Forward-mode rule from https://arxiv.org/pdf/1602.07527.pdf def phi(X): l = np.tril(X) @@ -262,9 +259,6 @@ def eigh_jvp_rule(primals, tangents, lower): v, w = eigh_p.bind(symmetrize(a), lower=lower) - if a_dot is ad_util.zero: - return core.pack((v, w)), ad.TangentTuple(ad_util.zero, ad_util.zero) - # for complex numbers we need eigenvalues to be full dtype of v, a: w = w.astype(a.dtype) eye_n = np.eye(a.shape[-1], dtype=a.dtype) @@ -326,8 +320,6 @@ def triangular_solve_shape_rule(a, b, left_side=False, **unused_kwargs): def triangular_solve_jvp_rule_a( g_a, ans, a, b, left_side, lower, transpose_a, conjugate_a, unit_diagonal): - if g_a is ad_util.zero: - return ad_util.zero m, n = b.shape[-2:] k = 1 if unit_diagonal else 0 g_a = np.tril(g_a, k=-k) if lower else np.triu(g_a, k=k) @@ -537,10 +529,6 @@ def _lu_jvp_rule(primals, tangents): a_dot, = tangents lu, pivots = lu_p.bind(a) - if a_dot is ad_util.zero: - return (core.pack((lu, pivots)), - ad.TangentTuple((ad_util.zero, ad_util.zero))) - a_shape = np.shape(a) m, n = a_shape[-2:] dtype = lax.dtype(a) @@ -680,8 +668,6 @@ def qr_jvp_rule(primals, tangents, full_matrices): x, = primals dx, = tangents q, r = qr_p.bind(x, full_matrices=False) - if dx is ad_util.zero: - return core.pack((q, r)), ad.TangentTuple(ad_util.zero, ad_util.zero) if full_matrices or np.shape(x)[-2] < np.shape(x)[-1]: raise NotImplementedError dx_rinv = triangular_solve(r, dx) # Right side solve by default @@ -778,9 +764,6 @@ def svd_jvp_rule(primals, tangents, full_matrices, compute_uv): dA, = tangents s, U, Vt = svd_p.bind(A, full_matrices=False, compute_uv=True) - if dA is ad_util.zero: - return ((s, U, Vt), (ad_util.zero, ad_util.zero, ad_util.zero)) - if full_matrices: # TODO: implement full matrices case, documented here: https://people.maths.ox.ac.uk/gilesm/files/NA-08-01.pdf raise NotImplementedError( From c50495b272c35cd6e8119dac3c1b1d24acf5239c Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Mon, 14 Oct 2019 18:55:13 +0100 Subject: [PATCH 0203/1053] Fix List rendering in RTD for primitives.ipynb (#1501) Colab doesn't require a newline before unordered list in Markdown; RTD does. --- docs/notebooks/How_JAX_primitives_work.ipynb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index d13b20da172b..0e5143a7b7e2 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -547,6 +547,7 @@ "JAX first evaluates it abstractly using only the \n", "shape and type of the arguments. This abstract evaluation serves multiple\n", "purposes:\n", + "\n", " * Gets the sequence of JAX primitives that are used in the computation. This \n", " sequence will be compiled. \n", " * Computes the shape and type of all vectors and operations used in the computation. \n", @@ -976,6 +977,7 @@ }, "source": [ "TO EXPLAIN: \n", + "\n", " * Why is JAX using ConcreteArray in square_add_prim? There is no abstract evaluation going on here.\n", " * Not sure how to explain that multiply_add_prim is invoked with ConcreteValue, yet\n", " we do not call the multiply_add_abstract_eval.\n", From d338449ed50bd3d5244b08b45b776205c744a659 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 14 Oct 2019 13:48:56 -0700 Subject: [PATCH 0204/1053] Use collections.abc.Sequence in favor of collections.Sequence (#1504) * Use collections.abc.Sequence in favor of collections.Sequence The later will be removed in Python 3.8, which is due out any day now! (There is currently a warning that appears when importing lax_numpy.) * restore collections import --- jax/numpy/lax_numpy.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 3281b7b40e35..435380021cd0 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -29,6 +29,10 @@ from distutils.util import strtobool import collections +try: + from collections.abc import Sequence +except ImportError: # python 2 + from collections import Sequence import itertools import os import re @@ -2573,7 +2577,7 @@ def _index_to_gather(x_shape, idx): idx_no_nones = [(i, d) for i, d in enumerate(idx) if d is not None] advanced_pairs = ( (asarray(e), i, j) for j, (i, e) in enumerate(idx_no_nones) - if (isinstance(e, collections.Sequence) or isinstance(e, ndarray))) + if (isinstance(e, Sequence) or isinstance(e, ndarray))) advanced_pairs = ((_normalize_index(e, x_shape[j]), i, j) for e, i, j in advanced_pairs) advanced_indexes, idx_advanced_axes, x_advanced_axes = zip(*advanced_pairs) @@ -2725,7 +2729,7 @@ def _index_to_gather(x_shape, idx): def _should_unpack_list_index(x): """Helper for _eliminate_deprecated_list_indexing.""" return (isinstance(x, ndarray) and onp.ndim(x) != 0 - or isinstance(x, collections.Sequence) + or isinstance(x, Sequence) or isinstance(x, slice) or x is Ellipsis or x is None) def _eliminate_deprecated_list_indexing(idx): @@ -2734,7 +2738,7 @@ def _eliminate_deprecated_list_indexing(idx): # objects]". Detects this case and canonicalizes to a tuple. This case is # deprecated by NumPy and exists for backward compatibility. if not isinstance(idx, tuple): - if isinstance(idx, collections.Sequence) and not isinstance(idx, ndarray): + if isinstance(idx, Sequence) and not isinstance(idx, ndarray): if _any(_should_unpack_list_index(i) for i in idx): idx = tuple(idx) else: From 3035bf727755047346b62c47af55a53515ed8d54 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 14 Oct 2019 21:12:33 -0400 Subject: [PATCH 0205/1053] Add Token to core.pytype_aval_mappings. --- jax/interpreters/xla.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 674915d9ce04..b8be8c2320b6 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -557,6 +557,7 @@ class Token(object): pass token = Token() pytype_aval_mappings[Token] = lambda _: abstract_token +core.pytype_aval_mappings[Token] = lambda _: abstract_token xla_shape_handlers[AbstractToken] = lambda _: xc.Shape.token_shape() xla_result_handlers[AbstractToken] = lambda _: lambda _: token canonicalize_dtype_handlers[Token] = lambda x: x From d161e1badb6259f033d8f097f6ded55b6701d023 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 15 Oct 2019 08:52:21 -0400 Subject: [PATCH 0206/1053] Add text to documentation and to jaxlib version check suggesting a pip update. (#1506) * Add instructions to update `pip` to README.md. * Add text that suggests upgrading pip if we see jaxlib 0.1.23. * Remove extra text from README.md. --- README.md | 4 ++++ jax/lib/__init__.py | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 2346b8c2339a..36706a55103c 100644 --- a/README.md +++ b/README.md @@ -111,9 +111,13 @@ To install a CPU-only version, which might be useful for doing local development on a laptop, you can run ```bash +pip install --upgrade pip pip install --upgrade jax jaxlib # CPU-only version ``` +On Linux, it is often necessary to first update `pip` to a version that supports +`manylinux2010` wheels. + If you want to install JAX with both CPU and GPU support, using existing CUDA and CUDNN7 installations on your machine (for example, preinstalled on your cloud VM), you can run diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index d890436fa457..0a5eb05ea3b4 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -31,6 +31,13 @@ def _check_jaxlib_version(): if version < _minimum_jaxlib_version: msg = 'jaxlib is version {}, but this version of jax requires version {}.' + + if version == (0, 1, 23): + msg += ('\n\nA common cause of this error is that you installed jaxlib ' + 'using pip, but your version of pip is too old to support ' + 'manylinux2010 wheels. Try running:\n\n' + 'pip install --upgrade pip\n' + 'pip install --upgrade jax jaxlib\n') raise ValueError(msg.format('.'.join(map(str, version)), '.'.join(map(str, _minimum_jaxlib_version)))) From 9ff9e9e34ad8c716496d907e8702630612c065ee Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 15 Oct 2019 10:25:55 -0400 Subject: [PATCH 0207/1053] Describe minimum OS version requirements in README.md. (#1508) --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 36706a55103c..f5ca8b26eb45 100644 --- a/README.md +++ b/README.md @@ -101,9 +101,12 @@ JAX is written in pure Python, but it depends on XLA, which needs to be compiled and installed as the `jaxlib` package. Use the following instructions to install a binary package with `pip`, or to build JAX from source. -We support installing or building `jaxlib` on Linux and macOS platforms, but not -Windows. We're not currently working on Windows support, but contributions are -welcome (see [#438](https://github.com/google/jax/issues/438)). +We support installing or building `jaxlib` on Linux (Ubuntu 16.04 or later) and +macOS (10.12 or later) platforms, but not yet Windows. We're not currently +working on Windows support, but contributions are welcome +(see [#438](https://github.com/google/jax/issues/438)). Some users have reported +success with building a CPU-only `jaxlib` from source using the Windows Subsytem +for Linux. ### pip installation From 2f4e88760c3a1b620b6beefb87b864b99608e07b Mon Sep 17 00:00:00 2001 From: Alex Eftimiades Date: Tue, 15 Oct 2019 14:35:40 -0400 Subject: [PATCH 0208/1053] fix indentation --- jax/random.py | 2 +- tests/random_test.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jax/random.py b/jax/random.py index 558142727100..74d675684ee2 100644 --- a/jax/random.py +++ b/jax/random.py @@ -438,7 +438,7 @@ def _multivariate_normal(key, mean, cov, shape, dtype): """ _check_shape("multivariate_normal", shape) if hasattr(mean, "shape") and mean.ndim > 1: - raise ValueError("Mean cannot have more than 1 dimension.") + raise ValueError("Mean cannot have more than 1 dimension.") if hasattr(cov, "shape") and cov.ndim > 0: if cov.ndim > 2: raise ValueError("Covariance matrix cannot have more than 2 dimensions.") diff --git a/tests/random_test.py b/tests/random_test.py index 1d551a6d7193..506645ac545d 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -381,9 +381,9 @@ def testMultivariateNormal(self, mean, cov, dtype): rand = lambda key, mean, cov: random.multivariate_normal(key, mean, cov, (1000,), dtype) crand = api.jit(rand) if hasattr(cov, "shape") and cov.ndim > 2 or hasattr(mean, "shape") and mean.ndim > 1: - self.assertRaises(ValueError, lambda: rand(key, mean, cov)) - self.assertRaises(ValueError, lambda: crand(key, mean, cov)) - return + self.assertRaises(ValueError, lambda: rand(key, mean, cov)) + self.assertRaises(ValueError, lambda: crand(key, mean, cov)) + return uncompiled_samples = rand(key, mean, cov) compiled_samples = crand(key, mean, cov) From 06178d298c0935452c664cbcc10f957f517a8b73 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 15 Oct 2019 15:01:52 -0400 Subject: [PATCH 0209/1053] Move lax.tie_in inside lax.full_like onto the fill value instead the output of lax.full. (#1507) Fixes a bug where constants associated with relu gradients were being hoisted out of loops and materialized, causing a fairly large performance penalty (~20%) for a Resnet-50 model in a loop using infeed. --- jax/lax/lax.py | 4 ++-- tests/lax_numpy_test.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 80876d6fa4a8..8bdad6839298 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1262,8 +1262,8 @@ def full_like(x, fill_value, dtype=None, shape=None): `fill_value`, similar to the output of np.full. """ shape = onp.shape(x) if shape is None else _canonicalize_shape(shape) - out = full(shape, fill_value, dtype or _dtype(x)) - return tie_in(x, out) + fill_value = tie_in(x, fill_value) + return full(shape, fill_value, dtype or _dtype(x)) def collapse(operand, start_dimension, stop_dimension): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 0992f65be209..e97d7eec71c1 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -31,11 +31,14 @@ import numpy as onp +import jax import jax.ops from jax import api from jax import lax +from jax import linear_util from jax import numpy as lnp from jax import test_util as jtu +from jax.interpreters import partial_eval from jax.test_util import check_grads from jax.lib import xla_bridge @@ -1909,6 +1912,25 @@ def foo(x): return lnp.concatenate(x) foo(onp.zeros((2, 2))) # doesn't crash + def testReluGradientConstants(self): + # This is a regression test that verifies that constants associated with the + # gradient of np.maximum (from lax._balanced_eq) aren't hoisted into the + # outermost jaxpr. This was producing some large materialized constants for + # every relu activation in a model. + def body(i, xy): + x, y = xy + y = y + jax.grad(lambda z: lnp.sum(lnp.maximum(z, 0.)))(x) + return x, y + + f = lambda y: lax.fori_loop(0, 5, body, (y, y)) + wrapped = linear_util.wrap_init(f) + pv = partial_eval.PartialVal( + (jax.ShapedArray((3, 4), onp.float32), jax.core.unit)) + _, _, consts = partial_eval.trace_to_jaxpr(wrapped, [pv]) + self.assertFalse( + any(onp.array_equal(x, onp.full((3, 4), 2., dtype=onp.float32)) + for x in consts)) + # Most grad tests are at the lax level (see lax_test.py), but we add some here # as needed for e.g. particular compound ops of interest. From 3711e0cf09b89bac52b218d0ab73657a3abe41c6 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 15 Oct 2019 16:09:15 -0400 Subject: [PATCH 0210/1053] Delete experimental/lapax. (#1511) It's more likely to mislead users than anything else, given we recommend using LAPACK these days. --- jax/experimental/lapax.py | 244 -------------------------------------- tests/lapax_test.py | 211 -------------------------------- 2 files changed, 455 deletions(-) delete mode 100644 jax/experimental/lapax.py delete mode 100644 tests/lapax_test.py diff --git a/jax/experimental/lapax.py b/jax/experimental/lapax.py deleted file mode 100644 index bd1857b72159..000000000000 --- a/jax/experimental/lapax.py +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright 2018 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""A linear algebra library for use with JAX.""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import numpy as onp - -import jax.lax as lax - - -# Based on work by phawkins@ -# The Cholesky routine is Algorithm 1 from -# Haidar, Azzam, et al. "High-performance Cholesky factorization for GPU-only -# execution." Proceedings of General Purpose GPUs. ACM, 2017. - -# TODO(mattjj): implement MAGMA-style algorithms from bartvm@ - - -### Linalg functions - - -def cholesky(a, block_size=1): - """An unrolled left-looking Cholesky.""" - return _cholesky(LapaxMatrix(a, block_size)).ndarray - - -def _cholesky(a): - """An unrolled left-looking Cholesky on a (possibly blocked) LapaxMatrix.""" - n = a.shape[-1] - if n == 1: - return sqrt(a) if a.bs == 1 else _cholesky(a.bview(1)) - - def solve(a, b): - return _solve_triangular_right(a.bview(8), b.bview(8), False, True, True) - - out = full_like(a, 0) - for i in range(0, n): - if i > 0: - a[i:, i] -= out[i:, :i] * out[i, :i].T - out[i, i] = _cholesky(a[i, i]) - if i < n - 1: - out[i:, i] = solve(out[i, i], a[i:, i]) - return out - - -def solve_triangular(a, b, left_side, lower, trans_a, block_size=1): - """An unrolled triangular solve.""" - return _solve_triangular_right(LapaxMatrix(a, block_size), - LapaxMatrix(b, block_size), - left_side, lower, trans_a).ndarray - - -def _solve_triangular_right(a, b, left_side, lower, trans_a): - """An unrolled right-looking triangular solve on (blocked) LapaxMatrices.""" - n = a.shape[-1] - - def solve(a, b): - return _solve_triangular_left(a, b, left_side, lower, trans_a) - - if n == 1: - return solve(a.bview(1), b.bview(1)) - - out = full_like(b, 0) - if lower == trans_a: - if left_side: - for i in reversed(range(n)): - out[i, :] = solve(a[i, i], b[i, :]) - if i > 0: - a_col = a[i, :i].T if lower else a[:i, i] - b[:i, :] -= a_col * out[i, :] - else: - for i in range(n): - out[:, i] = solve(a[i, i], b[:, i]) - if i < n - 1: - a_row = a[i+1:, i].T if lower else a[i, i+1:] - b[:, i+1:] -= out[:, i] * a_row - else: - if left_side: - for i in range(n): - out[i, :] = solve(a[i, i], b[i, :]) - if i < n - 1: - a_col = a[i+1:, i] if lower else a[i, i+1:].T - b[i+1:, :] -= a_col * out[i, :] - else: - for i in reversed(range(n)): - out[:, i:] = solve(a[i, i], b[:, i]) - if i > 0: - a_row = a[i, :i] if lower else a[:i, i].T - b[:, :i] -= out[:, i] * a_row - - return out - - -def _solve_triangular_left(a, b, left_side, lower, trans_a): - """An unrolled left-looking triangular solve on *unblocked* LapaxMatrices.""" - assert a.bs == b.bs == 1 - n = a.shape[-1] - if n == 1: - return b / a - - out = full_like(b, 0) - if lower == trans_a: - if left_side: - out[-1, :] = b[-1, :] / a[-1, -1] - for i in reversed(range(n-1)): - a_row = a[i+1:, i].T if lower else a[i, i+1:] - out[i, :] = (b[i, :] - a_row * out[i+1:, :]) / a[i, i] - else: - out[:, 0] = b[:, 0] / a[0, 0] - for i in range(1, n): - a_col = a[i, :i].T if lower else a[:i, i] - out[:, i] = (b[:, i] - out[:, :i] * a_col) / a[i, i] - else: - if left_side: - out[0, :] = b[0, :] / a[0, 0] - for i in range(1, n): - a_row = a[i, :i] if lower else a[:i, i].T - out[i, :] = (b[i, :] - a_row * out[:i, :]) / a[i, i] - else: - out[:, -1] = b[:, -1] / a[-1, -1] - for i in reversed(range(n-1)): - a_col = a[i+1:, i] if lower else a[i, i+1:].T - out[:, i] = (b[:, i] - out[:, i+1:] * a_col) / a[i, i] - - return out - - -### Convenient internally-used matrix model - - -def full_like(x, val): - return LapaxMatrix(lax.full_like(x.ndarray, val), x.bs) - - -def sqrt(x): - return LapaxMatrix(lax.pow(x.ndarray, lax.full_like(x.ndarray, 0.5)), x.bs) - - -def _matrix_transpose(ndarray): - dims = tuple(range(ndarray.ndim)) - dims = dims[:-2] + (dims[-1], dims[-2]) - return lax.transpose(ndarray, dims) - - -def _make_infix_op(fun): - return lambda *args: LapaxMatrix(fun(*(a.ndarray for a in args)), args[0].bs) - - -class LapaxMatrix(object): - """A matrix model using LAX functions and tweaked index rules from Numpy.""" - __slots__ = ["ndarray", "bs", "shape"] - - def __init__(self, ndarray, block_size=1): - self.ndarray = ndarray - self.bs = block_size - self.shape = tuple(onp.floor_divide(ndarray.shape, block_size) - + (onp.mod(ndarray.shape, block_size) > 0)) - - def __getitem__(self, idx): - return LapaxMatrix(_matrix_take(self.ndarray, idx, self.bs), block_size=1) - - def __setitem__(self, idx, val): - self.ndarray = _matrix_put(self.ndarray, idx, val.ndarray, self.bs) - - def bview(self, block_size): - return LapaxMatrix(self.ndarray, block_size=block_size) - - __add__ = _make_infix_op(lax.add) - __sub__ = _make_infix_op(lax.sub) - __mul__ = _make_infix_op(lax.batch_matmul) - __div__ = _make_infix_op(lax.div) - __truediv__ = _make_infix_op(lax.div) - T = property(_make_infix_op(_matrix_transpose)) - - -# Utility functions for block access of ndarrays - - -def _canonical_idx(shape, idx_elt, axis, block_size=1): - """Canonicalize the indexer `idx_elt` to a slice.""" - k = block_size - block_dim = shape[axis] // k + bool(shape[axis] % k) - if isinstance(idx_elt, int): - idx_elt = idx_elt % block_dim - idx_elt = slice(idx_elt, idx_elt + 1, 1) - indices = tuple(onp.arange(block_dim)[idx_elt]) - if not indices: - return slice(0, 0, 1), False # sliced to size zero - start, stop_inclusive = indices[0], indices[-1] - step = 1 if idx_elt.step is None else idx_elt.step - if k != 1 and step != 1: - raise TypeError("Non-unit step supported only with block_size=1") - if step > 0: - end = min(k * (stop_inclusive + step), shape[axis]) - return slice(k * start, end, step), False - else: - end = min(k * (start - step), shape[axis]) - return slice(k * stop_inclusive, end, -step), True - - -def _matrix_put(ndarray, idx, val, block_size=1): - """Similar to numpy.put using LAX operations.""" - idx_i, idx_j = idx - sli, row_rev = _canonical_idx(ndarray.shape, idx_i, -2, block_size) - slj, col_rev = _canonical_idx(ndarray.shape, idx_j, -1, block_size) - if not sli.step == slj.step == 1: - raise TypeError("Non-unit step not supported in assigment.") - - if row_rev or col_rev: - val = lax.rev(val, *onp.where([row_rev, col_rev])) - - start_indices = [0] * (ndarray.ndim - 2) + [sli.start, slj.start] - return lax.dynamic_update_slice(ndarray, val, start_indices) - - -def _matrix_take(ndarray, idx, block_size=1): - """Similar to numpy.take using LAX operations.""" - idx_i, idx_j = idx - sli, row_rev = _canonical_idx(ndarray.shape, idx_i, -2, block_size) - slj, col_rev = _canonical_idx(ndarray.shape, idx_j, -1, block_size) - - start_indices = [0] * (ndarray.ndim - 2) + [sli.start, slj.start] - limit_indices = list(ndarray.shape[:-2]) + [sli.stop, slj.stop] - strides = [1] * (ndarray.ndim - 2) + [sli.step, slj.step] - out = lax.slice(ndarray, start_indices, limit_indices, strides) - - if row_rev or col_rev: - out = lax.rev(out, *onp.where([row_rev, col_rev])) - return out diff --git a/tests/lapax_test.py b/tests/lapax_test.py deleted file mode 100644 index d26015c1b2ac..000000000000 --- a/tests/lapax_test.py +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright 2018 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the LAPAX linear algebra module.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import itertools - -import numpy as onp -from absl.testing import absltest -from absl.testing import parameterized - -from jax import jit -from jax import test_util as jtu -from jax.experimental import lapax - -from jax.config import config -config.parse_flags_with_absl() - -# Primitive - -float_types = [onp.float32, onp.float64] - -class LapaxTest(jtu.JaxTestCase): - - def testSolveLowerTriangularVec(self): - npr = onp.random.RandomState(1) - lhs = onp.tril(npr.randn(3, 3)) - lhs2 = onp.tril(npr.randn(3, 3)) - rhs = npr.randn(3, 1) - rhs2 = npr.randn(3, 1) - - def check(fun, lhs, rhs): - a1 = onp.linalg.solve(lhs, rhs) - a2 = fun(lhs, rhs) - a3 = fun(lhs, rhs) - self.assertArraysAllClose(a1, a2, check_dtypes=True) - self.assertArraysAllClose(a2, a3, check_dtypes=True) - - solve_triangular = lambda a, b: lapax.solve_triangular( - a, b, left_side=True, lower=True, trans_a=False) - - fun = jit(solve_triangular) - check(fun, lhs, rhs) - check(fun, lhs2, rhs2) - - def testSolveLowerTriangularMat(self): - npr = onp.random.RandomState(1) - lhs = onp.tril(npr.randn(4, 4)) - lhs2 = onp.tril(npr.randn(4, 4)) - rhs = npr.randn(4, 3) - rhs2 = npr.randn(4, 3) - - def check(fun, lhs, rhs): - a1 = onp.linalg.solve(lhs, rhs) - a2 = fun(lhs, rhs) - a3 = fun(lhs, rhs) - self.assertArraysAllClose(a1, a2, check_dtypes=True) - self.assertArraysAllClose(a2, a3, check_dtypes=True) - - solve_triangular = lambda a, b: lapax.solve_triangular( - a, b, left_side=True, lower=True, trans_a=False) - - fun = jit(solve_triangular) - check(fun, lhs, rhs) - check(fun, lhs2, rhs2) - - def testSolveLowerTriangularBroadcasting(self): - npr = onp.random.RandomState(1) - lhs = onp.tril(npr.randn(3, 3, 3)) - lhs2 = onp.tril(npr.randn(3, 3, 3)) - rhs = npr.randn(3, 3, 2) - rhs2 = npr.randn(3, 3, 2) - - def check(fun, lhs, rhs): - a1 = onp.linalg.solve(lhs, rhs) - a2 = fun(lhs, rhs) - a3 = fun(lhs, rhs) - self.assertArraysAllClose(a1, a2, check_dtypes=True) - self.assertArraysAllClose(a2, a3, check_dtypes=True) - - solve_triangular = lambda a, b: lapax.solve_triangular( - a, b, left_side=True, lower=True, trans_a=False) - - fun = jit(solve_triangular) - check(fun, lhs, rhs) - check(fun, lhs2, rhs2) - - def testCholeskyMat(self): - npr = onp.random.RandomState(0) - square = lambda rhs: onp.dot(rhs, rhs.T) - arr = square(npr.randn(4, 4)) - arr2 = square(npr.randn(4, 4)) - - def check(fun, arr): - a1 = onp.linalg.cholesky(arr) - a2 = fun(arr) - a3 = fun(arr) - self.assertArraysAllClose(a1, a2, check_dtypes=True) - self.assertArraysAllClose(a2, a3, check_dtypes=True) - - fun = jit(lapax.cholesky) - check(fun, arr) - check(fun, arr2) - - def testBlockedCholeskyMat(self): - npr = onp.random.RandomState(0) - square = lambda rhs: onp.dot(rhs, rhs.T) - arr = square(npr.randn(11, 11)) - arr2 = square(npr.randn(11, 11)) - - chol = lambda x: lapax.cholesky(x, block_size=3) - - def check(fun, arr): - a1 = onp.linalg.cholesky(arr) - a2 = fun(arr) - a3 = fun(arr) - self.assertArraysAllClose(a1, a2, check_dtypes=True) - self.assertArraysAllClose(a2, a3, check_dtypes=True) - - fun = jit(chol) - check(fun, arr) - check(fun, arr2) - - @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": - "_lhs={}_rhs={}_lower={}_leftside={}_transposea={}".format( - jtu.format_shape_dtype_string(lhs_shape, dtype), - jtu.format_shape_dtype_string(rhs_shape, dtype), - lower, left, transpose_a), - "lower": lower, "left_side": left, "transpose_a": transpose_a, - "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "rng": rng} - for lower, left, transpose_a in itertools.product([False, True], repeat=3) - for lhs_shape, rhs_shape in [ - ((2, 4, 4), (2, 4, 6) if left else (2, 6, 4)), - ] - for dtype in float_types - for rng in [jtu.rand_default()])) - def testSolveTriangular(self, lower, left_side, transpose_a, lhs_shape, - rhs_shape, dtype, rng): - # pylint: disable=invalid-name - T = lambda X: onp.swapaxes(X, -1, -2) - K = rng(lhs_shape, dtype) - L = onp.linalg.cholesky(onp.matmul(K, T(K)) - + lhs_shape[-1] * onp.eye(lhs_shape[-1])) - L = L.astype(K.dtype) - B = rng(rhs_shape, dtype) - - A = L if lower else T(L) - inv = onp.linalg.inv(T(A) if transpose_a else A) - np_ans = onp.matmul(inv, B) if left_side else onp.matmul(B, inv) - - lapax_ans = lapax.solve_triangular( - L if lower else T(L), B, left_side, lower, transpose_a) - - self.assertAllClose(np_ans, lapax_ans, check_dtypes=False) - # pylint: enable=invalid-name - - @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": - "_lhs={}_rhs={}_lower={}_leftside={}_transposea={}".format( - jtu.format_shape_dtype_string(lhs_shape, dtype), - jtu.format_shape_dtype_string(rhs_shape, dtype), - lower, left, transpose_a), - "lower": lower, "left_side": left, "transpose_a": transpose_a, - "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "rng": rng} - for lower, left, transpose_a in itertools.product([False, True], repeat=3) - for lhs_shape, rhs_shape in [ - ((2, 8, 8), (2, 8, 10) if left else (2, 10, 8)), - ] - for dtype in float_types - for rng in [jtu.rand_default()])) - def testSolveTriangularBlocked(self, lower, left_side, transpose_a, lhs_shape, - rhs_shape, dtype, rng): - # pylint: disable=invalid-name - T = lambda X: onp.swapaxes(X, -1, -2) - K = rng(lhs_shape, dtype) - L = onp.linalg.cholesky(onp.matmul(K, T(K)) - + lhs_shape[-1] * onp.eye(lhs_shape[-1])) - L = L.astype(K.dtype) - B = rng(rhs_shape, dtype) - - A = L if lower else T(L) - inv = onp.linalg.inv(T(A) if transpose_a else A).astype(A.dtype) - np_ans = onp.matmul(inv, B) if left_side else onp.matmul(B, inv) - - lapax_ans = lapax.solve_triangular( - L if lower else T(L), B, left_side, lower, transpose_a, - block_size=3) - - self.assertAllClose(np_ans, lapax_ans, check_dtypes=False) - # pylint: enable=invalid-name - - -if __name__ == "__main__": - absltest.main() From 0eea9885026b7e18b07a4bd8488e32f8805741aa Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 15 Oct 2019 23:07:31 +0000 Subject: [PATCH 0211/1053] try following jupyterlab/jupyter-renderers#212 to fix travis --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8f2d5413cdc8..324f9bef52d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,8 +22,12 @@ before_install: fi - bash miniconda.sh -b -p $HOME/miniconda - export PATH="$HOME/miniconda/bin:$PATH" - - conda update --yes conda + - conda config --set always_yes yes --set changeps1 no --set show_channel_urls yes + - conda config --set channel_priority strict + - conda config --set add_pip_as_python_dependency yes + - conda config --remove channels defaults - conda config --add channels conda-forge + - conda update -q conda install: - conda install --yes python=$TRAVIS_PYTHON_VERSION pip six protobuf>=3.6.0 absl-py opt_einsum numpy scipy pytest-xdist fastcache - pip install jaxlib From 585cefc8c014f1b04bfd1523db017f6592384910 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 15 Oct 2019 23:49:15 +0000 Subject: [PATCH 0212/1053] document pmap with pytrees, fixes #1486 --- jax/api.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jax/api.py b/jax/api.py index 9b2a4c0e9486..75c6170bf9be 100644 --- a/jax/api.py +++ b/jax/api.py @@ -652,7 +652,7 @@ def pmap(fun, axis_name=None, devices=None, backend=None): devices available, as returned by ``jax.local_device_count()`` (unless ``devices`` is specified, see below). For nested ``pmap`` calls, the product of the mapped axis sizes must be less than or equal to the number of XLA - devices. TODO(skye): support < # local devices on multi-host platforms + devices. **Multi-host platforms:** On multi-host platforms such as TPU pods, ``pmap`` is designed to be used in SPMD Python programs, where every host is running @@ -667,7 +667,9 @@ def pmap(fun, axis_name=None, devices=None, backend=None): "sees" only its local shard of the input and output. Args: - fun: Function to be mapped over argument axes. + fun: Function to be mapped over argument axes. Its arguments and return + value should be arrays, scalars, or (nested) standard Python containers + (tuple/list/dict) thereof. axis_name: Optional, a hashable Python object used to identify the mapped axis so that parallel collectives can be applied. devices: This is an experimental feature and the API is likely to change. From 2f858bded88bc187a9a8f47b234572ae2ce3be56 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 15 Oct 2019 22:55:35 +0000 Subject: [PATCH 0213/1053] handle complex dtypes in psum fixes #1409 --- jax/lax/lax_parallel.py | 13 +++++++++++-- tests/pmap_test.py | 11 +++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 032df53b1633..062fdb2bfd22 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -193,11 +193,20 @@ def _allreduce_translation_rule(prim, c, val, replica_groups, backend=None): computation = xla.primitive_computation(prim, scalar, scalar, backend=backend) return c.AllReduce(val, computation, replica_groups=replica_groups) +# psum translation rule has special handling for complex dtypes +def _psum_translation_rule(c, val, replica_groups, backend=None): + psum = partial(_allreduce_translation_rule, lax.add_p, c, + replica_groups=replica_groups, backend=backend) + dtype = c.GetShape(val).numpy_dtype() + if onp.issubdtype(dtype, onp.complexfloating): + return c.Complex(psum(c.Real(val)), psum(c.Imag(val))) + else: + return psum(val) + psum_p = standard_pmap_primitive('psum') pxla.split_axis_rules[psum_p] = \ partial(_allreduce_split_axis_rule, psum_p, lax._reduce_sum) -xla.parallel_translations[psum_p] = \ - partial(_allreduce_translation_rule, lax.add_p) +xla.parallel_translations[psum_p] = _psum_translation_rule pxla.parallel_pure_rules[psum_p] = lambda x, shape: x * prod(shape) ad.deflinear(psum_p, lambda t, axis_name: [t]) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 091501abca0f..7da47b7e9c38 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -66,6 +66,17 @@ def testBasic(self): ans = f(x) self.assertAllClose(ans, expected, check_dtypes=False) + def testComplexPsum(self): + f = pmap(lambda x: x - lax.psum(x, 'i'), axis_name='i') + + shape = (xla_bridge.device_count(), 4 * 2) + x = onp.arange(prod(shape), dtype=onp.float32).reshape(shape).view(onp.complex64) + expected = x - onp.sum(x, 0) + + ans = f(x) + self.assertAllClose(ans, expected, check_dtypes=False) + + def testNestedBasic(self): f = lambda x: lax.psum(lax.psum(x, 'i'), 'j') f = pmap(pmap(f, 'i'), 'j') From eae59d0b2c9cc13e0f2b835c4daa6c7be23ba3b2 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 17 Oct 2019 08:58:25 +0200 Subject: [PATCH 0214/1053] Moved all notebooks to docs/notebooks. (#1493) * Moved all notebooks to docs/notebooks. Now all notebooks are in the same place, thus all are subject to auto-doc generation at readthedocs.io and to automated testing with travis. Some notebooks are too slow, exclude them at docs/conf.py:exclude_patterns. Cleanup a bit the section headings in notebooks so that they show up well in readtehdocs.io. * Increase the cell timeout for executing notebooks * Exclude also the neural network notebook from auto-generation (timing out) * Disable the score_matching notebook from auto-doc (travis does not have sklearn) --- README.md | 13 +- docs/conf.py | 11 +- docs/developer.rst | 27 +- docs/index.rst | 9 +- .../Neural_Network_and_Data_Loading.ipynb | 178 +++- .../notebooks}/XLA_in_Python.ipynb | 28 +- {notebooks => docs/notebooks}/maml.ipynb | 4 +- .../neural_network_with_tfds_data.ipynb | 0 docs/notebooks/score_matching.ipynb | 802 +++++++++++++++++ docs/notebooks/vmapped_log_probs.ipynb | 660 ++++++++++++++ docs/requirements.txt | 5 +- notebooks/README.md | 27 - notebooks/score_matching.ipynb | 803 ------------------ notebooks/vmapped log-probs.ipynb | 668 --------------- 14 files changed, 1653 insertions(+), 1582 deletions(-) rename notebooks/neural_network_and_data_loading.ipynb => docs/notebooks/Neural_Network_and_Data_Loading.ipynb (71%) rename {notebooks => docs/notebooks}/XLA_in_Python.ipynb (97%) rename {notebooks => docs/notebooks}/maml.ipynb (99%) rename {notebooks => docs/notebooks}/neural_network_with_tfds_data.ipynb (100%) create mode 100644 docs/notebooks/score_matching.ipynb create mode 100644 docs/notebooks/vmapped_log_probs.ipynb delete mode 100644 notebooks/README.md delete mode 100644 notebooks/score_matching.ipynb delete mode 100644 notebooks/vmapped log-probs.ipynb diff --git a/README.md b/README.md index f5ca8b26eb45..7e2aae951ee4 100644 --- a/README.md +++ b/README.md @@ -85,16 +85,17 @@ open](https://github.com/google/jax) by a growing number of ## Quickstart: Colab in the Cloud Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: - [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/quickstart.ipynb) -- [Training a Simple Neural Network, with PyTorch Data Loading](https://colab.research.google.com/github/google/jax/blob/master/notebooks/neural_network_and_data_loading.ipynb) -- [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/notebooks/neural_network_with_tfds_data.ipynb) +- [Training a Simple Neural Network, with PyTorch Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Neural_Network_and_Data_Loading.ipynb) +- [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/neural_network_with_tfds_data.ipynb) And for a deeper dive into JAX: - [Common gotchas and sharp edges](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb) - [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/autodiff_cookbook.ipynb) -- [Directly using XLA in Python](https://colab.research.google.com/github/google/jax/blob/master/notebooks/XLA_in_Python.ipynb) -- [MAML Tutorial with JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/maml.ipynb) -- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://colab.research.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb). -[How JAX primitives work](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/How_JAX_primitives_work.ipynb) +- [Directly using XLA in Python](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/XLA_in_Python.ipynb) +- [How JAX primitives work](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/How_JAX_primitives_work.ipynb) +- [MAML Tutorial with JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/maml.ipynb) +- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/score_matching.ipynb). + ## Installation JAX is written in pure Python, but it depends on XLA, which needs to be compiled diff --git a/docs/conf.py b/docs/conf.py index 19489a27bfca..d130881c5c8b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -89,7 +89,13 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] +exclude_patterns = [ + # Slow notebook: long time to load tf.ds + 'notebooks/neural_network_with_tfds_data.ipynb', + 'notebooks/Neural_Network_and_Data_Loading.ipynb', + # Next one needs sklearn, which is not available at Travis. + 'notebooks/score_matching.ipynb' +] # The name of the Pygments (syntax highlighting) style to use. pygments_style = None @@ -101,6 +107,7 @@ # -- Options for nbsphinx ----------------------------------------------------- # Execute notebooks before conversion: 'always', 'never', 'auto' (default) +# We execute all notebooks, exclude the slow ones using 'exclude_patterns' nbsphinx_execute = 'always' # Use this kernel instead of the one stored in the notebook metadata: @@ -114,7 +121,7 @@ # Controls when a cell will time out (defaults to 30; use -1 for no timeout): -nbsphinx_timeout = 60 +nbsphinx_timeout = 90 # Default Pygments lexer for syntax highlighting in code cells: #nbsphinx_codecell_lexer = 'ipython3' diff --git a/docs/developer.rst b/docs/developer.rst index 00667f0eab70..943362e06171 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -94,18 +94,35 @@ The Colab notebooks are tested for errors as part of the documentation build. Update documentation ==================== -To rebuild the documentation, -install the ``sphinx`` and ``sphinx_rtd_theme`` pip -packages and then run at the top-level: +To rebuild the documentation, install several packages: .. code-block:: shell - sphinx-build -M html docs docs/build + pip install -r docs/requirements.txt +You must also install ``pandoc`` in order to regenerate the notebooks. +See `Install Pandoc `_. On Mac, I had success with +the miniconda installer, then ``conda install -c conda-forge pandoc``. +If you do not want to install ``pandoc`` then you should regenerate the documentation +without the notebooks. + +You run at top-level one of the following commands: + +.. code-block:: shell + + sphinx-build -b html docs docs/build/html # with the notebooks + sphinx-build -b html -D nbsphinx_execute=never docs docs/build/html # without the notebooks You can then see the generated documentation in ``docs/build/html/index.html``. +Update notebooks +---------------- + +Open the notebook with http://colab.research.google.com, update it, ``Run all cells`` then +``Download ipynb``. You may want to test that it executes properly, using ``sphinx-build`` as +explained above. + Documentation building on readthedocs.io ---------------------------------------- @@ -115,7 +132,7 @@ The documentation building is controlled for the entire project by the `readthedocs JAX settings `_. The current settings trigger a documentation build as soon as code is pushed to the GitHub ``master`` branch. For each code version, the building process is driven by the -:file:`.readthedocs.yml` and the ``docs/conf.py`` configuration files. +``.readthedocs.yml`` and the ``docs/conf.py`` configuration files. For each automated documentation build you can see the `documentation build logs `_. diff --git a/docs/index.rst b/docs/index.rst index e08e930ee60d..10f26434c8fb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,13 +13,20 @@ For an introduction to JAX, start at the notebooks/quickstart notebooks/autodiff_cookbook + Training a Simple Neural Network, with PyTorch Data Loading + .. toctree:: :maxdepth: 1 - :caption: Advanced Tutorials + :caption: Advanced JAX Tutorials notebooks/Common_Gotchas_in_JAX + notebooks/XLA_in_Python notebooks/How_JAX_primitives_work + Training a Simple Neural Network, with Tensorflow Datasets Data Loading + notebooks/maml + Generative Modeling by Estimating Gradients of Data Distribution + notebooks/vmapped_log_probs .. toctree:: :maxdepth: 1 diff --git a/notebooks/neural_network_and_data_loading.ipynb b/docs/notebooks/Neural_Network_and_Data_Loading.ipynb similarity index 71% rename from notebooks/neural_network_and_data_loading.ipynb rename to docs/notebooks/Neural_Network_and_Data_Loading.ipynb index 0b1295bb5142..6dffc931d240 100644 --- a/notebooks/neural_network_and_data_loading.ipynb +++ b/docs/notebooks/Neural_Network_and_Data_Loading.ipynb @@ -3,8 +3,7 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "neural-network-and-data-loading.ipynb", - "version": "0.3.2", + "name": "Neural Network and Data Loading.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true @@ -23,19 +22,11 @@ "colab_type": "text" }, "source": [ - "##### Copyright 2018 Google LLC.\n", + "# Training a Simple Neural Network, with PyTorch Data Loading\n", "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "crfqaJOyp8bq", - "colab_type": "text" - }, - "source": [ - "Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "**Copyright 2018 Google LLC.**\n", + "\n", + "Licensed under the Apache License, Version 2.0 (the \"License\");", "you may not use this file except in compliance with the License.\n", "You may obtain a copy of the License at\n", "\n", @@ -55,11 +46,9 @@ "colab_type": "text" }, "source": [ - "# Training a Simple Neural Network, with PyTorch Data Loading\n", - "\n", "![JAX](https://raw.githubusercontent.com/google/jax/master/images/jax_logo_250px.png)\n", "\n", - "Let's combine everything we showed in the [quickstart notebook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/quickstart.ipynb) to train a simple neural network. We will first specify and train a simple MLP on MNIST using JAX for the computation. We will use PyTorch's data loading API to load images and labels (because it's pretty great, and the world doesn't need yet another data loading library).\n", + "Let's combine everything we showed in the [quickstart notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/quickstart.ipynb) to train a simple neural network. We will first specify and train a simple MLP on MNIST using JAX for the computation. We will use PyTorch's data loading API to load images and labels (because it's pretty great, and the world doesn't need yet another data loading library).\n", "\n", "Of course, you can use JAX with any API that is compatible with NumPy to make specifying the model a bit more plug-and-play. Here, just for explanatory purposes, we won't use any neural network libraries or special APIs for builidng our model." ] @@ -87,7 +76,7 @@ "colab_type": "text" }, "source": [ - "### Hyperparameters\n", + "## Hyperparameters\n", "Let's get a few bookkeeping items out of the way." ] }, @@ -113,7 +102,7 @@ "layer_sizes = [784, 512, 512, 10]\n", "param_scale = 0.1\n", "step_size = 0.0001\n", - "num_epochs = 10\n", + "num_epochs = 8\n", "batch_size = 128\n", "n_targets = 10\n", "params = init_network_params(layer_sizes, random.PRNGKey(0))" @@ -128,7 +117,7 @@ "colab_type": "text" }, "source": [ - "### Auto-batching predictions\n", + "## Auto-batching predictions\n", "\n", "Let us first define our prediction function. Note that we're defining this for a _single_ image example. We're going to use JAX's `vmap` function to automatically handle mini-batches, with no performance penalty." ] @@ -175,7 +164,11 @@ "metadata": { "id": "4sW2A5mnXHc5", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "9d3b29e8-fab3-4ecb-9f63-bc8c092f9006" }, "source": [ "# This works on single examples\n", @@ -183,15 +176,27 @@ "preds = predict(params, random_flattened_image)\n", "print(preds.shape)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(10,)\n" + ], + "name": "stdout" + } + ] }, { "cell_type": "code", "metadata": { "id": "PpyQxuedXfhp", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "d5d20211-b6da-44e9-f71e-946f2a9d0fc4" }, "source": [ "# Doesn't work with a batch\n", @@ -201,15 +206,27 @@ "except TypeError:\n", " print('Invalid shapes!')" ], - "execution_count": 0, - "outputs": [] + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Invalid shapes!\n" + ], + "name": "stdout" + } + ] }, { "cell_type": "code", "metadata": { "id": "oJOOncKMXbwK", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "31285fab-7667-4871-fcba-28e86adc3fc6" }, "source": [ "# Let's upgrade it to handle batches using `vmap`\n", @@ -221,8 +238,16 @@ "batched_preds = batched_predict(params, random_flattened_images)\n", "print(batched_preds.shape)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(10, 10)\n" + ], + "name": "stdout" + } + ] }, { "cell_type": "markdown", @@ -241,7 +266,7 @@ "colab_type": "text" }, "source": [ - "### Utility and loss functions" + "## Utility and loss functions" ] }, { @@ -281,7 +306,7 @@ "colab_type": "text" }, "source": [ - "### Data Loading with PyTorch\n", + "## Data Loading with PyTorch\n", "\n", "JAX is laser-focused on program transformations and accelerator-backed NumPy, so we don't include data loading or munging in the JAX library. There are already a lot of great data loaders out there, so let's just use them instead of reinventing anything. We'll grab PyTorch's data loader, and make a tiny shim to make it work with NumPy arrays." ] @@ -291,13 +316,30 @@ "metadata": { "id": "gEvWt8_u2pqG", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 139 + }, + "outputId": "2c83a679-9ce5-4c67-bccb-9ea835a8eaf6" }, "source": [ "!pip install torch torchvision" ], - "execution_count": 0, - "outputs": [] + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Requirement already satisfied: torch in /usr/local/lib/python3.6/dist-packages (1.2.0)\n", + "Requirement already satisfied: torchvision in /usr/local/lib/python3.6/dist-packages (0.4.0)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from torch) (1.16.5)\n", + "Requirement already satisfied: pillow>=4.1.1 in /usr/local/lib/python3.6/dist-packages (from torchvision) (4.3.0)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from torchvision) (1.12.0)\n", + "Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow>=4.1.1->torchvision) (0.46)\n" + ], + "name": "stdout" + } + ] }, { "cell_type": "code", @@ -366,7 +408,11 @@ "metadata": { "id": "FTNo4beUvb6t", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "outputId": "65a9087c-c326-49e5-cbfc-e0839212fa31" }, "source": [ "# Get the full train dataset (for checking accuracy while training)\n", @@ -378,8 +424,23 @@ "test_images = np.array(mnist_dataset_test.test_data.numpy().reshape(len(mnist_dataset_test.test_data), -1), dtype=np.float32)\n", "test_labels = one_hot(onp.array(mnist_dataset_test.test_labels), n_targets)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/torchvision/datasets/mnist.py:53: UserWarning: train_data has been renamed data\n", + " warnings.warn(\"train_data has been renamed data\")\n", + "/usr/local/lib/python3.6/dist-packages/torchvision/datasets/mnist.py:43: UserWarning: train_labels has been renamed targets\n", + " warnings.warn(\"train_labels has been renamed targets\")\n", + "/usr/local/lib/python3.6/dist-packages/torchvision/datasets/mnist.py:58: UserWarning: test_data has been renamed data\n", + " warnings.warn(\"test_data has been renamed data\")\n", + "/usr/local/lib/python3.6/dist-packages/torchvision/datasets/mnist.py:48: UserWarning: test_labels has been renamed targets\n", + " warnings.warn(\"test_labels has been renamed targets\")\n" + ], + "name": "stderr" + } + ] }, { "cell_type": "markdown", @@ -388,7 +449,7 @@ "colab_type": "text" }, "source": [ - "### Training Loop" + "## Training Loop" ] }, { @@ -396,7 +457,11 @@ "metadata": { "id": "X2DnZo3iYj18", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 425 + }, + "outputId": "0eba3ca2-24a1-4cba-aaf4-3ac61d0c650e" }, "source": [ "import time\n", @@ -414,8 +479,39 @@ " print(\"Training set accuracy {}\".format(train_acc))\n", " print(\"Test set accuracy {}\".format(test_acc))" ], - "execution_count": 0, - "outputs": [] + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Epoch 0 in 5.19 sec\n", + "Training set accuracy 0.9593999981880188\n", + "Test set accuracy 0.9559000730514526\n", + "Epoch 1 in 4.42 sec\n", + "Training set accuracy 0.9792166948318481\n", + "Test set accuracy 0.971500039100647\n", + "Epoch 2 in 4.47 sec\n", + "Training set accuracy 0.9883999824523926\n", + "Test set accuracy 0.9779000282287598\n", + "Epoch 3 in 4.55 sec\n", + "Training set accuracy 0.9918666481971741\n", + "Test set accuracy 0.9794000387191772\n", + "Epoch 4 in 4.47 sec\n", + "Training set accuracy 0.9939500093460083\n", + "Test set accuracy 0.9784000515937805\n", + "Epoch 5 in 4.46 sec\n", + "Training set accuracy 0.9948500394821167\n", + "Test set accuracy 0.9793000221252441\n", + "Epoch 6 in 4.55 sec\n", + "Training set accuracy 0.9959666728973389\n", + "Test set accuracy 0.9788000583648682\n", + "Epoch 7 in 4.51 sec\n", + "Training set accuracy 0.9974666833877563\n", + "Test set accuracy 0.979900062084198\n" + ], + "name": "stdout" + } + ] }, { "cell_type": "markdown", diff --git a/notebooks/XLA_in_Python.ipynb b/docs/notebooks/XLA_in_Python.ipynb similarity index 97% rename from notebooks/XLA_in_Python.ipynb rename to docs/notebooks/XLA_in_Python.ipynb index afaeeeaa8ccb..2fb696167329 100644 --- a/notebooks/XLA_in_Python.ipynb +++ b/docs/notebooks/XLA_in_Python.ipynb @@ -3,7 +3,7 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "XLA in Python", + "name": "XLA in Python.ipnb", "version": "0.3.2", "provenance": [], "collapsed_sections": [] @@ -27,30 +27,6 @@ } }, "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "LL3kRdXs5zzD" - }, - "source": [ - "##### Copyright 2018 Google LLC.\n", - "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "\n", - "Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "you may not use this file except in compliance with the License.\n", - "You may obtain a copy of the License at\n", - "\n", - "https://www.apache.org/licenses/LICENSE-2.0\n", - "\n", - "Unless required by applicable law or agreed to in writing, software\n", - "distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "See the License for the specific language governing permissions and\n", - "limitations under the License." - ] - }, { "cell_type": "markdown", "metadata": { @@ -868,7 +844,7 @@ "id": "9-0PJlqv237S" }, "source": [ - "# Fin \n", + "## Fin \n", "\n", "There's much more to XLA, but this hopefully highlights how easy it is to play with via the python client!" ] diff --git a/notebooks/maml.ipynb b/docs/notebooks/maml.ipynb similarity index 99% rename from notebooks/maml.ipynb rename to docs/notebooks/maml.ipynb index ff5728449c47..5142b118867d 100644 --- a/notebooks/maml.ipynb +++ b/docs/notebooks/maml.ipynb @@ -44,7 +44,7 @@ "\n", "Pedagogical tutorial for implementing Model-Agnostic Meta-Learning with JAX's awesome `grad` and `vmap` and `jit` operators.\n", "\n", - "### Overview\n", + "## Overview\n", "\n", "In this notebook we'll go through:\n", "\n", @@ -63,7 +63,7 @@ "colab": {} }, "source": [ - "# import jax.numpy (almost-drop-in for numpy) and gradient operators.\n", + "### import jax.numpy (almost-drop-in for numpy) and gradient operators.\n", "import jax.numpy as np\n", "from jax import grad" ], diff --git a/notebooks/neural_network_with_tfds_data.ipynb b/docs/notebooks/neural_network_with_tfds_data.ipynb similarity index 100% rename from notebooks/neural_network_with_tfds_data.ipynb rename to docs/notebooks/neural_network_with_tfds_data.ipynb diff --git a/docs/notebooks/score_matching.ipynb b/docs/notebooks/score_matching.ipynb new file mode 100644 index 000000000000..9d58ab5d5839 --- /dev/null +++ b/docs/notebooks/score_matching.ipynb @@ -0,0 +1,802 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "score_matching.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "U6IRW9a8G6TB" + }, + "source": [ + "# Generative Modeling by Estimating Gradients of Data Distribution in JAX\n", + "\n", + "[![Run in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.sandbox.google.com/github/google/jax/blob/master/docs/notebooks/score_matching.ipynb)\n", + "\n", + "In this notebook we'll implement __Generative Modeling by Estimating Gradients of the Data Distribution__ [[arxiv]](https://arxiv.org/abs/1907.05600).\n", + "\n", + "The paper builds on a technique called __Score Matching__ to iteratively refine images into samples from the real data. This technique takes advantage of some recent theorems to learn the gradients of data probability distribution. Implementing this in your typical DL framework would become an issue. However, [__`JAX`__](https://github.com/google/jax) ain't your typical DL framework. JAX makes implementing complex math no harder than writing it on a piece of paper.\n", + "\n", + "Let's begin with a simple task: learn to sample from a peculiar probability distribution. Like a swiss roll, for example:\n", + "\n", + "![img](https://i.imgur.com/zMR6Iej.jpg)\n", + "\n", + "well... minus the chocolate. Sorry for that." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "0P1xCZPNG6TE", + "outputId": "69be38a1-1f02-462e-f4f1-16a41c35fddf", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + } + }, + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import numpy as onp\n", + "\n", + "from sklearn.datasets import make_swiss_roll\n", + "\n", + "def sample_batch(size, noise=1.0):\n", + " x, _= make_swiss_roll(size, noise=noise)\n", + " x = x[:, [0, 2]] / 10.0\n", + " return onp.array(x)\n", + "\n", + "plt.scatter(*sample_batch(10**4).T, alpha=0.1)" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "5X-LN4rwG6TH" + }, + "source": [ + "### Compute score matching objective\n", + "\n", + "The method we apply here was originally proposed by [Hyvarinen et al. (2005)](http://jmlr.org/papers/volume6/hyvarinen05a/old.pdf). The idea behind score matching is to __learn scores:__ the gradients of $\\log p(x)$ w.r.t. $x$. When trained this model can \"improve\" a sample $x$ by changing it in the direction of highest log-probability. However, training such model can get tricky. When predicting a continuous variable, ML folks usually minimize squared error:\n", + "\n", + "$$ L_{mse} = E_{x \\sim p(x)} \\left\\lVert model(x) - \\nabla_x \\log p(x) \\right\\lVert_2^2 $$\n", + "\n", + "One can't minimize this explicitly because the real $\\nabla_x log p(x)$ is usually unknown. However under broad assumptions on p(x) and a sufficiently powerful model, one can say that ` ... math happens ... ` and therefore the arg-minimum of $L_{mse}$ can be found by minimizing a more tractable objective:\n", + "\n", + "$$ L_{matching} = E_{x \\sim p(x)} \\space tr( \\space \\mathbf{J}_x [\\space model(x) \\space]) + \\frac12 \\left\\Vert model(x) \\right\\lVert_2^2 $$\n", + "\n", + "Here $tr( \\space \\mathbf{J}_x [\\space model(x) \\space])$ is a trace of Jacobian of $model(x)$ w.r.t. $x$. Now all it takes is to minimize the second objective with backpropagation... that is, if you can compute jacobians. Thankfully, we have __jax__!" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "98wjxKcNG6TI", + "colab": {} + }, + "source": [ + "import jax\n", + "import jax.numpy as np\n", + "from jax.experimental import optimizers\n", + "from jax.experimental import stax\n", + "from functools import partial\n", + "\n", + "# Set up network to predict scores\n", + "net_init, net_apply = stax.serial(\n", + " stax.Dense(128), stax.Softplus,\n", + " stax.Dense(128), stax.Softplus,\n", + " stax.Dense(2),\n", + ")\n", + "\n", + "# Create optimizer. Note that both network and optimizer returns pure (stateless) functions\n", + "opt_init, opt_update, get_params = optimizers.adam(1e-3)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "FgH-YVaZG6TJ", + "colab": {} + }, + "source": [ + "# v-- jax.jit compiles a function for efficient CPU and GPU execution\n", + "\n", + "@jax.jit\n", + "def compute_loss(net_params, inputs):\n", + " # v-- a function that computes jacobian by forward mode differentiation\n", + " jacobian = jax.jacfwd(net_apply, argnums=-1)\n", + " \n", + " # we use jax.vmap to vectorize jacobian function along batch dimension\n", + " batch_jacobian = jax.vmap(partial(jacobian, net_params))(inputs) # [batch, dim, dim]\n", + " \n", + " trace_jacobian = np.trace(batch_jacobian, axis1=1, axis2=2)\n", + " output_norm_sq = np.square(net_apply(net_params, inputs)).sum(axis=1)\n", + " \n", + " return np.mean(trace_jacobian + 1/2 * output_norm_sq)\n", + "\n", + "\n", + "@jax.jit\n", + "def train_step(step_i, opt_state, batch):\n", + " net_params = get_params(opt_state)\n", + " loss = compute_loss(net_params, batch)\n", + " grads = jax.grad(compute_loss, argnums=0)(net_params, batch)\n", + " return loss, opt_update(step_i, grads, opt_state)\n", + "\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LkTYRi6qCwn8", + "colab_type": "text" + }, + "source": [ + "__Note__: we use `jax.jacfwd` since the input dimention is only 2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Qxza8fDvG6TL" + }, + "source": [ + "### Training loop" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "NNlbbWNIG6TM", + "colab": {} + }, + "source": [ + "from IPython.display import clear_output\n", + "\n", + "out_shape, net_params = net_init(jax.random.PRNGKey(seed=42), input_shape=(-1, 2))\n", + "opt_state = opt_init(net_params)\n", + "\n", + "loss_history = []" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "evDOnCHiG6TN", + "outputId": "989db5fe-24a2-41ba-fb01-6d981df7cd06", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 499 + } + }, + "source": [ + "for i in range(2000):\n", + " x = sample_batch(size=128)\n", + " loss, opt_state = train_step(i, opt_state, x)\n", + " loss_history.append(loss.item())\n", + " \n", + " if i % 200 == 0:\n", + " clear_output(True)\n", + " plt.figure(figsize=[16, 8])\n", + " plt.subplot(1, 2, 1)\n", + " plt.title(\"mean loss = %.3f\" % np.mean(np.array(loss_history[-32:])))\n", + " plt.scatter(np.arange(len(loss_history)), loss_history)\n", + " plt.grid()\n", + " \n", + " plt.subplot(1, 2, 2)\n", + " net_params = get_params(opt_state)\n", + " xx = np.stack(np.meshgrid(np.linspace(-1.5, 2.0, 50), np.linspace(-1.5, 2.0, 50)), axis=-1).reshape(-1, 2)\n", + " scores = net_apply(net_params, xx)\n", + " scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", + " scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", + "\n", + " plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", + " plt.xlim(-1.5, 2.0)\n", + " plt.ylim(-1.5, 2.0)\n", + " plt.show()" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\nojwDM9ZW1izqvoihdYdy4cEFZp2ehc9dnxzd0daRTX030at6Ly4+uMik45PYcW1HzkqMok5F2T5g\nO+1fac/5iPNMODqB5ZeW5wyslCpUio19N9KgdAPOhp/li0NfMPfs3Jw2lipUiuVvLqeye2VO3D3B\nuIPjmHJiSk5Gc8lCJfmt628UdyrOwdCDjDs4jglHJnDp4SVkWaa4c3GmdpiKnbUdO6/v5KsjX/HZ\n/s/wDvPGYDLg7ujOVy2/ItOQyfrA9Xx79FtG7xvN3pC9+a7myI9nWbVYQ0ND45nwos9CP4kRV1qO\nvPHc/QLviU3S6RncrJyFmXW0tebHN2syvU9t1YJSz4p1vsrLu54GCcuYJY0nxgPIvdYy/K+f5YtJ\nNrGp7yZhFEcF1wqExoey4I0FvOL6ioVexb0KofGhvF/vfXpU62Ghm6MeyruW54e2P1jokiRRzKkY\nmYZMlvRYIjRHVYpW4X7SfeZ0niM0R+WKlCMpM4mhdYfStGxTC93BxoFCdoWo5FaJ0Y1HC6+Bp4sn\nBpOBqe2nCvXK7pVJzkzm+zbfCw1UUaeiONg4MKjWIGHEjo2VDW4ObtQsUZPer/YWnsPDxQMHGwdG\nNRol1Is7F6eQXSGG1Rsm1K0la4o7FWdQrUHCGA+TbKKwfWEalG4gHLQAcLJ1onyR8nSu1Fmoy7JM\nzRI1aVu+rVDX6XV4unjSs5p4DEWWZRxtHWn3SjvFyCZZlnmt4mt4uIhv38SMRDpX7EwV9yqKbXi1\n2Ks087AceDHj7uhOt6rdFGeNTbKJYfWGoTOIV4w8TH3Iu3XepahjUaGerk+n3SvtFM06ZM84vl75\ndZIyxUULSxUqxfD6w4lNjxXq1pI179Z9l8J2hYW6rbUt3at2p1aJWsIlsJIk0b1qd7pX6a64zPWN\nKm/Qu3pvPF08hXrv6r3p/Wpv2pRvI9Tfq/ceb9d+m8rulYX6+BbjGdt0LHqTeCXH922+Z2bHmVyP\nE8/e/9D2B1a8uYILDy6QoEsQ6jsG7CBeFy+cOZ7cfjJeb3tRyb0SP534yUL/qf1PHHznID2r9eTd\nXe/mMcOSJDH9tekcGHyAL1t8yfA9w/MshZYkidmdZnNg8AF+7fIr/zv3P9ZeXpujW1tZ87+u/2P/\n4P2s670O7zBvRnv9//eTrbUtC7svxOttL3YN3EVESgTtVrXL2TbgYOPAsjeXsXfQXo68ewRbK1ve\n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\nzOv6/9/Fg2oPot0r7SjhXIKd13cy2ms0u9/anbM3+Z0679ChQgdKFyrN8TvHmXF6BuNbjKdZ2WYA\nvFfvPTpW7EhZl7JceniJ5ZeWExwTzBctvkCSJIY3GE7Hih0p71qeG3E3WB+4nuF7hrOp3yYkSWJk\nw5F0rNiRim4VuZ90n+3XttNvSz92DNxBCecSfNjoQzpV6kS5IuVI0CWw98Zexh8eL3yvCor0b1zv\nbKZRo0byxYvK6/0LyvHjx2nXrt3TN+hfwMvUF3i5+qP15d/Jv70vj5NnW9C+tJxxTNGoOtpa07eh\nB9v9IhTN6aPFn54XX9Q2MCdIfTzV2c6an3s/m9nypwld1/h/6tavK1/2V14i+TDloeKDKGQ/tNvb\n2AuNrpmYtBiKOxdX1OPS44QP82YSdAmqGayyLJOSlYKLvYvia1IyU4SzrWbSstJUM1gzDZnYWNmo\nFqjJMGSoXof8CujkVyAH8i8C9CyK6IB6JqVWaEdDQ0OJp/nbrM3IamhoaPyDPI+Z4fyWDntfj2F6\nn9r8uOcqibq8hSf+LhPrZGuFVQEebNOyjHy+OYDZB0NUTb7G30d+xknNxEL2frD8UDOxgKqJBVRN\nLGSbLjUTC6iaWEDVxAKqBtSMmoktyDHyey8AVRMLqJpYQNXEgrqBfZzXaGhoaDwu2h5ZDQ0NjZeM\n/PaTPkjU0au+BwE/dGbewHp59go/KxOr9thqay0xrU8dPNwcC1QBWeb/Y3h2+Uc8oxZqaGhoaGho\nvMhoRlZDQ0PjJUNUlTk3uY2uuaBT2IxunJ7QAQ8FE/w4Eyrm17o62uLmlG1Urf/6oYerI7P7/X9x\nqkyDevxKbrQYHg0NDQ0NDQ0zmpHV0NDQeMkwV2UWzXbmVzhJKZpocNNyquY4N7KcPYuaqNOTkJ69\ndNkoyznnNpvYqKSMxy4ipcXwaGi8eORXj0WW5afOJVbLaIXnn0mclpWmqqvl5AKKEUhm4tLjVPXo\ntGjVaxiZGqmqP0h5oHqNlTJKzdxPuq96/LuJd1V1pZgqMxHJ6qtx8stbVrt+siwrFvuC7HtL7f7J\n797UeH5oRlZDQ0PjJURp6fCjMUO7/CNoOeMYFSZ40XJGduSBKJpoaq/aTO9TO2dm9Ul4dEY1y/j4\nf/y1GJ5/B0aTMd8Hx/weTMMSwlQfbMOTw1VzOZMzk1UfbvVGvWq0gyzLBEQGqLbR74Gfahuvx14n\n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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Ug91tS-RG6TP" + }, + "source": [ + "### Plot gradient directions\n", + "Once the model is trained we can use it to predict scores at each point. Since those are gradient vectors, we'll use [`Quiver Plot`](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.quiver.html) to draw them." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "x6SkLg0VG6TQ", + "outputId": "710ab2f4-c3c7-4a3b-f929-e84957fbb233", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 938 + } + }, + "source": [ + "plt.figure(figsize=[16, 16])\n", + "\n", + "net_params = get_params(opt_state)\n", + "xx = np.stack(np.meshgrid(np.linspace(-1.5, 1.5, 50), np.linspace(-1.5, 1.5, 50)), axis=-1).reshape(-1, 2)\n", + "scores = net_apply(net_params, xx)\n", + "scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", + "scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", + "\n", + "plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", + "plt.scatter(*sample_batch(10_000).T, alpha=0.25)" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 26 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nIAgCGqWccK2SzPIrz9QT+UaKjVbOl5qwOr1UWxyUmmz8lHGZyZ0fRkd/YsO8LSKTJ/JrW7WfN/aJ\nXKbgjr6LUHp7UW4MZfO5MjQqOVP7RhNn0GF1eam3eUiKDSFU47cNN416JkUlMSFhAokRic0m4Vfv\nZ20ts7HN5WVM68GhbwAAIABJREFUgt8eedfAu1qdBLcnHhNjNShlodyWdCd1NienC42Y7R4GdjFQ\nWe9g7XF/pubWxHxjMrbb+t7WaqLI1sZuUxtueUM5AgLr7lhH3+i+LfhtoVG4Du00lL0P7CVGH9MO\n4wqOlhyl2lYNwH9N+K+gRLPT4ww4lGL1sWy+ezOr56+WvCfw9YOvB5JATUiYwKnHTrFy3kpJSY1+\nyPyB3fm7AX+ixAeSH+DiUxf59s5vidZFt8mtslY12yJjUBt4bvRzHH/kOLOSZrXJFUWRx7c9Tq4x\nN3CsW1g3fjX0V9zY88Z2o71bsrbw8v7m2fuTIpOoaKhod7G1ylrFzLUzA9erESX1JXyd+nWb7wtR\nFPn1z7/mi3PN3Uwur4vf7flduxmYj5Yc5ea1N7eYm23O2tzufMnqsjJn3ZwWn3N4HPzjxD/ane+t\nTF3pz7TttjY7fqzkWCAh4LVQXF/M+K/GsyNnR7PjPtFHSkmKpH3UHbgC4V+pb/SfxsiRI8XTp6XZ\nBf9/QUZVBs/99BzPjH6G2/reFjS/zFzGi3teZGjcUH47/rdB8y1OC68ffB2z08xnc6QnqGmEx+dh\n2Yll7Mzdyc8Lfw7ariCKIt9nfs9bh98i5eGU6/LnHys5xtKdS/n+ru8lrf5djXxTPku2L+HXY37N\nzb1vDppvspv43Z7fMSBmAM+NeS5ovtvr5r2j71FmLuPjWz8Omi+KIusz1rMuYx1b75W2T/JqpBSn\n8Pu9v2f3ot2Ss0Q3Rb4pn8e3Pc4Xt31xXdegzlHHr3/+NfcOupebet0UNN/tdfP2kbeJ0kWxZNSS\noPmiKLL2/FouVl/kL9NbzwzbHg4VHWJV6iq+nCvd8tsU2TXZvLTvJTYs2CDZbtcUVdYqlu5Yype3\nfUmouu39Xa3B5rbxzM5neHnSy9d1DT0+D6/se4V5/eYxuuvo9glX4fClKtZlfA+uBIZ36Y8ggMPt\nRSmXMSjeQK3VyZzktieHK86sQC6GEykfR8gv2WAbM5s2tQ8eyanG4fY1yz5rdXo4XLyXpC4+Fg5Z\n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\n89Q32FJ7nH0NPtoCkTN+Z2DEUkfj+WPPoRMjIgk4TVkoenhQ1NxuNtDQE/pw7nUGk2WjZKGNpkAr\n4bhOR7CFIk8ZmY5Czsl2EowpnOxIjJeiqDT1RlBP6WpGUUDVoCPUg4qEX+ogJKsUORawPOcOjCLE\nTouQ9huM/efTB3U7eaNyA0c7jvDzHb+jwr+Fc3Pm8tVlN9F9qrTa4PNETp6hdd3dXPnslWxreYtn\nT36PL21ayo6uJ1laPIv3bnmPmGQYMfL9+72/55ZXb2Fn806ufOZKznviPDbUbmBJ/hLe/ey7I17B\nqvPXcd6fzmNn807+evivzP39XC7762VsqN3AorxFvPSpl7h73t1Dyiqawtff+Tq3rr2Vvngf3//g\n+xT/rJjrXryODbUbmJczjz9d8ycev/rxIeW3NGxhzu/mUOevY3vTdu56/S5yHsth9ZrVvFv7LnNz\n5vLLK37J7jt2n2G0BmIBVq9Zzfc2fY+QFOLZI89y9XNXk/VoFne+fifv1b3H7KzZ/Hjlj6m7v27C\naB2ACcN1nIgrcap91YMO1bga59rnr6U12HpWeV3X2d2yO2kw9eP2125nf9v+UbVha+NWTnSfGPTZ\nj7b+iFdOvDIq+V0tu3i39t1Bn71+8nX+e+t/j0q+oruCP+7/I6r+oXJ6vOs497xxz6hSfDrDnTy8\n5eGk0QfQG+vlhr/dMKr0qJgS4zvvf4fKnsrkZ5qucdPLN9EZ7jyrvKZrPLz5YTbUbBj0+Vff/uqo\nU36fPPjkGYbu4/sfH/U72Fi7ka++/dVBn21v2s4PNv9gVPInuk6w+pXVyJqc/Kw12Mrdb9w96new\n6pVVdEe6k59JqsTqV1YPqzAORFSO8qW3vsTRzqODPv/Cui+Mah1ousYj2x7h/br3B33+420/Zmfz\nzrPKA/zt2N9YW7l20GdvVb/FkwefPOO7Q6Us/XnPLl45Ongd1PhreGDjA4PkhqtPV+ev4/369wcd\nTBE5wm2v3MeWk53srO3BKArEZGVIxaEv3sfJnpMY5KkYtSzM2mTM+iR+vet3RKQIaw+2EpM1DILA\njtoe3j7egaJq2ExGDjYFWHekjQafP5lpoYkBJGp54eAmXjpwkgONfoIxOZmuZjYa2NfgJxBNrLFA\nVKLFr2Oz9oEmYdLLMJLD4a43OOk/lkzp8kckst02ZualUJhmY0q2izSHmWBcwWF24DAbcQhF2OTz\n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\nfUTSEVoiLQNu2zAMnln/DKtaVvV4/oMN6IyqMX2YN7c2QXYeNQY6Wd26ul+Ga44hPa7Q4IuztSXC\n4u27EbV8Fu76rMcYP7j9tKIxrdJDOJnNE7WaJGwmGX8qRFwN8MclLwM9x6bHbmZWTRHfOG44XxtX\nytmTh/SY292O4s/3fM6rW1895HkLnWbW7gnw2Y4ONu0NsqM1zPq9IUpc1mzpNSyYqebvO/9EQ3AP\naVUlmFCpKrajAmUeG05b9sSztjOObmTreNf74oTiGfJsKhh23ty0jk0tHegGFLvMlLltqLpOvs2E\nxyaz2xdje1skywdglpgxPJ/xQ/LJSLX4lQYu/utPWVJXnyOjspkloimFrS1hVu8OsK01wm5fjNfX\nNXPPoh38beUeJngvBGBD4DV+ueQ8XM44HruJk0YWcUxVPqPLXGQ0HUGAjnCSlKIRSaoM9VrxStOw\n6pMQDBPv7bmPi9+Yh0a0h5HffUJuliWqCvOoKXJS2xGjM2Iwd/hsUuIG0vj41Ue/4pI3z2RYUTLX\n152xFEM8Vsrc9txeVu614oulmVR8PBIigmEllta4c/k1zH1hLr5UY499o7c1fHThaL4z5Tu533WB\nOu5f+Ttu+uT3ZLT9jubDOQr/dMafeuhYa1rXcPfSu1m2d9mRBz5wStUpXDX1qh7XopkoJtHUp95p\nkky8dOFLPdYnURC5aupVOaPySLh0wqVcPePqHtdOHn4yvzv5d32u106zk7cue4t8W36Ptu8/437G\nFo3ts+1vTfkWvz2xp0NxYslErph0xVeubPF/BUe/0j8Je8N7+e0nv6XiTxV8/Y2vM7ti9oCKLodT\nYR5c8SBjHhnDmS+ficvi4rwx5/VbPqNleHnzyxz79LHMemYWu0O7+dGMH/Vb3jAMPm74mLNePoux\nj45lUd0ibjjxhn7LA2zu2My3//Ftqh6s4vE1j3P7ybcPSL4l0sL1H15P5QOV3PTpTdw297YBTeRI\nOsLdX95N1YNVXPP+Nfz8uJ8PyPBVNIXn1j/H2EfHcsWbV3D5hMsHVHi722A99uljOevlszh+6PHU\n5Nf0Wx6yC//8BfP5f4tuIt/mZFzRuNz/9WZAHgyrNcC9Sx/mqn9cTSQdZXLxzF6V/N4854mMhsOq\n89CKJ/nPN/+Tnb6dzKuZ1+/TLcg6Depib/PYqufZ3F7P5OKZbNobZsPeEG6rqU/jId9holV9j4c2\n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\njF0oBy4fcPh9af2p9bLlzJZ7+hlGH4mWWxm3HIq/kXZDvt39rUNlnjZf7frK4WsLEZE5B+Zob1nJ\nbv2p9bIodpHDv4Oz18/Kf7f+V7vM0iY9M13eX/u+w6+HIiJjNo9x+PVQRGT2/tn39J4QczFGRm0c\nJWaL2aH4xNREGfDLALmRdsOh+Axzhgz8ZaAcSzzmULyIyOhNo2XJ0SUOxy85ukRGrB/h8DyKTYiV\nXgt6OfxcTLqZJF1+6nJP1xYDfhlwT+9rX+36SoavG+5w/NqTa6Xz3M4OlZ3/m0CjVFhJHncRlFJr\nAPxZ3d17IhKd9TkbAAwWkT+9zaqUChaRC0qpAACrAbwuInneUq1bt67s2ePYnVsiIiIiIiJyXkqp\nGDG4lTTP9q8iYrxN7l9/jQtZ/41XSi0EUA/G9sUSERERERHRA+4fPw5HKeWllCpi+xhAK1ibOhER\nERERERHl6Z4SV6VUR6XUeQANASxVSq3MeryUUmpZ1qcFAtiilNoPYBeApSKy4l6+LxERERERET04\n8iwVvhsRWQhg4Z88fhFA26yPTwKodS/fh4iIiIiIiB5c/3ipMBEREREREdG9YOJKRERERERETo2J\nKxERERERETk1Jq5ERERERETk1Ji4EhERERERkVNj4kpEREREREROjYkrEREREREROTUmrkRERERE\nROTUmLgSERERERGRU2PiSkRERERERE6NiSsRERERERE5NSauRERERERE5NSYuBIREREREZFTY+JK\nRERERERETo2JKxERERERETk1Jq5ERERERETk1Ji4EhERERERkVNj4kpEREREREROjYkrERERERER\nOTUmrkREREREROTUmLgSERERERGRU2PiSkRERERERE6NiSsRERERERE5NSauRERERERE5NSYuBIR\nEREREZFTY+JKRERERERETo2JKxERERERETk1Jq5ERERERETk1Ji4EhERERERkVNj4kpERERERERO\njYkrEREREREROTUmrkREREREROTUmLgSERERERGRU2PiSkRERERERE5NiUhBj+EvKaUSAJwp6HHc\nRQkAiQU9CHIqnBOUHecD5cY5QblxTlB2nA+U2/0+J8qKiL+RT3TqxNXZKaX2iEjdgh4HOQ/OCcqO\n84Fy45yg3DgnKDvOB8qNc+IOlgoTERERERGRU2PiSkRERERERE6Nieu9mVzQAyCnwzlB2XE+UG6c\nE5Qb5wRlx/lAuXFOZOEeVyIiIiIiInJqXHElIiIiIiIip8bEVYNSqqtS6rBSyqKU+svuXkqp00qp\ng0qpfUqpPfk5RspfGnMiQil1VCkVp5Qamp9jpPyjlCqulFqtlDqe9V/fv/g8c9brwz6l1OL8Hif9\n8/J6ziulCiml5mb9+06lVLn8HyXlFwPz4XmlVEK214UXC2KclH+UUtOUUvFKqUN/8e9KKfVl1pw5\noJQKy+8xUv4xMB+aKaWSs71GDM/vMToDJq56DgHoBGCTgc99XEQeYfvq+16ec0Ip5QLgKwBtAFQF\n0EMpVTV/hkf5bCiAtSJSCcDarL//mVtZrw+PiMjT+Tc8yg8Gn/P9AFwTkVAAXwD4NH9HSflF4z1g\nbrbXhan5OkgqCNMBRNzl39sAqJT1pz+Ab/JhTFRwpuPu8wEANmd7jfgwH8bkdJi4ahCRWBE5WtDj\nIOdhcE7UAxAnIidFJB3AjwDa//OjowLQHsCMrI9nAOhQgGOhgmPkOZ99rswH0EIppfJxjJR/+B5A\nfyAimwAk3eVT2gOYKVY7ABRTSgXlz+govxmYDwQmrv8UAbBKKRWjlOpf0IOhAhcM4Fy2v5/Peozu\nP4Eicinr48sAAv/i8zyUUnuUUjuUUkxu7z9GnvP2zxGRTADJAPzyZXSU34y+B3TOKgmdr5Qqkz9D\nIyfGawfKraFSar9SarlSqlpBD6YguBb0AJyNUmoNgJJ/8k/viUi0wS/TREQuKKUCAKxWSh3JupNC\n/0J/05yg+8Td5kP2v4iIKKX+qm172azXiAoA1imlDorIib97rET0r7EEQJSI3FZKvQzranzzAh4T\nETmPvbBeO6QopdoCWARrGfkDhYlrLiLS8m/4Ghey/huvlFoIa5kQE9d/qb9hTlwAkP3ueemsx+hf\n6G7zQSl1RSkVJCKXskq64v/ia9heI04qpTYAqA2Aiev9w8hz3vY555VSrgB8AFzNn+FRPstzPohI\n9t/9VABj82Fc5Nx47UB2InIj28fLlFJfK6VKiEhiQY4rv7FU+G+mlPJSShWxfQygFawNfOjBtRtA\nJaVUeaWUO4DuANhJ9v60GECfrI/7APjDirxSylcpVSjr4xIAGgP4Ld9GSPnByHM++1zpAmCd8GD1\n+1We8yHX3sWnAcTm4/jIOS0G8FxWd+EGAJKzbUWhB4xSqqStD4JSqh6sOdwDd7OTK64alFIdAUwE\n4A9gqVJqn4i0VkqVAjBVRNrCuqdtYdbccgUwR0RWFNig6R9lZE6ISKZS6jUAKwG4AJgmIocLcNj0\nzxkD4CelVD8AZwA8AwBZRyW9IiIvAngYwP+UUhZY33jGiAgT1/vIXz3nlVIfAtgjIosBfAdgllIq\nDtaGHN0LbsT0TzI4H95QSj0NIBPW+fB8gQ2Y8oVSKgpAMwAllFLnAYwA4AYAIvItgGUA2gKIA3AT\nQN+CGSnlBwPzoQuAAUqpTAC3AHR/EG92qgfw/5mIiIiIiIj+RVgqTERERERERE6NiSsRERERERE5\nNSauRERERERE5NSYuBIREREREZFTY+JKRERERERETo2JKxERERERETk1Jq5ERERERETk1Ji4EhER\nERERkVP7f//Onf9E88WqAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "yewoL6wqG6TS" + }, + "source": [ + "A hot new paper by [Song et al. (2019)](https://arxiv.org/abs/1907.05600) uses this method to generate images by iterative refinement... Apparently it took DL researchers 14 years to understand the proof :)\n", + "\n", + "Seriously though, this paper takes advantage of two new ideas: sampling with __Langevin Dynamics__ and scaling to high dimensions with __Sliced Score Matching__. We'll cover them one at a time." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "gsXvXhgfG6TS" + }, + "source": [ + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "```\n", + "\n", + "\n", + "\n", + "### Sampling with Langevin Dynamics\n", + "\n", + "Once we have $\\nabla_x log p(x)$, we can use it to generate data. One simple thing you can do is a gradient ascent w.r.t image to find a local maximum of p(x):\n", + "$$\\hat x_{t + 1} := x_t + \\epsilon \\nabla_{x_t} log p(x_t)$$\n", + "\n", + "In order to sample $x \\sim p(x)$, one can run a slightly more sophisticated procedure:\n", + "\n", + "$$\\hat x_{t+1} := \\hat x_t + \\frac \\epsilon 2 \\nabla_{\\hat x_t} log p(\\hat x_t) + \\sqrt \\epsilon z_t, \\quad z_t \\sim N(0, I)$$\n", + "\n", + "\n", + "Performing this update multiple times in an MCMC fashion is a special case of Langevin Dynamics. Under $\\epsilon \\rightarrow 0, t \\rightarrow \\inf$: $\\hat x_t$ converges to a sample from $p(x)$. You can find a more detailed explanation and a formal proof in [Welling et al. (2011)](https://www.ics.uci.edu/~welling/publications/papers/stoclangevin_v6.pdf) and further exploration of SGLD in [Teh et al. (2014)](https://arxiv.org/abs/1409.0578) and [Vollmer et al. (2015)](https://arxiv.org/abs/1501.00438).\n", + "\n", + "In practice, we can initialize $x_0$ from some initial guess (e.g. uniform distribution over data space) and $\\epsilon$ to some positive value. As the sampling progresses, we can anneal $\\epsilon$ it until we are satisfied with the samples. Okay, now let's go implement that :)" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "Byq9q1XdG6TT", + "colab": {} + }, + "source": [ + "def sample_langevin(x_initial, *, net_params, key, eps=1e-2, eps_decay=0.9, num_steps=15, temperature=1.0):\n", + " \"\"\" sample x ~ p(x) by applying approximate Langvenin Dynamics, return a sequence of x_t \"\"\"\n", + " x_t, x_sequence = x_initial, [x_initial]\n", + " \n", + " for t in range(num_steps):\n", + " key, subkey = jax.random.split(key)\n", + " z_t = jax.random.normal(subkey, shape=x_t.shape)\n", + " x_t = x_t + eps / 2 * net_apply(net_params, x_t) + np.sqrt(eps) * temperature * z_t\n", + " x_sequence.append(x_t)\n", + " eps *= eps_decay\n", + " \n", + " return np.stack(x_sequence)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "n6ZWX9Z1G6TV", + "outputId": "4e061bf6-93c5-4d96-cc9b-7e2d8b8899af", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 938 + } + }, + "source": [ + "plt.figure(figsize=[16, 16])\n", + "\n", + "key = jax.random.PRNGKey(42)\n", + "net_params = get_params(opt_state)\n", + "\n", + "for x_initial in np.array([[-1.5, -1.5], [0, 0], [1.5, 0]]):\n", + " key, subkey = jax.random.split(key)\n", + " # sample x sequence\n", + " xx = sample_langevin(x_initial, key=subkey, net_params=net_params)\n", + " plt.scatter(xx.T[0], xx.T[1], color=\"blue\")\n", + "\n", + " # draw arrows for each mcmc step\n", + " deltas = (xx[1:] - xx[:-1])\n", + " deltas = deltas - deltas / np.linalg.norm(deltas, keepdims=True, axis=-1) * 0.04\n", + " for i, arrow in enumerate(deltas):\n", + " plt.arrow(xx[i][0], xx[i][1], arrow[0], arrow[1], width=1e-4, head_width=2e-2, color=\"orange\")\n", + " \n", + "# plot data points and gradients\n", + "plt.plot()\n", + "xx = np.stack(np.meshgrid(np.linspace(-1.5, 1.5, 50), np.linspace(-1.5, 1.5, 50)), axis=-1).reshape(-1, 2)\n", + "scores = net_apply(net_params, xx)\n", + "scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", + "scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", + "plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", + "plt.scatter(*sample_batch(10_000).T, alpha=0.025)" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA64AAAOICAYAAADW86xZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xd4FPXWB/DvzJY0iiBFRFAUpYjI\nVRAvRRERFbuIiFdREUWRF7vei4JRQaQo0nuvAqH33lsCKZBQAgklCQkE0rdNOe8fsztkQ8pMCBD1\nfJ6HRxn27JTdnZkzv3IEIgJjjDHGGGOMMVZeiTd7AxhjjDHGGGOMseJw4soYY4wxxhhjrFzjxJUx\nxhhjjDHGWLnGiStjjDHGGGOMsXKNE1fGGGOMMcYYY+UaJ66MMcYYY4wxxso1TlwZY4wxxhhjjJVr\nnLgyxhhjjDHGGCvXOHFljDHGGGOMMVauWW/2BhSnWrVqdNddd93szWCMMcYYY4wxVsYOHjyYTkTV\njby2XCeud911FyIiIm72ZjDGGGOMMcYYK2OCIJwx+lruKswYY4wxxhhjrFzjxJUxxhhjjDHGWLnG\niStjjDHGGGOMsXKNE1fGGGOMMcYYY+UaJ66MMcYYY4wxxso1TlwZY4wxxhhjjJVrnLgyxhhjjDHG\nGCvXOHFljDHGGGOMMVauceLKGGOMMcYYY6xc48SVMcYYY4wxxli5xokrY4wxxhhjjLFyjRNXxhhj\njDHGGGPlGieujDHGGGOMMcbKNU5cGWOMMcYYY4yVa5y4MsYYY4wxxhgr1zhxZYwxxhhjjDFWrnHi\nyhhjjDHGGGOsXOPElTHGGGOMMcZYucaJK2OMMcYYY4yxco0TV8YYY4wxxhhj5RonrowxxhhjjDHG\nyjVOXBljjDHGGGOMlWucuDLGGGOMMcYYK9c4cWWMMcYYY4wxVq5x4soYY4wxxhhjrFzjxJUxxhhj\njDHGWLnGiStjjDHGGGOMsXKNE1fGGGOMMcYYY+UaJ66MMcYYY4wxxso1TlwZY4wxxhhjjJVrnLgy\nxhhjjDHGGCvXOHFljDHGGGOMMVauceLKGGOMMcYYY6xc48SVMcYYY4wxxli5xokrY4wxxhhjjLFy\njRNXxhhjjDHGGGPlGieujDHGGGOMMcbKNevN3gDGGGOsvFNVgqSoUAkQBcBmESGKws3eLMYYY+wf\ng1tcGWOMsWKoKsEtKyACLKIAIsAtK1BVutmbxhhjjP1jcOLKGGOMFUNSVAgQ9BZWURQgQICkqDd5\nyxhjjLF/Dk5cGWOMsWKohKu6BYuiAG5wZYwxxm4cHuPKGGOMFUMUtO7C+ZNXVSWU1RBXHj/LGGOM\nlYxbXBljjLFi2CwiCKSPaVVVAoFgs1z7JZTHzzLGGGPGcOLKGGOMFUMUBQRYLRAEQFEJggAEWC1l\n0irK42cZY4wxY7irMGOMMVYCURQQIFrK/H1Vb0trwXUp3OLKGGOM+eEWV8YYY+wm8Y2fza8sx88y\nxhhjfxecuDLGGGM3yfUcP8sYY4z9nfCVkTHGGLtJruf4WcYYY+zvhMe4MsYYYzfR9Ro/yxhjjP2d\ncOLKGGOMsTLBNWkZY4xdL9xVmDHGGGPXjGvSMsYYu544cWWMMcbYNeOatIwxxq4nTlwZY4wxds1U\nwlXdgkVRADe4MsYYKwucuDLGGGPsmnFNWsYYY9cTJ66MMcYYu2Zck5Yxxtj1xFcTxhhjjF0zrknL\nGGPseuJyOIwxxhgrE1yTljHG2PXCiStjjDHGWClx7VrGGLsxuKswY4wxxlgpcO1axhi7cThxZYwx\nxhgrBa5dyxhjNw4nrowxxhhjpcC1axlj7MbhMa6MMcbYTcLjI//afLVr839mXLuWMcauD25xZYwx\nxm4CHh/518e1axlj7MbhMytjjDF2E/D4yL8+rl3LGGM3DncVZowxxm4C1dvSmp8oClDKSYsrd2M2\nhmvXMsbYjcGJK2OMMXYTlOfxkb5uzAIEWERB/7tNFKEQcTLLGGPshuOuwowxxthNUJ7HRxbWjZlU\nINct/SXG5KoqwS0pcHoUuKXyuY2MMcbMuflXR8YYY+wfqDyPjyyszItCBPoLjMnlSa8YY+zvibsK\nM8YY+8cob+M2y+34SCI43QogCPpxkhWC1VJ+x+T6FNZarKra8nJ5rBljjBnCLa6MMcb+EcpLS1x5\n78aqqgSVCCoIAgAiwOmRQaTCIghXvbYcNBD7Kay1WBQFlLPDzBhjzCRucWWMMfaPcDNa4gq28FoE\nAZKqXjXpUXnpIgxox8MiiggSRX3btQwWcMkKLKqKAKt2vAgEu6V8tWKW50mvGGOMlR63uDLGGPtH\nuNEtcYW18Oa6JZCKMh0nWtYtuL7jJIoCAmwWBFhFiIIAQRQRbLcCegsslauE26c8T3rFGGOs9Pgs\nzhhj7B/B1xKX3/VsiSt0Zl4IUMh/G64leb4e3Z8LHidJUUGk3TBIiqqNe823T+VNeZ70ijHGWOlx\n4soYY+wf4Ua3xBXWwmsVBchK2SXPhSXH19qCW/A4yQqBSBv36kuQBQhwlcPxuT6+1uIguwUBNk5a\nGWPs74ATV8YYY/8I19oSZ7ZLbmEtvBZBgCCUXfJ8Pbo/FzxOvk2ziP4zMItC+SuFwxhj7O+LJ2di\njDH2j1Ha8jO+LrlmJlWyWURvt13fRFAEQQQqWG1QiKB4W1rtlivvYbZcz/WaiCj/cQqwish0ePze\nn0AIsFl4pl7GGGM3DCeujDHGWAlKMyOxr+VSUtSrktTCLr5llRyX9Uy/oiggyGaBR1ahqND3A0Cp\nE+TyVk/3evmn7CdjjN0InLgyxhhjJVC9YzvzE0UBSkndhU208JZ1clyWAmwWQIC+fdeSIJcmQS/v\nCktQAfzt9pMxxm4mTlwZY4yxEtyI2qC+5LhgEiQKAgJsxWxbKbs/m1GWCfLNqKd7PRWViIMAQbh5\n+8mtvYyxvxtOXBljjLES3JAuuQIgyyrcsuItmSNAJRVWQUCQ/ea30pVVglza1uvyqqhE3CUrCA7w\nv826Ufv5d2zVZowxTlwZY4yxEtyILrk2i4g8lxseVYXNmyASASQCbklBUL4kqKjWtLJoZbveLXVm\nWq9vVqthUV1/Cz3mRSTi+n5dx1b6ovzdWrUZYwzgcjiMMcaYIderNqivzI5bVuFRVAgkwNcmF2Sz\nwiZa4JZV/9fLil5TlUgbS+lrrS243Eyt1aLeuyzrtRqtp1uW22KmlFFh63V6ZDg9cqHbUljZI1Ul\nBFhvbN1gv/VfhzJJjDF2s3HiyhhjjN0ksqwi2+mBw61A9rbmCSJgt4hFJseFtaYJEODwyIUuN1pr\nVVUJuS4JLo+qtSx6WwvNvIcRxdXTzZ9g5rokkIpS70/+/TKTABd2fGWVICtU6LYUlYgH2CzXVDf4\nWhSVTHMvYcbYXxl3FWaMMcZuMF+CluX0QBQEBNqsIAJEEZAVFR5BQaBohaoSFFVFoO1K986ix4gW\n3spmZEylL7lTCLBZxavGRJb1uEzfeFlfl1y3rAJEUIlgEUVYRAEuAkhVIar+SaTZbSmq26xbUvRW\nyJK6/nqnVL5qHxRvcu/rRi7JKhRVhUUU9aQ2wHbju+beiDHZjDF2o5VJi6sgCNMEQbggCMKRIv69\nnSAIWYIgRHn/DCiL9TLGGGPXk5kupqbeU1bgkVWIogiLKMKjeLudelvxHB4ZkqKCiGC3+ic/RbWm\nWcTSt7L5kjurN8nJ36JY8D1kWUW2w4OMXA+yHR7IsvEW3fzHsmDXZo+3q7SP1ds6mr+FtTSthoV1\nmwUAp1R4K2xhxxcgbcBxgf3xva0oCt7EF7BbLbBZxevSzdqo4lq1GWPsr6qsugrPAPBMCa/ZSUTN\nvH9+KqP1MsYYY9fF9Rrv6UsSIWiJIqDlRHmSBIsoIsBiRZDNoietQXarX8JRVNfUYLu11GMqfcld\n/vcWRQGy4v8esqwi2+WB6muZJSDbVXLyWtixzHX7dwWGIMAiiHqiarOIEARAVq5xjCgRnG7Z7+GD\nW1JgEQvvVl3Y8bWKAqwWodhjW1QX7rLsZm3G9RqTzRhjN0uZJK5EtAPA5bJ4r78SlVT8svMXXMy7\nCACQFMn0e0w+OBlxF+MAAB7FYzp+bfxabDy1EQDglt2m42PSYjAzaiYAbfsVVTEVn5KTgt/3/g4A\nICI4JIep+DxPHgbtGARZlQEAuZ5cU/GKqmDIriHIcmUBALLd2abiAe0zSMhIAABkujJNx6+JX4Od\nZ3YCAC45LpmOj0qNwsLYhQCAC3kXTMcnZSdhfPh4ANrnQWTupjrHnYOhu4dCJRXpjnTTn6Gsyhi2\nexjyPHlwSk6k5KSYiiciTDo4CUnZSVBJxfH046biAWD1idUITw4HAESnRpuOP3T+EFYeXwkA+vuY\ncTbrLGZEzQAA7Dq7y3R8lisLo/ePBhFhU8Im0/EexYOR+0bCo3iwJn4NVDJ3o0xEmBY5DemOdGw4\ntaFUv6O18WsReyEWB5IP4MSlE6bjI89HYtvpbTh5+SR2nNlhOv5s1lksP7YcablpCIsLMx2f4czA\n/MPzkevJxdRDUwGYS0Rcsguzo2fDo3gwav+oYtflSxJ9NVoJBJckYfXxtciT8zA5cjwqBtoR7E1Y\nC+v+W7A1zSoI2HJ6G5JzUvDHvtFwexR4vF1F3ZJyVeJWkCgAhy8cwcmMeIQdWwinnAdJUWER/Vvq\nHB4ZoiDC6k3YrBYRoiDC4ZFxOvM0YtJiEHk+EvGX4rV99SaJ2U4JHkn12wciwVv2R5PuTMPhi4eR\n7clG7MVYLZEWRVhEY62GqbmpiEmLAQCczzmvr18lggqCAOgTLcmqigCrf7fZlNwkxF08BlEUYPcm\nzb71BtmtCLJbC23B9J1zEzJO40z2ab/rqJEJkXy/15OXT+LU5VN+53AjLf5X1p+Aw2mHTV8DfM7n\nnMfmhM2ljs/z5GFW9CzT5x8fWZUxct/IUt3LANpxGLJrCC47S3c7SkQYtntYqc5fPhMjJpbqHO6z\n5OgSjAsfV+r4rYlb8c3Gb0odH54cjreWvFWq+1kAiL0Qi5cXvFyqeyEAOHX5FDov7Kz/js1Kyk5C\nzxU99Xsqs9Jy0/DVhq8wcMfAUsVfclxC6LZQvLvs3VLFZ7oyMXzPcDw560nT9+P/GERUJn8A3AXg\nSBH/1g7AJQDRANYCuL+Y9/kQQASAiLp161J5NiNyBiEU1GJSC8px51DvVb3JKTkNx+87t48QCqrz\nex1Kykqibzd+SynZKYbjz+ecp8CBgVTxl4oUdT6Khu8eThHJEYbj3bKb7hxxJ4k/irTy+EpaeGQh\nLYpdZDieiKj9zPaEUNDIfSNpz9k9NGTXEFPxfVb3IYSCPl71MSVcTqDeq3qbih+zfwwhFNRxdkdK\nz0unV/981VT85oTNhFBQ47GNKT0vndrPbE+KqhiOP51xmqw/Wana0GqUmJFIT8x4gnLcOYbjHR4H\n1RxWk+w/22nP2T300vyXKOFyguF4VVWp5eSWhFDQvJh59MGKD2hr4lbD8URE7y57lxAKCt0aSgO2\nDKBph6aZih+yawghFNRtcTcas38MDdgywFT88mPLCaGgR6c8SvNi5tHbS942FX/s4jESQgWqO6Iu\nLTu6jNpOa2sqPsuVRbf8egtV+KUCLT26lOr9Uc/Ud0BRFWoyrgkJoQLNjp5NVYdUNfUdICLq/Gdn\nQiho+O7hVOXXKqa+A0RE323+jhAK+nTtp3TH73fQjtM7TMXPippFCAW9suAVajy2Mc2LmWcq3ncu\ne3jiw/TvKf+mobuGmopPzUmlgJ8DqPZvtanDrA70+brPTcW7ZTfV/q02BQ8KpmfmPENdF3U1FU9E\n1HpqaxJCBXp69tP02PTHiIjI4ZbJLSlX/XG45avi31n6DiEU1G5GO2o4pmGx63J5ZHK6tT+ZeW7K\nyHXTF6sHEv5XhZqPb0dVBtUgl0cucl35KYpKDpdEE/bPJnwfRA9NaElC/wA6n5lJeU6JnG6ZLue6\n6HKOS1+nwy2RoqhEpJ1DFFWhbYnbCQNs9MDYh8kSGkCnLp3xe53P5Rw35Tglvz9RKcfowNk4Qiio\n0ZhGVHlwZQpPDte2zS1599NDWXkeysxzk9N7XLMdHrqc66YN8ZvpYHI02UKD6c7hDan+Hw/SwsNL\nrtrWoiyJW0Yrjq2mmkNqU9XBNajb4jdp2O5hVx3rbIeHMr3bkOE9Hm5JoUVHltL4A5PogbEPEwZY\naVbULArdGlrsOn3H3uWRaVnsKhq47VfqMONZwgAbRaYcprDY5eSWFHK6ZXJ5iv8MtyRsoaG7hlL3\npd0JoaCI5AhSVMXv+Pneq7DjsTlhM80/PJ/+b83/EUJBa06sKXHb81t9YjXFXoilbzd+SwgFzYya\naSp+bfxakhSJ+m/pTwiF6d9/7IVYIiIK3RpKCIWp37+syJTpzPSL77Kwi+F4j+zR/98X33JyS1LV\n4r9zPr7XqapKA7YM0O/pXJLL8DYQadeR7zd/TwgFhQwKoQu5F0zFS4pE323+joRQgYRQgWJSY0zF\nuyQX9dvUjyw/WgihoOXHlpuKz/Pk0X83/pesP1kJoaDf9/xuKj7LlUXfbPiG7D/bCaEwfS94yXGJ\nvt7wNQUODCSEgp6a9ZSp+NScVPpy/ZcUNDCIEAq6Z+Q9JCmS4fhzWefo83WfU8igEEIoqNLgSnQx\n76Lh+FOXT9Gnaz+lCr9UIISC7D/b6VDKIVP78FcGIIKM5ptGX1jiGxWfuFYCUMH7/50AxBt5z4cf\nfvg6HaKyISsydVnYRb9Zsf5kpXEHxpl6j/9t+h8hFNR0fFOq8msV+mbDN6bip0dOJ4SCbv/tdqr3\nRz3TN2zbEreR/Wc7BQ8KpsZjG9Mjkx8xfMImIjqRfoKqDqlKQqhATcc3pdq/1fa7EJTksuMy3Tf6\nPkIo6P6x91PQwCBKz0s3HO+RPXryfO+oewmh0C+CRqiqSj2X9ySEgu76465SXfSH7hpKCAXV/q02\nIRQ0Pny8qfhlR5cRQkHVhlYjhIK+3fitqfjI85EUNDCIggYGUcDPAaa/AynZKVRreC39gtlycktT\n8Q6Pg5pNaEYIBQUODKTav9U2dcJXVZVeXvAyIRRk+8lGQQODKMOZYWobvtnwDSEUJP4oEkJBJ9JP\nmIqfcnAKIRT6ny0JW0zFb03cqq+7NDd+J9JP6BcshIIG7RhkKv6y4zLd8fsdevwnqz8xFe+RPfTA\nuAf0eLMPgBweBz02/TE9vvXU1qbWnZiRSC/Of1GPbzC6geH4PE8e7Tqzi7ou6qrHVx9a3fDDB6fk\npHkx8+jNsDf1+MCBgeRwOykrz02Xc92U7fD4JQ/5ExGXx01Dd/5OnRd0IwywEn7QbhyzXFlFrjN/\nQpLrdNNXa/tTh+mvEr4LJgywEX6w0tnMZL91+ZIkh3eZoqikKCrluTz00bLPqPmE1oT+Qdqf74Mo\nMuU4ZTs8lO3wUEaumy5kOelClpOyHR7Kc0p++9B7VW+q83sdwg+Ctg8D7HQoOabQhDHLm2jnT1yH\n7BhJlv4hfr+h8ORwPWn0JalZ3uQ12+Eht6RQnlOijFwXLY1bRfjBqu17fzuhv402xW/T97Oo/fct\n33f2oH7cMMBGGGCjVcdXE1HRDx9ynZL+GRy/eEqPww8CIRQ0J3pOsd8bRVEp1+mhzFw3HUk9Rfg+\niPB9AKG/nWyhwTRw+6+GE++Y1Bi/89dL81+iT9d+6nf8fH8KS4RXHV9F4o8iVfylItl+stGmU5to\n++ntxa4zv0E7BlH9UfWp8uDKdMuvt5h+8PbsnGepz+o+FDgwkKoPrW7q/J3rzqU7R9xJa+PXkvij\nSLcNv81U0rYkbgkN2TWE5sbM1e+FkrKSDMd/tPIj8sgeGrh9oH4dP3nppKHYlOwUmh09myRF0u8j\nav9Wmw6nHTa87aqqUqYzk56f97wevz9pf4mxbtlN4cnhRKQ9QG81tZW+/0YeXh+9eFT//4jkCGoy\nrgkhFFRreC1adXxVsbGqqvod41XHV+n3T7cNv43+PPJnsfeR+e/xZEWmKQenUM1hNfX4aYemFXv+\nzn9uzfPk0eCdg6ny4MqEUFCNYTVozP4x5JbdhcbmunP9/p6Wm0Zfrf9KT1hrDKtBw3cPpzxPXqHx\nDo/D7+/HLh6jHst6kO0nm37tGbh9IF12XL4qVlZkv+1SVZV2ndlFr/75qv7brza0Gg3YMoBSc1KL\n3P+/IzOJ6w0ph0NE2USU6/3/NQBsgiBUuxHrvp4sogWzX5mN5rc3x7bT27Quk3uG6d1ejRjUfhCe\nv+95xKTFIMOVgQkHJ+jdXo1458F38OFDHyIlJwWJmYlYFLcIiRmJhuMfu/MxfNf2OzgkB+IuxuFA\n8gHsPrfbcHz9qvUx+MnBIBBi0mKQnJOMRXGLDMdXDqyMX5/8FQAQezEWTtmJSQcnGY4XBRH92vSD\n3WJH/GWta9ro/aMNx8uqjHeavYNbAm/B6czTWvwB4/Eu2YVH73gUdSvXRXJOMgBgzIExhrta5Xny\nEGIPQbPbmiHdkQ4AmBo5FS7ZZSjeITmQnJ2MFrVbwCk74VbcWHJ0CdJy0wzFexQPdp/bjWa3NdO2\nR8rD/uT9iEqNMhSvkoolR5fgrlvuAqAdj+ScZKw7uc5QPBFh/pH5sIraBOeSKsEpOzH/8HxD8QCw\nMHYhTmWc0rcHgN5t14iVx1diybElEIUrp8MZ0cbjtyZuxQ/bfoBFuNLtcHbMbMPxESkR6Lq4q99n\nPvfwXMPfoWPpx9B6WmskZSfpyxbHLTbczehs1lk8MP4BHL5wWF+2Nn4t8jx5huLTctPQelprv+69\ne87tMdzt3a240XdtX6w4vkJfdvzScZy6fMpQfKA1EGFHw/Bn7J/6souOizicdriYKP/4bHe233fO\nJbmxLykCVlGE6O0a6quTmn9co9YNVcT9Ne7H6viVAASAtNmBI89HFrnO/F19RdGCtx7sisjUnYDl\nSve82Atx+rqKGmvrlhSIgoiv2nyFi46LgOD9zpAN57PPQSVA9s7aKwoCBME72ZGq6uNGAWB4x+G4\nJfAWLV6UAdEDh5xdaJfcYLsVKqmQvd2lZUVFj2Y98UjdZn6v07rkarVp3ZICi7dLNKB1lVZVgiAC\nFQJseOaep9HuricAECBKgEXC7ZVr6OMyixtrLCkqHqjeFI/d2Q5Q7QBZABJwX9VG2rEuYiIrq+XK\nZ1Cn0p34V61/AYKsH8MOd3co5lujdb/2yCoEQUDdSnVQs0J1ABaAAJUUvNnkP4YnRKpVsZb3uGjH\ndE38GvRt2ddwLVZJlaCSihxPDiRVQsc5HRFgCSh2nfklZCTg5OWTyHJnIcASgM4LOyMiJcJQrKIq\n2HV2F8aEj4FLdqHr/V2RmptqeOjTqhOrcCbrDJ6b9xxUUjHz5ZmoHlLd8LaP2DcCv+39De8tfw/B\ntmCs7LYStSvVNhR7MOUgJhycgNcXv47vt36PWhVqYcs7W3BP1XsMxX+18SvMip6FV/98FVMip6Bx\n9cbY+/5eNKnRpMTYk5dP4q2lb2Fz4ma0nNISq06sQus6rRHxYQQeqf1IifH/2/Q/zD88H2FxYWg2\nsRn2nNuD5+97HtEfRaPdXe2KjU3KTkKHWR2Q58lD/y390XJKSxy5cATdH+yO2N6xeO6+54qN/3XX\nr5gVPQtJ2UnovLAznp//PM5knkGfFn1w7JNjeP3+1yEIhX/nL+RdwFOznwIA7DizAy0mt0DPlT2R\n4crAf1v/Fyf6nMB7/3rP73qc3+SDkzExYiIkRcKkg5Nw7+h78b/N/4NKKn5q9xNO9T2FTx75BHaL\n/arYDGcGnpn7jL4dX2/4GvVG1sPwvcNRwV4Bw58ajoS+Cfiy1ZcItgVfFR8WF4Zhe4YB0L47ry18\nDY3GNsK0qGmoVbEWRj87Gqc/O43vHvsOVYKq+MXmenLxyp+vIMuVBUmRsODIAjw69VG0md4GS44u\nQYNbG2DS85Nw9rOz+PGJH1GzQs1iP4N/shuSuAqCcJvg/RYLgvCId72l6wBfjmS6MtFpXie/E3xi\nZiL+PPJnMVFXOCUnuizqglUnVunLst3ZmBAxwVC8rMr4ePXHmHToSqKnkqqPOS0JEeHnHT/jh20/\n+C3/be9vhuIBYNLBSeizps9V8UZvupcfW44eK3r4LRsTPsbw+Iq9SXvx/or3/S6Ss2JmIcOZYSj+\n5OWT+Hz9535jW9eeXKuPzypJhjMDw/cOx9mss/qy2Iux2H5mu6F4AFhxfIVfopjuSMeiWGPJf6A1\nEMcvHcf+pP36MkmVMDVyqqF4u8UOAQIOJB/wWz4xYqKheFEQUb9qfcReiPVbbvThgyAIaFWnFVJz\nU/2WT4mcYigeAJ6+5+mrLlIzomcYTtyeqf8MmtVs5vedDYsLMzzeut1d7dC9aXdYxCuJ6+aEzUjO\nTjYU3/z25vi1w69a4uAVdzHO8BifhtUaYmGXhbjv1vv0ZWl5aYa/g3Ur18XWd7aidZ3W+jKn7DT8\n8KFmhZrY+d5OdG7UWV9GIL/zWnEq2Ctgadel+KzlZ37L155cayheFET8/vTv+K2j/3nLzDizXs17\nYe6rc688fCAL9pzbA6tVRIDVAosoQFEIeR4Jqgp9pl3fGNgOd3fAktfDEGgL0ONLuvHPP3HOg7Xu\nx9q3VyPEHgBt9loRx9KP6UlPUWNt3bIKURRQI7gG/nxtESraQ7yJF+FMZpI36c43rlTwjS31Xx5k\nC8KiLotQwV5BX1bUeH+rVUSlQDtEAZBkFaIA3BIUiOkvT72SLJEASdbGlPrGlUqqCpuoTXqkKKo+\n/lYhgt1qwe9PD4EgKnriWC34yrPt4sYaywpBUlV80qIvIKgABFSwV0KtkDsAFD2Rla/0je8z6Nrk\nVX3dD9Z8sMQbR7eslbwRRe2BwEO3P+yNt+KFRs+iXtU7DE+IVDWoqv7wDgB6PdwLd1e523At1oJJ\nYr82/dDyjpYlrtfHN8cDoJ07Hq39KJrf3txQbHRaNHI8Ofrfx4SPwZgDY/z2pzgLYhcA0O5dAq2B\nGBs+FlsTtxqKPZhyEDvP7sSFvAvwKB50vb8rbq94u6FYAOi3pR8AYNmxZageXB1b3tnidx4tztbE\nrZh3eB42JmzEyhMr0bpOa+zSPftyAAAgAElEQVR8byfqVK5TYqyiKui+tDsckgMdZ3fE8UvH0evh\nXtjyzhbcVuG2EuOXHl2K3/f9jsmHJuO1Ra/BITkw8pmRWPHGCr/fTWEckgMvLXgJyTnJaDqhKQbu\nHIjqIdWx4o0VmPnyzKsSroJmR89Gvy39MP/IfDQa2whLji7BQ7UewoEPDmB0p9GoHFi5yNgMZwY6\nzu6IyNRIvLbwNTw+43FEpkbi1Uav4ugnRzG4w2BUDKhYZPykg5Pw4aoPsSlxE5qMb4Jeq3oh3ZGO\nz1p+hlN9T6H/4/39zmH5peWmod3Mdth9dje+2fiNnrCG2EIw7KlhSPw0EV+2+hIh9pBC48ceGIsu\ni7rg4PmD6Di7I5pPbo6wo2FoVL0RZr08Cyf/7yT6PNKn0IQ3JScFj01/DCtPrMTEgxNxz6h70C2s\nGw4kH8BTdz+Ftf9ZiyO9j+CDhz9AkC2o2OPPyq4cznwAewE0EAQhSRCE9wVB+EgQhI+8L3kNwBFB\nEKIBjALwBhnNbMqxWwJvwYo3VuB/bf4Hm2jTlw/eNdjQ5ARBtiAseG0B/nj6D1S0X/mxjtg3wlCL\nm1W0Yvxz4/Hna3/6neymRk7VW++KIwgCBjw+ANvf3Y4GtzbQly8/ttzw5AS9mvdC1EdRaFWnlb7s\n0PlD2Hl2p6H4Vxq9grjecXi10av6spScFCyOW2wovk3dNjjS+wj6tLiSPDskB6YcMpb4NKreCHvf\n34tfn/zV7wn1mANjDMXXqlgLy7ouw+xXZqNK4JUTvtH4EHsIRj07Clu6b9FbLQFgXISxyRlEQcQX\n//4Ch3odwsO1HtaXTzw40XDi1rlxZxzpfQSd7u2kL5t7eK7hxK3lHS0R2SsSvR7upS9bHb/arwWw\nOHfdche2vbMNg9oP0m92Dp0/hEPnDxmKrxxYGXNfnYtZL8/SL1opOSnYcGqDoXibxYZBTw7Cxrc3\nolYFreUjT8oz/B0UBAHvP/Q+wj8IR6NqWisPgTDv8DxD8QDQ8Z6OiOoVhTZ12+jLzMQ3qdEE4R+E\n+/2OjD5AA7Tv8ZZ3tqB38976ssVHje0/oH2PF3ZZiNDHQ/Vly48vNxxvES0Y8cwIjO00Vn/SviZ+\njeF4APji319g3qvz9HPxpkRzE6R0e6AblnZd6j0PiNiTpPU88c20a7EIsFr8y5zICumJyZN3d0DY\n64sRYLUDEBGeYm6Srxa1W2BZt6Ww20RA9ODE5Tj9vYsq5+KRFeS5ZKgq4b6qDTD9pZkQYQGg4Fzm\nWVi8s/QStFqwVlFrvRUEwCL6X/4bVNOe+PsUN1Gd1SqiUrAdVSrYUSnYDqtVRINqDfDTE96CAWSB\n4E0Kfa2sAgRIqgqrKCDAJl5VMubBms3w9oNv66/NfwNdXMujoqogAp6p3xH1b60PCIT7qt0H1XuL\nYbQszGuNX/Nuu4D2d3Y0Xf6oRe0W+v/3/FdPQzH6vgiifg0PtgXj+8e+B1B80p1f/ge9D9V6CP0f\n729q/fkT17ebvo3QdqGGYwtOpPZ92+8x+tnRRbaY5ZflyvL7nXsUD1rd0QqP3/W4oXWP3D/S7+9z\nYuZgYoSxa9+209v8rhEXHRfRa1UvnMk8U2KsR/Gg95refsvur36/PiFYSYbtGYa9SXsBaNeKx+98\nHMM7Di+0lbCghIwEvLf8PQBAjicHQdYg7HxvJ/q27FtkK6cPEaHH8h76tTUhIwGv3/86YnvH4oUG\nL5S47o2nNuoNDYcvHIYAAaOeGYUDPQ+U+KAjx52DTvM6ITpNmzwx7GgYHqz5ILa+sxVhr4fh7ip3\nFxs/MWIieq3S7jE2nNqA+Evx6P5gdxzvcxwjnhlRbCv92ayzeGzGY4hJiwGBMGzPMATbgjG0w1Ak\nfpqIr1p9VWTCSkT4bvN36LO2DwiEFcdXYGPCRjx6x6NY/sZyHP74MN5+8G3YLLZC46NTo9FySktE\npmo9cPpv7Y+0vDT0aNYDMR/FYMPbG/BM/WcM/V6YpqxmFe5GRLWIyEZEdxDRVCKaQEQTvP8+hoju\nJ6IHiehRItpTFustD0LsIfjlyV8Q83EM2tdrD0BrcTPa2mAVrfj00U9x9JOj6NK4CwDtiees6FmG\n4gVBwOv3v46jnxxF7+a9IUCAU3aampXusTsfQ/RH0Qh9PBR2ix0Ewoi9IwzHN67eGDvf24lxncbp\nCbjRVl9Au2kOez0Mi7ss1i/eI/aNMNxqW8FeAaM7jcbO93bqT0vHhI8x3GXbKlrxbZtvEdkrEo/e\n8SgAYHrUdOS4c0qI1AiCgLeavqWd/O/TTv7Lji0znLgBwBP1nkDMRzH48KEPAQD7kvYZTtwA6F2U\nQh8PhVW04mzWWcMtVgBwW4XbsKrbKkx6fhJCbCHI8eSY6q4bYg/BhOcnYGW3lagRUgMqqZgeOd1w\nvEW0oF/bftjTYw/urXovAOgzuxohCALefvBtRPWK0rtZTYuaZjgeAJ68+0lEfxStJ/Azo2eaivcl\nj+81024qZsXMMjU7Z+1KtbH1na34tvW3AID5R+abmp2zUkAlLO6yGMOeGgaLYMHio4tNzQxpt9gx\n9rmxmPriVNgtdqw6scpwl3VAu/n+od0PWNxlMYJtwdh4aqPpGap7t+iN1W+uRkV7RWw9vdV0fLcH\numHdW+tQ0V4RO87sMD1T+wsNXsDa/6xFBXsw9p7dqx9/t6zAJSmQFa3bK6AlV4qq+iU2He5+Cotf\nX4wAi81wV8v8OtzdAXNemQeR7DiSdlxPnAq2vKkqwSnJsIla3VACAALa1+uAX54cDIgSUp1nYbEI\nEATAJmotxwTof7darr7J7fZAN/0BVIbLWK+V/L749xfeG1gRoiD4JY0EreVVFAS9pRLwbz0d+MRA\nBFoDUSWoil+LXXEtjxZRm/0XJKBPi94ACWhUrbFfYm6kLMw9Ve9Bs5oPAWRF+7vbl1j+yCYKcEoS\nHG4ZHllBs5rNABJQu1J1PF3/adPHznft+/zRz/XWXqNJt6Rqv/MASwBmvzLbUALk41E8OJd9DgDw\nxF1PYMqLU0pMgPLLn7j+1vE3/Nz+Z8Pxy44t03+jNUJqYNPbm/Btm28N3cSfzzmPBUcW6H9vWVt7\ngPpDux/8er8Uhojwv83/81vWuVFnTHlhCu685c4S1/373t9xLP2Y/neraIWkSiWuF9AqOQzYOsBv\n2YHkAwjdFlriPYtbduP1Ra8jy31lOJlTdqLnip5+vb6KMmjnIL8hFYDWap2/x1ZRolKj0HlhZ79t\nDLIFoVpwtRI/L6fkxEsLXsK+pH1+y7s16Ya2dduWuO7x4ePx0eqP/Ja1u6sdRj0zyu+Bf2HiL8Wj\nzbQ2fo0xdosdy7ouw9etvy4yYQW0B0Lvr3gfv+z6xW/5G03ewJ4ee/BigxeL3fc18WvQZnobv3vB\nIGsQ9vfcj6kvTcUDNR8odttZ4TjFLyMNqzXEprc3YX7n+ahVoRZ+2fmL6ZvWhV0WYu1/1uKeKvdg\n2J5hpqbCviXwFox9biz2vr8XTWs2xegDo03d9AVYA/BDux8Q1SsKbeu2xYzoGXqZHyNEQcTHLT5G\n3CdxeLHBi1hxfIXh7rY+nRt3RlzvOPRo1gPhKeH6E0mj2tRtg6heUfim1TdIyk7C8mPGW3wArfV1\n13u7MPyp4ZBUyfDDA59aFWth+RvLMfPlmagYUNFwd1ufigEVMfGFiVj3n3WoXbG26SnxbRYbfmj3\nA/a9vw+NqzfG+IjxpuIFQcAHD3+A6I+i0bpOa0w8aG77AeD5+57H4Y8P48UGL2JK5BTT07m3qN0C\nh3odwgcPfYC5h+fCKTlNxd9T9R7sem8X+rXph1UnVhnqeZBf9ZDqWNVtFUY8PQJ7z+01NV4c0BL4\naS9Nw6yXZyExI1F/umyUVbTi1w6/YmW3lcj15JourSMIAr5q9RU2d98Mm2jD5sTNpuIBoMe/emDn\neztROaCyXmrLjM6NO2N3j92oHlK9VPHP1H8Gu3vsRo2QGth2epvp+Pb12uvbX/BGyYgn6j2BDd3X\nAhAQezEOqkpwuGU9afAlM4CWNBVsEXuyXgcs7bYYyTnJhocs+Kgq4fl7X8LYTmNxLD1OX5dvfKhv\nPW5ZAQgICrDqXZm1GqgCvmr9CT5u2RNJuWcRYLOgUpANgd6ELchu0WqjiiiyFuofz/yBZrc1K1Vp\nMKtoxbQXp8EmWvxbPG0WBFhFBNktgFB4eR9ZIdQIvh19WnyBqoE1/ZLF4loerRatZI4gAF0bd0OV\nwMpoUqMhRAEllpEp6NWGnRFgCdBvposqf6SqBAiAVdAeHMgq4f7qzQAoeO/h7oa7yeZXq0ItVA2q\niq9bfX3VsSkp6fY9oBr85GA0rt7Y1HrPZp2FSioaVWuEsNfDTCW9RISdZ3dCFERMfXEqvvj3F6bW\n7esm3LpOa0T2isQT9Z4wHDsufBwkVUKwLRgjnh6B3T124/4a9xuKXXlipX5uaFWnFfb02IPFry/G\nvbfeW2Lsmcwz+Gm71rMg2BaMz1p+hoS+CZj20jQ0rNaw2Fi37MbbS9/WHzQ0rt4Yo54ZhZQvUzC8\n4/ASvzdfbvgSB88fBKD91p6/73nM7zwf+3ruQ93KdYuNXXp0KfpvvdISXyOkBt7/1/sY8fSIEsfE\nnsk8g2fnPuvXJbxpzaZ464G3UCWoSrEJt6RI6LKoC7aevtL9O8gahMfvfBw5nhwkZhZ/jR0XPu6q\n1u3bKtyGEHsIlh1bVmxsTFoM2k5vqz+YAbR71bur3I2JBycWWzYpz5OHl/98GdOj/B/AV7RXRPyl\n+BLXPS58HF6Y/4JfzzUBAqoGVcWQ3UMMzyHBCmF0Fqeb8ae8zypclCxXFn2+7nPTJSl8HB4H9d/S\n3/R05D4e2UPDdg8zPbOpj6IqNPngZBq5b2Sp4lVVpUWxi+jn7T+XKp6IaOOpjaZnWM4vPDnc9Myq\n+R1PP049l/c0VRYlv+TsZOqxrIfpKfF9MpwZ9PGqjwudmc4Ip+SkbzZ8Q2cyz5QqXlZkGrxzsOkp\n9X1UVaXJByfTzjM7SxVPpM24uDZ+banjtyZupbC4sFLHH0w5aLosTH5HLx4t9W+QSJspcnrk9FLH\nJ2cn09RDU0sdn5qTek3xablppksr5Xc+5zzNiJxR6vjEjESaGzO31PFR56Np4ZGl3hl5HZSRrwxM\nVp42m6xvdtvCZrtdF7/O9Pc//yyyg7YPoeSsVH0W2fzrych1X1XiJdvhoVynNpu3R/ZQ3zV99fct\nahuLEn8pnn7c9qPJI3ZF6NYfae+ZiELLuDhcEmXmuvVtdrplfXZhp1umizmX6fk5r1Cu00MOl6Rv\nsyQpRc4qnL9kzNfr+9HSuFWU6/SUWEamoOjzR+nJGR1LLH/kV87IO2Pz+QwH1R/RjE6ZLGXl88GK\nD/QSPmaN2T+G2s1oV6rr1fqT66nmsJqUmJFoOjbuQhzZfrLR4tjFpmMv5l0k609W+nzd56YqERBp\n90jVhlajDrM6mC4dJisyNRnXhO4ddS+FxYWZqqJARPTS/Jeoyq9VaMCWAabKnRBpVSRsP9mo2+Ju\ntP30dlPrXnB4ASEU1HZaWxofPt5U9YXo1GgKGRRCDcc0pG83fku7z+4mWSm+RJPPJcclajimIdX+\nrTa9u+xdmhM9h87nnDcUKysydV3UlaoPrU6vLHiFhu8eTvvO7Styxt+CxuwfQzWG1aBn5zyr3xMn\nZSUZOm77zu2jJuOa0NOzn6av1n9FM6Nm0qGUQ4ZKVmY6M+mdpe/QC/NeoC/Xf0mTIibRtsRtdD7n\nvKF1/3nkT3pj8Rv0343/pYkRE2n9yfV0Iv1Eqe8H/wlgYlZhgcrxUNPmzZtTRIT57lblhUt2IdAa\nyPGl5JbdCLAanxmxII/igU20mer2lJ9KKlRSS/X0HNAeCsmqXOTYByNkVS71+gFtEggj3ZeuV7xK\n6jWN3SCiUn9+HM/xZRHvklSQqk3MRCTAahEgQmsBrRxsL3byHbO/H6dH0VpPvSRFgs1ig6KS1lrp\n5ZYUKN5JiXyTFmmz/BIqBWnb5JScV0304ZtQSla0Ma8Wb5dhX+urpKjaeFIByJOyUTW4+IlaiiIp\nEjJcmahsr6q/n28dTo8Mj6LC4j0vaGNUCYE2K6xWbdmJS/GoXeEuiBAQFGDVW1iLmqHXt18qAam5\nKSAAt1e43e+1vrG9AbaiPw+3pGDDqQ1+XX0Li/N9Tr7Zjn2fwfyYP/FWs66GZhIuaPLByXir6VsI\nsAT6fQ6FfTa+iaV8pkdOR/t67Q11cy1odvRsNKreyPBkTPnNiZmDmiE18dQ9T5mOXXBkAayi9crY\nYhOWHF2CLFcW3m32runft2985IcPf2j62nzo/CFsTdyKDx/+sNhJhAqTlJ2EBUcWoPuD3VEjpIap\nWIfkwIyoGXju3udMf8ZEhMVxi/HgbQ8anngqv/DkcFSwV0DDag1NH+vU3FRku7Nxb9V7TccqqoKU\nnBTcUemOUp3DCzv/sfJLEISDRGToJMSJK2OMMVYEp1uGS1YgkAAVBFklEKmoYLchJKj0D6UK45a0\nki/5kxJZViGrKmxWi18ik+30ABBg9ZbLIRBsojaJVGHJmV5SRtVm+CW6Mt7V1w1X6xArACBYRQFB\ndmuJCVj+pLGwpKqw/QOuJGLwrjsk0HbV6wjQE3YjiadPwQcAPgUfABS2L/kT0aISZt/2SYqqf15a\nV2RthmSj2+m/bQoEiFet3zf7s29ccGHb5FE8prr45nctD4ivJfZatvlaHqhe68MsxljZM5O4lr4p\nhzHGGLvJzCROpeZNTqyiCKtKUNSrx2mWBZtF9E4G5B33KatwyTICrVa/Fr4AqwU2izaOVPFOUmS3\naImMUsRYTl9JGZm0/1os3sSICLKswqMqCLLZvMkR4FFUiJKCoICibxNkWUWuWwJBgFXUxtiqpBTd\nMuqtwwoAAfkSD4dbmxk5/yzKAuBX9qW4fdPf3/tdcEvKVRMZFVZGprDvToDVAklRrzqu+fk+J1kh\n2KziVclkSdtZ1LoLK/vjlrSDYbNeWeYryeQ7hqVNAAFcU6+ma4m9lm2+ll5AnLQy9tfGiStjjLG/\npPwtZAUTuzJLLAWt5TF/MhNkt+J69FXyzSLrW5esqgi0XulCmz9psVoEEAlXdYfNv9v5kyO3pCDQ\nZvFLHkVRgCSrcEgyFBWwWVRYvXM2KgohS5L0ckCAf3dViyAg1y0B0P5dVQkSqbBB9Euq/PbPOztw\nwW0OsPpafX2tzeRtHbX6va64jzT/dyHQZoHTI8MpyQiyae9BINgtlkJfX/C7U1Jrqf45yar2WYiC\nnuCWtJ3FrVtVAZu1wNCKQhKta0mOr8cDF8YYu1E4cWWMMfaXVFgLVcHWqGslCloZl/zJjJHkpNTr\nEwW/bS/Y5dWXtARY/Vtnfa1+vuSsYHIkAHBKMkQIV1p0FRWSqkBSVYC0LrYqJK3LsbdrKpE2LlXb\nFlFPtHI9ElQVWt1ZXDn2ChEEKvzgFGxR1lsqvcfWl7DbLSJU0b/8T8HEs6CC34UguxVuSStjFGS3\nXNVymv/1+cf+SrKKCoG2EhM8URRQIdBWaNfi4razsG3Vj52qQJC1Y+hLNlVVvWpbriU5LtOHOowx\ndoNxOZxrdK1jhMtijPHN3oZ/ejwrWzf78zRTO7UwZksAFWS0/nBR3LL7muLNliAqKM+Td02fgaRI\nhkt5qQXGgwJaA9WlYsocGJG/FJivFIssa11Q89wyXJIMSzFdDtNy065p/am5qQCKr19aXI3PtNy0\nq5KjAJsFIEAlLbmSFRUeRYGoFUGFoFXUgcMt4+Sl83B6JNhE38RP2theQGu5dcsq3JI29jb/9omi\n4B0DrBRaA7i4bc5f9iUowIoAm1hi/VK/41LId8GXePuOW/7yOLJCerLplrUxqzarCKWY2q1G98d3\nnIoqxVPUtgoQ4JJlKCrB4n1AoagqRFz5HuQvBVScwpLjwkr7MH9lcf241ve41muA2frVBZmp310Y\ns/W3C7rWa4hH8VzTdUwlFVmurJJfWAQiKrbUjhFmS/n9k3Dieg3SHel4fMbjeq3F2AuxpuJdsguv\nLXoNc2LmAAAOpx02FU9E+HrD1wjdFgpAq1ll9qZ50sFJeGvpW1BJRfyleNM/1o2nNqLjnI7I8+Qh\n3ZGOU5dPmYo/cuEI2k5vi5ScFHgUD8KTw03Fp+amov2s9ohKjQIRYfvp7abi8zx56LywM1YcXwEA\nputOKqqCL9Z/geF7hgPQCk6bNS58HHqt7AUiwtKjS02fsFefWI0X578Ij+LB0qNLTV90Is9Hov3M\n9rjkuIR1J9fhfM55U/FJ2UnoMKsDjqcfR0RKhOnPMNudjc4LO2NzwmaczjyNJUeXmIqXFAmfrv0U\nEyMmIsOZYbr+LRFh5L6R+HrD13DLbgzcMdBUPAAsO7YM3cK6QVZlfL3x65IDCjiQfACd5nZCnicP\nvVf3Nv0dSMhIwLNzn0VSdhL6rOlj+qJ9yXEJXRZ1QXhyOL7Z+A2Ss5NNxTslJz5b9xkWxi7E0N1D\ncSD5gKl4RVXw257fMHT3UEw8OBGrT6w2FOdL7IgIi2IX4asNX2Jh7GLMNlmDGQC2nd6G7ku7Y8Op\nDfhl55WC86Ko1Qn1KFqy4+sWKhVI2mLSYvBm2JvYeWYnPl33abHrKphEqSrhdOZpvL/8fWw7vQ1v\nL30bQPH1S33b5kv2Mt3p+G5LP6w4vgLPz3/+quRI9E62RNC6AXtkbWZiWdG6I2d5sjBqz3isOLEG\nH678AB7Vra8TgqB1N/YmeBZvoulWFDg8EhweGZmuHMw4NBPzD8/Fh6vfx+nM04V/ZmLhdUllVcbc\nmLmYEDEBM6NmYkPC+hLrl/q9rwAsjluCseFjcCz9OMLiVkBRCVaLAEUhZLs8UBQtIdQmVlL0hxGX\nnZnwKCqWHl2DceGj4ZLcWBO/yVANWFEUkJqXBAVObD69HuMjxuNCbgYyXBn6ugomwgUfSKTkJCMl\nJwWbz2zCjKjpSMlJhdMjQwAQbLfBaik+iU93pCMlJwU7z+zE73t/R3J2cpHJcWG7kuHMQLY7GzFp\nMei3uR/OZZ27+kXFyHHngIiQlJ2Ed5e9a7r+te9hYYYzAy8teAlxF+NMxfvkenLx9JynsefcnlLF\nOyUnnp37LBbFLipVvFt2o1tYNwzaOahU8ZIi4ZPVn+CtJW+VKnGTVRnfb/kebaa1KdUDTEVVMHT3\nUNw3+j6/h3dm4sceGIu6I+qavp8FtO/BtMhpuGfUPabvA3zx8w7PQ6OxjTBsz7BSxS+OW4xmE5qh\n16pepYpfdmwZWk1rhXYz2pn+DFVSsfrEajw1+ynUH1UfOe6ckoP+gbir8DXYn7Qfu8/txnPznsOW\n7lvQLawbNnffjDqV6xiKj78Uj/Un12P5seWoElgFg3YOwoinR6DlHS0Nxac70rEgdgGSspNQLbga\ndp3bhVcbvoquTboaipcUCZMPTUZESgSqBVWDRbSgRkgN/LfNfw3FA8C0qGnYlLAJb4S9gcfqPoZT\nGacw4fkJhuPD4sKw+9xudJrbCX0e6YNFcYuw/q31huO3n96Obae3odPcTvit428I3R6Ko58cNVyC\nJe5iHFbHr8b6U+sx7cVp+Hj1xzjz2RnDU92n5qZiTswcpDvSUSWwCj5b/xliPopBvSr1DMW7ZBfG\nhY9D7MVY1KlcB2MOjMGtwbfisTsfMxRPRJhwcAJWnViFT1Z/gj1Je5DjyUH3B7sbigeAeYfnYevp\nrXh98euQVRnt72qPH9r9YDh+w6kN2Jy4GS8ueBH33Xofbg26FTNqzzAcH50ajeXHlmPb6W1oX689\nLuZdROfGnQ3HJ2UnYUb0DDglJzYnbkZESgQ+bvGx4e9AnpSHUQdGISEjAfGX47E5cTO++PcXqGCv\nYCieiPDHvj+w/cx2pDvSsTlhMz5t+ampsgVTD03F2pNr8dTsp7A3aS/ebfYuWtVpZTh++bHlWHdy\nHTrN7YTDFw7jqXuewuv3v244fl/SPiyOW4zw5HCk5KSgXpV6+OLfXxiOT8hIwPiI8ZgZPROSIiFP\nyjN8HgOADFcGhuweggxXBirYK6DTvZ3Q5f4uJcb5up5KsozBuwcjNi0Ole1z0ez2B9G35WemxvX9\nvvd3rDyxEmFHw3B3lbv9/k3xlmspODbTLSl6MjD14EzMP7wAYUfDUCWwij57qe91blm7ObeJAiD4\nd7t1ywpWn1iDaVHTMDN6JqyiVS+FE2C1wC0pcLi1h5IBBcZAEhESMxOx7fQ2/Lr7V4iwQFUFXHJk\noKK9kt4CKCkqPIoKWVFQMcAOq9WGPJeEDIcL4ed34Vx2Mobs+hUC2UHwINOTgRoVKmstdESQFAWB\n1ivHQGsRVGGziFh+bCnSnZfQb8N3EK1OqKKEL/79eYnH3Hccp0fNxrmsJPy68xeQIMOjuk1dB+bE\nzMHmhC1YfXw9MlwZsIuhGP7UCEiKAiILPKR1mVWIYIWWwNktFrgkGW5Fxf6kcAzZMxiXci7hXPY5\nTD40DV2bdEXHe5401MU2y52FllNaIsQegoRLZ7EufhMqBlTAjJdnFNp9vWCXabfiQevJbXFbxbqI\nvRADiApy3U70faSv1mqM4mcpznRlosOsDmhYrSHWn1qPh2o9hKbVKyLYFlLsGGifo+lH8eP2H3F7\nxdsxI2oG/nXbvwzfxwDA0mNLISkSdp/bjZnRM/FwrYfxfy3/z3D8wB0D0bdlX/RZ2wcrjq9A0xpN\n8XP7nw3FEhHmxMzBf5r+B+8uexcbTm1AnUp1DJ8/EzISUNFeEZUDK+O1Ra9h/an1EAURrzV+zdBE\nTknZSbij0h3Icefg1YWvYlPCJiRkJODrVl+XOHmVSipcsgvBtmBczLuILou6YPuZ7bi36r1Id6Sj\nekj1YuPzz658Nuss3gx7E7vP7cbtFW/H6czTaFCtQbHx+WdYPpZ+DO8tfw/7kvahalBVHEs/VuL6\n8zt0/hB6reqFiJQIhBH7C28AACAASURBVNhCcDT9KB6o+YDh+B1nduCzdZ8hMjUSdosdZ7POGo4l\nIqw9uRb9NvdDdFo0REFEpivTcLwvYf15x884cuEIAKBhtYaGZ6/2KB7MjZmLoXuG4lj6MQDAk/We\nRIYrA1WDqpYYn+vJxcyomRi5fyTiL8cDAB6p/QhSclLQIKD4z/CfiFtcr8Fz9z2HSc9PQrY7G22n\nt0X85XgM3jXYcPwDNR/AsjeWwSJa0HlhZ+xN2oufdxg7WQNA9ZDqWP/WelQNqoq+6/piydElGLRz\nkOGujjaLDavfXI36Vetj1IFRGH1gNEbsG2GqtWb6S9PRtm5brDqxCv/d/F9Mj5puqsVuwOMD8FbT\ntxCdFo0PV36IDac2IPJ8pOH4rk264qd2P+F87nm8ueRNnLh0AiuPrzQc36J2C8x8eSYckgNvhL2B\nDFcGpkVOMxxfu1JtLH9jOewWO3qu7IlcTy5GHxhtOD7QGoiV3VaienB19N/aH2l5aRi5f6TheEEQ\nMOeVOWhcvTGmRE5B3MU4jNw/0tSTvsEdBqPjPR2xJXELdpzZgQkHJ5jqatTjXz3wcfOPceLSCaw6\nsQoLjiww1c2l7Z1tMaTDEFx2XsbiuMXYfma7qSfu9arUw+QXJkNSJSyKW4TEzERTLecV7BUw7cVp\nECBg+fHlyPXk4s8jfxqOB4BhTw2D3WLHpoRNIBBmRM0wHCurMno+1BOVAypjb9JeADAVn+3ORvPb\nm+P2irfj8AXtKffsmNmG4y/mXYRKKhrc2gBnss5AUiXMPzLfcPyFvAvYn7wfjas3RqYrE3lSHhbF\nLTL8HcxwZmDywcmoW7kuZFVGpisTq0+sNvQdFEUBkurEgG39YRXsAGlJxO6zu+GQcgpt7SrIJbvw\n4coP9RsGh+TAkQtH9O66QOFdOwHAKSnwyBI+WPk+FsYuBMgKjywhLS8NCRkJUFWC06OV0wEBsqoi\nPdeFLJdH3yaCiveWv4e+a7RETyEFbsWt3wABAAQg0GZBcIAVgiD47ZMgCJgZNRPvr3gfUEWosh1Q\nAxB/KR6yrCLPLcHpkfVupzbxSmuxKAiwiCIyHA58vf5bwCKDRCcgqLiYd17v+mu1eGcMVrWWWodH\nhtMjoaLdDosgokH1+vhhy3eAIENVbYBqRZ6n5O6Csqwi2+lBqzsew++7R8AtS/DIKkACgqzGazC+\n0vAVrDm5Ghed5yGrEhxuGbUq3Q6baNG7/6ogyMqV74HVKkIQtP16/M7HcSEnFedyzgKqHWcupqJ5\nrYf1iaRK6mLbpEYTqKQiISMBgIhV8SvxYoMX9X8v2NJZsItxnYp1kO3OQmxaDADgy/VfI9geAFHQ\nEtySnrvYRBvOZJ3B+lNast9zRU/02/Jtsa31+aXmpmLDqQ2YETUDdosduZ5cbDi1oaTDrjuQfAB9\n1/XFzOiZqF+1Pno1N95apZKKSQcnodPcTph3eB6a1myK/o/3Nxy/8+xO/N/a/8O3G79F2NEwtKzd\nEmM6jTEc//P/s3fe0VVUe/v/zJySk4TQQSkiHaQoVUBQ6SAIUgRBiqCogKJwr95ru75wFStSVARE\neheQIlXpJRAIJYQeamghkJB+2szs3x9zzpBD2pz4vmv93vfmWYu1kk2emTl79pnZz7fu+YylsUt5\nefXLbIrbxDOPPsOq/qtMidbbGbfpvaI3d7Pu0mFhB7Zd2kbH6h3ZMXSHqYrL30d9z87LO4lJiKH5\n7ObsvrqbrjW7cuj1QwWKxixvFn/bqhsX155dS6OZjXRHSq3uxIyMKVC0bjy/kWMJx4xol0YzG3Hw\n+kF61unJqdGnePrRp/PkKppi7JPS3Gm8u/ldms9uTvTNaHrX7c2Zt87kazg9fOOw77sCl+9dpt/K\nfjw7/1mOJRyjz2N9OD36NOPyMHwJIdgct9n4fX/8fp6d/yzdl3Yn5nYML9Z7kVOjTzG5y+Rc+ReS\nLxiiWNVUlp9cTsMZDXlp1UucTDxJv3r9ODHyBL/2+zWHaBVCsOfqHuP3dHc630V+R/Vp1Xl1/auc\nTzpPv3r9iH49mm1Dt+UQrQkZCVxIvmD8Hp8azz/+/AePTHmEtze/zaV7l+hfvz+Rr0YSNSKqwHv4\nn4oi4foXoAmN+uXr88RDT+BUdLE359gcrqddN8VXNZVwWzhPPfIUblUP69gYt5Gjt46a5ic7k2lT\npQ2gP0xiE2PZcH6DKb4QgrN3z9KiUguDn5iZGJRwO3zjMPXK1QP0+fConqCE14HrBygTWka/Hl+d\nzmBCPA7fOEySMwmbfL8HYDD82Nux7I/fH+Bdmxo11XSOyaV7l5h/fD7h9nBj7Jejv5DmTjPFT8xM\n5PM9nwe8JNeeXWs61Crdnc7f//g7SVlJxtjRW0dNh0q5FTfvbH4nYM0lZCSYDtPRhMZ7f7zH0til\n94+puk2vISEEn+/5nE92fhIwPjPavNd+VvQsBv02KHDsyCzT/FWnV9F5cWdj/QHMPjrbNH/H5R10\nWdwlQGjNOz7PtAHpxO0TDFw9kFT3/TD9FadWmM4TSnOn8dGOj7iZftMY23Jhi+lQr1BbKCtOreBc\n0jljLPpmNHFJcab4ZcPKEp8az/GE48ZYfGq86XDhUqGlqFy8smHpBl187rqyyxS/uCOCPvV6cj39\nEkgCJIEivGy7tN2U6HBYHfyj9T/wqt6A8e2Xths/55Zr6vbqvUJDbHa+6zKJKiUfASGBGgKanZ2X\n9+m5lJperMijqnoBIAFuj0qq043To+BR4KfnZtKlRreA4/u/k15V03uvqhpOjxrwux/j245nROPX\nQQsBJJBVLiZfQrbon92jaFhkCZtswW6z3J8TSaKEI4RutZ9jTIt39capsgqyxl3nXbyKhsVXRdlh\nteBWFSNc2iJZUNELKT1ZqQn/evYTwALCBpqNFGdGvgYDTRNGVeJHilfmE4MvgbAQajMvXMPt4bz/\n1Pv6/ZcVkLxUK1XVqMZs9eeLZvtO6n1hJYqH2gmz23mp4QD9/EggC1pUbm4YCPIKsfVDlmTaV2vv\nPzLh1nC61uwacK4HxWf2kOmwEDtVS1fTrx0oG1qGV54YBujCtqB8VpslsJ9whieDLzt+kWc+8YPI\nbmz2qB7e+/M9apaume85s+PQjUNkebPQhEayM5m289uaThuKvhnNjfQbhtGuV51enL5z2rTha/rh\n6aS6U5l0YBIVIyqy5qU1OKwOU9zzSedZGLOQ9/58zxC9GwZuIMwWZor/wfYPiL4ZTbOfm3H45mH6\n1+/PhoEbTEVsnbt7jg+3f8i3kd/y1NynuJp6lfefep8NAzdQ0lGyQP47m99hSewS3tn8Dr1X9CbD\nk8GULlP4feDvlA0rmy/39J3TDFw9kM1xm3lm/jO89+d7hNpCWdR7EWtfWsvDxR7OkyuEYPTG0cw5\nNoeVp1ZS98e6fH/oeyoXr8z6Aev57aXf8vXWx96OpeuSrlxIvsCH2z6k7vS6rDq9iiceeoKdr+xk\ndf/V1ChdI1euJjRGbxzNT9E/EXs7lp7LetJmXhv2xu+lQ7UOHBpxiJX9VlK3bN1c+Sdun6DN3DYk\nZiayNHYpDWY0YODqgZy5owvt2FGx/Nrv11w9xaqmMnbLWL7Z/w2JmYl8suMTqkytwnt/vsfdrLu8\n2fRNzr19jl/7/UrTik1z/dwtfmlBQkYCkdci6b+yP9WnVTf2q/946h9cevcSK15cQatHWuU5f0Uo\nEq5/CenudFacXMGpO/dzWz2qh6/2fWWKrwqVvfF7ib4ZHTBu1usqSzJXUq7k2CB+vudzUw99SZJQ\nNIUjt44EjH8T+U2OTVxeKBVaKod3bEb0DNO5slVLVuVWRqCH9tdTv5oWbo+VewxZklHF/dze/df2\nc+DaAdP8aqWqBYiMKylXWHNmjSl+tZLV6Fi9I1b5ftR9uiedOUfnmOKXDy/Pq41fDbDMaULjx0Pm\nLMYRIRF80OaDHJa57w99b4ofYg3hs3af0blG54Bxs+eXJZmJ7ScyuvnogNDcmdEzTeVbS5LEx09/\nzJQuUwI2CwtiFpDpyTR1DW82e5N1A9YFvGzXn1sfIOTyw4v1XiRqRJRhgAGIuhFlOkenQ/UOnBh1\ngnZV2xljV1OvsuPyDlP8JhWacOzNYwx+fLAxluZOY+3Ztab4lYtXZucrO/mozUfotWN1I9Tyk8tN\n8YvZi7Go9yJmdJ8R0FvRrNdVlmTGtx3P7wN/p0RICWN85WnzeWJDnhjC3uF7qRhR0Rgz+/lB99pH\njYiiVpk6ungBtlzQrfIFiQ6AmqVrEvlaJM0q3u9/vv3yfeGaW66pJoQRhlvKUZqNAzfxdNVnAQtI\nGpHx+3F59XBQRdPwanqxHLtF9wCmu724PLr4lSUb815YwHM1u+nCTbNy+Pox3F4Vj1fn+nNLhQCv\npgV4D4WAr9tPpXONHoAMQuJCShwWSa8O7LBbCbFZsPp6t/rnRJYACUo47Exo9wFdanf0iVc3Sc6b\nOOyyUWHXH17rsFmwWy1GH1jQRfzrTUfzTLU2IKkgQbrbg9ub9zPAq2p6/1efKHuj6ZvUL98QNDto\nDiyEmCqQ5MeoZqMoF1oeNCsydso5HkLxiXtZkhAI4/txv++qfu4Qq4WX6g/U5x6NmuVqUjq0tCHw\nc2sz9GCOcodqHfT/lFS61e6OwxIacK6CxGfN0r7wdElhdPPR2OVQhBCEmsjvzW64BZjWdRqlQkvl\nmU/8ILK/g2VJZsWLK3KEy+cFt+IOMFplebP4d7t/5yk+HsSD79pJByZxPum8KY/nrfRbAUbWe857\nDF833LTzYMLuCWhCMwzVPWr3CDAg5ocD1w4YkTFXU6/SvVZ3lvZZasrTqmgKr6x9BZfiYvfV3aia\nyqLei/im0zemQlMXxSxizrE5JDmT+OHQD9QoVYPI1yIZ23JsgfOW7Eym57KepHvS+WTnJ0Rei6Rb\nrW6cGn2KwY8PLpD/2Z7PmH10ti6+VvXnTtYd/tn6n5wefZoedXrkyz2fdJ5OizqR7Eymx7IefLX/\nK0o6SjK7x2yOvHGEtlXb5snVhMaoDaOYeWQmu67s4omZT/D7+d9pVrEZfw75k21Dt9G8UvM8+Qeu\nHeDZ+c9yO/M23Zd2Z9Bvgzh39xwDGgzg5OiTrHhxBQ3KN8iV61JcDFg9gO8Pfc/B6wd5dOqjTNw7\nESEEH7b5kCtjrzDz+Zl5Gns2x22m9dzWxKfG88raV2g9tzUrT6+kRukaTO82nevjrvN1p6+pUqJK\nvvNXBB1FwvUvoISjBFO6TuHEyBN0qdHFGJ99dLapB6fdYucfrf/BubfPBWxa155dywlfyFB+kCSJ\nwY8P5tzb5xjXchwWSX/gHb55mG2Xtpn6DO2rtSdmZAxfdfjKEA7xqfGmN60Nyjdg97DdzHthnmHl\nS3OnMSN6hil+xYiKrHhxBZsHbaZaST0vVBUqUw5OMcUvZi/G5C6TOTTiEE0qNDHGJx2YZIpvla38\nrdXfODnqZMA9nHww9zCTByFJEv3q9+PMW2cY1miYMf79oe9NF8pqXaU1x948xkdtPjLu4Zxjc0wn\n5tcsXZOdr+xkerfphNt0z+/q06tNv7zLhJVhSZ8lrHlpDQ+FPwTo4t9syHaINYQvOnxB5KuR1Cmj\nC+jLKZfZcmGLKb4kSYxsNpITI08Y0QNp7rSgwlW71epG7KhYXqz3IqCvoWAiBxo93Ijo16N5t8X9\nojrBeF0rF6/Mn0P+5KsOXxlGjDnHzBkvQDdALOq9iIW9Fhre/2DCha2ylYkdJrJl8BbKhekhZsGE\nC/vvQeSrkcb3cGns0qBCzp+v/TzRb0TTsLxurV51elVQ/OaVmhP9ejQtK7cE9OdgMBWea5SuwZ7h\nu4zNz5aLW9BETtGRF8qHl2fnKzsNT9m2S9uM68+teqzjgZxDmxTGol7L6Vi9E2hWIq8fRJYkFE1v\nyWKRZF9oroSiqlgtst72xHe8CHsYS3qtoEO1rqDZOJpwApdHJdOjFxXKXh1WCFA1fW7utz2xMq/X\nLJpXbgbCyvm7cT6BKvCX1jUqJKua0YtVE3qearjDzoI+s6hZvhpIGgnpCYEeOl8/W/8c2K0yIVYL\nGuBRNSyShR+7Tad0WARIApeSZeT15gZN6J5QvziVsfBNx29BtYOQsEgOnB5FNxL4hGKmSyEty0Om\nS8lRNCnUGsbYFu8BEhVLlMVhC9G93D5vczGbDZtFCvA+htgsRqRF3bK1aVW1CVg8tKzc2BD4ihoo\nPLNXIc5efKmd3+MqCQY07BdURWSAWmV0oRhhL8bbLUYSYpWx2+QcbZhyq1ac3eParVa3oPLbIdDj\nOqnTJDpW72iaG3M7Bq+mG7pDraFsGLghKP6as/eF66MlHmX/q/tNX//PR34OiI6qW7Yu33b6lsrF\nKxfIPZV4imWxge+YDXEbTL03VU3lrU1vBYxtjNvI6I2jTUVrTYqcRNSNKON3gWDXlV2miuKduXOG\nkRtHBoz1qN3DlIfcq3rpv7I/F+/d94Y/9chTrOy3MsBomBfmHpvLf+26X/8ixBLCnmF7+KrjVwFR\nZ7nhaspVOi7syO1MveK6R/UwrNEw4sbEMaLJiHwFuyY03vz9TX4++jOgRxRUiKjAyn4rOTTiUIHr\n7c+Lf9JxUUcj7zUxM5EBDQZwavQplvVdFmC0fhD3nPfovKgzq06vAiDJmURJR0m+6fgN8ePi+aLD\nF/l6qH889CPPL3uedI++n7t07xKdqndi48sbOfPWGUY3H13g3BUhEEXC9b8Bj5V7jM2DNvP7wN+p\nWbomHtXD1/u+Ns2vGFGRRb0XsW/4Pho93AggqMqmxUOKM7nLZI6PPM6zjz6r8/ea59stdv7Z5p+c\neesMvev2BuDLfV+a3jRKksSwRsM4+9ZZXm/yOgBTD04NKle2a82unBx9kg/bfIhVtvLL0V+CypNs\nWrEpUSOimNx5MuG2cNacWROQS1AQqpWqxuZBm1ncezFlw8py8PrBoCoTlg4tzbwX5vHnkD+pVrIa\nV1KuBOUxclgdTOwwkeg3omn8cGNS3aksiFlgmi9LMqObj+bk6JN0qt4JVajMOGzOeOBHr7q9OP3W\nacOIYtbr6keLyi049uYx3mv1HhIS0w9PD4pfo3QNdr2yy8gXnRE9IyjhUzasLL+++CuLei+iREgJ\nZh+dHVSV7VBbKFO7TuWPwX/o38kTi4JawxbZwj/b/JODrx2kdpnarDmzJuiS+EOeGMLRN47StEJT\ntl3aFnR1z841OhMzMoZ2Vdtx+OZhzt09VzApG5pWbMqRN47Qs05PziWdC/CkmEHN0jU58NoBBjYY\nyNXUqxy+GVyF6QoRFdj1yi6GNxrOrYxbQVeoLh9ehnUvrWf4E8NJyLjNsYTjprxdfhSzF2P9gPUM\nazSMa2nXjLxXyFkN1y96/MIqy6vgsISyvN9ietXtzbk7F0hTkn1FgTQ0oXtphRA47FbsFkuAsLFa\nZYSwsajXMp6t/jQnEo4jJIGqgUdTA7y9kq+4E9xve2K1SITZwljadym1ytYlLvkSiqphk6UAT6tN\nlgFffqtForjDjsUn6Eo6SvD7oBWUCHOQ6LwZWJXY96PRssZuJcRqwZJNoD1aojI/dtO/9x4l9++O\nUazKq1f1VX3GBY+qUr9sYwY8/hLICmF2Bx5Fw+lWcPsrIGsami9XWFVFQK6vV9V4s9mblA0vTZVS\nlbH4PMSypLcA8vgKSYVYZcP7mN0gIYRgSMOhIHtp8+iTSJJ+TIscKDzzajPzSERVqpasSvGQ4nSr\n1TVfT2duArRWmZogKbzZ7E2K2UvkELx5CWZNE4bHNcwWxvRu0015K7PD73Ed8vgQ3nny3Xxb+TwI\nf8RXmC2MjS9vpEP1DqbPe+bOGSNFoW3Vthx+/bCxByoIXtVrCBmrbGX8s+OJGhFluiDQ+N3jDaPF\nI8UfYWmfpUS+GmkYzvLDz0d+5ljCfcPu01WeZuvgrcx8fmZA9FVuiL0dGyD+LJKFnnV6MqjhoALF\nY6Ynk34r+wWkkYTbwklyJpmqC/H3P/4eEEkCelGmL/cWvN/bFLeJN35/I2DMrboZs3lMQD2A3HAr\n/RYdFnbgWlrg+2zt2bXsvbo3X66qqYxYP4Jfjv0SMH474zanEk8FRNvlht/O/Mbzy57PkXqT5k6j\nfHj5fLnXUq8ZocjZISHRukpriocUz5OraArvbH6HMZvH5JjbZhWb0bVmV9MFJIvwAITvRfr/47+m\nTZuK/21weV3i631fi7LflBXXU68HzVdURcw4PEOU/aasOJ14Omi+pmli6YmlouJ3FcXeq3uD5gsh\nxKbzm0SNaTXE6tOrC8WPjI8Uj894XMw4PKNQ/JO3T4o2c9uICbsmFIp/NeWqeH7p82L0htGF4t/N\nvCteWfOK6Luib6H4Ge4M8bctfxPPzHumUHyP4hFf7v1SNPypoVA1NWi+pmnilyO/iBrTaogsT1ah\nrmHd2XWi2tRq4m7m3ULx913dJ2r/UFtcSLpQKP7J2ydFk1lNRNT1qELx41PiRfsF7cXG8xsLxb+b\neVf0XdFXLDy+sFD8DHeGGLFuhPj+4PeF4rsVt3hv63viiz1fFIqvqIqYsGuC+HTHp4Xia5omvtn3\njfhw24eF5k89MFV88OcHf4n/yfZPguaqqiacbq/4Ys+3YsKOz4WqaoU6/8fbPxbTD00v8FwujyLu\nZbjF7dQscS/DLdKdXpGS6RKDV74mlsasE1kur0hKc4pLt1PFxdup4lpShoi/my5uJGWIlEy3cHtV\n4faqwulWREJKlkjN9IjbaSni6TkdxNEbp8WdNKe4cS9TpGV5REqmR6RleUSm0ytcHkUIIUSWWxFO\ntyJSMt3iVkqWuHUvUxy6el48+m0LceteunC7FeM6s9yKcHmUAudkc9xm0W1JtxyfNcvtFU63Ylxv\nlturj7u8IjndJVIzPSLd6RXDVr8pvt3zo8jI8gSc1+tVjWNkOr3iVkqmuH43Q9xOzRKXE9NEfFK6\nuJR0U5T5soK4mXJXpGZ6xM17mSIlwy0SU50iMdUpUjM9ItU3D063IrJc+lwkp7tFSoZbTNjxjei/\nfJhIyXCL5HSXuJms852+efJfc273MjE9RYR/VkIcv3Uyz7/N8n3+B/9luRXx2rrXxJDfhhS4ZnKb\nx43nNwnH5w6RkJ6QY31luRWRmukWmU5vwDmdvnl1K27BeMSk/ZPyPXdeaDSzkWj2czOR4crM8x7n\nhaFrhoqwiWFi1+VdQZ934p6JgvGIMZvGCI/iCYq78tRKwXhEw58aiqM3jwbFPX7ruGA8InxiuPh8\n9+dBvSfvZN4Rpb4qJRiP6LKoi9hzZY9prkfxiMYzGwvGIyp+V1GM3zk+qH3i8LXDBeMRlgkW0X1J\nd7H0xFKR4c4wxf05+mfBeATjEdWmVhPjtowTuy7vEl7VWyD30PVDImximGA8IvTzUNF1cVcxaf8k\nEZMQU+Ae5U7mHVFvej3j3I/9+JgYsW6EmH9svohLihOalvfaUlRFDF0z1OCW+bqM6Lyos/hw24di\n1alV4sq9K/ny5x2bJ+QJsmA8wvG5QzSZ1UQMXTNUfLPvG7Hx/EaRmJGYJzcmIUZU/K6iYDzC+m+r\nqP1DbdF9SXcxdvNYMf3Q9HzXe6orVTy3+DmDW21qNdF2flvxyppXxKc7PhVzj84N+J4XQQggWpjU\nhpL4i42S/yfRrFkzER0dXfAf/n+IhIwELiZfpHWV1oXiJ2UlEXM7JlvBh+CQ7k4n8lokXWp2KfiP\nc4FLcbH90na61+5eKL6iKWyK2xRQWTEYaEJjw/kN9KjdI2jrMegGmS0XttCxescchSvMYuflnTxZ\n6clCh3EcvnGY6qWqUyasTKH4Z++eJdwWHlRbguy4nnYdl+IKqshGdiQ7k0nISMg3jCY/ZHmzuJh8\nMaiS+NnhVb2cuXuGxx96vFB8TWicTDxZaL4QgtN3TlO/fP1C8UG/h3kVijCD80nnqV2mdqH5F5Mv\nms41yw2X7l0yneuWGy7fu2y6NdT/xPnz+/yaJvT8RV+uZ25tc87dPWeqsqPToyKBL2RX8oWYqpy9\ne54nH2mApglSnG5UTfeUKqqKoqmUdDiw2y1GHqSe86pfR5Y3g5sZCVSNqI5LUSjusKMKvTKuJAmK\nhdiwWmWcbr1qsUWS0YQgw+VBEYL4tAvUKvsIJR0lTYWqPjgf26/8QbdazwWM+0OOkaSAOfNXT1ZU\nvedrljeDvdf2071mF6MNjaIKPKpCuE2/br/3UNE0VE3g9ioUC7Fjt1lYFLOAAQ0GImElJctN6XAH\nHlVDAiO3WKC3BsryKITZrbqXUFFwKVmsOL2YUU3fwun1YpcthIfaAj6nJOXeXkbTBOO2vMcXHb7C\nKssBa8I/D06Pmqs3VJLgt7O/UjykeL7vTbdX/9z+efOqGoomuJJykV+OT2d69x+NY2ZfT5luBTmX\nsGNVEzhsMs1mNyNqRFSBHr/c0GhmIza8vIFyoRWMazMzXwDNZzdncufJ+VahzQtt5rbh1cav8mrj\nV4PmdlrUiRaVWvDps58G5OabQZ8VfSjlKMXn7T+nQkSFoLhv/P4Gd7Lu8FGbj/LNqcwNE3ZNYE/8\nHkY3G03POj2D2pssjFnIzOiZDGo4iP71+wfVqmbv1b18sP0Dnqv5HC/UeYEG5RuY3lddSbnCmM1j\neLz843Sq0YlWlVuZyuMFfR/54bYPCbGG0KZKG1pVbhXUfmjJiSWcvnOaphWb0rRCU6qUqGL6us8n\nnWflqZXUL1+fBuUbUK1kNVP5w6DvPZadXEa5sHLULlObR0s+GtT36njCcTI8GTxa4lEqRlQ0fd7/\nZEiSdEQI0azgv6RIuBahCEUoQhH+s2CEXWp6j1ZFE0jcF4PBwi9GgPsiz1dxNzREF1WqKvScVp8w\nlHwtWmxWiyEInR4Vr6YSYrFitcpovkq4VkkXfwIJGV28CSDUZvGF2Wq6IPaJQE0IHDY9nLcg4ZF9\nPvwiySgoJOsCulizWwAAIABJREFU0y9IEXprnFC7Ndfw1+zCV9OEUUjKf9wMlxdZhhCLBUm6H26r\nagJN03CrKmE2G0gCoYFTUZAEhNptKL4CVfg+v8P32fFVPfaHFEuShFd1Y7eGkO70UsxhJcJhzyH2\nQu25z0eqK5USjhIBY9nnR79Pin5em76Z1Qs9WbjnSiYiJCJfIeX0FeR6cM6dHjfJ7kRqlamq93bN\nJnD9a0zVhK+StcW4Lv+9PZ5w3HSYbXYIIYi6EUXLyi2Na/Mf238/hRAUD7XlELSZHhdHbh6h1SOt\nTPdL9iPTk0lsYiwtK7c0ZUTKjnR3OueSzgUUUzOLDE8GF5IvFGqu3IqbC8kXCmXM9LdLKqwhOSEj\nId9cyvyQ6ckstAFeE1pRSGsR/sdRJFyLUIQiFKEIRcgDfiGZXVTpFWgFxUPtQW3AIW/h5/eOZRcE\n2aFqemVbv4j2ahqZLi+K0Chm13NPrbKELEmGpyG7gFJVXezZrBaEEHgVvWiSXoQJQ5zlJ9T885Gb\np83lVXw5lfc9q6qm6aI4JH8PhNOjoqhawHE9iuor5KSLX/95JJ9YyXR7fVWGJfAVkQq1WfWqyhoo\nQj+eJgQRITbcimqIaL/X26OoZPq8sKAbJkJtFuNemBHy/uvyiymvomKVZcOo4c9R9c9xMKLNP9fe\nbHOTfQ781/bgmvGvMU2DcIcVRdHwqCo2i14tOljhmN+1QeA6E9wvxiXnIrofXO/B4L/zWEUoQhH+\ndyIY4VpkRilCEYpQhCL8R0ETuqDJXmTHapER4n77k2AK1PiLHnkUvfKtR1GxyfeFRG59YP3Vjo2+\nrD4RXcxhJ8RqxaOqusfWbtVDc2UpR2Egj6YZm327xYLFgiF2/Hv+gqoq62G+Km5FMwomub3672lO\nb4BnVJYlLLKcb7VgY04kULJVQwaQkYxiTv6iVtmLZ4XZrb52OzIOm4UwnygN8bXfsUh6YSmbLGOx\nSAGVnY3TSPpxQu1WXczpjmLjvpop1vVgISTVd3+MCsiyRGiI1SjSFYzAMio7+9sSZbum7K2bHlwz\n/jVmkcHrE612iwWbVQ4o1PRX4L82tzdQtIZYs/X+Je8CVfn1S84L/53HKkIRivB/H0XCtQhFKEIR\nivAfBVnCEA5+aJoeBquoeVdvzQuapntv7VYL4Q4rdqslQOjk1gdW9f1/llsly+fZ9Fe6DQ+xEWKz\nGr/7RYyW3XupqsiShMNq1VveAHaLBZdXQfW1uClIqBneLkn3caqaIM3t0asEA0i6B1NRdTHr8qr6\nXJiI1NK9h8LopappAkmGUKsVh00Pa/aLIr931z/F/sq/2dvVhNgshPi8yX5vqSECFd9cerxkuLzG\nZ5ckKGa3+VoQmW9N86CYslokQ/xmnzuzejW7IcSraroAlXQBmv2ash8ztzUjyVDMYcNqkXDYrIYH\n+L9L7PmNBAK9nW/2a8suqrOvw+zcwujm/85jFaEIRfi/j+Cz+ItQhCIUoQhF+F8Mm0VGQkFRNazZ\nBJ5V0gWVRbYEeIA0TRctIXkU2cjNa5Sd4xcEXlXPQfXHY0qS3qrG7RaAhizdD5e0Ztu82yx6ODEI\nfO1bUTRBmC/H0uFr6SIhYbdacPjEhyzpYvbBAkPZ81AlSffkpbs8ZHj0HpSKohEeYiPCbsOpKriy\nFGw2i+6p1lTCbFajvU5ekGWJYiE2MtxevKqGVZawSjKSDGFWuzFviirw+ryH/rxet6Iagsk/b15F\ny/F3XqFhQSJLVRBCItSm95nN9Oji1SZbUCWBRZKwh8gFhgf7oah6nrCmcL/fraR7SUN88yjQvdwF\nIXsorD+31Ss0wuzWgFD1B4/54JrJfi81hRyh57KstzTKft5g8kazHyfUbgkIY3Z79TxnvTWQbKyd\nBw0/hYns/e88VhGKUIT/+yjyuP5F3Ey/afxcmHzh2xm3jV6TheFneDJId6cXmq9qKomZiYXmA0YP\nL01ohZ6D7NfzV/hmmn8/iLtZd40+W17VGzQ/05NJpicT0JtqBwtVU0nKSgL0KnyFgb/n7YO9yoLl\n+9dSsPBff5o7rVD3MNmZjBACj+oh1ZUaND/Lm4VLcSGEKLCnXG5QNdVoTh5s71Q/7jnvAXol28LA\nf/4zd878JX5MQkyh+KmuVIQQRl/GYOFSXHhUDweuHSjU90ATGhmeDI4nHDeeScEi05PJ1ZSrBc6B\nX1SBMLxeNlnGpTpJ86awJ35Xjr/PzwPk9xq5FBdOr5O1Z9fm4GTvA+sPuZVlf26i7u3M8rrwKgrL\nTy3H4qvca3CtFuwWGVXTn7OhNouvSJMwvJM2CzhsEstOL8zRQzS3PqAuXxi0W9HzNWVfgOimC7tQ\nNE33uHpU0twePexXArusF1ZyewO/536Bk+VWOJFwmjRX+v0+qRDQs9booWqz5Oo99CgebqYnBMxb\nbn8nNEh1eRBCNwCE2CxEhNiRJXAqWdisMl5VI83lxuPVTIV964LvfiEkf4EpS7Yw51x7rOYRWp5X\nKKzqr44sBFluBZdXhQcu7cHewXmFngshAsRefj1fH7xf/mtWs3lrs3uy3Yo+F7IMVl+xLosk5fAG\n+z37wT7/H/QsZ3qyguq9/CD8z8HC4nbG7ULvhQDuZN4p9HsY9GfY9bTrheYrmmKqp2teEEIQffOv\n1ZbZH7//L81h5LXIoHqoP4iTiScL/R4HuJpyNege5tmRmJnIriu7Cs1PcaWw/tz6QvP/r6NIuP4F\nHLpxiHrT6zFxz0QAvt7/dVD8KylXaDmnJa+ufxVNaHy9/+ughFeqK5XOizrTY1kPsrxZTIuaFtRD\nW9EUBv02iDZz23A74zYLYhZwIflCUJ/h052fUv+n+pxKPMW2S9vYeWVnUPxFMYuoNq0af1z8g1OJ\np5h3fF5Q/D1X91D7x9rMjJ7Jncw7fL7n86D455PO0/Tnpvx9699xK27GbhkbFD8pK4l2C9oxYPUA\nFE1hxPoRQT2w3Yqbfiv70X5he9LcaYxYPwK34g7qGv7x5z9oOKMhV1Ou8s7md4Le9M8+Mptq06oR\ndT2Kf+/+d9AP7D8u/kH176uz4uQKZh+Zze/nfw+KfzLxJE/MfILP93zOylMrmXNsTlD8hIwEnp73\nNCPWj2D75e3G99EssrxZ9FrRi25LunH4xmHe2vRWUHwhBGM2jaHxrMYcu3WMfiv7Bf3S/j7qe6pP\nq86BawfovrR70Gtg3dl1VJ1aVW8htaxHgDHHDA7fOEz9n+ozI3oGQ9cMDXoNXEm5QstfWvLhtg8Z\nu3Usf1z8Iyh+iiuF7ku7M3D1QD7a/hGrT68Oiu//7rWe25r3/3yfX0/9WiDHapUpHmonLMSC1SLz\n7YGveGJWff755/ssPrEk4G8L8gDJEiw8vohaP9TkrU1v8cvR2fly/PrBn0tqk2R2Xd1Bi1ktGbHh\nNaZGTUGSybF5l2XdoypJusj053vKskT0zSO0mvsUL61+kff/fD/HGsxNQMmSRKbHi6oJbmbe4LUN\ng3lr0yje2TCCVFcmqhDIFplwu80Q92EhNmwWS0Ceq6YJEjOSGfzbEIasHUSPpT2IT7lFpsurt7GR\nJCSJHCHG2fNrnR4vI38fyUurXqL/qhc5dTtw8519zpweVa8irKqoGqi4EQI+3PYv+vz6IjOO/MCa\ns2t8rWY07BYr+HJdcwv7vpZ6jRRXCl/t+4qOC7tw4MZeZkbPwOlR8KgaLq+KR1Mp5rDlahA4cyeO\nPVf38PPRGfRe0Yfjt06yMGaxcd35hsJKcNt5jUkHv2D2sZ/ptbwvsbdPcjzhuGFQfRAPir00dxrj\ntv6NFaeX0W1JN/bHH8xxr4UGGS6vMXdOj2IIW5fXzee7v2RT3GZa/NKCnVd2EGK1oGi6x9biM0BY\nrXKA6JZ8Qv6eK4ldV7dxLOEoNX+oybqz63K97twgyxLxaZdIc6dy5s45av9Qi2WnFgeVN+x/5126\nd4ma39fk633B7cX8BuurKVdpNrsZozaOKpTwik+Np828NvT9tW+hjHfxqfE8Pe9pui7uSpo7rVD8\nZ+c/yzPznuFG2o1C8Tsv7kyrOa04euto0PyrKVd5YfkLtJnXht/O/BY0/0rKFV5a9RKt57Zm8oHJ\nQfMv37vM0DVDeXzG43y84+Og+ReTLzJi/Qhq/lCTN35/I+g1EJcUx8gNI6kypQr9V/YPWnyfvXuW\ntze9TeXJlem9ojfxqfFB8f9TUBQq/BdQylGKMFsYn+z8hDR3Gt9GfsuTlZ403Xs1wh5BhD2ChTEL\nsck2Vp5eycPFHmZYo2Gm+KG2UEo6SrL5wmb6/tqX80nnSXGlML7teFN8i2ShXFg54pLj6Ly4M3aL\nnV1XdjG/13xTfIDy4eVJdibTeXFn6pati6qpQfWeLRtWFq/mpc+KPjxb9VnO3j3LsEbDTPfMKuUo\nhSzJjN44mg3nN7A3fi9jW46lpKOkKX6JkBJYZStTo6Zy+u5ptl3axrhW40yXrA+3hxNiDWHD+Q10\nXNiR3Vd3M6zRMNNzYLfYKWYvxonbJ+i0qBOHbhyifbX2QfW1K+koSUJGAl2XdOXSvUtUiqjEhHYT\nTPNLh5Ymw5NBz+U98apeErMSWdBrQVB8r+rllbWvUCq0FLXL1KZX3V5BXb+qqXy661MqFKtAiDWE\nd1u8a7r3WYQ9Ak1oLIldwtaLW3EpLiZ2mEjxkOKm+A6rA4tk4cD1A3Rc1JF0d3pQ/UclSSLUFsrV\n1Ku0ntsap+Ik8lpkUD2cw23h3HPd49n5z+LVvKw5u4YBDQaY5pdwlCDDk8ELy19AExqLTizivafe\nM80vFVqKdE+6IdoXHF9Ao67m20WUdJQk1Z3K5IP6ZmPxicU8X/t50/xi9mKkulI5cP0AoBsTRjUf\nZZpvla2kudOIuR1DzO0YHiv7GBM7FGzAkGWJENmCS3FxIyOe6+nXWHpyEeXDKqKoKlaLpcCwUK/q\n5WLKBY4mHCMx4y5LYpcQagnDpbgo7gjL/cRC4PTqPVsFKn9e2caOSzuIT7tM/JkLSAicSjqh9lJA\nYLipzSpj0XSPV6hsw6upzIyeRUzCcU7cPsKJRH2zdSP9BpWLVzZO6Rcg2RFis5DlUVh8cj6nE2PZ\neWkXCCsIuJZ2neKOukhAmN2GhsCtaobgzY7ZR+ayN34fv51dbYitm+mJlLBVwCZb9d4/koSEAAHh\nobaA/NrfzvzGohPzOXT9MJmKvmEf22pcnnOmiy0999YiSxy+cZhRm94mNTONlCwnW8/vYEHfeVhl\nCYtkNcJo8wr7FggqT66MVbaS6nSy8/IupnT+Af/H9OfIur1qjh62XlWjQkQFms9upvfi9fVAH9dS\nN4I+GAqbvSKxv1pxleJVmHpwClleJ0JA9I1onnykCWsHrM11+TwYRhxhj+Dno9OZF2PFrbopG/ow\nS2IXM7nLFKyy1cjB1jRwyBJOt4qGIFTWDSMZShrjd0/g0RKPcDX9EprQSMi8RUl7eRy5GE/8c+mf\nw6ibp3ll7VAeK/cYV1KuBN17ffWZVSRmJnLk1hHuuhJ0Q0MQGLJmCDO6z6DPij4kOZMItYWa5t5I\nu8GM6BmMeXIMnRZ14nradR4Kf8j0Z5hzdA4vNXiJG2k36LSoE9fSrtGpeidTexhVU9lxeQedanQi\n8lokvVf0JjEzkZcbvoxNLrjH68nEk9QvVx9Jklh/bj3D1g7jnusez9d+HofVYeqzVypeCSEEc4/N\nZdzWcaR70mlbtS2lHKXy5WZvG+VVvUw5OIUJuyeQ5c3iyUpPFtg/3KW4jGtMd6fz5b4vmXxgMm7V\nTcPyDXnqkafy5CqaEjC/t9JvMXHvRH4+8jNezUvtMrXpWadnnvwHW/ycu3uOL/Z9wZITS1CFStWS\nVRnRZASa0LBIgc99IUSOtRF1PYpvIr9hzZk1CAQVIyoytsVYIz8/P74mNLZe2Mq0qGlsvbgV0PfV\nf2/1d8Jsebw//sNR5HH9C6hVphbbh26nfHh5von8BoHg4x0fm7bSlAkrw7ah26hbti5zjs0hzZ3G\nhN0TTFvq7BY7q/uvpm3Vtmy5sIVL9y4x5eAUkp3JpviSJDHtuWkMfWIoJ26fIPpmNItPLA7K6/r2\nk28zoe0EbqbfZMflHey+ups9V/eY5j9X6znmvzCfTG8mm+I2ceneJZafXG6a3/ChhqwbsA5ZktkY\nt5E0dxrTD003zX+o2ENsHrSZcFs4f1z8A01ofLv/W9N8h9XB6v6reSj8IXZf3Q0E53mXJImfuv9E\n3bJ1jRDNSZGT8rS054ZxLcfRpkobzt49i0f1MP3w9KBClTrX6Eyfx/qQmJnIPdc9lsUuCwiBLwhV\nS1Zl8OODcatuEjIS2HN1T9DW2kENBwFwK+MWV1KusOH8BtPcG+k3eKHOC4Ae8pzhyWBhzELT/FOJ\np3iy0pOA7rkQCGZGzzTNP3brGMVDimOVrTgV3cI6I3qGaf7xhONcSL5AMXsxvJpu+f/5yM9BXf+K\nkysoHlLcWDdzjs0x/Ry6dO8S/9r5r4CN0pLYJabD5m+l32LImiEB0R7rzq0z7TFIdibTbUm3gDWz\n5+oe02sw3Z1Oh4UdWHl6pTF25u4Zzt49a4rv9Drpt7Ifs4/O1gckQWLWTY4lHM01LPRBWGQLc4/N\nYUb094AAIeNUsjh6+1D+XiPff1llK/ecSfxydDbICsgehOzl0M0o40/zCzcNtdtoWvFxVpxaCsIC\nmh00K0dvBXrNHwwv9QsoSYJnqrRn6/ltIGkguwDBlXvXsfgq9LoVX/EoSRctTo8XW7bP1vexFzly\n6yiaKuvnV23cSElFExJC0otKqaqGR9G4k+HSvaW+yrUhVgu96r6AW3WT6c0C1QaaFUXJpaJztulU\nVIGiaSiKoPFDLalbqj4p/jUnJEqHljSqGj/o/XZ6AsN6q5SoQvfa3Ul1pwIaqDZqlanjE7l6Cx+X\nouDytajJ7rnVBBSzh9OpRicj1cOjuelSowsQ6B3VPcwKmq/Hr9Orku724vEKGpRvqG90JcGtjNu8\n1Tz/yI/sYcQOu5WSoSVwq3qkxqKYRTxZqZWxufe33rFafJMg6RWa/cWcUl1pIAmupuohql2XdGXq\nwalGTm525BZJEHs7ljtZd9hzdQ/htnDO3DnDjss78r3+7NgUt4lpUdPYF7+P52o+Z7wPzODc3XP8\ncfEPWvzSgpjbMQx+fDBjnhxjmv9t5Lf8cvQXui7pSlxyHGOeHGPa+J+UlcT7f77PpMhJPD3vaa6l\nXeOTpz/hh+d+MNX7dOrBqUyNmsr84/Npt6AddzLv8GWHL1nce3GB4jvNnUav5b24kHyBsVvG8sLy\nF8jwZDC582TWD1hPmbAy+fLnH5/PlINTuJ52nW5LuzHi9xGoQuWH535g+9Dt+Rpu093pdF3SFU1o\n7IvfR+NZjfnntn9ik23M6D6DyFcj8+2Tu+r0KmYfmY2qqcw5OodaP9Tiy31fUsJRgp+f/5ljbx6j\nXbV2uXIzPBkM/m0woKfnfLjtQ2p8X4Pph6fzULGH+KXHL5wafYoX672YK3/D+Q0sPqFHQ5xKPMXL\nq1+m3k/1WBizkKolqzK351zOv32eN5q+kcN4nuXN4s0NbwK64NxwfgPPzn+WlnNa8tuZ33is3GPM\ne2Eel9+9zPut388hPLdf2s6CmAXGHP546Ecem/4Y3ZZ2Y+vFrTSp0IQFvRYQPzaeCe0mUDasbJ5z\n+J+MIuH6F3DPeY+fDv8UsEE8eP2g6U230+vkq31fBeT0XUm5wtxjc03xFU3h8z2fE5cUZ4yludNM\nh1gIIfh639dsu7TNGFOFGlS47czomTk2+Z/t+cw0f+Wplfz9j78HjE3cO9G0cNtxeQf9V/ZHFffz\naqZGTTVyTgvCsVvHaL+gPZne+38/P2a+6U3zxeSLtJ7bmtuZ90Mz/7j4h+lQy4SMBNrObxuwyT5z\n9wyb4jaZ4qe50+i9ojf74vcZY0nOJBYcN+cxdSku3t3ybkBYj1fzmhb/qqbyfdT3OUK8px6caoov\nhGDrha38fDRQqE2LmmaKD3p40/zj8wPGfjz0o+k1ZJEtrD0b6NmYc2yO6XzjSsUrceTWkYAw/5Wn\nVxp5wwWhbtm6uBQXGZ4MY2znlZ2cTzpvil+vXD3qlasXYKw4e/es4b0sCNVLVeflBi8HjN3JusPm\nC5tN8StEVODfbf8d8JJ1KS7WnFljil86tDTzXphHkwpNjDGBYNXpVab4ESERrBuwjr6P9Q0YN3v+\nUFsoa19ay7iW2Tx8kuCPS5tyhIXmBlmSmdR5EpO7fGcIT2SFHZe3531S6X4hIVUTvNzwZRb0nYPV\nct94EHkt0vg5tzBZp0fhXqaHlEwPjco9ya/9fsNhDdXFJxLHbsQEiI68BFRxh52apR9lft9FhNtC\nfN5RlVsZF7HKst66Ruhi1elRdC/hA4V+wm3hLHhhCcVsxUDIoDpISEtC0Xz9OSXJ8A5aZNkIvwVf\nMSCbjZ+6zyDU4tA9vpKKxfJAbma2OdOPpWKTLdhsFmRJ4p9tPsEibCB5QVYoGVoal9dLhtuLW1H0\nAkuawOlVkLif++n0KDjdCqOajAHNqscTCyt1ytRFFRpeVSM1y42qQrrHi6JoAVV8/QaBnrXve3hK\nhpTkycpPGp/PH1br8qr67xa96rQs3Z+bhuWagJBASNQqU5MO1Tvkt2xzIHuUUfPKTXipfn/j/iva\n/T6x+poNXFep7lT93OjPzBaVWjCx/cRcKxvnln964vYJ4+dMbybLTy2n8cONTV13UlYSB64d1Ode\ns7Pj4h7aL+hg1AwoCL8c/QXQjZayJNO0QlPO3DVXJ+BW+i1mHZnF7czbHE84zov1XmRq16mmva2f\n7vyUe657TNg9gTtZd/iu83d81v4zU/yzd8/yyc5P2HphK8PXDcdusbNuwDo+aPNBgXwhBG/8/gYX\n713k6XlPMy1qGtVKVmP/q/sZ12pcgfzIa5G8ueFN1p9bT4OfGrDlwhbaVGlDzMgY3n7y7XxFt1f1\n0m9lPw5eP8ig3wbx9LynOXXnFIMaDuLs22cZ2WxkvtFSG89vZODqgWy/vJ1ms5sx4vcR3HPd45+t\n/0ncmDheb/p6nvx0dzrdlnRjU9wmvtz7JdW/r85X+78i3B7O5M6TiRsTx2tNXsvT273kxBJ6Le/F\n0VtH6beyHw1nNGTZyWXUKl2LRb0XcfbtswxvPBybJae3+07mHdovaM+G8xuYf3w+DWc0pMeyHuy5\nuodnHn2GDQM3EDsqlmGNhmG32HPwZ0XPosviLsQlxTFuyzgqT6nMmM1juJh8kf71+7Nv+D6iX49m\n6BNDCbGG5Dl/RSgSrn8JpUJL8UqjV6hXrl7A+Mc7Pja1aQ61hfL2k2/TpkqbgPHP9nxmKjbeKlsZ\n12ocver2CghnmBY1zdSmWZIkxrYcy6hmowIsQ8F4XV9v8joT2gZahrZd2haw6coP/er345eev1C9\nVHVj7Ozds6Zz3NpXa8/vA3+nWcX7fYvvZt01XmYFoXGFxuwdvjcgrNGjekwLrxqlaxA1Ioo3mrwR\nMP7N/m9M8R8u9jD7X93PhLYTAh52ZvnFQ4qzedBm5vScExDaM+XgFFNFMhxWB3NfmMuWQVt4tMSj\nxvjMIzNNiX+LbOHf7f5N9OvRNK3Q1BhffnI5t9JvFciXJInXmrzG6dGnA+7Bzis7AzZD+aFj9Y7E\njoplZNORxti5pHMBBpn8UK9cPSJfi9Q3aj6vY5IzyVSeJOhhPb/1/40FvRYY4cke1cO8Y+bytR1W\nB1O6TmHbkG1UiqhkjJtdw5IkMabFGKLfiKZB+QbG+Jyj5nOFe9TpQczIGNpWbWuMPWgMyA+NKzTm\nyBtH6F+/vzG2OHaxaX6l4pXYNWwX7zz5jjEWTORFMXsxVvZbyeftPjf6T/521lyOlaYJFBUmtvuW\nH7rOwOLLoNkYt9H0+QHGtRrHsr7LjDW0PR/h6hcO2QvvvPhYX1b0W248B/Zf23+fIHTBJYTudHR6\nFFJdbiR0L2i620uLCk+zot9y/fySICbxREB7lNwEVKiv2FF4iI3mFRsxu+cC/fNLbi6nXvUFuklI\nkoQAwkKs2G0WrLKco1hVjVI1mdJ1BqD31snwJJHlUtCEwKPobWAy3AoW2Zf3KUm+Ssn6tT1Wrhbj\n248H2QuypofzPSAQ/XNmlSXCQ+zobV0FsizToHwdhjYeDFYXSAqlQsqgIfmqAst4NQ2nRwFBQHVh\nj6LhUTVaPdKKphWbgrDzSPGHCbNGGNWFbb5qvhZJIsPjNUJ/NXHfIPBcref0Db+Q6FijE6G2+89z\nv3dUv99Wo4dwiFW/Dg144uGGhrf5jaZv4lVEDm9nfsguXKd1nUqozWYYRiy+/GS/scHmK/LlrwaV\n4vRFS0gqpRylWP7icmwWW8CayS/6IDYx1vi5btm6bB28lVKh+Yea+rHlwh9omoy+bjQaPNSAeS8s\npkRIwek+HtVjeLAAI2XkwfDOvDApclKAgfK3M78xcsNIU9EmMQkxzDxy32hfOrQ0mtBM1ZhQNZXh\n64bjUlyG0f3rjl+bTq+YdWQWK06tAOB25m3aV2vPsTeP0bxS8wK511Kv0WdFHzyqh7jkONyqmyld\nprB72O4CU6SEELz+++tGSOvyk8upXaY224ZsY3GfxTxc7OF8+dsvbafvr31RNIV159YZxoIzb53h\nq45f5Zvek+ZOo+uSruyN30u6J52PdnyEqqmMf3Y8F9+5yLhW4/INj/4h6gcGrxmMKlSmRU1j1elV\n1CtXj2V9l3Fq9CkGPz44T8F7IfkCrea0IupGFLcybjF83XDO3DlD38f6cvC1g+wetpvutbvnKvhV\nTWXslrGM3DgSVah8se8LpkZNxSbb+LDNh1x+9zIrXlxB6yqtgw6x/09FkXD9i2hWsRk7X9nJ+gHr\nqVOmDqA/xFecXGGKX71UdX7t9yv7hu8zwhVvpt9k1pFZpvhlw8ryY7cfiRkZQ+canQE9lGJS5CRT\n/FBbKJ+XwmtGAAAgAElEQVQ88wnn3j7Hyw11r0swXleLbOH1pq9z/u3zvPPkO8YLIxiv6/O1n+fU\n6FN81u4zQq16eMznez83HerYvFJzDr52kFnPz6J0aGlAD/8xG3JdrVQ1fh/4O2tfWkuVElUAPdTT\nrMW3dGhpZvWYReSrkTz+0OMArDi1gsv3Lpvih1hD+PTZT4kdFWvkxu6N30vU9agCmDokSeLVxq9y\n9u2zxj2MS44LqkhSl5pdODn6JONajkOWZJKdyUGF2z7x8BMcHHGQbzt9i8PqwKt5gwqXrVS8EusH\nrGdJnyWUCdVDnH6I+sE0PyIkghnPz2D70O1ULVlV5x8yz7fKVj56+iOi34g2QpymHzYfci5JEkOf\nGErsqFg6VNM9JbOOzAoq5LtD9Q7EjoplYIOBAMw7Pi+oIk0Nyjfg8OuHebfFu4C+BoOpEl2peCW2\nDdnGZ+0+wyJZ2HB+g2mvMehGlOV9l/NTt5+wW+zsuLwjqJBzu8XOtOemsazvMsJt4Ry4fiCo4hSS\nJPHxMx+zbsA6IuwRRN+MLpD/YPXVEY1fZ92ADZSwl+TIrSOmjC/ZMaDBALYM3kKEPYJDNw7lWSE7\nL09Wr7rPs2HgBkKtoURdjwos1ud7HCqahorAIslYLP4+rzJCQLtHO7G071IskoUTiTE5xKW/irFv\nxvCqGh6PSobbi0cVtK/Wnh97TAKLSnxaHBZZwqvqeZglQkOwyTIOmxVJknzCx38ovdVNr7rPM7rZ\nSNBk0jwpSDJkujxkeVRUIQgLsfhCVFWfeAqcg1cbvU6bai30333fnQcFotHP1tfGx2aR9bwx4KNn\n/0FESDggUz68NMUdNoo77NisMpoGHlUj1G41hJdX1bDIumiSJIl3WrwDyNR9qA6yLOuVjK1W7FYZ\nRdVw2KzGvPlDZv3irkxoGdpUeRoQdKvVJdeKw15FRVE0FF+rGo+veJRHUahZoh6ooYTbHAx7Yoip\n/sHZ4TdcvtzwZVo90ioglLiYw4YkB4aK262yr0q1IM2TDpICkmBBrwXGezD7mpEl3eDg/+x+aELj\nZOJJAB4tUY2NA7cSYStjqoIzwMbzvsgOSdC7bm+2Dd3Gw+EPmepJu+7sOu5k3dGvU5L51zP/IvLV\nSOqUrVMgNzEzMeAdVTykON91/o7p3abn6nHLDiEE72x5J+D5brfYscpWitmLFXjuyQcmc/D6wYCx\nL/d9aSrS6njC8RxFJHdf2c3X+78u8H3jL0SYPUJMExo302+aelf8a+e/AgwFAF1rdKVl5ZYFcvfH\n76fn8p5GODvAU488xeweswMcF7khxZVCp0WdAhwiIZYQtg/dzn+1/a98Ba8Qggm7JvDOlncCxkc1\nG8WJUScY0GBAvh7ig9cP0mpOKy7eu98t4KHwhzj91mlW9V9Fi8ot8uSmudPosaxHjgiyD1p/wLVx\n1/iiwxc8UuKRPPlFyB1FwvW/AZIk0aNOD2JHxfJTt58oF1aOT3d9GlRrldZVWnPgtQMs6bOER4o/\nwpf7vgwIHSwI9cvXZ8ugLWx8eSN1ytThx0M/BlVdtnLxyizps4R9w/fRtELToHNdS4WWYtpz0/Tc\nhKrt2HJhS1BtNRxWB5888wln3tKtWCdunwgqz9EiW3ij6Ruce/scrzd5nRvpN4ISXgAv1H2B06NP\n80HrD3AprqCEC0CrR1px5I0jfNf5O0KtoXx34Lug+H7L5cJeCykbVpZvI83n2oLu+VvSZwmbB22m\nasmqpo0XfhSzF2Nyl8kcfO0gjz/0OFMOTglKeFllK+899R6xo2JpW7UtM6JnBFVVT5IkXm74Mqff\nOk3/+v1ZHLs4KOEEugc+dlQso5uNNnKmg8HjDz3OoRGH+K9n/4ujt44G3RagSokq/DHkD3547gdu\npt9k+6V8wkVzQanQUiztu5SlfZYaVulg4LA6mNp1KpsHbaaYvZhpr7EfFtnCJ898wu5hu6kQUYFl\nscuC4kuSxKjmozj42kGqlawWlNfUjwENBhA1Ioo6ZeoEff2ge48PvX6I2mVq5wgBfxC55Y52qNaR\n3cP2Ua1kNdPh0tnRvlp79g7fG5D3/iDy82R1qtGJrYO3Iksysbd9nixJItTuD5PVvXVhdhv+pE+L\nLKGhC4uedXqyoNcCrt6LJ9MTuBm9X+RJZ3oVjTsZWTg9ik9AqbxYZwh/a/UPrqReIsRmIcxu08Ol\nfV5XzXe9Fvn+9sEvauwWC/9q+y9aVHuCFHcyESF2PKqKLAnsVpliNhsWi4TdohcWCrXdnwMhBFZZ\nZlqXmYRZIvDrlgcFoiTpm1GBINRuJTTESoRDP2650HL8s80HFLcXx26xGwWUQmwWwh1Ww8NpzIe4\nf/0AfR7rQ4WIctQrV59QmwVVFbpRQ5IIscloQu+vq6iBIbP+c/R5rAfICt1qdQ2Yb79hxCrLZHm9\nuLxeFE3D7VVIdXpwehQeLVULWYL+DV6mmL14gLfZDEo6ShJqDeWL9l/maM2T23rzz12o3UKWNxUk\nwd9a/o0edXrkumbyaq1z+d5lMr2ZVAivyKaBW6lYrFLOPOA82gWpmsqfF/8ESfD+U++ztO9Swmxh\nBbaf8sOfYlK9VHX2Dt/Lv9v9u0DR6cekyEk4FScSEq81fo24MXGMbTnWFH/l6ZVGLY+KERX5vuv3\nXHrnEmNbji2woM6ZO2f4185/Gb+3q9qO1f1Xc/ndy3Sv3T1fbro7nf4r+xviL9wWzpDHh7B50GY+\na/dZviG+QgiGrxseUEugSokqvNn0TbrU6FLgdc84PIOJewML3jV6uBF2i5245Lg8WDqO3DxCt6Xd\nAtJZ7BY7EhILYxbm66RIdibTcWHHHPtJh9XBxL0TjVZ8uUETGmO3jGX87vE5/m/duXX62ssH686u\no/2C9jn2IYmZiQV2Abl87zJPzXkq13fI/Jj5AUK4CEFCCPH/7b+mTZuK/41IdaWKj7d/LBbFLCoU\nP8uTJSbumSh+jPqxUHyP4hHTDk4TX+z5olB8VVPF3KNzxQd/flAovqZpYuWpleKtjW8Vii+EEH9c\n+EO8suYVoWlaofgHrx0UA1YNEF7VWyj+qcRTot+v/USmJ7NQ/PiUeDFo9SCRmJFYKP7dzLtixLoR\nIi4prlD8jP/H3nXHR1Gt7WfK7iahSBVpUhVBRFBQwd4VVIqiiJ2rgui1cS1XEIKgVCkiRUCKSJde\nBOkCodfQS0IS0kk223faeb8/ZnfYTTbJbPju573f3ef3y49kmGfnnDNnZs973vJIbvrsj8/oQOaB\nCvFlVaYRO0fQHxf+qBBfYxpNPzidlp5cWiE+EdHyU8tp9pHZFeZvTdlKU/ZPqTD/UNYhGpc0rsL8\ns1fO0uhdoyvMTy9Kr/AzTESU6869Jn6ht5BG7BxRYb7D76CRO0deE3/UrlEV5tt9dhqze0yZ53gl\nlSRFK/HjlVTKc+fR+D3jK3z9VHtqheafpjHyyyrtTN1Dc47MN/72Bdrq9MqU7/RRnsNHBS4/uXwK\n2d0SZds9VOSRSFI08kkqTT8wh3anJ4V9dvBzfJJKRR6JMq646HxOEaXkOSmz0EN5Dh9l2z2UXeii\n15f1IZ+skNMrk90lUb7TR7kOHzm9Mnl8Cvll1fhcRdEop8hDaVdclFXooeTsFPrbso8pt8hLqblO\nyijQj+c7feTwyOTwyFTo8pOmMaPPXkkhj0+hIo9EY3ZOokXHVpPHp5BXUozzQsfIKynGmPgkldw+\nmbx+hQrdLrpv5mPk8Slh99QnqeT1K2G8IrdEhW6/MSZOr0xf/fEd/Zj0C7k8MuU5vJRT5NXH2umn\nPIeXrjj95PBIJdoUvOd3TOtADo9EhS6J8hxecnnksHYUOv2UVeimtHwnXcgpoou5DrqQ66BTlwup\n+fi7aMfFw1TklsLmopk58+byt+mfmxLJ7vYbffdJasTxK45xSePo7hl3k6RKJf4vdO6FjmXw/q84\nvYJqjqpJR7KSI55XfMxD27Q3Yy+JiXH00/6fS/380nCx8CJxiRz1WdmHnH5nuWMUijx3HiV8m0D3\nzLwn6u9It+SmhuMaUoNxDWjy/snkU3ymuYqm0F0z7qJK31ai/mv704ncE6a5jDF6+beXSRgq0NO/\nPk3zj88nt+Q2zR++YzghEdR2Wlsasm0IHc46bHp9teL0CuKH8tRofCN6e9XbtCh5kem1TXJuMtUY\nVYOuH3M9dV/UncbsHkNJ6UnkV/zlcq94rlDbaW2p1uha9MS8J+jLTV/S0pNL6WLhxXLbLqsyvbb8\nNbph7A306NxH6cP1H9K0A9NoZ9pOKvAWlHvtaQem0U0/3ERPzHuC+q/tT+OSxtHqM6vpVN6pcu/5\nqbxT9OS8J6nbom704foPaczuMbT4xGLak7GHMp2ZpGrlP9P/bQBwkEzahhxdg0jwvxrt27engwev\nTQj5r4RP8UVVlv1/m+9VvNdUTvta+T7FhzgxrsJx+7Img+d409I4xaExDSpTK5zoTkSQNMlUWfnS\nEFryvSKQVOmaEvVlTY5YKMAsFE0xvYMdCcXL1kcLjWmmZXEioXjZ+/9rPkUonR/j//vwJUX3JIXm\n7AU9ijaLcM3Xj3b+hMre8DwHWVUg8AIsvJ6jGczf9fgVyExDvGgJyJMwiDwHUeDD5FoUJoe9P3yB\nqrjBa2XaPRB4HhwHVLZZwHMcGOltSLARBE6ARbDAp+i5ofFW/VkmkOEhDrZZUwkFXr9eCAiARE7c\nULk2eOje4HiL7mXVPWl6Vd14my7V4vYr0Jhe9VbgOChMQ7rzMm5IqIcEqwWiwBne0yBUlcErq9AY\nIPB69WNR1Mf6aM5xNK7SAkSc8ZkcD8PjGmwH05juTQQXkL7g4VAKUeC7gqZVb4IaKOZkFQUkWEVY\neN74nEgFu1SVYWHyKjx7cxeIAg+3XwE4QlWb1Wibx6/CKysQeB4OnwSLKMAq8JAUDSvPLcabbV8H\nI8J1CdawuVjenJl84Ee8dtubsAkJYR58M5/xw74f8FyL54w0i1CEzplQaIwQbxXww74fcN+N96Fl\nzdsjnueVVMQVK3AWbNPUQ5Nw2/Vt0KnBA8acD4bNl1XJGwDG7xmPxtUao3vL7qWeUxom7ZuEanHV\n8EqbV6J+v886MguKpuDNtm9G/d286swqpDvS8frtrxtSMmaxP3M/9mTsQa/WvVCncp2ouBmODKw6\nuwrP3PxMxHtcFryKF0tPLsW9N96LZtWbRfU+JCJsStmEptWbRs0F9IrRCZYENKjaIGquU3JCZaqR\nPhYNiAgqU69p7RNDdOA47hARtS//TMQM1xhiiCGGGP47UdxQNLto/lehLEPaIvBXDT+igDan/v1t\nE/lyqx8XNxAtAo8Ctx8EQOR5w6hTGQMjQu0qcWHXA1BCwzS0zQBQ5JWgBSoAA4QEi27sqaTnhxYf\nY0APJ/UrDBaBv1q1NmCoMwIqBYzbSMZy0JCXFA2MCHEWIWCwMxADNKKAIU2obLMYxmNwPIIGt1OS\nIasEiwBUsVlBgGGs2ywCZI2BiFDFZkG8TYw4zowRCtx+aIxgFfUCVipjgTxaDlXjdUO0yCtB1hgq\nWS244vaBoBuZVoGHRgzxFgsIQNU4i6m5GBx/jVSoGm9I2IQaq0EjszSUtcFa3uZOcIO7tPP8ioYE\nW8nNS40RiJOQYEnQ53JgrhWfXxVpc3m4lg3Va93MiiGGGEoiGsO14q6QGGKIIYYYYvgPRjD3LyjV\nwnN6nuZfYbQCes5lca+V7lEN5CmWE31QmgEQNNJEngeBBSRuNFhFHm5JhiUQlaEyBpVpqGqzmrpe\naJslRUOcRYQa8AwT9JxnlRgq2yzQiEqMcVDLlQfg9StQiQIVdwkJVktYDqmuqcpg4wUjNxnQDV+O\n072qcsCDahUEiCIPnhEABpUBXllFZd4SVphJUwleVYXKgHirAMYIDr8EmyhC4Hj4NBWcpldfZkRQ\nGEOkGKjg+KoMiBP1c2VNg8jxgQJXumUvKRosol5MyiMrsFkE+GUNflWFyFtg5QVoxGAV9HzU0LlY\n6r0NjD8PCxi7mtOqhRS9Kms6M0bgyAKfrEU0Gi0CD5+sQlICGxJEEAU955oxggAbfLKmb6YQAeCL\nbVDwRptCr8lzgC0Q0WV2roXiWiKZriUKKGa0xhDDX4uY4RpDDDHEEMN/LSqyaP5XIagJGmmRXx5C\nvZBCiLFq4Xl4ZTVgPFHAqCQAelXeGglxkAIVbjmOUNmqexWjbTMj6PquHAdZCxbz4fV0D5GPuNhg\nAXkfjTH4NRViICy6yCuB5znEhYRihhljIcZyaHEtjenFlzUi8AGtWkXTq/hKigavpKCSzQqrhYes\nMPhUFRw4o7quomkAuIDuqe75FXnd022zCFBUZhjPoQga0haBg8qYIRfEQODBQeR1o50AVLJawIOD\nJivgwMNqIWiaPn7goHt1rWKJORDp3tpEIWzOWAReN6A1Ms4jEKxC5Pld5ucWn3SG9itBUhgYg2Fk\ni4GqzQjkoGkMxgYFECzShDCDtrQ2xRBDDDGUhZjhGkMMMcQQQwzloCLhjNEiaHgElWZCQ2CLG7TF\nEVohOdhWWWNQNRkCeIDXI345jiByeq6myPOItwqIu4Z+Bdushy9fPRYMBSaiQD9Kfj4f0JRlAOJF\nCxj00N44Cw+eOGhExiIl1IAPNZZDc3Z5TpfJUTUCY5oeCsx0L66sqZA1DgpjqI44eBU9bDreIoDn\nglqzBJuo5/kyRrqRyentYEz3NEaqdhtsR4JFhFOSAaaPraRqsIocqsfbdA+w7rAEz/OoGmeDojEo\nKg8SGeKsFnBACaO1+L0Fwj3QoXOG5/XNCL2SM1/Ca1vWnCn+uUHjPCgZZBGDhi2BiIMUkElSGAPP\ngp/Bh4UoB+ehqhL8qgKe42EROCRE6GMk/F88czHEEMN/FmJyODHEEEMM/0a41roD18qPRgIpEjSm\nXRM/Ghmx0vjX0gYiCpNtAMqXBCkOM5qIkSRCgqHLRf4ieGUVCMiWcBxXrqYno6seLafk0fNOCQEj\nQ4Wm6XIzHDgw6DIvGmNhep/BPNny5kCYNqnGYOF5XeuUsbD8VS2QL1vauBlargFvrcjr2qLVEuLA\nBWRngtcLlZ8JaroGc31D/1/gOHAcwR+4XwTAJysQBQGiwMPlV+HwS/o4kK6jynNc4Pq63JBV4PUQ\n10D4KwXkd4RAjm9xBA1pMSD5o2gaCr0SfLIMgeMNwze03cF+xNsEVK8Uh/jAPYiYP1ssdxS4qm9b\nXOpGEPR82kpxYrl5z6qmG4bF52DoNAu9tqRqkAM6tHpocbhkTyjXyCHWCAwEiyBAFDjD2C1P4zXa\nZy6GGGL470DMcL1GLDu1zFjk5Lpzyzm7JDanbDZE7qMVuweA47nHcTz3OAAg05kZNT/HnYOtqVsB\n6JXnol30ehUvVp3RtSazXFmQNTkqPiOGJSeXgIjg8Dui1u0EgJVnVkJSJahMxcXC6LWxtqZuNbTA\nTuWfipqfnJuMs1fOAgCO5RyLmp/tysbu9N0AdL2zaOFVvPj9vK4VVlzU3AwYMeMe/pn2Z4UMl7Xn\n1kJlKpIykkwt2otjW+o2OPwOJOcm41LRpaj5ybnJSLGnINOZaYxlNMh2ZeNg1kG4JBeWn14eNd8j\ne7A1dSsUTcGMQzOi5mtMw4YLG0BEGL93fNR8ANhwYQMYMQz/c3iF+H+m/Qmv4sWgrYMqZPidzDuJ\nTGcmBm8bDKfkjJqf687FibwTGJM0JioN6SC8ihf7M/dj9tHZpeqnlgWNadidvhsrz6wsoT8byTMV\nSWNzT8Ye7ErfVa6Gc2mL8kNZh3EiPxkDt36FBKtoeN/MaHryHHCp6BIuFaXjkw0fG6G1VpGHEMid\nZES6R5KV1GIFgCJ/EbJcWfjw9w/LbbumEVSNwStpcEsKLAKPBBtQ4M/BpAOTIGl+8BynhwuXMW48\nAL+iwiMp0IjBoeTjeN5RXHZfgsCX1LkNfo5NFCIayw65CMT5cbbgLBRNNzqDlcmJAKsogJEezmzl\nBRD03FWB51DZZgXPK6hss8DLCsFI17a1ijwsvG50soDRFqpHGjRIVZVBJQabKCDeAlwXHwdwgKbp\nYwYgYrs1poGRXhm6tHtb3GAL9UBzHJDjuQyOVyAIZXvmQ/mKpnukBZ7DBftFOPxuXPEWhBnnhneb\nEXxK0FgFeD5QwAq6cVvguwJV05Bi15/d4DOjMGYYu7LKjOrYxedycO1wIPMAiMj0M1cc2y9tL1Nf\nszxsTtkMh99RYf7u9N04X1C2rmlZOJl3EptTNleYn1aUhnnH5lWYn+fJw9iksRXeAC3yF2HItiHw\nq/4K8T2yB0O3D8Vl5+UK8f2qHxP3TsTOtJ0V4iuagjlH52D+8fkV4qtMxdKTSzFq16gK8RkxrD+/\nHh/9/tE1b0L/v4VZ3Zy/4uffXcd1xekVhETQg7MfJLvPTu2ntzelTRXE8ZzjZB1mpRaTWlCWM4s6\n/dyJ8j35pvlXPFeo1uhaVGt0LUrOTaYu87vQybyTpvmqplKbqW3INsxGGy9spHdWv0Mbzm8wzSci\nemHJC4RE0PSD02no9qE09cDUqPiDtgwiJII+++MzmnloJn2x6Yuo+POPzyckgnos7kFrz66lnkt6\nRsXfm7GXxG9E6jC9A+1O303tp7ePSjs2y5lF1UZWo4bjGtLBzIN04/gbo9J1k1SJbp50M1X+rjLt\nSttFdcfWpRxXTlR96Dy/M/FDeVp+ajk1m9iMjmQfiYr/6YZPCYmg75O+p44zO9KK0yui4s84NIOQ\nCHpn9TvUfVH3qLUvt6VuI2GoQI/98hj9bdXf6KPfP4qKn1KYQlW+q0ItJrWgD9d/SM8tfC4qvkf2\nUOMJjanW6Fo0YOMAun3q7VHNAcYYPTj7QbJ8Y6FPNnxCtUfXjuo9QETUd01fQiKo35p+ZB1mpVx3\nblT88XvGExJBvZf1JiSCjuccj4q/9uxa4ofy9NSvT5EwVKD159ZHxT+Re4ISvk2gDtM7UPzweJp+\ncHpU/EJvId0w9gZqMqEJ1RhVgwZvHRwVX9VUajetHVUdUZXqjq1Lb696Oyo+EVHPJT1JGCpQ/e/r\nU5f5XcL+ryy91yAGbhlISATVGVOH7vyp5HdXUI/VK6nk8EhhWptOr0yT98wiblA8VRtRnRqMbUx+\nueQ1y9L03HxxC9mGVqba3zWkhGHVqMDtpVyHl+xuiQpcfsou0jVIc4t8lO/0ldBiPV9wnqqNrEYN\nxjUgJIIcfkfE6/hl1dBbdXhkQ0c2o/AK1Rtbn5pObEpcIkfnC86TN0Qftcgjk9MrB3Q81TDt1suF\nhZRpd1GrHzpSozEtqMa39Wnjue0BDVBd0zOSlqtfVsntU+hM7iU6l3+JuvzalWqOrEV3/HQH/XJ0\nMWXZ3XQhx0EnLxdSckYBncm2U0qek7LtXsoq9FBOkYc8PoVO5lygZcnrqNfiPiQMttKby9+mYdtH\n6dcPtMHrV8jtkyPqkea4cmjY9uH0xm99Sfz6Ovpi/XB6f+UXVODyk90tGf0urn0b1HvNdtjpyV+e\npjdWvEHxw+Np6oGpNHzH8LC+BrVQgxq8BS4/ef1XNVqb/9CcXlr6EtmG2ejXY7/S+nPry/wuKn4f\nm024ld5fPYDEwVVo+sEZYeNrd/up0Ok39IPznT6yuyTKDejcFnn81HZqB5p7ZCFhCEejdo0y7n12\nQAc32+6lywW61q+uz3t1LC47LtMXm76gzRc3ExJBn2741NQzF8Tv53+nCwUXaGvKVuKH8vTi0hdL\n7Xck7ErbRUREmy9uJss3Fuo4s6Pp7wBVUynLmUVERBsvbKT44fHUZEIT0+sAr+w1fl93bh1V+a4K\nVR1R1fQ6ILSdK0+vpGojqxE/lKdjOcdM8UOx9ORSqjW6FiERtOrMqqi4jDGaf3w+1RlTh5AIGrt7\nbFR8jWk058gcqvd9PeO7MBrIqkwzDs0w3l+PzH0kKr5P8dHUA1Op0fhGhETQjeNvjEpv1SW56Ie9\nP1CTCU0IiSDrMKspvdgg7D47jUsaR80mNiMkgpAIOpx1OKo+/CcDUei4xjyu14Cnmj+Fp5o/hR1p\nO3DHT3fgYNZBTD4w2TS/9fWt8bd2f8PZgrO4e+bdSMpIispbUjOhJr667ytc8V7BI3MfwcaLGzFo\n6yDTfIEX8M1D30AjDV0XdcWiE4vw1davotrl+fLeL3Gd7Tr0XdsXE/ZOwLA/h8Gn+Ezz373zXTS6\nrhHGJI3BPzb9A5P2T4rKc/1ci+dwT4N7sPz0cry87GUsPbUUybnJpvnt67VH91u640DWATw+73Ec\nzDqI3y/8bppft0pd9G/fHxnODNw7616kO9Ix68gs03yrYMXA+wfCLbvx0NyHkO3Oxrg940zzAeCL\ne7+AhbfghaUv4KL9IkbuGhkVv1/7fqiVUAsD/hiAPZf3YMSuEVHNgR4te6BlrZaYcXgGVpxZgXF7\nxkUV7nlvw3vxSJNHsDllM34+8jNmHp4Ju89umt+4WmP0vq03zhacxQ/7f8Cas2twruCcaX6CJQEf\n3vUhrniv4Ps93+NY7jFsv7TdNJ/jOAzoOAAqUzF+73jke/NLeOzKw3vt30O8GI9ph6ZB1mTMPDwz\nKv6Lt76IGvE1sCB5AQBg6sGpUfE7NeyE+lXqY8OFDdBIw/TD06Pi165UG42rNcaBrAPwqT7MOmr+\nGVCZimx3NppUa4LUolQU+grxy/FfTHv+PbIHO9J2oEZ8DTglJ7Ld2Vh2elnE6I9I4blexYtfjv0C\nh+SARhoyXZnYlLIpzGtclsdLUiWM2jUKey7vAQDkenJxKPtQWARNcQ+rxgCFsYAWqYSvtw7GrKOz\nQcyKIo8fl4uycL6Y1zl4veJ90DSGYTuGYeDWryAxD/K9+fBKCk7ln0RlqyWoTAOB069ts/BIsIjg\neBiht1MOTMGLS19Ekb/I8HScyDsRcbwZIVD596o3bM25Vbjv53uR67qCFHsKCIQMRwaYxlDkk+BT\nNLjSBsAAACAASURBVGhMr2bsk1UgxKMmijxSnWfRYlITnM89i7SCfBR6HLD73fDLemiqX9bgk1Xj\nHoSOp0XkkWCz4q4ZHbD+/BoU+K/gcNYRWIU4qBqDrKrQAqG+sqp7NTkOEAQOCRYLBIFDg6r18emm\nj7Do1GxovIw5x2eiec0bEW8T9Z9ACG9p3uM6letg5dkVmHt0LlTGMGrnODSq0RgaI71Ss0YlwmgV\nxmAVBVSKE1EtrgqK/C7MPfoLfKoP7617Dz716vdo0MNMFBw/IE4UIKsMDq8Mn6QiXqyExScXQ9Ik\nvLriVUw/PL1E5d3QueOTtbAw40JPASYfmAyVKZh9ZB66L3oFRT4PBJ6DVRAgaRp46JNJDBTcsvJ6\nm3I8WTiafQRvrXoV4AhNqzfFpaIU+GUVPAfIAW+zwOve2iseX6BSsf4Mbk3dirFJY9FndR8A+ndK\neV7mUPx85Gf8Y9M/8PKylwEAfe/sG3HuRkKhrxBdF3XFpoub0H1xdzBiGHj/QNPVg2cdmYXZR2dj\n5ZmVeHbhs1CYglGPjTJV9VhlKnov761H2uwZj2cXPgu/6sf4J8eb0mrdlb4Lq8+uhqzJ+HjDx+i2\nuBs8sgfjnhiH266/rUwuEWHqAf17osBbgF6/9ULPpT3h8Dvw7SPfovNNncvkn84/bUSanb1yFo/P\nexyvLH8Fhb5CfHXfV3ivw3tlXvvPtD+Nv3dc2oEOMzrgzVVvIt+Tj0/v+RTfPfpdqfx0R7oRnceI\nYWHyQrSa0grvrHkHue5c9G/fH/O6l+51Pp1/2vjdq3gxYe8ENPuhGd5b9x6yXFl4u93b2PL6loga\n8rnu3DCPfLYrGwO3DMSN42/Ehxs+RIYzA6/f/jr2v70/ooZsij0l7O/k3GT0W9sP9cfVx6d/fIo0\nRxp6te6F3X12o+0NbUvtw38zYobrNSBOjMNvPX9Dq9qtkFqUCgAY/udw04tujuMw4akJeKDRA8hw\nZgDQFxDFJ3ZZ+OCuD9CzVU/ke/OhMhUrzqyIKly0802d0e/OfvCrfrhkFw5nH8ay08tM82+rcxsG\ndBwAAsHutyPLlYVpB6eZ5l9f6Xp8fu/nAPQQE6/ixejdo03zRV7EBx0+AM/xcMl6iOo3f35jmu9X\n/Xjp1pcQL8YbId9Ddww1bbg5JSfuqHsHaiXUgqRJAICRu0aaDpl2+B2wCTY0qdbECG+acnAKCn2F\npq+fVpSGm2vebCz0l55aajpUya/6sSNtB5pUa2Ic25+533SopcpULDm5JOwFneHMMG24ERFmHZkV\nFlbkUTxRGV5zjs4JW2QTCBP2TjDNX3RiERacWBB2LJpw3fXn1+OLzV8EKrXqmLhvouk5tDt9N7ou\n6hq2UJ16cKrpcLfjucdx98y7w+bMvOPzTIdsXyi8gPYz2hvvIABYc3YNslxZpviZzkx0nt85LMx+\n7+W9psPuXZILX2/72jD8AD3k1WzIt020YdPFTdiSusU4Zvfb8cfFP8LOKy08N06Ih8a0sM0KWZOx\n9txa4+9gKGio4RTMqbSJNnRq2KlEmsD68+uN34uHPYqCfn2fooKHiNdv74MCrwvg9aq2IBFbU7aV\nuJ4QyHUN7YOsMfz9rg/1RRZHgCABvIwjOQcgBkJceV6XaeE5vWiQIHBhobd97+yL5jWah7W/NMMV\nRPDKKmRND6NljNC1RTc8d8uz0ELm/KWi9EDRJkDggm3VApIpMIw4SdFwW+078fl9n0Ph/IAoAbwG\nh88HhRg46N+VssogKVrE8axTqQ6+fXQ4iHiA9PGzcAKqxNlQvVIc+ECOZSWrGChQBSSIIkSBC9xf\nC/5535dh3WxcrXH4/CkjzxQAXmvzOqDaADUeYBbcUuMO+BQ1UByKhRldkcJg7214L0BXF8qvtXmt\nxLV4XpehsVkEPeQ2EIotawz1q9yo9z2AoQ8NDW9/sfnPQZ9/wTmmMAVgPEA89qQdwNvt3kS8GA9J\n1Q3ceIsIQeBQJc4KQdDD0DkeuC7eikx3KsCrYNDvT8+lPbHh4joQAGIAOL0asRao3sXY1TkhqRq2\npG6FRhrSHemonVAba8+txbG8w6U+c6Eo9BVi9dnVWHlmJXI9ufi80+d4pMkjMIsf9/+IAl8Bnvz1\nSbhkF2Y+NxNdbu5iiuvwOzBw60BM2j8JLyx5ARw4rHxpJXre2tMUf/ye8Vh5ZiV6LOmBT//4FNXj\nqmPz65vRp12fcrkF3gK8vOxlrDizAvfOuhcT901Ek2pNsLvPbnx0z0flGt6jd4/Gtzu/xaozq3Dr\nlFux+ORitLuhHQ6+exBf3f9VmZJBWa4sPDX/KSTnJePrrV+jzbQ22JK6BQ81fgjH+h3Dt49+i4SA\n1FEkDP9zOEbsGoELhRfQY3EPPDT3IRzOPoweLXvg1Pun8P2T36N6fPWI3FR7Kh6Y/QCueK9g9dnV\naDutLXov740UewreuP0NnP3gLCZ3mYx6VeqV4BIRvt76NcYkjYFTcmLkrpFoPKExPtn4CQq8Bfig\nwwe48OEFzHhuRon3IQCcuXIGHX/uCJ/qw8m8k+izqg8aT2yM73Z9B400fN7pc6R+lIq53ebi9htu\nD+MyYvhqy1cYtWsUVKZi2alleHjuw2gzrQ1+OvQTqtqqYsiDQ5D+cToWPr8QnRp2ikkvlYKY4XoN\nsPvseGbhM2ELNLvfjm93fmuK71N8eGX5K2E7TwpT8PW2r03xVabi4w0fY+mppWHHv9z8palFMxFh\nxK4R+OnQT2HHv972telF85yjczB2z9iwYyN2jYBbdpvi/37hd3y3M3xnbcrBKaYXzQezDmLU7lFh\n3pnfTv1m5P2Wh3RHOqYdmhZmNOzP3I+NFzea4nsVL9aeXxuWm5vhzMAvx34xxRd5Ecl5ych0Xc1P\ndstu/LDvB1P8SpZKcMvuMKODETNt/MeJcahXpV6J3GKzXluRF3F3/btLGOqjk0abmoMcx6HLzV1Q\nK6FW2PEf9v1gOkfmhVYv4M66dxq6joA+L4N5y2b4vW7thXjxqkLj2nNrTRv/Tzd/GkMfGoraCbWN\nY0dyjmB3hjnD694b78XC5xeiRc0WxrHLzstG3nF5aFOnDXa8uQMPNHrAOOaW3fj1+K+m+M1rNMfB\ndw6i9229jWMaaaYjB+pXrY+kvyXh806fh90Ds/zq8dXxW8/fMLnzZFgDeqIAonqGRjw2Aqt7rUa1\nuGrG8YUnFoadV1bO3Fvt3sLOt3aifpX6xvnLTy83PFSSygKFjihizuX9je7Hvrf34ZZatxj8defX\nGb8XN3osgl59VQkUrmlYtSE2vLoWd9S/DeAZwHHYlrbVKLgTvF5xT2ewD/FiZWx8dSMeavyQbrxy\nKvZl7gsr1lMlwYKqCZGL9gi8gF+6zcMTTTsDzAowEcm5JQ1XvZJvUPJENyQdPgk+WcGwh4fh6Zue\nNM5Ns6eD43gkBLy+usKnXpwnqAfqU1TDkOp75/t4uPFjABhAFiiaCwKn54IGvZ2SyiKOJwD0adcH\ndzW42zD+4oV4iAKPynFW1LuuMirbRCRYdR1Xnji4ZRkuvwK/ooED8NKtL6NR5ZsAzQYwETde1yis\n34qqwSOpYbmtocZotxYvQOTiAQ6olpCA5tWbw+mX4ZUUKBqDN+AxDlZDLi53c0+D+wAWBzAR7et2\nQItaV98HxedR6FzWP4dD/cr1jL6/dOtLaFOnTRi3+Py3BSpVOyUZRICiqQCJADj0bf8uHm7ySNgz\nYrMIhhyRzSLAJuoFuWwWoURO+if3fIJPOn6MOIsAcICFF0IqQnOobLMAXKAtBGy9uN3g5nvzkefJ\nwx1124UVnSr+zAWx6MSisO+fkbtHou+avqby9N2yGxP3TQSgb3jWqVQHTslprD8iRWiE4rud3yHf\nm48cdw400vDTMz+ZNnrPXjlrrPVWnlmJVrVbYf87+8Pe46WBiPDmqjdx2XkZc4/NxcGsg3i+5fM4\n3PcwOtTvUC5/7bm1+OeWfyLTlYlui7uhwFeAxAcTse/tfSXmTXE4/A48Pf9ppDvS8eryVzF853BU\ni6uGed3nYevrW9Gydssy+WOTxmLw9sFIykhCq8mtsOLMCtxR9w5sf2M7lr24LKLBGMT5gvN4YM4D\nSHOk4dmFz6Lroq5IzkvGC61ewIn3TmBOtzloUr1JRK7GNLy37j0M3zkcO9J2oNGERvjnln/Co3gw\noOMApH6UikmdJ+HG626MyP8z7U90+rkTUotS8fKyl9F6amvMPjobN1S+AeOeGIeMTzIw6vFRaFC1\nQQmuW3bj+SXPY8SuEdhzeQ+aTGyCF5a+gO2XtqNTw05Y0GMB0j5OQ+JDiahbpW6Z4xdDzHC9JlSP\nr47Nr23GL91+CfNYTdo/Can21HL58ZZ4LHlhCX5/5XfcXufq7syC5AU4nH24XL7Ii5jcZTL2v70f\nDzd+2Di+I22HKcOL4zgMfnAwTr9/Gj1bXd0hPHPljOnk/nfvfBcX/n4B/dv3h8DpX5r53nzThle3\nW7rh7AdnMeTBIYbh4Ff9GLFzhCn+fTfeh8N9D2Nql6moGV/TOP7NDnNe15a1W+KPV//AipdWhN1D\ns17XGyrfgNldZyOpTxLurHuncXzErhGmjP9K1koY/shwnHjvBJ5u/rRxfOK+iaYK3Ai8gPc6vIdz\nH5zDW23fMo7PPTbXdHGDzjd1xon+JzDw/oGw8BYAwMaLG3Ek+4gpfru67bDnb3swufNkVLVVBaB7\na8yGXDeo2gDLX1qOlS+tNF76uZ5c08URqtiqYOLTE7Hnb3uM8Cif6jPttRV5EQM6DUDye8nGc0Qg\n03OY4zj0vLUnTr1/Cq/c9opx3CwfADo27IgjfY/gHx3/AZ7TX8s/HvjRNL9p9abY9sY2jHtiHGyC\nrn059eBU017f6vHVMb/HfCx8fqFh/M08PNN0kSarYMWox0dh8+ubjZ3uX479YjrygOM49O/QH/ve\n3oeba94MAFhyaklUaQfPtngWh949hDvq3gEAWHVmVVh14PI8ZnfVvwuH3j2E+268DwDw+/kNsPtc\nVz1UHAdwgC2wWC/+Wc1qNMOev+3BY00fAwBsStkESdWjMIqHPQZlSwQekBS9qm3dytfj91fW47Em\njwKchp2X/oRF5IpV+y29D5WtlbGu9zo83vRxgCPsz0oK45YFxghEAhY+vwj3NeoIgENy7ukSC/Wg\nNEplqwWSqkJlBIHnQRygMMKs52ajVa22ABOR7rish4lqV6VwrKIAFhgPAEDYx/P4scsk1Em4HmA8\n7H63ocFaHBHDSDVg3OMTIVACQAKsou1q8SSLgASLBRyn50f5NRWSwiBrepEpn6yCmIBPOg0AmAVx\nfBXEc9WhqszwVIq8LmejqAwuvwyXT4FfUSEEvCJxfHU8ctP9AK+gfYM7EW+xQgQHp1+GwOkSMBzH\n6SGysmoYwarKIKka7qrfARyne9xfvvW1iNVzjUJJIfMgaDw3uK4BAF03N/GhxJL3uNjc4XnOqDJN\nCHhceQ3NajfFwAcGG9cPfUbiLZENyVDD9cVbX8TYJ/TN7FADt3KcFRZRn4+63q9+fqojBRnOqxvV\nA+8fiJnPzYTIixErXhfH3GNzjd9FXsTIR0dicucpUDWUanAGMePQjLBIlSJ/Eew+O2rE1yi3qvHF\nwouYsC88sqffun747dRvEa8VCo1p6LO6jxGlBegpD6vPrjb1zh2/d3xYREjN+Jro36F/2MZdaTiV\nfwq9l/UOixD6+bmfMeShIbAIljK5kiqh++LuhmNA0iQ83fxpnHn/DF5t82q5HsIpB6bgs02fAdCj\nxarYqmBO1zk48M4BPNj4wTK5p/NP48E5DxrrmguFF/BU86dw6N1DWNpzaZkGs6RK6LWsl+GkSbGn\nGCHhaR+nYewTY8s0GBcmL8Tj8x6H3a9HU26/tB131L0DC59fiIsfXsQnHT8x1j7FkVaUhntn3YuV\nZ1YCAJLzkpHvycdbbd/CoXcPYXef3Xj5tpfDNm1jKBsxw/UaIfACXrv9NZz54Awmd56MGyrfAFmT\nMXDrQFN8juPwVPOncLjvYczvMd8wnr7Y/IXpNnSo3wFbXt+C9b3Xo/X1rQEA/9zyT9M5Ys1qNMOS\nnkuQ1CcJnRp2AgAk7kg0Fl3loXal2pjcZTKS30tGl5v03cYxSWNQ5C8yxa9krYTEhxJx7u/njPCo\n6YenI8ORUQ5Th8iL6Ne+H87//Tw+vvtjiLyIZaeXma7wy3Ecut3SDafeP4XhDw9HgiUBey/vjaqy\nX8eGHbHv7X2Y/sx01IyviRR7ipFvaAY31bwJ63qvw8qXVqJxtcYo8hcZ+SdmULtSbczqOgu73tqF\nNnXaQGEKvk8qu7JpKBIsCRj+yHAkv5dshFmN2m2+Kp7AC+jfoT/OvH8GvVr3AoCoQr4BoOstXXGq\n/yl8dPdH4DkeY/eMjarC8d0N7sahdw/h20e+hU2w4cf9P0ZV2bBZjWbY8voWzHx2Jq6zXYfZR2eb\nnsMAUCuhFn7t8StW91qNelXqYfnp5abnMKBvZI15Ygx2vbULLWq2wPZL20sP14wAnuPxScdPcKTv\nEXSo1wHJeclIykgyzQeAXq17Ifm9ZDza5FGkOdKwKWVTVPxHmjyC4/2Oo/st3ZHvzce6c+vKJ4Wg\n7Q1tcejdQ3itzWtwSk6sPrs6Kn7T6k2xu89u9L2zLzyKB2vOrjH+z0zOXJ3KdbDl9S3o374/vLKE\nzSlboqpqWi2uGtb3Xo++d/aFW3Yb0TSRQo05HqieYEO8lYcQ8JzFCZWw6IXFePm2l1DgKygROVJe\nHxIsCVj98mp0uakLzhdcQLYzr9zFO3DVG1fZWgkrXlyBdvXa4lTeyRJ9DRo/xAFV42xIsIqwigIA\nDhxxiBerYGWvZaidUBtpRVm6YchIz4wkwCsrIKZrj4LjAlI/uiHEc8ANletgUucpAMfglrxQGYOi\n6cadRgw2MVwOJ9gnVWXwqypuv76Nnt+o2QCyQgkYGiwQritywTBpEaIgQGUEu0+CW1YgKRp6tuqF\nhlUboGH1BuA4Hm5JP27o4xLBLStGzq5VEAxpFyLgxdYvARzhroZ3IcEqIs4mIk4UUTXeaswjWWUg\nTr+XGiN4ZAWaRqhmq45bb2gJURDwYuueEedZWTJA9SvXB8DwaptXcXONFiWlliLNHQISrCJsFg6M\nkyHwwMxnf0JlS2VjfBnTr0cg3RCNYEieL9SjUx5o9ADmdptrbL7xfMC7Cj2nWeB0rzvHXc2v3pa6\nDYA+/yY9PQnDHxluOkTyzJUz2J+5H4Ae2r3zrZ34rNPngWrSZcvoSKoUFi3W+abOONn/JIY8NARx\nYlzECA1igNuvwCdrGLDxc8iqXsvBwlvwXnt9A/mFVi+U2+5J+yeFvZurxVXDi7e+iG63dIuYVxmK\n/Zn7S6wPrYIV68+vL1eVodBXiOcWPmekVQUxeNtg7Lu8r0wuI4Y3V72JbZe2hR3flLIJ846X7+iY\nfWQ23l//ftgxu8+OY7nHyl1rnsg7YdQACUVVW1U0rd60TK5LcuGZhc+U2FBodF0jvNn2zRLRXqEg\nIozYOQK9l/cO24S18BYMvH8gerXuVWZI9e703egwo0OJ93jXW7pi2jPTjE3WGKKE2SpOf8XPv3tV\n4UhwS24auXMk1RhVgw5kHoiaL6kSTdo3ia4fcz1tvLAxar6qqTT7yGxqMK4BLTi+IGo+Y4yWnVpG\nzX9oTj/s/SFqPpFeme/2qbfT11u/rhB/3+V91OnnTtR3Td8K8U/nn6bO8ztT90XdK8TPcGRQ72W9\n6b5Z90VVXTaIQm8hfbDuA2o1uVVUVemC8MpeGrx1MN04/kbyyJ6o+Yqm0IQ9E6ju2LpRVakOIlgd\nsN739eh8wfmo+UREG85voGYTm9HejL0V4h/IPEDtprWj1WdWV4h/7so5enjOwzTr8KwK8bOcWdRj\ncQ8avWt0hfh2n53+tupv9OWmLyvE98pe+sfGf9D7696vEF/RFBq+Yzi9ufLNCvE1ptHEvROp97Le\nFeIzxmj6wen04pKXjEq6kSrDloU5R+ZEXR00FL8c/SWs/aGVWYtXhY2Eaft/prdWvB1VZd8gGGM0\nYc8E+nTDp2HXjzQWiqLpVVsD1Wc9PoU8fpk+2/g5fZ/0fdjnmu2DT/ZT1wXP0/KTa031tXgF10xH\nDrWYdCtdKswMO88vB6va6tWEXT6FHB6Z8p0+cnj0ysGSotGO1F3UetLdlF3kIbtbMqoZZxd5yO2V\nwz4rWHW40CVR2hUnZds99Mn6r+jDNYMoo8BF2XYv5Tm85PbJYe0vXqXZ5ZGpyCPRZfsVajD6ZtqZ\neoyyizxU6PRToctPBU4/FXkkynX46IrTT5fynXQp30WpeS5KyXPSxVwH5RR5aezOKfTYnM7k8ilU\n6JbI7paMSr55Aa7eH6/Rfr+skt3lp0tXCqnasPq06uRWulzooTPZdsou8hjj6vTKxjgF+51l91K+\n00c+SaX31nxAnX99rsx5pmmMvH6FClx6f4JtWHtmAwmJIp27cj7iHFEUrcRxu9tPHp9CLr+PMESk\nL//4mgpDPjdS9eJIaD2lNbX8sSUVegtLbXNoheLQito9Fr1E1m9stOTEklI/vzR8uelLQiLohcU9\nKcd5pUTF7uBP8YrORFer4d84/kZacXpFie/64s9EcDwK3RL9cX4LYbCFxMR4envVO3TJfsl0m88X\nnKf44fGERFDrKa3pp4M/kVtym+LafXZqPKExIRGU8G0Cvbr8Vdp4YaOpdYaiKfTo3EeNirW3TbmN\nBm0ZRAczD5pa5wzYOMDgVvmuCj274FmauHcincw7WS5/wfEFxCVyBr/V5Fb09qq36efDP9Pp/NOk\nMa1U7pHsI1RzVE2DW21kNXp4zsP06YZPad6xeZRelF4qN9+TTx2mdzC44jcitfyxJfVY3IMGbRlE\na8+uLXO83ln9jsFFIqj+9/Xp/ln30xsr3qBhO4ZRka+oVP7sI7PJOsxqcGuNrkVtp7WlZxY8Q/3W\n9KOtKVvLHLP/NiCKqsIcRVE99P8a7du3p4MHD/7VzagQivxF2Ht5L55q/lSF+C7JhW2XtuG5Fs9V\niO9TfPj9wu/ofkv3CiV4y5qMVWdW4flWzxu7p9FAYxqWn16Obrd0Kzf8JBKICKvOrsITzZ4oM8m/\nLGy4sAF317+71CT/8rA7fTcaV2uM+lXrl39yBBzPPY4ES0KZORtl4WLhRXgVL26rU3Z1wNKQ7cpG\nlisLd9a7s/yTI6DIX4QzV87gngb3VIjvU3w4mnMUHRt2rBBfZSr2Z+43ogCiBRFhX+a+Crcf0DUF\nzeQMlYYj2UfQrm67CvOTc5PR+vrWFS7ScDr/NFrUalGhZxjQc4qaVm9arhcgEhgjnMm/gEbXNYJF\nFA3vUKQ8tdJwofACmlRrUqHrA3r7m9doboyfrl3JjNBVi8CX2hZJ0XCm4CxahuStsmCIpMVce07m\nncSt199a7nmltetoztESlSXN9EFSNMiqgpNXThi7+sG2WwS+BF/RGKhYKGmGMwMe2YsWNW82zhW4\ngC6nwowx1T1zwXDqq2Oz7MQaPNX8aYgCF3YtAhBvFQJ6qCpklRl6sm5J1rVfBf3937PlCwDHgYhQ\nNd4S8V4xRnD6FMNDaRMFrDm3Frde3xp14hugkk1A5ThLIM9UA5Get0jQq93yHActUOW4klWEzUKY\nuH8iPuv4eVhYLAcOssYgcJyR52uzCLAIPPyKBoHj4PJLGLo9EYMf+RoWzgqVaahqs8Fq1cfEJ2uB\nYlNXx0lSNKgaoVKciMUnloIRh+du6gaOC2jTclzE+1x8Hlywn8XEfRMw6ampJe5lafc+eD+9iheP\nzXsUO974EwIngue4Uq9bYvyJ4eZJN2PrG1tLzQ8sbf4CDK2ntsLPXWfo+dlRQGMaWk5uiX90/Ayv\n3vYmeE5vp0fSKxkXf89ojBAfuA8a09BmWht0bdEVA+8fiErWSiU+X1K0sHGUFC2Q48vw6K8Pos31\nt+GL+/6JJtUam34fMGJ4fN7juM52Hf5+19/xUOOHTL/biQi9lvWC3WfHa21eQ/eW3VHZWtkUFwAG\nbByAQ9mH0LVFV3S9pWu5nspQTN4/GUtOLcFjTR7DY00fQ/t67U2v6zanbMbYpLG4q/5d6NigI+5p\ncI/pNVm6Ix1fb/saja5rhHY3tEO7uu3Q6LpGpsZM1mSM3j0aHDi0rN0SLWu1RPMazU23e8OFDThX\ncA7NqjdD0+pN0bhaY8Rb4ssnQl97bUndggZVG6BB1QaoX6W+ae5/KziOO0RE7U2dGzNcY4ghhhhi\n+N9G8YUfEL3h91cimONmhIlWwPD+q+CTNQgR2qioDDyPsD5pTC88JWt6rm3w3gQrwAYlYIywVF43\nfnyKfg2bKOjhqCDEW0RjbIKyLfG2q6F0xe+/T9KrEwOcEcpK0I1gq8iD47gy50zwHskqg6ReNSqt\nIg9GDCKv51MGDWWnTwZjejVdLmAQs0DBLYHXUx6qxlvhVbywCXGw8HoRLZ+i57jqBpfeHqugF8sC\nkVHtV5Y1ZLnzUT2uBgCCVRBAgX9FkYdPUsFAsAW4jADGGIgIcRYROZ58JFgSYBPi9PBoEGxCoBq0\noF+jtLnnlt0o9BWidnz9iPc+1HArPoaFHifOFKTgpuq3wCrwiLOYy40G9HDPNEeaKemO4sb2FV8u\nrnjzS1RgNYO0ojS4ZTeaV78looEp8FfncvE5lGpPhaRJYcXUIrU19Pn3+FXwPJDny4TKVDSr3gxA\n6eMaCbnuXPhUX4mK1WbglJxwy+6I1XLLg6IpcEiOMsNiSwMRwaf6KuxAIKJYddwYykXMcI0hhhhi\niOEvRWnGUzQLvb8a0Xho/51Q2qaBrGqwhhjeQa9nUM9TUvVFf3xggc9xXKkbD2Ges4ABGGrkKqoW\nkGzhIfIcBI4Dx4d7worPkaCxwBhQKa58L32wnwDg8svQDeCrxqslKP0T6I+qMrglPUeRQOAD52Nm\nQQAAIABJREFUBZcqWy1gjOBRFFhF0WgvgcBzHHyKBpUxCBwPjfTcVp7j4Ff14kzBSsk8pxd1Vokh\nLmDEq6peBMoi6JV1VY1BJYIQiILQmK4tq2vNchB5TtefDWwkCIEiShpjiLMIYRsB0dz7soz/4p5v\nvY98mYZytPhXbQRd6xwqr83BOa4ECnSJIh/2//8pG3ExxPDvjGgM17LfgDHEEEMMMcRQAQQ9aMUX\n0P8Bdp8Bnudgq2CY8l8Ji8Abi/dQIyFoWAYRrBKsBRboAAdDJrOY0QronxWURCk+NsFFvsaueiHj\neBEaEVSNoHEMlcXwcN/icyRYbVkFMwo2WYXSDQ4WKMADAJWsFr3Qka4mpHtLeYTpfooij6q8FTZR\ng1/RwjzMHA/UtMYZnlAQBTRf9YrAPlkFOCBesEBSNHg1FapGsAgceHAgjiAxgqyqiBNE8DbOuCYf\nEkbt8SlQFA0ydC9vQsDA1RQNlQJGadDDGwxj1vuvywHF20q/78FiSqHecACG1zcSFI1B1YrNDcZD\nDdzPSPO/Ihs6kYodMYZSr2EWFZ1DYVJXiFwtPHSO20TeKPIU+kyVNq4xxBDDvwYxwzWGGGKIIYb/\ndZRmPMUWev96BD2oQUMyuHhXNBa2yGcEECOoTIPAixACxoRf0RBnEYx7F0TxjYfSDBhJ0cCRbqSI\nAGwW3dvplVVYmGCcG2mOcLzuATXjHQs1WkSRRxXeelXCROAiGlQ8zyHepmvZhrY9aNwEF0XBPgAw\njPpglWKB51DVYoVXUaGoDB5FgU0QYRF4+EiX26nMLGHGlBYwKiXtqjeWMYLCrhpuwb4EW8zI/EaP\n4dEMGNp6VWG13LBfRiixSaG3F4YMTsTrgAvMF/1vWzFPfvF5EbrJEH6da4v6q8gcMrzMGjM8335F\nAyMq1ctc2jP1nxCBEUMM/58QM1xjiCGGGGL4X0dsoffXIpK32ILwRT6IIGmqnkcZ5gkNL7wUaeOh\nLAOmuJESNNAYAXHFzr2WOVLcaAEAq8ibCgstz5vOCOAAo48WUZct8sqKrtEq8hA0HjJ07VUGPVza\nwnNAQDbJAt7QohU4AERh4xL0OkqKBpvIG+NtFXj4FDUgkSQacj5xYuT2MkZw+3Vvsxgw2ONtohHK\nWtZY8IF2hY6hLh0T2Wguz3Na2rwAodyNkIqgIu+Zq/ckdGODh6qV7mU2rvUfGIERQwz/nxDTcY0h\nhhBca873X82PRvc0EsyIn5cFRVOuiW9WO7g0yJoMlakV5hMRXJKr/BPLgN1nvyZ+vif/mvhZrqxr\n4l8qunRN/HMF54zfeZ6LqPtYFk7knbim5yA5Nzkq/d7iSLWnItOZWWG+3WfH0ZyjFeYzYjiUdajC\nfCD8HoQiuMgPVsu1inzY4j1onNrlPIALP5cLqdQaNJT8Cgvz4gZ1bj2yK0w3M1i1WAwxdoLnRpoj\nRGTqXVS8P8E2AiihYxoteA5hGq5BcIHwXUBfQKlML+7kkVSwQJElUeCgqMzIGeY5QOT16sMWPlyD\nFtA9qzaLYPRFFHhYBT5wrp4HS0wPYS7en6BhqBFgEfkw3VKe56BqVOZYWAQeosBBC+jRGpq3PBcW\nZn21reEGbjDc1idrhqe1uGEb9CEX1zIOatBeK6J9z+hNKOllBsdF9DLH8H+L/43aO3/1WuyvXsv9\nf0bMcL0GKJqCd1a/gxN5JwAAS04uiYpPRBi4ZSA2XdwEAFiYvDDqNsw6MgszDs0AAPx6/NeoH5Zt\nqdswaOsgEBEWJC+I2nA4V3AO/db2M+Rzol10F3gL0GdVHxT5i7Dj0g5jLM1CUiX0W9sPKfYUnC84\nj3Xn1kXFJyIM2joISRlJKPIXYcbhGVHxAWDGoRlYdGIRVKZi5K6RUfM3p2w2eIO3DY6afzr/ND7d\n+CkYMXy5+cuoX3j5nnz0W9sPHtmDr7Z8BbfsjorvU3x4f937yHJl4bud3yHdkR4VnxHDoK2DcDTn\nKKYfmo49GXui4gPA9EPTsfrsaqw6swqLTyyOmv/HxT/w4/4fsTN9Jybumxg1/0TeCQzaOgin80/j\n802fR83Pcefgo98/QrojHW+sfCNqvkf24OMNHyOtKA3PLXwu6jmgMQ2Dtw3GybyTeGbBM1HPAUC/\nB1tTt+KFJS9EPQcAYOOFjfjl2C/ov64/9mXui5p/PPc4vk/6HoO2DcKas2ui5mc6MzFk2xB88+c3\nWHRiUdR8p+TE11u/xuBtgzH36FxjUW/WeJI1GaN2jcKEvRMwcnf07xFGDHOOzsGC5AXos6pPqeeF\nLvLjbSIq2cSAoUjYnrYFm1I3oMfi58FzkQ0Cw1BiAXmbEEPpeN4x/H5+A15c9jz8qt/os6pdlWMJ\nbUfxIblYeBFrz63F4G2DkVqUGvUYZLmysPLsGmy8uAU70nZA4Lmw9pWHbFc21p5bizxPHnZmbAcj\nMopaeSUVkqrCKuieOcYIDAQOunc53iIg25ONP9O3gedVHM9LNmSCbKJeVZgPyM+EGtu68QZ4VQ9y\nPNnYn5UEFR5YLCoSbHqhqGAVY0YEr6TB6ZOhBnIzFY2BGLD38l5cLEzH5pTtyHUXwOmT4fLrP35F\nl+GJNBbBishTD/2ATFcm1pz7HW7ZCcYAt1+Bx6+Gzd9geHZwHlDAMz398DTYfS7MPDwLPtVjfH7Q\nmPUrevXq4FwL3QgB9O9BRgyjd4+OevOPiJBWlAYiwjc7vkGGI6PM8/VLXjWipeBcJcKInd/icPbh\nqK8fxNiksVhxekVU/FDMPjIb3/75bYX5y08vx1ur3qqw4bTxwkY8Me+JCm/+7bi0Ax1/7ljhzb89\nGXtw76x7kZSRVCH+4ezD6LKgS4XWcoD+PfLyspfx6cZPK8Q/mXcSb69+G88sfKZC/NP5p/Hh7x+i\n9ZTW1+wI+H8Ls4Kvf8XPnXfeGZWA7f81Vp5eSUgE1RhVgxYlL6L44fGUVpRmmp+cm0ziNyJZh1np\n12O/UtzwODqQecA03+6zU41RNQiJoIl7J9INY2+g307+Zpqvaiq1ntKakAj6+PePqd20djR291jT\nfCKiHot7EBJBXRd2pad+fYr+vv7vUfEHbhlISAS1n96eXv7tZXp2wbNR8X899qshIv7O6neozdQ2\nZYpZF8e+y/uIS+So6oiq9MG6D+j6MdebFgMnIspx5VClbyuRMFSgD9Z9QLZhNspwZJjmy6pMTSc2\nJSSC+q7pS0hEVHOAiOiJeU8QEkEv//Yy8UN5WnpyaVT8j37/iJAIevyXx6nyd5VpzO4xUfGnHphq\niKnX/74+vb/u/aj421K3ERJBdcbUoZt+uIm6zO8SFT+tKI1sw2wUNzyOWk1uRa2ntI5qDnhlL9X7\nvh4hEdTyx5ZUe3Rt8spe03zGGHX6uRMhEdRsYjOyDrNSljMrqj70WdnHEDhHIuhI9pGo+KN3jSYk\nwhBqX3N2TVT8NWfXGMLySARNPTA1Kv6pvFPED+UpbngcIRE0aMugqPh2n52qjaxGwlCBkAh6a+Vb\nUfE1plGrya0Msfenf306Kj4R0bMLnjX4d/x0R9T8ARsHGPyG399IHr9MPkklSdHIJ6nklRTSNFYq\nf/rB6Qa/yndVSFKlqK6/JWWLwReGCuTwO0zxNI2Rw+ulg5nHiBtiIQzWf9KLIr/H/LJKPkklp1cm\nh0cml0+hiwWX6eDlE1Rp2HUkDLEREkHHc5LJL6vklVRyeCTy+BSSFM348Ukq+WWViIhSClNpe8ou\naji2CdmGViIM4Whn2s6wNgY/yy+rxjhqGiOvpND5K6k07+hCaju1A1kGV6W4oVVp2clVEa8VCVc8\nV2jItiH08JyHjefwp4M/kdsrU06Rh3IdPipw+cnukijf4aXsQjflFHkp3+GjfKePzubkUdd5b9DD\nPz9DGJhAt0/pQP/YMDCsv8F2FLj85PEp5PTKVOiSyO72kyyr1HFmR3pozkPG9+lry18zxtvjU6jI\nIxnjbXfrPE1j5PYpVOjyU7vJD1CL8Q8QvqhNPee/Sy/N+5BOX75C2UUesrskKnT7qcgtUaFLIodH\nKjEX75l5D9UdU4/wtZXeWNqPJuz6mc7nZVGhW29vcP4Gx7zIrbfH4ZGpyCNR0wm3ULupdxEGxdFH\n6wYY/S3ySGR3S+T0yuTxKWR3+8ntU8Luo0/xUZXvqtBnf3xGSAS9vuJ1U3M3iKT0JOqxuAdNOzCN\nkAh6ct6TZZ6vj5tMhW4/OTwyfbVpGO1KPUyj/hxPGMJR22ltTX+HaEyjcUnjiIjom+3fEBJBDcY1\nMP0dciznGGW7skljGn2x6QtCIqjqiKqU48oxxT+Tf4aIiPyKnz5c/yEhEWQdZqVjOcfK5RZ6C0nV\n9OfC4XfQO6vfISSC+KE8rTu3rly+T/EZv+e6c+n1Fa8b76Ap+6eUyQ1eN4iUwhR6aelLBv+zPz4r\nk89Y+PxNzk021qNIBPVY3KPc9ociKT2JnlnwjMFvN61diTaW1ZaNFzbSk/OeNPgNxjWgQm+hKb6s\nyvTbyd/okbmPGPyao2rS8ZzjUfXhPxkADpJJ2zDmcb0GdL2lKyY9PQmFvkL0WtYLPtUXlbel9fWt\nsfzF5eDA4dUVr8Kv+vHxho9N75RVi6uGTa9tQo34Gvhow0fIcefgi81fmPaaCryA9b3Xo1n1Zpiw\nbwKO5BzB8J3DUegrNN2H2V1no1PDTlh1dhU2XNiAqQen4kLhBdP8xP9h773Doyj7tv/PzGxJL4Te\ne5dioQhY6ILSFEQULIAUQbGLFQUBQcFCEwSkiDTpQToEAgESCDWhBkjoLT2b3Z3y+2N2N1lImcBz\nP7/3fe+cx+Fx37nYc+eamWtmr/NbnxlDnwZ9iLkaw98n/mb9mfVEJkYa5vd7pB+jW48mMTWROYfn\ncOzGsSJ5S5pVaMYf3f4gzZ7GtOhp3My8yW8HfzPMLxNQhnWvrMMkmpgWPQ27Yi+StdQsmQnvF04p\nv1L8fuh3AL7Z9Y1hPsDinoupW7Iuf5/4G1VT+Tbi2yJ53Ca2n8hTVZ5ia8JWMhwZTN43mSxnlmH+\nkMeG8ErDVzhx8wRX0q/wx+E/uJZ+zTD/marP8PGTH3Mj8wZn754l/Gx4kUItKwdXZkK7CWTL2cTd\niuPEzRNF8rz7mHyY0G4CAPG347mVdYv5R+Yb5quaykctP0JA4HzyeRyKo0hryC7b6VmvJxbJwpV0\n3Uo9JWqKYX5Kdgq1wmoRaAnkju0OAD/v/9kw/3rGdVKyUygbUJZ0hx4mPe3gNMPvoavpV9masJXK\nwZU9Vvo5h+fgUByG+Dczb/LTvp8I8w1D0fTw0GUnl5FmTzPET8lOYeTGkdicNs/Y5vObDYdMZzgy\nGLB6ANFXoz1jh68d5tTtU4b42XI2r/zzCjOiZ3jGklKvcvj6ofvCJfUiP95QNZVRm0bxzsZ3PGPp\njvQivQenRE2h3cJ2nr8VTWHPpT2GuKIosDlhIy3mNEfTBEADQebQtbxb0bmddaqmkeWUyXbK3M66\nS4c/O5DpzEJBv+9n7pz2eGsDfMwIInmGiaqqhq8UyMB1g0lKT8KuOEAzcTX9uueznoJL93hQ3WGp\nFYMqMvvQbI5cPY5TFsh2qDiUnJSBvLy7uRHmF8bZO+fYmbAHVAtXUm8Q6hOGKApYJAkfk4RJFHEo\nCul2J6p+lfQ+rJpG+cAQygWFsPPiDhDg6I0YmpRrlKeX1yrp3+OQVVRNRVEh0yHzWNkn2HVxFwBr\nT6/l2arPeq634qpwrHsu9fBjxfW3U1awKwq1Qmtz+uZxQGTFse2U8auAr9WKpoJDVbA79PZEZpOI\n4rqGsqx6ogLMgi/XUm+DZmLBkb/YfWk3oT4lcMiq3tYod2i3SUJzXQPdGyxyPeMKsddiQZNYf2Yr\n3Ze8SEp2hqsyM0gubzPo7Ypy38eDV6JJz7YxOfIXUE08V7MrCckJhtYvwNITS1kVv4r3Nr1HoCWQ\n6V2mF/h5t5fZxySR5cxiTvRsRm4axmfbP6Skfxgreq9AFIxtj/869hdjIsYwettovt71NeUCyrG1\n/1Z8zb6FcmVV5q21b/Hv2X95aflL/LD3B6oEVyHyzUjKBJQplL/l/BZGbR5FQnICrea14teDv1I9\ntDpRA6NoVKZRocd+eeXLXEm/wvaE7Twy8xHmHJ5DnbA67H1rL11qdSmQH3Exgh8if0BRFWZGz6TO\ntDosPLqQeiXrsev1XQx7Yli+XKfiZOC6gYD+/v5k6yfUnV6XZSeX0bB0Qza/tplJHSbly999aTcr\n41YCcPbOWV5d9SqNZjZiVfwqGpdpzLq+61jZe2WeXIfi4Ntd3wK6425bwjbaLmjLk/OeZMOZDTxa\n7lFW9l5JzNsxSHnkM+++tJudF3YC+rt/Xuw8Hpn5CJ0Wd2Lz+c08Xv5xlvRaQsK7CYT6hnpx7bKd\nn/b95Pn7Wvo1vov4jqq/VOWlFS+x48IOmldozsIeC7n8wWUeKfNIvtfgvxnFwvUh4FScVAupRq0S\ntTxjy04uY/el3Yb5oiBSv1R9z9jepL2GQ45lVeZq+lUv/vnk80yPLvil7YamaRy9cZQaJWp4xlKy\nUxi3e5whPkBkYqRXU2tZlflixxeG+Tsv7LxPZH267VPDm+bIxEjOJ58npw4jfLXzK8Ob5kNXD/Hv\nuX8xi2bP2A97fyAlO8UQ//Tt0/eJlLmxc7mQbCzM7UraFT7b9plHMABsPLuR/Zf3G+In25IZGj7U\n60f+xM0TrIpfZYif5cxi4LqBXmE5NzNv8nvM74b4siozLHwYy07mhOfaFTuT9002xNc0jdHbRt/3\n+fF7xhviA0yNmsqHWz70GpsQOcHwGlp0bBFDNgzxGvtx34+Gc2U3ndvEkA1D0Mg53syYmYZzZY9c\nP8InWz/xWrN/n/jbcKjVXdtdph2c5rWGtl/YzvEbxw3xfU2+RFyM4HrGdc/YyVsn2XlxpyF+af/S\nZDgyvOZ7I/MGa06tMcxvULqBR3SDvi6XHF9iiB/iE0L/xv29xlRNZfGxxYb4AZYAxj47lsrBlb3G\njR7fx+TD7Odn81yt53KNiqw+5R0umJ94EgWRnzr+xIhmI7zGN5zZYOj4AB+0/IBfO//q9R40ev8A\nXqzXi79eXIJJzKnXePDKwbw/rOkVWQUE/MwmNA0q+dfg7z5L8TWb9Uam4CX888tFFUVdDIX4hPDP\nyysIsPh7+NfSbgA5xYAATz6lw6lis8t6GLasYneo/Nb5d50vKqBJZDtlL6FcUNqjqmp88/Q4fEy+\nIOjiKsgaiqqBr8WEoqik2Oxk2J16P1ZX/1eLScTHZEITYESLYSA4QXSAoNG4bEOynTKZdj3UVpZV\nV+9YXQzrRZQkVzsegbbVOoEmgCYgqGbaV3sOu1MBTdPFo8voIbn61Cqq3sZGn61AjbDagASY8BfM\nvNToRVRNL0KkKBqagKtitIzsEsBpNofHIGARLaDqYivEN5DxHb5DdPWotcuq1/rVhZ/kaSGT4Uwj\ny5ENqhkElVuZSYx59lsU2YRT0Ytn2Zwymqrn77rzZAX0CtR7LkYBgufaD/jnTQ5djTW0dhVVYXmc\nvmeyK3bC/MKYHj2dy2mXC+S5q0uvOfs3txxJxN44gCaozOo6i5olaho6dpYzi893fE6aPY2JeydS\nKagSu9/cTd2SdQ3xp0ZN5dC1QwxeP5jVp1bTomILDgw6YEiwXM+4Tv/V/YlMjOTR3x/l0LVD9K7f\nm8NvH+bRco8Wyv9k6ydsTdjKwHUDab+oPUmpSXzQ4gNih8TSomKLArnHbxyn+9Lu7Lq0i5ZzWzJ8\n43AcioOJ7SZyZOgRnq76dL5cRVXov7o/C48uZPrB6dT6rRaT900m1CeU2c/P5siQI3Ss0TFf/raE\nbXRe3Jkj148wcO1A6k2vx5LjS6hTsg7LX1rO4SGHeaHOCwjC/Q98uj2drku6sjxuOWtPraXF3BZ0\nWNSBnRd30qZyGza9uomYwTG8WP/FPA0Xfx37iw6LOnA57TLf7vqWKj9XYeC6gcTdiqNn3Z7seXMP\nBwcd5JVHXsEsmb2419Kv8cyCZ1h3Zh0RFyN4eeXLVP65Mt/s+oZkWzIDmw4kZnAM+wftp3/j/viY\nfAq8B//NKBauD4FsOZtjN455bbgA3tv0nuEiN9cyrt3H/2TbJ17eg/wgCRKqpt7nmRi7eyx3su7k\nw8qBIAiU9Ct53wZ92sFphq2dtcNq42/29xpbfnJ5/puee9CkbBMqBFbwEo77kvax/oyxHLXHyz/O\no2UfJdAa6BlLSE5g7uG5hvhNyzXlhdovUNq/tGcsJTvFyypWEOqUrMOwx4dRKyzHeOFUnYzdPdYQ\nv0JQBb579juerPSk17hRr2uobyi/dv6Vlxu87DVu1OvqZ/ZjVtdZfNjyQ697MGnfJENr0CSamNZl\nGlM7TSXYGuwZnxUzy1C+syAIjG83nn/6/OMlHFbGrTTs8Xq/5fvsG7iPpmWbesaiLkcZNiANaDyA\nk8NP0rlmZ8/YhZQLHotuYehauyunRpxiUNNBnrGU7BTmxhpbg80rNid2SCxjnh7juQeyKjPt4DRD\n/Oqh1dnafytzu831ugdGc3WDfYKZ020Om17dRKWgSp5xo15jk2ji8zafEz042svKn9sDWRj6NuzL\nsaHHaFutrWesKDlKLSq2IHZILH0b9vWM/XnkT8PGiyohVdjz5h5GNR/lGVtyfIlhfqA1kJW9V/J9\n2+9dIkvln7jVXvyCxJMkSkzpNIVZXWchCbqVP/xs0fL1RzYfyZIXl3jW0I4LOwzx3B7NbrW7saz3\n35hFC2gmDlwu4B3uOg+3IPWxSDxV+UlW9Fnumf+pO97Pb34FdNwipl7Jeszr5op0EDSuZdzw/Dvg\n7XUFUrMdaJqeY+pUVcr6V2Ri+4mACoKKU5E9haMKKwLkVFQqB1Xi3RYjPccv6VfSU7DIqan4mk34\nWsx6b1VVxSTonlP3HGuE1KRDjQ4gKPhIvlQNqqELVFeBJIeiF2bCVdwpdwEjkyTyZIU2+EvBoJlo\nUakFZQJKoyi6kSA1K5s0m51sp0K2U0ZDwySIKKqq96I1SVQNrgOqBYBej7xAiDXU1Z9X1r22ioZD\n0cW8SRBIybRzMz2bdFe+rMVkQU9Clfjm2W8o6ZPj8RPwXr+efrEOGZtdJintCqi60UMQVOZ2X0jt\n0LoomuoR7JkOhSynE4dT8XyPKArYZZWoy1Eeg4WP2cryPsvpVrtH/usvFyIueRvdbmTcoGnZplQM\nqugZyy/fXFEV7+gWTaDfygH8eXiJobz0qVFTvQRyiE8Im89tNpSbeObOGb7epde0UDSFEr4lmN99\nviFPq6IqvLbqNW5m3iTDkUGqPZUpHaew7KVlBPsEF8qfHzufqfunAroQrBFag4g3Ivip00+FeooT\nUxPp/FdnUu2p7Lq4i+ir0XSv05244XF82vpTLJIlX66qqby17i2WnVyGhsaIf0eQ6cjkyzZfcnbk\nWQY/NjhPL6cb4WfCeX7J89hkG+MjxzPvyDyqhFRhYY+FnBh2gt4NeufrKb+ZeZO2C9uyLWEbcbfi\n6LGsBwevHKRzzc7sfmM3u9/cTaeanfIUvJord/q11a/hUBwMWDOAMRFjyHRk8m6zdzk78iyrXl5F\n68qt8+RHX4nmiTlPsP/yfvZc2sMzC55h+cnlVA2pypSOU7jywRX+6PYHj5V/rMBrXwwdxcL1IRBo\nDWR0m9FcfO8i49uOJ8w3DNA9KEY2rWbJzKBHB3F25Flmdp3pedEmpiYaChUUBIFudboROySWZS8t\no05YHUDfNH8X8Z2hc2hRsQXbB2xnW/9tNKvQDNCF1+jtow3xa5aoyZIXl3D47cNeG/9Ptn5iaNNX\nyr8UP3f+mdMjTvPqI696xkdvH21I/Puaffm09aecf/c87zV/z7Np+273d4bCXUVBZEDjAZwZeYZx\nz44jwBIAwNT9U7mZebNQPkDHGh05MuQIs5+f7RHAC44uyLey571oVKYR2/pvY23ftR5L75bzWwyH\nClYIqsDCnguJGhjluYcnbp7gn7h/DPEDrYFMbD+Rk8NP0rVWV0C35hoVDibRxLvN3+XMyDO81UQv\nCmOTbYbDXQVBoFe9XsS/E88Xbb7AIlnQ0IpU6KpFxRZED47mt+d+I8gaBOheV6OoHlqdjf02sqL3\nCsoHlgd0z7tR4VLCtwRzus1h9xu7qVeyHqCvIaPFFawmK9888w1Hhx6lVaVWAMw6NMtwkSRBEHir\n6VvEvRNHj7r6hm/xscVFKpbWqWYnTgw/wduPvg3AutPruJRyyTC/cdnGRA+O5os2XyAKIhGXIoi7\nFWeYXym4Elv7b+Wnjj9hkSwcvna4SEVSgn2CWdJrCfO7z8ff7E/87XjDBjQAi2RhaueprOy9kiBr\nEOeTzxeJLwgCn7f5nPB+4YT4BnIp5SKxrpB3oxVUhzw+hE2vbSLYGsyZO2c4e+dskYo89W3Yl42v\nbiTAEsCR60cMpX3krgL7fO3nWd5nGRbJQsyV2LyNX4KAr9nk5T31NZtAEOhauytzu+m/fbkNTwWd\ng7vYD+jpN6NbjwZN4FbmDc+/31vd16momCS92JGGXm3XJIr0rv8qHWu2B9GOhuwpClVYexy3eP7k\nyY8p5YogKuUXhuQKD1ZV/ftBz7GySBIIYBYlNNeYIMDI5sNB0KhfqhEm0YTJ5ZH09zHhYzahuPqy\nyqrmNR9V1fCz+PB01XagCXSp+QKZdpkMhxNNc7UnEiBblvW2O4req1QSRb2NjqZRO6waiA5EQaH/\nY69jNgm6x1TSDdxZTicWUcIsimQ4nSga+FlMOFSVdLsDs2gF0cnjFZ/g9UYD0NCQVRWnqqAoKjaH\nLnplV7Vk97yyZYXTNxNBtoIm8mWb7+hQraOrEjLczMgmM9upC3hVI9PhQBJyVbHWNA5c0Qvy+Zv9\nWNd3LV1qPWe4um/uopa1w2pzcPBBrwiMgkLN151ex9m7Z/UPagKtKj3NgcEH6deob6HtBELtAAAg\nAElEQVRFvW5k3LiviFq5wHI0q9DsPm/b/etNZdC6QV4FkO7a7jJi4whDkTYTIyey/cJ2r7Gp+6ca\n2jPsS9rH0PChXmPBPsF5Cq57cdd2l86LO3ulYVQKqsS4tuOoElKlQK6maQzdMJSFRxd6xgQElvde\nzti2Y72cD3lhVfwqei7riV3JSYXr36g/p945Rf/G/QsUvBeSL9B6XmtiruakP5QPLE/M4Bj+ffVf\n2lRpky/XLtt5fc3r9zkTvmzzJZc/uMwvz/3iFbV4L5YcX8JTfz7lSQPS0GhatimbX9vM6RGneb/l\n+/eFFBejYBQL1/8BuAXshfcuMKHdBMJ8w/hixxeGw00tkoWhjw/l3MhzTHtuGuUDyzMhcoLhHC1R\nEOnToA8nhp9gQY8FVAupxoyYGZy+fdrwObSr3o79A/ez5uU1NCzdkOUnlxsOVwXdc/nvq/+y8/Wd\ntKjYgohLEWw8u9Ewv1poNRb3Wszhtw/TqUYn4m7Feb3gCkNJv5L83Pln4t+Jp0+DPlzPuM6vB341\nzPcz+/HFU19wbuQ5hj42FJtsY8Ie48JHEiUGPzaYcyPP8XnrzzGLZsbsGmOY7zZCnBx+kp86/kSw\nNbjIua4tKrYgamAUC3osoFxAuSLnutYKq8WGfhsI7xdOrRK1+GHvD0WqLFjavzRzu89l/8D9PFH+\nCaZFTytSvrSf2Y9xbcdxYtgJOtXoxOJji4vUmkUSJUY0G8HpEad5rdFrbD6/uUhtRQRB4KX6LxH/\nTjyjmo/i2I1jbE3YapgP0KZKG44MPcLYZ8dyI+MGK+JWFIlfr1Q9dr+5m5ldZ3qqxBYF5QPLs6rP\nKlb0XkGwT7Anb9oogqxB/P7C72ztv5VKQZWK5DUF/V02ru049r21j9phtZkZPbNIfFEQ+aDlB0QP\njuaR0o94KqYbhSAIvNHkDQ69fYimZZsW+foBvFj/RQ6/fZimZZsaDhfOjedqPUfM29E0KFOXNfGr\n86ygWhDaV2/P/kH7qR5anQ1nwvPddBfE3/n6Tkr6lSTiYkShx8vd3gSgS60urOizjGzZkafxzf3R\n3N7T3OOvN3mdSe0ncer2KTRNu084KIpGms3hqVYrucWn65y+bPMVnWt15maWnidvlkTUezzXqqbh\nYzJ5WvZIbhGNwKxu0wj1CwJk/Kz5t0fJLaadrnzPQGsQXz+te8FCrCVcolpvR5PhcCIJeosYUdBF\nmDtcOMjXjNUs0bX2c9QIrUGj0o/cd0x3qK1ZEhHQkF2hv26jhiQIdKzRCZDoUvt5vQcrAtmKgiiK\nBFmt+FlMCAiYTCK4erZazRIWk0iloIpYBAsdaz1HWf+y+JpNWM0Smgb+VhMhvlZ8LCayFVdfWlFw\niX/Xf/hgkgR+7vwjoqi3SVJdHlP9XpsQBIE0m4Msu0y63empkKwbyAR61nuREc1GYpcVspwymgCB\nPmZUlwjWKzBLKK51oaGRlJHA7cy7BFuCWftyOM3Kt8HmkPUSyIXAoTj4J1430Pau35vowdE0LN3Q\n6/6m2ZxkuwwmNofiqcLsVFRPikqoTyizus5hy2tbqF+qnud+5ZeXDnpUlNuw2LpyayLeiGDza5t5\nosIT962ve401v8f8zp5EPQfdKll5q8lbHBlyhG0DtlEhqEKB5xyZGOnx1AKUCyjHx09+THi/8AIF\nGEBSahK9lvXySkt5pPQjdK3VFV9TwZ5Wm9NGt7+7EX873jMmCiLlA8uzMm5lgXsFTdN4b9N79xnD\nLZKFn6J+KjS1asnxJfRZ0Qen6m0IXn1qdaHReUevH+XJeU/mGChcuJp+lRnRMwpMCbpru0unxZ1Y\ndGzRff+2+tTqAqtfK6rCp1s/5dVVr953beJvx5NuTzecR10MbwhGPQr/f+Dxxx/XYmLyLhDxfzIy\nHBlMPzgdRVP4vM3nRebbnDZmH5rN9YzrTGhvXDy54VSczD8yn2M3jjGti7Fww9xQVIWlJ5ayNWEr\n87vPN2SJyw1N0y2ZS04sYUmvJQVawvLD9oTtTIuexpJeSwwVObgXBy4fYELkBOZ3n/9A1qy4W3F8\nvfNrpnaaSqXgSoUT7sGllEt8ufNLPmv1GQ1KNygy/1bmLb7Z9Q39HulH68qti8zPcGQwYc8EWlRs\nwQt1Xigy36E4+GX/L5QNKHtf/qARqJrK/Nj5ZMvZvNPsncIJ90DTNNacWsPZu2f5pFXR28sA7Lq4\ni10XdzHmmTEPxI+9FsuKuBWMb2c83zY3zt45y5zDc/ih/Q9FfoZAz3/+5cAvTGg34YGeobu2u0ze\nO5lvn/22wPCt/JBuT2fS3kl88dQXD5Rvk+XMYtLeSXzS6hP8zH5F5mfL2UzaO4mPnvzogfh22c4P\ne3/g01afYjVZH+j4E/ZM4Kunv/LK/TSKDEcGk/dOZswzYx7o/t/Ous20/TP5rPXnXiJIllVkVcVs\nkhBdLWbyEmZn75xlw5kNvN/y/QKPY3e6vGf3eAC3XtiMTc6gT4M+nkJIqgZounCURNHTHkdD8xLm\nmqbx0ZaP+KDlB5T0Lev5/ntFrFnSe5qaRVEXM5ougDOdaby7aSSLe+l5yja7jEPR8x/dHloNV6sZ\ns6SHrTplRPS8xb+PLyPDkc6wJwZ79RzN7xxkWSVblrGIEk5Npv2iDmx9dZsumslpIyMIYBElHKou\nRIJ9LZgl77nPiPkNTRMZ/vg7+d43VVFd36f3UJUEAUGEi8mX6ba0J7FDosl2ifoMuxNJBItJQkAP\nk7ZIephwsJ/FM//b6TZaz2/Pb11+4tGyTXEoCpKo5yEH+VmwO/WCUCk2J1aTiCQKOGQFURTwMZkY\nsn4YVULLMKH9OM/5OGUFkyjqQtl1DZOz7Kiq3q8WwC7LTIv+jfCz4fzz0mpC/QJxKAo2h4yG7o13\nKiomUURFxSpJmCUJP6uEWRL588iffLrlS/7ps4YmZZvoRb8cTgTAx2zCx5xjHHHfP/e633gunJ7L\nevJTx58Y2Wyk5zlzrzMBQRerqgKa/n2qquFUFWKuHKDL0g70a/QyUztPIdAchpTHc6SoGr4W7/fv\nyZsnaTSrEU3LNmVc23F0qtHJUzyrsGfkcnoSDWY0IMASwDtPvMOQx4ZQyr9Ugc+oG3ey7tDk9ybc\ntd2lV71e9G/Un3bV2hn6fchyZtFmfhuOXD9Cm8pt6F6nO93rdqd6aPVCuYqq8NKKl1hzag31S9Wn\nXbV2tK/enqerPF1oaLKmaXyy9RN+jPqRysGVaVmxJS0qtqBlxZY0Lde00N+mebHzGLRuEGUDytK4\nbGOalGlCk7L6fzVL1Czw3CMuRtB9aXcCLAHULVmXuiXrUiesjuf/VwiqkK94PH/3PD2W9cDmtFEt\ntBrVQqpRNaQq1UKqef4u7V8631za9ze/T+z1WMoHlqd8QHkqBFWgfGB5KgS6/jeogld9mP92CIJw\nSNO0xw19tli4/udgl+0PtGFyI1vOxipZH2jT4+ZbJMsDW3XcYY6Fhb3kB0VVkFX5ga+BqqnYZfsD\nCVfQX5g22fZAm143spxZD8W3OW0PPH/Q7+HDJOk/7Bp0KI4HEj1uOBXnA68f0HM9H0Q0uKGoygOJ\nPjdUTQ+jfNBn0P1+fVC++zuK+f938h/2/me6igG54d6Qqyr4+5jyFI25YeT5yb3Jv3eT7VDtWETr\nff/uzq1EEPIVz3p4ahYSvh5BkFskuwWB6vZIm72f05uZNz2pF/fO0S00fUx6OO69cxLQuJKRSI0S\n1fPku8NefS0mz7wdDoVMpxOLyUT87ePUC9M9d1aThFNVc4SJqmE1iwRYza4cTe9rk5KdysW0czQu\n/ajh+bqvoc2hsPzkP7xYr5dLBOm5sZIg6mG9ioKqgdUkYpH0MGSnomJzKGhozDk0h7eaDkKv3Kti\nEgRC/K1eRoN0mxNB0MOIFdf7TVE1Zhz8mY/ajMRq8vWIQ1nRMJty9g92p0K2U8HmVAi06u/1LIfM\nrwd/YUCTvpTyLesKH1b11hWoOGRXWDd6WHGg1USQjwV/X53/9c6v6VGnNzWC66ACNodT984KIpIr\nUsHiWl+5haCiqozZ9Q3P1+5Ki0otvNZg7nWWZnPoVZhdebmCqIc4j9/9HZ3rPEvbau30e6yoeRpw\n8lqbH2/5mJaVWtKzbk8EQTC0vnSPq8aEvWOpHVab3g16F+m3VdM0fjv4G8HWYHrV61VoaO29WHpi\nKXbZTtfaXYssmCITI7mYcpG21dp6UmmMIiE5gdhrsbSs1LLI3ExHJvuS9tGoTCNDub+5oWkaJ2+d\npEpwlSJfK9BT7gItgQ+1fyiGcRQL12IUoxjFKEYx/i/Hvd5Qu6sVitvTCPlvrouC3N7Ie4Vofh5Z\no8fMzbc5dC/gvfy8vFqFzVFyFTnKa84FzQHA5lAQwGsOdqeCrGr4W033fcYsiZ5ja5pGkK9LtBZw\nbXJz7vVc5ncN3dWHVfQ8WKeiICGgomGW9KrMZlFEEPX/dbepsct6GK5TceqGCpcYFgUBfx+T1zFt\ndpnUbAcmSa+IrGoaqqZiFlVMJouXCM92ynqBKde8bQ4FTdPIsDuwmkyYRJFsp0y6I5PS/sEIAuDO\nSRYEZEUl3W5H0ETMJhGzJCJJAhZR9AjqTEcmIj4IQJrNQVq2A5Mo6jnBqobZJKC5PLy+rnvjLgxl\nV22U8Au6z4DjXmcA6dlOsuxOJFG/H5IoICsKgqgQ4hsAaB4jQH4GnNz3V3Ndr9yCxsj6ApAVFV+L\n9FCGtGIU4/9FFEW4PrgroxjFKEYxilGMYvzHYJZEj4dVFHPyKnMXeXJ7Lx8GoihgzcezoLrCeu/9\nfF7HzEsAe52DoG/e9d6fOcLbQOpvnnM0soHRRY7i8jK6BK6gh//mPgWHq/qtzeGuequhey5zju0W\nm7krIud3be6db16fc8oqoHiJcVUSkBCwmgVkWS8OZRH0IlCSqAs/tyh2iyz3+Zgls0csued67zH9\nXfm4WQ7ZZQSBAKvF0ys2d+9hiyThUPRwYn1cL6YU4mMlS5Y9fV0DrX5oguYJxVVEXXyLokCwjw+y\npnszrSYJi0nPcXUqKlZRwt/ir7c2cio4FBWTKCGJAtlOGatZQhJEshQZH0vOyegCVMRX9PfMVXXl\nrVpFyRNOLoqCXkzLpF8PWdVFqiIKmAWLy4gC2U4Fq1nyeF4Vd/6yJN1nlMhZ34rHWHLvOshrfaku\ng1OxaC1GMR4OxcK1GMUoRjGKUYz/BRTk2cwL7nYz7s20JOjVbe/dTBsRfg+K3CKgoGPmDpd0e1Xt\nsoLVlCMIREFAQcUsSl5eLYv0nwnHy5mT3tLFnatqFkXsqoLo6usjy3r7HItk8sxdVTVU9LY37u+6\nd66FXRv3/darIuNVKEo/poKAS8jJegVfH5NesVkS9fzXIIsl7+JSco5YchsHBJfQzmuu9669AB+z\n1/c6c3kp3TCZRF2+C7pX3CKJqKIuoINMet6sqmlYJH0rme3UOwH4WkyYJZEsh0ymQ8HXbPKsW1XV\nMIl59DQWdFOBKICsqjgUxdMZW1VVr2JNqqbfz9zTdRsM3Pcu26kgCoIr1UMXjcG+ZuyygkkQMXnd\nR70Ik9Us5W/AKWB937sOzJLoybl2c/+T67wYxfhvQrFwLUYxilGMYhTjP4wCN76FiVfXZtpqcnsv\ntf8V4Qf3e33zO2ZuD6B73h4vmEsQWM2gqgV7tf4n4Z6TWRLJcDjR1ZFGtiYjiSKCBE5ZRVFVAiwW\nFFd1Y92LJiCoGhazmO9c87s2JkHEZpc94skiidhdBYt8Lfq2y6HoAsqpqiiKRqbDSbaskI6TUD+r\nq3hV/tcmt1hyGzhsdtmVjythvScs2b32BCDLLmOXFSwmCV9X8aP8RLi7cnHuMbcA9rHoBZZUVSPD\n7kRDwCTq1a+dqoqfxeSqCC3cd328TsvVYklWVDKyndhkXewK6AWkJOkeI4GmoaDha/IOg0Zznacg\n4GsxYXPIZNj10GO9mrM+B4tJ8jyDGpruoS4kaKGg9X3vOgC9gJbe8/c/v86LUYz/JhQL12IUoxjF\nKMb/MXjYYkqqpj5Um4GHLegFeZ9DgcLO4PHu9cD+b2yIjR7TaEhxQWHJRUVhHmy3Z86pqlgkVyEj\nWUFTNUoF6p5MvT6xnoPp/j53HrFZ0vMq3eM2h4Kiqh5vqFkS77s2bjHqcIWz4jq+VdKLPGU7FXwt\nemVdVdPQVMh06K1lfEwm13H0Fh2iIHjyOu9FXqJZ0XQRJQgCDldxJ1+LybP2AGwOXdxKoi7Is+wy\nNqeMWZRQNNWT05qfgeLe++cWre78X5usgqDhZzIhmjUCrGYy7E5XZWEBk+DK0c0d7u4KrQ30sejV\neCXRVVBJxd/HRIDZjCQJOZ5f0/0tkjSXfzZ3jqoexmxBdp2XIOi9a90hzrlD1gt7hAoNC79nHeQu\nzFSMYhTjfw7FTYQeErn7M2U5sx6Kn+nILDLfqThRVD08x91TrCjQNA27rDd0TrenF5kPePip2akP\nxHf3FEu2JfMgxcLc/DR7mmcuD8KXVZk7WXeKzJdV2dMv9Vr6tSLzIaeCc1Jq0kPxC+uHVhj/7J2z\nhXwyb7h7ocXdinso/rEbxzzruShQVL1oSPyteNLsaQ88h6TUJBKSEx6Yn2ZPIyop6oH4iqrgVJyE\nnwl/YL6mafx9/O8H5gPMPTz3gfiqplcS/WX/Lw/Ed3/HpL2TCuytVxh/8t7JBfbXKwiapjHn8Jwi\n9cC+lx+VFMWW81vymBv3bWTd+XG5+bcybxXYP1YUBa8eqvd+p6IqD9R/Njc2ndtUpGNCjkcMIOaq\nXlTxQcOYk1KTPO+k/HBva53cPW4VVXH1ScTjaTRJegsYX7MJP6sZRdM8vToVVfUIHfd5ioLubXQf\nR1H0XqSqpoeyKoo+Dt49bRVNc4lEweMNFdALSfla9N6qZlc7m4xsXTQ6FD18Glx9XgXRdT759+F2\niyW3mHO4PI2SqJ+ngC5e9XBeV06toqJoGpIgYhL1YyhoOJUckepQFJyyaqj3sKpqZGQ7ybQrJKZc\nRdU0j2czS5aRFQ2TSa/ALAl6lWJZVTHfE+5ulkTSXPsPi2TCz2LC12KiZKAPIb5WLBZJ79nrus6+\nVpOrryyePskWSdQrSru+1i3WLWYJsytvVtX0POJAHzNWl3DOssuk2uw4nPq1kpW8f39yr+/c5+8+\nDffaMUkqFlPBKQAFQdM0bE7bA3HdeNC9nBsP+v50Q+/r++C4nnH9gfYBbqRmpz7wfhT0ffnV9KsP\nzJdV+YH3EaCvgVO3Tz0w//91FAvXh8C19Gs0nNGQWTGzSLOnMXDdwCLxs5xZtFvYjo+3fIyiKvT9\np2+RHlZVU3lr3Vv0/acvdtlO/9X9iyx+x+8ZzzMLnuGu7S7DwocV+WFdGbeShjMbkpCcwFc7vyL2\nWmyR+AevHKTmrzWJSopi9qHZrD29tkj8xNREGsxowIqTK1h3eh3To6cXiZ9mT+PpP59mYuRE9lza\nw7cR3xaJL6sy/Vf3Z/C6wZy6fYrB6wcXia9pGt/s/IbOf3XmStoVui/tXuQX9pLjS2j6e1OSUpPo\nsqRLkX+09ibupe70upy4eYIXl7/IpZRLReKfv3ueBjMasOX8FoaHDy+ycEu2JdN6Xmt+j/md8XvG\ns+zksiLxHYqDV/55hQ82f8CsmFlMO1i03sWapvH59s/ptawX82LnMWFP0Xsn/3nkT1rObcnsQ7P5\nZtc3RebvuLCDhjMbMj16Oh9u+bDIayD+VjwNZzZkStQU3tn4TpGNWDcybtBqXivGRoxlaPjQIhtQ\nspxZ9FnRh/c2vceHWz7k4JWDReIrqsLHWz6m78q+fLf7O9adXlckvqZpzIyeSfuF7Zm8b3KeDeML\nQ/iZcJr90YyJkROZFzuvyPyYqzE0+6MZozaPYvHxxff9e2Eb34TkBNoubMuANQOYG1t048GtzFv0\nXdmXfqv6MW73uCLzMxwZfLTlIwatG0T/1f09xjjjUJgSNYVR/46i+9JupNsz9B6tkvFtxvzY+Yza\nNIoey3qQlFbwGsztRbQ7Feyyyur4cEaEj2J4+HAOXzvsEoh6T02HrJBhl3HIelEd961wt1nR0Nh5\nYSfv/juSv48vY1nccq8iSG5BanIJM/ffusdXRVZlDlw+wKdbPyX2xmGWn1zqud9uA0XucFaTKCJJ\n4FBUZEXlzN3zxN2K56eoH7mYdoEdF7YXeP5uL7CsaDhlhaUn13LyVhxj94wl7nYct2zXEV0Vh91r\nT5+Ofs2ynTJZDieKokcHfLt7LFFXIvly52ccvBKtV0N2tf/J7/h2WUHRQBJh7K5xLDm+lIHrBhN9\nNQpVw2MQcKoqFpOEv48Ji6u9UO7vFUWBD7e+S9ztk/T55yX2JO0gxNfi8VrmZQC515jyTcTXOJRs\nOizqwKr4VR6xnjvc2d9qwmox6a2eFL2vraKp2NVM9l7eS5Yjm3YLOzH94Iz7ztfdc9g9b7eX1yyJ\nHoOxXbbz4vIXGbVpVJGM8G6nh122M2DNAHot72XYeOc+jqpqpNoyeXvtcB6f3ZK07KKLV5vTxkdb\nPqLGrzW4nHa5yPwsZxZf7viSSlMrsf/y/iLzMx2ZfLvrW2r+WvOB3uHp9nTG7xlPtV+qMX5P0fuv\np2an8kPkD1T9uSpDNgwpMj/ZlsyP+36kxq816LioY5HfoXey7jAlagp1p9fl0d8ffWgDwv+rKA4V\nfggkpiZyx3aHYeHDWH1qNVvOb2FAowE8V+s5Q/xbmbe4mn6VH6N+5PD1w+y4sIO5sXN5+7G3DfEz\nHZmcvXOWA1cOcD3jOpGJkUyInMC4tsY2LaqmEns9lv2X9/P0n0+TkJyAIAgs6mn8hRF7LZZzd8/R\nel5rNDSOXD9CxBsRhkP94m/FczntMh0WdaCUfylMookutboY7m+WkJzAlbQr9P2nL9VDq3M76zZv\nNHmDEr4lDPGvZ1znQvIFRm8fTfXQ6iSmJjKy2UhqhdUyxE+zp3Hi5glO3DzB1oStJKUlEXExgqer\nPm2Ir2gK+6/sZ8eFHTw+53GuZ1xn8bHFvN7kdUN8gH1J+zh56yRNf2/KHdsdpu6fytdPf22YH3s9\nloTkBFrPa02qPZXvIr5jbnfjG+czd86QkJxA96XdyZaz+WrnV2wbsM0w/0r6FU7fOc2w8GGYRBOx\n12Pp06CP4f6tKdkpHLp2iBVxK5AEiWCfYEY0G0GQNcgQ36E42JO4h8jESDac2YAkSnz51JdUCali\niK9pGjsu7CDmaozH03Tg8gGaV2xuiA+w//J+Tt0+xfub3wdg9anVvFT/JcP8uFtxnL59mo+2fgTA\nH4f/YFSLUYb5SWlJHLtxjANXDgDw64FfmdxxsmH+Xdtd9ibt5XrGdQB+3v8zS1407vXLlrPZeG6j\nx2P/28Hf6FWvl2G+qqksPLbQs1maFTOLkc1GGn4PZTgymBEzw3P/FhxdwLi24wz3IE7JTmHu4bke\n/ombJ5jZdSYBlgDPZ/LLhzSLItfSr/HXsb/YdXEXAKIgcivzFqX8Sxk6/vm759l+YbuX0edC8gWq\nhVYzxD91+xQxV2P4ef/PKJriOYdGZRoZ4p++fZp9SfuYtG88qdkZgMjxm8d4qkorQ56nSymXWHZy\nGTOiZ3Ap9ZLnnKqHVs+X4w4DtssKKfa7TN47ie0XIjh18zRIWXSp1UUXN5JIut2JKIhYJL2qq11W\n8MnVTsipZjN0w2Dibp7h+I0T/B49h7k95mGXdS+cjysH0h0qmjtEVFF1Afv8kue5nHaZkzdOM+3g\ndCa2n0i2LIOmewFNooDmEo0CgqelTbrswKEoTNr9I/G3YknKuML8w7N5rckAXqjbKc9waFznram6\n91fTYNeFnXz077tkKlmsObWW2mE1+bvXUjSXF1T3DuutXNztaswmCQ2wO2Wup1+l46LOqKpIzNUj\nlAoIYUGPhVgVnzx79trsMplOGbtTxe6USbYnM2rjByCo3LXd5smKTzLw8QFYzeUNhcjvurSTNadX\nk2HPpEGpujxXs5Pn/hSWx33+bgLfR/zA3kvR7Lmwn8pBVehas3u+FawVTa+ArPduFVlw/G+2nt1G\nmH9Jdl/cjb/Zj2FPDPVKOcgvZF4Q4NVVrzK321w+3vox4WfDaV25NdlytqEe7kevH2X5yeV80PID\nei7ryZ7EPTQp24SU7BRD/Va/3vk1Y57+llO3z/Hqqtc4eiOWGqG1SEq9Rj1LQIHP35W0K5y6fYp2\n1dtx4PIBXl/zOqfvnKZSUCWupl+lYlDFAo+988JOnq32LADrT6/n3U3vcjHlIqX9S3PXdrdA7q3M\nWzhVJ+UDy6OoCn8e+ZOvdn7FtYxrhPqEFir8c7/fMh2ZTI+ezqS9k7hju0OAJYBgn+B8uXdtd/Ez\n++Fj8gF0w+0vB35hevR00uxp+Jp8qR5SPd+0k9tZt73uzenbp/n1wK/8efRPspxZWCQLrzR8hXR7\n+n3zSM1OJcAS4ElH0TSNqMtRzIqZxfKTy7ErdkyiiR51e5BmTyPUN7TA6/DfiGKP60OgecXmRL4Z\nSYXACp7QsBH/jjAc5lElpAr73tpHw9IN2XFhBwCjt4/mdtZtQ/xAayDbBmzj2arPEpkYCcDkfZM5\nd/ecIb4oiCx9aSn9HunHiZsnyHJmsfjYYvYl7TPEBxjXdhyftfqMaxnXuJ5xnT2Je1gZt9Iw//Um\nrzO9y3QynZlcTLnIubvniuQxe6bqMyx9aSmqpnLu7jlSslMYGzHWML92WG3W9l2LWTSTkJyArMqM\n3j7aML+Ebwn+6fMPgZZAj4fgk22fGLa2mkQTc7vNpVxAOc+m/+tdX3uFkBeGL5/6knol63HHpoc5\n/7jvR8NrCKBn3Z60qtSKVLseWrPg6ALO3DljmF+3ZF061+zsmfP2C9s9G/DCoGmax1ihoeFUnZy5\nc8ZwuKumaVxJu0Lbqm0B3RBw13a3SGvoyPUjNCqtb9A1NGRVZmLkRMP8qMtRBDGkiVUAACAASURB\nVFq8G5x/v+d74/ykKC4kX0AScjZmEyInGF5DMVdjWBG3wsvYMyVqSqGhlm7E3Yrjq51feXLEAH4/\n9LvhUKuLKRd5ddWrXmtuRdwKwxb76xnXab+ovVeY+a6Luzh+47gh/p2sO7SZ38bLwh9/O549iXsM\n8dPt6by88mU2nt3oGbuReYN/z/1riC+rMmN2jWHWoVmesSxnFmtPeUeP3Bva6Q7FlCSRDWc2MG5P\njsFR1VTWnFpj6PgA1zKu8cWOL7zGws+G614xp4LNoegho/l4z/zN/ny/53uPaAUMP8MAlYMrs+TE\nElIdKSDKIDo4fjPWcLhk5eDKnL973iNa0QRO3TpPSqaDlEwHNrt839xFwdUvFIEw35KUCSjHqVvx\ngAqaREp2iv45l2fOxyzhZ9HbxWiaBrmq7wZY/OhYvQvHb5xwVa8VsEgWV8gt2JwyaN7eNk+xIAEE\nQWDo40M5eeskCHoebPnAaq5cYLe41I0U7lhWu6wgiSJhAb4E+1h4rk4PklKvgqaSlp1J66qtkRWN\nNJsDRdG8wqHd553bC9ysYlMyHU7QBM7dTuDVR/rjdIlVu6yCpm/4bHYnWU63N0/PIzWbREr4lEBV\nBVBFDiTG0L5aZyTNSrZT90zmPr7DoZBis+OU9UrRDlXhVkaaXhZYlYi4sIfbtmuUDyinrz2XAeBe\nD7QbNzNvcjntsh4pImgsi1tMv9WvkOXILjRkWVU1Vp5cAwjsurQDsyTyfO1e3Mi6Di7DkJehyOVt\n98xB0JgRPYstF7by9/FlPFK2IQt6LMxTsOQVMr/61GqiLkfx1J9PEX42nDaV2/Dvq/8aEq2yKjNo\n/SBWxK2gxdwW7EncQ9daXdn9xm5DonXtqbWM2zOOH/dNpeUfLTh6Qzf6HhwURY3QGjiV/D1+NqeN\nHst6sOviLkZvG82T857k9J3TDGo6iBPDT9CsQrMCj/3Xsb8YFj6MiykX6fZ3N7ot7UZiaiIjnhjB\n6RGn6VKrS77cu7a7dFjUgYTkBDaf20zT35syaP0g7tju8GHLDzn/7nnebPpmvvxpB6cxJmIMNqeN\nqVFTqf5rdT7d9ik22cZnrT7j4nsX+bzN53lyk1KTaDO/DXbZzoXkCwwPH06Vn6swIXICoiDyZZsv\nuTTqEr8898t9a0DTNL7f/T2/HfgNTdPYcn4LXf7qQt3pdZkRM4MASwBjnh5D4qhE/uzx532i9dTt\nU7SZ3wZREEmzpzEzeiZNfm9Cq3mtWHRsEWUCyjDu2XEkjkpkRe8Vho3n/20oFq4PgWRbMhP3TuRW\nVk48f0JyAhMijYUaZjmz+Hrn1155hXdtd/l8e94P3L1wKk6+3PElUZdzQjMdioNRm4x5WjRNY2zE\nWFbFr/Iaf/ffdw2HOPx64Fd+PvCz19jHWz82LN6XHF/CB1s+8Br7LuI7w8Jr87nNvLbqNa+x6dHT\nDYv3A5cP8MLfL+BUczb5/8T/Y1i8x9+K57m/niPdkROWc/DKQcPi/XLaZXou68m1jJzc2MTURGZG\nzzTEv5N1h0HrBhF/O94zlu5INyy8Mh2ZfBvxrdf5KppiONzVoThYcHQB2xO8w9q+2vmVIeGlobE3\ncS/bErw9tN9GfGsoVEoQBG5l3WJv0l6v8Z+ifjKc6+pn9vO6fgBzY+caDpetHlqdDKd3aO76M+s5\ncv2IIX7jso0pG1DWqyDQ4WuH88yTzAuPlnuU9tXb42f284wlpSXx9wlj4r9+qfp80OIDygeW94yl\nO9L54/AfhvhVQ6oyo8sMHi+f0ztcVmXDxoOyAWVZ8/Ka+zysRsP+w/zC2D5gO++3eN9rfFbMrHwY\n3gi0BrL+lfVM7TTVS/wbDRc2iSZ+7vwzq/qsItias1HJM1w4n1zRwY8NZvcbu6kQWMHz2ZXxOe+Q\nwgRo68qtOTDoAHVL1vWMbTgTnm8O6L2oFFyJPW/u4YnyT3jGIi5FGDp/AF+zL2v7ruXZqs+CJoBq\nIvpKbIFiOTcEQWB61+n6ZlcTQDVz7vZFREFAFASynXpF3tzfpQuQnL9HPvEunWp21IUzoke4uivW\nCq52K1ZJwtds0j22gu71dKoqrzR4hWerPwWaCTSTZy1YzZIucjVd+DicCtmyjENWyXbKSC4h2q1O\nNxqWagSaBKqZCgEVPL1LQ/2sOXm1ufJuRVEXnUG+VnrVe4YgH19dYAoSrSo181TkdebKwRXc4b9i\nTo9ZgOaVHgNBF6pl/ErTvlp7NEH3VLrvv1NV8bdYCPPTPU2yrGKSBHwkE6H+YaCaAJE6pevweuPX\nPTmxuW+hQ1a5lpZFlkNGc92HAIuF9Cw7qAGAQuPy9ZnYfiKqpt3XisjdrsYt/O1OhQOJh/Rja/q5\nlPQPY/YLMwjx88s3p9oNp+Iy8mgSqBacqsKHm0dyLf0yQb4WJEnwMhS5+9665/Dv2c16qK8mAHqL\nol/2/2yoXoZTcXoM3bezbhPqE8qcF+Z4RVoUhF/2/0LM1RjO3j3LubvnGNlsJGv6riHQGlgoNzE1\nkTfX6uLus22f41AdTOvyGwt7LCTAGnifcSA3NE1j0PpBxFyN4fs93zNx70TKBpRlY7+NzOk2p9Bo\npS3nt/DG2jdISE6g/vT6rD+znmYVmhE9OJrfuvxGiE9IvtyU7BQ6LurI0RtHeWvtW3T+qzPHbx7n\n5QYvE/9OPD92/LFAL+MPkT8w8t+RRCVFUf3X6nyw5QPS7Gl82PJDLrx3gQntJxDmF5Yn98TNE7Sc\n25K4W3EMWj+IWr/VYmbMTML8wvixw48kjkpkbNuxeUa62GU7b6x9gy93fsnepL00nNmQTos78e+5\nf2latikLeiwgcVQi3zzzDWUCytzHX396Pc3mNONCygWGbhhK+Z/KM3zjcI7fOE7XWl1Z/8p6Et5N\n4IunvqBcYLkCr/9/O4qF60Mg1DeUb5/5loFNB2KVrJ7xH/b+YMhj5Wf2Y3y78Xz05EdeG54/Dv/B\ngcsHCuWbJTPft/2e8W3HUy4gZ6GHnw1nw5kNhfIFQeCrp79i9vOzqR1W2zN+6Noh5sfOL5QP8G7z\nd1n98mov69yl1EtMiZpiiN/vkX5EvhnpZZ1LtacyZtcYQ/xONTtxdOhR3mjyhsc65lSdfLrtU0P8\n5hWbE/9OPB+1/MgTNgLw0ZaPDAmveqXqcWLYCSZ3mEyoT87L9vMdnxvyeFUMqsiBQQdY1HMRVYJz\nrGvf7/nekMcrzC+MDf02sLX/VpqUbeIZn3ZwmiHh5W/xZ/YLszky9Agda3T0jC89sZSj148WyrdI\nFsY8M4YzI88woPEAz3hkYqQh4SUKIgMfHcjZkWf5rNVnns3i+eTzLDpqLGS9Y42OHB16lF87/+r5\nwSyK1/WRMo+wfcB2VvReQeXgyoC+hibtnWSIXzagLAt6LCDyzUive2A0x8bP7MfYtmM5Puy41z0w\nagATBZFBjw7i9IjTvN44J8R80t5Jhg1QHWp04Piw43zW6jOP5/fnAz8b9to2KN2AyDcj+aXzLx4B\nPfvQbMM592UCyrCy90qWvbTM42lYdGyR4RwfX7MvUzpNYceAHZ57uDJuJTczbxrii4LIqBajODjo\nIPVL1Qdgw5kNnigII+hZryexQ2I94m/L+S3cyLhhmN+8YnMOvX2Ip6o8BcD2hO3cybpTYBGi3Kge\nWp2ogVG0r94egF0Je8hyZnmFaLpzMvNCSb+SbB+w3cOPuBhRpBwtP7Mfa19eR+vKzwACsddjCxTL\n98Ikmlj20jIal3kMNIkLqRc8xY0kUdRzOXPNXRQFfMwSGpqrCrDIvB6zqRhUAVBzPK4uzWOWXC1Y\nBAEE8DGLXsWUJEnkt+emYTGZQdAwCWbPcfRCQAIiAk5VceXWaigqZNidyLIKmsCnrb4ABBA1apes\nhijmhNa6hYQ779YN1SWqSvoH8Xz950By0KRSHUKsIWTLOb1I3efuvp+5xZ+qalQPro2vyQIa9G3U\nFx+TBT+zGZOrLY4umkUQwWKSCPGzEurvg5/ZjCBCqE+IruxR+aH9WD1VQ3AXllK9Wuo4ZA1fixmn\nouCQFRDAJt8BVIJ9ffUQY8mKJOrXOHfFX7usoKEhuUK2NQ2O3jyqXzfNRN2w+mwfsN3L41iQ4eZy\n2lUOJB3S+YJKs4pPsP313TQo+ainuJXVJHoJYHe+qiQIzIyZAbIFVAuoIiHWEPo26gOaqdBIhbmx\nc732esnZyby88mVDhnN3XZDcOHjl4H1G4LwgqzL9/ulHcrb7/ajyTNVneb728570iIIKo03aO8lT\nwE1Do1JQJQ6/fdhQmlvM1Rh6LdNzcJ2qE4fiYEaXGUQNjOLRco8WyE2zp9F5cWcOXTsEwNm7Z3my\n0pNEDYxi6UtLC0wN0DSNr3Z8xWfbP/Nwk23JvNf8PRLeTeDHjj9S2r90vvzdl3bTel5rrqRfAfTf\nh+qh1ZnzwhwS3k3gwyc/zNdgcDvrNh0WdWDh0YWAHlV26vYpetXrRcQbERx6+xADGg/AarLex1U1\nlbERY+m2tBvpjnQyHBnMPjybAEsAn7f+nAvvXWBDvw08X/v5h65m/9+CYuH6kKgeWp0ZXWdwadQl\nRrceTZA1CIfi4J2N7xgSPqX8SzGu7TgujbrEhHYTKOVXCg2N4RuHGyrQ4m/x5/2W75PwXgLTu0yn\nUlAlAEZtGmUo3NQkmujfuD9xw+P4q9dfHov96O2jcyzWBUAQBDrX7Mz+gfsJ7xfu8bqMjxzPlbQr\nhfIBHiv/GOH9wtn31j7PpmlWzCzib8UXwtRRLbQa87vP5+Twk/Su3xuAVfGr2HPJWKhgmF8YkztO\n5tzIc7z96NtIgkTU5ShWn1ptiO9r9uWjJz8i4b0ERrceja/Jl3N3zzHn8BxDfFEQea3Ra5wecZop\nHadQwrcEd2x3+HHfj4b4AO2rt+fQ24dY1HMRlYMrY1fsfBfxnWF+ozKN2PzaZja9uomGpRsC3Pej\nWhAqBlVkQY8FRA+O9my8jXpdAYKsQUxoP4H4d+I9uZ3f7f7OsHAyS2ZGNh/J2ZFnGfb4MERBLJLX\nVRAEXqr/EvHvxPPN09/gY/JhzuE5RSpW1qpyK2IGxzC9y3RCfEJYGbfS8BoGPWx906ubWNF7BRUC\nKxBxKYK9iXsLJ7pQyr8Uf/b4k52v76RuybqcvHXSK/y1MPiZ/ZjQfgKHhxymeYXmXE67zPKTyw3z\nJVHi3ebvcnL4STrW6EhydrLnh94IBEGgT4M+nuc4y5nF/CPGDGhuPFvtWY4PO86bTd7EqTr588if\nReI3LtuYmMExDH98OIqmGDaeuFEttBqRb0UyqvkoVE1l6YmlReKXCSjDtv7beK/5eyiawtrTa/Ns\no5OfAA3xCWFjv40MeWwIdsXJ7nu8pgV5YUD3Pm94ZQO96/fmju0OJ2+eLNL8LZIva15eTasqLYm/\nFY9dyS5QLN+LAEsAq15eReWQilxMzamQLurxuPfN3WqWsJhEjzAp4RPGwp6LMEmC5/fLXcHX5pTR\nXHmxqqtgk7tgkfva1ipRi49b6XniZsE7v9nXImExiwRaLVhMImZJcvU3FciwO7E7FXrW6UHdUnUI\n8w3B3xzode5uISGKAr5mCU3TvDyBTlWld4NeIAg8VeUpl2DX+5jmvm+qqmE15QgvRVXJcjiRRBON\nKtQHUWHgYwP0lj25e7lquCor5xQZEkUBFbCYRMoFlQDJSfuaz/Js1fYuln6dJFH0KoYliXqrHqvJ\nRLYsoygaydkpINiY03MGdUrWwKl695h1e7zdXmi3wUAUdSMHgkatsNpsfm2rlwApzHCz/nS4K7pb\n480mrxP+ykZCrCWRFTVfQ497TidvnyDi/F5QJfxNPoxvP5GNfTdRLahWoYaiDEeGl4G9SnAVFvZY\nyKG3D1GzRM2CljmapjFkwxBsck5kWuMy/x973x0fRbm9/8zM7qbQBQQFQUAFLAiCAiqooFyveAV7\nr6gI4kW/3OtVVAxIE6RHBOlNivSOgdAJJZQAgYQkpJBCerJ92nt+f8zusps6s/i73nvd5/PZD+xk\nnnnrzsx5z3mfcy+GdBuCR299tEYuAIzeNzowyohTUegswo5LO0GeeV2dMNrWS1srbYe6Yr2Cj7d/\nXGtmjNSSVDy14ik45GsLkiqpWJKwpFZRR7tkR/9f+vt0FLwgIjSOqNpD6n/OiN9GBGynALTtdh/c\n90GtHsp1F9ah37J+vu1QAGDmzYh+Khrv3/d+lQanF0lFSegxv0elrScf3/8x1r64Fr1b965WS8Em\n2vDCmhcwal+g5kirBq1wfuh5jOs7LhQOHAyI6D/207VrV/pvQ5mrjL4/9D01/6E5rTy30jDfITlo\n5tGZ1HJqS5p9fLZhvqiINP/kfGo3ox2N3T/WMF9RFVp5biXd+eOd9NnOzwzzGWO0NXkrdZ3bld5c\n/6ZhPhHR/oz91HtRb3pqxVNB8U/lnqL+K/rT/T/fTypTDfMvFV2iV9e+Su1ntSdJkQzzc6259NGW\nj6jFlBZkdVsN80tdpfRFzBfUZFITyrPlGea7ZBdNOjSJGn/fmJKLkg3zFVWheSfnUfMfmlPclTjD\nfMYYrb+wntrNaEebkjYZ5hNpc6DLnC70c/zPQfETribQY4sfo3EHxgXFTy9Np+dXP0+f7vg0KH6B\nvYDe3/Q+vbPxnaD4VreV/rHrHzRw1cCg+KIi0rgD46jfsn5B8RVVoehj0dR7UW9ijBnmM8ZoyZkl\n9OCCB4P6DRIRrTm/hnrM7xE0f1PSJuo5v2fQ/M1Jm6nXwl5BtZ+IaMPFDfTE0ieC4hIRLUtYRs+v\nfp6cokKirFb6OEWlWi5jjCYdnEqDN30cwHGJCrml6nleKKpCg7cMpplHZxqqs7euxfYy6jHvITqc\nebTWulaEW1IoLvMMtZzcjqxOiWwumcodEpXZxSrrrqqM3JJCTk/bVJXR5MOTA357TrdMZXaRyhwS\nWZ0SuUTF1xduSfu/t4/KHA5qN+1e2pG819dnTlEmVWXkFBWyOiUqd2j18n5KbCKV2kUSZZUWn1pO\n983pTmUOUau3Qwq4hrfOTlH2lesSFSq2ucnmclOzibfQr+e2+tqdX+akUrvoq7f3Ot52F9vclF/u\npBKbSMO2jKBHFvYll6hQuUMMaJfVKQVcx+qUqMQmUrlDJFVlFJMWQ/y3FjqefYasTq3eZXaRiqwu\nKnNofae1R6SichdlFlkpp8RBlwtslFpYSPiyMQ3dNMJXXqldDGhfmUOkvFIn5Zc5yemWye6Sfee2\nmX47tZvRnjJKr1SaK97x8V4jv9xFuSUOulrqILtLpkcX9CfT141o8sGfqMiq9UV+mdYftc37t9d+\nQBhZnx5d8DSdzkmhUptIV8scVGJ11/q7Gb1vNCEK1HRSU5pxdAa5ZbfuOb7o9CJCFAhRoKd/eZpi\nL8fqvs/subyHuCiOEAW6ecrN9K+Yf1FiQWKVv4OKSCxIpHrj6xGiQPxonh5d/ChNi5tGl0su11ru\nVdtVajujra/eN06+kV5Z+wrNOzmvVr5DctCjix/1cfnRPN370700eMtgWnR6EaUWp1bLVZlKH27+\n0MdFFKjRxEb06OJH6e/b/06/nP2lxr6LPhbt6y9EgYTRAt028zZ6asVTNGLXCCp1lVbLjUmLoQYT\nGgSUfcP3N1CXOV1owMoBdCjzULXclOIUuvPHOwO44WPDqc30NtRzfk8avW900M+W/0UAiCedtiFH\nBiS7/93o1q0bxcfH/9HVCApuxY2YtJiA0A0jkFQJ2y5twzPtnwkqfEBhCrYkb0H/O/rrVuj1ByOG\nzcmb8UTbJ1DHUscwn4iwLWUbHrzlQd0KvxX5e9L34M6mdwbsvTOCuCtxaFqnaa2rn9Uh4WoCeI7H\nPc3uCYqfUpyCMncZ7m9xf+0nV4Ecaw4yyjLwUKuHguIXO4txruCcrhXcqmCX7DiWfQx92/YNii8q\nIg5mHfR50Y1CZSr2ZewLunwiwoHMAzWuiNaGuCtxeKDFA0GH8JzKO4V7brxHtzptRVwovIA2Ddvo\nEvqoCpdLL6NpZFNde6aqQo41B3UsdWrcs1QT8u35MAvmoO4BgKY8KfDCH8bPs+Uh0hxZo0JlTcgo\ny0CzOs2CHr8LhRfQpsHt4BCYF9IbXhpmrn5eMkY4nn0KnZt3DhCnqS03pxdEhGM5x9CjZQ/d9RVl\nzTPG8xxsohXJxZdwX/Outda1Yr1dkoI96ftw302dUd/SECrTcmN606PoqfviM4t9Ai8uSfUpAvur\n9BIR6oaZILNrXm3GCPsy96OOORLdbr4/QElXlFU4JTXAk+UdC5WRpj4MFd8d+A7f9o7S+gOat9Z7\nDX+ev1qwdh0O/9r9OT5/cCTqWbR9hirTlHHNggCTwFW6jn/b1iSuARHh5btf1oSTePjapSgMbkVB\nuMkEk4mvNB9O553GnPi5mP6X6IC+UJkmwCQqDByujaNDlOGSFbhlhlIxH0O2D0Ls27sQbg7Tru1x\nbxMDRFULueV5DhZeAHEEYpqyr10pR48FPbH7zRjcXLelp628r29EWYVF4CF60tfwHOfLNct4Bx6Z\n9xhm9J+F3q0fBoOmkFwnzAyzwAfMOZURIizXvhc4CtF55oMY+chIvNbpNWh6XQTFI4TVIDLwvcmf\nX+AoQOc5nfFh1w8xomf1IaZVId+ej27zuuGZO57B8B7DA7Zp1YYCRwEeXPAgerTsgbfufQt92/TV\n/WwqcZWgz5I+aHdDOwxoPwD9b+9f7V7QirCJNgxYNQD1wuqhz6190LdtX9zV9C5dz1W34saHWz6E\nTbKhR4se6NGyB7re3FXXPmBvXu+E/AR0urET7m1+Lzo164QW9VroKntX6i6su7gOdzS+A+0bt8cd\nje9Am0ZtdL0TZ5VnYf6p+bi53s1o1aAVWjdojVYNWukaa1mV8cu5XxBmCsNNdW9C87rN0bxuc9QP\nqx/0u8j/OjiOO0lE3Wo/EyHDNYQQQgghhBD+U+G/t9CoAVpVKhW9Sr//7rpWuo4nNytQeY+iHhCR\n7yXRa1AD14SRGBEkVcunGubtF7+ULwxqpZRcjGkqv/Ao+fqnNOI8KkQcOLhVF8KFiFrb7j8+IC0s\nt0wqQePwJtreStKMYf+2V2fw8jyHXFsu6pobQODCIHBApMXkE1fiOWihxX7f/eeDdz9208gbq5wz\nFcdWURgkVYXA8bhiy4EgMLRpeGvAmAOA3S3DISogEEy8Znzz4EDQDP5sewbCTRa0rNfK15cyYyCm\n7ct1SAokRYGFF2A2CVAY8+0RvlB0AY0jG6JFXU3UzCTwsIsyQIQmdSN8odJVLfTEZZ1AHVMTtKh3\ns5buB5oAl6go4DkeN9S9Fj5akX8y9yRuaXBLjXsqq8PZ/LNoWb9lUItpKcUpaFa3me5Ub/7IteWi\nUXijoBbRrKIVkeZI3Snq/KEyFTzHhwy2EGpEyHANIYQQQgghhP8R/LsN0OvB71nX3+taisK0fage\nj53Aa167cJMJPMeBiGAx87oMbO+1iDiYBA4Cp+Vk9Rpqeg3uqox8r3ezYs7U2jiAZjDLnpyuXrVk\nb71+r7miKAxOSYHKtH2ukZZr3lt/A1yrkNYGSWZwygpMPA+e43zqzALHw2LiYRK4gPGVVQZVJZ8X\nnBGhwOaCqKhoUjfc5xENMwlweXLsmjgONlFCmMmkqTarKsJNAkw871GPJtQNMwfs+XVJmrCUy6OO\nDK/glsoQGWZCpMV8XYsvIYQQgn4YMVyNL5+EEEIIIYQQQgj/NvA8h7D/EsXJ36uu/kaa4OfxC8Z7\nKzMGiyBAVjV9W6ckI9JihskT8qsy+ISUaqu7ycSjPm+p1iupKRYLAV7KqupclegWwAd49rye56q8\nq15jUVEJHDxhuR5j2r8+etpkqB9N19omMwYouJYyh66JOXnPccpygKgWz3FQGEEhFZE+gSu/cjzX\n8wpBKYyhjsUEVWVwiApMPGDxbL3gOQJAUBghwmJCuNkExjyKxUyFwgiRFhMETvPi8syvvzlAAAcG\nAjFvvRgEHqhrMYM84d88B08+3pDRGkII/wkIGa4hhBBCCCGEEMJ/FKoy7BiDLkPM3wMoK1o4sMnE\nI5wEn0PQ+6+/2m/FNDXVeXurM86N1Jl5VGv94V+Hqgx3l6wi0mIK+JvZpHkpiQiRlkADq2Kb9KC6\ndldsGwC4RRXlqoQIswlhZgGiqqXNibDwvvJNvACZqVAYg4nXjhNIy43LCC5JDSiH5wCFaYq4kqeN\nFpOAehFmMOZVYFavhSN78tNGWsw+7ygvcIgUzFreXr9FAO84eFMI2SUZPDgIJl5TERYERJpMIAN7\nskMIIYR/L0KGawghhBBCCCGE8Lvg9wrvrc2wq6l8f4PPTQB5vG1mgYeoaIaSyq6lDbEIQkDey2C9\nvUbq7PWgVgwF9n6tyggWPAJR3pRIXq+myZMuR5RVRISZqrxedX3lP1YCx/lCdCu2279t3uMqCDyv\n7V8UFdVzDh9gqFtMPDgFEIRrAk8COHACArzHLknxhBIDkqKAmAAGwFv9SIsZCtOO8IxHuEnb88pz\nWrtVRjAJHCyCFkKsqKqvn71z0DvmoqKC86TzUYlpHluzADPPQyWCU9S4Vc3d/6aw/RBC+F9EKI9r\nCCGE8LvhevfMXy+fkb58kdVBT+7k2vjXew09+ZdrgkNy1H5SDSh3l9d+Ug0odhZfFz/Plndd/Cvl\nV66Ln2/Pv6556JSdf/gYSqp0Xfxgf0deo4AxqjEHph54DbuK16/NRqho8Jk89ZBV5svfKXAcGGle\nSu/eVP+8l0Zy5wZbZ7NwLZ+q9zz/OjC//LJeaAakpnzrv//SLPC+v1V3vYqoKj+qXZS1sNkq2u1t\nG2Pk2y/sllTwfud599v6d4HAceA9e20bRlpQL9wMQeC0/cV+7ZMUBkllMJt41DGb4ZZlOERJy78L\nAgegfrgF9cPNaFwvDA3rhqFOuAkRYSbUj7Qg3ML72irKClRiCDMJvjmo+ZSo/wAAIABJREFUKFob\n/MfWa+hGmjVjX/YIP5mEqudubTllQwghhP//CBmu14n43HioTIWsyjiec9wwP7Eg0feScijrkGF+\ntjXb96K3P2O/Yb5DcuBi4UUAQGx6rGE+I4bTeacBALsv7w7qhe9U3ilf+cG88J25egaMGI5mH0WB\no8Aw/2LhRbgVN5KLknG+4Lxhfo41B4WOQpS4SrAzdadhvkNyILUkFQpTsOLsCsN8RsxX759P/myY\nDwDn8s8BAGYemxkU/3zBeRARpsRNCcpwu1R8CZIqYUrcFNhEm2F+ri0Xpa5SzImfU2si9KrgkBzI\nKMvA6sTVOHLliGE+I4bkomTsy9iHVedXGeYDWqLzc/nnMOXIlKD4yUXJyLHm4P92/V9Q/LSSNJS6\nSvHmhjeD4l+1X0WxsxgDVw8Mag44ZSdyrDkYuHpgUHOAEUNGWQbe2PBGUHMA0FIgjNo7CnHZcUHx\nc6w5WHBqATYmbQyKn2/Px/6M/Yg+Hh0Uv9xdjivlV/BN7DdB8RWmoNxdjpF7RgbFlxQVTtmJmSem\nA9Bv8PlDVESsSVwDnqMaDbvqIKsqLpelId9xFYBmIHIcoKjXnk3hFgFN6oYj3CKAoIkZeb2pRAS3\nIiHHHrgAwnu8mjXB3xh1SPYa6+w1or2pdPzrAACcX9v9EW4WIPAeA6wCJ9xc/fW88O6btbpkSMq1\ncVFIE5xSKzzDve02CzxUxuCSFDCmGaTEERSmhQdfKk2GwHFQmOqLw2aMwPFA3TAzOA6QFQZJUaF6\nFIP9DeHNSTuRby+CXXLAZOIRZjYhTNDSCBEB4ALngLcdLkmFrDKcKzwDgJBrK0CYSUCYIPjqTwRI\nqpbGyH9BQOA4iIoCt6wit7wIqkrIsWfDO1ySwmB1ydo+Y4+n1d/TLasMbpnB7paheub4lfIr17X4\nV+oqRUpxStB8p+zE0eyjQfNlVcau1F1B8xkxrLuwLujFLyLC+ovrg+5DIsKey3uQVJQUFB8AjmUf\nw76MfUHzz+Wfw9oLa4PmpxSnYG783KD5//PQm/D1j/h07do1yFS2/x7EXYkjy3cWevqXp2l32m7q\nEN2BXLJLNz+zLJNunHwjdZ3bleJz4qnppKZU5CjSzbeJNrpn9j3UalorOpl7khpNbESXii7p5jPG\nqP+K/lR/Qn2KvRxLraa1ov0Z+3XziYhG7BpBpjEmWpawjHrO70nLEpYZ4s87OY8QBRqzbwy9sOYF\n+m7/d4b4sZdjyTzGTG9veJuGbRtGgzYNMsS/VHSJGn/fmPos6UOjYkdRnyV9DCWFLnGWUIfoDtQx\nuiNNOjSJ2s9qT5Ii6ebLqkyPL32cmk5qStPjptMN399AJc4SQ20YunUohY8Np+lx08k0xmRoDhAR\nzTo2i7gojiYcnEDCaIH2pe8zxN9+aTuZxpjo0x2fUoMJDWjx6cWG+Ofyz1GjiY3o2VXPUutprSlq\nb5Qhfr49n26beRt1+7kb3fvTvfTOxncM8d2ym3ot7EW3TL2Fes7vSY8uftRwYvB3Nr5D9cbXo14L\ne9HtM28nWZUN8ScdmkTCaIEeWvAQNZrYiMpcZYb46y6sI9MYE3Wd25VMY0yUXppuiH8i5wQ1mNCA\nOkZ3JESB4q7EGeJnlWXRrdNvpdbTWhOiQGvOrzHEt4t26jG/B904+UZCFGjqkamG+IwxenHNi9Rw\nYkNCFOgfu/5R7bmqysgtKeQUFXJLCqmqNtajYkdRxNgICvsujF5b95qh8omIlpxZQpbvLHTD9zdQ\nnyV9DPP3pu+l+hPqU7PJzeiuH+8yPAeTCpOo1bRW1HJqS2o2uRkpqmKIX+wspi5zulCb6W0oYmwE\nOSWnIb6sytRvSX9qP+suwrcmyrXmkyirJMoqOUV9dRmydQh1jO5IdcbVoeSi5GrHqjpMODiBbpvR\nkdpN70h7Lx/wle9wyVTuEKu9jspUYozR4tOLqc30NvTU8mdo2ZnVPr4oq+TycKsCY4zSStJoS/IW\n6jDrTvq/HZ/ThAM/6KqzFztTdtK2S9vo/p/vpxlHZ9C4/ePJKcrkEhVf+U5RJlVlpKrM9zeXqFCZ\nXaQph36ihadW0AM/d6cVZ1fQwlMLK5XhzytzSFTukKjMIZJLVOiLmK/pu72TqMPMbrT8zCo6mZNA\ndrc7oN1Ot0xlDpHyy12UX+ak/DInZRbZKKfETsO3fkGvrXmPbp7UmmYcmV2pr71lO1wyFVpdlFfq\npLwyBxWVuyi/3EXvrv2YHprXjxqNu4m++u07T90kcokKWZ0SldhEKneIldrv7Zs+i/9CP8fPoxsm\n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\nonoFAJd8/RJuOOaGTrcNdYEzDz6zzeu35zhqsOq589M7o+P2Ltmb2eWz0TUiQzfMbgj7P5yTWTfF\nJW9fUpChUZut5Tef/SZyHof1zllbObNNTcOXPlWZGs7/+wXM2TxP7V1C6SCqnRonluMVzNe4qdOj\nKEadVcV5b13Bp8snqH3HV/vfj479CaP6fspZh5xKzDAoScbokYwTM/RovpXVrOWMN8/hlblvqH0z\nkB98sx+LfraYST+cxBkHno3t+dHYC593/raFnDTwJJ6a/jQ+HmgWOTfLGQedyXMXPMeau9cw4YbJ\nXPt/1zcb64EOM3fLLE547SR+99mjWK7Sm6sz1fSI78ZNx/bjne+9zdZfbOHzfp/zs+PvwMtb+6du\nnMJJA0/k3rG/pMFqiNquqlnFab1O43en/47xN4yn/oF6ptw0hcfOfgw9AN6bvGEy33n1O9z4wY2U\nN6lMGMuzGL92PD2TPbn2qGt5ts+zzP7JbBoeaGDyTZN58twn2b1o906Nwf8VETsDpAEghNCBMuBc\nYDMwB+grpVyWd0w/oLeU8o7OnLt3795y7tzOe83+VWJ7Nu8vf5+KVAUV6Qoq05XNv1MVNNlNPNvn\nWbUQtyGe7zF61WjKG8vZltrG1tTWgt/1uXr6X9Cffsf2a7O9lJIJ6yawsWEjW5q2UN5YzpZU8Ltp\nC3W5Ovpf0J+ffKttP4GUkpmbZ7Kufh2bGjaxuXEzmxo3salR/V2XrePZPs9y2/G3tdsHiyoWsbp2\nNRsbNrKhfgMbGjaovxs2UJut5enznuauE+4qILDOlzW1ayirKWN9/XrW1a8r+F2TqeFP3/0T9518\nX7vttzZtpaymjDV1a1hbt7b5d+0aarI1PHLGIzx0xkPttq/P1bO6djWralap37XNv6sz1dx/yv38\n8Zw/oom2fTy2Z0fPsLJmJWU1ZdHflelK7jj+Dp7p80y0gLUUX/qUN5azrGo5SytWsrJmBWW1K1lZ\nuYqtTVXccGxfBlz8IklT8eeF9UP5qZ4Zt5GVNStYWrmUZVXLWFa9jGXbVrG5oYJLj7ySZ/v0J6HH\no4hlz6J4pCxrArJOjtV1q1T76mUsqVjK0qqlbGhcTZ9DL2bIlUMpiRWTtb0A7ENFOpOmQgOuSWep\nzm5ldd0KltcsZWXNYhZuW8766k2cdHBv3r/mPWKiSG1CQpCxHXJOgP4p1Xk21m9jbf1KyuqWsaJq\n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\nvgaxvapRbK9uFPvqAqKuMSSqGqT9qm4IifXbq8TnW/eINVv3iX+s/168/9UP4nfvvypWfrtbbNhR\nLfbVBaO2LLKvOn+42bWPlW212+Kuaay9C7i2p7Yh5J53QOyuDYjv9tSKLXvk+eypqxe7av1iX30w\nuq+IDaxtDMVdy9hr2xAw456NyE+s/f13yv73PmIzDyQH872LlVe+fuWgdXfXV4vJTxwu/KHwQV2/\nJz57Qhg3GR3yQSOydvc6UfzgUDHhj5PF2xtXiD11gaj/FPusvfb0J2LNb8pEUkKtyOtjiSf+bIs9\n9VVi1sJzxGF/OlwEQqZYvXO1qA5UC9t2RKBqgzCXnCacZxOE81yyEM/g/qhCvFYuTCskpj94j0iY\nfYJQFCF65znilj98KTbu/U7UNYZEwyfXRXVCb0wU1TW1YmdNo6hpCIlg2BJ/W/uyqPzb2dF76ziO\n2LB3g/hi5xdtrlerd64WF792cdx1cBxHfFv1bZt+8K6GXeLqxVc3s9OO44hN1ZvEGxvf6PA9+G8W\nYKVoZ2zY2Sr8T5BZi2ZRkVvBzCEzD2ou6IJXLqBfej/mlM/p8FwZwGVvXEa6L73dlYn95erFV2ML\nm0tGXdLhuQ6Am5fczM6GncwdPZf+Xft3WP/uD+7myz1fcnnF5ZRklXRY//erfs/iTYu5vOL/2Dvv\nOEuqMu9/zzlVdUOniUzoCTAESZKGnAdBBQUDKuiCuCjmXXFF95UMwrqm3WXNrK6+Kq+KccWAggQF\nFQGJEgYYZgZmhomd771VdcL7x6mqvt3TPR0GVkb7+Xz6M9O376lcT35+v3/ikPmHjgr8kdPu5IBD\nvutL8JvVt/Kle77Ah48+n8PnHw2IUVvZgK3a3Vb3rOJdN7ybdy79R16+5GVI4alw/DqfqctRJEMp\nqSUa4wa5qGLT4KwfnsU5B72VM/Z97ZCW2Dj1nHmmCQFP5ajDzp+fc47zbjiPE3Y+gdfv9XqkCDPU\nY3/ujdQDeFSiYAj3a/M5ffTmC+lsXcxb9nsLrVHLNtuq6onZqmpy7b1fpq5j3rn07yf1DP9s+c94\ncP2DnLf0vAnNluby0PqH+P4j3+fdB797UsAaW+pb+OSdn+Q9B7+HxdMWT3i9dZbLb7ucs/Y7a9S2\n+rHks3d9lmW7LBuzy2I0+c7D32H3GbuPu71suPx6xa8pB2WOXHjkuGeLm+XhDQ+zYWDDuCrsI8mG\n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\nuCxw+33hIPejR25wtUbqGokuvmOMdbU4dfVYuzg1rh5rV4tTZ4x1zjm3unu1k1dIt8dn93Dffujb\nzlgz7n13D8Tu2a5NbtpVnW7Bv+7pPn7Lte6RNRvdM5v7XN9A4vrrias1UleLtWskuthn83F1DfS7\n/b9wmJv1Lwvc5Td/xj29abPb1Ntwa7YMuNWb+tzqTX1uXdeA29BTc5t7G663lriBeuo299XdQD11\nfY26e+N33+Lar57pLr7pCre+d7Orx9pt6W+457pr7rnumnt2S79bs6XfrdvS73oH/DH11xLX1R+7\nTb01939+eYmrfKzqPvyrD7uNAxu3Otdadu2G//TXU7elr+G++IevufCyNvfO/3mvW7FllYtT47r6\nYzdQT133QOx6BhLXV09dV3/suvobLk3NkHty24o7nLys5M76wdnuic1PTOgZcM659f3rnbxcudd+\n+3R397MPbHWtxxJttJv9ydnu5d98ubvr2bsmvH9rrTviK0e4o756lLtlxS2TWn/Oj85xB37pQPez\n5T9z1o7/2HO56var3J6f29Nd//D1436Gm+X6h693O//Hzu7r933daaPHXjBM7lt3n5v/mfnuS3d/\nySU6mfD6nkaPm/vpue7ffvdvrp7WJ7zeWuv2/cK+7urfXO364/4Jr3fOuVP/36nuklsucT2Nnkmt\nP/8X57sLfnmB21LbMu41zfrpmt9/zr37J+93z3Q/N6HnN5dfPvlL9/b/efuE7UguK7tWur/7wd+5\ntb1rJ7U+SVP3lu+91T2xaeWE38FcLrz5Qreqe9VWnzcSXeiLODWueyBxG3rqbmNv3fXV0+Lnmt9d\n65ZvXDHu/RljXSPRhY7++fJfuBVbVoz4t/x8RtOHtVi7RzY84p7c/GSxvlnPDdRTt7Gn5tZs6XfP\nbu53Dz27yf3+iefcA6s3ubtXbHA3P7za/frRp9xNj9/v1nXV3FMbetzTG3pdd3/sntnc5x5+drN7\n8JlNbvm6brd6U797ZO0W9+Rz3W5d14B7fF2Xe2Zzv1u1sc/d9sSjbvnaLW715j730OrNbtWmPrex\np17o4XVdNbd8Xbd7ekOvW76u2z3xXI97ZM0W99ha///fLn/aPbJmi3tqfY9bubHXrd7c7x5b1+We\nfK7b9QwkrmcgcVv6GoV9q8f+3vTWEtc9kLgt/XVXa3gbu6Gn5tZ11dym3kax9umNPW75ui63oafu\n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\nPcglBRpTBb/1rVs479nzuGW/WxJN3LbWWTvPL176BasKq1jetJyNe21ctTobNUO3svgav7LkFV79\n7FV+tufPuvQZba13pjcazZH3HcnrJ77eYcK/6ncSFvuP3Z8bXruBHW7ZgVv2v4XDNzu88zEV83D+\nLhfwzPwd+WjtXI649yC+N+U0Lp52KY5ldQk5/uXev+QvC17i47XzWFVYzQ2v3Yhnpzhrx7NAmXUj\nDpAzro0vTSXSsSwunHo+y4qLuH/uQ4AGu8yixveZNmoWA3MDE2SZEJDz3ATJ4TkW5+xyNpmUy4//\nfAFm46FIuy47j9iFrJtFKwDzfCgg5ZrEjh+G/N+k4xiSG8ZZT5yBTwMISaPfyBH3HsGp253KMZOO\nIWWnk/M20ksWwtZ8a+uT2bz/5hx334msaF4LVsDaYBnTfrcLWwzakhO3Opavjj+UvFebVOXB3CPH\nTj6eHUfswOH3HM7c5R8AsLa8nnOfPY+dP/ohZOE6fxMODtaSd3uZ+8qrRez2BDwxhWJRctBbm3Po\nmNfIWUCYgfH3s5r7GfaLFFNH7chB4w9i/7H7tyo47T16b+Z+ay5nP3M217x6DRrNmD5j+HTdp/zy\n5V/yy5d/SdbNsvvI3ZmxyQz2Hr13hwWj/3XrCVz/AVtXWsegnw9C6daU8b0zvbl46sWcsOUJnVZa\ntNZseu2mLG5Y3Or1OOA7bfvTOt2sAux71778ffHfW70WB3xn73Q2+VS+0/GnP3k6T89/utVrAsE3\nt/omF069kL7Zvp2Ov+n1m6oGvUdufiSX7345Q2uHdjr+hU9f4NY3b233+szRM7li+hWM7jMaINGl\naxv4rGhewQ2zr2+BfkQB53bDt+WqGb9g0oBJyXurQcK01tzy5i1mnOUbsWzlsunAzTh3hx+z9dAp\nZB2zOYg/P+5RjY9119zfmYBRpgEBlmJkr024fPfLmLHJdGxbVM06Iwxr40PvP4hCmqylkKBchtYN\nZNbOl7HP2P2iYFUnDMWebbX03FqCV5Y+z/pwFdh2JPYNfVP9OHvXs/j65KPJpU3AlMfDl6bCUY7u\nWY3mozUf8GnDx5iygQChyXtZTtn+DI6ZeCz9cjXJHFYjm1hfWs8rn73S6rW0k+asHc/i+1/5Phk3\nk2SWO+qX+sunf2k13rEcTtn2FM7d5VxqU7XVbp1W9vJnL7ee2ugevmjqRfTJdk2eMGf5nHavHT3x\n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\nqmqhadtnB+eHjUlurarPt9buO9a1AlPh75Nc31p7sqp+Lt3V+B+ecE3A5P1Lus8L/1tVFyf523S3\nka9agusRtNZeeQx+xsODx11VdWO624UE1yl0DPrh4STD36B/x2AfU+ho/VBVj1TV81trXxnc3rVr\ngZ8xf374clXdluTcJILryjDK+33+mIeqam2Sk5P893jKY8wW7YfW2vC//TVJ3j2Guugnnxc4pLW2\nZ2j7I1X1J1W1vrX26CTrmiS3Ci+Dqjqpqr51fjvJj6abxIfV6c4kZ1fVd1bV8UkuT2Im2ZVpe5I3\nDLbfkOSwK/JVdUpVnTDYXp/kFUm+OLYKWW6jvN+H++S1SW5tFlVfqRbth2eMYbwkyc4x1ke/bE/y\n+sHswi9P8vjQ8BNWmap63vz8B1V1Xrrctqq/5HTFdYmq6seS/HGS05LcVFV3tdZeVVXfnuSa1trF\n6ca13TjotbVJrmut3Tyxolk2o/RDa+1AVf1ikn9IsibJ+1trd0+wbJbPu5L8VVW9KckDSX4ySQZL\nJf18a+3NSV6U5L1VdTDdf0Lvaq0JrivEQu/3qnpHkh2tte1J/jzJB6vq3nQTc1w+uYpZTiP2wy9V\n1SVJDqTrhzdOrGCWVVVdn+T8JOur6qEkv5XkuCRprf1Zko8kuTjJvUn2JvmZyVTKOIzQD69N8gtV\ndSDJE0kuX+1fctYq//sDAADQc24VBgAAoNcEVwAAAHpNcAUAAKDXBFcAAAB6TXAFAACg1wRXAAAA\nek1wBQAAoNcEVwAAAHrt/wHWKny2f7DotQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "vZrW00brG6TX" + }, + "source": [ + "### Sliced Score Matching\n", + "\n", + "Now the problem with our previous loss function is that the computation of $tr(\\mathbf{J}_x [\\space model(x)])$ takes a $O(N^2 + N)$ time to compute, thus not being suitable for high-dimentional problems. The solution is using jacobian vector products which can be easily computed using forward mode auto-differentiation. This method is called Sliced Score Matching and was proposed by [Yang Song et al. (2019)](https://arxiv.org/abs/1905.07088).\n", + "\n", + "Our new objective looks like this:\n", + "\n", + "$$E_{\\mathbf{v} \\sim \\mathcal{N}(0, 1)} E_{x \\sim p(x)} [ \\mathbf{v}^T \\mathbf{J}_x[model(x)] \\mathbf{v} + \\frac{1}{2} (\\mathbf{v}^T model(x))^2 ]$$\n", + "\n", + "Jacobian Vector products, by the way, can be easily computed using `jax.jvp`." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "MkAXz0SmG6TY", + "colab": {} + }, + "source": [ + "@jax.jit\n", + "def compute_ssm_loss(net_params, inputs, key):\n", + " apply = jax.jit(partial(net_apply, net_params))\n", + " batch_dot = partial(np.einsum, 'bu,bu->b')\n", + " \n", + " # generate random vectors from N(0, I)\n", + " v = jax.random.normal(key, shape=inputs.shape)\n", + "\n", + " # predict score and comput jacobian of score times v\n", + " score, jac_v = jax.jvp(apply, [inputs], [v])\n", + " \n", + " return np.mean(batch_dot(v, jac_v) + 1/2 * batch_dot(v, score) ** 2)\n", + "\n", + "@jax.jit\n", + "def train_step(step_i, opt_state, batch, key):\n", + " # the new compute_loss is random key dependent, thus we need a new train_step function\n", + " net_params = get_params(opt_state)\n", + " loss = compute_ssm_loss(net_params, batch, key)\n", + " grads = jax.grad(compute_ssm_loss, argnums=0)(net_params, batch, key)\n", + " return loss, opt_update(step_i, grads, opt_state)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GWaKgphWCwoi", + "colab_type": "text" + }, + "source": [ + "__Note:__ we compute Jacobian with `jax.jacfwd` (forward-mode differentiation) because the input dimension of the network is just 2. You can read more about autograd modes in jax [documentation](https://jax.readthedocs.io/en/latest/jax.html?highlight=jacfwd#jax.jacfwd) and on wikipedia [wiki](https://en.wikipedia.org/wiki/Automatic_differentiation)" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "8dxK2pCxG6Tb", + "colab": {} + }, + "source": [ + "key = jax.random.PRNGKey(42)\n", + "key, subkey = jax.random.split(key)\n", + "out_shape, net_params = net_init(subkey, input_shape=(-1, 2))\n", + "opt_state = opt_init(net_params)\n", + "\n", + "loss_history = []" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "hQyo8kvTG6Tc", + "outputId": "184f28fc-4c6d-418a-9c28-e248b8633fbe", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 499 + } + }, + "source": [ + "for i in range(2_000):\n", + " x = sample_batch(size=128)\n", + " \n", + " key, subkey = jax.random.split(key)\n", + " loss, opt_state = train_step(i, opt_state, x, subkey)\n", + " loss_history.append(loss.item())\n", + " \n", + " if i % 200 == 0:\n", + " clear_output(True)\n", + " plt.figure(figsize=[16, 8])\n", + " plt.subplot(1, 2, 1)\n", + " plt.title(\"mean loss = %.3f\" % np.mean(np.array(loss_history[-32:])))\n", + " plt.scatter(np.arange(len(loss_history)), loss_history)\n", + " plt.grid()\n", + " \n", + " plt.subplot(1, 2, 2)\n", + " net_params = get_params(opt_state)\n", + " xx = np.stack(np.meshgrid(np.linspace(-1.5, 2.0, 50), np.linspace(-1.5, 2.0, 50)), axis=-1).reshape(-1, 2)\n", + " scores = net_apply(net_params, xx)\n", + " scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", + " scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", + "\n", + " plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", + " plt.xlim(-1.5, 2.0)\n", + " plt.ylim(-1.5, 2.0)\n", + " plt.show()" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\nrgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "A8Ni7_cGG6Tf" + }, + "source": [ + "## Easy? Let's go deeper!\n", + "MNIST 8x8, computing full jacobian would require 64 passes through the network" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "Y2ZgeMq-G6Tf", + "outputId": "435e69a1-3544-4364-b30c-c066feda7064", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 109 + } + }, + "source": [ + "from sklearn.datasets import load_digits\n", + "import numpy as old_np\n", + "\n", + "X, _ = load_digits(return_X_y=True)\n", + "\n", + "for i in range(5):\n", + " plt.subplot(1, 5, i + 1)\n", + " plt.imshow(X[i].reshape(8, 8), cmap='gray')\n", + " \n", + "\n", + "def sample_batch(size, noise=0.1):\n", + " ix = old_np.random.randint(0, len(X), size=size)\n", + " return np.array(X[ix] / 16 + noise * old_np.random.randn(size, 64))" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\nAGSGxg0Amfkfpfx5uQIv+fwAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "rKSjSWQXG6Th", + "colab": {} + }, + "source": [ + "# Set up network to predict scores\n", + "net_init, net_apply = stax.serial(\n", + " stax.Dense(128), stax.Softplus,\n", + " stax.Dense(128), stax.Softplus,\n", + " stax.Dense(64),\n", + ")\n", + "\n", + "# Create optimizer. Note that both network and optimizer returns pure (stateless) functions\n", + "opt_init, opt_update, get_params = optimizers.adam(1e-3)\n", + "\n", + "key = jax.random.PRNGKey(seed=42)\n", + "key, subkey = jax.random.split(key)\n", + "out_shape, net_params = net_init(subkey, input_shape=(-1, 64))\n", + "opt_state = opt_init(net_params)\n", + "\n", + "loss_history = []" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "YxWvSQJAG6Ti", + "outputId": "ae47197d-0aa3-496c-83f6-d10328461a00", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 281 + } + }, + "source": [ + "for i in range(5_000):\n", + " x = sample_batch(size=128)\n", + " key, subkey = jax.random.split(key)\n", + " loss, opt_state = train_step(i, opt_state, x, subkey)\n", + " loss_history.append(loss.item())\n", + " \n", + " if i % 500 == 0:\n", + " clear_output(True)\n", + " plt.title(\"mean loss = %.3f\" % np.mean(np.array(loss_history[-32:])))\n", + " plt.scatter(np.arange(len(loss_history)), loss_history)\n", + " plt.show()" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\nlBkAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "gof2XcxwG6Tk", + "outputId": "02472a07-4931-4444-d406-344907619a01", + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 281 + } + }, + "source": [ + "key, subkey = jax.random.split(key)\n", + "x = 0.1 * jax.random.uniform(subkey, shape=(64,))\n", + "\n", + "xx = sample_langevin(x, net_params=get_params(opt_state), key=key,\n", + " eps=0.05, eps_decay=0.98, num_steps=50,\n", + " temperature=0.02) # set low temperature to compensate for noise in training data\n", + "\n", + "for t, x_t in enumerate(xx):\n", + " clear_output(True)\n", + " plt.imshow(x_t.reshape(8, 8), cmap='gray')\n", + " plt.title('step %i' % t); plt.colorbar(); plt.show()" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "jMfcQxhWG6Tm" + }, + "source": [ + "### This is just the beginning\n", + "\n", + "In their paper, [Song et al. (2019)](https://arxiv.org/abs/1907.05600) propose a more sophisticated sampling procedure that can efficiently sample larger images. They also utilize a technique called _Denoising Score Matching_ which can be safely ported even to earthling frameworks like tensorflow and pytorch. Go take a look!\n", + "\n", + "![celeba](https://media.giphy.com/media/jp3MBYHawJi62YoTNI/giphy.gif)\n", + "\n", + "Notebook author: [Denis Mazur](https://github.com/deniskamazur), edited by [Just Heuristic](https://github.com/justheuristic)" + ] + } + ] +} \ No newline at end of file diff --git a/docs/notebooks/vmapped_log_probs.ipynb b/docs/notebooks/vmapped_log_probs.ipynb new file mode 100644 index 000000000000..bd59fa9b2fbc --- /dev/null +++ b/docs/notebooks/vmapped_log_probs.ipynb @@ -0,0 +1,660 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "vmapped_log_probs.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "6umP1IKf4Dg6" + }, + "source": [ + "# Autobatching log-densities example\n", + "\n", + "This notebook demonstrates a simple Bayesian inference example where autobatching makes user code easier to write, easier to read, and less likely to include bugs.\n", + "\n", + "Inspired by a notebook by @davmre." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "8RZDkfbV3zdR", + "colab": {} + }, + "source": [ + "from __future__ import absolute_import\n", + "from __future__ import division\n", + "from __future__ import print_function\n", + "\n", + "import functools\n", + "import itertools\n", + "import re\n", + "import sys\n", + "import time\n", + "\n", + "from matplotlib.pyplot import *\n", + "\n", + "import jax\n", + "\n", + "from jax import lax\n", + "from jax import numpy as np\n", + "from jax import scipy\n", + "from jax import random\n", + "\n", + "import numpy as onp\n", + "import scipy as oscipy" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "p2VcZS1d34C6" + }, + "source": [ + "## Generate a fake binary classification dataset" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "pq41hMvn4c_i", + "colab": {} + }, + "source": [ + "onp.random.seed(10009)\n", + "\n", + "num_features = 10\n", + "num_points = 100\n", + "\n", + "true_beta = onp.random.randn(num_features).astype(np.float32)\n", + "all_x = onp.random.randn(num_points, num_features).astype(np.float32)\n", + "y = (onp.random.rand(num_points) < oscipy.special.expit(all_x.dot(true_beta))).astype(np.int32)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "O0nVumAw7IlT", + "outputId": "751a3290-a81b-4538-9183-16cd685fbaf9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 102 + } + }, + "source": [ + "y" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0,\n", + " 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,\n", + " 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,\n", + " 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1,\n", + " 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0], dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 11 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "DZRVvhpn5aB1" + }, + "source": [ + "## Write the log-joint function for the model\n", + "\n", + "We'll write a non-batched version, a manually batched version, and an autobatched version." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "C_mDXInL7nsP" + }, + "source": [ + "### Non-batched" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "ZHyL2sJh5ajG", + "colab": {} + }, + "source": [ + "def log_joint(beta):\n", + " result = 0.\n", + " # Note that no `axis` parameter is provided to `np.sum`.\n", + " result = result + np.sum(scipy.stats.norm.logpdf(beta, loc=0., scale=1.))\n", + " result = result + np.sum(-np.log(1 + np.exp(-(2*y-1) * np.dot(all_x, beta))))\n", + " return result" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "e51qW0ro6J7C", + "outputId": "2ec6bbbd-12ee-45bc-af76-5111c53e4d5a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "log_joint(onp.random.randn(num_features))" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(-213.23558, dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "fglQXK1Y6wnm", + "outputId": "2b934336-08ad-4776-9a58-aa575bf601eb", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "# This doesn't work, because we didn't write `log_prob()` to handle batching.\n", + "try:\n", + " batch_size = 10\n", + " batched_test_beta = onp.random.randn(batch_size, num_features)\n", + "\n", + " log_joint(onp.random.randn(batch_size, num_features))\n", + "except ValueError as e:\n", + " print(\"Caught expected exception \" + str(e))" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Caught expected exception Incompatible shapes for broadcasting: ((100, 10), (1, 100))\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_lQ8MnKq7sLU" + }, + "source": [ + "### Manually batched" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "2g5-4bQE7gRA", + "colab": {} + }, + "source": [ + "def batched_log_joint(beta):\n", + " result = 0.\n", + " # Here (and below) `sum` needs an `axis` parameter. At best, forgetting to set axis\n", + " # or setting it incorrectly yields an error; at worst, it silently changes the\n", + " # semantics of the model.\n", + " result = result + np.sum(scipy.stats.norm.logpdf(beta, loc=0., scale=1.),\n", + " axis=-1)\n", + " # Note the multiple transposes. Getting this right is not rocket science,\n", + " # but it's also not totally mindless. (I didn't get it right on the first\n", + " # try.)\n", + " result = result + np.sum(-np.log(1 + np.exp(-(2*y-1) * np.dot(all_x, beta.T).T)),\n", + " axis=-1)\n", + " return result" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "KdDMr-Gy85CO", + "outputId": "db746654-68e9-43b8-ce3b-6e5682e22eb5", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "batch_size = 10\n", + "batched_test_beta = onp.random.randn(batch_size, num_features)\n", + "\n", + "batched_log_joint(batched_test_beta)" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray([-147.84033203, -207.02204895, -109.26074982, -243.80830383,\n", + " -163.02911377, -143.84848022, -160.28771973, -113.77169037,\n", + " -126.60544586, -190.81988525], dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "-uuGlHQ_85kd" + }, + "source": [ + "### Autobatched with vmap\n", + "\n", + "It just works." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "SU20bouH8-Za", + "outputId": "ee450298-982f-4b9a-bed9-a6f9b8f63d92", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "vmap_batched_log_joint = jax.vmap(log_joint)\n", + "vmap_batched_log_joint(batched_test_beta)" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray([-147.84033203, -207.02204895, -109.26074982, -243.80830383,\n", + " -163.02911377, -143.84848022, -160.28771973, -113.77169037,\n", + " -126.60544586, -190.81988525], dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "L1KNBo9y_yZJ" + }, + "source": [ + "## Self-contained variational inference example\n", + "\n", + "A little code is copied from above." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "lQTPaaQMJh8Y" + }, + "source": [ + "### Set up the (batched) log-joint function" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "AITXbaofA3Pm", + "colab": {} + }, + "source": [ + "@jax.jit\n", + "def log_joint(beta):\n", + " result = 0.\n", + " # Note that no `axis` parameter is provided to `np.sum`.\n", + " result = result + np.sum(scipy.stats.norm.logpdf(beta, loc=0., scale=10.))\n", + " result = result + np.sum(-np.log(1 + np.exp(-(2*y-1) * np.dot(all_x, beta))))\n", + " return result\n", + "\n", + "batched_log_joint = jax.jit(jax.vmap(log_joint))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "UmmFMQ8LJk6a" + }, + "source": [ + "### Define the ELBO and its gradient" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "MJtnskL6BKwV", + "colab": {} + }, + "source": [ + "def elbo(beta_loc, beta_log_scale, epsilon):\n", + " beta_sample = beta_loc + np.exp(beta_log_scale) * epsilon\n", + " return np.mean(batched_log_joint(beta_sample), 0) + np.sum(beta_log_scale - 0.5 * onp.log(2*onp.pi))\n", + " \n", + "elbo = jax.jit(elbo, static_argnums=(1, 2))\n", + "elbo_val_and_grad = jax.jit(jax.value_and_grad(elbo, argnums=(0, 1)))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "oQC7xKYnJrp5" + }, + "source": [ + "### Optimize the ELBO using SGD" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "9JrD5nNgH715", + "outputId": "80bf62d8-821a-45c4-885c-528b2e449e97", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + } + }, + "source": [ + "def normal_sample(key, shape):\n", + " \"\"\"Convenience function for quasi-stateful RNG.\"\"\"\n", + " new_key, sub_key = random.split(key)\n", + " return new_key, random.normal(sub_key, shape)\n", + "\n", + "normal_sample = jax.jit(normal_sample, static_argnums=(1,))\n", + "\n", + "key = random.PRNGKey(10003)\n", + "\n", + "beta_loc = np.zeros(num_features, np.float32)\n", + "beta_log_scale = np.zeros(num_features, np.float32)\n", + "\n", + "step_size = 0.01\n", + "batch_size = 128\n", + "epsilon_shape = (batch_size, num_features)\n", + "for i in range(1000):\n", + " key, epsilon = normal_sample(key, epsilon_shape)\n", + " elbo_val, (beta_loc_grad, beta_log_scale_grad) = elbo_val_and_grad(\n", + " beta_loc, beta_log_scale, epsilon)\n", + " beta_loc += step_size * beta_loc_grad\n", + " beta_log_scale += step_size * beta_log_scale_grad\n", + " if i % 10 == 0:\n", + " print('{}\\t{}'.format(i, elbo_val))" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0\t-180.85391235351562\n", + "10\t-113.06047058105469\n", + "20\t-102.73725891113281\n", + "30\t-99.78732299804688\n", + "40\t-98.90898895263672\n", + "50\t-98.29743957519531\n", + "60\t-98.18630981445312\n", + "70\t-97.5797348022461\n", + "80\t-97.28599548339844\n", + "90\t-97.46998596191406\n", + "100\t-97.47715759277344\n", + "110\t-97.5806884765625\n", + "120\t-97.49433898925781\n", + "130\t-97.50270080566406\n", + "140\t-96.86398315429688\n", + "150\t-97.44197082519531\n", + "160\t-97.06938934326172\n", + "170\t-96.84031677246094\n", + "180\t-97.21339416503906\n", + "190\t-97.56500244140625\n", + "200\t-97.26395416259766\n", + "210\t-97.11984252929688\n", + "220\t-97.39595794677734\n", + "230\t-97.16830444335938\n", + "240\t-97.11840057373047\n", + "250\t-97.24346160888672\n", + "260\t-97.29786682128906\n", + "270\t-96.69286346435547\n", + "280\t-96.96443176269531\n", + "290\t-97.3005599975586\n", + "300\t-96.63589477539062\n", + "310\t-97.0351791381836\n", + "320\t-97.52906799316406\n", + "330\t-97.2880630493164\n", + "340\t-97.07324981689453\n", + "350\t-97.15620422363281\n", + "360\t-97.25880432128906\n", + "370\t-97.19515228271484\n", + "380\t-97.13092803955078\n", + "390\t-97.11730194091797\n", + "400\t-96.93872833251953\n", + "410\t-97.26676940917969\n", + "420\t-97.35321044921875\n", + "430\t-97.2100830078125\n", + "440\t-97.28434753417969\n", + "450\t-97.16310119628906\n", + "460\t-97.26123809814453\n", + "470\t-97.21342468261719\n", + "480\t-97.23995971679688\n", + "490\t-97.1491470336914\n", + "500\t-97.23527526855469\n", + "510\t-96.93415832519531\n", + "520\t-97.21208190917969\n", + "530\t-96.82577514648438\n", + "540\t-97.01283264160156\n", + "550\t-96.9417724609375\n", + "560\t-97.16526794433594\n", + "570\t-97.29165649414062\n", + "580\t-97.42940521240234\n", + "590\t-97.24371337890625\n", + "600\t-97.15219116210938\n", + "610\t-97.4984359741211\n", + "620\t-96.99072265625\n", + "630\t-96.88955688476562\n", + "640\t-96.89968872070312\n", + "650\t-97.13794708251953\n", + "660\t-97.43705749511719\n", + "670\t-96.99232482910156\n", + "680\t-97.15624237060547\n", + "690\t-97.1869125366211\n", + "700\t-97.1115951538086\n", + "710\t-97.78104400634766\n", + "720\t-97.23224639892578\n", + "730\t-97.16204071044922\n", + "740\t-96.99580383300781\n", + "750\t-96.66720581054688\n", + "760\t-97.16795349121094\n", + "770\t-97.51432037353516\n", + "780\t-97.28899383544922\n", + "790\t-96.91226959228516\n", + "800\t-97.17100524902344\n", + "810\t-97.29046630859375\n", + "820\t-97.16242980957031\n", + "830\t-97.19109344482422\n", + "840\t-97.5638427734375\n", + "850\t-97.00192260742188\n", + "860\t-96.86555480957031\n", + "870\t-96.76338195800781\n", + "880\t-96.83660125732422\n", + "890\t-97.121826171875\n", + "900\t-97.09553527832031\n", + "910\t-97.06825256347656\n", + "920\t-97.1194839477539\n", + "930\t-96.87931823730469\n", + "940\t-97.45622253417969\n", + "950\t-96.69277954101562\n", + "960\t-97.29376983642578\n", + "970\t-97.33528137207031\n", + "980\t-97.349609375\n", + "990\t-97.09675598144531\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "b3ZAe5fJJ2KM" + }, + "source": [ + "### Display the results\n", + "\n", + "Coverage isn't quite as good as we might like, but it's not bad, and nobody said variational inference was exact." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "zt1NBLoVHtOG", + "outputId": "fb159795-e6e7-497c-e501-9933ec761af4", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 463 + } + }, + "source": [ + "figure(figsize=(7, 7))\n", + "plot(true_beta, beta_loc, '.', label='Approximated Posterior Means')\n", + "plot(true_beta, beta_loc + 2*np.exp(beta_log_scale), 'r.', label='Approximated Posterior $2\\sigma$ Error Bars')\n", + "plot(true_beta, beta_loc - 2*np.exp(beta_log_scale), 'r.')\n", + "plot_scale = 3\n", + "plot([-plot_scale, plot_scale], [-plot_scale, plot_scale], 'k')\n", + "xlabel('True beta')\n", + "ylabel('Estimated beta')\n", + "legend(loc='best')" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "_bXdOlvUEJl0", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index c9679b3f1265..ac8fd2a93de7 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,8 +1,11 @@ +sphinx +sphinx_rtd_theme jaxlib ipykernel nbsphinx -# The next packages are for readthedocs +# The next packages are for notebooks matplotlib +sklearn # Must install jax itself for notebook execution to work . diff --git a/notebooks/README.md b/notebooks/README.md deleted file mode 100644 index ae50910ed2f3..000000000000 --- a/notebooks/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Notebooks - -Use the links below to open any of these for interactive exploration in colab. - - - [MAML][maml] - pedagogical demonstration of Model-Agnostic Meta-Learning in JAX. - - - [Score Matching][gmegdd] - demonstration of Generative Modeling by Estimating Gradients of the Data Distribution - - - [vmapped log-probabilities][vmapped log-probs] - demonstrates the utility of __vmap__ for Bayesian inference. - - - [Neural Networks with TFDS Data][neural_network_with_tfds_data] - training a simple neural net with [tensorflow datasets][tfds]. - - - [Neural Networks and Data Loading][neural_network_and_data_loading] - training a simple neural net using a pytorch dataloader. - - - [XLA in Python][XLA_in_Python] - interactive exploration of the XLA compiler and computation model in python. - -Some additional notebooks (quickstart, auto-diff cookbook and commona gotchas) were recently moved into JAX's [online documentation](https://jax.readthedocs.io/en/latest/). - - -[maml]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/maml.ipynb -[gmegdd]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb -[vmapped log-probs]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/vmapped%20log-probs.ipynb -[neural_network_with_tfds_data]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/neural_network_with_tfds_data.ipynb -[neural_network_and_data_loading]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/neural_network_and_data_loading.ipynb -[XLA_in_Python]:https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/XLA_in_Python.ipynb -[tfds]:https://github.com/tensorflow/datasets - diff --git a/notebooks/score_matching.ipynb b/notebooks/score_matching.ipynb deleted file mode 100644 index 5de8186cc7be..000000000000 --- a/notebooks/score_matching.ipynb +++ /dev/null @@ -1,803 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "accelerator": "GPU", - "colab": { - "name": "score_matching_jax.ipynb", - "version": "0.3.2", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "U6IRW9a8G6TB" - }, - "source": [ - "### Score Matching with JAX\n", - "\n", - "[![Run in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.sandbox.google.com/github/google/jax/blob/master/notebooks/score_matching.ipynb)\n", - "\n", - "In this notebook we'll implement __Generative Modeling by Estimating Gradients of the Data Distribution__ [[arxiv]](https://arxiv.org/abs/1907.05600).\n", - "\n", - "The paper builds on a technique called __Score Matching__ to iteratively refine images into samples from the real data. This technique takes advantage of some recent theorems to learn the gradients of data probability distribution. Implementing this in your typical DL framework would become an issue. However, [__`JAX`__](https://github.com/google/jax) ain't your typical DL framework. JAX makes implementing complex math no harder than writing it on a piece of paper.\n", - "\n", - "Let's begin with a simple task: learn to sample from a peculiar probability distribution. Like a swiss roll, for example:\n", - "\n", - "![img](https://i.imgur.com/zMR6Iej.jpg)\n", - "\n", - "well... minus the chocolate. Sorry for that." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "0P1xCZPNG6TE", - "outputId": "96fba817-16aa-4ddc-c182-c637efeed45e", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - } - }, - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "import numpy as onp\n", - "\n", - "from sklearn.datasets import make_swiss_roll\n", - "\n", - "def sample_batch(size, noise=1.0):\n", - " x, _= make_swiss_roll(size, noise=noise)\n", - " x = x[:, [0, 2]] / 10.0\n", - " return onp.array(x)\n", - "\n", - "plt.scatter(*sample_batch(10**4).T, alpha=0.1)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 2 - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "5X-LN4rwG6TH" - }, - "source": [ - "### Compute score matching objective\n", - "\n", - "The method we apply here was originally proposed by [Hyvarinen et al. (2005)](http://jmlr.org/papers/volume6/hyvarinen05a/old.pdf). The idea behind score matching is to __learn scores:__ the gradients of $\\log p(x)$ w.r.t. $x$. When trained this model can \"improve\" a sample $x$ by changing it in the direction of highest log-probability. However, training such model can get tricky. When predicting a continuous variable, ML folks usually minimize squared error:\n", - "\n", - "$$ L_{mse} = E_{x \\sim p(x)} \\left\\lVert model(x) - \\nabla_x \\log p(x) \\right\\lVert_2^2 $$\n", - "\n", - "One can't minimize this explicitly because the real $\\nabla_x log p(x)$ is usually unknown. However under broad assumptions on p(x) and a sufficiently powerful model, one can say that ` ... math happens ... ` and therefore the arg-minimum of $L_{mse}$ can be found by minimizing a more tractable objective:\n", - "\n", - "$$ L_{matching} = E_{x \\sim p(x)} \\space tr( \\space \\mathbf{J}_x [\\space model(x) \\space]) + \\frac12 \\left\\Vert model(x) \\right\\lVert_2^2 $$\n", - "\n", - "Here $tr( \\space \\mathbf{J}_x [\\space model(x) \\space])$ is a trace of Jacobian of $model(x)$ w.r.t. $x$. Now all it takes is to minimize the second objective with backpropagation... that is, if you can compute jacobians. Thankfully, we have __jax__!" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "98wjxKcNG6TI", - "colab": {} - }, - "source": [ - "import jax\n", - "import jax.numpy as np\n", - "from jax.experimental import optimizers\n", - "from jax.experimental import stax\n", - "from functools import partial\n", - "\n", - "# Set up network to predict scores\n", - "net_init, net_apply = stax.serial(\n", - " stax.Dense(128), stax.Softplus,\n", - " stax.Dense(128), stax.Softplus,\n", - " stax.Dense(2),\n", - ")\n", - "\n", - "# Create optimizer. Note that both network and optimizer returns pure (stateless) functions\n", - "opt_init, opt_update, get_params = optimizers.adam(1e-3)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "FgH-YVaZG6TJ", - "colab": {} - }, - "source": [ - "# v-- jax.jit compiles a function for efficient CPU and GPU execution\n", - "\n", - "@jax.jit\n", - "def compute_loss(net_params, inputs):\n", - " # v-- a function that computes jacobian by forward mode differentiation\n", - " jacobian = jax.jacfwd(net_apply, argnums=-1)\n", - " \n", - " # we use jax.vmap to vectorize jacobian function along batch dimension\n", - " batch_jacobian = jax.vmap(partial(jacobian, net_params))(inputs) # [batch, dim, dim]\n", - " \n", - " trace_jacobian = np.trace(batch_jacobian, axis1=1, axis2=2)\n", - " output_norm_sq = np.square(net_apply(net_params, inputs)).sum(axis=1)\n", - " \n", - " return np.mean(trace_jacobian + 1/2 * output_norm_sq)\n", - "\n", - "\n", - "@jax.jit\n", - "def train_step(step_i, opt_state, batch):\n", - " net_params = get_params(opt_state)\n", - " loss = compute_loss(net_params, batch)\n", - " grads = jax.grad(compute_loss, argnums=0)(net_params, batch)\n", - " return loss, opt_update(step_i, grads, opt_state)\n", - "\n" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LkTYRi6qCwn8", - "colab_type": "text" - }, - "source": [ - "__Note__: we use `jax.jacfwd` since the input dimention is only 2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Qxza8fDvG6TL" - }, - "source": [ - "### Training loop" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "NNlbbWNIG6TM", - "colab": {} - }, - "source": [ - "from IPython.display import clear_output\n", - "\n", - "out_shape, net_params = net_init(jax.random.PRNGKey(seed=42), input_shape=(-1, 2))\n", - "opt_state = opt_init(net_params)\n", - "\n", - "loss_history = []" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "evDOnCHiG6TN", - "outputId": "54c4b881-32ad-4947-efeb-a515d64af18f", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 499 - } - }, - "source": [ - "for i in range(10_000):\n", - " x = sample_batch(size=128)\n", - " loss, opt_state = train_step(i, opt_state, x)\n", - " loss_history.append(loss.item())\n", - " \n", - " if i % 100 == 0:\n", - " clear_output(True)\n", - " plt.figure(figsize=[16, 8])\n", - " plt.subplot(1, 2, 1)\n", - " plt.title(\"mean loss = %.3f\" % np.mean(np.array(loss_history[-32:])))\n", - " plt.scatter(np.arange(len(loss_history)), loss_history)\n", - " plt.grid()\n", - " \n", - " plt.subplot(1, 2, 2)\n", - " net_params = get_params(opt_state)\n", - " xx = np.stack(np.meshgrid(np.linspace(-1.5, 2.0, 50), np.linspace(-1.5, 2.0, 50)), axis=-1).reshape(-1, 2)\n", - " scores = net_apply(net_params, xx)\n", - " scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", - " scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", - "\n", - " plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", - " plt.xlim(-1.5, 2.0)\n", - " plt.ylim(-1.5, 2.0)\n", - " plt.show()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Ug91tS-RG6TP" - }, - "source": [ - "### Plot gradient directions\n", - "Once the model is trained we can use it to predict scores at each point. Since those are gradient vectors, we'll use [`Quiver Plot`](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.quiver.html) to draw them." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "x6SkLg0VG6TQ", - "outputId": "1f772563-c102-4648-d41a-e824f3a60a8e", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 938 - } - }, - "source": [ - "plt.figure(figsize=[16, 16])\n", - "\n", - "net_params = get_params(opt_state)\n", - "xx = np.stack(np.meshgrid(np.linspace(-1.5, 1.5, 50), np.linspace(-1.5, 1.5, 50)), axis=-1).reshape(-1, 2)\n", - "scores = net_apply(net_params, xx)\n", - "scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", - "scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", - "\n", - "plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", - "plt.scatter(*sample_batch(10_000).T, alpha=0.25)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 8 - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nnZrE8CAig7XXNHvakbuDN3e+yZMbnsQjevh6+NcYNAbJ53/z+VV8e+RbJqyZgFt08+N9P8qKyZm4\nZiJVlioeWvUQNpeNuSPm0jaq7bUL8W78/x/2zjuwqjLd+r+9T2/pvUFC770IKkoVQVApKmLDjnV0\nHMcZ56pjmXFmrGMviI0iCkgRpAgISO8lJKSQkN5PTm97f38cckiAkH3i3Dv3fsP6j815st/d3+d9\n1rPW27vexhvwctO3N1HnquOvY/6qWJfBL/nZVbKLgBRg1nezKLYW8/TIp7mhxw2K4mudtTR6GvFL\nfm7+7mZya3OZO3guDwx+QHE8BCt9Ny6+kWPVx7ir/108f9XziuKbkn6nz8nkhZM5UHGAWX1m8e6k\ndxWxrZoWCJonrdN7TmfBjQsU0aWb4stt5YyaP4qdJTu5sceNrLplVZvtex6/J/Stzq7OZvinw0P7\n/+n2n9pkuzVPLLcXb2fwR4PZWxa0gfxlzi9t+tM2X9xYmbOSAR8OYG/ZXmb0nMHe+/bSI77HReMv\n4VLi+qvQO6E3P87+kQhdBPeuvJcFRxaEFZ8VncWPs38kUhfJA6sfOI/y2RZSLCn8MOsHInWRzF09\nlx9Ohmf9EmuMZeUtK4nQRfDg6gcvSFm9GCw6C0tvWopJY+KB1Q+EnTwZNAYWTluITqXj/lX3h+2d\nqVVpmT91PipBxQOrH6DOVdd2UDOoRBXvXvsuAI+seSRsBWJREHl1bJAq/vuNvw97pVEQBJ65/BmA\ndlXdAR4e8jBAu6me9w+6H4AP97XPuuXeQfcCQb/g9uC2frehU+n4eP/H7aL4TOo6iVRLKouOLqLe\nVR92fN/EvlyecTlbi7dypPJI2PHxpnhu7n0zpxtPszJnJUBYx6FRaZg7eC5uvzu0eBQuXe2J4UHG\nwOs7X8fqtob9HvndyN+hFtX8ddtfWZa9jJd/fjms+Jm9ZjI8bThr8tYw7stxYS0C+SU/Nc4apvWY\nhk/ysbNkJ1tObVFE+at3etFrgvf+qtzguZdxg2TilW2vKNq/KIgMSh7E7L6zQx7OEFxFn7V0Fqdq\n7ORVnfVS9fol8qrsFNedXZWfM2AOH0/6mjW3fc+SG1fyypVf8eSgD7mu070MTxpNpb0SCL4bmipV\ncWYt+4vOigQNSByBKtCFHonne/0V1znYW1RHQbWdw6fr2VlYQ73Diy8gY3X7EEWos8MveTU0OHyo\n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\nFq4PZ3zH8XSI6xCw/Y0tb4iaDCZHJDO+w3gahVQVxzs9TtFZ1z6JfXi89eMBdQ6HLh/yyyBvBplM\nxsTOE+nRoEfA9pkHZ4o69zBdGO/3fJ9YY6x/m4DA3OPi6mx7Ne7F5P/D3nkHRlGv3f8z23ezm2TT\nCwkQiPTeRUSKSLWgqAgWRFEQwWvl2sB2saByURAVG6IoYKcjvfcSSkIIJSQhvW422+f3x7pLEgKZ\n2dx7f+/73px/YDf7ZHZnJzNzvud5zun9dI12lXVn1klyBlUqlHw49EN6xves8fy2C9skbbt1RGtW\n3rcSk+byjXFKfopk8jK6zWjeGlgzykhOq/D9ne7n8W6P13hOTpv06DajmdqjZvaZnCy6G5veyEv9\nXqrxnJxc3lYRrfhgSE1HazmOrma9+YooJbmt0l/f/jVB6sumGk6PdOIL8PqA12kb2db/WC75G9py\nKI92fRQIjPhFGCJYOMI7nx0I8QWYP3w+kYbIgDPsBjQfwNQeUxuUgTe5+2RuadGw2dJIk45BreP/\n7a25/9NQl8LlNSFSSyZ/pbZSyR1GdamVUWYXgmGvn7TKNckCmLNrTsDt4uAlFkuOLamxP0INWno0\nC+fG66IINWiuiLipTdpcHledyn9tIl5uc9K9mZnrW0TQoUkoiWFGujcNo3VsMDckR1JocaBXK8gs\ntnLyUhmXyqoQRZEqh0gTsx6VUqDC7iBEr0KjVKBVKRFFEVEUKbM5aRkV5Fcwa5Ps6BAd43sn+smu\nRqnAoFGSV+6g0uFGofAeAxeLq/z7XO53crXFg4IKG4mmNpzMEtl/rvgKJRvqnlPOKrFSanVQUlXG\n1N4Pc114G87kWzhfWInT7SYluwyn24NCEDidV8nhrFJcHg8tI42k5lr87/OH4z/w2cjP+O3e3xA8\nwf7vpHY+7tXmYxceWMiU7lM4+vhRbki8QdbxteX8Fk7kn+CNAW9w5LEj3Nj0Rsm1Lo+LWVtm0Tqi\nNavuW8W68evqNROqjkWHFpFamMr9He8ndWoqX9z2hb/TpT5U2CuYtnYaCcEJzL1lLpl/y+T1Aa9L\nMnMCb/ThhbILPNT5IfY9so99j+7joc4PSZpLPZBzgBc3vcjNSTez5I4l5D6Ty5e3fUn/Zv3rbTH2\niB4e+OUBlAolL/d7mWOPH+PUE6d4bcBrtI9qXy/pzCjOYPwv47m5xc0sHLGQ7Kez2T1xNy/c8ELA\n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\n7e5WsWwnVX0oq9FWyOGRRUzbQtUtDNOiM5nEtHUuaG0ul6vJIrhkifkNYboSBdKqgc+lcP2SBq5Z\nWMcTe7bw3Rf3cSTVSWdmNzcvuh63WDXOQXWy7L+aiMaT7Q+ztn0ta9vXktWyE8rSUQ2VTT2beKHj\nBV48+iKvdr2KJEgc/KuDk7zff9w4Z7i+AXzjpW+QKCbwK378Lj9+xY9X8bI3vpfPPfM57nzmTi6Z\ncgk3zb+JG+fceMJi/uMtP+Zw4jBhT5iQO0TYHSbqifLt177NAzseoCHYwIcWfIhbFt5y0g3dw3se\nZlvfNmLeGBXeCmLeGCF3iM8/+3n+et1fc+2Ma7l1ya28a/q7TjoRPnfkOZ49/CzV/mpqAjVEPBH+\ne99/8+CuB5lVMYvblt3GRxZ95JSbpx39O/j1nl8TVhrJZhpwS0H+fcO/c8+Wn3NR01V84dJ3A6de\nQLoz3fxw0w9pibTgkT3cs+0e7tl2D1e0XsEdK+/gXTPeddIIxOikp8gW92z7GbWBOg4NHeKTD/+M\nv3v2QT4w/1o+df57UCTltKkqAK/3vc7mrv188uj/ZWq0llsWf5Clyvns73cIkla2xvivrV10JwpE\nvC4aY05dT3FEB3XNnm3cvedOvrLqmyz1X0fQI5Mq6FQH3fSkVdyyhCQIRH1OOvCMaj+WbZHMa7Qn\nOmmNNtFa5ScykjqWLur0Z4rliKtlm6w/upl9Qzs5uGcNm3s3Y1iOkdwUaiq/PtCfJVXUifhceBVn\nw5pU87x09BVe79tFjm2jwXAHIkjKLF7re4aplR9yPl/QqIt48bmdlKDLp5/H5TMWsO7I73i6v2fc\nGlg0ilz3y+v45NJP8reX/O1J768gCNy65FYunXIpH3vsY7x09KXye5t7N1P9rWpunHsjv7rxV6cc\nIz7FxwPXP8D5Defz2ac/i2459blPtT3FU21PsaJ+BS/92Ut45FNvKFc2rmTjJzZy7S+vZW98L37F\nz86BnXzgvz5AS7iFl/7sJZrDzadsD3DbsttwS25uffxWFFHBr/j55ivf5D+2/AdPfvhJLmi64LTt\nBUHgO1d/h95sL7/Z+xuaw81s69vG8nuWc/977z9t5HkUoiBy//X3s/jHixnID+BX/Hz1+a+SLqX5\n1yv/9YztASRR4ntXf4/LHrgMWZQxLIMfbfkR75/7/gm1H+3jY4s+xjde/gYAMW+MzZ/cTNgTPkPL\n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\nR/E+n09XfrXScbyqasaeDF379VrH8Z/mfaqf7PvEcQ5uyN+gH+/92NEaL1X/Gu1Ve1Y5Po/tLtyt\nK79aqd+UfuMofn/xfk3PTdeDJQcdxR8pPaJLdi4xXiNrKa0s1fd3vO/4POzz+XTG5zMcx6uqTt80\nvabHghPvfP6O7vpml+P4WZtnOT4HqPrXimZ+nek4Pj03XdN2pTk+BrIOZOm7W951/F4gtzBX38h6\nw/E6+cKyQn1hzQvG/QEs5d5y/duqv+nR8qOO4qt91fpMxjOOjyGfz6f/WP2POuVQYmai498Dqv71\nystzlzuOX7B9gb675V3H8Rl7Mur0XmDjwY361/S/OlprrOo/jw5PGe74vcT3HQzWuIrW8gmdiKwE\n8F3zsMaqakrgPqsB/FVVv3P9qoi0V9V8EWkNYAWAkapa6/Ti66+/XrOzL6glsURERERERARARDaq\nzaWktc6PUtVb6zogVc0P/H1YRBYDiIO9dbFERERERET0A3fe93EVkWgRaWrdBnAb/E2diIiIiIiI\niGpV1+1wBonIAQC9ACwVkfTA1y8WkbTA3doA+ExEtgBYD2Cpqn5Ul59LREREREREPxzOWykCUNXF\nABZ/x9cPAugbuL0HwDV1+TlERERERET0w3XepwoTERERERER1QULVyIiIiIiInI1Fq5ERERERETk\naixciYiIiIiIyNVYuBIREREREZGrsXAlIiIiIiIiV2PhSkRERERERK7GwpWIiIiIiIhcjYUrERER\nERERuRoLVyIiIiIiInI1Fq5ERERERETkaixciYiIiIiIyNVYuBIREREREZGrsXAlIiIiIiIiV2Ph\nSkRERERERK7GwpWIiIiIiIhcjYUrERERERERuRoLVyIiIiIiInI1Fhep5+wAAAWqSURBVK5ERERE\nRETkaixciYiIiIiIyNVYuBIREREREZGrsXAlIiIiIiIiV2PhSkRERERERK7GwpWIiIiIiIhcjYUr\nERERERERuRoLVyIiIiIiInI1Fq5ERERERETkaixciYiIiIiIyNVYuBIREREREZGrsXAlIiIiIiIi\nV2PhSkRERERERK7GwpWIiIiIiIhcjYUrERERERERuRoLVyIiIiIiInI1UdX6HsMZicgRAHn1PY6z\naAngm/oeBLkG84EszAUKxnygYMwHsjAXKNgPNR86qWorO3d0deHqdiKSrarX1/c4yB2YD2RhLlAw\n5gMFYz6QhblAwZgPteNUYSIiIiIiInI1Fq5ERERERETkaixc62ZqfQ+AXIX5QBbmAgVjPlAw5gNZ\nmAsUjPlQC65xJSIiIiIiIlfjFVciIiIiIiJyNRauBkRkqIjsEBGfiJyx65eI7BORbSKyWUSyQzlG\nCh2DfLhDRHaKSK6IjAnlGCk0RCRWRFaIyO7A3zFnuF914LywWURSQz1OOr9qO9ZFpJGIzA98P0tE\nfhT6UVIo2MiFYSJyJOh8MLw+xkmhISLTReSwiGw/w/dFRCYE8mWriPQI9RgpNGzkQh8RKQ46N/w9\n1GN0MxauZrYDGAxgjY373qSq3dnW+oJWaz6ISBiAiQDuBNANwK9FpFtohkchNAZAhqpeDiAj8O/v\nUh44L3RX1f6hGx6dbzaP9fsBHFXVHwN4FcBLoR0lhYLBeX9+0PngrZAOkkJtBoA7zvL9OwFcHvjz\nIIDJIRgT1Y8ZOHsuAMCnQeeG50Iwpu8NFq4GVPULVd1Z3+Mgd7CZD3EAclV1j6pWApgHYMD5Hx2F\n2AAAMwO3ZwIYWI9jofph51gPzpOFAG4REQnhGCk0eN6nU6jqGgBFZ7nLAACz1G8dgItEpF1oRkeh\nZCMX6CxYuJ4fCmC5iGwUkQfrezBUr9oD2B/07wOBr9GFpY2qHgrcLgDQ5gz3ixSRbBFZJyIsbi8s\ndo71mvuoahWAYgAtQjI6CiW75/34wLTQhSJySWiGRi7F9woUrJeIbBGRZSLyP/U9GDcJr+8BuI2I\nrATQ9ju+NVZVU2w+zM9VNV9EWgNYISJfBj5hoe+Zc5QPdAE4Wy4E/0NVVUTO1K69U+DccBmAVSKy\nTVW/OtdjJSLX+xDAXFWtEJGH4L8Sf3M9j4mI6t8m+N8rnBCRvgA+gH8KOYGF639R1VvPwWPkB/4+\nLCKL4Z82xML1e+gc5EM+gOBP0jsEvkbfM2fLBRH5j4i0U9VDgeldh8/wGNa5YY+IrAZwLQAWrhcG\nO8e6dZ8DIhIOoDmAwtAMj0Ko1lxQ1eDX/S0AL4dgXORefK9AAABVLQm6nSYik0Skpap+U5/jcgtO\nFT7HRCRaRJpatwHcBn8TH/ph2gDgchG5VEQiACQAYDfZC08qgD8Ebv8BwH9djReRGBFpFLjdEsDP\nAOSEbIR0vtk51oPzZAiAVcrN1C9EtebCaesX+wP4IoTjI/dJBfD7QHfhnwIoDlp+Qj8gItLW6n0g\nInHw12r8gDOAV1wNiMggAG8AaAVgqYhsVtXbReRiAG+pal/417YtDuRcOID3VPWjehs0nTd28kFV\nq0RkBIB0AGEApqvqjnocNp0f4wAsEJH7AeQBuBsAAtskPayqwwFcCWCKiPjg/0U0TlVZuF4gznSs\ni8hzALJVNRXA2wBmi0gu/M05EupvxHS+2MyFx0SkP4Aq+HNhWL0NmM47EZkLoA+AliJyAMCzABoC\ngKomAUgD0BdALoAyAH+sn5HS+WYjF4YA+JOIVAEoB5DADzi/JXwuiIiIiIiIyM04VZiIiIiIiIhc\njYUrERERERERuRoLVyIiIiIiInI1Fq5ERERERETkaixciYiIiIiIyNVYuBIREREREZGrsXAlIiIi\nIiIiV2PhSkRERERERK72/57ugDaXdUBFAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "yewoL6wqG6TS" - }, - "source": [ - "A hot new paper by [Song et al. (2019)](https://arxiv.org/abs/1907.05600) uses this method to generate images by iterative refinement... Apparently it took DL researchers 14 years to understand the proof :)\n", - "\n", - "Seriously though, this paper takes advantage of two new ideas: sampling with __Langevin Dynamics__ and scaling to high dimensions with __Sliced Score Matching__. We'll cover them one at a time." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "gsXvXhgfG6TS" - }, - "source": [ - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "```\n", - "\n", - "\n", - "\n", - "### Sampling with Langevin Dynamics\n", - "\n", - "Once we have $\\nabla_x log p(x)$, we can use it to generate data. One simple thing you can do is a gradient ascent w.r.t image to find a local maximum of p(x):\n", - "$$\\hat x_{t + 1} := x_t + \\epsilon \\nabla_{x_t} log p(x_t)$$\n", - "\n", - "In order to sample $x \\sim p(x)$, one can run a slightly more sophisticated procedure:\n", - "\n", - "$$\\hat x_{t+1} := \\hat x_t + \\frac \\epsilon 2 \\nabla_{\\hat x_t} log p(\\hat x_t) + \\sqrt \\epsilon z_t, \\quad z_t \\sim N(0, I)$$\n", - "\n", - "\n", - "Performing this update multiple times in an MCMC fashion is a special case of Langevin Dynamics. Under $\\epsilon \\rightarrow 0, t \\rightarrow \\inf$: $\\hat x_t$ converges to a sample from $p(x)$. You can find a more detailed explanation and a formal proof in [Welling et al. (2011)](https://www.ics.uci.edu/~welling/publications/papers/stoclangevin_v6.pdf) and further exploration of SGLD in [Teh et al. (2014)](https://arxiv.org/abs/1409.0578) and [Vollmer et al. (2015)](https://arxiv.org/abs/1501.00438).\n", - "\n", - "In practice, we can initialize $x_0$ from some initial guess (e.g. uniform distribution over data space) and $\\epsilon$ to some positive value. As the sampling progresses, we can anneal $\\epsilon$ it until we are satisfied with the samples. Okay, now let's go implement that :)" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "Byq9q1XdG6TT", - "colab": {} - }, - "source": [ - "def sample_langevin(x_initial, *, net_params, key, eps=1e-2, eps_decay=0.9, num_steps=15, temperature=1.0):\n", - " \"\"\" sample x ~ p(x) by applying approximate Langvenin Dynamics, return a sequence of x_t \"\"\"\n", - " x_t, x_sequence = x_initial, [x_initial]\n", - " \n", - " for t in range(num_steps):\n", - " key, subkey = jax.random.split(key)\n", - " z_t = jax.random.normal(subkey, shape=x_t.shape)\n", - " x_t = x_t + eps / 2 * net_apply(net_params, x_t) + np.sqrt(eps) * temperature * z_t\n", - " x_sequence.append(x_t)\n", - " eps *= eps_decay\n", - " \n", - " return np.stack(x_sequence)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "n6ZWX9Z1G6TV", - "outputId": "c55873d7-fff8-492c-bade-f836a7edcb00", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 938 - } - }, - "source": [ - "plt.figure(figsize=[16, 16])\n", - "\n", - "key = jax.random.PRNGKey(42)\n", - "net_params = get_params(opt_state)\n", - "\n", - "for x_initial in np.array([[-1.5, -1.5], [0, 0], [1.5, 0]]):\n", - " key, subkey = jax.random.split(key)\n", - " # sample x sequence\n", - " xx = sample_langevin(x_initial, key=subkey, net_params=net_params)\n", - " plt.scatter(xx.T[0], xx.T[1], color=\"blue\")\n", - "\n", - " # draw arrows for each mcmc step\n", - " deltas = (xx[1:] - xx[:-1])\n", - " deltas = deltas - deltas / np.linalg.norm(deltas, keepdims=True, axis=-1) * 0.04\n", - " for i, arrow in enumerate(deltas):\n", - " plt.arrow(xx[i][0], xx[i][1], arrow[0], arrow[1], width=1e-4, head_width=2e-2, color=\"orange\")\n", - " \n", - "# plot data points and gradients\n", - "plt.plot()\n", - "xx = np.stack(np.meshgrid(np.linspace(-1.5, 1.5, 50), np.linspace(-1.5, 1.5, 50)), axis=-1).reshape(-1, 2)\n", - "scores = net_apply(net_params, xx)\n", - "scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", - "scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", - "plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", - "plt.scatter(*sample_batch(10_000).T, alpha=0.025)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 10 - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n/5pjayhkhIiIaE/OHhrwwQDCeFCPST2SOl+OFR7z9uDiWDE9+tWjpE3QSHlWoQN5B6rlD5thb/8T\nQtDsXbOp2SvNCONBr65/Nak+/FwIwBZKUjf8tyunVf35qSuuRESvrX+N9ubsrTX/lwe/pIX7FtZK\nyCKSAsaLa16slaDo0ivrXqETRSdqzb9o/yJac2xNrflPFp9MUJprSkIIem39a0kruhXRgr0LaE/O\nHu//NW3LofxDNHf3XO//ZyNnPaUw/lCpTOixuU0TN00kwzaIiOjrI1/XuA//3PtPOlV8ihYfWEyf\n7P+ktC9VtCNecDqQe4iWHFxO9f9fI9qZXfmcjjiH7tmSGJ04G6ITZ8OUXRCh42eLaXPWbho19y5P\nCHMP17MlMTqWG6Lc4ihl5ZVQVl6I8kvkwXwst5jOFseoMGRQTnEJ7c85LgWA06fInpuZoLTSLJCY\n7afQ0aWUVxyjXEc4KQqbdDTvDOXnbJZ9ilne/YbFKRy1qChseAJHJGYlCIwFkRIKTsig4PhM+vK7\n5VLZLYjQ8bwSOpxTRMdyi6kgJIWa7MIwFYQMT2iIGBZtz95BbDwjfYJOL699mcJmmCJx4+0qz8fy\nSuhUgVRaCxxBKWrYtPboBsLTOqU+V48ufLs3FZTEPKHGFWwKw4YnLJUVng6ePUgYD2r4/5qR/lQ9\nWnbgG08ok+2OVSlcCiGo0UvNaPjsXxKe0ejpFRO8salMWS5L45aPo2tnXEv1X6pP5795fo3WEOeC\nCsIlhKd91PXNnqSO12j10dWUVZhVo+f84Ys/UPeJ3QnjQX9d9lfaeXqnJ3jEv6syoTurMIvUZ1Vq\n8HIDGjJ9CB0tOFqOvzoaOnMo+Z/zU4tXW1BeOK/GyuOsnbMI40HKswrty91XI14iaUzMfCmTMB70\nzpZ3anW2PL3iacJ40E0f3kTFseIa89vcpqZ/b0rB54O06uiqGvMTEU3fPp2Czwdp2OxhSRsh4ykn\nlEP93r+aMl5oQPcsvL9SxbCy/dGwTHr/2/epxSstqenLLeh/N0xMWklzaW/OXnpw8YOU+kIqsfGs\n3FyKlFFay665qBWlr498TRgPSn0hlf685M81GoOIYVMoFqOWr7ah1OczKPPFRt7cT4Zsm1NxJEb/\nNf8BCj6bSWxcCi09uJpCUbPac81dZ6eLz9KM7fMJT6ZQ6rMN6a0N71E4alXKUxCKecpnUdik/JII\n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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "vZrW00brG6TX" - }, - "source": [ - "### Sliced Score Matching\n", - "\n", - "Now the problem with our previous loss function is that the computation of $tr(\\mathbf{J}_x [\\space model(x)])$ takes a $O(N^2 + N)$ time to compute, thus not being suitable for high-dimentional problems. The solution is using jacobian vector products which can be easily computed using forward mode auto-differentiation. This method is called Sliced Score Matching and was proposed by [Yang Song et al. (2019)](https://arxiv.org/abs/1905.07088).\n", - "\n", - "Our new objective looks like this:\n", - "\n", - "$$E_{\\mathbf{v} \\sim \\mathcal{N}(0, 1)} E_{x \\sim p(x)} [ \\mathbf{v}^T \\mathbf{J}_x[model(x)] \\mathbf{v} + \\frac{1}{2} (\\mathbf{v}^T model(x))^2 ]$$\n", - "\n", - "Jacobian Vector products, by the way, can be easily computed using `jax.jvp`." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "MkAXz0SmG6TY", - "colab": {} - }, - "source": [ - "@jax.jit\n", - "def compute_ssm_loss(net_params, inputs, key):\n", - " apply = jax.jit(partial(net_apply, net_params))\n", - " batch_dot = partial(np.einsum, 'bu,bu->b')\n", - " \n", - " # generate random vectors from N(0, I)\n", - " v = jax.random.normal(key, shape=inputs.shape)\n", - "\n", - " # predict score and comput jacobian of score times v\n", - " score, jac_v = jax.jvp(apply, [inputs], [v])\n", - " \n", - " return np.mean(batch_dot(v, jac_v) + 1/2 * batch_dot(v, score) ** 2)\n", - "\n", - "@jax.jit\n", - "def train_step(step_i, opt_state, batch, key):\n", - " # the new compute_loss is random key dependent, thus we need a new train_step function\n", - " net_params = get_params(opt_state)\n", - " loss = compute_ssm_loss(net_params, batch, key)\n", - " grads = jax.grad(compute_ssm_loss, argnums=0)(net_params, batch, key)\n", - " return loss, opt_update(step_i, grads, opt_state)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GWaKgphWCwoi", - "colab_type": "text" - }, - "source": [ - "__Note:__ we compute Jacobian with `jax.jacfwd` (forward-mode differentiation) because the input dimension of the network is just 2. You can read more about autograd modes in jax [documentation](https://jax.readthedocs.io/en/latest/jax.html?highlight=jacfwd#jax.jacfwd) and on wikipedia [wiki](https://en.wikipedia.org/wiki/Automatic_differentiation)" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "8dxK2pCxG6Tb", - "colab": {} - }, - "source": [ - "key = jax.random.PRNGKey(42)\n", - "key, subkey = jax.random.split(key)\n", - "out_shape, net_params = net_init(subkey, input_shape=(-1, 2))\n", - "opt_state = opt_init(net_params)\n", - "\n", - "loss_history = []" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "hQyo8kvTG6Tc", - "outputId": "ff7cdeb9-2a09-412b-fe05-7c8d47fae2ec", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 499 - } - }, - "source": [ - "for i in range(10_000):\n", - " x = sample_batch(size=128)\n", - " \n", - " key, subkey = jax.random.split(key)\n", - " loss, opt_state = train_step(i, opt_state, x, subkey)\n", - " loss_history.append(loss.item())\n", - " \n", - " if i % 100 == 0:\n", - " clear_output(True)\n", - " plt.figure(figsize=[16, 8])\n", - " plt.subplot(1, 2, 1)\n", - " plt.title(\"mean loss = %.3f\" % np.mean(np.array(loss_history[-32:])))\n", - " plt.scatter(np.arange(len(loss_history)), loss_history)\n", - " plt.grid()\n", - " \n", - " plt.subplot(1, 2, 2)\n", - " net_params = get_params(opt_state)\n", - " xx = np.stack(np.meshgrid(np.linspace(-1.5, 2.0, 50), np.linspace(-1.5, 2.0, 50)), axis=-1).reshape(-1, 2)\n", - " scores = net_apply(net_params, xx)\n", - " scores_norm = np.linalg.norm(scores, axis=-1, ord=2, keepdims=True)\n", - " scores_log1p = scores / (scores_norm + 1e-9) * np.log1p(scores_norm)\n", - "\n", - " plt.quiver(*xx.T, *scores_log1p.T, width=0.002, color='green')\n", - " plt.xlim(-1.5, 2.0)\n", - " plt.ylim(-1.5, 2.0)\n", - " plt.show()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\nQEWoAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "A8Ni7_cGG6Tf" - }, - "source": [ - "## Easy? Let's go deeper!\n", - "MNIST 8x8, computing full jacobian would require 64 passes through the network" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "Y2ZgeMq-G6Tf", - "outputId": "b9e6c60c-c68c-4ef0-d50c-7238361b870e", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 109 - } - }, - "source": [ - "from sklearn.datasets import load_digits\n", - "import numpy as old_np\n", - "\n", - "X, _ = load_digits(return_X_y=True)\n", - "\n", - "for i in range(5):\n", - " plt.subplot(1, 5, i + 1)\n", - " plt.imshow(X[i].reshape(8, 8), cmap='gray')\n", - " \n", - "\n", - "def sample_batch(size, noise=0.1):\n", - " ix = old_np.random.randint(0, len(X), size=size)\n", - " return np.array(X[ix] / 16 + noise * old_np.random.randn(size, 64))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\nAGSGxg0Amfkfpfx5uQIv+fwAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "rKSjSWQXG6Th", - "colab": {} - }, - "source": [ - "# Set up network to predict scores\n", - "net_init, net_apply = stax.serial(\n", - " stax.Dense(128), stax.Softplus,\n", - " stax.Dense(128), stax.Softplus,\n", - " stax.Dense(64),\n", - ")\n", - "\n", - "# Create optimizer. Note that both network and optimizer returns pure (stateless) functions\n", - "opt_init, opt_update, get_params = optimizers.adam(1e-3)\n", - "\n", - "key = jax.random.PRNGKey(seed=42)\n", - "key, subkey = jax.random.split(key)\n", - "out_shape, net_params = net_init(subkey, input_shape=(-1, 64))\n", - "opt_state = opt_init(net_params)\n", - "\n", - "loss_history = []" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "YxWvSQJAG6Ti", - "outputId": "20230b7f-25df-4410-907a-a023e8141dd9", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 281 - } - }, - "source": [ - "for i in range(25_000):\n", - " x = sample_batch(size=128)\n", - " key, subkey = jax.random.split(key)\n", - " loss, opt_state = train_step(i, opt_state, x, subkey)\n", - " loss_history.append(loss.item())\n", - " \n", - " if i % 100 == 0:\n", - " clear_output(True)\n", - " plt.title(\"mean loss = %.3f\" % np.mean(np.array(loss_history[-32:])))\n", - " plt.scatter(np.arange(len(loss_history)), loss_history)\n", - " plt.show()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\nmlGRAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "gof2XcxwG6Tk", - "outputId": "de3656bb-49b5-4622-aa18-037f85c38337", - "scrolled": false, - "colab": { - "base_uri": "https://localhost:8080/", - "height": 281 - } - }, - "source": [ - "key, subkey = jax.random.split(key)\n", - "x = 0.1 * jax.random.uniform(subkey, shape=(64,))\n", - "\n", - "xx = sample_langevin(x, net_params=get_params(opt_state), key=key,\n", - " eps=0.05, eps_decay=0.98, num_steps=100,\n", - " temperature=0.01) # set low temperature to compensate for noise in training data\n", - "\n", - "for t, x_t in enumerate(xx):\n", - " clear_output(True)\n", - " plt.imshow(x_t.reshape(8, 8), cmap='gray')\n", - " plt.title('step %i' % t); plt.colorbar(); plt.show()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAScAAAEICAYAAAAdoDKiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAFYhJREFUeJzt3X+wXGV9x/H35978oJLwM+BAkkKU\nDG201WgMdVBBUOaiTuIUnCYOVtSWdqZBGMpYsIAO2go6RZ0hg6YhSmswSIROaiPoVFKRqUxuAqJJ\nSL1k0CQSwo0JBMIPk/vtH3suLjc32bPcs2ef3fN5zeywu+e5z/OsMh+e85xznkcRgZlZanra3QEz\ns9E4nMwsSQ4nM0uSw8nMkuRwMrMkOZzMLEkOJzNLksOpQ0n6rKRvtbD+RZL6Jb0o6ZujHD9X0qOS\n9km6T9IpdccmSlom6RlJOyRd0ap+WvdyONmh/Ab4PLBs5AFJU4C7gGuB44B+4I66Ip8FZgKnAO8G\nPiWpr8X9tS7jcEqcpH+QtF3SXkmbsxFLH/Bp4C8kPSvpZ1nZoyXdKumJ7G8+L6k3O3axpAck3Szp\n6WzUc+6h2o2IuyLiP4Bdoxz+c2BDRNwZES9QC6M3Sfqj7PhHgc9FxO6I2AT8K3BxQf+TWEWMa3cH\n7NAknQ4sAt4WEb+RdCrQGxGPSfpn4LSIuKjuT74J7AROA44EvgdsBb6eHT8DWAlMoRYwd0maERG/\nbbJrbwB+NvwhIp6T9BjwBklPAifVH8/ef7DJNqziPHJK2wFgIjBL0viIeDwiHhutoKTXAu8DLo+I\n5yJiJ/BlYEFdsZ3AVyLidxFxB7AZeP+r6Nck4OkR3z0NTM6OMeL48DGz3BxOCYuIAeByaqdNOyWt\nkHTyIYqfAowHnpC0R9IeaiOmE+vKbI9XPun9K+BQ9R3Os8BRI747CtibHWPE8eFjZrk5nBIXEbdH\nxDuohU8ANw4fGlF0K/AiMCUijsleR0XEG+rKTJWkus9/SG3iu1kbgDcNf5B0JPB6avNQu4En6o9n\n7ze8inaswhxOCZN0uqRzJE0EXgCeB4ayw08Cp0rqAYiIJ4AfAP8i6ShJPZJeL+msuipPBD4pabyk\nDwF/DKw+RNvjJB0B9AK9ko6QNDxHeTfwRkkXZGWuAx6JiEez4/8GXCPp2GyS/K+pzYeZ5eZwSttE\n4AZgENhBLVyuzo7dmf1zl6T12fu/BCYAG4Hd1Ca/T6qr70Fql/gHgX8CLoyI0a7GAVxDLQyvAi7K\n3l8DEBFPARdkdeymNtFeP7f1GeAxaqeN/wN8KSLuae6nW9XJi81Vg6SLgb/KThHNkueRk5klyeFk\nZknyaZ2ZJckjJzNLUkseX5EUr7ydpnXKagdg8uRyb3J+3eteV1pbPT3l/Xdqx44dpbW1c+fO0toC\nOHDgQCntDA0NERFj+pe/r68vBgcHc5Vdt27dvRFR6sPbrQonJk6c2IqqDzJuXHmPB5511lmNCxVo\n+fLlpbU1adKkxoUKcuONNzYuVJCbb765tLYA9uzZU0o7+/btG3Mdg4OD9Pf35yqbrURRKj/4a1Zh\nKc85O5zMKmxoaKhxoTZxOJlVVER45GRmaXI4mVmSHE5mliSHk5klyeFkZsmJCF+tM7M0pTxyyvXM\ngqS+bFuiAUlXtbpTZlaO4dsJGr3aoWE4ZfueLQbOB2YBCyXNanXHzKz1OjqcgLnAQERsiYiXgBXA\n/NZ2y8xaLW8wtSuc8sw5TaW2s8ewbdTWjH4FSZcAlxTULzMrQSUmxCNiCbAEoKenJ91ZNjN7WcoT\n4nnCaTswve7ztOw7M+tgqT9bl2fOaS0wU9IMSROobQG0qrXdMrMydPScU0Tsl7QIuJfaBovLIsK7\nt5p1gZRHTrnmnCJiNYfYGdbMOlfHh5OZdR8/vmJmyfLIycyS5HAysyQ5nMwsSQ4nM0uOJ8TNLFmV\nGzlJKm0n3ilTytuI9Oyzzy6tLYBNmzaV1tb69etLa+uII44ora2TTz65tLYAdu3aVUo7RYVKUfVI\n6gO+Su1G7aURccOI4xcDX+L3j77dHBFLD1enR05mFVZEONWt+fZeaquWrJW0KiI2jih6R0Qsyltv\nrpUwzaz7FLieU0vWfHM4mVVYE+E0RVJ/3at+7bbR1nybOkpzF0h6RNJKSdNHOf4KPq0zq7AmrtYN\nRsScMTT1n8C3I+JFSX8D3Aacc7g/8MjJrMIKOq1ruOZbROyKiBezj0uBtzaq1OFkVlEFzjk1XPNN\n0kl1H+cBDS9F+7TOrMKKuFp3qDXfJF0P9EfEKuCTkuYB+4HfAhc3qtfhZFZhBd4vddCabxFxXd37\nq4Grm6nT4WRWYZW7Q9zM0pf6s3V5dvxdJmmnpF+U0SEzK0/KGxzkuVr3TaCvxf0wszZIOZzy7L7y\nY0mntr4rZla2Ssw51W9HLqmoas2shSoRTvXbkff29qb7i80MSH9C3FfrzCqsEiMnM+s8KYdTnlsJ\nvg38L3C6pG2SPtH6bplZGTr9at3CMjpiZuVqZ/Dk4dM6swpzOJlZkny1zsyS5JGTmSXHc05mliyH\nk5klyeFkZkmqXDj19PQwadKkVlR9kBNPPLGUdgCef/750toCuOWWW0pr6/777y+trdmzZ5fW1sDA\nQGltARx//PGltPPkk0+OuQ4/W2dmyarcyMnMOoPDycyS5HAysyQ5nMwsOZ4QN7NkeeRkZklKOZzy\nbA1lZl2qqMXmJPVJ2ixpQNJVhyl3gaSQNKdRnQ4ns4rKG0yNwklSL7AYOB+YBSyUNGuUcpOBy4AH\n8/TP4WRWYQWNnOYCAxGxJSJeAlYA80cp9zngRuCFPH3Ls4b4dEn3SdooaYOky/JUbGbpGxoayvUC\npkjqr3tdUlfNVGBr3edt2Xcvk/QWYHpE/FfevuWZEN8P/H1ErM+GZesk/TAiNuZtxMzS1MSE+GBE\nNJwnGo2kHuAm4OJm/q7hyCkinoiI9dn7vcAmRqSimXWeouacgO3A9LrP07Lvhk0G3giskfQ48GfA\nqkaT4k3dSiDpVGA2o0xo1W9H3tPjqSyzTlDQrQRrgZmSZlALpQXAh+vaeBqYMvxZ0hrgyojoP1yl\nuVNE0iTgu8DlEfHMyOMRsSQi5kTEHIeTWWcoYuQUEfuBRcC91M6svhMRGyRdL2neq+1brpGTpPHU\ngml5RNz1ahszs7QUdRNmRKwGVo/47rpDlD07T50Nw0mSgFuBTRFxU55KzSx9qT9bl+f860zgI8A5\nkh7OXu9rcb/MrASdvh35TwCV0BczK1nKz9b5wV+zCnM4mVmSHE5mlpzUJ8QdTmYV5pGTmSXJ4WRm\nSXI4mVly2nkPUx4OJ7MKq1w4DQ0NsW/fvlZUfZBjjz22lHYAjjnmmNLaArjiiitKa2vBggWltfW1\nr32ttLYmTZpUWlsAO3bsKKWd/fv3F1KPr9aZWXJ8WmdmyXI4mVmSHE5mliSHk5klx4+vmFmyPHIy\nsyQ5nMwsSQ4nM0tSR4eTpCOAHwMTs/IrI+Izre6YmbVWN9yE+SJwTkQ8m20R9RNJ34+In7a4b2bW\nYh19tS5q0fps9nF89ko3bs0st5RHTrm25pXUK+lhYCfww4gYdTtySf2S+lP+wWb2eylvDZUrnCLi\nQES8GZgGzJX0xlHKvLwdeW0fTjNLWd5gSjqchkXEHuA+oK813TGzMhUVTpL6JG2WNCDpqlGO/62k\nn2eb8v5E0qxGdTYMJ0knSDome/8HwHuBRxv21sySV0Q4SeoFFgPnA7OAhaOEz+0R8SfZGdgXgZsa\n9S3P1bqTgNuyDvQA34mI7+X4OzNLXEFX6+YCAxGxBUDSCmA+sHG4QEQ8U1f+SHJcVMtzte4RYHaz\nvTWztDU5nzRFUn/d5yURsSR7PxXYWndsG3DGyAok/R1wBTABOKdRg75D3KzCmginwYiYM8a2FgOL\nJX0YuAb46OHKO5zMKqygK3Hbgel1n6dl3x3KCuCWRpU2dbXOzLpLQVfr1gIzJc2QNAFYAKyqLyBp\nZt3H9wO/bFSpR05mFVXUYnMRsV/SIuBeoBdYFhEbJF0P9EfEKmCRpPcAvwN20+CUDhxOZpVW1A2W\nEbEaWD3iu+vq3l/WbJ0OJ7MKS/lRM4eTWYU5nMwsSZULJ0n09JRzIfCXv2w46d+xNm/eXFpbp512\nWmltXXnllaW1dcMNN5TWFsCePXtKaaeI7ci7YbE5M+tSHb3YnJl1L4+czCxJDiczS47nnMwsWQ4n\nM0uSw8nMkuSrdWaWHM85mVmyHE5mlqSUwyn3MybZxpoPSfLmBmZdIuV965oZOV0GbAKOalFfzKxE\nRS021yp5tyOfRm1pzaWt7Y6ZlakbRk5fAT4FTD5UAUmXAJdk78feMzNruY6ec5L0AWBnRKw7XLmI\nWBIRcyJiTlnLpZjZ2HT6yOlMYJ6k9wFHAEdJ+lZEXNTarplZq3X0yCkiro6IaRFxKrUtX37kYDLr\nfHlHTSmPnMysS6V8ta6pcIqINcCalvTEzEqX8mmdR05mFeZwMrPk+MFfM0tWyuHkG5LMKqyoq3WS\n+iRtljQg6apRjl8haaOkRyT9t6RTGtXpcDKrsKGhoVyvw5HUCywGzgdmAQslzRpR7CFgTkT8KbAS\n+GKjvjmczCqqwPuc5gIDEbElIl4CVgDzR7R1X0Tsyz7+FJjWqFLPOZlVWBNzTlMk9dd9XhIRS7L3\nU4Gtdce2AWccpq5PAN9v1GDHh9OWLVtKa2vlypWltQWwe/fu0tqaOHFiaW29853vLK2t+fPnNy5U\noDVr1pTa3lg1EU6DETFnrO1JugiYA5zVqGzHh5OZvXoFXa3bDkyv+zwt++4VJL0H+EfgrIh4sVGl\nDieziipwsbm1wExJM6iF0gLgw/UFJM0Gvg70RcTOPJU6nMwqrIiRU0Tsl7QIuBfoBZZFxAZJ1wP9\nEbEK+BIwCbgzW+/t1xEx73D1OpzMKqyomzAjYjWwesR319W9f0+zdTqczCos5TvEHU5mFeZwMrPk\n+MFfM0tW1yw2Z2bdxSMnM0tSx4eTpMeBvcABYH8Rt7GbWXt105zTuyNisGU9MbPSdUs4mVmXSXlC\nPO96TgH8QNK6bNvxg0i6RFK/pP6Uf7CZ1XTLvnXviIjtkk4Efijp0Yj4cX2BbG2XJQDjxo1Ld6xo\nZi9L+bQu18gpIrZn/9wJ3E1t5Tsz63Apj5wahpOkIyVNHn4PnAf8otUdM7PWSzmc8pzWvRa4O1vm\nYBxwe0Tc09JemVkpUj6taxhOEbEFeFMJfTGzEhW42FxL+FYCswrr6JGTmXUvh5OZJcnhZGbJ6aZn\n68ysyziczCxJvlpnZkmq3MhJEhMmTGhF1Qc54YQTSmkH4OMf/3hpbQEcd9xxpbX1hS98obS2zjvv\nvNLaeuGFF0prC2D8+PGltJPdFD0mnnMys2Q5nMwsSQ4nM0tSyhPieRebM7MuU+Ric5L6JG2WNCDp\nqlGOv0vSekn7JV2Yp38OJ7MKKyKcJPUCi4HzgVnAQkmzRhT7NXAxcHvevvm0zqzCCppzmgsMZCuY\nIGkFMB/YWNfO49mx3OeRDiezCmsinKZI6q/7vCRbmhtgKrC17tg24Iyx9s3hZFZhTYTTYNn7VTqc\nzCqqwMXmtgPT6z5Py74bE0+Im1VYQVfr1gIzJc2QNAFYAKwaa99yhZOkYyStlPSopE2S3j7Whs2s\n/YoIp4jYDywC7gU2Ad+JiA2Srpc0D0DS2yRtAz4EfF3ShkZ9y3ta91Xgnoi4MEvG1+T8OzNLWFF3\niEfEamD1iO+uq3u/ltrpXm4Nw0nS0cC7qN2jQES8BLzUTCNmlp7UH/zNc1o3A3gK+IakhyQtzfav\newVvR27WeVLety5POI0D3gLcEhGzgeeAg25Pj4glETEnIub09Hie3awTDA0N5Xq1Q54U2QZsi4gH\ns88rqYWVmXW4jh45RcQOYKuk07OvzqXutnQz60xFPvjbCnmv1l0KLM+u1G0BPta6LplZWVKeEM8V\nThHxMFDqretm1nodH05m1p1SvrLucDKrqNTvc3I4mVWYw8nMkuRwMrMkOZzMLEkOJzNLToGLzbWE\nw8mswio3cjpw4AB79+5tRdUHKWLP+LweeOCB0toCuPbaa0tra82aNaW1tWfPntLauvTSS0trC2DC\nhAmltFPUv/eVCycz6wwOJzNLjm/CNLNkOZzMLEm+WmdmSfLIycyS4zknM0uWw8nMkuRwMrMkpTwh\n3nCDA0mnS3q47vWMpMvL6JyZtU7qGxzk2X1lc0S8OSLeDLwV2Afc3fKemVnLFRVOkvokbZY0IOmg\nfS0lTZR0R3b8QUmnNqqz2d0vzwUei4hfNfl3ZpagIsJJUi+wGDgfmAUslDRrRLFPALsj4jTgy8CN\njfrWbDgtAL59iA6+vB15k3WaWZsUNHKaCwxExJaIeAlYAcwfUWY+cFv2fiVwrho8vZw7nLI96+YB\nd452vH478rx1mll7NRFOU4YHH9nrkrpqpgJb6z5vy75jtDIRsR94Gjj+cH1r5mrd+cD6iHiyib8x\ns0Q1udjcYNkDj2ZO6xZyiFM6M+tMBZ3WbQem132eln03ahlJ44CjgV2HqzRXOEk6EngvcFee8mbW\nGQoKp7XATEkzsumfBcCqEWVWAR/N3l8I/CgaVJx3O/LnaHB+aGadp4h7mCJiv6RFwL1AL7AsIjZI\nuh7oj4hVwK3Av0saAH5LLcAOy3eIm1VUkTdYRsRqYPWI766re/8C8KFm6nQ4mVWYn60zsySl/Gyd\nw8mswjxyMrPkeLE5M0uWw8nMkuRwMrMkpTwhrlYkp6SngGaXVZkCDBbemTR062/z72qfUyLihLFU\nIOkear81j8GI6BtLe81qSTi9GpL6u3VFg279bf5d1krNrudkZlYKh5OZJSmlcFrS7g60ULf+Nv8u\na5lk5pzMzOqlNHIyM3uZw8nMkpREODXa86oTSZou6T5JGyVtkHRZu/tUJEm9kh6S9L1296VIko6R\ntFLSo5I2SXp7u/tUVW2fc8r2vPo/assAb6O25OfCiNjY1o6NkaSTgJMiYr2kycA64IOd/ruGSboC\nmAMcFREfaHd/iiLpNuD+iFiaLTn7mojY0+5+VVEKI6c8e151nIh4IiLWZ+/3Aps4eLucjiRpGvB+\nYGm7+1IkSUcD76K2pCwR8ZKDqX1SCKc8e151tGzr5dnAg+3tSWG+AnwKSPfBrFdnBvAU8I3slHVp\ntrmHtUEK4dTVJE0CvgtcHhHPtLs/YyXpA8DOiFjX7r60wDjgLcAtETEbeA7oijnQTpRCOOXZ86oj\nSRpPLZiWR0S3bKt1JjBP0uPUTsHPkfSt9napMNuAbRExPMJdSS2srA1SCKc8e151nGwf+FuBTRFx\nU7v7U5SIuDoipkXEqdT+v/pRRFzU5m4VIiJ2AFslnZ59dS7QFRcwOlHb13M61J5Xbe5WEc4EPgL8\nXNLD2XefzrbQsXRdCizP/kO5BfhYm/tTWW2/lcDMbDQpnNaZmR3E4WRmSXI4mVmSHE5mliSHk5kl\nyeFkZklyOJlZkv4fLYjN52/pbtUAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "jMfcQxhWG6Tm" - }, - "source": [ - "### This is just the beginning\n", - "\n", - "In their paper, [Song et al. (2019)](https://arxiv.org/abs/1907.05600) propose a more sophisticated sampling procedure that can efficiently sample larger images. They also utilize a technique called _Denoising Score Matching_ which can be safely ported even to earthling frameworks like tensorflow and pytorch. Go take a look!\n", - "\n", - "![celeba](https://media.giphy.com/media/jp3MBYHawJi62YoTNI/giphy.gif)\n", - "\n", - "Notebook author: [Denis Mazur](https://github.com/deniskamazur), edited by [Just Heuristic](https://github.com/justheuristic)" - ] - } - ] -} \ No newline at end of file diff --git a/notebooks/vmapped log-probs.ipynb b/notebooks/vmapped log-probs.ipynb deleted file mode 100644 index 20fa4bf15965..000000000000 --- a/notebooks/vmapped log-probs.ipynb +++ /dev/null @@ -1,668 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "vmapped log-probs.ipynb", - "version": "0.3.2", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "6umP1IKf4Dg6" - }, - "source": [ - "# Autobatching log-densities example\n", - "\n", - "This notebook demonstrates a simple Bayesian inference example where autobatching makes user code easier to write, easier to read, and less likely to include bugs.\n", - "\n", - "Inspired by a notebook by @davmre." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "8RZDkfbV3zdR", - "colab": {} - }, - "source": [ - "from __future__ import absolute_import\n", - "from __future__ import division\n", - "from __future__ import print_function\n", - "\n", - "import functools\n", - "import itertools\n", - "import re\n", - "import sys\n", - "import time\n", - "\n", - "from matplotlib.pyplot import *\n", - "\n", - "import jax\n", - "\n", - "from jax import lax\n", - "from jax import numpy as np\n", - "from jax import scipy\n", - "from jax import random\n", - "\n", - "import numpy as onp\n", - "import scipy as oscipy" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "p2VcZS1d34C6" - }, - "source": [ - "# Generate a fake binary classification dataset" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "pq41hMvn4c_i", - "colab": {} - }, - "source": [ - "onp.random.seed(10009)\n", - "\n", - "num_features = 10\n", - "num_points = 100\n", - "\n", - "true_beta = onp.random.randn(num_features).astype(np.float32)\n", - "all_x = onp.random.randn(num_points, num_features).astype(np.float32)\n", - "y = (onp.random.rand(num_points) < oscipy.special.expit(all_x.dot(true_beta))).astype(np.int32)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "O0nVumAw7IlT", - "outputId": "c474098f-4e81-4fc8-ad8f-3ba825409be3", - "colab": { - "height": 102 - } - }, - "source": [ - "y" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0,\n", - " 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,\n", - " 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,\n", - " 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1,\n", - " 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0], dtype=int32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 3 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "DZRVvhpn5aB1" - }, - "source": [ - "# Write the log-joint function for the model\n", - "\n", - "We'll write a non-batched version, a manually batched version, and an autobatched version." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "C_mDXInL7nsP" - }, - "source": [ - "## Non-batched" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "ZHyL2sJh5ajG", - "colab": {} - }, - "source": [ - "def log_joint(beta):\n", - " result = 0.\n", - " # Note that no `axis` parameter is provided to `np.sum`.\n", - " result = result + np.sum(scipy.stats.norm.logpdf(beta, loc=0., scale=1.))\n", - " result = result + np.sum(-np.log(1 + np.exp(-(2*y-1) * np.dot(all_x, beta))))\n", - " return result" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "e51qW0ro6J7C", - "outputId": "c778d4fc-85b9-4fea-9875-0d0a3397a027", - "colab": { - "height": 34 - } - }, - "source": [ - "log_joint(onp.random.randn(num_features))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/Users/mhoffman/mypython/lib/python2.7/site-packages/jax/lib/xla_bridge.py:146: UserWarning: No GPU found, falling back to CPU.\n", - " warnings.warn('No GPU found, falling back to CPU.')\n" - ], - "name": "stderr" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array(-213.23558, dtype=float32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 5 - } - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "fglQXK1Y6wnm", - "outputId": "cf85d9a7-b403-4e75-efb6-b9d057e66f3c", - "colab": { - "height": 895 - } - }, - "source": [ - "# This doesn't work, because we didn't write `log_prob()` to handle batching.\n", - "batch_size = 10\n", - "batched_test_beta = onp.random.randn(batch_size, num_features)\n", - "\n", - "log_joint(onp.random.randn(batch_size, num_features))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "error", - "ename": "ValueError", - "evalue": "Incompatible shapes for broadcasting: ((100, 10), (1, 100))", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mbatched_test_beta\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0monp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_features\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mlog_joint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0monp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_features\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mlog_joint\u001b[0;34m(beta)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Note that no `axis` parameter is provided to `np.sum`.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscipy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnorm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogpdf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbeta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscale\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1.\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_x\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbeta\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/Users/mhoffman/mypython/lib/python2.7/site-packages/jax/numpy/lax_numpy.pyc\u001b[0m in \u001b[0;36m\u001b[0;34m(x, y)\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0mfn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlax_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0m_promote_args_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumpy_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 241\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 242\u001b[0;31m \u001b[0mfn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlax_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0m_promote_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumpy_fn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 243\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_wraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumpy_fn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 244\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/Users/mhoffman/mypython/lib/python2.7/site-packages/jax/numpy/lax_numpy.pyc\u001b[0m in \u001b[0;36m_promote_args\u001b[0;34m(fun_name, *args)\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;34m\"\"\"Convenience function to apply Numpy argument shape and dtype promotion.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0m_check_arraylike\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 179\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_promote_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0m_promote_dtypes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 180\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/Users/mhoffman/mypython/lib/python2.7/site-packages/jax/numpy/lax_numpy.pyc\u001b[0m in \u001b[0;36m_promote_shapes\u001b[0;34m(*args)\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[0mshapes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m \u001b[0mnd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlax\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbroadcast_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mshapes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 140\u001b[0m return [lax.reshape(arg, (1,) * (nd - len(shp)) + shp)\n\u001b[1;32m 141\u001b[0m if len(shp) != nd else arg for arg, shp in zip(args, shapes)]\n", - "\u001b[0;32m/Users/mhoffman/mypython/lib/python2.7/site-packages/jax/util.pyc\u001b[0m in \u001b[0;36mmemoized_fun\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0mcache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpopitem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlast\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 160\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 161\u001b[0;31m \u001b[0mans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 162\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mans\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmemoized_fun\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/Users/mhoffman/mypython/lib/python2.7/site-packages/jax/lax.pyc\u001b[0m in \u001b[0;36mbroadcast_shapes\u001b[0;34m(*shapes)\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0monp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mshapes\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mresult_shape\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mshapes\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m raise ValueError(\"Incompatible shapes for broadcasting: {}\"\n\u001b[0;32m---> 69\u001b[0;31m .format(tuple(map(tuple, shapes))))\n\u001b[0m\u001b[1;32m 70\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult_shape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: Incompatible shapes for broadcasting: ((100, 10), (1, 100))" - ] - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "_lQ8MnKq7sLU" - }, - "source": [ - "## Manually batched" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "2g5-4bQE7gRA", - "colab": {} - }, - "source": [ - "def batched_log_joint(beta):\n", - " result = 0.\n", - " # Here (and below) `sum` needs an `axis` parameter. At best, forgetting to set axis\n", - " # or setting it incorrectly yields an error; at worst, it silently changes the\n", - " # semantics of the model.\n", - " result = result + np.sum(scipy.stats.norm.logpdf(beta, loc=0., scale=1.),\n", - " axis=-1)\n", - " # Note the multiple transposes. Getting this right is not rocket science,\n", - " # but it's also not totally mindless. (I didn't get it right on the first\n", - " # try.)\n", - " result = result + np.sum(-np.log(1 + np.exp(-(2*y-1) * np.dot(all_x, beta.T).T)),\n", - " axis=-1)\n", - " return result" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "KdDMr-Gy85CO", - "outputId": "1e90fc29-60fb-4460-f08f-2dd486cc8f5e", - "colab": { - "height": 68 - } - }, - "source": [ - "batch_size = 10\n", - "batched_test_beta = onp.random.randn(batch_size, num_features)\n", - "\n", - "batched_log_joint(batched_test_beta)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([-147.84033 , -207.02205 , -109.26075 , -243.8083 , -163.02911 ,\n", - " -143.84848 , -160.28772 , -113.77169 , -126.605446, -190.81989 ],\n", - " dtype=float32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 8 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "-uuGlHQ_85kd" - }, - "source": [ - "## Autobatched with vmap\n", - "\n", - "It just works." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "SU20bouH8-Za", - "outputId": "5637b58a-0d7e-4a61-b74a-f4d2cab2105a", - "colab": { - "height": 68 - } - }, - "source": [ - "vmap_batched_log_joint = jax.vmap(log_joint)\n", - "vmap_batched_log_joint(batched_test_beta)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([-147.84033 , -207.02205 , -109.26075 , -243.8083 , -163.02911 ,\n", - " -143.84848 , -160.28772 , -113.77169 , -126.605446, -190.81989 ],\n", - " dtype=float32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 9 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "L1KNBo9y_yZJ" - }, - "source": [ - "# Self-contained variational inference example\n", - "\n", - "A little code is copied from above." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "lQTPaaQMJh8Y" - }, - "source": [ - "## Set up the (batched) log-joint function" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "AITXbaofA3Pm", - "colab": {} - }, - "source": [ - "@jax.jit\n", - "def log_joint(beta):\n", - " result = 0.\n", - " # Note that no `axis` parameter is provided to `np.sum`.\n", - " result = result + np.sum(scipy.stats.norm.logpdf(beta, loc=0., scale=10.))\n", - " result = result + np.sum(-np.log(1 + np.exp(-(2*y-1) * np.dot(all_x, beta))))\n", - " return result\n", - "\n", - "batched_log_joint = jax.jit(jax.vmap(log_joint))" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "UmmFMQ8LJk6a" - }, - "source": [ - "## Define the ELBO and its gradient" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "MJtnskL6BKwV", - "colab": {} - }, - "source": [ - "def elbo(beta_loc, beta_log_scale, epsilon):\n", - " beta_sample = beta_loc + np.exp(beta_log_scale) * epsilon\n", - " return np.mean(batched_log_joint(beta_sample), 0) + np.sum(beta_log_scale - 0.5 * onp.log(2*onp.pi))\n", - "elbo = jax.jit(elbo, static_argnums=(2, 3))\n", - "elbo_val_and_grad = jax.jit(jax.value_and_grad(elbo, argnums=(0, 1)))" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "oQC7xKYnJrp5" - }, - "source": [ - "## Optimize the ELBO using SGD" - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "9JrD5nNgH715", - "outputId": "1b7949cc-1296-46bb-9d88-412475834944", - "colab": { - "height": 1717 - } - }, - "source": [ - "def normal_sample(key, shape):\n", - " \"\"\"Convenience function for quasi-stateful RNG.\"\"\"\n", - " new_key, sub_key = random.split(key)\n", - " return new_key, random.normal(sub_key, shape)\n", - "normal_sample = jax.jit(normal_sample, static_argnums=(1,))\n", - "\n", - "key = random.PRNGKey(10003)\n", - "\n", - "beta_loc = np.zeros(num_features, np.float32)\n", - "beta_log_scale = np.zeros(num_features, np.float32)\n", - "\n", - "step_size = 0.01\n", - "batch_size = 128\n", - "epsilon_shape = (batch_size, num_features)\n", - "for i in range(1000):\n", - " key, epsilon = normal_sample(key, epsilon_shape)\n", - " elbo_val, (beta_loc_grad, beta_log_scale_grad) = elbo_val_and_grad(\n", - " beta_loc, beta_log_scale, epsilon)\n", - " beta_loc += step_size * beta_loc_grad\n", - " beta_log_scale += step_size * beta_log_scale_grad\n", - " if i % 10 == 0:\n", - " print('{}\\t{}'.format(i, elbo_val))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "0\t-180.853881836\n", - "10\t-113.060455322\n", - "20\t-102.737258911\n", - "30\t-99.7873535156\n", - "40\t-98.9089889526\n", - "50\t-98.297454834\n", - "60\t-98.1863174438\n", - "70\t-97.5797195435\n", - "80\t-97.2860031128\n", - "90\t-97.4699630737\n", - "100\t-97.4771728516\n", - "110\t-97.5806732178\n", - "120\t-97.494354248\n", - "130\t-97.5027313232\n", - "140\t-96.8639526367\n", - "150\t-97.4419784546\n", - "160\t-97.0694046021\n", - "170\t-96.8402862549\n", - "180\t-97.2133789062\n", - "190\t-97.5650253296\n", - "200\t-97.2639770508\n", - "210\t-97.1197967529\n", - "220\t-97.395942688\n", - "230\t-97.1683197021\n", - "240\t-97.1184082031\n", - "250\t-97.2434539795\n", - "260\t-97.2978668213\n", - "270\t-96.692855835\n", - "280\t-96.9643859863\n", - "290\t-97.3005523682\n", - "300\t-96.6359176636\n", - "310\t-97.0351867676\n", - "320\t-97.529083252\n", - "330\t-97.2881164551\n", - "340\t-97.0732192993\n", - "350\t-97.1561889648\n", - "360\t-97.2588195801\n", - "370\t-97.1951446533\n", - "380\t-97.1309204102\n", - "390\t-97.1172637939\n", - "400\t-96.9387359619\n", - "410\t-97.2667694092\n", - "420\t-97.353225708\n", - "430\t-97.2100753784\n", - "440\t-97.2843475342\n", - "450\t-97.1630859375\n", - "460\t-97.2612457275\n", - "470\t-97.2134399414\n", - "480\t-97.2399749756\n", - "490\t-97.1491317749\n", - "500\t-97.2352828979\n", - "510\t-96.9342041016\n", - "520\t-97.212097168\n", - "530\t-96.8257751465\n", - "540\t-97.0128479004\n", - "550\t-96.9417648315\n", - "560\t-97.1652069092\n", - "570\t-97.2916564941\n", - "580\t-97.429397583\n", - "590\t-97.2437133789\n", - "600\t-97.1521911621\n", - "610\t-97.4984436035\n", - "620\t-96.9906997681\n", - "630\t-96.8895645142\n", - "640\t-96.8996887207\n", - "650\t-97.1379394531\n", - "660\t-97.4370574951\n", - "670\t-96.9923629761\n", - "680\t-97.1562423706\n", - "690\t-97.1869049072\n", - "700\t-97.1116027832\n", - "710\t-97.7810516357\n", - "720\t-97.2322616577\n", - "730\t-97.1620635986\n", - "740\t-96.9958190918\n", - "750\t-96.6672210693\n", - "760\t-97.1679534912\n", - "770\t-97.5143508911\n", - "780\t-97.2890090942\n", - "790\t-96.9122619629\n", - "800\t-97.1709976196\n", - "810\t-97.290473938\n", - "820\t-97.1624298096\n", - "830\t-97.1910629272\n", - "840\t-97.5638198853\n", - "850\t-97.0019378662\n", - "860\t-96.8655548096\n", - "870\t-96.7633743286\n", - "880\t-96.8366088867\n", - "890\t-97.1217956543\n", - "900\t-97.0955505371\n", - "910\t-97.0682373047\n", - "920\t-97.1194763184\n", - "930\t-96.8792953491\n", - "940\t-97.4562530518\n", - "950\t-96.6928024292\n", - "960\t-97.293762207\n", - "970\t-97.3353042603\n", - "980\t-97.349609375\n", - "990\t-97.0967559814\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "b3ZAe5fJJ2KM" - }, - "source": [ - "## Display the results\n", - "\n", - "Coverage isn't quite as good as we might like, but it's not bad, and nobody said variational inference was exact." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "zt1NBLoVHtOG", - "outputId": "2f0081cf-bbfe-426c-bc5e-a1c09468234a", - "colab": { - "height": 481 - } - }, - "source": [ - "figure(figsize=(7, 7))\n", - "plot(true_beta, beta_loc, '.', label='Approximated Posterior Means')\n", - "plot(true_beta, beta_loc + 2*np.exp(beta_log_scale), 'r.', label='Approximated Posterior $2\\sigma$ Error Bars')\n", - "plot(true_beta, beta_loc - 2*np.exp(beta_log_scale), 'r.')\n", - "plot_scale = 3\n", - "plot([-plot_scale, plot_scale], [-plot_scale, plot_scale], 'k')\n", - "xlabel('True beta')\n", - "ylabel('Estimated beta')\n", - "legend(loc='best')" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 13 - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - } - ] - }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "_bXdOlvUEJl0", - "colab": {} - }, - "source": [ - "" - ], - "execution_count": 0, - "outputs": [] - } - ] -} \ No newline at end of file From d674e1f4bb3c1e33b80ec4897397e18e09e30ea6 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 17 Oct 2019 21:14:56 +0000 Subject: [PATCH 0215/1053] add failing test for #1521 --- tests/lax_test.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/lax_test.py b/tests/lax_test.py index 54727fc9bcdb..baff19a37774 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -2216,6 +2216,19 @@ def testGatherGrad(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): x = rng(shape, dtype) check_grads(gather, (x,), 2, ["fwd", "rev"], 1e-2, 1e-2, 1.) + def testGatherGradIssue1521(self): + gather_indices = onp.array([[[0, 0]], + [[1, 1]]], onp.int32) + dnums = lax.GatherDimensionNumbers(offset_dims=(), + collapsed_slice_dims=(0, 1), + start_index_map=(0, 1)) + slice_sizes = (1, 1) + + def f(x): + return lax.gather(x, gather_indices, dnums, tuple(slice_sizes)) + x = onp.array([[0., 1.]]) + check_grads(f, (x,), 1, ["rev"]) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_idxs={}_update={}_dnums={}".format( jtu.format_shape_dtype_string(arg_shape, dtype), From cc137ced4d89f64f346de207d69ef3ea08f93644 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 17 Oct 2019 22:38:28 +0000 Subject: [PATCH 0216/1053] broadcast arguments in take_along_axis, fixes #1521 --- jax/numpy/lax_numpy.py | 3 ++- tests/lax_numpy_test.py | 10 ++++++++++ tests/lax_test.py | 13 ------------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 435380021cd0..c413818a16d9 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2411,6 +2411,7 @@ def _take_along_axis(arr, indices, axis): if rank != ndim(indices): msg = "indices and arr must have the same number of dimensions; {} vs. {}" raise ValueError(msg.format(ndim(indices), ndim(arr))) + arr, indices = broadcast_arrays(arr, indices) axis = _canonicalize_axis(axis, rank) arr_shape = list(shape(arr)) @@ -3144,4 +3145,4 @@ def _unstack(x): if x.ndim == 0: raise ValueError("Argument to _unstack must be non-scalar") return [lax.index_in_dim(x, i, keepdims=False) for i in range(x.shape[0])] -setattr(DeviceArray, "_unstack", _unstack) \ No newline at end of file +setattr(DeviceArray, "_unstack", _unstack) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index e97d7eec71c1..56f75cd246d8 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1985,6 +1985,16 @@ def testOpGrad(self, op, rng, shapes, dtype, order, tol): def testOpGradSpecialValue(self, op, special_value): check_grads(op, (special_value,), 2, ["fwd", "rev"]) + def testTakeAlongAxisIssue1521(self): + # https://github.com/google/jax/issues/1521 + idx = lnp.repeat(lnp.arange(3), 10).reshape((30, 1)) + + def f(x): + y = x * lnp.arange(3.).reshape((1, 3)) + return lnp.take_along_axis(y, idx, -1).sum() + + check_grads(f, (1.,), order=1) + if __name__ == "__main__": absltest.main() diff --git a/tests/lax_test.py b/tests/lax_test.py index baff19a37774..54727fc9bcdb 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -2216,19 +2216,6 @@ def testGatherGrad(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): x = rng(shape, dtype) check_grads(gather, (x,), 2, ["fwd", "rev"], 1e-2, 1e-2, 1.) - def testGatherGradIssue1521(self): - gather_indices = onp.array([[[0, 0]], - [[1, 1]]], onp.int32) - dnums = lax.GatherDimensionNumbers(offset_dims=(), - collapsed_slice_dims=(0, 1), - start_index_map=(0, 1)) - slice_sizes = (1, 1) - - def f(x): - return lax.gather(x, gather_indices, dnums, tuple(slice_sizes)) - x = onp.array([[0., 1.]]) - check_grads(f, (x,), 1, ["rev"]) - @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_idxs={}_update={}_dnums={}".format( jtu.format_shape_dtype_string(arg_shape, dtype), From aa0692d30774c1fb4cc5cd6e706703b3c835bbec Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 17 Oct 2019 23:23:08 +0000 Subject: [PATCH 0217/1053] improve broadcast_to, add error checks (fixes #1522) --- jax/numpy/lax_numpy.py | 29 +++++++++++++---------------- tests/lax_numpy_test.py | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 435380021cd0..0f74e66df0b1 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -889,23 +889,20 @@ def broadcast_arrays(*args): def broadcast_to(arr, shape): """Like Numpy's broadcast_to but doesn't necessarily return views.""" arr = arr if isinstance(arr, ndarray) or isscalar(arr) else array(arr) - shape = tuple(map(int, shape)) - if _shape(arr) != shape: - # TODO(mattjj): revise this to call lax.broadcast_in_dim rather than - # lax.broadcast and lax.transpose - lax.broadcast_shapes(shape, _shape(arr)) # error checking - nlead = len(shape) - len(_shape(arr)) - diff, = onp.where(onp.not_equal(shape[nlead:], _shape(arr))) - + shape = tuple(map(int, shape)) # check that shape is concrete + arr_shape = _shape(arr) + if arr_shape == shape: + return arr + else: + nlead = len(shape) - len(arr_shape) + compatible = onp.equal(arr_shape, shape[nlead:]) | onp.equal(arr_shape, 1) + if nlead < 0 or not onp.all(compatible): + msg = "Incompatible shapes for broadcasting: {} and requested shape {}" + raise ValueError(msg.format(arr_shape, shape)) + diff, = onp.where(onp.not_equal(shape[nlead:], arr_shape)) new_dims = tuple(range(nlead)) + tuple(nlead + diff) kept_dims = tuple(onp.delete(onp.arange(len(shape)), new_dims)) - perm = onp.argsort(new_dims + kept_dims) - - broadcast_dims = onp.take(shape, new_dims) - squeezed_array = squeeze(arr, diff) - return lax.transpose(lax.broadcast(squeezed_array, broadcast_dims), perm) - else: - return arr + return lax.broadcast_in_dim(squeeze(arr, diff), shape, kept_dims) @_wraps(onp.split) @@ -3144,4 +3141,4 @@ def _unstack(x): if x.ndim == 0: raise ValueError("Argument to _unstack must be non-scalar") return [lax.index_in_dim(x, i, keepdims=False) for i in range(x.shape[0])] -setattr(DeviceArray, "_unstack", _unstack) \ No newline at end of file +setattr(DeviceArray, "_unstack", _unstack) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index e97d7eec71c1..23f856571ed0 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1230,7 +1230,6 @@ def f(x): f(arr) - def testNonArrayErrorMessage(self): x = [1., 2.] y = onp.array([3., 4.]) @@ -1931,6 +1930,27 @@ def body(i, xy): any(onp.array_equal(x, onp.full((3, 4), 2., dtype=onp.float32)) for x in consts)) + @parameterized.named_parameters( + {"testcase_name": "_from={}_to={}".format(from_shape, to_shape), + "rng": rng, "from_shape": from_shape, "to_shape": to_shape} + for from_shape, to_shape in [ + [(1, 3), (4, 3)], + [(3,), (2, 1, 3)], + [(3,), (3, 3)], + [(1,), (3,)], + ] + for rng in [jtu.rand_default()]) + def testBroadcastTo(self, from_shape, to_shape, rng): + args_maker = self._GetArgsMaker(rng, [from_shape], [onp.float32]) + onp_op = lambda x: onp.broadcast_to(x, to_shape) + lnp_op = lambda x: lnp.broadcast_to(x, to_shape) + self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + + def testBroadcastToIssue1522(self): + self.assertRaisesRegex( + ValueError, "Incompatible shapes for broadcasting: .*", + lambda: lnp.broadcast_to(onp.ones((2, 3)), (1, 3))) # Most grad tests are at the lax level (see lax_test.py), but we add some here # as needed for e.g. particular compound ops of interest. From 1090e89a86147a5ce326db68149677027b9bb0ef Mon Sep 17 00:00:00 2001 From: Karthik Kumara Date: Thu, 17 Oct 2019 16:00:35 -0700 Subject: [PATCH 0218/1053] - sign missing from loss function definition --- examples/resnet50.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/resnet50.py b/examples/resnet50.py index 770ecc7fd0ac..211176fd2e23 100644 --- a/examples/resnet50.py +++ b/examples/resnet50.py @@ -101,7 +101,7 @@ def ResNet50(num_classes): def loss(params, batch): inputs, targets = batch logits = predict_fun(params, inputs) - return np.sum(logits * targets) + return -np.sum(logits * targets) def accuracy(params, batch): inputs, targets = batch From ae26cfb0e8e4e241d351593bf4f2cbf2cad5937f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 18 Oct 2019 15:36:53 -0400 Subject: [PATCH 0219/1053] Remove stale "running the tests" link. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 7e2aae951ee4..fde1d0ba6b4f 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,6 @@ open](https://github.com/google/jax) by a growing number of ### Contents * [Quickstart: Colab in the Cloud](#quickstart-colab-in-the-cloud) * [Installation](#installation) -* [Running the tests](#running-the-tests) * [Reference documentation](#reference-documentation) * [A brief tour](#a-brief-tour) * [What's supported](#whats-supported) From a0352f3969955b2dae0f0151506c4fe594ba1718 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 18 Oct 2019 22:50:24 +0000 Subject: [PATCH 0220/1053] fix up broadcasting in take_along_axis --- jax/numpy/lax_numpy.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index c413818a16d9..ff0a42dbaa2d 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2405,20 +2405,27 @@ def _take_along_axis(arr, indices, axis): if axis is None: if ndim(indices) != 1: msg = "take_along_axis indices must be 1D if axis=None, got shape {}" - raise ValueError(msg.format(shape(indices))) + raise ValueError(msg.format(indices.shape)) return take_along_axis(arr.ravel(), indices, 0) rank = ndim(arr) if rank != ndim(indices): msg = "indices and arr must have the same number of dimensions; {} vs. {}" raise ValueError(msg.format(ndim(indices), ndim(arr))) - arr, indices = broadcast_arrays(arr, indices) axis = _canonicalize_axis(axis, rank) - arr_shape = list(shape(arr)) - axis_size = arr_shape[axis] - arr_shape[axis] = 1 - idx_shape = shape(indices) - out_shape = lax.broadcast_shapes(idx_shape, tuple(arr_shape)) + def replace(tup, val): + lst = list(tup) + lst[axis] = val + return tuple(lst) + + bcast_shape = lax.broadcast_shapes(replace(arr.shape, 1), replace(indices.shape, 1)) + indices = broadcast_to(indices, replace(bcast_shape, indices.shape[axis])) + arr = broadcast_to(arr, replace(bcast_shape, arr.shape[axis])) + + axis_size = arr.shape[axis] + arr_shape = replace(arr.shape, 1) + idx_shape = indices.shape + out_shape = lax.broadcast_shapes(idx_shape, arr_shape) index_dims = [i for i, idx in enumerate(idx_shape) if i == axis or idx != 1] From 5ecb2478925308869b6e2fc0edbc25ef188e5efb Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Fri, 18 Oct 2019 18:15:57 -0700 Subject: [PATCH 0221/1053] Fix momentum optimizer The implementation of SGD with momentum in optimizers.py was wrong. Thanks to @sschoenholz for noticing! For background, there are two common parameterizations of ordinary momentum: - TensorFlow and Keras use `v = mu * v - eta * g; x = x + v` (which expands to e.g. `x3 = x0 - (eta0*mu^2 + eta0*mu + eta0)*g0 - (eta1*mu + eta1)*g1 - eta2*g2`) - PyTorch and Sonnet use `v = mu * v + g; x = x - eta * v` (which expands to `x3 = x0 - (eta2*mu^2 + eta1*mu + eta0)*g0 - (eta2*mu + eta1)*g1 - eta2*g2 + x0`) Other than their representation of internal state `v`, those expansions show that these two formulas only differ in how they're affected by changing learning rates. (There are two analogous implementations for Nesterov momentum, again equivalent other than learning rate changes.) The version of momentum in optimizers.py wasn't equivalent to any of these four (see https://cocalc.com/projects/c76fe1fe-6c09-4ff6-8666-c3556f3ea62d/files/2019-10-18-174244.sagews?session=default for derivations) --- jax/experimental/optimizers.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jax/experimental/optimizers.py b/jax/experimental/optimizers.py index 0d74dc39936c..7884b8449aa7 100644 --- a/jax/experimental/optimizers.py +++ b/jax/experimental/optimizers.py @@ -200,8 +200,8 @@ def get_params(x): return init, update, get_params @optimizer -def momentum(step_size, mass): - """Construct optimizer triple for SGD with Nesterov momentum. +def momentum(step_size, mass, nesterov=False): + """Construct optimizer triple for SGD with (optionally) Nesterov momentum. Args: step_size: positive scalar, or a callable representing a step size schedule @@ -216,8 +216,9 @@ def init(x0): return x0, v0 def update(i, g, state): x, velocity = state - velocity = mass * velocity - (1. - mass) * g - x = x + step_size(i) * velocity + velocity = mass * velocity + g + d = mass * velocity + g if nesterov else velocity + x = x - step_size(i) * d return x, velocity def get_params(state): x, _ = state From 8a132b41093018e818bfa63b836c573029731f8a Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 16 Oct 2019 01:35:39 +0000 Subject: [PATCH 0222/1053] try simplifying random.multivariate_normal api --- jax/random.py | 50 +++++++++++++++++++---------------------- tests/random_test.py | 53 +++++++++++++++++++++----------------------- 2 files changed, 48 insertions(+), 55 deletions(-) diff --git a/jax/random.py b/jax/random.py index ece2139e0200..d6066b3c7930 100644 --- a/jax/random.py +++ b/jax/random.py @@ -419,41 +419,37 @@ def _normal(key, shape, dtype): return onp.array(onp.sqrt(2), dtype) * lax.erf_inv(u) -def multivariate_normal(key, mean=0.0, cov=1.0, shape=(), dtype=onp.float64): +def multivariate_normal(key, mean, cov, dtype=onp.float64): + if onp.ndim(mean) != 1: + msg = "multivariate_normal requires mean.ndim == 1, got mean.ndim == {}" + raise ValueError(msg.format(onp.ndim(mean))) + n, = onp.shape(mean) + if onp.shape(cov) != (n, n): + msg = ("multivariate_normal requires cov.shape == (n, n) == ({n}, {n}) for " + "mean.shape == (n,) == ({n},), but got cov.shape == {shape}.") + raise ValueError(msg.format(n=n, shape=onp.shape(cov))) + dtype = xla_bridge.canonicalize_dtype(dtype) - return _multivariate_normal(key, mean, cov, shape, dtype) + return _multivariate_normal(key, mean, cov, dtype) -@partial(jit, static_argnums=(3, 4)) -def _multivariate_normal(key, mean, cov, shape, dtype): - """Sample multivariate normal random values with given shape, mean, and covariance. +@partial(jit, static_argnums=(3,)) +def _multivariate_normal(key, mean, cov, dtype): + """Sample multivariate normal random values with given mean and covariance. Args: key: a PRNGKey used as the random key. - mean: optional, a scalar or array of mean values along each dimension - cov: optional, a scalar (isotropic), vector (diagonal covariance matrix), or full covariance matrix - shape: optional, a tuple of nonnegative integers representing the shape. + mean: a mean vector of shape (n,). + cov: a positive definite covariance matrix of shape (n, n). + dtype: optional, a float dtype for the returned values (default float64 if + jax_enable_x64 is true, otherwise float32). Returns: - A random array with latent dimension of (max(asarray(mean).ndim, asarray(cov).ndim)),) + A random vector of shape (n,) and the specified dtype. """ - _check_shape("multivariate_normal", shape) - if hasattr(mean, "shape") and mean.ndim > 1: - raise ValueError("Mean cannot have more than 1 dimension.") - if hasattr(cov, "shape") and cov.ndim > 0: - if cov.ndim > 2: - raise ValueError("Covariance matrix cannot have more than 2 dimensions.") - shape = shape + cov.shape[:1] - normal_samples = normal(key, shape, dtype) - if cov.ndim == 2: - samples = np.tensordot(normal_samples, cholesky(cov), axes=1) - else: - samples = normal_samples * np.sqrt(cov) - else: - if hasattr(mean, "shape") and mean.ndim > 0: - shape = shape + mean.shape[:1] - normal_samples = normal(key, shape, dtype) - samples = np.sqrt(cov) * normal_samples - return samples + mean + n, = mean.shape + chol_factor = cholesky(cov) + normal_samples = normal(key, (n,), dtype) + return lax.dot(chol_factor, normal_samples) + mean def truncated_normal(key, lower, upper, shape=(), dtype=onp.float64): diff --git a/tests/random_test.py b/tests/random_test.py index 506645ac545d..a8a076c6de00 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -16,8 +16,8 @@ from __future__ import division from __future__ import print_function +from functools import partial from unittest import SkipTest -import re from absl.testing import absltest from absl.testing import parameterized @@ -367,35 +367,32 @@ def testT(self, df, dtype): self._CheckKolmogorovSmirnovCDF(samples, scipy.stats.t(df).cdf) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_mean={}_cov={}_{}".format(mean, cov, dtype), - "mean": mean, "cov": cov, "dtype": dtype} - for mean in [0, 5, np.asarray([1, -2, 3]), np.asarray([[1]])] - for cov in [.1, 5, np.asarray([4, 5, 6]), - np.asarray([[4.60, 2.86, 2.33], - [2.86, 3.04, 1.74], - [2.33, 1.74, 1.83]]), - np.asarray([[[1]]])] + {"testcase_name": "_{}D_{}".format(dim, onp.dtype(dtype).name), + "dim": dim, "dtype": dtype} + for dim in [1, 3, 5] for dtype in [onp.float32, onp.float64])) - def testMultivariateNormal(self, mean, cov, dtype): - key = random.PRNGKey(0) - rand = lambda key, mean, cov: random.multivariate_normal(key, mean, cov, (1000,), dtype) + def testMultivariateNormal(self, dim, dtype): + r = onp.random.RandomState(dim) + mean = r.randn(dim) + cov_factor = r.randn(dim, dim) + cov = onp.dot(cov_factor, cov_factor.T) + dim * onp.eye(dim) + + keys = random.split(random.PRNGKey(0), 1000) + rand = api.vmap(partial(random.multivariate_normal, mean=mean, cov=cov)) crand = api.jit(rand) - if hasattr(cov, "shape") and cov.ndim > 2 or hasattr(mean, "shape") and mean.ndim > 1: - self.assertRaises(ValueError, lambda: rand(key, mean, cov)) - self.assertRaises(ValueError, lambda: crand(key, mean, cov)) - return - - uncompiled_samples = rand(key, mean, cov) - compiled_samples = crand(key, mean, cov) - if hasattr(cov, "shape") and cov.ndim == 2: - inv_scale = scipy.linalg.lapack.dtrtri(onp.linalg.cholesky(cov), lower=True)[0] - rescale = lambda x: onp.tensordot(x, inv_scale, axes=(-1, 1)) - else: - rescale = lambda x: x / np.sqrt(cov) + + uncompiled_samples = rand(keys) + compiled_samples = crand(keys) + + # This is a quick-and-dirty multivariate normality check that tests that a + # uniform mixture of the marginals along the covariance matrix's + # eigenvectors follow a standard normal distribution. + # TODO(mattjj); check for correlations, maybe use a more sophisticated test. + inv_scale = scipy.linalg.lapack.dtrtri(onp.linalg.cholesky(cov), lower=True)[0] for samples in [uncompiled_samples, compiled_samples]: - self._CheckKolmogorovSmirnovCDF( - rescale(samples - mean).reshape(-1), - scipy.stats.norm().cdf) + centered = samples - mean + whitened = onp.einsum('nj,ij->ni', centered, inv_scale) + self._CheckKolmogorovSmirnovCDF(whitened.ravel(), scipy.stats.norm().cdf) def testIssue222(self): x = random.randint(random.PRNGKey(10003), (), 0, 0) @@ -417,7 +414,7 @@ def feature_map(n, d, sigma=1.0, seed=123): phi = lambda x, t: np.sqrt(2.0 / d) * np.cos(np.matmul(W, x) + w*t + b) return phi - self.assertRaisesRegex(ValueError, re.compile(r'.*requires a concrete.*'), + self.assertRaisesRegex(ValueError, '.*requires a concrete.*', lambda: feature_map(5, 3)) def testIssue756(self): From ab6ac6c876968bc6b4a9b76ead4c8289ff733250 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 17 Oct 2019 20:36:51 +0000 Subject: [PATCH 0223/1053] standardize shape handling in jax.random --- jax/random.py | 194 +++++++++++++++++++++++-------------------- tests/random_test.py | 8 +- 2 files changed, 108 insertions(+), 94 deletions(-) diff --git a/jax/random.py b/jax/random.py index d6066b3c7930..5e2e525f267f 100644 --- a/jax/random.py +++ b/jax/random.py @@ -240,12 +240,19 @@ def _random_bits(key, bit_width, shape): ### random samplers -def _check_shape(name, shape): +def _check_shape(name, shape, *param_shapes): try: shape = tuple(map(int, shape)) except TypeError: msg = "{} requires a concrete tuple of integers as shape argument, got {}." raise ValueError(msg.format(name, shape)) + if param_shapes: + shape_ = lax.broadcast_shapes(shape, *param_shapes) + if shape != shape_: + msg = ("{} parameter shapes must be broadcast-compatible with shape " + "argument, and the result of broadcasting the shapes must equal " + "the shape argument, but got result {} for shape argument {}.") + raise ValueError(msg.format(name, shape_, shape)) def uniform(key, shape=(), dtype=onp.float64, minval=0., maxval=1.): @@ -253,7 +260,8 @@ def uniform(key, shape=(), dtype=onp.float64, minval=0., maxval=1.): Args: key: a PRNGKey used as the random key. - shape: a tuple of nonnegative integers representing the shape. + shape: optional, a tuple of nonnegative integers representing the result + shape. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). minval: optional, a minimum (inclusive) value for the range (default 0). @@ -302,7 +310,7 @@ def randint(key, shape, minval, maxval, dtype=onp.int64): shape: a tuple of nonnegative integers representing the shape. minval: int or array of ints broadcast-compatible with ``shape``, a minimum (inclusive) value for the range. - maxval: int or array of ints broadcast-compatible with ``shape``, a maximum + maxval: int or array of ints broadcast-compatible with ``shape``, a maximum (exclusive) value for the range. dtype: optional, an int dtype for the returned values (default int64 if jax_enable_x64 is true, otherwise int32). @@ -315,7 +323,7 @@ def randint(key, shape, minval, maxval, dtype=onp.int64): @partial(jit, static_argnums=(1, 4)) def _randint(key, shape, minval, maxval, dtype): - _check_shape("randint", shape) + _check_shape("randint", shape, minval.shape, maxval.shape) if not onp.issubdtype(dtype, onp.integer): raise TypeError("randint only accepts integer dtypes.") @@ -400,7 +408,8 @@ def normal(key, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - shape: a tuple of nonnegative integers representing the shape. + shape: optional, a tuple of nonnegative integers representing the result + shape. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -419,37 +428,46 @@ def _normal(key, shape, dtype): return onp.array(onp.sqrt(2), dtype) * lax.erf_inv(u) -def multivariate_normal(key, mean, cov, dtype=onp.float64): - if onp.ndim(mean) != 1: - msg = "multivariate_normal requires mean.ndim == 1, got mean.ndim == {}" - raise ValueError(msg.format(onp.ndim(mean))) - n, = onp.shape(mean) - if onp.shape(cov) != (n, n): - msg = ("multivariate_normal requires cov.shape == (n, n) == ({n}, {n}) for " - "mean.shape == (n,) == ({n},), but got cov.shape == {shape}.") - raise ValueError(msg.format(n=n, shape=onp.shape(cov))) - - dtype = xla_bridge.canonicalize_dtype(dtype) - return _multivariate_normal(key, mean, cov, dtype) - -@partial(jit, static_argnums=(3,)) -def _multivariate_normal(key, mean, cov, dtype): +def multivariate_normal(key, mean, cov, shape=(), dtype=onp.float64): """Sample multivariate normal random values with given mean and covariance. Args: key: a PRNGKey used as the random key. - mean: a mean vector of shape (n,). - cov: a positive definite covariance matrix of shape (n, n). + mean: a mean vector of shape ``(..., n)``. + cov: a positive definite covariance matrix of shape ``(..., n, n)``. The + shape prefix ``...`` must be broadcast-compatible with that of ``mean``. + shape: optional, a tuple of nonnegative integers specifying the result + batch shape; that is, the prefix of the result shape excluding the last + element of value ``n``. Must be broadcast-compatible with + ``mean.shape[:-1]`` and ``cov.shape[:-2]``. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: - A random vector of shape (n,) and the specified dtype. + A random array with the specified dtype and shape given by + ``shape + (mean.shape[-1],)``. """ - n, = mean.shape + dtype = xla_bridge.canonicalize_dtype(dtype) + return _multivariate_normal(key, mean, cov, shape, dtype) + +@partial(jit, static_argnums=(3, 4)) +def _multivariate_normal(key, mean, cov, shape, dtype): + if not onp.ndim(mean) >= 1: + msg = "multivariate_normal requires mean.ndim >= 1, got mean.ndim == {}" + raise ValueError(msg.format(onp.ndim(mean))) + if not onp.ndim(cov) >= 2: + msg = "multivariate_normal requires cov.ndim >= 2, got cov.ndim == {}" + raise ValueError(msg.format(onp.ndim(cov))) + n = mean.shape[-1] + if onp.shape(cov)[-2:] != (n, n): + msg = ("multivariate_normal requires cov.shape == (..., n, n) for n={n}, " + "but got cov.shape == {shape}.") + raise ValueError(msg.format(n=n, shape=onp.shape(cov))) + + _check_shape("normal", shape, mean.shape[:-1], mean.shape[:-2]) chol_factor = cholesky(cov) - normal_samples = normal(key, (n,), dtype) - return lax.dot(chol_factor, normal_samples) + mean + normal_samples = normal(key, shape + mean.shape[-1:], dtype) + return mean + np.tensordot(normal_samples, chol_factor, [-1, 1]) def truncated_normal(key, lower, upper, shape=(), dtype=onp.float64): @@ -457,9 +475,12 @@ def truncated_normal(key, lower, upper, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - lower: a floating-point lower bound for truncation. - upper: a floating-point upper bound for truncation. - shape: a tuple of nonnegative integers representing the shape. + lower: a float or array of lower bound for truncation. Must be + broadcast-compatible with `upper`. + upper: a floating-point upper bound for truncation. Must be + broadcast-compatible with `lower`. + shape: optional, a tuple of nonnegative integers specifying the result + shape. Must be broadcast-compatible with `lower` and `upper`. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -471,7 +492,7 @@ def truncated_normal(key, lower, upper, shape=(), dtype=onp.float64): @partial(jit, static_argnums=(3, 4)) def _truncated_normal(key, lower, upper, shape, dtype): - _check_shape("truncated_normal", shape) + _check_shape("truncated_normal", shape, lower.shape, upper.shape) sqrt2 = onp.array(onp.sqrt(2), dtype) a = lax.erf(lax.convert_element_type(lower, dtype) / sqrt2) b = lax.erf(lax.convert_element_type(upper, dtype) / sqrt2) @@ -486,10 +507,10 @@ def bernoulli(key, p=onp.float32(0.5), shape=()): Args: key: a PRNGKey used as the random key. - p: optional, an array-like of floating dtype broadcastable to `shape` for - the mean of the random variables (default 0.5). - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + p: optional, a float or array of floats for the mean of the random + variables. Must be broadcast-compatible with ``shape``. Default 0.5. + shape: optional, a tuple of nonnegative integers representing the shape. + Default (). Returns: A random array with the specified shape and boolean dtype. @@ -503,11 +524,8 @@ def bernoulli(key, p=onp.float32(0.5), shape=()): @partial(jit, static_argnums=(2,)) def _bernoulli(key, p, shape): - _check_shape("bernoulli", shape) - shape = shape or onp.shape(p) - if onp.shape(p) != shape: - p = np.broadcast_to(p, shape) - return lax.lt(uniform(key, shape, lax.dtype(p)), p) + _check_shape("bernoulli", shape, p.shape) + return uniform(key, shape, lax.dtype(p)) < p def beta(key, a, b, shape=(), dtype=onp.float64): @@ -515,12 +533,12 @@ def beta(key, a, b, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - a: an array-like broadcastable to `shape` and used as the shape parameter - alpha of the random variables. - b: an array-like broadcastable to `shape` and used as the shape parameter - beta of the random variables. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + a: a float or array of floats broadcast-compatible with ``shape`` + representing the first parameter "alpha". + b: a float or array of floats broadcast-compatible with ``shape`` + representing the second parameter "beta". + shape: optional, a tuple of nonnegative integers specifying the result + shape. Must be broadcast-compatible with ``a`` and ``b``. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -532,10 +550,9 @@ def beta(key, a, b, shape=(), dtype=onp.float64): @partial(jit, static_argnums=(3, 4)) def _beta(key, a, b, shape, dtype): - _check_shape("beta", shape) + _check_shape("beta", shape, a.shape, b.shape) a = lax.convert_element_type(a, dtype) b = lax.convert_element_type(b, dtype) - shape = shape or lax.broadcast_shapes(np.shape(a), np.shape(b)) key_a, key_b = split(key) gamma_a = gamma(key_a, a, shape, dtype) gamma_b = gamma(key_b, b, shape, dtype) @@ -547,8 +564,8 @@ def cauchy(key, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + shape: optional, a tuple of nonnegative integers representing the result + shape. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -571,24 +588,30 @@ def dirichlet(key, alpha, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - alpha: an array-like with `alpha.shape[:-1]` broadcastable to `shape` and - used as the concentration parameter of the random variables. - shape: optional, a tuple of nonnegative integers representing the batch - shape (defaults to `alpha.shape[:-1]`). + alpha: an array of shape ``(..., n)`` used as the concentration + parameter of the random variables. + shape: optional, a tuple of nonnegative integers specifying the result + batch shape; that is, the prefix of the result shape excluding the last + element of value ``n``. Must be broadcast-compatible with + ``alpha.shape[:-1]``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: - A random array with the specified shape and dtype. + A random array with the specified dtype and shape given by + ``shape + (alpha.shape[-1],)``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _dirichlet(key, alpha, shape, dtype) @partial(jit, static_argnums=(2, 3)) def _dirichlet(key, alpha, shape, dtype): - _check_shape("dirichlet", shape) - alpha = asarray(alpha, dtype) - shape = shape or alpha.shape[:-1] + if not onp.ndim(alpha) >= 1: + msg = "dirichlet requires alpha.ndim >= 1, got alpha.ndim == {}" + raise ValueError(msg.format(onp.ndim(alpha))) + + _check_shape("dirichlet", shape, alpha.shape[:-1]) + alpha = lax.convert_element_type(alpha, dtype) gamma_samples = gamma(key, alpha, shape + alpha.shape[-1:], dtype) return gamma_samples / np.sum(gamma_samples, axis=-1, keepdims=True) @@ -598,8 +621,8 @@ def exponential(key, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + shape: optional, a tuple of nonnegative integers representing the result + shape. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -672,7 +695,6 @@ def _next_kxv(kxv): z = lax.mul(lax.mul(d, V), boost) return lax.select(lax.eq(z, zero), onp.finfo(z.dtype).tiny, z) - _bivariate_coef = [[0.16009398, -0.094634816, 0.025146379, -0.0030648348, 1, 0.3266811, 0.10406087, 0.0014179033], [0.53487893, 0.12980707, 0.06573594, -0.0015649787, @@ -680,7 +702,6 @@ def _next_kxv(kxv): [0.040121005, -0.0065914079, -0.002628604, -0.0013441777, 0.017050642, -0.0021309345, 0.00085092385, -1.5248239e-07]] - def _gamma_grad_one(z, alpha): # Ref 1: Pathwise Derivatives Beyond the Reparameterization Trick, Martin & Fritz # Ref 2: Case 4 follows https://github.com/fritzo/notebooks/blob/master/gamma-reparameterized.ipynb @@ -776,14 +797,12 @@ def _case4(zagf): _, _, grad, flag = lax.while_loop(lambda zagf: ~zagf[3], _case4, (z, alpha, grad, flag)) return grad - def _gamma_grad(sample, a): samples = np.reshape(sample, -1) alphas = np.reshape(a, -1) grads = vmap(_gamma_grad_one)(samples, alphas) return grads.reshape(a.shape) - @custom_transforms def _gamma_impl(key, a): alphas = np.reshape(a, -1) @@ -791,20 +810,18 @@ def _gamma_impl(key, a): samples = vmap(_gamma_one)(keys, alphas) return np.reshape(samples, np.shape(a)) - defjvp(_gamma_impl, None, lambda tangent, ans, key, a, **kwargs: tangent * _gamma_grad(ans, a)) - def gamma(key, a, shape=(), dtype=onp.float64): """Sample Gamma random values with given shape and float dtype. Args: key: a PRNGKey used as the random key. - a: an array-like broadcastable to `shape` and used as the shape parameter - of the random variables. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + a: a float or array of floats broadcast-compatible with ``shape`` + representing the parameter of the distribution. + shape: optional, a tuple of nonnegative integers specifying the result + shape. Must be broadcast-compatible with ``a``. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -816,9 +833,8 @@ def gamma(key, a, shape=(), dtype=onp.float64): @partial(jit, static_argnums=(2, 3)) def _gamma(key, a, shape, dtype): - _check_shape("gamma", shape) + _check_shape("gamma", shape, a.shape) a = lax.convert_element_type(a, dtype) - shape = shape or onp.shape(a) if onp.shape(a) != shape: a = np.broadcast_to(a, shape) return _gamma_impl(key, a) @@ -829,8 +845,8 @@ def gumbel(key, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + shape: optional, a tuple of nonnegative integers representing the result + shape. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -852,8 +868,8 @@ def laplace(key, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + shape: optional, a tuple of nonnegative integers representing the result + shape. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -876,8 +892,8 @@ def logistic(key, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + shape: optional, a tuple of nonnegative integers representing the result + shape. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -898,10 +914,10 @@ def pareto(key, b, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - b: an array-like broadcastable to `shape` and used as the shape parameter - of the random variables. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + a: a float or array of floats broadcast-compatible with ``shape`` + representing the parameter of the distribution. + shape: optional, a tuple of nonnegative integers specifying the result + shape. Must be broadcast-compatible with ``b``. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -915,11 +931,8 @@ def pareto(key, b, shape=(), dtype=onp.float64): def _pareto(key, b, shape, dtype): _check_shape("pareto", shape) b = lax.convert_element_type(b, dtype) - shape = shape or onp.shape(b) - if onp.shape(b) != shape: - b = np.broadcast_to(b, shape) e = exponential(key, shape, dtype) - return lax.exp(lax.div(e, b)) + return lax.exp(e / b) def t(key, df, shape=(), dtype=onp.float64): @@ -927,10 +940,10 @@ def t(key, df, shape=(), dtype=onp.float64): Args: key: a PRNGKey used as the random key. - df: an array-like broadcastable to `shape` and used as the shape parameter - of the random variables. - shape: optional, a tuple of nonnegative integers representing the shape - (default scalar). + df: a float or array of floats broadcast-compatible with ``shape`` + representing the parameter of the distribution. + shape: optional, a tuple of nonnegative integers specifying the result + shape. Must be broadcast-compatible with ``df``. Default (). dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). @@ -942,9 +955,8 @@ def t(key, df, shape=(), dtype=onp.float64): @partial(jit, static_argnums=(2, 3)) def _t(key, df, shape, dtype): - _check_shape("t", shape) + _check_shape("t", shape, df.shape) df = lax.convert_element_type(df, dtype) - shape = shape or onp.shape(df) key_n, key_g = split(key) n = normal(key_n, shape, dtype) two = _constant_like(n, 2) diff --git a/tests/random_test.py b/tests/random_test.py index a8a076c6de00..80d08415fcce 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -218,7 +218,9 @@ def testCauchy(self, dtype): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_alpha={}_{}".format(alpha, dtype), "alpha": alpha, "dtype": onp.dtype(dtype).name} - for alpha in [[0.2, 1., 5.]] + for alpha in [ + onp.array([0.2, 1., 5.]), + ] for dtype in [onp.float32, onp.float64])) def testDirichlet(self, alpha, dtype): key = random.PRNGKey(0) @@ -275,8 +277,8 @@ def testGammaShape(self): def testGammaGrad(self, alpha): rng = random.PRNGKey(0) alphas = onp.full((100,), alpha) - z = random.gamma(rng, alphas) - actual_grad = api.grad(lambda x: (random.gamma(rng, x)).sum())(alphas) + z = random.gamma(rng, alphas, shape=(100,)) + actual_grad = api.grad(lambda x: random.gamma(rng, x, shape=(100,)).sum())(alphas) eps = 0.01 * alpha / (1.0 + onp.sqrt(alpha)) cdf_dot = (scipy.stats.gamma.cdf(z, alpha + eps) From 1f4e45cdcd92b205d2d42cc40f7fedb0eeb702b3 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 20 Oct 2019 21:14:48 +0000 Subject: [PATCH 0224/1053] tweak shape convention again --- jax/random.py | 125 ++++++++++++++++++++++++++++++------------- tests/random_test.py | 21 ++++---- 2 files changed, 98 insertions(+), 48 deletions(-) diff --git a/jax/random.py b/jax/random.py index 5e2e525f267f..fa5a548a176d 100644 --- a/jax/random.py +++ b/jax/random.py @@ -428,24 +428,26 @@ def _normal(key, shape, dtype): return onp.array(onp.sqrt(2), dtype) * lax.erf_inv(u) -def multivariate_normal(key, mean, cov, shape=(), dtype=onp.float64): +def multivariate_normal(key, mean, cov, shape=None, dtype=onp.float64): """Sample multivariate normal random values with given mean and covariance. Args: key: a PRNGKey used as the random key. mean: a mean vector of shape ``(..., n)``. cov: a positive definite covariance matrix of shape ``(..., n, n)``. The - shape prefix ``...`` must be broadcast-compatible with that of ``mean``. + batch shape ``...`` must be broadcast-compatible with that of ``mean``. shape: optional, a tuple of nonnegative integers specifying the result batch shape; that is, the prefix of the result shape excluding the last - element of value ``n``. Must be broadcast-compatible with - ``mean.shape[:-1]`` and ``cov.shape[:-2]``. Default (). + axis. Must be broadcast-compatible with ``mean.shape[:-1]`` and + ``cov.shape[:-2]``. The default (None) produces a result batch shape by + broadcasting together the batch shapes of ``mean`` and ``cov``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: A random array with the specified dtype and shape given by - ``shape + (mean.shape[-1],)``. + ``shape + mean.shape[-1:]`` if ``shape`` is not None, or else + ``broadcast_shapes(mean.shape[:-1], cov.shape[:-2]) + mean.shape[-1:]``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _multivariate_normal(key, mean, cov, shape, dtype) @@ -464,35 +466,46 @@ def _multivariate_normal(key, mean, cov, shape, dtype): "but got cov.shape == {shape}.") raise ValueError(msg.format(n=n, shape=onp.shape(cov))) - _check_shape("normal", shape, mean.shape[:-1], mean.shape[:-2]) + if shape is None: + shape = lax.broadcast_shapes(mean.shape[:-1], cov.shape[:-2]) + else: + _check_shape("normal", shape, mean.shape[:-1], mean.shape[:-2]) + chol_factor = cholesky(cov) normal_samples = normal(key, shape + mean.shape[-1:], dtype) return mean + np.tensordot(normal_samples, chol_factor, [-1, 1]) -def truncated_normal(key, lower, upper, shape=(), dtype=onp.float64): +def truncated_normal(key, lower, upper, shape=None, dtype=onp.float64): """Sample truncated standard normal random values with given shape and dtype. Args: key: a PRNGKey used as the random key. - lower: a float or array of lower bound for truncation. Must be - broadcast-compatible with `upper`. - upper: a floating-point upper bound for truncation. Must be - broadcast-compatible with `lower`. + lower: a float or array of floats representing the lower bound for + truncation. Must be broadcast-compatible with ``upper``. + upper: a float or array of floats representing the upper bound for + truncation. Must be broadcast-compatible with ``lower``. shape: optional, a tuple of nonnegative integers specifying the result - shape. Must be broadcast-compatible with `lower` and `upper`. Default (). + shape. Must be broadcast-compatible with ``lower`` and ``upper``. The + default (None) produces a result shape by broadcasting ``lower`` and + ``upper``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: - A random array with the specified shape and dtype. + A random array with the specified dtype and shape given by ``shape`` if + ``shape`` is not None, or else by broadcasting ``lower`` and ``upper``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _truncated_normal(key, lower, upper, shape, dtype) @partial(jit, static_argnums=(3, 4)) def _truncated_normal(key, lower, upper, shape, dtype): - _check_shape("truncated_normal", shape, lower.shape, upper.shape) + if shape is None: + shape = lax.broadcast_shapes(lower.shape, upper.shape) + else: + _check_shape("truncated_normal", shape, lower.shape, upper.shape) + sqrt2 = onp.array(onp.sqrt(2), dtype) a = lax.erf(lax.convert_element_type(lower, dtype) / sqrt2) b = lax.erf(lax.convert_element_type(upper, dtype) / sqrt2) @@ -502,18 +515,20 @@ def _truncated_normal(key, lower, upper, shape, dtype): return sqrt2 * lax.erf_inv(a + u * (b - a)) -def bernoulli(key, p=onp.float32(0.5), shape=()): +def bernoulli(key, p=onp.float32(0.5), shape=None): """Sample Bernoulli random values with given shape and mean. Args: key: a PRNGKey used as the random key. p: optional, a float or array of floats for the mean of the random variables. Must be broadcast-compatible with ``shape``. Default 0.5. - shape: optional, a tuple of nonnegative integers representing the shape. - Default (). + shape: optional, a tuple of nonnegative integers representing the result + shape. Must be broadcast-compatible with ``p.shape``. The default (None) + produces a result shape equal to ``p.shape``. Returns: - A random array with the specified shape and boolean dtype. + A random array with boolean dtype and shape given by ``shape`` if ``shape`` + is not None, or else ``p.shape``. """ dtype = xla_bridge.canonicalize_dtype(lax.dtype(p)) if not onp.issubdtype(dtype, onp.floating): @@ -524,11 +539,15 @@ def bernoulli(key, p=onp.float32(0.5), shape=()): @partial(jit, static_argnums=(2,)) def _bernoulli(key, p, shape): - _check_shape("bernoulli", shape, p.shape) + if shape is None: + shape = p.shape + else: + _check_shape("bernoulli", shape, p.shape) + return uniform(key, shape, lax.dtype(p)) < p -def beta(key, a, b, shape=(), dtype=onp.float64): +def beta(key, a, b, shape=None, dtype=onp.float64): """Sample Bernoulli random values with given shape and mean. Args: @@ -538,19 +557,25 @@ def beta(key, a, b, shape=(), dtype=onp.float64): b: a float or array of floats broadcast-compatible with ``shape`` representing the second parameter "beta". shape: optional, a tuple of nonnegative integers specifying the result - shape. Must be broadcast-compatible with ``a`` and ``b``. Default (). + shape. Must be broadcast-compatible with ``a`` and ``b``. The default + (None) produces a result shape by broadcasting ``a`` and ``b``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: - A random array with the specified shape and dtype. + A random array with the specified dtype and shape given by ``shape`` if + ``shape`` is not None, or else by broadcasting ``a`` and ``b``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _beta(key, a, b, shape, dtype) @partial(jit, static_argnums=(3, 4)) def _beta(key, a, b, shape, dtype): - _check_shape("beta", shape, a.shape, b.shape) + if shape is None: + shape = lax.broadcast_shapes(a.shape, b.shape) + else: + _check_shape("beta", shape, a.shape, b.shape) + a = lax.convert_element_type(a, dtype) b = lax.convert_element_type(b, dtype) key_a, key_b = split(key) @@ -583,7 +608,7 @@ def _cauchy(key, shape, dtype): return lax.tan(lax.mul(pi, lax.sub(u, _constant_like(u, 0.5)))) -def dirichlet(key, alpha, shape=(), dtype=onp.float64): +def dirichlet(key, alpha, shape=None, dtype=onp.float64): """Sample Cauchy random values with given shape and float dtype. Args: @@ -593,13 +618,15 @@ def dirichlet(key, alpha, shape=(), dtype=onp.float64): shape: optional, a tuple of nonnegative integers specifying the result batch shape; that is, the prefix of the result shape excluding the last element of value ``n``. Must be broadcast-compatible with - ``alpha.shape[:-1]``. + ``alpha.shape[:-1]``. The default (None) produces a result shape equal to + ``alpha.shape``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: A random array with the specified dtype and shape given by - ``shape + (alpha.shape[-1],)``. + ``shape + (alpha.shape[-1],)`` if ``shape`` is not None, or else + ``alpha.shape``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _dirichlet(key, alpha, shape, dtype) @@ -610,7 +637,11 @@ def _dirichlet(key, alpha, shape, dtype): msg = "dirichlet requires alpha.ndim >= 1, got alpha.ndim == {}" raise ValueError(msg.format(onp.ndim(alpha))) - _check_shape("dirichlet", shape, alpha.shape[:-1]) + if shape is None: + shape = alpha.shape[:-1] + else: + _check_shape("dirichlet", shape, alpha.shape[:-1]) + alpha = lax.convert_element_type(alpha, dtype) gamma_samples = gamma(key, alpha, shape + alpha.shape[-1:], dtype) return gamma_samples / np.sum(gamma_samples, axis=-1, keepdims=True) @@ -813,7 +844,7 @@ def _gamma_impl(key, a): defjvp(_gamma_impl, None, lambda tangent, ans, key, a, **kwargs: tangent * _gamma_grad(ans, a)) -def gamma(key, a, shape=(), dtype=onp.float64): +def gamma(key, a, shape=None, dtype=onp.float64): """Sample Gamma random values with given shape and float dtype. Args: @@ -821,19 +852,25 @@ def gamma(key, a, shape=(), dtype=onp.float64): a: a float or array of floats broadcast-compatible with ``shape`` representing the parameter of the distribution. shape: optional, a tuple of nonnegative integers specifying the result - shape. Must be broadcast-compatible with ``a``. Default (). + shape. Must be broadcast-compatible with ``a``. The default (None) + produces a result shape equal to ``a.shape``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: - A random array with the specified shape and dtype. + A random array with the specified dtype and with shape given by ``shape`` if + ``shape`` is not None, or else by ``a.shape``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _gamma(key, a, shape, dtype) @partial(jit, static_argnums=(2, 3)) def _gamma(key, a, shape, dtype): - _check_shape("gamma", shape, a.shape) + if shape is None: + shape = a.shape + else: + _check_shape("gamma", shape, a.shape) + a = lax.convert_element_type(a, dtype) if onp.shape(a) != shape: a = np.broadcast_to(a, shape) @@ -909,7 +946,7 @@ def _logistic(key, shape, dtype): return logit(uniform(key, shape, dtype)) -def pareto(key, b, shape=(), dtype=onp.float64): +def pareto(key, b, shape=None, dtype=onp.float64): """Sample Pareto random values with given shape and float dtype. Args: @@ -917,19 +954,25 @@ def pareto(key, b, shape=(), dtype=onp.float64): a: a float or array of floats broadcast-compatible with ``shape`` representing the parameter of the distribution. shape: optional, a tuple of nonnegative integers specifying the result - shape. Must be broadcast-compatible with ``b``. Default (). + shape. Must be broadcast-compatible with ``b``. The default (None) + produces a result shape equal to ``b.shape``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: - A random array with the specified shape and dtype. + A random array with the specified dtype and with shape given by ``shape`` if + ``shape`` is not None, or else by ``b.shape``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _pareto(key, b, shape, dtype) @partial(jit, static_argnums=(2, 3)) def _pareto(key, b, shape, dtype): - _check_shape("pareto", shape) + if shape is None: + shape = b.shape + else: + _check_shape("pareto", shape) + b = lax.convert_element_type(b, dtype) e = exponential(key, shape, dtype) return lax.exp(e / b) @@ -943,19 +986,25 @@ def t(key, df, shape=(), dtype=onp.float64): df: a float or array of floats broadcast-compatible with ``shape`` representing the parameter of the distribution. shape: optional, a tuple of nonnegative integers specifying the result - shape. Must be broadcast-compatible with ``df``. Default (). + shape. Must be broadcast-compatible with ``df``. The default (None) + produces a result shape equal to ``df.shape``. dtype: optional, a float dtype for the returned values (default float64 if jax_enable_x64 is true, otherwise float32). Returns: - A random array with the specified shape and dtype. + A random array with the specified dtype and with shape given by ``shape`` if + ``shape`` is not None, or else by ``df.shape``. """ dtype = xla_bridge.canonicalize_dtype(dtype) return _t(key, df, shape, dtype) @partial(jit, static_argnums=(2, 3)) def _t(key, df, shape, dtype): - _check_shape("t", shape, df.shape) + if shape is None: + shape = df.shape + else: + _check_shape("t", shape, df.shape) + df = lax.convert_element_type(df, dtype) key_n, key_g = split(key) n = normal(key_n, shape, dtype) diff --git a/tests/random_test.py b/tests/random_test.py index 80d08415fcce..e6e6a86fe048 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -277,8 +277,8 @@ def testGammaShape(self): def testGammaGrad(self, alpha): rng = random.PRNGKey(0) alphas = onp.full((100,), alpha) - z = random.gamma(rng, alphas, shape=(100,)) - actual_grad = api.grad(lambda x: random.gamma(rng, x, shape=(100,)).sum())(alphas) + z = random.gamma(rng, alphas) + actual_grad = api.grad(lambda x: random.gamma(rng, x).sum())(alphas) eps = 0.01 * alpha / (1.0 + onp.sqrt(alpha)) cdf_dot = (scipy.stats.gamma.cdf(z, alpha + eps) @@ -379,21 +379,22 @@ def testMultivariateNormal(self, dim, dtype): cov_factor = r.randn(dim, dim) cov = onp.dot(cov_factor, cov_factor.T) + dim * onp.eye(dim) - keys = random.split(random.PRNGKey(0), 1000) - rand = api.vmap(partial(random.multivariate_normal, mean=mean, cov=cov)) + key = random.PRNGKey(0) + rand = partial(random.multivariate_normal, mean=mean, cov=cov, + shape=(10000,)) crand = api.jit(rand) - uncompiled_samples = rand(keys) - compiled_samples = crand(keys) + uncompiled_samples = onp.asarray(rand(key), onp.float64) + compiled_samples = onp.asarray(crand(key), onp.float64) - # This is a quick-and-dirty multivariate normality check that tests that a - # uniform mixture of the marginals along the covariance matrix's - # eigenvectors follow a standard normal distribution. - # TODO(mattjj); check for correlations, maybe use a more sophisticated test. inv_scale = scipy.linalg.lapack.dtrtri(onp.linalg.cholesky(cov), lower=True)[0] for samples in [uncompiled_samples, compiled_samples]: centered = samples - mean whitened = onp.einsum('nj,ij->ni', centered, inv_scale) + + # This is a quick-and-dirty multivariate normality check that tests that a + # uniform mixture of the marginals along the covariance matrix's + # eigenvectors follow a standard normal distribution. self._CheckKolmogorovSmirnovCDF(whitened.ravel(), scipy.stats.norm().cdf) def testIssue222(self): From 0289536bff1e5d530b0679fe5573009d04a0aa6c Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 20 Oct 2019 18:10:03 -0700 Subject: [PATCH 0225/1053] lax.custom_linear_solve primitive (#1402) * WIP: linear solvers * Draft of lax.linear_solve * Refactor pytree munging inside lax.root. The primitive's implementation and JVP rules are now 100% pytree free. * Fixup linear_solve * Linearize multiple times in _root_jvp to avoid zeros * fix deftraced * add a symmetric argument * Fixup float64; add a test for symmetric/non-symmetric * test zeros in linear_solve_jvp * Revisions per review * Adjust signature of linear_solve * restore botched test * variable names * jaxprize * spelling * Use np.dot instead of @ * linear_solve docstring, more tests * Disable batching for root and linear_solve * Fix linear_solve tests * remove unused imports * Rename to custom_linear_solve * WIP: refactor * fixup test for lazy transpose_solve error --- jax/lax/lax_control_flow.py | 227 ++++++++++++++++++++++++++++++--- tests/lax_control_flow_test.py | 179 +++++++++++++++++++++++++- 2 files changed, 388 insertions(+), 18 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index dd9d0b5cb95f..2fb71be0be99 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -20,6 +20,7 @@ from __future__ import division from __future__ import print_function +import collections import itertools import operator import threading @@ -851,7 +852,7 @@ def body(i, dst): def _flatten_higher_order_func( - f, tree, error_template="Expected {}, got {}", + f, tree, func_name, input_name, ): """Flatten a higher order function ``f`` of the form ``f(g, x)``. @@ -871,15 +872,17 @@ def flat_fun(flat_g, *args_flat): g = partial(apply_flat_fun_nokwargs, flat_g, (tree, tree)) out = f(g, args) out_flat, out_tree = tree_flatten(out) - if out_tree != tree: - raise TypeError(error_template.format(tree, out_tree)) + _check_tree(func_name, input_name, out_tree, tree) return out_flat return flat_fun -def _root_tree_error_template(func_name): - return (func_name + "() output pytree structure must match initial_guess, " - + "got {} and {}.") +def _check_tree(func_name, expected_name, actual_tree, expected_tree): + if actual_tree != expected_tree: + raise TypeError( + "{}() output pytree structure must match {}, got {} and {}." + .format(func_name, expected_name, actual_tree, expected_tree)) + def root(f, initial_guess, solve, tangent_solve): @@ -922,13 +925,12 @@ def root(f, initial_guess, solve, tangent_solve): jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, guess_avals) in_tree, = treedef_children(in_args_tree) - if in_tree != out_tree: - raise TypeError(_root_tree_error_template("f").format(out_tree, in_tree)) + _check_tree("f", "initial_guess", out_tree, in_tree) solve_flat = _flatten_higher_order_func( - solve, in_tree, _root_tree_error_template("solve")) + solve, in_tree, "solve", "initial_guess") tangent_solve_flat = _flatten_higher_order_func( - tangent_solve, in_tree, _root_tree_error_template("tangent_solve")) + tangent_solve, in_tree, "tangent_solve", "initial_guess") out_flat = root_p.bind(*itertools.chain(consts, guess_flat), num_consts=len(consts), jaxpr=jaxpr, solve=solve_flat, @@ -974,14 +976,209 @@ def _root_jvp(primals, tangents, num_consts, jaxpr, solve, tangent_solve): return solution, solution_dot -def _root_batch(args, dims, **params): - return batching.batch_fun(lu.wrap_init(_root_impl, params), args, dims) - - root_p = core.Primitive('root') root_p.multiple_results = True root_p.def_impl(_root_impl) root_p.def_abstract_eval(_root_abstract_eval) ad.primitive_jvps[root_p] = _root_jvp xla.initial_style_translations[root_p] = xla.lower_fun(_root_impl, initial_style=True) -batching.primitive_batchers[root_p] = _root_batch +# TODO(shoyer): write batching rule + + +class _LinearSolveTuple(collections.namedtuple( + '_LinearSolveTuple', 'matvec, vecmat, solve, transpose_solve')): + + def transpose(self): + return type(self)(self.vecmat, self.matvec, self.transpose_solve, self.solve) + + +def _split_linear_solve_args(args, const_lengths): + params_list = split_list(args, list(const_lengths)) + return _LinearSolveTuple(*params_list[:-1]), params_list[-1] + + +def _transpose_function(linear_fun, primals): + """Transpose a linear function.""" + # TODO(shoyer): can we use something more direct than the vjp machinery? + # It's particularly awkward that we need the second argument to give + # particular values of the primals, which are entirely arbitrary. + _, vjp_fun = api.vjp(linear_fun, primals) + + def transposed_fun(x): + (y,) = vjp_fun(x) + return y + + return transposed_fun + + +def _flatten(args): + return [x for arg in args for x in arg] + + +def _check_shapes(func_name, expected_name, actual, expected, tree): + actual_shapes = _map(onp.shape, actual) + expected_shapes = _map(onp.shape, expected) + if actual_shapes != expected_shapes: + actual_shape_tree = tree_unflatten(tree, actual_shapes) + act_shape_tree = tree_unflatten(tree, actual_shapes) + raise ValueError('{}() output shapes must match {}, got {} and {}' + .format(func_name, expected_name, + tree_unflatten(tree, actual_shapes), + tree_unflatten(tree, expected_shapes))) + + +def custom_linear_solve( + matvec, b, solve, transpose_solve=None, symmetric=False): + """Perform a matrix-free linear solve with implicitly defined gradients. + + This function allows for overriding or defining gradients for a linear + solve directly via implicit differentiation at the solution, rather than by + differenting *through* the solve operation. This can sometimes be much faster + or more numerically stable, or differentiating through the solve operation + may not even be implemented (e.g., if ``solve`` using ``lax.while_loop``). + + Required invariant: + x = solve(matvec, b) # solve the linear equation + assert matvec(x) == b # not checked + + Args: + matvec: linear function to invert. Must be differentiable. + b: constant right handle side of the equation. May be any nested structure + of arrays. + solve: higher level function that solves for solution to the linear + equation, i.e., ``matvec(solve(matvec, x)) == x`` for all ``x`` of the + same form as ``b``. This function need not be differenatiable. + transpose_solve: higher level function for solving the transpose linear + equation, i.e., ``vecmat(transpose_solve(vecmat, x)) == x``, where + ``vecmat`` is the transpose of the linear map ``matvec`` (computed + automatically with autodiff). Required for backwards mode automatic + differentiation, unless ``symmetric=True``, in which case ``solve`` + provides the default value. + symmetric: bool indicating if it is safe to assume the linear map + corresponds to a symmetric matrix, i.e., ``matvec == vecmat``. + + Returns: + Result of ``solve(matvec, b)``, with gradients defined assuming that the + solution ``x`` satisfies the linear equation ``matvec(x) == b``. + """ + if transpose_solve is None and symmetric: + transpose_solve = solve + + b_flat, in_args_tree = tree_flatten((b,)) + b_avals = tuple(_map(_abstractify, b_flat)) + matvec_jaxpr, matvec_consts, out_tree = _initial_style_jaxpr( + matvec, in_args_tree, b_avals) + + tree, = treedef_children(in_args_tree) + _check_tree("matvec", "b", out_tree, tree) + + solve_jaxpr, solve_consts, out_tree = _initial_style_jaxpr( + partial(solve, matvec), in_args_tree, b_avals) + _check_tree("solve", "b", out_tree, tree) + + if transpose_solve is None: + vecmat_jaxpr = tr_solve_jaxpr = None + vecmat_consts = tr_solve_consts = [] + else: + if symmetric: + vecmat = matvec + vecmat_jaxpr = matvec_jaxpr + vecmat_consts = matvec_consts + else: + vecmat = _transpose_function(matvec, b) + vecmat_jaxpr, vecmat_consts, out_tree = _initial_style_jaxpr( + vecmat, in_args_tree, b_avals) + assert out_tree == tree + + tr_solve_jaxpr, tr_solve_consts, out_tree = _initial_style_jaxpr( + partial(transpose_solve, vecmat), in_args_tree, b_avals) + _check_tree("transpose_solve", "b", out_tree, tree) + + all_consts = [matvec_consts, vecmat_consts, solve_consts, tr_solve_consts] + const_lengths = _LinearSolveTuple(*_map(len, all_consts)) + jaxprs = _LinearSolveTuple( + matvec_jaxpr, vecmat_jaxpr, solve_jaxpr, tr_solve_jaxpr) + + out_flat = custom_linear_solve_p.bind( + *(_flatten(all_consts) + b_flat), + const_lengths=const_lengths, jaxprs=jaxprs, tree=tree) + return tree_unflatten(tree, out_flat) + + +def _custom_linear_solve_abstract_eval(*args, **kwargs): + return args[sum(kwargs['const_lengths']):] + + +def _custom_linear_solve_impl(*args, **kwargs): + const_lengths, jaxprs, tree = split_dict( + kwargs, ['const_lengths', 'jaxprs', 'tree']) + params, b = _split_linear_solve_args(args, const_lengths) + x = core.jaxpr_as_fun(jaxprs.solve)(*(params.solve + b)) + _check_shapes('solve', 'b', x, b, tree) + return x + + +def _tangent_linear_map(func, params, params_dot, *x): + """Compute the tangent of a linear map. + + Assuming ``func(*params, *x)`` is linear in ``x`` and computes ``A @ x``, + this function computes ``∂A @ x``. + """ + assert any(p is not ad_util.zero for p in params_dot) + zeros = [ad_util.zero] * len(x) + _, out_tangent = ad.jvp(lu.wrap_init(func)).call_wrapped( + params + list(x), params_dot + zeros) + return out_tangent + + +def _custom_linear_solve_jvp(primals, tangents, const_lengths, jaxprs, tree): + # A x - b = 0 + # ∂A x + A ∂x - ∂b = 0 + # ∂x = A^{-1} (∂b - ∂A x) + + kwargs = dict(const_lengths=const_lengths, jaxprs=jaxprs, tree=tree) + x = custom_linear_solve_p.bind(*primals, **kwargs) + + params, _ = _split_linear_solve_args(primals, const_lengths) + params_dot, b_dot = _split_linear_solve_args(tangents, const_lengths) + + if all(p is ad_util.zero for p in params_dot.matvec): + # no need to evaluate matvec_tangents + rhs = b_dot + else: + matvec_tangents = _tangent_linear_map( + core.jaxpr_as_fun(jaxprs.matvec), params.matvec, params_dot.matvec, *x) + _check_shapes("matvec", "b", matvec_tangents, x, tree) + rhs = _map(ad.add_tangents, b_dot, _map(operator.neg, matvec_tangents)) + + x_dot = custom_linear_solve_p.bind(*(_flatten(params) + rhs), **kwargs) + + return x, x_dot + + +def _custom_linear_solve_transpose_rule(cotangent, *primals, **kwargs): + const_lengths, jaxprs, tree = split_dict( + kwargs, ['const_lengths', 'jaxprs', 'tree']) + + if jaxprs.transpose_solve is None: + raise TypeError('transpose_solve required for backwards mode automatic ' + 'differentiation of custom_linear_solve') + + params, b = _split_linear_solve_args(primals, const_lengths) + assert b == [ad.undefined_primal] * len(b) + cotangent_b = custom_linear_solve_p.bind( + *(_flatten(params.transpose()) + cotangent), + const_lengths=const_lengths.transpose(), jaxprs=jaxprs.transpose(), + tree=tree) + return [None] * sum(const_lengths) + cotangent_b + + +custom_linear_solve_p = core.Primitive('custom_linear_solve') +custom_linear_solve_p.multiple_results = True +custom_linear_solve_p.def_impl(_custom_linear_solve_impl) +custom_linear_solve_p.def_abstract_eval(_custom_linear_solve_abstract_eval) +ad.primitive_jvps[custom_linear_solve_p] = _custom_linear_solve_jvp +xla.initial_style_translations[custom_linear_solve_p] = xla.lower_fun( + _custom_linear_solve_impl, initial_style=True) +ad.primitive_transposes[custom_linear_solve_p] = _custom_linear_solve_transpose_rule +# TODO(shoyer): write batching rule diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 2bdb5fa2a614..95f404574027 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -36,6 +36,7 @@ from jax.util import unzip2 from jax.lib import xla_bridge import jax.numpy as np # scan tests use numpy +import jax.scipy as jsp def scan_reference(f, init, xs): carry = init @@ -1054,9 +1055,10 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): jtu.check_grads(sqrt_cubed, (5.0,), order=2, rtol=1e-3) - inputs = np.array([4.0, 5.0]) - results = api.vmap(sqrt_cubed)(inputs) - self.assertAllClose(results, inputs ** 1.5, check_dtypes=False) + # TODO(shoyer): reenable when batching works + # inputs = np.array([4.0, 5.0]) + # results = api.vmap(sqrt_cubed)(inputs) + # self.assertAllClose(results, inputs ** 1.5, check_dtypes=False) results = api.jit(sqrt_cubed)(5.0) self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False) @@ -1094,6 +1096,177 @@ def dummy_root_usage(x): TypeError, re.escape("tangent_solve() output pytree")): api.jvp(dummy_root_usage, (0.0,), (0.0,)) + @parameterized.named_parameters( + {"testcase_name": "nonsymmetric", "symmetric": False}, + {"testcase_name": "symmetric", "symmetric": True}, + ) + def test_custom_linear_solve(self, symmetric): + + def explicit_jacobian_solve(matvec, b): + return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) + + def matrix_free_solve(matvec, b): + return lax.custom_linear_solve( + matvec, b, explicit_jacobian_solve, explicit_jacobian_solve, + symmetric=symmetric) + + def linear_solve(a, b): + return matrix_free_solve(partial(np.dot, a), b) + + rng = onp.random.RandomState(0) + a = rng.randn(3, 3) + if symmetric: + a = a + a.T + b = rng.randn(3) + jtu.check_grads(linear_solve, (a, b), order=2) + + expected = np.linalg.solve(a, b) + actual = api.jit(linear_solve)(a, b) + self.assertAllClose(expected, actual, check_dtypes=True) + + # TODO(shoyer): reenable when batching works + # c = rng.randn(3, 2) + # expected = np.linalg.solve(a, c) + # actual = api.vmap(linear_solve, (None, 1), 1)(a, c) + # self.assertAllClose(expected, actual, check_dtypes=True) + + def test_custom_linear_solve_zeros(self): + + def explicit_jacobian_solve(matvec, b): + return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) + + def matrix_free_solve(matvec, b): + return lax.custom_linear_solve(matvec, b, explicit_jacobian_solve, + explicit_jacobian_solve) + + def linear_solve(a, b): + return matrix_free_solve(partial(np.dot, a), b) + + rng = onp.random.RandomState(0) + a = rng.randn(3, 3) + b = rng.randn(3) + jtu.check_grads(lambda x: linear_solve(x, b), (a,), order=2) + jtu.check_grads(lambda x: linear_solve(a, x), (b,), order=2) + + def test_custom_linear_solve_iterative(self): + + def richardson_iteration(matvec, b, omega=0.1, tolerance=1e-6): + # Equivalent to vanilla gradient descent: + # https://en.wikipedia.org/wiki/Modified_Richardson_iteration + def cond(x): + return np.linalg.norm(matvec(x) - b) > tolerance + def body(x): + return x + omega * (b - matvec(x)) + return lax.while_loop(cond, body, b) + + def matrix_free_solve(matvec, b): + return lax.custom_linear_solve(matvec, b, richardson_iteration, + richardson_iteration) + + def build_and_solve(a, b): + # intentionally non-linear in a and b + return matrix_free_solve(partial(np.dot, np.exp(a)), np.cos(b)) + + rng = onp.random.RandomState(0) + a = rng.randn(2, 2) + b = rng.randn(2) + expected = np.linalg.solve(np.exp(a), np.cos(b)) + actual = build_and_solve(a, b) + self.assertAllClose(expected, actual, atol=1e-5, check_dtypes=True) + jtu.check_grads(build_and_solve, (a, b), atol=1e-5, order=2) + + # TODO(shoyer): reenable when batching works + # a2 = rng.randn(1, 2, 2) + # b2 = rng.randn(1, 2, 2) + # jtu.check_grads(api.vmap(build_and_solve), (a2, b2), atol=1e-5, order=2) + + def test_custom_linear_solve_cholesky(self): + + def positive_definive_solve(a, b): + factors = jsp.linalg.cho_factor(a) + def solve(matvec, x): + return jsp.linalg.cho_solve(factors, x) + return lax.custom_linear_solve( + partial(np.dot, a), b, solve, symmetric=True) + + rng = onp.random.RandomState(0) + a = rng.randn(2, 2) + b = rng.randn(2) + + expected = np.linalg.solve(np.dot(a, a.T), b) + actual = positive_definive_solve(np.dot(a, a.T), b) + self.assertAllClose(expected, actual, check_dtypes=True) + + actual = api.jit(positive_definive_solve)(np.dot(a, a.T), b) + self.assertAllClose(expected, actual, check_dtypes=True) + + # numerical gradients are only well defined if ``a`` is guaranteed to be + # positive definite. + jtu.check_grads(lambda x, y: positive_definive_solve(np.dot(x, x.T), y), + (a, b), order=2) + + def test_custom_linear_solve_lu(self): + + def linear_solve(a, b): + a_factors = jsp.linalg.lu_factor(a) + at_factors = jsp.linalg.lu_factor(a.T) + def solve(matvec, x): + return jsp.linalg.lu_solve(a_factors, x) + def transpose_solve(vecmat, x): + return jsp.linalg.lu_solve(at_factors, x) + return lax.custom_linear_solve( + partial(np.dot, a), b, solve, transpose_solve) + + rng = onp.random.RandomState(0) + a = rng.randn(3, 3) + b = rng.randn(3) + + expected = np.linalg.solve(a, b) + actual = linear_solve(a, b) + self.assertAllClose(expected, actual, check_dtypes=True) + + jtu.check_grads(linear_solve, (a, b), order=2) + + def test_custom_linear_solve_without_transpose_solve(self): + + def explicit_jacobian_solve(matvec, b): + return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) + + def loss(a, b): + matvec = partial(np.dot, a) + x = lax.custom_linear_solve(matvec, b, explicit_jacobian_solve) + return np.sum(x) + + rng = onp.random.RandomState(0) + a = rng.randn(2, 2) + b = rng.randn(2) + + jtu.check_grads(loss, (a, b), atol=1e-5, order=2, modes=['fwd']) + + with self.assertRaisesRegexp(TypeError, "transpose_solve required"): + api.grad(loss)(a, b) + + def test_custom_linear_solve_errors(self): + + solve = lambda f, x: x + + with self.assertRaisesRegex(TypeError, re.escape("matvec() output pytree")): + lax.custom_linear_solve(lambda x: [x], 1.0, solve, solve) + with self.assertRaisesRegex(TypeError, re.escape("solve() output pytree")): + lax.custom_linear_solve(lambda x: x, 1.0, lambda f, x: [x], solve) + with self.assertRaisesRegex( + TypeError, re.escape("transpose_solve() output pytree")): + lax.custom_linear_solve(lambda x: x, 1.0, solve, lambda f, x: [x]) + + with self.assertRaisesRegex(ValueError, re.escape("solve() output shapes")): + lax.custom_linear_solve(lambda x: x, 1.0, lambda f, x: np.ones(2), solve) + + def bad_matvec_usage(a): + return lax.custom_linear_solve( + lambda x: a * np.ones(2), 1.0, solve, solve) + with self.assertRaisesRegex(ValueError, re.escape("matvec() output shapes")): + api.jvp(bad_matvec_usage, (1.0,), (1.0,)) + if __name__ == '__main__': absltest.main() From 43be8d8ef81177d4c41b8e580e2c4f8b2afef52b Mon Sep 17 00:00:00 2001 From: root Date: Mon, 21 Oct 2019 11:48:58 +0000 Subject: [PATCH 0226/1053] Fix NaNs in grad(jax.nn.elu) for large inputs. --- jax/nn/functions.py | 3 ++- tests/nn_test.py | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index 5b67c0f2b173..df784c06ae08 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -35,7 +35,8 @@ def swish(x): return x * sigmoid(x) def log_sigmoid(x): return -softplus(-x) def elu(x, alpha=1.0): - return np.where(x > 0, x, alpha * np.expm1(x)) + safe_x = np.where(x > 0, 0., x) + return np.where(x > 0, x, alpha * np.expm1(safe_x)) def leaky_relu(x, negative_slope=1e-2): return np.where(x >= 0, x, negative_slope * x) diff --git a/tests/nn_test.py b/tests/nn_test.py index 97e6f0dc0b85..208f62be2b09 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -29,6 +29,7 @@ from jax.test_util import check_grads from jax import nn from jax import random +import jax from jax.config import config config.parse_flags_with_absl() @@ -42,6 +43,13 @@ def testSoftplusValue(self): val = nn.softplus(89.) self.assertAllClose(val, 89., check_dtypes=False) + def testEluGrad(self): + check_grads(nn.elu, (1e4,), 4, eps=1.) + + def testEluValue(self): + val = nn.elu(1e4) + self.assertAllClose(val, 1e4, check_dtypes=False) + InitializerRecord = collections.namedtuple( "InitializerRecord", ["name", "initializer", "shapes"]) @@ -79,4 +87,7 @@ class NNInitializersTest(jtu.JaxTestCase): for shape in rec.shapes for dtype in [onp.float32, onp.float64])) def testInitializer(self, initializer, rng, shape, dtype): - val = initializer(rng, shape, dtype) \ No newline at end of file + val = initializer(rng, shape, dtype) + +if __name__ == "__main__": + absltest.main() From 2bf799b63a770f50a26ed3f70b267fb39dbd59be Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 21 Oct 2019 10:05:59 -0400 Subject: [PATCH 0227/1053] Fix numpy version check that fails for development numpy versions. (#1540) Numpy versions may contain strings if not a release build. Only look at the two major entries to avoid an exception. --- jax/numpy/lax_numpy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 24b1a2fc43f9..38a146c88d51 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -831,7 +831,7 @@ def isclose(a, b, rtol=1e-05, atol=1e-08): else: return lax.eq(a, b) -numpy_version = tuple(map(int, onp.version.version.split('.'))) +numpy_version = tuple(map(int, onp.version.version.split('.')[:2])) if numpy_version < (1, 14): # see discussion at https://github.com/numpy/numpy/pull/9720 def _maybe_numpy_1_13_isclose_behavior(a, out): From 9c23a95e6a0699fcca0fb32b2ed51172b4c64c02 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 21 Oct 2019 10:30:55 -0400 Subject: [PATCH 0228/1053] Add i0e and i1e Bessel functions. (#1541) --- docs/jax.scipy.rst | 2 ++ jax/lax/lax.py | 25 +++++++++++++++++++++++++ jax/scipy/special.py | 8 ++++++++ tests/lax_scipy_test.py | 23 +++++++++++++---------- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index e6d24dd1d082..9b127095d982 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -41,6 +41,8 @@ jax.scipy.special erfinv expit gammaln + i0e + i1e log_ndtr logit logsumexp diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 8bdad6839298..85b84917241a 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -180,6 +180,18 @@ def digamma(x): r"""Elementwise digamma: :math:`\psi(x)`.""" return digamma_p.bind(x) +def bessel_i0e(x): + r"""Exponentially scaled modified Bessel function of order 0: + :math:`\mathrm{i0e}(x) = e^{-\mathrm{abs}(x)} \mathrm{i0}(x)` + """ + return bessel_i0e_p.bind(x) + +def bessel_i1e(x): + r"""Exponentially scaled modified Bessel function of order 1: + :math:`\mathrm{i1e}(x) = e^{-\mathrm{abs}(x)} \mathrm{i1}(x)` + """ + return bessel_i1e_p.bind(x) + def erf(x): r"""Elementwise error function: :math:`\mathrm{erf}(x)`.""" return erf_p.bind(x) @@ -1611,6 +1623,19 @@ def _brcast_to(x, shape): digamma_p = standard_unop(_float, 'digamma') +bessel_i0e_p = standard_unop(_float, 'bessel_i0e') +ad.defjvp2(bessel_i0e_p, lambda g, y, x: g * (bessel_i1e(x) - sign(x) * y)) + +bessel_i1e_p = standard_unop(_float, 'bessel_i1e') +def _bessel_i1e_jvp(g, y, x): + eps = onp.finfo(_dtype(x)).eps + x_is_not_tiny = abs(x) > eps + safe_x = select(x_is_not_tiny, x, full_like(x, eps)) + dy_dx = bessel_i0e(safe_x) - y * (sign(safe_x) + reciprocal(safe_x)) + dy_dx = select(x_is_not_tiny, dy_dx, full_like(x, 0.5)) + return g * dy_dx +ad.defjvp2(bessel_i1e_p, _bessel_i1e_jvp) + erf_p = standard_unop(_float, 'erf') ad.defjvp(erf_p, lambda g, x: mul(_const(x, 2. / onp.sqrt(onp.pi)), mul(g, exp(neg(square(x)))))) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index 5b242a05a953..7a739c26a8e0 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -521,3 +521,11 @@ def _norm_logpdf(x): defjvp(log_ndtr, lambda g, ans, x: lax.mul(g, lax.exp(lax.sub(_norm_logpdf(x), ans)))) + +@_wraps(osp_special.i0e) +def i0e(x): + return lax.bessel_i0e(x) + +@_wraps(osp_special.i1e) +def i1e(x): + return lax.bessel_i1e(x) \ No newline at end of file diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 57d24fee1539..4f4f42a40d06 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -70,6 +70,8 @@ def op_record(name, nargs, dtypes, rng, test_grad, test_name=None): op_record("ndtr", 1, float_dtypes, jtu.rand_default(), True), # TODO(phawkins): gradient of entr yields NaNs. op_record("entr", 1, float_dtypes, jtu.rand_default(), False), + op_record("i0e", 1, float_dtypes, jtu.rand_default(), True), + op_record("i1e", 1, float_dtypes, jtu.rand_default(), True), ] CombosWithReplacement = itertools.combinations_with_replacement @@ -102,16 +104,17 @@ def lax_fun(array_to_reduce): self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": jtu.format_test_name_suffix( - rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, - "test_autodiff": rec.test_autodiff, - "scipy_op": getattr(osp_special, rec.name), - "lax_op": getattr(lsp_special, rec.name)} - for rec in JAX_SPECIAL_FUNCTION_RECORDS - for shapes in CombosWithReplacement(all_shapes, rec.nargs) - for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs))) + @parameterized.named_parameters(itertools.chain.from_iterable( + jtu.cases_from_list( + {"testcase_name": jtu.format_test_name_suffix( + rec.test_name, shapes, dtypes), + "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, + "test_autodiff": rec.test_autodiff, + "scipy_op": getattr(osp_special, rec.name), + "lax_op": getattr(lsp_special, rec.name)} + for shapes in CombosWithReplacement(all_shapes, rec.nargs) + for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) + for rec in JAX_SPECIAL_FUNCTION_RECORDS)) def testScipySpecialFun(self, scipy_op, lax_op, rng, shapes, dtypes, test_autodiff): args_maker = self._GetArgsMaker(rng, shapes, dtypes) From abe6990964adffa431d31af1ef1881630a65cbd0 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 21 Oct 2019 10:56:54 -0400 Subject: [PATCH 0229/1053] Add some @jit decorators to non-primitive lax functions. (#1542) Fix the tests so they don't refer to op.__name__, which no longer has a usable value if the function has been jitted. --- jax/lax/lax.py | 5 ++ tests/lax_test.py | 145 +++++++++++++++++++++++----------------------- 2 files changed, 79 insertions(+), 71 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 85b84917241a..fe895aa1e6ee 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1375,15 +1375,18 @@ def reciprocal(x): r"""Elementwise reciprocal: :math:`1 \over x`.""" return div(_const(x, 1), x) +@api.jit def tan(x): r"""Elementwise tangent: :math:`\mathrm{tan}(x)`.""" return div(sin(x), cos(x)) +@api.jit def asin(x): r"""Elementwise arc sine: :math:`\mathrm{asin}(x)`.""" return mul(_const(x, 2), atan2(x, add(_const(x, 1), sqrt(sub(_const(x, 1), square(x)))))) +@api.jit def acos(x): r"""Elementwise arc cosine: :math:`\mathrm{acos}(x)`.""" return select( @@ -1396,12 +1399,14 @@ def atan(x): r"""Elementwise arc tangent: :math:`\mathrm{atan}(x)`.""" return atan2(x, _const(x, 1)) +@api.jit def sinh(x): r"""Elementwise hyperbolic sine: :math:`\mathrm{sinh}(x)`.""" log_half = _const(x, onp.log(0.5)) # This formulation avoids overflow when e^x is inf but e^x/2 is not inf. return sub(exp(add(log_half, x)), exp(sub(log_half, x))) +@api.jit def cosh(x): r"""Elementwise hyperbolic cosine: :math:`\mathrm{cosh}(x)`.""" log_half = _const(x, onp.log(0.5)) diff --git a/tests/lax_test.py b/tests/lax_test.py index 54727fc9bcdb..05f623fd1ebe 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -71,67 +71,67 @@ def op_record(op, nargs, dtypes, rng, tol=1e-5): return OpRecord(op, nargs, dtypes, rng, tol) LAX_OPS = [ - op_record(lax.neg, 1, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record(lax.sign, 1, default_dtypes, jtu.rand_small()), - op_record(lax.floor, 1, float_dtypes, jtu.rand_small()), - op_record(lax.ceil, 1, float_dtypes, jtu.rand_small()), - op_record(lax.round, 1, float_dtypes, jtu.rand_default()), - - op_record(lax.is_finite, 1, float_dtypes, jtu.rand_small()), - - op_record(lax.exp, 1, float_dtypes + complex_dtypes, jtu.rand_small()), - op_record(lax.expm1, 1, float_dtypes + complex_dtypes, jtu.rand_small()), - op_record(lax.log, 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record(lax.log1p, 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record(lax.tanh, 1, float_dtypes + complex_dtypes, jtu.rand_small()), - op_record(lax.sin, 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record(lax.cos, 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record(lax.atan2, 2, float_dtypes, jtu.rand_default()), - - op_record(lax.sqrt, 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record(lax.rsqrt, 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record(lax.square, 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record(lax.reciprocal, 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record(lax.tan, 1, float_dtypes, jtu.rand_default()), - op_record(lax.asin, 1, float_dtypes, jtu.rand_small()), - op_record(lax.acos, 1, float_dtypes, jtu.rand_small()), - op_record(lax.atan, 1, float_dtypes, jtu.rand_small()), - op_record(lax.sinh, 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record(lax.cosh, 1, float_dtypes + complex_dtypes, jtu.rand_default()), - - op_record(lax.lgamma, 1, float_dtypes, jtu.rand_positive()), - op_record(lax.digamma, 1, float_dtypes, jtu.rand_positive()), - op_record(lax.erf, 1, float_dtypes, jtu.rand_small()), - op_record(lax.erfc, 1, float_dtypes, jtu.rand_small()), - op_record(lax.erf_inv, 1, float_dtypes, jtu.rand_small(), tol=1e-2), - - op_record(lax.real, 1, complex_dtypes, jtu.rand_default()), - op_record(lax.imag, 1, complex_dtypes, jtu.rand_default()), - op_record(lax.complex, 2, [onp.float32], jtu.rand_default()), - op_record(lax.conj, 1, [onp.float32] + complex_dtypes, jtu.rand_default()), - op_record(lax.abs, 1, default_dtypes + complex_dtypes, jtu.rand_default()), - op_record(lax.pow, 2, float_dtypes + complex_dtypes, jtu.rand_positive()), - - op_record(lax.bitwise_and, 2, bool_dtypes, jtu.rand_small()), - op_record(lax.bitwise_not, 1, bool_dtypes, jtu.rand_small()), - op_record(lax.bitwise_or, 2, bool_dtypes, jtu.rand_small()), - op_record(lax.bitwise_xor, 2, bool_dtypes, jtu.rand_small()), - - op_record(lax.add, 2, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record(lax.sub, 2, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record(lax.mul, 2, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record(lax.div, 2, default_dtypes + complex_dtypes, jtu.rand_nonzero()), - op_record(lax.rem, 2, default_dtypes, jtu.rand_nonzero()), - - op_record(lax.max, 2, all_dtypes, jtu.rand_small()), - op_record(lax.min, 2, all_dtypes, jtu.rand_small()), - - op_record(lax.eq, 2, all_dtypes, jtu.rand_some_equal()), - op_record(lax.ne, 2, all_dtypes, jtu.rand_small()), - op_record(lax.ge, 2, default_dtypes, jtu.rand_small()), - op_record(lax.gt, 2, default_dtypes, jtu.rand_small()), - op_record(lax.le, 2, default_dtypes, jtu.rand_small()), - op_record(lax.lt, 2, default_dtypes, jtu.rand_small()), + op_record("neg", 1, default_dtypes + complex_dtypes, jtu.rand_small()), + op_record("sign", 1, default_dtypes, jtu.rand_small()), + op_record("floor", 1, float_dtypes, jtu.rand_small()), + op_record("ceil", 1, float_dtypes, jtu.rand_small()), + op_record("round", 1, float_dtypes, jtu.rand_default()), + + op_record("is_finite", 1, float_dtypes, jtu.rand_small()), + + op_record("exp", 1, float_dtypes + complex_dtypes, jtu.rand_small()), + op_record("expm1", 1, float_dtypes + complex_dtypes, jtu.rand_small()), + op_record("log", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), + op_record("log1p", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), + op_record("tanh", 1, float_dtypes + complex_dtypes, jtu.rand_small()), + op_record("sin", 1, float_dtypes + complex_dtypes, jtu.rand_default()), + op_record("cos", 1, float_dtypes + complex_dtypes, jtu.rand_default()), + op_record("atan2", 2, float_dtypes, jtu.rand_default()), + + op_record("sqrt", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), + op_record("rsqrt", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), + op_record("square", 1, float_dtypes + complex_dtypes, jtu.rand_default()), + op_record("reciprocal", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), + op_record("tan", 1, float_dtypes, jtu.rand_default()), + op_record("asin", 1, float_dtypes, jtu.rand_small()), + op_record("acos", 1, float_dtypes, jtu.rand_small()), + op_record("atan", 1, float_dtypes, jtu.rand_small()), + op_record("sinh", 1, float_dtypes + complex_dtypes, jtu.rand_default()), + op_record("cosh", 1, float_dtypes + complex_dtypes, jtu.rand_default()), + + op_record("lgamma", 1, float_dtypes, jtu.rand_positive()), + op_record("digamma", 1, float_dtypes, jtu.rand_positive()), + op_record("erf", 1, float_dtypes, jtu.rand_small()), + op_record("erfc", 1, float_dtypes, jtu.rand_small()), + op_record("erf_inv", 1, float_dtypes, jtu.rand_small(), tol=1e-2), + + op_record("real", 1, complex_dtypes, jtu.rand_default()), + op_record("imag", 1, complex_dtypes, jtu.rand_default()), + op_record("complex", 2, [onp.float32], jtu.rand_default()), + op_record("conj", 1, [onp.float32] + complex_dtypes, jtu.rand_default()), + op_record("abs", 1, default_dtypes + complex_dtypes, jtu.rand_default()), + op_record("pow", 2, float_dtypes + complex_dtypes, jtu.rand_positive()), + + op_record("bitwise_and", 2, bool_dtypes, jtu.rand_small()), + op_record("bitwise_not", 1, bool_dtypes, jtu.rand_small()), + op_record("bitwise_or", 2, bool_dtypes, jtu.rand_small()), + op_record("bitwise_xor", 2, bool_dtypes, jtu.rand_small()), + + op_record("add", 2, default_dtypes + complex_dtypes, jtu.rand_small()), + op_record("sub", 2, default_dtypes + complex_dtypes, jtu.rand_small()), + op_record("mul", 2, default_dtypes + complex_dtypes, jtu.rand_small()), + op_record("div", 2, default_dtypes + complex_dtypes, jtu.rand_nonzero()), + op_record("rem", 2, default_dtypes, jtu.rand_nonzero()), + + op_record("max", 2, all_dtypes, jtu.rand_small()), + op_record("min", 2, all_dtypes, jtu.rand_small()), + + op_record("eq", 2, all_dtypes, jtu.rand_some_equal()), + op_record("ne", 2, all_dtypes, jtu.rand_small()), + op_record("ge", 2, default_dtypes, jtu.rand_small()), + op_record("gt", 2, default_dtypes, jtu.rand_small()), + op_record("le", 2, default_dtypes, jtu.rand_small()), + op_record("lt", 2, default_dtypes, jtu.rand_small()), ] CombosWithReplacement = itertools.combinations_with_replacement @@ -143,29 +143,31 @@ class LaxTest(jtu.JaxTestCase): @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( - rec.op.__name__, shapes, itertools.repeat(dtype)), - "op": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype} + rec.op, shapes, itertools.repeat(dtype)), + "op_name": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for dtype in rec.dtypes) for rec in LAX_OPS)) - def testOp(self, op, rng, shapes, dtype): + def testOp(self, op_name, rng, shapes, dtype): args_maker = lambda: [rng(shape, dtype) for shape in shapes] + op = getattr(lax, op_name) self._CompileAndCheck(op, args_maker, check_dtypes=True) @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( - rec.op.__name__, shapes, itertools.repeat(dtype)), - "op": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, + rec.op, shapes, itertools.repeat(dtype)), + "op_name": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, "tol": rec.tol} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for dtype in rec.dtypes) for rec in LAX_OPS)) - def testOpAgainstNumpy(self, op, rng, shapes, dtype, tol): + def testOpAgainstNumpy(self, op_name, rng, shapes, dtype, tol): args_maker = lambda: [rng(shape, dtype) for shape in shapes] - numpy_op = getattr(lax_reference, op.__name__) + op = getattr(lax, op_name) + numpy_op = getattr(lax_reference, op_name) self._CheckAgainstNumpy(op, numpy_op, args_maker, tol=tol) # TODO test shift_left, shift_right_arithmetic, shift_right_logical @@ -2346,16 +2348,17 @@ def _CheckBatching(self, op, bdim_size, bdims, shapes, dtype, rng, @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": "{}_bdims={}".format( - jtu.format_test_name_suffix(rec.op.__name__, shapes, + jtu.format_test_name_suffix(rec.op, shapes, itertools.repeat(dtype)), bdims), - "op": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, + "op_name": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, "bdims": bdims} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for bdims in all_bdims(*shapes) for dtype in rec.dtypes) for rec in LAX_OPS)) - def testOp(self, op, rng, shapes, dtype, bdims): + def testOp(self, op_name, rng, shapes, dtype, bdims): + op = getattr(lax, op_name) self._CheckBatching(op, 10, bdims, shapes, dtype, rng) @parameterized.named_parameters(jtu.cases_from_list( From 71ad514e3c4cfc4aaaf2d10dc05776b7010ee95a Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 21 Oct 2019 08:17:25 -0700 Subject: [PATCH 0230/1053] bump version for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 567f15afd9b3..6f744c2e7353 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.46" +__version__ = "0.1.47" From 4732ef2a79e02d6d0c884da3d55a9abf8120c7bc Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 21 Oct 2019 11:39:14 -0400 Subject: [PATCH 0231/1053] Fix lax_reference implementations of erf_inv, conj, complex. (#1543) It turns out you can set the tolerance for the erf_inv test much lower if you compare against the correct reference function... :-) Move Bessel function tests into lax_test.py for consistency. --- jax/lax_reference.py | 8 +++++--- tests/lax_scipy_test.py | 2 -- tests/lax_test.py | 8 +++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/jax/lax_reference.py b/jax/lax_reference.py index e5446b3a4f70..4dd5327dec84 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -62,16 +62,18 @@ digamma = scipy.special.digamma erf = scipy.special.erf erfc = scipy.special.erfc -erf_inv = scipy.special.erfi +erf_inv = scipy.special.erfinv +bessel_i0e = scipy.special.i0e +bessel_i1e = scipy.special.i1e real = onp.real imag = onp.imag def conj(x): - return onp.asarray(onp.conj(x), dtype=onp.complex64) + return onp.conj(x) + onp.complex64(0) def complex(x, y): - return onp.asarray(x + 1j * y, dtype=onp.complex64) + return x + onp.complex64(1j) * y abs = onp.absolute pow = onp.power diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 4f4f42a40d06..f2cc75ee66d0 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -70,8 +70,6 @@ def op_record(name, nargs, dtypes, rng, test_grad, test_name=None): op_record("ndtr", 1, float_dtypes, jtu.rand_default(), True), # TODO(phawkins): gradient of entr yields NaNs. op_record("entr", 1, float_dtypes, jtu.rand_default(), False), - op_record("i0e", 1, float_dtypes, jtu.rand_default(), True), - op_record("i1e", 1, float_dtypes, jtu.rand_default(), True), ] CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/lax_test.py b/tests/lax_test.py index 05f623fd1ebe..7601d9471db0 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -103,7 +103,9 @@ def op_record(op, nargs, dtypes, rng, tol=1e-5): op_record("digamma", 1, float_dtypes, jtu.rand_positive()), op_record("erf", 1, float_dtypes, jtu.rand_small()), op_record("erfc", 1, float_dtypes, jtu.rand_small()), - op_record("erf_inv", 1, float_dtypes, jtu.rand_small(), tol=1e-2), + op_record("erf_inv", 1, float_dtypes, jtu.rand_small()), + op_record("bessel_i0e", 1, float_dtypes, jtu.rand_small()), + op_record("bessel_i1e", 1, float_dtypes, jtu.rand_small()), op_record("real", 1, complex_dtypes, jtu.rand_default()), op_record("imag", 1, complex_dtypes, jtu.rand_default()), @@ -1542,6 +1544,10 @@ def grad_test_spec(op, nargs, order, rng, dtypes, name=None, tol=None): dtypes=[onp.float64]), # grad_test_spec(lax.lgamma, nargs=1, order=2, rng=jtu.rand_small(), # dtypes=[onp.float64]), # TODO(mattjj): enable + grad_test_spec(lax.bessel_i0e, nargs=1, order=2, rng=jtu.rand_default(), + dtypes=[onp.float64]), + grad_test_spec(lax.bessel_i1e, nargs=1, order=2, rng=jtu.rand_default(), + dtypes=[onp.float64]), grad_test_spec(lax.real, nargs=1, order=2, rng=jtu.rand_default(), dtypes=[onp.complex64]), From 1abf7cb2dd107ad5111823c2b7dd7bff3ba5d950 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 21 Oct 2019 11:41:28 -0400 Subject: [PATCH 0232/1053] Remove -Wno-c++98-c++11-compat directive from jaxlib BUILD file. (#1544) We require C++14 now, so the directive is moot. --- jaxlib/BUILD | 3 --- 1 file changed, 3 deletions(-) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index 3c0487e3d947..764d635b2eb7 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -41,7 +41,6 @@ pybind_extension( copts = [ "-fexceptions", "-fno-strict-aliasing", - "-Wno-c++98-c++11-compat", ], features = ["-use_header_modules"], module_name = "pytree", @@ -62,7 +61,6 @@ pybind_extension( copts = [ "-fexceptions", "-fno-strict-aliasing", - "-Wno-c++98-c++11-compat", ], features = ["-use_header_modules"], module_name = "cublas_kernels", @@ -89,7 +87,6 @@ pybind_extension( copts = [ "-fexceptions", "-fno-strict-aliasing", - "-Wno-c++98-c++11-compat", ], features = ["-use_header_modules"], module_name = "cusolver_kernels", From d7ef8834e366eee79d6f3b5acf89999b5acf2682 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 21 Oct 2019 12:32:41 -0400 Subject: [PATCH 0233/1053] Use classic NumPy instead of JAX NumPy in multivariate random test harness. (#1545) Avoids an initialization ordering problem. --- tests/random_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/random_test.py b/tests/random_test.py index 506645ac545d..dd1a158861c2 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -369,12 +369,12 @@ def testT(self, df, dtype): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_mean={}_cov={}_{}".format(mean, cov, dtype), "mean": mean, "cov": cov, "dtype": dtype} - for mean in [0, 5, np.asarray([1, -2, 3]), np.asarray([[1]])] - for cov in [.1, 5, np.asarray([4, 5, 6]), - np.asarray([[4.60, 2.86, 2.33], + for mean in [0, 5, onp.asarray([1, -2, 3]), onp.asarray([[1]])] + for cov in [.1, 5, onp.asarray([4, 5, 6]), + onp.asarray([[4.60, 2.86, 2.33], [2.86, 3.04, 1.74], [2.33, 1.74, 1.83]]), - np.asarray([[[1]]])] + onp.asarray([[[1]]])] for dtype in [onp.float32, onp.float64])) def testMultivariateNormal(self, mean, cov, dtype): key = random.PRNGKey(0) From c485a3cc5059427f0d72178578310e9237f8bfd9 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 21 Oct 2019 13:47:36 -0400 Subject: [PATCH 0234/1053] Remove stale reference to lapax.py. (#1546) Add some missing documentation references. --- docs/jax.lax.rst | 2 ++ jax/BUILD | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index 9b3ddb183b3e..a97593d24926 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -30,6 +30,8 @@ Operators atan atan2 batch_matmul + bessel_i0e + bessel_i1e bitcast_convert_type bitwise_not bitwise_and diff --git a/jax/BUILD b/jax/BUILD index 29af5e039209..c60e17688fc6 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -60,12 +60,6 @@ py_library( deps = [":jax"], ) -py_library( - name = "lapax", - srcs = ["experimental/lapax.py"], - deps = [":jax"], -) - py_library( name = "ode", srcs = ["experimental/ode.py"], From 0ffcd769ef492313aa201bf4a22524b2c557ea43 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 21 Oct 2019 23:24:16 +0200 Subject: [PATCH 0235/1053] Add sklearn to Travis, for documentation building. (#1547) * Add sklearn to Travis, for documentation building. * Add score_matching to auto-built notebooks --- .travis.yml | 1 + docs/conf.py | 3 +-- docs/index.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 324f9bef52d8..2deacdba12d3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,7 @@ install: - if [[ "$JAX_ONLY_DOCUMENTATION" != "" ]]; then conda install --yes -c conda-forge pandoc ipykernel; conda install --yes sphinx sphinx_rtd_theme nbsphinx jupyter_client matplotlib; + pip install sklearn; fi script: - if [[ "$JAX_ONLY_DOCUMENTATION" == "" ]]; then diff --git a/docs/conf.py b/docs/conf.py index d130881c5c8b..06268367ea9b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -92,9 +92,8 @@ exclude_patterns = [ # Slow notebook: long time to load tf.ds 'notebooks/neural_network_with_tfds_data.ipynb', + # Slow notebook 'notebooks/Neural_Network_and_Data_Loading.ipynb', - # Next one needs sklearn, which is not available at Travis. - 'notebooks/score_matching.ipynb' ] # The name of the Pygments (syntax highlighting) style to use. diff --git a/docs/index.rst b/docs/index.rst index 10f26434c8fb..55ae8c742169 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,7 +25,7 @@ For an introduction to JAX, start at the notebooks/How_JAX_primitives_work Training a Simple Neural Network, with Tensorflow Datasets Data Loading notebooks/maml - Generative Modeling by Estimating Gradients of Data Distribution + notebooks/score_matching notebooks/vmapped_log_probs .. toctree:: From 0601b8cdc7d7cb6a89990e40380dc469ab7103af Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 21 Oct 2019 15:11:51 -0700 Subject: [PATCH 0236/1053] make lax.broadcast_in_dim work on scalars fixes #1548 --- jax/lax/lax.py | 2 +- tests/lax_numpy_test.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index fe895aa1e6ee..0a648671b23c 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -599,7 +599,7 @@ def broadcast(operand, sizes): return broadcast_p.bind(operand, sizes=tuple(sizes)) def broadcast_in_dim(operand, shape, broadcast_dimensions): - if operand.ndim == len(shape) and not len(broadcast_dimensions): + if onp.ndim(operand) == len(shape) and not len(broadcast_dimensions): return operand if any(x < 0 or x >= len(shape) for x in broadcast_dimensions): msg = ("broadcast dimensions must be >= 0 and < ndim(shape), got {} for " diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 305bfe6ae9c8..c7974658f6fa 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1952,6 +1952,10 @@ def testBroadcastToIssue1522(self): ValueError, "Incompatible shapes for broadcasting: .*", lambda: lnp.broadcast_to(onp.ones((2, 3)), (1, 3))) + def testBroadcastToIntIssue1548(self): + self.assertAllClose(lnp.broadcast_to(1, (3, 2)), onp.ones((3, 2)), + check_dtypes=False) + # Most grad tests are at the lax level (see lax_test.py), but we add some here # as needed for e.g. particular compound ops of interest. From d822d6bc450224aa6a796159c47663ff7df3561c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 21 Oct 2019 15:45:02 -0700 Subject: [PATCH 0237/1053] Update README to point to jaxlib-0.1.31 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fde1d0ba6b4f..ca2db1d3cfaf 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.30-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.31-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From 96272d5a53a5e52c40c8adbc4913ac9790bd6efb Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 22 Oct 2019 00:22:24 +0000 Subject: [PATCH 0238/1053] fix bad merge --- tests/random_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/random_test.py b/tests/random_test.py index 908277bfefdf..e6e6a86fe048 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -371,6 +371,7 @@ def testT(self, df, dtype): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}D_{}".format(dim, onp.dtype(dtype).name), "dim": dim, "dtype": dtype} + for dim in [1, 3, 5] for dtype in [onp.float32, onp.float64])) def testMultivariateNormal(self, dim, dtype): r = onp.random.RandomState(dim) From 5b724e0019243cc5ebb71d65963e1d829f65999e Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 21 Oct 2019 18:03:36 -0700 Subject: [PATCH 0239/1053] Fix grad(jit(custom_linear_solve)) encounters ad_util.Zero in backwards pass (#1537) Fixes https://github.com/google/jax/issues/1536 I wrote a regression test, but I could not figure how to trigger this directly with triangular_solve alone. --- jax/lax_linalg.py | 7 +++++-- tests/lax_control_flow_test.py | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 1c90de1c3a13..62be12a33a27 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -354,8 +354,11 @@ def triangular_solve_transpose_rule( # Triangular solve is nonlinear in its first argument and linear in its second # argument, analogous to `div` but swapped. assert a is not ad.undefined_primal and b is ad.undefined_primal - cotangent_b = triangular_solve(a, cotangent, left_side, lower, - not transpose_a, conjugate_a, unit_diagonal) + if cotangent is ad_util.zero: + cotangent_b = ad_util.zero + else: + cotangent_b = triangular_solve(a, cotangent, left_side, lower, + not transpose_a, conjugate_a, unit_diagonal) return [None, cotangent_b] diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 95f404574027..880721976758 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1227,6 +1227,9 @@ def transpose_solve(vecmat, x): jtu.check_grads(linear_solve, (a, b), order=2) + # regression test for https://github.com/google/jax/issues/1536 + jtu.check_grads(api.jit(linear_solve), (a, b), order=2) + def test_custom_linear_solve_without_transpose_solve(self): def explicit_jacobian_solve(matvec, b): From d9b45ba30b2d7e0bf51e949862f536b406501472 Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Tue, 22 Oct 2019 20:44:54 +0100 Subject: [PATCH 0240/1053] Switch to gelu approximation in jax.nn Approximate GELU is much faster than exact GELU. The @jarrett annotation has been removed, as experiments indicate that jax.grad(gelu) is faster tahn jax.grad(jax.jarrett(gelu)) on CPU. --- jax/nn/functions.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index df784c06ae08..a3242fd30c7b 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -54,10 +54,14 @@ def selu(x): scale = 1.0507009873554804934193349852946 return scale * elu(x, alpha) -@jarrett def gelu(x): - """Gaussian error linear unit activation""" - return x * (lax.erf(x / np.sqrt(2)) + 1) / 2 + """GELU activation function. + + We explicitly use the approximation rather than the exact formulation for + speed. See: https://arxiv.org/abs/1606.08415 Section 2. + """ + cdf = 0.5 * (1.0 + np.tanh((np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))) + return x * cdf def glu(x, axis=-1): """Gated linear unit activation""" From b84caafa55b946b3fb917a75afa55a83b6136e9c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 22 Oct 2019 13:01:18 -0700 Subject: [PATCH 0241/1053] bump version for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 6f744c2e7353..282252524cf8 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.47" +__version__ = "0.1.48" From 0d667d27273350ebdb68ef0dfec9427c6d695b3e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 22 Oct 2019 19:53:59 -0400 Subject: [PATCH 0242/1053] Add tests for float16 support in lax_test.py. (#1553) * Add tests for float16 support in lax_test.py. Make test tolerances per-type, rather than a single tolerance based on the x64 mode. Don't test float16 on TPU because it doesn't support float16. Rework a number of the gradient tests. For linear primitives, increase eps and use a per-type tol. * Perform float16 sinh and cosh in float32 precision. More tweaks to test tolerances to get tests to pass. * Add float16 testing to lax_numpy_test.py as well. * Fix tolerance computation for testReducer test. Relax tolerance for polyval. * Relax some test tolerances further. * Further relax test tolerances. * Another tolerance relaxation. * Use decorator for the upcast to fp32 for computation pattern. Relax test tolerance for float_power. --- jax/lax/__init__.py | 2 +- jax/lax/lax.py | 16 +++- jax/numpy/lax_numpy.py | 27 +++++- jax/test_util.py | 17 +++- tests/lax_numpy_test.py | 204 ++++++++++++++++++++++++++++++---------- tests/lax_test.py | 190 +++++++++++++++++++++++++------------ 6 files changed, 341 insertions(+), 115 deletions(-) diff --git a/jax/lax/__init__.py b/jax/lax/__init__.py index c34eb45f6768..97a20246fd8a 100644 --- a/jax/lax/__init__.py +++ b/jax/lax/__init__.py @@ -19,7 +19,7 @@ _reduce_window_min, _reduce_window_prod, _float, _complex, _input_dtype, _const, _eq_meet, _safe_mul, _broadcasting_select, _check_user_dtype_supported, - _one, _const) + _one, _const, _upcast_fp16_for_computation) from .lax_control_flow import * from .lax_fft import * from .lax_parallel import * diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 0a648671b23c..cfb3d7fcfebb 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -18,6 +18,7 @@ import collections import enum +import functools import itertools import operator import string @@ -1399,7 +1400,19 @@ def atan(x): r"""Elementwise arc tangent: :math:`\mathrm{atan}(x)`.""" return atan2(x, _const(x, 1)) +def _upcast_fp16_for_computation(f): + @functools.wraps(f) + def f_wrapped(x): + dtype = _dtype(x) + if dtype == onp.float16: + return convert_element_type( + f(convert_element_type(x, onp.float32)), dtype) + return f(x) + + return f_wrapped + @api.jit +@_upcast_fp16_for_computation def sinh(x): r"""Elementwise hyperbolic sine: :math:`\mathrm{sinh}(x)`.""" log_half = _const(x, onp.log(0.5)) @@ -1407,6 +1420,7 @@ def sinh(x): return sub(exp(add(log_half, x)), exp(sub(log_half, x))) @api.jit +@_upcast_fp16_for_computation def cosh(x): r"""Elementwise hyperbolic cosine: :math:`\mathrm{cosh}(x)`.""" log_half = _const(x, onp.log(0.5)) @@ -1664,7 +1678,7 @@ def _bessel_i1e_jvp(g, y, x): 'complex') ad.deflinear(complex_p, lambda t: [real(t), imag(neg(t))]) -conj_p = unop(_complex_dtype, _float | _complex, 'conj') +conj_p = unop(_complex_dtype, _complex_elem_types | _complex, 'conj') def _conj_transpose_rule(t, x, input_dtype): assert x is ad.undefined_primal diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 38a146c88d51..e768364fd899 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -575,6 +575,8 @@ def sinc(x): @_wraps(onp.arcsinh) @custom_transforms +@jit +@lax._upcast_fp16_for_computation def arcsinh(x): # asinh(x) = log(x + sqrt(x**2 + 1)) x, = _promote_to_result_dtype(onp.arcsinh, x) @@ -586,10 +588,13 @@ def arcsinh(x): sqrt_max_value = onp.sqrt(onp.finfo(_dtype(x)).max) log2 = lax._const(a, onp.log(2)) return lax.select(a < sqrt_max_value, result, lax.sign(x) * (lax.log(a) + log2)) + defjvp(arcsinh, lambda g, ans, x: g / lax.sqrt(lax._const(x, 1) + square(x))) @_wraps(onp.arccosh) +@jit +@lax._upcast_fp16_for_computation def arccosh(x): # acosh(x) = log(x + sqrt((x + 1) * (x - 1))) if x < sqrt_max_value # log(x) + log(2) otherwise @@ -947,6 +952,18 @@ def _dtype_info(dtype): return onp.iinfo(dtype) return onp.finfo(dtype) +def _round_to_nearest_even(x): + half = lax._const(x, 0.5) + one = lax._const(x, 1) + round_val = lax.floor(x) + fraction = x - round_val + nearest_even_int = lax.sub( + round_val, lax.mul(lax._const(x, 2), lax.floor(lax.mul(half, x)))) + is_odd = lax.eq(nearest_even_int, one) + return lax.select( + lax.bitwise_or(lax.gt(fraction, half), + lax.bitwise_and(lax.eq(fraction, half), is_odd)), + lax.add(round_val, one), round_val) @_wraps(onp.round) def round(a, decimals=0): @@ -959,10 +976,16 @@ def round(a, decimals=0): def _round_float(x): if decimals == 0: - return lax.round(x) + return _round_to_nearest_even(x) + # TODO(phawkins): the strategy of rescaling the value isn't necessarily a + # good one since we may be left with an incorrectly rounded value at the + # end due to precision problems. As a workaround for float16, convert to + # float32, + x = lax.convert_element_type(x, onp.float32) if dtype == onp.float16 else x factor = _constant_like(x, 10 ** decimals) - return lax.div(lax.round(lax.mul(x, factor)), factor) + out = lax.div(_round_to_nearest_even(lax.mul(x, factor)), factor) + return lax.convert_element_type(out, dtype) if dtype == onp.float16 else out if issubdtype(dtype, complexfloating): return lax.complex(_round_float(lax.real(a)), _round_float(lax.imag(a))) diff --git a/jax/test_util.py b/jax/test_util.py index 15b284e171de..d3b91e883ee7 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -133,7 +133,10 @@ def check_jvp(f, f_jvp, args, atol=ATOL, rtol=RTOL, eps=EPS): v_out, t_out = f_jvp(args, tangent) v_out_expected = f(*args) t_out_expected = numerical_jvp(f, args, tangent, eps=eps) - check_eq(v_out, v_out_expected) + # In principle we should expect exact equality of v_out and v_out_expected, + # but due to nondeterminism especially on GPU (e.g., due to convolution + # autotuning) we only require "close". + check_close(v_out, v_out_expected, atol=atol, rtol=rtol) check_close(t_out, t_out_expected, atol=atol, rtol=rtol) @@ -141,7 +144,7 @@ def check_vjp(f, f_vjp, args, atol=ATOL, rtol=RTOL, eps=EPS): _rand_like = partial(rand_like, onp.random.RandomState(0)) v_out, vjpfun = f_vjp(*args) v_out_expected = f(*args) - check_eq(v_out, v_out_expected) + check_close(v_out, v_out_expected, atol=atol, rtol=rtol) tangent = tree_map(_rand_like, args) tangent_out = numerical_jvp(f, args, tangent, eps=eps) cotangent = tree_map(_rand_like, v_out) @@ -181,6 +184,16 @@ def f_vjp(*args): def device_under_test(): return FLAGS.jax_test_dut or xla_bridge.get_backend().platform +def supported_dtypes(): + if device_under_test() == "tpu": + return {onp.bool_, onp.int32, onp.int64, onp.uint32, onp.uint64, + onp.float32, onp.complex64} + else: + return {onp.bool_, onp.int8, onp.int16, onp.int32, onp.int64, + onp.uint8, onp.uint16, onp.uint32, onp.uint64, + onp.float16, onp.float32, onp.float64, onp.complex64, + onp.complex128} + def skip_on_devices(*disabled_devices): """A decorator for test methods to skip the test on certain devices.""" def skip(test_method): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index c7974658f6fa..77b41e30ae70 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -56,7 +56,8 @@ nonempty_shapes = scalar_shapes + nonempty_array_shapes all_shapes = scalar_shapes + array_shapes -float_dtypes = [onp.float32, onp.float64] +float_dtypes = list(jtu.supported_dtypes().intersection( + {onp.float16, onp.float32, onp.float64})) complex_dtypes = [onp.complex64, onp.complex128] int_dtypes = [onp.int32, onp.int64] unsigned_dtypes = [onp.uint32, onp.uint64] @@ -69,14 +70,35 @@ OpRecord = collections.namedtuple( "OpRecord", ["name", "nargs", "dtypes", "shapes", "rng", "diff_modes", "test_name", - "check_dtypes"]) + "check_dtypes", "tolerance"]) + +default_tolerance = { + onp.bool_: 0, + onp.int16: 0, + onp.int32: 0, + onp.int64: 0, + onp.float16: 1e-3, + onp.float32: 1e-6, + onp.float64: 1e-15, + onp.complex64: 1e-6, + onp.complex128: 1e-15, +} + +def tolerance(dtype, tol=None): + if not FLAGS.jax_enable_x64: + if dtype == onp.float64: + dtype = onp.float32 + elif dtype == onp.complex128: + dtype = onp.complex64 + tol = tol or {} + return tol.get(dtype, default_tolerance[dtype]) def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, - check_dtypes=True): + check_dtypes=True, tolerance=None): test_name = test_name or name return OpRecord(name, nargs, dtypes, shapes, rng, diff_modes, test_name, - check_dtypes) + check_dtypes, tolerance) JAX_ONE_TO_ONE_OP_RECORDS = [ op_record("abs", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), @@ -86,7 +108,9 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal(), []), op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("float_power", 2, inexact_dtypes, all_shapes, jtu.rand_default(), ["rev"]), + op_record("float_power", 2, inexact_dtypes, all_shapes, jtu.rand_default(), ["rev"], + tolerance={onp.float32: 1e-5, onp.float64: 1e-12, + onp.complex64: 1e-5, onp.complex128: 1e-12}), op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default(), []), op_record("greater", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), []), op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), []), @@ -111,7 +135,11 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, ["rev"]), op_record("sinh", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), op_record("cosh", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("tanh", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), + # TODO(b/142975473): on CPU, tanh for complex128 is only accurate to + # ~float32 precision. + # TODO(b/143135720): on GPU, tanh has only ~float32 precision. + op_record("tanh", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], + tolerance={onp.float64: 1e-7, onp.complex128: 1e-7}), op_record("arcsin", 1, float_dtypes, all_shapes, jtu.rand_small(), ["rev"]), op_record("arccos", 1, float_dtypes, all_shapes, jtu.rand_small(), ["rev"]), op_record("arctan", 1, float_dtypes, all_shapes, jtu.rand_small(), ["rev"]), @@ -132,10 +160,14 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("conjugate", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), op_record("deg2rad", 1, float_dtypes, all_shapes, jtu.rand_default(), []), op_record("divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), ["rev"]), - op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), + op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], + tolerance={onp.float16: 1e-2}), + # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 + # precision. op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_positive(), [], - test_name="expm1_large"), - op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), []), + test_name="expm1_large", tolerance={onp.float64: 1e-8}), + op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), + [], tolerance={onp.float64: 1e-8}), op_record("fix", 1, float_dtypes, all_shapes, jtu.rand_default(), []), op_record("floor_divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), ["rev"]), op_record("heaviside", 2, default_dtypes, all_shapes, jtu.rand_default(), []), @@ -154,11 +186,16 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("log2", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), op_record("log10", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_positive(), [], - test_name="log1p_large"), - op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), []), - op_record("logaddexp", 2, float_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("logaddexp2", 2, float_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("polyval", 2, number_dtypes, nonempty_nonscalar_array_shapes, jtu.rand_default(), []), + test_name="log1p_large", tolerance={onp.float64: 1e-12}), + op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), [], + tolerance={onp.float64: 1e-12}), + op_record("logaddexp", 2, float_dtypes, all_shapes, jtu.rand_default(), ["rev"], + tolerance={onp.float64: 1e-12}), + op_record("logaddexp2", 2, float_dtypes, all_shapes, jtu.rand_default(), ["rev"], + tolerance={onp.float16: 1e-2}), + op_record("polyval", 2, number_dtypes, nonempty_nonscalar_array_shapes, + jtu.rand_default(), [], check_dtypes=False, + tolerance={onp.float16: 1e-2, onp.float64: 1e-12}), op_record("positive", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), op_record("power", 2, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), op_record("rad2deg", 1, float_dtypes, all_shapes, jtu.rand_default(), []), @@ -220,7 +257,8 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("__ge__", 2, default_dtypes, all_shapes, jtu.rand_default(), []), op_record("__neg__", 1, number_dtypes, all_shapes, jtu.rand_default(), []), op_record("__pow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive(), []), - op_record("__mod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), + op_record("__mod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), [], + tolerance={onp.float16: 1e-1}), op_record("__floordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), op_record("__truediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), op_record("__abs__", 1, number_dtypes, all_shapes, jtu.rand_default(), []), @@ -239,7 +277,8 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("__rsub__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), op_record("__rmul__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), op_record("__rpow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive(), []), - op_record("__rmod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), + op_record("__rmod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), [], + tolerance={onp.float16: 1e-1}), op_record("__rfloordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), op_record("__rtruediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), # op_record("__ror__", 2, number_dtypes, all_shapes, jtu.rand_bool(), []), @@ -311,53 +350,76 @@ def _GetArgsMaker(self, rng, shapes, dtypes): dtypes), "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), - "check_dtypes": rec.check_dtypes} + "check_dtypes": rec.check_dtypes, "op_tolerance": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in itertools.chain(JAX_ONE_TO_ONE_OP_RECORDS, JAX_COMPOUND_OP_RECORDS))) - def testOp(self, onp_op, lnp_op, rng, shapes, dtypes, check_dtypes): + def testOp(self, onp_op, lnp_op, rng, shapes, dtypes, check_dtypes, + op_tolerance): args_maker = self._GetArgsMaker(rng, shapes, dtypes) - py_scalar_arg = jtu.PYTHON_SCALAR_SHAPE in shapes - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, - check_dtypes=check_dtypes and not py_scalar_arg) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=check_dtypes) + scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or + jtu.NUMPY_SCALAR_SHAPE in shapes or + () in shapes) + empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) + tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) + self._CheckAgainstNumpy( + onp_op, lnp_op, args_maker, + check_dtypes=check_dtypes and not scalar_arg and not empty_shape, + tol=tol) + self._CompileAndCheck(lnp_op, args_maker, check_dtypes=check_dtypes, + atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix(rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, "name": rec.name} + "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, "name": rec.name, + "op_tolerance": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in JAX_OPERATOR_OVERLOADS)) - def testOperatorOverload(self, name, rng, shapes, dtypes): + def testOperatorOverload(self, name, rng, shapes, dtypes, op_tolerance): args_maker = self._GetArgsMaker(rng, shapes, dtypes) fun = lambda *xs: getattr(operator, name.strip('_'))(*xs) - self._CompileAndCheck(fun, args_maker, - check_dtypes=jtu.PYTHON_SCALAR_SHAPE not in shapes) + tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) + scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or + jtu.NUMPY_SCALAR_SHAPE in shapes or + () in shapes) + empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) + self._CompileAndCheck( + fun, args_maker, check_dtypes=not scalar_arg and not empty_shape, + atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix(rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, "name": rec.name} + "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, "name": rec.name, + "op_tolerance": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in JAX_RIGHT_OPERATOR_OVERLOADS)) - def testRightOperatorOverload(self, name, rng, shapes, dtypes): + def testRightOperatorOverload(self, name, rng, shapes, dtypes, + op_tolerance): if shapes[1] is jtu.PYTHON_SCALAR_SHAPE: raise SkipTest() # TODO(mattjj): clean up args_maker = self._GetArgsMaker(rng, shapes, dtypes) fun = lambda fst, snd: getattr(snd, name)(fst) - self._CompileAndCheck(fun, args_maker, - check_dtypes=jtu.PYTHON_SCALAR_SHAPE not in shapes) + tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) + scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or + jtu.NUMPY_SCALAR_SHAPE in shapes or + () in shapes) + empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) + self._CompileAndCheck( + fun, args_maker, check_dtypes=not scalar_arg and not empty_shape, + atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( @@ -398,8 +460,13 @@ def testReducer(self, onp_op, lnp_op, rng, shape, dtype, out_dtype, axis, keepdi onp_fun = lambda x: onp_op(x, axis, dtype=out_dtype, keepdims=keepdims) lnp_fun = lambda x: lnp_op(x, axis, dtype=out_dtype, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + tol_spec = {onp.float16: 1e-2, onp.float64: 1e-6, onp.complex128: 1e-6} + tol = tolerance(dtype, tol_spec) + tol = max(tol, tolerance(out_dtype, tol_spec)) if out_dtype else tol + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, + rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "{}_inshape={}_axis={}_keepdims={}".format( @@ -484,8 +551,12 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): axisa, axisb, axisc, axis = axes lnp_fun = lambda a, b: lnp.cross(a, b, axisa, axisb, axisc, axis) onp_fun = lambda a, b: onp.cross(a, b, axisa, axisb, axisc, axis) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + tol_spec = {onp.float16: 1e-2} + tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, + rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_{}_{}".format( @@ -510,8 +581,12 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): for lhs_dtype, rhs_dtype in CombosWithReplacement(number_dtypes, 2))) def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] - self._CheckAgainstNumpy(onp.dot, lnp.dot, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp.dot, args_maker, check_dtypes=True) + tol_spec = {onp.float16: 1e-2} + tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) + self._CheckAgainstNumpy(onp.dot, lnp.dot, args_maker, check_dtypes=True, + tol=tol) + self._CompileAndCheck(lnp.dot, args_maker, check_dtypes=True, atol=tol, + rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_{}_{}".format( @@ -536,9 +611,12 @@ def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): for lhs_dtype, rhs_dtype in CombosWithReplacement(number_dtypes, 2))) def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] + tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.float64: 1e-12} + tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) self._CheckAgainstNumpy(onp.matmul, lnp.matmul, args_maker, - check_dtypes=True) - self._CompileAndCheck(lnp.matmul, args_maker, check_dtypes=True) + check_dtypes=True, tol=tol) + self._CompileAndCheck(lnp.matmul, args_maker, check_dtypes=True, atol=tol, + rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_{}_{}".format( @@ -561,7 +639,10 @@ def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] lnp_fun = lambda a, b: lnp.tensordot(a, b, axes) onp_fun = lambda a, b: onp.tensordot(a, b, axes) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + tol_spec = {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-12, + onp.complex64: 1e-3, onp.complex128: 1e-12} + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec))) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -582,8 +663,12 @@ def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] onp_fun = lambda lhs, rhs: onp.inner(lhs, rhs) lnp_fun = lambda lhs, rhs: lnp.inner(lhs, rhs) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + tol = max(tolerance(lhs_dtype), tolerance(rhs_dtype)) + # TODO(phawkins): there are float32/float64 disagreements for some inputs. + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, + tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=False, atol=tol, + rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_amin={}_amax={}".format( @@ -613,8 +698,11 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng): onp_fun = lambda x: onp.round(x, decimals=decimals) lnp_fun = lambda x: lnp.round(x, decimals=decimals) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + tol = tolerance(dtype, {onp.float16: 1e-2}) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, + rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_mode={}_rpadwidth={}_rconstantvalues={}".format( @@ -782,7 +870,9 @@ def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, lnp_op, rng): args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + tol = max(tolerance(dtype), tolerance(out_dtype)) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -1117,11 +1207,16 @@ def testAverage(self, shape, dtype, axis, weights_shape, returned, rng): lnp_fun = lambda x, weights: lnp.average(x, axis, weights, returned) args_maker = lambda: [rng(shape, dtype), rng(weights_shape, dtype)] + tol = tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-3, + onp.float64: 1e-10, onp.complex64: 1e-3, + onp.complex128: 1e-10}) try: - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=tol) except ZeroDivisionError: self.skipTest("don't support checking for ZeroDivisionError") - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol, + atol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_arg{}_ndmin={}".format(i, ndmin), @@ -1516,7 +1611,8 @@ def testVander(self, shape, dtype, n, increasing, rng): args_maker = lambda: [rng([shape], dtype)] # np.vander seems to return float64 for all floating types. We could obey # those semantics, but they seem like a bug. - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, + tol=tolerance(dtype)) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=False) @parameterized.named_parameters(jtu.cases_from_list( @@ -1606,8 +1702,9 @@ def args_maker(): for shape, dtype in zip(shapes[n:-1], dtypes[:n])] default = rng(shapes[-1], dtypes[-1]) return condlist, choicelist, default + # TODO(phawkins): float32/float64 type mismatches self._CheckAgainstNumpy(onp.select, lnp.select, args_maker, - check_dtypes=True) + check_dtypes=False) self._CompileAndCheck(lnp.select, args_maker, check_dtypes=True) @@ -1762,7 +1859,9 @@ def testMathSpecialFloatValues(self, op, dtype): x = dtype(x) expected = onp_op(x) actual = lnp_op(x) - self.assertAllClose(expected, actual, check_dtypes=True) + tol = tolerance(dtype, {onp.float32: 1e-3, onp.float64: 1e-7}) + self.assertAllClose(expected, actual, check_dtypes=True, atol=tol, + rtol=tol) def testIssue883(self): # from https://github.com/google/jax/issues/883 @@ -1801,8 +1900,11 @@ def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng): args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) lnp_fun = partial(lnp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + tol = tolerance(out_dtype, {onp.float16: 1e-1}) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol, + atol=tol) @parameterized.named_parameters( jtu.cases_from_list( diff --git a/tests/lax_test.py b/tests/lax_test.py index 7601d9471db0..7eb394a4951c 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -53,7 +53,8 @@ def num_float_bits(dtype): # For standard unops and binops, we can generate a large number of tests on # arguments of appropriate shapes and dtypes using the following table. -float_dtypes = [onp.float32, onp.float64] +float_dtypes = list(jtu.supported_dtypes().intersection( + {onp.float16, onp.float32, onp.float64})) complex_dtypes = [onp.complex64, onp.complex128] inexact_dtypes = float_dtypes + complex_dtypes int_dtypes = [onp.int32, onp.int64] @@ -63,11 +64,32 @@ def num_float_bits(dtype): compatible_shapes = [[(3,)], [(3, 4), (3, 1), (1, 4)], [(2, 3, 4), (2, 1, 4)]] +default_tolerance = { + onp.bool_: 0, + onp.int16: 0, + onp.int32: 0, + onp.int64: 0, + onp.float16: 1e-3, + onp.float32: 1e-6, + onp.float64: 1e-15, + onp.complex64: 1e-6, + onp.complex128: 1e-15, +} + +def tolerance(dtype, tol=None): + if not FLAGS.jax_enable_x64: + if dtype == onp.float64: + dtype = onp.float32 + elif dtype == onp.complex128: + dtype = onp.complex64 + tol = tol or {} + return tol.get(dtype, default_tolerance[dtype]) + + OpRecord = collections.namedtuple("OpRecord", ["op", "nargs", "dtypes", "rng", "tol"]) - -def op_record(op, nargs, dtypes, rng, tol=1e-5): +def op_record(op, nargs, dtypes, rng, tol=None): return OpRecord(op, nargs, dtypes, rng, tol) LAX_OPS = [ @@ -80,10 +102,17 @@ def op_record(op, nargs, dtypes, rng, tol=1e-5): op_record("is_finite", 1, float_dtypes, jtu.rand_small()), op_record("exp", 1, float_dtypes + complex_dtypes, jtu.rand_small()), - op_record("expm1", 1, float_dtypes + complex_dtypes, jtu.rand_small()), + # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 + # precision. + op_record("expm1", 1, float_dtypes + complex_dtypes, jtu.rand_small(), + {onp.float64: 1e-8}), op_record("log", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), op_record("log1p", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record("tanh", 1, float_dtypes + complex_dtypes, jtu.rand_small()), + # TODO(b/142975473): on CPU, tanh for complex128 is only accurate to + # ~float32 precision. + # TODO(b/143135720): on GPU, tanh has only ~float32 precision. + op_record("tanh", 1, float_dtypes + complex_dtypes, jtu.rand_small(), + {onp.float64: 1e-9, onp.complex128: 1e-7}), op_record("sin", 1, float_dtypes + complex_dtypes, jtu.rand_default()), op_record("cos", 1, float_dtypes + complex_dtypes, jtu.rand_default()), op_record("atan2", 2, float_dtypes, jtu.rand_default()), @@ -92,25 +121,31 @@ def op_record(op, nargs, dtypes, rng, tol=1e-5): op_record("rsqrt", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), op_record("square", 1, float_dtypes + complex_dtypes, jtu.rand_default()), op_record("reciprocal", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record("tan", 1, float_dtypes, jtu.rand_default()), + op_record("tan", 1, float_dtypes, jtu.rand_default(), {onp.float32: 1e-5}), op_record("asin", 1, float_dtypes, jtu.rand_small()), op_record("acos", 1, float_dtypes, jtu.rand_small()), op_record("atan", 1, float_dtypes, jtu.rand_small()), op_record("sinh", 1, float_dtypes + complex_dtypes, jtu.rand_default()), op_record("cosh", 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record("lgamma", 1, float_dtypes, jtu.rand_positive()), - op_record("digamma", 1, float_dtypes, jtu.rand_positive()), + op_record("lgamma", 1, float_dtypes, jtu.rand_positive(), + {onp.float32: 1e-5, onp.float64: 1e-14}), + op_record("digamma", 1, float_dtypes, jtu.rand_positive(), + {onp.float64: 1e-14}), op_record("erf", 1, float_dtypes, jtu.rand_small()), op_record("erfc", 1, float_dtypes, jtu.rand_small()), - op_record("erf_inv", 1, float_dtypes, jtu.rand_small()), - op_record("bessel_i0e", 1, float_dtypes, jtu.rand_small()), - op_record("bessel_i1e", 1, float_dtypes, jtu.rand_small()), + # TODO(b/142976030): the approximation of erfinf used by XLA is only + # accurate to float32 precision. + op_record("erf_inv", 1, float_dtypes, jtu.rand_small(), + {onp.float64: 1e-9}), + op_record("bessel_i0e", 1, float_dtypes, jtu.rand_default()), + op_record("bessel_i1e", 1, float_dtypes, jtu.rand_default()), op_record("real", 1, complex_dtypes, jtu.rand_default()), op_record("imag", 1, complex_dtypes, jtu.rand_default()), - op_record("complex", 2, [onp.float32], jtu.rand_default()), - op_record("conj", 1, [onp.float32] + complex_dtypes, jtu.rand_default()), + op_record("complex", 2, [onp.float32, onp.float64], jtu.rand_default()), + op_record("conj", 1, [onp.float32, onp.float64] + complex_dtypes, + jtu.rand_default()), op_record("abs", 1, default_dtypes + complex_dtypes, jtu.rand_default()), op_record("pow", 2, float_dtypes + complex_dtypes, jtu.rand_positive()), @@ -170,7 +205,7 @@ def testOpAgainstNumpy(self, op_name, rng, shapes, dtype, tol): args_maker = lambda: [rng(shape, dtype) for shape in shapes] op = getattr(lax, op_name) numpy_op = getattr(lax_reference, op_name) - self._CheckAgainstNumpy(op, numpy_op, args_maker, tol=tol) + self._CheckAgainstNumpy(op, numpy_op, args_maker, tol=tolerance(dtype, tol)) # TODO test shift_left, shift_right_arithmetic, shift_right_logical @@ -613,7 +648,10 @@ def testDot(self, lhs_shape, rhs_shape, dtype, precision, rng): for rng in [jtu.rand_default()])) def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng): args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] - self._CheckAgainstNumpy(lax.dot, lax_reference.dot, args_maker) + tol = {onp.float16: 1e-2, + onp.float64: max(default_tolerance[onp.float64], 1e-14)} + self._CheckAgainstNumpy(lax.dot, lax_reference.dot, args_maker, + tol=tolerance(dtype, tol)) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -1611,6 +1649,25 @@ def check_grads_bilinear(f, args, order, modes=modes, atol=atol, rtol=rtol, eps=1.) +default_gradient_tolerance = { + onp.float16: 1e-2, + onp.float32: 1e-6, + onp.float64: 1e-10, + onp.complex64: 1e-6, + onp.complex128: 1e-10, +} + +def gradient_tolerance(dtype, tol=None): + if dtype == onp.complex64: + dtype = onp.float32 + elif dtype == onp.complex128: + dtype = onp.float64 + if not FLAGS.jax_enable_x64 and dtype == onp.float64: + dtype = onp.float32 + tol = tol or {} + return tol.get(dtype, default_gradient_tolerance[dtype]) + + class LaxAutodiffTest(jtu.JaxTestCase): @parameterized.named_parameters(itertools.chain.from_iterable( @@ -1647,9 +1704,10 @@ def testOpGradSpecialValue(self, op, special_value): float_dtypes + complex_dtypes, repeat=2) for rng in [jtu.rand_default()])) def testConvertElementTypeGrad(self, from_dtype, to_dtype, rng): + tol = max(gradient_tolerance(to_dtype), gradient_tolerance(from_dtype)) args = (rng((2, 3), from_dtype),) convert_element_type = lambda x: lax.convert_element_type(x, to_dtype) - check_grads(convert_element_type, args, 2, ["fwd", "rev"], 1e-3, 1e-3, 1e-3) + check_grads(convert_element_type, args, 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_min_shape={}_operand_shape={}_max_shape={}".format( @@ -1666,11 +1724,13 @@ def testConvertElementTypeGrad(self, from_dtype, to_dtype, rng): for dtype in float_dtypes for rng in [jtu.rand_default()])) def testClampGrad(self, min_shape, operand_shape, max_shape, dtype, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-2}) shapes = [min_shape, operand_shape, max_shape] min, operand, max = (rng(shape, dtype) for shape in shapes) min, max = onp.minimum(min, max), onp.maximum(min, max) # broadcast - check_grads(lax.clamp, (min, operand, max), 2, ["fwd", "rev"], tol, tol, tol) + eps = 1e-1 if dtype == onp.float16 else 1e-2 + check_grads(lax.clamp, (min, operand, max), 2, ["fwd", "rev"], tol, tol, + eps=eps) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_dim={}_baseshape=[{}]_dtype={}_narrs={}".format( @@ -1684,12 +1744,12 @@ def testClampGrad(self, min_shape, operand_shape, max_shape, dtype, rng): for dim in range(len(base_shape)) for rng in [jtu.rand_default()])) def testConcatenateGrad(self, dim, base_shape, dtype, num_arrs, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) shapes = [base_shape[:dim] + (size,) + base_shape[dim+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), range(num_arrs))] operands = tuple(rng(shape, dtype) for shape in shapes) concatenate = lambda *args: lax.concatenate(args, dim) - check_grads(concatenate, operands, 2, ["fwd", "rev"], tol, tol, tol) + check_grads(concatenate, operands, 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -1785,7 +1845,7 @@ def testConvWithGeneralPaddingGrad(self, lhs_shape, rhs_shape, dtype, strides, def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, dimension_numbers, perms, feature_group_count, rng): - tol = 1e-1 if onp.finfo(dtype).bits == 32 else 1e-3 + tol = gradient_tolerance(dtype, {onp.float16: 5e-1, onp.float32: 1e-4}) # permute shapes to match dim_spec, scale by feature_group_count lhs_perm, rhs_perm = perms @@ -1814,7 +1874,7 @@ def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, for lhs_shape in [(2,), (3, 2)] for rhs_shape in [(2,), (2, 4)] for dtype in float_dtypes)) def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng): - tol = 1e-1 if num_float_bits(dtype) == 32 else 1e-3 + tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-4}) lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) dot = partial(lax.dot, precision=lax.Precision.HIGHEST) @@ -1843,7 +1903,7 @@ def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng): for dtype in float_dtypes)) def testDotGeneralContractAndBatchGrads(self, lhs_shape, rhs_shape, dtype, dimension_numbers, rng): - tol = 1e-1 if onp.finfo(dtype).bits == 32 else 1e-2 + tol = gradient_tolerance(dtype) lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) dot_general = partial(lax.dot_general, dimension_numbers=dimension_numbers, @@ -1866,10 +1926,10 @@ def testDotGeneralContractAndBatchGrads(self, lhs_shape, rhs_shape, dtype, for broadcast_sizes in [(), (2,), (1, 2)] for rng in [jtu.rand_default()])) def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) args = (rng(shape, dtype),) broadcast = lambda x: lax.broadcast(x, broadcast_sizes) - check_grads(broadcast, args, 2, ["fwd", "rev"], tol, tol, tol) + check_grads(broadcast, args, 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_bcdims={}".format( @@ -1886,10 +1946,11 @@ def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng): for dtype in float_dtypes for rng in [jtu.rand_default()])) def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) operand = rng(inshape, dtype) broadcast_in_dim = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) - check_grads(broadcast_in_dim, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(broadcast_in_dim, (operand,), 2, ["fwd", "rev"], tol, tol, + eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_perm={}".format( @@ -1912,10 +1973,10 @@ def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng): ] for rng in [jtu.rand_default()])) def testReshapeGrad(self, arg_shape, out_shape, permutation, dtype, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) operand = rng(arg_shape, dtype) reshape = lambda x: lax.reshape(x, out_shape, permutation) - check_grads(reshape, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(reshape, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_pads={}" @@ -1925,16 +1986,17 @@ def testReshapeGrad(self, arg_shape, out_shape, permutation, dtype, rng): for dtype in float_dtypes for pads in [[(1, 2, 1), (0, 1, 0)], [(-1, 0, 0), (-1, 0, 2)]])) def testPadGrad(self, shape, dtype, pads, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) operand = rng(shape, dtype) pad = lambda operand: lax.pad(operand, onp.array(0, dtype), pads) - check_grads(pad, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(pad, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) operand = rng(shape, dtype) padding_value = onp.array(0., dtype) pad = lambda operand, padding_value: lax.pad(operand, padding_value, pads) - check_grads(pad, (operand, padding_value), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(pad, (operand, padding_value), 2, ["fwd", "rev"], tol, tol, + eps=1.) def testReverseGrad(self): rev = lambda operand: lax.rev(operand, dimensions) @@ -1956,12 +2018,13 @@ def testReverseGrad(self): for dtype in float_dtypes for rng in [jtu.rand_default()])) def testSelectGrad(self, pred_shape, arg_shape, dtype, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) pred = rng(pred_shape, onp.bool_) on_true = rng(arg_shape, dtype) on_false = rng(arg_shape, dtype) select = lambda on_true, on_false: lax.select(pred, on_true, on_false) - check_grads(select, (on_true, on_false), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(select, (on_true, on_false), 2, ["fwd", "rev"], tol, tol, + eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -1984,10 +2047,10 @@ def testSelectGrad(self, pred_shape, arg_shape, dtype, rng): for dtype in float_dtypes for rng in [jtu.rand_default()])) def testSliceGrad(self, shape, dtype, starts, limits, strides, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) operand = rng(shape, dtype) slice = lambda x: lax.slice(x, starts, limits, strides) - check_grads(slice, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(slice, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_start_indices={}_size_indices={}".format( @@ -2004,10 +2067,10 @@ def testSliceGrad(self, shape, dtype, starts, limits, strides, rng): for rng in [jtu.rand_default()])) def testDynamicSliceGrad(self, shape, dtype, start_indices, size_indices, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) operand = rng(shape, dtype) dynamic_slice = lambda x: lax.dynamic_slice(x, start_indices, size_indices) - check_grads(dynamic_slice, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(dynamic_slice, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_start_indices={}_update_shape={}".format( @@ -2024,19 +2087,19 @@ def testDynamicSliceGrad(self, shape, dtype, start_indices, size_indices, for rng in [jtu.rand_default()])) def testDynamicUpdateSliceGrad(self, shape, dtype, start_indices, update_shape, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) operand = rng(shape, dtype) update = rng(update_shape, dtype) start_indices = onp.array(start_indices) dus = lambda x, y: lax.dynamic_update_slice(x, y, start_indices) - check_grads(dus, (operand, update), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(dus, (operand, update), 2, ["fwd", "rev"], tol, tol, eps=1.) dus = lambda x: lax.dynamic_update_slice(x, update, start_indices) - check_grads(dus, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(dus, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) dus = lambda y: lax.dynamic_update_slice(operand, y, start_indices) - check_grads(dus, (update,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(dus, (update,), 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_perm={}".format( @@ -2051,10 +2114,10 @@ def testDynamicUpdateSliceGrad(self, shape, dtype, start_indices, for dtype in float_dtypes for rng in [jtu.rand_default()])) def testTransposeGrad(self, shape, dtype, perm, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype) operand = rng(shape, dtype) transpose = lambda x: lax.transpose(x, perm) - check_grads(transpose, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(transpose, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_inshape={}_reducedims={}" @@ -2063,9 +2126,11 @@ def testTransposeGrad(self, shape, dtype, perm, rng): "dims": dims, "rng": rng} for init_val, op, dtypes in [ (0, lax.add, inexact_dtypes), - (-onp.inf, lax.max, inexact_dtypes), - (onp.inf, lax.min, inexact_dtypes), - (1, lax.mul, inexact_dtypes), + # Precision problems for float16 tests. + (-onp.inf, lax.max, [t for t in inexact_dtypes if t != onp.float16]), + (onp.inf, lax.min, [t for t in inexact_dtypes if t != onp.float16]), + # The mul test overflows the range of a float16. + (1, lax.mul, [t for t in inexact_dtypes if t != onp.float16]), ] for dtype in dtypes for shape, dims in [ @@ -2076,15 +2141,18 @@ def testTransposeGrad(self, shape, dtype, perm, rng): [(3, 4, 5), (0, 1, 2)], [(3, 1), (1,)], ] - for rng in [jtu.rand_small()])) + for rng in [jtu.rand_default()])) def testReduceGrad(self, op, init_val, shape, dtype, dims, rng): if jtu.device_under_test() == "tpu" and op is lax.mul: raise SkipTest("unimplemented case") - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance( + dtype, {onp.float16: 1e-1, onp.float32: 1e-2, onp.float64: 1e-3}) operand = rng(shape, dtype) init_val = onp.asarray(init_val, dtype=dtype) reduce = lambda operand: lax.reduce(operand, init_val, op, dims) - check_grads(reduce, (operand,), 1, ["fwd", "rev"], tol, tol) + eps = (1.0 if onp.finfo(dtype).bits == 16 and op is lax.add else + 1e-2 if onp.finfo(dtype).bits == 32 else None) + check_grads(reduce, (operand,), 1, ["fwd", "rev"], tol, tol, eps) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_dtype={}_padding={}" @@ -2100,6 +2168,7 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng): for padding in ["VALID", "SAME"] for rng in [jtu.rand_default()])) def testReduceWindowGrad(self, op, init_val, dtype, padding, rng): + tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-3}) init_val = onp.asarray(init_val, dtype=dtype) # We need this conditional and the corresponding loop logic to be in the @@ -2130,12 +2199,15 @@ def fun(operand): for shape, dims, strides in all_configs: operand = rng(shape, dtype) - if op is not lax.add: + if op is lax.add: + eps = 1. + else: # this test can fail if there are duplicates in operand self.assertEqual(onp.unique(operand).size, operand.size, msg="test requires operand elements to be unique.") - check_grads(fun, (operand,), gradient_order, ["fwd", "rev"], 1e-2, 1e-2, - 1e-2) + eps = 1e-2 + check_grads(fun, (operand,), gradient_order, ["fwd", "rev"], tol, tol, + eps) # TODO(b/205052657): enable more tests when supported @parameterized.named_parameters(jtu.cases_from_list( @@ -2147,10 +2219,10 @@ def fun(operand): for axis in [len(shape) - 1] for rng in [jtu.rand_default()])) def testSortGrad(self, shape, dtype, axis, rng): - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = gradient_tolerance(dtype, {onp.float32: 1e-3}) operand = rng(shape, dtype) sort = lambda x: lax.sort(x, axis) - check_grads(sort, (operand,), 2, ["fwd", "rev"], tol, tol, tol) + check_grads(sort, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1e-2) # TODO(b/205052657): enable more tests when supported @parameterized.named_parameters(jtu.cases_from_list( @@ -2365,7 +2437,8 @@ def _CheckBatching(self, op, bdim_size, bdims, shapes, dtype, rng, for rec in LAX_OPS)) def testOp(self, op_name, rng, shapes, dtype, bdims): op = getattr(lax, op_name) - self._CheckBatching(op, 10, bdims, shapes, dtype, rng) + tol = tolerance(dtype) + self._CheckBatching(op, 10, bdims, shapes, dtype, rng, tol, tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2408,7 +2481,7 @@ def testOp(self, op_name, rng, shapes, dtype, bdims): def testConvGeneralDilatedBatching( self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, dimension_numbers, perms, feature_group_count, lhs_bdim, rhs_bdim, rng): - tol = 1e-1 if onp.finfo(dtype).bits == 32 else 1e-3 + tol = 1e-1 if onp.finfo(dtype).bits <= 32 else 1e-3 # permute shapes to match dim_spec, scale by feature_group_count lhs_perm, rhs_perm = perms @@ -2488,7 +2561,8 @@ def testClamp(self, min_shape, operand_shape, max_shape, dtype, bdims, rng): for dtype in default_dtypes for rng in [jtu.rand_default()])) def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng): - self._CheckBatching(lax.dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng) + self._CheckBatching(lax.dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng, + rtol=tolerance(dtype, {onp.float16: 5e-2})) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": From 12f6e18bcabfbc91ef49396b642e9e6129dece97 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 22 Oct 2019 20:37:59 -0400 Subject: [PATCH 0243/1053] Relax tolerance of np.sinc test. (#1557) --- tests/lax_numpy_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 77b41e30ae70..6abf3346b80c 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -203,7 +203,8 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("real", 1, number_dtypes, all_shapes, jtu.rand_some_inf(), []), op_record("remainder", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), - op_record("sinc", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), + op_record("sinc", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], + tolerance={onp.complex64: 1e-5}), op_record("square", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), op_record("transpose", 1, all_dtypes, all_shapes, jtu.rand_default(), ["rev"]), From 530cf7fd29bbff58b3726e3deea9ee17d2cc8b21 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 23 Oct 2019 09:23:54 -0400 Subject: [PATCH 0244/1053] Relax tolerance specification for reduction test. (#1559) --- tests/lax_numpy_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 6abf3346b80c..70650d762b10 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -461,7 +461,8 @@ def testReducer(self, onp_op, lnp_op, rng, shape, dtype, out_dtype, axis, keepdi onp_fun = lambda x: onp_op(x, axis, dtype=out_dtype, keepdims=keepdims) lnp_fun = lambda x: lnp_op(x, axis, dtype=out_dtype, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] - tol_spec = {onp.float16: 1e-2, onp.float64: 1e-6, onp.complex128: 1e-6} + tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.complex64: 1e-3, + onp.float64: 1e-5, onp.complex128: 1e-5} tol = tolerance(dtype, tol_spec) tol = max(tol, tolerance(out_dtype, tol_spec)) if out_dtype else tol self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, From 67a89d2a2b4eaacca388a031d8a1314cd80f9931 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 23 Oct 2019 09:27:00 -0400 Subject: [PATCH 0245/1053] Relax test tolerance for float16 remainder test. (#1560) --- tests/lax_numpy_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 70650d762b10..8392f82e4ab8 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -201,7 +201,8 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("rad2deg", 1, float_dtypes, all_shapes, jtu.rand_default(), []), op_record("ravel", 1, all_dtypes, all_shapes, jtu.rand_default(), ["rev"]), op_record("real", 1, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("remainder", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), + op_record("remainder", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), [], + tolerance={onp.float16: 1e-2}), op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), op_record("sinc", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], tolerance={onp.complex64: 1e-5}), From 7cbd58b6c6f910e1d7b762d7ed51a057be138976 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 24 Oct 2019 10:10:04 +0200 Subject: [PATCH 0246/1053] Improved the type checking for uses of scan. (#1551) * Improved the type checking for uses of scan. Previous way of checking was done after flattening and got easily confused by tuples of different shapes, or None. Relates to https://github.com/google/jax/issues/1534. --- jax/lax/lax_control_flow.py | 39 +++++++++++++++++++++++++++------- tests/lax_control_flow_test.py | 30 +++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 2fb71be0be99..88df6e000a7f 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -447,7 +447,8 @@ def scan(f, init, xs): the loop carry and the second represents a slice of the output. init: an initial loop carry value of type ``c``, which can be a scalar, array, or any pytree (nested Python tuple/list/dict) thereof, representing - the initial loop carry value. + the initial loop carry value. This value must have the same structure as + the first element of the pair returned by ``f``. xs: the value of type ``[a]`` over which to scan along the leading axis, where ``[a]`` can be an array or any pytree (nested Python tuple/list/dict) thereof with consistent leading axis sizes. @@ -457,9 +458,9 @@ def scan(f, init, xs): loop carry value and the second element represents the stacked outputs of the second output of ``f`` when scanned over the leading axis of the inputs. """ - num_carry = len(tree_flatten(init)[0]) + init_flat, init_tree = tree_flatten(init) + xs_flat, _ = tree_flatten(xs) in_flat, in_tree = tree_flatten((init, xs)) - init_flat, xs_flat = in_flat[:num_carry], in_flat[num_carry:] try: length, = {x.shape[0] for x in xs_flat} except AttributeError: @@ -474,13 +475,19 @@ def scan(f, init, xs): x_dtypes = [x.dtype for x in xs_flat] x_avals = tuple(_map(ShapedArray, x_shapes, x_dtypes)) jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_tree, carry_avals + x_avals) - carry_avals_out, y_avals = split_list(jaxpr.out_avals, [num_carry]) - if tuple(carry_avals_out) != carry_avals: - msg = "scan carry output type must match carry input type, got {} and {}." - raise TypeError(msg.format(tuple(carry_avals_out), carry_avals)) + + out_tree_children = out_tree.children() + if len(out_tree_children) != 2: + msg = "scan body output must be a pair, got {}." + raise TypeError(msg.format(tree_unflatten(out_tree, jaxpr.out_avals))) + _check_tree_and_avals("scan carry output and input", + # Extract the subtree and avals for the first element of the return tuple + out_tree_children[0], jaxpr.out_avals[:out_tree_children[0].num_leaves], + init_tree, carry_avals) + out = scan_p.bind(*itertools.chain(consts, in_flat), forward=True, length=length, jaxpr=jaxpr, - num_consts=len(consts), num_carry=num_carry, + num_consts=len(consts), num_carry=len(init_flat), linear=(False,) * (len(consts) + len(in_flat))) return tree_unflatten(out_tree, out) @@ -884,6 +891,22 @@ def _check_tree(func_name, expected_name, actual_tree, expected_tree): .format(func_name, expected_name, actual_tree, expected_tree)) +def _check_tree_and_avals(what, tree1, avals1, tree2, avals2): + """Raises TypeError if (tree1, avals1) does not match (tree2, avals2). + + Corresponding `tree` and `avals` must match in the sense that the number of leaves in + `tree` must be equal to the length of `avals`. + `what` will be prepended to details of the mismatch in TypeError. + """ + if tree1 != tree2: + msg = ("{} must have same type structure, got {} and {}.") + raise TypeError(msg.format(what, tree1, tree2)) + if not all(safe_map(typematch, avals1, avals2)): + msg = ("{} must have identical types, " + "got {} and {}.") + raise TypeError(msg.format(what, tree_unflatten(tree1, avals1), + tree_unflatten(tree2, avals2))) + def root(f, initial_guess, solve, tangent_solve): """Differentiably solve for a roots of a function. diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 880721976758..2eb84fb1076d 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -708,7 +708,7 @@ def f(c, a): if jit_f: f = api.jit(f) if jit_scan: - scan = api.jit(lax.scan, (0,)) + scan = api.jit(lax.scan, static_argnums=(0,)) else: scan = lax.scan @@ -823,11 +823,35 @@ def testIssue744(self): def plus_one(p, iter_idx): return Point(p.x+1, p.y+1), iter_idx - self.assertRaisesRegexp( + self.assertRaisesRegex( ValueError, 'scan got value with no leading axis to scan over.*', lambda: lax.scan(plus_one, p0, list(range(5)))) + @jtu.skip_on_flag('jax_enable_x64', True) # With float64 error messages are different; hard to check precisely + def testScanTypeErrors(self): + """Test typing error messages for scan.""" + a = np.arange(5) + # Body output not a tuple + with self.assertRaisesRegex(TypeError, + re.escape("scan body output must be a pair, got ShapedArray(int32[]).")): + lax.scan(lambda c, x: 0, 0, a) + with self.assertRaisesRegex(TypeError, + re.escape("scan carry output and input must have same type structure, " + "got PyTreeDef(tuple, [*,*,*]) and PyTreeDef(tuple, [*,PyTreeDef(tuple, [*,*])])")): + lax.scan(lambda c, x: ((0, 0, 0), x), (1, (2, 3)), a) + with self.assertRaisesRegex(TypeError, + re.escape("scan carry output and input must have same type structure, got * and PyTreeDef(None, []).")): + lax.scan(lambda c, x: (0, x), None, a) + with self.assertRaisesRegex(TypeError, + re.escape("scan carry output and input must have identical types, " + "got ShapedArray(int32[]) and ShapedArray(float32[]).")): + lax.scan(lambda c, x: (0, x), 1.0, a) + with self.assertRaisesRegex(TypeError, + re.escape("scan carry output and input must have same type structure, got * and PyTreeDef(tuple, [*,*]).")): + lax.scan(lambda c, x: (0, x), (1, 2), np.arange(5)) + + def testScanHigherOrderDifferentiation(self): d = 0.75 def f(c, a): @@ -1246,7 +1270,7 @@ def loss(a, b): jtu.check_grads(loss, (a, b), atol=1e-5, order=2, modes=['fwd']) - with self.assertRaisesRegexp(TypeError, "transpose_solve required"): + with self.assertRaisesRegex(TypeError, "transpose_solve required"): api.grad(loss)(a, b) def test_custom_linear_solve_errors(self): From f8c5d98653da6875dfe3849f2b386b7c6ed28581 Mon Sep 17 00:00:00 2001 From: Jonas Rauber Date: Sun, 27 Oct 2019 09:43:24 +0100 Subject: [PATCH 0247/1053] fixed cross-entropy losses in mnist examples (fixes #1023) --- examples/differentially_private_sgd.py | 2 +- examples/mnist_classifier.py | 2 +- examples/mnist_classifier_fromscratch.py | 2 +- examples/spmd_mnist_classifier_fromscratch.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/differentially_private_sgd.py b/examples/differentially_private_sgd.py index f1ea7294b4ad..6e0492ea7b42 100644 --- a/examples/differentially_private_sgd.py +++ b/examples/differentially_private_sgd.py @@ -127,7 +127,7 @@ def loss(params, batch): inputs, targets = batch logits = predict(params, inputs) logits = stax.logsoftmax(logits) # log normalize - return -np.mean(np.sum(logits * targets, 1)) # cross entropy loss + return -np.mean(np.sum(logits * targets, axis=1)) # cross entropy loss def accuracy(params, batch): diff --git a/examples/mnist_classifier.py b/examples/mnist_classifier.py index 2634f21d612a..c075f3f88390 100644 --- a/examples/mnist_classifier.py +++ b/examples/mnist_classifier.py @@ -40,7 +40,7 @@ def loss(params, batch): inputs, targets = batch preds = predict(params, inputs) - return -np.mean(preds * targets) + return -np.mean(np.sum(preds * targets, axis=1)) def accuracy(params, batch): inputs, targets = batch diff --git a/examples/mnist_classifier_fromscratch.py b/examples/mnist_classifier_fromscratch.py index 57bee840116a..fafbcff3a14e 100644 --- a/examples/mnist_classifier_fromscratch.py +++ b/examples/mnist_classifier_fromscratch.py @@ -49,7 +49,7 @@ def predict(params, inputs): def loss(params, batch): inputs, targets = batch preds = predict(params, inputs) - return -np.mean(preds * targets) + return -np.mean(np.sum(preds * targets, axis=1)) def accuracy(params, batch): inputs, targets = batch diff --git a/examples/spmd_mnist_classifier_fromscratch.py b/examples/spmd_mnist_classifier_fromscratch.py index c85d6aaf473d..96e92e0b37d2 100644 --- a/examples/spmd_mnist_classifier_fromscratch.py +++ b/examples/spmd_mnist_classifier_fromscratch.py @@ -57,7 +57,7 @@ def predict(params, inputs): def loss(params, batch): inputs, targets = batch preds = predict(params, inputs) - return -np.mean(preds * targets) + return -np.mean(np.sum(preds * targets, axis=1)) @jit def accuracy(params, batch): From 6839f28c6adc0fa8f65a4792380b75e4ff38dc55 Mon Sep 17 00:00:00 2001 From: chenyee Date: Mon, 28 Oct 2019 22:37:01 +0800 Subject: [PATCH 0248/1053] Fix issue #1576 --- jax/lax/lax.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index cfb3d7fcfebb..c01bdf25cda2 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1713,17 +1713,17 @@ def _abs_jvp_rule(g, ans, x): pow_p = standard_binop([_float | _complex, _float | _complex], 'pow') -def _pow_jvp_lhs(g, x, y): +def _pow_jvp_lhs(g, ans, x, y): # we call _safe_mul here so that we get the behavior 0*inf = 0, since when a # coefficient in `g` is zero we want to keep it at zero, not produce a nan. # see https://github.com/google/jax/pull/383 jac = mul(y, pow(x, select(eq(y, _zeros(y)), _ones(y), sub(y, _ones(y))))) return _safe_mul(_brcast(g, y), jac) -def _pow_jvp_rhs(g, x, y): - return mul(_brcast(g, x), mul(log(_replace_zero(x)), pow(x, y))) +def _pow_jvp_rhs(g, ans, x, y): + return mul(_brcast(g, x), mul(log(_replace_zero(x)), ans)) -ad.defjvp(pow_p, _pow_jvp_lhs, _pow_jvp_rhs) +ad.defjvp2(pow_p, _pow_jvp_lhs, _pow_jvp_rhs) _replace_zero = lambda x: select(eq(x, _const(x, 0)), _ones(x), x) not_p = standard_unop(_int | _bool, 'not') From 38d6bf5edaf1fdd16e267d3a68de1e2f8d61577b Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 28 Oct 2019 13:02:31 -0700 Subject: [PATCH 0249/1053] add test for fori_loop index batching fixes #1190 --- tests/lax_control_flow_test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 2eb84fb1076d..51b39fac249f 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -312,6 +312,13 @@ def fun(x): expected = (onp.array([10, 11]), onp.array([20, 20])) self.assertAllClose(ans, expected, check_dtypes=False) + def testForiLoopBatchedIssue1190(self): + f = lambda x: lax.fori_loop(0, 4, lambda _, x: x + 1, x) + jaxpr = api.make_jaxpr(api.vmap(f))(np.arange(3)) + eqn = jaxpr.eqns[0] + self.assertIs(eqn.primitive, lax.while_p) + self.assertEqual(eqn.params['cond_jaxpr'].in_avals[0].shape, ()) + def testForiLoopBasic(self): def body_fun(i, tot): return lax.add(tot, i) From 5d5699991327afde27d2850cd6d630ea82d599e6 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Mon, 28 Oct 2019 12:54:04 -0700 Subject: [PATCH 0250/1053] Add custom interpreter notebook --- docs/index.rst | 1 + .../Writing_custom_interpreters_in_Jax.ipynb | 765 ++++++++++++++++++ 2 files changed, 766 insertions(+) create mode 100644 docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb diff --git a/docs/index.rst b/docs/index.rst index 55ae8c742169..843ed9b96cdb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -23,6 +23,7 @@ For an introduction to JAX, start at the notebooks/Common_Gotchas_in_JAX notebooks/XLA_in_Python notebooks/How_JAX_primitives_work + notebooks/Writing_custom_interpreters_in_Jax.ipynb Training a Simple Neural Network, with Tensorflow Datasets Data Loading notebooks/maml notebooks/score_matching diff --git a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb new file mode 100644 index 000000000000..24536fda638e --- /dev/null +++ b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb @@ -0,0 +1,765 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Writing custom interpreters in Jax", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "M-hPMKlwXjMr", + "colab_type": "text" + }, + "source": [ + "# Writing custom Jaxpr interpreters in `jax`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "r-3vMiKRYXPJ", + "colab_type": "text" + }, + "source": [ + "`jax` offers several composable function transformations (`jit`, `grad`, `vmap`,\n", + "etc.) that enable writing concise, accelerated code. \n", + "\n", + "Here we will go over how the basics of writing your own custom Jaxpr interpreter.\n", + "\n", + "*Disclaimer: This colab may not be up to date and relies on Jax internals that are subject to change.*" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "s27RDKvKXFL8", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import numpy as onp\n", + "import jax\n", + "import jax.numpy as np\n", + "from jax import jit, grad, vmap\n", + "from jax import random" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jb_8mEsJboVM", + "colab_type": "text" + }, + "source": [ + "## What is `jax` doing?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KxR2WK0Ubs0R", + "colab_type": "text" + }, + "source": [ + "`jax` provides a `numpy`-like API for numerical computing which can be used as is, but `jax`'s true power comes from composable function transformations. Take the `jit` function transformation, which takes in a function and returns a semantically identical function but is lazily compiled by XLA for accelerators.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "HmlMcICOcSXR", + "colab_type": "code", + "outputId": "546bf21b-7d03-4364-a087-5802792abbb0", + "colab": { + "height": 54 + } + }, + "source": [ + "x = random.normal(random.PRNGKey(0), (5000, 5000))\n", + "def f(w, b, x):\n", + " return np.tanh(np.dot(x, w) + b)\n", + "fast_f = jit(f)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gA8V51wZdsjh", + "colab_type": "text" + }, + "source": [ + "When we call `fast_f`, what happens? `jax` traces the function and constructs an XLA computation graph. The graph is then JIT-compiled and executed. Other transformations work similarly in that they first trace the function and handle the output trace in some way. To learn more about Jax's tracing machinery, you can refer to the [\"How it works\"](https://github.com/google/jax#how-it-works) section in the README." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2Th1vYLVaFBz", + "colab_type": "text" + }, + "source": [ + "## Jaxpr tracer\n", + "\n", + "A tracer of special importance in Jax is the Jaxpr tracer, which records ops into a Jaxpr (Jax expression). A Jaxpr is a data structure that can be evaluated like a mini-functional programming language and \n", + "thus Jaxprs are an incredibly useful intermediate representation\n", + "for function transformation. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pH7s63lpaHJO", + "colab_type": "text" + }, + "source": [ + "`jax.make_jaxpr` is essentially a \"pretty-printing\" transformation:\n", + "it transforms a function into one that, given example arguments, produces a Jaxpr representation of its computation.\n", + "Although we can't generally use the Jaxprs that it returns, it is useful for debugging and introspection.\n", + "Let's use it to look at how some example Jaxprs\n", + "are structured." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "RSxEiWi-EeYW", + "colab_type": "code", + "outputId": "ee3d4f5c-97d3-4db3-a012-20898920cadb", + "colab": { + "height": 547 + } + }, + "source": [ + "def examine_jaxpr(jaxpr):\n", + " print(\"invars:\", jaxpr.invars)\n", + " print(\"outvars:\", jaxpr.outvars)\n", + " print(\"constvars:\", jaxpr.constvars)\n", + " print(\"freevars:\", jaxpr.freevars)\n", + " for eqn in jaxpr.eqns:\n", + " print(\"equation:\", eqn.invars, eqn.primitive, eqn.outvars, eqn.params)\n", + " print()\n", + " print(\"jaxpr:\", jaxpr)\n", + "\n", + "def foo(x):\n", + " return x + 1\n", + "print(\"foo\")\n", + "print(\"=====\")\n", + "examine_jaxpr(jax.make_jaxpr(foo)(5))\n", + "\n", + "print()\n", + "\n", + "def bar(w, b, x):\n", + " return np.dot(w, x) + b + np.ones(5), x\n", + "print(\"bar\")\n", + "print(\"=====\")\n", + "examine_jaxpr(jax.make_jaxpr(bar)(np.ones((5, 10)), np.ones(5), np.ones(10)))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "foo\n", + "=====\n", + "invars: [a]\n", + "outvars: [b]\n", + "constvars: []\n", + "freevars: []\n", + "equation: [a, 1] add [b] {}\n", + "\n", + "jaxpr: { lambda ; ; a.\n", + " let b = add a 1\n", + " in [b] }\n", + "\n", + "\n", + "bar\n", + "=====\n", + "invars: [a, b, c]\n", + "outvars: [g, c]\n", + "constvars: [f]\n", + "freevars: []\n", + "equation: [a, c] dot_general [d] {'dimension_numbers': (((1,), (0,)), ((), ())), 'precision': None}\n", + "equation: [d, b] add [e] {}\n", + "equation: [e, f] add [g] {}\n", + "\n", + "jaxpr: { lambda f ; ; a b c.\n", + " let d = dot_general[ dimension_numbers=(((1,), (0,)), ((), ()))\n", + " precision=None ] a c\n", + " e = add d b\n", + " g = add e f\n", + " in [g, c] }\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "k-HxK9iagnH6", + "colab_type": "text" + }, + "source": [ + "* `jaxpr.invars` - the `invars` of a Jaxpr are a list of the input variables to Jaxpr, analogous to arguments in Python functions\n", + "* `jaxpr.outvars` - the `outvars` of a Jaxpr are the variables that are returned by the Jaxpr. \n", + "* `jaxpr.constvars` - the `constvars` are a list of variables that are also inputs to the Jaxpr, but correspond to constants from the trace (we'll go over these in more detail later)\n", + "* `jaxpr.freevars` - we won't worry about these for now\n", + "* `jaxpr.eqns` - a list of equations. Each equation is list of input variables, a list of output variables, and a *primitive*, which is used to evaluate inputs to produce outputs. Each equation also has a set of `params`, a dictionary of keyword arguments to the primitive.\n", + "\n", + "All together, a Jaxpr encapsulates a simple program that can be evaluated with inputs to produce an output. We'll go over how exactly to do this later. The important thing to note now is that a Jaxpr is a data structure that can be manipulated and evaluated in whatever way we want." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NwY7TurYn6sr", + "colab_type": "text" + }, + "source": [ + "### Why are Jaxprs useful?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UEy6RorCgdYt", + "colab_type": "text" + }, + "source": [ + "Jaxprs are simple and easy to transform. And because Jax lets us stage out Jaxprs from Python functions, it gives us a way to transform numerical programs written in Python.\n", + "\n", + "A helpful mental model for Jaxprs is that they are one-to-one with computation graphs, so the Jaxpr for a function is just the computation graph from its inputs to outputs." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qizTKpbno_ua", + "colab_type": "text" + }, + "source": [ + "# Your first interpreter: `invert`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OIto-KX4pD7j", + "colab_type": "text" + }, + "source": [ + "Let's try to implement a very function \"inverter\", which takes in the output of the original function and returns the inputs that produced those outputs. For now, let's focus on simple, unary functions which are composed of other invertible unary functions.\n", + "\n", + "Goal:\n", + "```python\n", + "def f(x):\n", + " return np.exp(np.tanh(x))\n", + "f_inv = inverse(f)\n", + "# f_inv(f(1.0)) == 1.0\n", + "```\n", + "\n", + "The way we'll implement this is by 1) tracing `f` into a Jaxpr, then 2) interpret the Jaxpr *backwards*. Every time we hit a primitive, we'll look it up in a registry of invertible functions.\n", + "\n", + "## 1. Tracing a function\n", + "\n", + "We can't use `jax.make_jaxpr` for this, because we need to pull out constants created during the trace to pass into the Jaxpr. However, we can write a function that does something very similar to `make_jaxpr`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "BHkg_3P1pXJj", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Importing Jax functions useful for tracing/interpreting.\n", + "import numpy as onp\n", + "from functools import wraps\n", + "\n", + "from jax import api_util\n", + "from jax import core\n", + "from jax import lax\n", + "from jax import linear_util as lu\n", + "from jax import tree_util\n", + "from jax.abstract_arrays import ShapedArray\n", + "from jax.interpreters import partial_eval as pe\n", + "from jax.util import safe_map" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "aqHqPjuBqrl9", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def make_jaxpr2(fun):\n", + " \n", + " def pv_like(x):\n", + " # ShapedArrays are abstract values that carry around\n", + " # shape and dtype information\n", + " aval = ShapedArray(onp.shape(x), onp.result_type(x))\n", + " return pe.PartialVal((aval, core.unit))\n", + "\n", + " @wraps(fun)\n", + " def jaxpr_const_maker(*args, **kwargs):\n", + " # Set up fun for transformation\n", + " wrapped = lu.wrap_init(fun)\n", + " # Flatten input args\n", + " jax_args, in_tree = tree_util.tree_flatten((args, kwargs))\n", + " # Transform fun to accept flat args\n", + " # and return a flat list result\n", + " jaxtree_fun, out_tree = api_util.flatten_fun(wrapped, in_tree) \n", + " # Abstract and partial-val's flat args\n", + " pvals = safe_map(pv_like, jax_args)\n", + " # Trace function into Jaxpr\n", + " jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) \n", + " return jaxpr, consts, (in_tree, out_tree())\n", + " return jaxpr_const_maker" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CpTml2PTrzZ4", + "colab_type": "text" + }, + "source": [ + "We won't go into too much detail about this function, but at a high level, it first flattens its arguments into a list, which are the abstracted and wrapped as partial values. the `pe.trace_to_jaxpr` function is used to then trace a function into a Jaxpr\n", + "from a list of partial value inputs." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Tc1REN5aq_fH", + "colab_type": "code", + "outputId": "2e6f2833-5139-48ef-da3f-01ea9cd6a7d3", + "colab": { + "height": 119 + } + }, + "source": [ + "def f(x):\n", + " return np.exp(np.tanh(x))\n", + "jaxpr, consts, _ = make_jaxpr2(f)(np.ones(5))\n", + "print(jaxpr)\n", + "print(consts)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "{ lambda ; ; a.\n", + " let b = tanh a\n", + " c = exp b\n", + " in [c] }\n", + "\n", + "()\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WmZ3BcmZsbfR", + "colab_type": "text" + }, + "source": [ + "This particular function doesn't have any example constants, but in general, this is how you both trace into a Jaxpr and extract the constants.\n", + "\n", + "## 2. Evaluating a Jaxpr\n", + "\n", + "\n", + "Before we write a custom Jaxpr interpreter, let's first implement the \"default\" interpreter, `eval_jaxpr`, which evaluates the Jaxpr as is, effectively running the original Python function. \n", + "\n", + "To do this, we first create an environment to store the values for each of the variables, and update the environment with each equation we evaluate in the Jaxpr." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ACMxjIHStHwD", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def eval_jaxpr(jaxpr, consts, *args):\n", + " env = {} # Mapping from variable -> value\n", + " \n", + " def read(var):\n", + " # Literals are values baked into the Jaxpr\n", + " if type(var) is core.Literal:\n", + " return var.val\n", + " return env[var]\n", + "\n", + " def write(var, val):\n", + " env[var] = val\n", + "\n", + " # Bind args and consts to environment\n", + " write(core.unitvar, core.unit)\n", + " safe_map(write, jaxpr.invars, args)\n", + " safe_map(write, jaxpr.constvars, consts)\n", + "\n", + " # Loop through equations and evaluate primitives using `bind`\n", + " for eqn in jaxpr.eqns:\n", + " # Read inputs to equation from environment\n", + " invals = safe_map(read, eqn.invars) \n", + " # `bind` is how a primitive is called\n", + " outvals = eqn.primitive.bind( \n", + " *invals, **eqn.params\n", + " )\n", + " # Primitives may return multiple outputs or not\n", + " if not eqn.primitive.multiple_results: \n", + " outvals = [outvals]\n", + " # Write the results of the primitive into the environment\n", + " safe_map(write, eqn.outvars, outvals) \n", + " # Read the final result of the Jaxpr from the environment\n", + " return safe_map(read, jaxpr.outvars) " + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "mGHPc3NruCFV", + "colab_type": "code", + "outputId": "3f459905-02ad-4f43-e70f-3db0a5ff58e4", + "colab": { + "height": 51 + } + }, + "source": [ + "jaxpr, consts, _ = make_jaxpr2(f)(np.ones(5))\n", + "eval_jaxpr(jaxpr, consts, np.ones(5))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[DeviceArray([2.14168763, 2.14168763, 2.14168763, 2.14168763, 2.14168763],\n", + " dtype=float32)]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XhZhzbVBvAiT", + "colab_type": "text" + }, + "source": [ + "Notice that `eval_jaxpr` will always return a list even if the original function does not. To \"unflatten\" the list into what the function was originally supposed to return, we can use the `out_tree` object returned by `trace`. \n", + "\n", + "Furthermore, this interpreter does not handle `subjaxprs`, which we will not cover in this guide. You can refer to `core.eval_jaxpr` ([link](https://github.com/google/jax/blob/master/jax/core.py#L185-L212)) to see the edge cases that this interpreter does not cover." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0vb2ZoGrCMM4", + "colab_type": "text" + }, + "source": [ + "\n", + "## Custom `inverse` Jaxpr interpreter\n", + "\n", + "An `inverse` interpreter doesn't look too different from `eval_jaxpr`. We'll first set up the \"registry\" which will map primitives to their inverses. We'll then write a custom interpreter that looks up primitives in the registry.\n", + "\n", + "It turns out that this interpreter will also look similar to the \"transpose\" interpreter used in reverse-mode autodifferentiation [found here](https://github.com/google/jax/blob/master/jax/interpreters/ad.py#L141-L187).\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gSMIT2z1vUpO", + "colab_type": "code", + "colab": {} + }, + "source": [ + "inverse_registry = {}" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JgrpMgDyCrC7", + "colab_type": "text" + }, + "source": [ + "We'll now register inverses for some of the primitives. By convention, primitives in Jax end in `_p` and a lot of the popular ones live in `lax`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "fUerorGkCqhw", + "colab_type": "code", + "colab": {} + }, + "source": [ + "inverse_registry[lax.exp_p] = np.log\n", + "inverse_registry[lax.tanh_p] = np.arctanh" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mDtH_lYDC5WK", + "colab_type": "text" + }, + "source": [ + "`inverse` will first trace the function, then custom-interpret the Jaxpr. Let's set up a simple skeleton." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jGNfV6JJC1B3", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def inverse(fun):\n", + " @wraps(fun)\n", + " def wrapped(*args, **kwargs):\n", + " # Since we assume unary functions, we won't\n", + " # worry about flattening and\n", + " # unflattening arguments\n", + " jaxpr, consts, _ = make_jaxpr2(fun)(*args, **kwargs)\n", + " out = inverse_jaxpr(jaxpr, consts, *args)\n", + " return out[0]\n", + " return wrapped" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "g6v6wV7SDM7g", + "colab_type": "text" + }, + "source": [ + "Now we just need to define `inverse_jaxpr`, which will walk through the Jaxpr backward and invert primitives when it can." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "uUAd-L-BDKT5", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def inverse_jaxpr(jaxpr, consts, *args):\n", + " env = {}\n", + " \n", + " def read(var):\n", + " if type(var) is core.Literal:\n", + " return var.val\n", + " return env[var]\n", + "\n", + " def write(var, val):\n", + " env[var] = val\n", + " # Args now correspond to Jaxpr outvars\n", + " write(core.unitvar, core.unit)\n", + " safe_map(write, jaxpr.outvars, args)\n", + " safe_map(write, jaxpr.constvars, consts)\n", + "\n", + " # Looping backward\n", + " for eqn in jaxpr.eqns[::-1]:\n", + " # outvars are now invars \n", + " invals = safe_map(read, eqn.outvars)\n", + " if eqn.primitive not in inverse_registry:\n", + " raise NotImplementedError(\"{} does not have registered inverse.\".format(\n", + " eqn.primitive\n", + " ))\n", + " # Assuming a unary function \n", + " outval = inverse_registry[eqn.primitive](*invals)\n", + " safe_map(write, eqn.invars, [outval])\n", + " return safe_map(read, jaxpr.invars)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "M8i3wGbVERhA", + "colab_type": "text" + }, + "source": [ + "That's it!" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "cjEKWso-D5Bu", + "colab_type": "code", + "outputId": "54e73a42-a908-448c-d6d5-e6d0fe9adbf9", + "colab": { + "height": 71 + } + }, + "source": [ + "def f(x):\n", + " return np.exp(np.tanh(x))\n", + "f_inv = inverse(f)\n", + "print(f_inv(f(1.0)))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.9999999\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ny7Oo4WLHdXt", + "colab_type": "text" + }, + "source": [ + "Importantly, you can trace through a Jaxpr interpreter." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "j6ov_rveHmTb", + "colab_type": "code", + "outputId": "a7a9b4be-f284-4e78-c469-d84e352d838d", + "colab": { + "height": 238 + } + }, + "source": [ + "jax.make_jaxpr(inverse(f))(f(1.))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{ lambda ; ; a.\n", + " let b = log a\n", + " c = abs b\n", + " d = le c 1.0\n", + " e = add b 1.0\n", + " f = sub 1.0 b\n", + " g = div e f\n", + " h = log g\n", + " i = mul h 0.5\n", + " j = tie_in b nan\n", + " k = broadcast[ sizes=() ] j\n", + " l = select d i k\n", + " in [l] }" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yfWVBsKwH0j6", + "colab_type": "text" + }, + "source": [ + "That's all it takes to add a new transformation to a system, and you get composition with all the others for free! For example, we can use `jit`, `vmap`, and `grad` with `inverse`!" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3tjNk21CH4yZ", + "colab_type": "code", + "outputId": "4c6d2090-0558-4171-8dce-0ea681ef6e53", + "colab": { + "height": 51 + } + }, + "source": [ + "jit(vmap(grad(inverse(f))))((np.arange(5) + 1.) / 5.)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray([ 0. , 15.58493137, 2.25512528, 1.31550276,\n", + " 1. ], dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "APtG-u_6E4tK", + "colab_type": "text" + }, + "source": [ + "## Exercises for the reader\n", + "\n", + "* Handle primitives with multiple arguments where inputs are partially known, for example `lax.add_p`, `lax.mul_p`.\n", + "* Handle `xla_call` and `pmap` primitives, which will not work with both `eval_jaxpr` and `inverse_jaxpr` as written." + ] + } + ] +} From e2e4e6e955f0c8a2d4fa6082497ab4b9eae5fdd2 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Mon, 28 Oct 2019 13:59:16 -0700 Subject: [PATCH 0251/1053] Fix title toc structure --- docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb index 24536fda638e..35d40f89b353 100644 --- a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb +++ b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb @@ -253,7 +253,7 @@ "colab_type": "text" }, "source": [ - "# Your first interpreter: `invert`" + "## Your first interpreter: `invert`" ] }, { @@ -275,7 +275,7 @@ "\n", "The way we'll implement this is by 1) tracing `f` into a Jaxpr, then 2) interpret the Jaxpr *backwards*. Every time we hit a primitive, we'll look it up in a registry of invertible functions.\n", "\n", - "## 1. Tracing a function\n", + "### 1. Tracing a function\n", "\n", "We can't use `jax.make_jaxpr` for this, because we need to pull out constants created during the trace to pass into the Jaxpr. However, we can write a function that does something very similar to `make_jaxpr`." ] @@ -392,7 +392,7 @@ "source": [ "This particular function doesn't have any example constants, but in general, this is how you both trace into a Jaxpr and extract the constants.\n", "\n", - "## 2. Evaluating a Jaxpr\n", + "### 2. Evaluating a Jaxpr\n", "\n", "\n", "Before we write a custom Jaxpr interpreter, let's first implement the \"default\" interpreter, `eval_jaxpr`, which evaluates the Jaxpr as is, effectively running the original Python function. \n", @@ -495,7 +495,7 @@ }, "source": [ "\n", - "## Custom `inverse` Jaxpr interpreter\n", + "### Custom `inverse` Jaxpr interpreter\n", "\n", "An `inverse` interpreter doesn't look too different from `eval_jaxpr`. We'll first set up the \"registry\" which will map primitives to their inverses. We'll then write a custom interpreter that looks up primitives in the registry.\n", "\n", From 7aa20ec273839c4505a7810577858ad9ec962e4c Mon Sep 17 00:00:00 2001 From: fehiepsi Date: Tue, 29 Oct 2019 00:03:36 -0400 Subject: [PATCH 0252/1053] support mxstep for ode --- jax/experimental/ode.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index 0595f6ac2eea..80b478402b33 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -209,21 +209,23 @@ def odeint(ofunc, y0, t, *args, **kwargs): **kwargs: Two relevant keyword arguments: 'rtol': Relative local error tolerance for solver. 'atol': Absolute local error tolerance for solver. + 'mxstep': Maximum number of steps to take for each timepoint. Returns: Integrated system values at each timepoint. """ rtol = kwargs.get('rtol', 1.4e-8) atol = kwargs.get('atol', 1.4e-8) + mxstep = kwargs.get('mxstep', np.inf) @functools.partial(jax.jit, static_argnums=(0,)) def _fori_body_fun(func, i, val): """Internal fori_loop body to interpolate an integral at each timestep.""" t, cur_y, cur_f, cur_t, dt, last_t, interp_coeff, solution = val - cur_y, cur_f, cur_t, dt, last_t, interp_coeff = jax.lax.while_loop( - lambda x: x[2] < t[i], + cur_y, cur_f, cur_t, dt, last_t, interp_coeff, _ = jax.lax.while_loop( + lambda x: (x[2] < t[i]) & (x[-1] < mxstep), functools.partial(_while_body_fun, func), - (cur_y, cur_f, cur_t, dt, last_t, interp_coeff)) + (cur_y, cur_f, cur_t, dt, last_t, interp_coeff, 0.)) relative_output_time = (t[i] - last_t) / (cur_t - last_t) out_x = np.polyval(interp_coeff, relative_output_time) @@ -236,7 +238,7 @@ def _fori_body_fun(func, i, val): @functools.partial(jax.jit, static_argnums=(0,)) def _while_body_fun(func, x): """Internal while_loop body to determine interpolation coefficients.""" - cur_y, cur_f, cur_t, dt, last_t, interp_coeff = x + cur_y, cur_f, cur_t, dt, last_t, interp_coeff, j = x next_t = cur_t + dt next_y, next_f, next_y_error, k = runge_kutta_step( func, cur_y, cur_f, cur_t, dt) @@ -244,10 +246,11 @@ def _while_body_fun(func, x): new_interp_coeff = interp_fit_dopri(cur_y, next_y, k, dt) dt = optimal_step_size(dt, error_ratios) + next_j = j + 1 new_rav, unravel = ravel_pytree( - (next_y, next_f, next_t, dt, cur_t, new_interp_coeff)) + (next_y, next_f, next_t, dt, cur_t, new_interp_coeff, next_j)) old_rav, _ = ravel_pytree( - (cur_y, cur_f, cur_t, dt, last_t, interp_coeff)) + (cur_y, cur_f, cur_t, dt, last_t, interp_coeff, next_j)) return unravel(np.where(np.all(error_ratios <= 1.), new_rav, @@ -280,6 +283,7 @@ def vjp_odeint(ofunc, y0, t, *args, **kwargs): **kwargs: Two relevant keyword arguments: 'rtol': Relative local error tolerance for solver. 'atol': Absolute local error tolerance for solver. + 'mxstep': Maximum number of steps to take for each timepoint. Returns: VJP function `vjp = vjp_all(g)` where `yt = ofunc(y, t, *args)` @@ -289,6 +293,7 @@ def vjp_odeint(ofunc, y0, t, *args, **kwargs): """ rtol = kwargs.get('rtol', 1.4e-8) atol = kwargs.get('atol', 1.4e-8) + mxstep = kwargs.get('mxstep', np.inf) flat_args, unravel_args = ravel_pytree(args) flat_func = lambda y, t, flat_args: ofunc(y, t, *unravel_args(flat_args)) @@ -325,7 +330,8 @@ def _fori_body_fun(i, val): this_tarray, flat_args, rtol=rtol, - atol=atol) + atol=atol, + mxstep=mxstep) vjp_y = aug_ans[1][state_len:2*state_len] + this_gim1 vjp_t0 = aug_ans[1][2*state_len] vjp_args = aug_ans[1][2*state_len+1:] @@ -362,13 +368,13 @@ def vjp_all(g, yt, t): return tuple([result[-4], vjp_times] + list(result[-2])) - primals_out = odeint(flat_func, y0, t, flat_args) + primals_out = odeint(flat_func, y0, t, flat_args, rtol=rtol, atol=atol, mxstep=mxstep) vjp_fun = lambda g: vjp_all(g, primals_out, t) return primals_out, vjp_fun -def build_odeint(ofunc, rtol=1.4e-8, atol=1.4e-8): +def build_odeint(ofunc, rtol=1.4e-8, atol=1.4e-8, mxstep=onp.inf): """Return `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)`. Given the function ofunc(y, t, *args), return the jitted function @@ -383,14 +389,15 @@ def build_odeint(ofunc, rtol=1.4e-8, atol=1.4e-8): ofunc: The function to be wrapped into an ODE integration. rtol: relative local error tolerance for solver. atol: absolute local error tolerance for solver. + mxstep: Maximum number of steps to take for each timepoint. Returns: `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)` """ ct_odeint = jax.custom_transforms( - lambda y0, t, *args: odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol)) + lambda y0, t, *args: odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol, mxstep=mxstep)) - v = lambda y0, t, *args: vjp_odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol) + v = lambda y0, t, *args: vjp_odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol, mxstep=mxstep) jax.defvjp_all(ct_odeint, v) return jax.jit(ct_odeint) From 8880e262b09dc85b8014c5dc98677eeb2f45ae7a Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 29 Oct 2019 08:53:35 +0100 Subject: [PATCH 0253/1053] Use redthedocs links for Colabs (#1572) Steer the documentation readers to readthedocs. Also, minor fixes to the wording of How_jax_primitives_work, suggested by Dougal --- README.md | 24 ++++++++++---------- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 2 +- docs/notebooks/How_JAX_primitives_work.ipynb | 12 +++++----- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index ca2db1d3cfaf..53d7a77a4139 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ are instances of such transformations. Another is [`vmap`](#auto-vectorization-w for automatic vectorization, with more to come. This is a research project, not an official Google product. Expect bugs and -[sharp edges](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb). +[sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html). Please help by trying it out, [reporting bugs](https://github.com/google/jax/issues), and letting us know what you think! @@ -83,17 +83,17 @@ open](https://github.com/google/jax) by a growing number of ## Quickstart: Colab in the Cloud Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: -- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/quickstart.ipynb) +- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html) - [Training a Simple Neural Network, with PyTorch Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Neural_Network_and_Data_Loading.ipynb) - [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/neural_network_with_tfds_data.ipynb) And for a deeper dive into JAX: -- [Common gotchas and sharp edges](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb) -- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/autodiff_cookbook.ipynb) -- [Directly using XLA in Python](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/XLA_in_Python.ipynb) -- [How JAX primitives work](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/How_JAX_primitives_work.ipynb) -- [MAML Tutorial with JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/maml.ipynb) -- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/score_matching.ipynb). +- [Common gotchas and sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) +- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html) +- [Directly using XLA in Python](https://jax.readthedocs.io/en/latest/notebooks/XLA_in_Python.html) +- [How JAX primitives work](https://jax.readthedocs.io/en/latest/notebooks/How_JAX_primitives_work.html) +- [MAML Tutorial with JAX](https://jax.readthedocs.io/en/latest/notebooks/maml.html) +- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://jax.readthedocs.io/en/latest/notebooks/score_matching.html). ## Installation @@ -239,7 +239,7 @@ print("Trained loss: {:0.2f}".format(loss(weights, inputs, targets))) ``` To see more, check out the [quickstart -notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/quickstart.ipynb), +notebook](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html), a [simple MNIST classifier example](https://github.com/google/jax/blob/master/examples/mnist_classifier.py) and the rest of the [JAX @@ -687,13 +687,13 @@ code to compile and end-to-end optimize much bigger functions. ## Current gotchas For a survey of current gotchas, with examples and explanations, we highly -recommend reading the [Gotchas Notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb). +recommend reading the [Gotchas Notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html). Some stand-out gotchas that might surprise NumPy users: 1. JAX enforces single-precision (32-bit, e.g. `float32`) values by default, and to enable double-precision (64-bit, e.g. `float64`) one needs to set the `jax_enable_x64` variable **at startup** (or set the environment variable - `JAX_ENABLE_X64=True`, see [the Gotchas Notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb#scrollTo=YTktlwTTMgFl)) + `JAX_ENABLE_X64=True`, see [the Gotchas Notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#scrollTo=Double-(64bit)-precision)) 2. Some of NumPy's dtype promotion semantics involving a mix of Python scalars and NumPy types aren't preserved, namely `np.add(1, np.array([2], np.float32)).dtype` is `float64` rather than `float32`. @@ -704,7 +704,7 @@ Some stand-out gotchas that might surprise NumPy users: reasons](https://github.com/google/jax/blob/master/design_notes/prng.md), and non-reuse (linearity) is not yet checked. -See [the notebook](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Common_Gotchas_in_JAX.ipynb) for much more information. +See [the notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) for much more information. ## Citing JAX diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 817826dadb8c..3fb72f707ca2 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -2183,7 +2183,7 @@ "id": "YTktlwTTMgFl" }, "source": [ - "## 🔪 Double (64bit) precision\n", + "## Double (64bit) precision\n", "\n", "At the moment, JAX by default enforces single-precision numbers to mitigate the Numpy API's tendency to aggressively promote operands to `double`. This is the desired behavior for many machine-learning applications, but it may catch you by surprise!" ] diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 0e5143a7b7e2..27d9532677bd 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -807,7 +807,7 @@ "### Forward differentiation\n", "\n", "JAX implements forward differentiation in the form of\n", - "a Jacobian-vector product (see the [JAX autodiff cookbook](https://colab.research.google.com/github/google/jax/blob/master/notebooks/autodiff_cookbook.ipynb#scrollTo=OMmi9cyhs1bj)).\n", + "a Jacobian-vector product (see the [JAX autodiff cookbook](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html#Jacobian-Matrix-and-Matrix-Jacobian-products)).\n", "\n", "If we attempt now to compute the `jvp` function we get an\n", "error because we have not yet told JAX how to differentiate\n", @@ -1195,8 +1195,8 @@ "```\n", "\n", "By construction, the tangent calculation is always linear in the input tangents. \n", - "When the tangent calculation uses non-linear operations, such as multiplication,\n", - "one or more of the operands is constant such that the computation is still linear in the non-constant arguments.\n", + "The only non-linear operator that may arise in the tangent calculation is multiplication,\n", + "but then one of the operands is constant.\n", "\n", "JAX will produce the reverse differentiation computation by processing the\n", "JVP computation backwards. For each operation in the tangent computation,\n", @@ -1205,7 +1205,7 @@ "of the operation:\n", "```\n", " # Initialize cotangents of inputs and intermediate vars\n", - " xct = yct = act = bct = cct = 0\n", + " xct = yct = act = bct = cct = 0.\n", " # Initialize cotangent of the output\n", " fct = 1.\n", " # Process \"ft = c + yt\"\n", @@ -1221,14 +1221,14 @@ "```\n", "\n", "One can verify that this computation produces `xct = 4.` and `yct = 3.`, which \n", - "are the partial derivatives of the function f. \n", + "are the partial derivatives of the function `f`. \n", "\n", "JAX knows for each primitive that may appear in a JVP calculation how to transpose it. Conceptually, if the primitive `p(x, y, z)` is linear in the arguments `y` and `z` for a constant value of `x`, e.g., `p(x, y, z) = y*cy + z*cz`, then the transposition of the primitive is:\n", "```\n", "p_transpose(out_ct, x, _, _) = (None, out_ct*cy, out_ct*cz)\n", "```\n", "\n", - "Notice that `p_transpose` takes the cotangent of the output of the primitive and a value corresponding to each argument of the primitive. For the linear arguments, the transposition gets an undefined `_` value, and for the constant\n", + "Notice that `p_transpose` takes the cotangent of the output of the primitive and a value corresponding to each argument of the primitive. For the linear arguments, the transposition gets an undefined `_` value, and for the other\n", "arguments it gets the actual constants. The transposition returns a cotangent value for each argument of the primitive, with the value `None` returned \n", "for the constant arguments.\n", "\n", From 774012f2fd80de324f713737ab56ecf994776050 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 29 Oct 2019 10:19:41 -0400 Subject: [PATCH 0254/1053] Add test for pytree handling of subclasses of collections.namedtuple. (#1586) --- tests/tree_util_tests.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/tree_util_tests.py b/tests/tree_util_tests.py index af6ea0c05967..406748fa5a8b 100644 --- a/tests/tree_util_tests.py +++ b/tests/tree_util_tests.py @@ -31,6 +31,8 @@ def _dummy_func(*args, **kwargs): ATuple = collections.namedtuple("ATuple", ("foo", "bar")) +class ANamedTupleSubclass(ATuple): + pass class AnObject(object): @@ -62,7 +64,8 @@ def __repr__(self): ([3, ATuple(foo=(3, ATuple(foo=3, bar=None)), bar={"baz": 34})],), ([AnObject(3, None, [4, "foo"])],), ({"a": 1, "b": 2},), - (collections.OrderedDict([("foo", 34), ("baz", 101), ("something", -42)]),) + (collections.OrderedDict([("foo", 34), ("baz", 101), ("something", -42)]),), + (ANamedTupleSubclass(foo="hello", bar=3.5),), ] From 0dd720cd8aa532b0cdfd5a21fa62f692bff6ee76 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 29 Oct 2019 11:04:55 -0400 Subject: [PATCH 0255/1053] Disable some tests that fail. (#1587) Add a BUILD rule for experimental/vectorize.py. --- jax/BUILD | 6 ++++++ tests/fft_test.py | 6 ++++++ tests/lax_control_flow_test.py | 28 +++++++++++++++++++++++++++- tests/nn_test.py | 9 +++++---- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/jax/BUILD b/jax/BUILD index c60e17688fc6..f8999206e1d5 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -65,3 +65,9 @@ py_library( srcs = ["experimental/ode.py"], deps = [":jax"], ) + +py_library( + name = "vectorize", + srcs = ["experimental/vectorize.py"], + deps = [":jax"], +) diff --git a/tests/fft_test.py b/tests/fft_test.py index 2ef3bffeb741..0def8713edc5 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -16,6 +16,8 @@ from __future__ import division from __future__ import print_function +import unittest + import numpy as onp from absl.testing import absltest @@ -24,6 +26,10 @@ from jax import numpy as np from jax import test_util as jtu +from jax.config import config +config.parse_flags_with_absl() + + float_dtypes = [onp.float32, onp.float64] complex_dtypes = [onp.complex64, onp.complex128] inexact_dtypes = float_dtypes + complex_dtypes diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 51b39fac249f..0df2bf1f6776 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -38,6 +38,10 @@ import jax.numpy as np # scan tests use numpy import jax.scipy as jsp +from jax.config import config +config.parse_flags_with_absl() + + def scan_reference(f, init, xs): carry = init ys = [] @@ -767,7 +771,8 @@ def loss(params, inputs, targets): api.jvp(lambda params: loss(params, inputs, targets), (params,), (params,)) # jvp numerical check passes - jtu.check_grads(loss, (params, inputs, targets), order=2, modes=["fwd"]) + jtu.check_grads(loss, (params, inputs, targets), order=2, modes=["fwd"], + rtol=1e-3) # linearize works _, expected = api.jvp(loss, (params, inputs, targets), @@ -1054,6 +1059,9 @@ def fun(carry, _): api.grad(lambda x: jit_run_scan(x))(0.) # doesn't crash def test_root_scalar(self): + # TODO(shoyer): test fails on TPU + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") def scalar_solve(f, y): return y / f(1.0) @@ -1095,6 +1103,9 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False) def test_root_vector(self): + # TODO(shoyer): test fails on TPU + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") def oracle(func, x0): del func # unused @@ -1132,6 +1143,9 @@ def dummy_root_usage(x): {"testcase_name": "symmetric", "symmetric": True}, ) def test_custom_linear_solve(self, symmetric): + # TODO(shoyer): test fails on TPU + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") def explicit_jacobian_solve(matvec, b): return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) @@ -1162,6 +1176,9 @@ def linear_solve(a, b): # self.assertAllClose(expected, actual, check_dtypes=True) def test_custom_linear_solve_zeros(self): + # TODO(shoyer): test fails on TPU + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") def explicit_jacobian_solve(matvec, b): return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) @@ -1212,6 +1229,9 @@ def build_and_solve(a, b): # jtu.check_grads(api.vmap(build_and_solve), (a2, b2), atol=1e-5, order=2) def test_custom_linear_solve_cholesky(self): + # TODO(shoyer): test fails on TPU + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") def positive_definive_solve(a, b): factors = jsp.linalg.cho_factor(a) @@ -1237,6 +1257,9 @@ def solve(matvec, x): (a, b), order=2) def test_custom_linear_solve_lu(self): + # TODO(shoyer): test fails on TPU + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") def linear_solve(a, b): a_factors = jsp.linalg.lu_factor(a) @@ -1262,6 +1285,9 @@ def transpose_solve(vecmat, x): jtu.check_grads(api.jit(linear_solve), (a, b), order=2) def test_custom_linear_solve_without_transpose_solve(self): + # TODO(shoyer): test fails on TPU + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") def explicit_jacobian_solve(matvec, b): return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) diff --git a/tests/nn_test.py b/tests/nn_test.py index 208f62be2b09..88b6d1a7d5df 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -59,7 +59,6 @@ def testEluValue(self): def initializer_record(name, initializer, min_dims=2, max_dims=4): shapes = [shape for shape in ALL_SHAPES if min_dims <= len(shape) <= max_dims] - return InitializerRecord(name, initializer, shapes) INITIALIZER_RECS = [ @@ -71,7 +70,8 @@ def initializer_record(name, initializer, min_dims=2, max_dims=4): initializer_record("glorot_uniform", nn.initializers.glorot_uniform()), initializer_record("lecun_normal", nn.initializers.lecun_normal()), initializer_record("lecun_uniform", nn.initializers.lecun_uniform()), - initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2) + # TODO(jekbradbury): test fails for shape (3, 2) + # initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2) ] class NNInitializersTest(jtu.JaxTestCase): @@ -81,12 +81,13 @@ class NNInitializersTest(jtu.JaxTestCase): "_{}_{}".format( rec.name, jtu.format_shape_dtype_string(shape, dtype)), - "initializer": rec.initializer, "rng": random.PRNGKey(0), + "initializer": rec.initializer, "shape": shape, "dtype": dtype} for rec in INITIALIZER_RECS for shape in rec.shapes for dtype in [onp.float32, onp.float64])) - def testInitializer(self, initializer, rng, shape, dtype): + def testInitializer(self, initializer, shape, dtype): + rng = random.PRNGKey(0) val = initializer(rng, shape, dtype) if __name__ == "__main__": From ce5b8670f31cebb9f03d55fd3666b36dee4e1db1 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 29 Oct 2019 11:26:48 -0400 Subject: [PATCH 0256/1053] Delete XRT references from jax. (#1588) --- jax/lib/__init__.py | 1 - jax/lib/xla_bridge.py | 13 +------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 0a5eb05ea3b4..fff24d4fd405 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -45,7 +45,6 @@ def _check_jaxlib_version(): from jaxlib import xla_client -from jaxlib import xrt from jaxlib import lapack from jaxlib import pytree diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index ef2cd72698df..f6c917ab3983 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -37,7 +37,6 @@ from . import version from . import xla_client -from . import xrt FLAGS = flags.FLAGS flags.DEFINE_bool('jax_enable_x64', @@ -45,7 +44,7 @@ 'Enable 64-bit types to be used.') flags.DEFINE_string( 'jax_xla_backend', 'xla', - 'Either "xla" for the XLA service directly, or "xrt" for an XRT backend.') + 'Default is "xla" for the XLA service directly.') flags.DEFINE_string( 'jax_backend_target', 'local', 'Either "local" or "rpc:address" to connect to a remote service target.') @@ -116,18 +115,8 @@ def _get_local_backend(platform=None): return backend -def _get_xrt_backend(platform=None): - del platform - # TODO(phawkins): support non-TPU devices. - tf_device_name = "TPU" - worker = "tpu_worker" - tf_context = xrt.get_tf_context(FLAGS.jax_backend_target, worker) - backend = xrt.XrtBackend(tf_context, tf_device_name) - return backend - register_backend('xla', _get_local_backend) -register_backend('xrt', _get_xrt_backend) _backend_lock = threading.Lock() From 18f8b6f87a15a27d64627ad8241bb378815082fb Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 29 Oct 2019 13:50:28 -0400 Subject: [PATCH 0257/1053] Move gradient test tolerance specification to the correct check_grads call. (#1589) --- tests/lax_control_flow_test.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 0df2bf1f6776..3367b5463c7a 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -771,8 +771,7 @@ def loss(params, inputs, targets): api.jvp(lambda params: loss(params, inputs, targets), (params,), (params,)) # jvp numerical check passes - jtu.check_grads(loss, (params, inputs, targets), order=2, modes=["fwd"], - rtol=1e-3) + jtu.check_grads(loss, (params, inputs, targets), order=2, modes=["fwd"]) # linearize works _, expected = api.jvp(loss, (params, inputs, targets), @@ -785,7 +784,7 @@ def loss(params, inputs, targets): api.grad(loss)(params, inputs, targets) # gradient check passes - jtu.check_grads(loss, (params, inputs, targets), order=2) + jtu.check_grads(loss, (params, inputs, targets), order=2, rtol=1e-2) # we can vmap to batch things batch_size = 7 From 519356235618f3074b7870b36e64d192b4e48b7a Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 29 Oct 2019 11:08:14 -0700 Subject: [PATCH 0258/1053] split nesterov into its own optimizer --- jax/experimental/optimizers.py | 35 ++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/jax/experimental/optimizers.py b/jax/experimental/optimizers.py index 7884b8449aa7..09b604a8f0a8 100644 --- a/jax/experimental/optimizers.py +++ b/jax/experimental/optimizers.py @@ -200,12 +200,13 @@ def get_params(x): return init, update, get_params @optimizer -def momentum(step_size, mass, nesterov=False): - """Construct optimizer triple for SGD with (optionally) Nesterov momentum. +def momentum(step_size, mass): + """Construct optimizer triple for SGD with momentum. Args: step_size: positive scalar, or a callable representing a step size schedule that maps the iteration index to positive scalar. + mass: positive scalar representing the momentum coefficient. Returns: An (init_fun, update_fun, get_params) triple. @@ -217,8 +218,34 @@ def init(x0): def update(i, g, state): x, velocity = state velocity = mass * velocity + g - d = mass * velocity + g if nesterov else velocity - x = x - step_size(i) * d + x = x - step_size(i) * velocity + return x, velocity + def get_params(state): + x, _ = state + return x + return init, update, get_params + + +@optimizer +def nesterov(step_size, mass): + """Construct optimizer triple for SGD with Nesterov momentum. + + Args: + step_size: positive scalar, or a callable representing a step size schedule + that maps the iteration index to positive scalar. + mass: positive scalar representing the momentum coefficient. + + Returns: + An (init_fun, update_fun, get_params) triple. + """ + step_size = make_schedule(step_size) + def init(x0): + v0 = np.zeros_like(x0) + return x0, v0 + def update(i, g, state): + x, velocity = state + velocity = mass * velocity + g + x = x - step_size(i) * (mass * velocity + g) return x, velocity def get_params(state): x, _ = state From ce34cb73c78f591fdeeb585aa229ffbc05026851 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 29 Oct 2019 11:34:20 -0700 Subject: [PATCH 0259/1053] fix orthogonal initializer and reenable test --- jax/nn/initializers.py | 2 +- tests/nn_test.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/jax/nn/initializers.py b/jax/nn/initializers.py index 14c0367bb435..4d1bb5b90818 100644 --- a/jax/nn/initializers.py +++ b/jax/nn/initializers.py @@ -92,7 +92,7 @@ def init(key, shape, dtype=np.float32): Q, R = np.linalg.qr(A) Q *= np.sign(np.diag(R)) # needed for a uniform distribution if n_rows < n_cols: Q = Q.T - Q = np.reshape(Q, onp.delete(shape, column_axis) + (shape[column_axis],)) + Q = np.reshape(Q, tuple(onp.delete(shape, column_axis)) + (shape[column_axis],)) Q = np.moveaxis(Q, -1, column_axis) return scale * Q return init diff --git a/tests/nn_test.py b/tests/nn_test.py index 88b6d1a7d5df..fddb63382fda 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -70,8 +70,7 @@ def initializer_record(name, initializer, min_dims=2, max_dims=4): initializer_record("glorot_uniform", nn.initializers.glorot_uniform()), initializer_record("lecun_normal", nn.initializers.lecun_normal()), initializer_record("lecun_uniform", nn.initializers.lecun_uniform()), - # TODO(jekbradbury): test fails for shape (3, 2) - # initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2) + initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2) ] class NNInitializersTest(jtu.JaxTestCase): From a0cf482636e0d1435fd28da45ed27f36554b9d55 Mon Sep 17 00:00:00 2001 From: joaogui1 Date: Thu, 3 Oct 2019 16:01:41 -0300 Subject: [PATCH 0260/1053] Adds new functionality to wraps --- jax/numpy/lax_numpy.py | 141 ++++++++++++++----------- jax/scipy/linalg.py | 4 +- jax/scipy/special.py | 12 +-- jax/scipy/stats/bernoulli.py | 4 +- jax/scipy/stats/beta.py | 4 +- jax/scipy/stats/cauchy.py | 4 +- jax/scipy/stats/dirichlet.py | 4 +- jax/scipy/stats/expon.py | 4 +- jax/scipy/stats/gamma.py | 4 +- jax/scipy/stats/laplace.py | 6 +- jax/scipy/stats/multivariate_normal.py | 4 +- jax/scipy/stats/norm.py | 10 +- jax/scipy/stats/pareto.py | 4 +- jax/scipy/stats/t.py | 4 +- jax/scipy/stats/uniform.py | 4 +- 15 files changed, 118 insertions(+), 95 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 3cff5ed3ea01..ea950884decd 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -242,10 +242,45 @@ def _promote_args_like(op, *args): def _constant_like(x, const): return onp.array(const, dtype=_dtype(x)) + +def update_numpydoc(docstr, fun, op): + '''Transforms the numpy docstring to remove references of + parameters that are supported by the numpy version but not the JAX version''' + + #Some numpy functions have an extra tab at the beginning of each line, + #If this function is one of those we remove this extra tab from all the lines + if docstr[:4] == ' ': + lines = docstr.split('\n') + for idx, line in enumerate(lines): + lines[idx] = line.replace(' ', '', 1) + docstr = '\n'.join(lines) + + begin_idx = docstr.find("Parameters") + begin_idx = docstr.find("--\n", begin_idx) + 2 + end_idx = docstr.find("Returns", begin_idx) + + parameters = docstr[begin_idx:end_idx] + param_list = parameters.replace('\n ', '@@').split('\n') + for idx, p in enumerate(param_list): + param = p[:p.find(' : ')].split(", ")[0] + if param not in op.__code__.co_varnames: + param_list[idx] = '' + param_list = [param for param in param_list if param != ''] + parameters = '\n'.join(param_list).replace('@@', '\n ') + return docstr[:begin_idx + 1] + parameters + docstr[end_idx - 2:] + _numpy_signature_re = re.compile(r'^([\w., ]+=)?\s*[\w\.]+\(.*\)$') -def _wraps(fun): - """Like functools.wraps but works with numpy.ufuncs.""" +def _wraps(fun, update_doc=True): + """Like functools.wraps but works with numpy.ufuncs. + It is important that when wrapping numpy functions the parameters names + in the original function and in the JAX version are the same + Parameters: + fun: The function being wrapped + update_doc: whether to transform the numpy docstring to remove references of + parameters that are supported by the numpy version but not the JAX version. + If False, include the numpy docstring verbatim. + """ def wrap(op): try: # Numpy doc comments have the form: @@ -268,25 +303,13 @@ def wrap(op): summary = sections[i].strip() break body = "\n\n".join(signatures + sections[i + 1:]) + if update_doc: + body = update_numpydoc(body, fun, op) docstr = ( "{summary}\n\nLAX-backend implementation of :func:`{fun}`. " "Original docstring below.\n\n{body}".format( summary=summary, fun=fun.__name__, body=body)) - begin_idx = docstr.find("Parameters") - begin_idx += docstr[begin_idx:].find("--\n") + 2 - end_idx = docstr.find("Returns") - - parameters = docstr[begin_idx:end_idx] - param_list = parameters.replace('\n ', '@@').split('\n') - - for idx, p in enumerate(param_list): - param, *_ = p.split(' : ') - if param not in op.__code__.co_varnames: - param_list[idx] = '' - param_list = [param for param in param_list if param != ''] - parameters = '\n'.join(param_list).replace('@@', '\n ') - docstr = docstr[:begin_idx + 1] + parameters + docstr[end_idx - 2:] op.__name__ = fun.__name__ op.__doc__ = docstr @@ -317,9 +340,9 @@ def _one_to_one_unop(numpy_fn, lax_fn, promote_like=False): def _one_to_one_binop(numpy_fn, lax_fn, promote_like=False): if promote_like: - fn = lambda x, y: lax_fn(*_promote_args_like(numpy_fn, x, y)) + fn = lambda x1, x2: lax_fn(*_promote_args_like(numpy_fn, x1, x2)) else: - fn = lambda x, y: lax_fn(*_promote_args(numpy_fn.__name__, x, y)) + fn = lambda x1, x2: lax_fn(*_promote_args(numpy_fn.__name__, x1, x2)) return _wraps(numpy_fn)(fn) absolute = abs = _one_to_one_unop(onp.absolute, lax.abs) @@ -364,16 +387,16 @@ def _one_to_one_binop(numpy_fn, lax_fn, promote_like=False): def _comparison_op(numpy_fn, lax_fn): - def fn(x, y): - x, y = _promote_args(numpy_fn.__name__, x, y) + def fn(x1, x2): + x1, x2 = _promote_args(numpy_fn.__name__, x1, x2) # Comparison on complex types are defined as a lexicographic ordering on # the (real, imag) pair. - if issubdtype(_dtype(x), complexfloating): - rx = lax.real(x) - ry = lax.real(y) - return lax.select(lax.eq(rx, ry), lax_fn(lax.imag(x), lax.imag(y)), + if issubdtype(_dtype(x1), complexfloating): + rx = lax.real(x1) + ry = lax.real(x2) + return lax.select(lax.eq(rx, ry), lax_fn(lax.imag(x1), lax.imag(x2)), lax_fn(rx, ry)) - return lax_fn(x, y) + return lax_fn(x1, x2) return _wraps(numpy_fn)(fn) greater_equal = _comparison_op(onp.greater_equal, lax.ge) @@ -383,7 +406,7 @@ def fn(x, y): def _logical_op(np_op, bitwise_op): - @_wraps(np_op) + @_wraps(np_op, update_doc=False) def op(*args): zero = lambda x: lax.full_like(x, shape=(), fill_value=0) args = (x if onp.issubdtype(_dtype(x), onp.bool_) else lax.ne(x, zero(x)) @@ -528,7 +551,7 @@ def remainder(x1, x2): lax.ne(lax.lt(trunc_mod, zero), lax.lt(x2, zero)), trunc_mod_not_zero) return lax.select(do_plus, lax.add(trunc_mod, x2), trunc_mod) mod = remainder -fmod = _wraps(onp.fmod)(lambda x, y: lax.rem(x, y)) +fmod = _wraps(onp.fmod)(lambda x1, x2: lax.rem(x1, x2)) @_wraps(onp.cbrt) @@ -560,17 +583,17 @@ def rad2deg(x): @_wraps(onp.heaviside) -def heaviside(x, y): - x, y = _promote_to_result_dtype(onp.heaviside, x, y) - zero = lax._const(x, 0) - return where(lax.lt(x, zero), zero, - where(lax.gt(x, zero), lax._const(x, 1), y)) +def heaviside(x1, x2): + x1, x2 = _promote_to_result_dtype(onp.heaviside, x1, x2) + zero = lax._const(x1, 0) + return where(lax.lt(x1, zero), zero, + where(lax.gt(x1, zero), lax._const(x1, 1), x2)) @_wraps(onp.hypot) -def hypot(x, y): - x, y = _promote_to_result_dtype(onp.hypot, x, y) - return lax.sqrt(x*x + y*y) +def hypot(x1, x2): + x1, x2 = _promote_to_result_dtype(onp.hypot, x1, x2) + return lax.sqrt(x1*x1 + x2*x2) @_wraps(onp.reciprocal) @@ -579,7 +602,7 @@ def reciprocal(x): return lax.div(lax._const(x, 1), x) -@_wraps(onp.sinc) +@_wraps(onp.sinc, update_doc=False) def sinc(x): x, = _promote_to_result_dtype(onp.sinc, x) pi_x = lax.mul(lax._const(x, pi), x) @@ -629,9 +652,9 @@ def arctanh(x): @_wraps(onp.transpose) -def transpose(x, axes=None): - axes = onp.arange(ndim(x))[::-1] if axes is None else axes - return lax.transpose(x, axes) +def transpose(a, axes=None): + axes = onp.arange(ndim(a))[::-1] if axes is None else axes + return lax.transpose(a, axes) @_wraps(onp.rot90) @@ -677,13 +700,13 @@ def conjugate(x): @_wraps(onp.imag) -def imag(x): - return lax.imag(x) if iscomplexobj(x) else zeros_like(x) +def imag(val): + return lax.imag(val) if iscomplexobj(val) else zeros_like(val) @_wraps(onp.real) -def real(x): - return lax.real(x) if iscomplexobj(x) else x +def real(val): + return lax.real(val) if iscomplexobj(val) else val @_wraps(onp.iscomplex) @@ -697,12 +720,12 @@ def isreal(x): return lax.eq(i, lax._const(i, 0)) @_wraps(onp.angle) -def angle(x): - re = real(x) - im = imag(x) +def angle(z): + re = real(z) + im = imag(z) dtype = _dtype(re) if not issubdtype(dtype, inexact) or ( - issubdtype(_dtype(x), floating) and ndim(x) == 0): + issubdtype(_dtype(z), floating) and ndim(z) == 0): dtype = xla_bridge.canonicalize_dtype(float64) re = lax.convert_element_type(re, dtype) im = lax.convert_element_type(im, dtype) @@ -736,8 +759,8 @@ def diff(a, n=1, axis=-1,): @_wraps(onp.isrealobj) -def isrealobj(a): - return not iscomplexobj(a) +def isrealobj(x): + return not iscomplexobj(x) @_wraps(onp.reshape) @@ -861,7 +884,7 @@ def _maybe_numpy_1_13_isclose_behavior(a, out): # The `jit` on `where` exists to avoid materializing constants in cases like # `np.where(np.zeros(1000), 7, 4)`. In op-by-op mode, we don't want to # materialize the broadcast forms of scalar arguments. -@_wraps(onp.where) +@_wraps(onp.where, update_doc=False) @jit def where(condition, x=None, y=None): if x is None or y is None: @@ -933,7 +956,7 @@ def split(ary, indices_or_sections, axis=0): for start, end in zip(split_indices[:-1], split_indices[1:])] def _split_on_axis(onp_fun, axis): - @_wraps(onp_fun) + @_wraps(onp_fun, update_doc=False) def f(ary, indices_or_sections): return split(ary, indices_or_sections, axis=axis) return f @@ -965,7 +988,7 @@ def _dtype_info(dtype): return onp.finfo(dtype) -@_wraps(onp.round) +@_wraps(onp.round, update_doc=False) def round(a, decimals=0): dtype = _dtype(a) if issubdtype(dtype, integer): @@ -1454,7 +1477,7 @@ def column_stack(tup): return concatenate(arrays, 1) -@_wraps(onp.atleast_1d) +@_wraps(onp.atleast_1d, update_doc=False) def atleast_1d(*arys): if len(arys) == 1: arr = array(arys[0]) @@ -1463,7 +1486,7 @@ def atleast_1d(*arys): return [atleast_1d(arr) for arr in arys] -@_wraps(onp.atleast_2d) +@_wraps(onp.atleast_2d, update_doc=False) def atleast_2d(*arys): if len(arys) == 1: arr = array(arys[0]) @@ -1472,7 +1495,7 @@ def atleast_2d(*arys): return [atleast_2d(arr) for arr in arys] -@_wraps(onp.atleast_3d) +@_wraps(onp.atleast_3d, update_doc=False) def atleast_3d(*arys): if len(arys) == 1: arr = array(arys[0]) @@ -1628,7 +1651,7 @@ def _wrap_numpy_nullary_function(f): `f` cannot have any non-static array arguments. """ - @_wraps(f) + @_wraps(f, update_doc=False) def wrapper(*args, **kwargs): return asarray(f(*args, **kwargs)) return wrapper @@ -1814,7 +1837,7 @@ def tril(m, k=0): return lax.select(lax.broadcast(mask, m_shape[:-2]), m, zeros_like(m)) -@_wraps(onp.triu) +@_wraps(onp.triu, update_doc=False) def triu(m, k=0): m_shape = shape(m) if len(m_shape) < 2: @@ -1852,7 +1875,7 @@ def trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None): def _wrap_indices_function(f): - @_wraps(f) + @_wraps(f, update_doc=False) def wrapper(*args, **kwargs): return tuple(asarray(x) for x in f(*args, **kwargs)) return wrapper @@ -2473,7 +2496,7 @@ def _take_along_axis(arr, indices, axis): return lax.gather(arr, gather_indices, dnums, tuple(slice_sizes)) -@_wraps(getattr(onp, "take_along_axis", None)) +@_wraps(getattr(onp, "take_along_axis", None), update_doc=False) def take_along_axis(arr, indices, axis): return _take_along_axis(arr, indices, axis) diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index ff8dd89a6872..64a93c837740 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -43,7 +43,7 @@ def cho_factor(a, lower=False, overwrite_a=False, check_finite=True): return (cholesky(a, lower=lower), lower) -@_wraps(scipy.linalg.cho_solve) +@_wraps(scipy.linalg.cho_solve, update_doc=False) def cho_solve(c_and_lower, b, overwrite_b=False, check_finite=True): del overwrite_b, check_finite c, lower = c_and_lower @@ -159,7 +159,7 @@ def lu_solve(lu_and_piv, b, trans=0, overwrite_b=False, check_finite=True): lu, pivots = lu_and_piv return _lu_solve(lu, pivots, b, trans) -@_wraps(scipy.linalg.lu) +@_wraps(scipy.linalg.lu, update_doc=False) def lu(a, permute_l=False, overwrite_a=False, check_finite=True): del overwrite_a, check_finite a = np_linalg._promote_arg_dtypes(np.asarray(a)) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index 5b242a05a953..c79fce893e1e 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -32,7 +32,7 @@ def gammaln(x): return lax.lgamma(x) -@_wraps(osp_special.digamma) +@_wraps(osp_special.digamma, update_doc=False) def digamma(x): x, = _promote_args_like(osp_special.digamma, x) return lax.digamma(x) @@ -44,7 +44,7 @@ def erf(x): return lax.erf(x) -@_wraps(osp_special.erfc) +@_wraps(osp_special.erfc, update_doc=False) def erfc(x): x, = _promote_args_like(osp_special.erfc, x) return lax.erfc(x) @@ -56,7 +56,7 @@ def erfinv(x): return lax.erf_inv(x) -@_wraps(osp_special.logit) +@_wraps(osp_special.logit, update_doc=False) @custom_transforms def logit(x): x = asarray(x) @@ -64,7 +64,7 @@ def logit(x): defjvp(logit, lambda g, ans, x: g / (x * (1 - x))) -@_wraps(osp_special.expit) +@_wraps(osp_special.expit, update_doc=False) @custom_transforms def expit(x): x = asarray(x) @@ -93,7 +93,7 @@ def xlogy(x, y): return lax._safe_mul(x, lax.log(y)) -@_wraps(osp_special.xlog1py) +@_wraps(osp_special.xlog1py, update_doc=False) def xlog1py(x, y): x, y = _promote_args_like(osp_special.xlog1py, x, y) return lax._safe_mul(x, lax.log1p(y)) @@ -107,7 +107,7 @@ def entr(x): lax.neg(xlogy(x, x))) -@_wraps(osp_special.multigammaln) +@_wraps(osp_special.multigammaln, update_doc=False) def multigammaln(a, d): a, = _promote_args_like(lambda a: osp_special.multigammaln(a, 1), a) d = lax.convert_element_type(d, lax.dtype(a)) diff --git a/jax/scipy/stats/bernoulli.py b/jax/scipy/stats/bernoulli.py index 3d519c76fab1..970531fa21d9 100644 --- a/jax/scipy/stats/bernoulli.py +++ b/jax/scipy/stats/bernoulli.py @@ -24,7 +24,7 @@ from ..special import xlogy, xlog1py -@np._wraps(osp_stats.bernoulli.logpmf) +@np._wraps(osp_stats.bernoulli.logpmf, update_doc=False) def logpmf(k, p, loc=0): k, p, loc = np._promote_args_like(osp_stats.bernoulli.logpmf, k, p, loc) zero = np._constant_like(k, 0) @@ -34,6 +34,6 @@ def logpmf(k, p, loc=0): return np.where(np.logical_or(lax.lt(x, zero), lax.gt(x, one)), -np.inf, log_probs) -@np._wraps(osp_stats.bernoulli.pmf) +@np._wraps(osp_stats.bernoulli.pmf, update_doc=False) def pmf(k, p, loc=0): return np.exp(pmf(k, p, loc)) diff --git a/jax/scipy/stats/beta.py b/jax/scipy/stats/beta.py index 0bb70735c978..660aba207e2d 100644 --- a/jax/scipy/stats/beta.py +++ b/jax/scipy/stats/beta.py @@ -25,7 +25,7 @@ from ..special import gammaln -@_wraps(osp_stats.beta.logpdf) +@_wraps(osp_stats.beta.logpdf, update_doc=False) def logpdf(x, a, b, loc=0, scale=1): x, a, b, loc, scale = _promote_args_like(osp_stats.beta.logpdf, x, a, b, loc, scale) one = _constant_like(x, 1) @@ -38,7 +38,7 @@ def logpdf(x, a, b, loc=0, scale=1): return where(logical_or(lax.gt(x, lax.add(loc, scale)), lax.lt(x, loc)), -inf, log_probs) -@_wraps(osp_stats.beta.pdf) +@_wraps(osp_stats.beta.pdf, update_doc=False) def pdf(x, a, b, loc=0, scale=1): return lax.exp(logpdf(x, a, b, loc, scale)) diff --git a/jax/scipy/stats/cauchy.py b/jax/scipy/stats/cauchy.py index ba81a7ac022e..3165584bc1d7 100644 --- a/jax/scipy/stats/cauchy.py +++ b/jax/scipy/stats/cauchy.py @@ -23,7 +23,7 @@ from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps -@_wraps(osp_stats.cauchy.logpdf) +@_wraps(osp_stats.cauchy.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.cauchy.logpdf, x, loc, scale) one = _constant_like(x, 1) @@ -32,6 +32,6 @@ def logpdf(x, loc=0, scale=1): normalize_term = lax.log(lax.mul(pi, scale)) return lax.neg(lax.add(normalize_term, lax.log1p(lax.mul(scaled_x, scaled_x)))) -@_wraps(osp_stats.cauchy.pdf) +@_wraps(osp_stats.cauchy.pdf, update_doc=False) def pdf(x, loc=0, scale=1): return lax.exp(logpdf(x, loc, scale)) diff --git a/jax/scipy/stats/dirichlet.py b/jax/scipy/stats/dirichlet.py index bb65c533bd9e..ad9031cdbd21 100644 --- a/jax/scipy/stats/dirichlet.py +++ b/jax/scipy/stats/dirichlet.py @@ -29,7 +29,7 @@ def _is_simplex(x): return np.all(x > 0, axis=-1) & (x_sum <= 1) & (x_sum > 1 - 1e-6) -@np._wraps(osp_stats.dirichlet.logpdf) +@np._wraps(osp_stats.dirichlet.logpdf, update_doc=False) def logpdf(x, alpha): args = (onp.ones((0,), lax.dtype(x)), onp.ones((1,), lax.dtype(alpha))) to_dtype = lax.dtype(osp_stats.dirichlet.logpdf(*args)) @@ -40,6 +40,6 @@ def logpdf(x, alpha): return np.where(_is_simplex(x), log_probs, -np.inf) -@np._wraps(osp_stats.dirichlet.pdf) +@np._wraps(osp_stats.dirichlet.pdf, update_doc=False) def pdf(x, alpha): return lax.exp(logpdf(x, alpha)) diff --git a/jax/scipy/stats/expon.py b/jax/scipy/stats/expon.py index 33688a71047f..9de50acfb458 100644 --- a/jax/scipy/stats/expon.py +++ b/jax/scipy/stats/expon.py @@ -23,7 +23,7 @@ from ...numpy.lax_numpy import _promote_args_like, _wraps, where, inf -@_wraps(osp_stats.expon.logpdf) +@_wraps(osp_stats.expon.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.expon.logpdf, x, loc, scale) log_scale = lax.log(scale) @@ -31,6 +31,6 @@ def logpdf(x, loc=0, scale=1): log_probs = lax.neg(lax.add(linear_term, log_scale)) return where(lax.lt(x, loc), -inf, log_probs) -@_wraps(osp_stats.expon.pdf) +@_wraps(osp_stats.expon.pdf, update_doc=False) def pdf(x, loc=0, scale=1): return lax.exp(logpdf(x, loc, scale)) diff --git a/jax/scipy/stats/gamma.py b/jax/scipy/stats/gamma.py index 88201d8bd4c0..8b96bae7b17c 100644 --- a/jax/scipy/stats/gamma.py +++ b/jax/scipy/stats/gamma.py @@ -25,7 +25,7 @@ from ..special import gammaln -@_wraps(osp_stats.gamma.logpdf) +@_wraps(osp_stats.gamma.logpdf, update_doc=False) def logpdf(x, a, loc=0, scale=1): x, a, loc, scale = _promote_args_like(osp_stats.gamma.logpdf, x, a, loc, scale) one = _constant_like(x, 1) @@ -35,6 +35,6 @@ def logpdf(x, a, loc=0, scale=1): log_probs = lax.sub(log_linear_term, shape_terms) return where(lax.lt(x, loc), -inf, log_probs) -@_wraps(osp_stats.gamma.pdf) +@_wraps(osp_stats.gamma.pdf, update_doc=False) def pdf(x, a, loc=0, scale=1): return lax.exp(logpdf(x, a, loc, scale)) diff --git a/jax/scipy/stats/laplace.py b/jax/scipy/stats/laplace.py index 0b2e105ae6fd..40e24be8147f 100644 --- a/jax/scipy/stats/laplace.py +++ b/jax/scipy/stats/laplace.py @@ -23,18 +23,18 @@ from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps -@_wraps(osp_stats.laplace.logpdf) +@_wraps(osp_stats.laplace.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.laplace.logpdf, x, loc, scale) two = _constant_like(x, 2) linear_term = lax.div(lax.abs(lax.sub(x, loc)), scale) return lax.neg(lax.add(linear_term, lax.log(lax.mul(two, scale)))) -@_wraps(osp_stats.laplace.pdf) +@_wraps(osp_stats.laplace.pdf, update_doc=False) def pdf(x, loc=0, scale=1): return lax.exp(logpdf(x, loc, scale)) -@_wraps(osp_stats.laplace.cdf) +@_wraps(osp_stats.laplace.cdf, update_doc=False) def cdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.laplace.cdf, x, loc, scale) half = _constant_like(x, 0.5) diff --git a/jax/scipy/stats/multivariate_normal.py b/jax/scipy/stats/multivariate_normal.py index 7c2e7cbff890..c6187cb58c32 100644 --- a/jax/scipy/stats/multivariate_normal.py +++ b/jax/scipy/stats/multivariate_normal.py @@ -25,7 +25,7 @@ from ...numpy.linalg import det, inv -@_wraps(osp_stats.multivariate_normal.logpdf) +@_wraps(osp_stats.multivariate_normal.logpdf, update_doc=False) def logpdf(x, mean, cov): # TODO(mattjj): osp_stats.multivariate_normal.logpdf doesn't like being fed # empty-shape arrays, so we can't use _promote_args_like as written; consider @@ -47,6 +47,6 @@ def logpdf(x, mean, cov): quadratic = dot(dot(subtract(x, mean), inv(cov)), subtract(x, mean).T).astype(cov.dtype) return lax.div(lax.neg(lax.add(log_normalizer, quadratic)), two) -@_wraps(osp_stats.multivariate_normal.pdf) +@_wraps(osp_stats.multivariate_normal.pdf, update_doc=False) def pdf(x, mean, cov): return lax.exp(logpdf(x, mean, cov)) diff --git a/jax/scipy/stats/norm.py b/jax/scipy/stats/norm.py index c14cfa81a71c..21d0cc002862 100644 --- a/jax/scipy/stats/norm.py +++ b/jax/scipy/stats/norm.py @@ -24,7 +24,7 @@ from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps from .. import special -@_wraps(osp_stats.norm.logpdf) +@_wraps(osp_stats.norm.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.norm.logpdf, x, loc, scale) two = _constant_like(x, 2) @@ -34,23 +34,23 @@ def logpdf(x, loc=0, scale=1): return lax.div(lax.neg(lax.add(log_normalizer, quadratic)), two) -@_wraps(osp_stats.norm.pdf) +@_wraps(osp_stats.norm.pdf, update_doc=False) def pdf(x, loc=0, scale=1): return lax.exp(logpdf(x, loc, scale)) -@_wraps(osp_stats.norm.cdf) +@_wraps(osp_stats.norm.cdf, update_doc=False) def cdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.norm.cdf, x, loc, scale) return special.ndtr(lax.div(lax.sub(x, loc), scale)) -@_wraps(osp_stats.norm.logcdf) +@_wraps(osp_stats.norm.logcdf, update_doc=False) def logcdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.norm.logcdf, x, loc, scale) return special.log_ndtr(lax.div(lax.sub(x, loc), scale)) -@_wraps(osp_stats.norm.ppf) +@_wraps(osp_stats.norm.ppf, update_doc=False) def ppf(q, loc=0, scale=1): return np.array(special.ndtri(q) * scale + loc, 'float64') \ No newline at end of file diff --git a/jax/scipy/stats/pareto.py b/jax/scipy/stats/pareto.py index 2eb202fdc130..bbb2a5c3d3a9 100644 --- a/jax/scipy/stats/pareto.py +++ b/jax/scipy/stats/pareto.py @@ -23,7 +23,7 @@ from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps, inf, where -@_wraps(osp_stats.pareto.logpdf) +@_wraps(osp_stats.pareto.logpdf, update_doc=False) def logpdf(x, b, loc=0, scale=1): x, b, loc, scale = _promote_args_like(osp_stats.pareto.logpdf, x, b, loc, scale) one = _constant_like(x, 1) @@ -32,6 +32,6 @@ def logpdf(x, b, loc=0, scale=1): log_probs = lax.neg(lax.add(normalize_term, lax.mul(lax.add(b, one), lax.log(scaled_x)))) return where(lax.lt(x, lax.add(loc, scale)), -inf, log_probs) -@_wraps(osp_stats.pareto.pdf) +@_wraps(osp_stats.pareto.pdf, update_doc=False) def pdf(x, b, loc=0, scale=1): return lax.exp(logpdf(x, b, loc, scale)) diff --git a/jax/scipy/stats/t.py b/jax/scipy/stats/t.py index dbfc8a929567..a2a1912749a4 100644 --- a/jax/scipy/stats/t.py +++ b/jax/scipy/stats/t.py @@ -23,7 +23,7 @@ from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps -@_wraps(osp_stats.t.logpdf) +@_wraps(osp_stats.t.logpdf, update_doc=False) def logpdf(x, df, loc=0, scale=1): x, df, loc, scale = _promote_args_like(osp_stats.t.logpdf, x, df, loc, scale) two = _constant_like(x, 2) @@ -37,6 +37,6 @@ def logpdf(x, df, loc=0, scale=1): quadratic = lax.div(lax.mul(scaled_x, scaled_x), df) return lax.neg(lax.add(normalize_term, lax.mul(df_plus_one_over_two, lax.log1p(quadratic)))) -@_wraps(osp_stats.t.pdf) +@_wraps(osp_stats.t.pdf, update_doc=False) def pdf(x, df, loc=0, scale=1): return lax.exp(logpdf(x, df, loc, scale)) diff --git a/jax/scipy/stats/uniform.py b/jax/scipy/stats/uniform.py index 218d7e4119ef..3e27f5f7c575 100644 --- a/jax/scipy/stats/uniform.py +++ b/jax/scipy/stats/uniform.py @@ -22,13 +22,13 @@ from ...numpy.lax_numpy import _promote_args_like, _wraps, where, inf, logical_or -@_wraps(osp_stats.uniform.logpdf) +@_wraps(osp_stats.uniform.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): x, loc, scale = _promote_args_like(osp_stats.uniform.logpdf, x, loc, scale) log_probs = lax.neg(lax.log(scale)) return where(logical_or(lax.gt(x, lax.add(loc, scale)), lax.lt(x, loc)), -inf, log_probs) -@_wraps(osp_stats.uniform.pdf) +@_wraps(osp_stats.uniform.pdf, update_doc=False) def pdf(x, loc=0, scale=1): return lax.exp(logpdf(x, loc, scale)) From 4595d4365020e484386d0287d9e1da9889a078aa Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 29 Oct 2019 13:58:16 -0700 Subject: [PATCH 0261/1053] Re-enable some TPU tests in lax_control_flow_test (#1592) Using higher precision matrix-multplication fixes most of them. Two tests are still skipped. --- tests/lax_control_flow_test.py | 57 ++++++++++++++-------------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 3367b5463c7a..840a21933c42 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -52,6 +52,10 @@ def scan_reference(f, init, xs): return carry, ys +def high_precision_dot(a, b): + return lax.dot(a, b, precision=lax.Precision.HIGHEST) + + class LaxControlFlowTest(jtu.JaxTestCase): def testWhileWithTuple(self): @@ -1058,7 +1062,9 @@ def fun(carry, _): api.grad(lambda x: jit_run_scan(x))(0.) # doesn't crash def test_root_scalar(self): - # TODO(shoyer): test fails on TPU + + # TODO(shoyer): Figure out why this fails and re-enable it, if possible. My + # best guess is that TPUs use less stable numerics for pow(). if jtu.device_under_test() == "tpu": raise SkipTest("Test fails on TPU") @@ -1090,7 +1096,6 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): value, grad = api.value_and_grad(sqrt_cubed)(5.0) self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) - jtu.check_grads(sqrt_cubed, (5.0,), order=2, rtol=1e-3) # TODO(shoyer): reenable when batching works @@ -1102,10 +1107,6 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False) def test_root_vector(self): - # TODO(shoyer): test fails on TPU - if jtu.device_under_test() == "tpu": - raise SkipTest("Test fails on TPU") - def oracle(func, x0): del func # unused return x0 @@ -1114,7 +1115,7 @@ def vector_solve(f, y): return np.linalg.solve(api.jacobian(f)(y), y) def linear_solve(a, b): - f = lambda y: np.dot(a, y) - b + f = lambda y: high_precision_dot(a, y) - b x0 = np.linalg.solve(a, b) return lax.root(f, x0, oracle, vector_solve) @@ -1142,9 +1143,6 @@ def dummy_root_usage(x): {"testcase_name": "symmetric", "symmetric": True}, ) def test_custom_linear_solve(self, symmetric): - # TODO(shoyer): test fails on TPU - if jtu.device_under_test() == "tpu": - raise SkipTest("Test fails on TPU") def explicit_jacobian_solve(matvec, b): return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) @@ -1155,7 +1153,7 @@ def matrix_free_solve(matvec, b): symmetric=symmetric) def linear_solve(a, b): - return matrix_free_solve(partial(np.dot, a), b) + return matrix_free_solve(partial(high_precision_dot, a), b) rng = onp.random.RandomState(0) a = rng.randn(3, 3) @@ -1175,10 +1173,6 @@ def linear_solve(a, b): # self.assertAllClose(expected, actual, check_dtypes=True) def test_custom_linear_solve_zeros(self): - # TODO(shoyer): test fails on TPU - if jtu.device_under_test() == "tpu": - raise SkipTest("Test fails on TPU") - def explicit_jacobian_solve(matvec, b): return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) @@ -1187,7 +1181,7 @@ def matrix_free_solve(matvec, b): explicit_jacobian_solve) def linear_solve(a, b): - return matrix_free_solve(partial(np.dot, a), b) + return matrix_free_solve(partial(high_precision_dot, a), b) rng = onp.random.RandomState(0) a = rng.randn(3, 3) @@ -1212,7 +1206,8 @@ def matrix_free_solve(matvec, b): def build_and_solve(a, b): # intentionally non-linear in a and b - return matrix_free_solve(partial(np.dot, np.exp(a)), np.cos(b)) + matvec = partial(high_precision_dot, np.exp(a)) + return matrix_free_solve(matvec, np.cos(b)) rng = onp.random.RandomState(0) a = rng.randn(2, 2) @@ -1228,35 +1223,34 @@ def build_and_solve(a, b): # jtu.check_grads(api.vmap(build_and_solve), (a2, b2), atol=1e-5, order=2) def test_custom_linear_solve_cholesky(self): - # TODO(shoyer): test fails on TPU - if jtu.device_under_test() == "tpu": - raise SkipTest("Test fails on TPU") def positive_definive_solve(a, b): factors = jsp.linalg.cho_factor(a) def solve(matvec, x): return jsp.linalg.cho_solve(factors, x) - return lax.custom_linear_solve( - partial(np.dot, a), b, solve, symmetric=True) + matvec = partial(high_precision_dot, a) + return lax.custom_linear_solve(matvec, b, solve, symmetric=True) rng = onp.random.RandomState(0) a = rng.randn(2, 2) b = rng.randn(2) - expected = np.linalg.solve(np.dot(a, a.T), b) - actual = positive_definive_solve(np.dot(a, a.T), b) + expected = np.linalg.solve(high_precision_dot(a, a.T), b) + actual = positive_definive_solve(high_precision_dot(a, a.T), b) self.assertAllClose(expected, actual, check_dtypes=True) - actual = api.jit(positive_definive_solve)(np.dot(a, a.T), b) + actual = api.jit(positive_definive_solve)(high_precision_dot(a, a.T), b) self.assertAllClose(expected, actual, check_dtypes=True) # numerical gradients are only well defined if ``a`` is guaranteed to be # positive definite. - jtu.check_grads(lambda x, y: positive_definive_solve(np.dot(x, x.T), y), - (a, b), order=2) + jtu.check_grads( + lambda x, y: positive_definive_solve(high_precision_dot(x, x.T), y), + (a, b), order=2) def test_custom_linear_solve_lu(self): - # TODO(shoyer): test fails on TPU + + # TODO(b/143528110): re-enable when underlying XLA TPU issue is fixed if jtu.device_under_test() == "tpu": raise SkipTest("Test fails on TPU") @@ -1268,7 +1262,7 @@ def solve(matvec, x): def transpose_solve(vecmat, x): return jsp.linalg.lu_solve(at_factors, x) return lax.custom_linear_solve( - partial(np.dot, a), b, solve, transpose_solve) + partial(high_precision_dot, a), b, solve, transpose_solve) rng = onp.random.RandomState(0) a = rng.randn(3, 3) @@ -1284,15 +1278,12 @@ def transpose_solve(vecmat, x): jtu.check_grads(api.jit(linear_solve), (a, b), order=2) def test_custom_linear_solve_without_transpose_solve(self): - # TODO(shoyer): test fails on TPU - if jtu.device_under_test() == "tpu": - raise SkipTest("Test fails on TPU") def explicit_jacobian_solve(matvec, b): return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) def loss(a, b): - matvec = partial(np.dot, a) + matvec = partial(high_precision_dot, a) x = lax.custom_linear_solve(matvec, b, explicit_jacobian_solve) return np.sum(x) From 5bcbce744e0c17e0b8c44e5dc1b923aa95b719f2 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 29 Oct 2019 16:00:00 -0700 Subject: [PATCH 0262/1053] Support closures in all arguments of lax.custom_root (#1570) * WIP: linear solvers * Draft of lax.linear_solve * Refactor pytree munging inside lax.root. The primitive's implementation and JVP rules are now 100% pytree free. * Fixup linear_solve * Linearize multiple times in _root_jvp to avoid zeros * fix deftraced * add a symmetric argument * Fixup float64; add a test for symmetric/non-symmetric * test zeros in linear_solve_jvp * Revisions per review * Adjust signature of linear_solve * restore botched test * variable names * WIP: root solve jaxpr * WIP more tests * rewrite root * Root works with jaxprs * root -> custom_root * WIP undefined tangent * Delayed undefined JVP errors * use raise_on_undefined_tangents inside define_implicit_gradient * more tests on jvps with undefined tangents * Remove define_implicit_gradient * Support closures in custom_root * revert api-test * another test * jit tests * spelling --- docs/jax.lax.rst | 10 ++- jax/lax/lax_control_flow.py | 149 +++++++++++++++++---------------- tests/lax_control_flow_test.py | 60 +++++++++---- 3 files changed, 132 insertions(+), 87 deletions(-) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index a97593d24926..14aaadf37511 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -117,7 +117,6 @@ Operators sort_key_val sqrt square - stop_gradient sub tan tie_in @@ -136,6 +135,15 @@ Control flow operators scan while_loop +Custom gradient operators +------------------------- + +.. autosummary:: + :toctree: _autosummary + + stop_gradient + custom_linear_solve + custom_root Parallel operators ------------------ diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 88df6e000a7f..511e0e8d3b18 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -44,7 +44,7 @@ from jax.util import (partial, unzip2, safe_map, safe_zip, split_list, split_dict, cache) from jax.tree_util import (tree_flatten, tree_unflatten, treedef_is_leaf, - treedef_children, tree_map) + treedef_children, treedef_tuple) from jax import ad_util _map = safe_map @@ -858,32 +858,6 @@ def body(i, dst): masking.masking_rules[lax.concatenate_p] = _concat_masking_rule -def _flatten_higher_order_func( - f, tree, func_name, input_name, -): - """Flatten a higher order function ``f`` of the form ``f(g, x)``. - - ``f`` must have the type signature: - - .. code-block:: haskell - - f :: (a -> a) -> a -> a - - ```a`` many be any arbitrary fixed pytree structure. The returned function has - the same structure as ``f``, except every appearence of ``a`` is replaced by a - flat sequence of arrays in the style used internally by JAX primitives - (variadic ``*args`` arguments in function calls, lists in return values). - """ - def flat_fun(flat_g, *args_flat): - args = tree_unflatten(tree, args_flat) - g = partial(apply_flat_fun_nokwargs, flat_g, (tree, tree)) - out = f(g, args) - out_flat, out_tree = tree_flatten(out) - _check_tree(func_name, input_name, out_tree, tree) - return out_flat - return flat_fun - - def _check_tree(func_name, expected_name, actual_tree, expected_tree): if actual_tree != expected_tree: raise TypeError( @@ -908,12 +882,33 @@ def _check_tree_and_avals(what, tree1, avals1, tree2, avals2): tree_unflatten(tree2, avals2))) -def root(f, initial_guess, solve, tangent_solve): +def _stop_gradient_fun(f): + """Create a version of f() that stops all gradients.""" + def wrapper(*args, **kwargs): + args_flat, in_args_tree = tree_flatten((args, kwargs)) + args_avals = tuple(_map(_abstractify, args_flat)) + g = lambda a, b: f(*a, **b) + jaxpr, consts, out_tree = _initial_style_jaxpr(g, in_args_tree, args_avals) + out = core.jaxpr_as_fun(jaxpr)(*lax.stop_gradient(consts + tuple(args_flat))) + return tree_unflatten(out_tree, out) + return wrapper + + +_RootTuple = collections.namedtuple('_RootTuple', 'f, solve, l_and_s') + + +def _split_root_args(args, const_lengths): + params_list = split_list(args, list(const_lengths)) + return _RootTuple(*params_list[:-1]), params_list[-1] + + +def custom_root(f, initial_guess, solve, tangent_solve): """Differentiably solve for a roots of a function. This is a low-level routine, mostly intended for internal use in JAX. - Gradients of root() are defined with respect to closed-over variables from - the provided function f. + Gradients of custom_root() are defined with respect to closed-over variables + from the provided function ``f`` via the implicit function theorem: + https://en.wikipedia.org/wiki/Implicit_function_theorem Args: f: function for which to find a root. Should accept a single argument, @@ -945,39 +940,51 @@ def root(f, initial_guess, solve, tangent_solve): """ guess_flat, in_args_tree = tree_flatten((initial_guess,)) guess_avals = tuple(_map(_abstractify, guess_flat)) - jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_args_tree, guess_avals) + f_jaxpr, f_consts, out_tree = _initial_style_jaxpr( + f, in_args_tree, guess_avals) in_tree, = treedef_children(in_args_tree) _check_tree("f", "initial_guess", out_tree, in_tree) - solve_flat = _flatten_higher_order_func( - solve, in_tree, "solve", "initial_guess") - tangent_solve_flat = _flatten_higher_order_func( - tangent_solve, in_tree, "tangent_solve", "initial_guess") + solve_jaxpr, solve_consts, solution_tree = _initial_style_jaxpr( + partial(solve, _stop_gradient_fun(f)), in_args_tree, guess_avals) + _check_tree("solve", "initial_guess", solution_tree, in_tree) + + def linearize_and_solve(x, b): + unchecked_zeros, f_jvp = api.linearize(f, x) + return tangent_solve(f_jvp, b) - out_flat = root_p.bind(*itertools.chain(consts, guess_flat), - num_consts=len(consts), jaxpr=jaxpr, solve=solve_flat, - tangent_solve=tangent_solve_flat) + l_and_s_jaxpr, l_and_s_consts, out_tree = _initial_style_jaxpr( + linearize_and_solve, treedef_tuple((in_tree,) * 2), guess_avals * 2) + _check_tree("tangent_solve", "x", out_tree, in_tree) + + all_consts = [f_consts, solve_consts, l_and_s_consts] + const_lengths = _RootTuple(*_map(len, all_consts)) + jaxprs = _RootTuple(f_jaxpr, solve_jaxpr, l_and_s_jaxpr) + + out_flat = root_p.bind( + *(_flatten(all_consts) + guess_flat), + const_lengths=const_lengths, jaxprs=jaxprs) return tree_unflatten(out_tree, out_flat) def _root_abstract_eval(*args, **kwargs): - return args[kwargs['num_consts']:] + return args[sum(kwargs['const_lengths']):] def _root_impl(*args, **kwargs): - num_consts, jaxpr, solve, _ = split_dict( - kwargs, ['num_consts', 'jaxpr', 'solve', 'tangent_solve']) - params, initial_guess = split_list(args, [num_consts]) - f = partial(core.jaxpr_as_fun(jaxpr), *params) - return solve(f, *initial_guess) + const_lengths, jaxprs = split_dict(kwargs, ['const_lengths', 'jaxprs']) + params, initial_guess = _split_root_args(args, const_lengths) + solution = core.jaxpr_as_fun(jaxprs.solve)(*(params.solve + initial_guess)) + return solution -def _root_jvp(primals, tangents, num_consts, jaxpr, solve, tangent_solve): - params = primals[:num_consts] - solution = tuple(root_p.bind(*primals, num_consts=num_consts, jaxpr=jaxpr, - solve=solve, tangent_solve=tangent_solve)) - params_dot = tangents[:num_consts] +def _root_jvp(primals, tangents, const_lengths, jaxprs): + params, _ = _split_root_args(primals, const_lengths) + solution = tuple(root_p.bind( + *primals, const_lengths=const_lengths, jaxprs=jaxprs)) + + params_dot, _ = _split_root_args(tangents, const_lengths) # F(m, u) = 0 # system of equations in u, parameterized by m # # solution is u*(m) defined in a neighborhood @@ -988,13 +995,14 @@ def _root_jvp(primals, tangents, num_consts, jaxpr, solve, tangent_solve): # # ∂ u*(m)[v] = - (∂_1 F(m, u*(m)))^{-1} [∂_0 F(m, u*(m))[v]] # jvp - f = core.jaxpr_as_fun(jaxpr) - f_fixed_params = lambda *solution: f(*(params + solution)) - f_fixed_solution = lambda *params: f(*(params + solution)) - - _, rhs = ad.jvp(lu.wrap_init(f_fixed_solution)).call_wrapped(params, params_dot) - _, f_jvp_wrt_solution = api.linearize(f_fixed_params, *solution) - solution_dot = [-x for x in tangent_solve(f_jvp_wrt_solution, *rhs)] + f = core.jaxpr_as_fun(jaxprs.f) + linearize_and_solve = partial( + core.jaxpr_as_fun(jaxprs.l_and_s), *params.l_and_s) + f_at_solution = lambda *params: f(*itertools.chain(params, solution)) + _, rhs = ad.jvp(lu.wrap_init(f_at_solution)).call_wrapped( + params.f, params_dot.f) + solution_dot = _map( + operator.neg, linearize_and_solve(*itertools.chain(solution, rhs))) return solution, solution_dot @@ -1004,7 +1012,8 @@ def _root_jvp(primals, tangents, num_consts, jaxpr, solve, tangent_solve): root_p.def_impl(_root_impl) root_p.def_abstract_eval(_root_abstract_eval) ad.primitive_jvps[root_p] = _root_jvp -xla.initial_style_translations[root_p] = xla.lower_fun(_root_impl, initial_style=True) +xla.initial_style_translations[root_p] = xla.lower_fun( + _root_impl, initial_style=True) # TODO(shoyer): write batching rule @@ -1122,13 +1131,13 @@ def custom_linear_solve( jaxprs = _LinearSolveTuple( matvec_jaxpr, vecmat_jaxpr, solve_jaxpr, tr_solve_jaxpr) - out_flat = custom_linear_solve_p.bind( + out_flat = linear_solve_p.bind( *(_flatten(all_consts) + b_flat), const_lengths=const_lengths, jaxprs=jaxprs, tree=tree) return tree_unflatten(tree, out_flat) -def _custom_linear_solve_abstract_eval(*args, **kwargs): +def _linear_solve_abstract_eval(*args, **kwargs): return args[sum(kwargs['const_lengths']):] @@ -1160,7 +1169,7 @@ def _custom_linear_solve_jvp(primals, tangents, const_lengths, jaxprs, tree): # ∂x = A^{-1} (∂b - ∂A x) kwargs = dict(const_lengths=const_lengths, jaxprs=jaxprs, tree=tree) - x = custom_linear_solve_p.bind(*primals, **kwargs) + x = linear_solve_p.bind(*primals, **kwargs) params, _ = _split_linear_solve_args(primals, const_lengths) params_dot, b_dot = _split_linear_solve_args(tangents, const_lengths) @@ -1174,12 +1183,12 @@ def _custom_linear_solve_jvp(primals, tangents, const_lengths, jaxprs, tree): _check_shapes("matvec", "b", matvec_tangents, x, tree) rhs = _map(ad.add_tangents, b_dot, _map(operator.neg, matvec_tangents)) - x_dot = custom_linear_solve_p.bind(*(_flatten(params) + rhs), **kwargs) + x_dot = linear_solve_p.bind(*(_flatten(params) + rhs), **kwargs) return x, x_dot -def _custom_linear_solve_transpose_rule(cotangent, *primals, **kwargs): +def _linear_solve_transpose_rule(cotangent, *primals, **kwargs): const_lengths, jaxprs, tree = split_dict( kwargs, ['const_lengths', 'jaxprs', 'tree']) @@ -1189,19 +1198,19 @@ def _custom_linear_solve_transpose_rule(cotangent, *primals, **kwargs): params, b = _split_linear_solve_args(primals, const_lengths) assert b == [ad.undefined_primal] * len(b) - cotangent_b = custom_linear_solve_p.bind( + cotangent_b = linear_solve_p.bind( *(_flatten(params.transpose()) + cotangent), const_lengths=const_lengths.transpose(), jaxprs=jaxprs.transpose(), tree=tree) return [None] * sum(const_lengths) + cotangent_b -custom_linear_solve_p = core.Primitive('custom_linear_solve') -custom_linear_solve_p.multiple_results = True -custom_linear_solve_p.def_impl(_custom_linear_solve_impl) -custom_linear_solve_p.def_abstract_eval(_custom_linear_solve_abstract_eval) -ad.primitive_jvps[custom_linear_solve_p] = _custom_linear_solve_jvp -xla.initial_style_translations[custom_linear_solve_p] = xla.lower_fun( +linear_solve_p = core.Primitive('custom_linear_solve') +linear_solve_p.multiple_results = True +linear_solve_p.def_impl(_custom_linear_solve_impl) +linear_solve_p.def_abstract_eval(_linear_solve_abstract_eval) +ad.primitive_jvps[linear_solve_p] = _custom_linear_solve_jvp +xla.initial_style_translations[linear_solve_p] = xla.lower_fun( _custom_linear_solve_impl, initial_style=True) -ad.primitive_transposes[custom_linear_solve_p] = _custom_linear_solve_transpose_rule +ad.primitive_transposes[linear_solve_p] = _linear_solve_transpose_rule # TODO(shoyer): write batching rule diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 840a21933c42..5141672f2dde 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1061,7 +1061,7 @@ def fun(carry, _): api.grad(lambda x: jit_run_scan(x))(0.) # doesn't crash - def test_root_scalar(self): + def test_custom_root_scalar(self): # TODO(shoyer): Figure out why this fails and re-enable it, if possible. My # best guess is that TPUs use less stable numerics for pow(). @@ -1091,7 +1091,7 @@ def body(state): def sqrt_cubed(x, tangent_solve=scalar_solve): f = lambda y: y ** 2 - x ** 3 - return lax.root(f, 0.0, binary_search, tangent_solve) + return lax.custom_root(f, 0.0, binary_search, tangent_solve) value, grad = api.value_and_grad(sqrt_cubed)(5.0) self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) @@ -1106,33 +1106,61 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): results = api.jit(sqrt_cubed)(5.0) self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False) - def test_root_vector(self): - def oracle(func, x0): - del func # unused - return x0 + def test_custom_root_vector_with_solve_closure(self): def vector_solve(f, y): return np.linalg.solve(api.jacobian(f)(y), y) def linear_solve(a, b): f = lambda y: high_precision_dot(a, y) - b - x0 = np.linalg.solve(a, b) - return lax.root(f, x0, oracle, vector_solve) + x0 = np.zeros_like(b) + solution = np.linalg.solve(a, b) + oracle = lambda func, x0: solution + return lax.custom_root(f, x0, oracle, vector_solve) rng = onp.random.RandomState(0) a = rng.randn(2, 2) b = rng.randn(2) jtu.check_grads(linear_solve, (a, b), order=2) - def test_root_errors(self): + actual = api.jit(linear_solve)(a, b) + expected = np.linalg.solve(a, b) + self.assertAllClose(expected, actual, check_dtypes=True) + + def test_custom_root_with_custom_linear_solve(self): + + def linear_solve(a, b): + f = lambda x: np.dot(a, x) - b + factors = jsp.linalg.cho_factor(a) + cho_solve = lambda f, b: jsp.linalg.cho_solve(factors, b) + def pos_def_solve(g, b): + return lax.custom_linear_solve(g, b, cho_solve, symmetric=True) + return lax.custom_root(f, b, cho_solve, pos_def_solve) + + rng = onp.random.RandomState(0) + a = rng.randn(2, 2) + b = rng.randn(2) + + actual = linear_solve(np.dot(a, a.T), b) + expected = np.linalg.solve(np.dot(a, a.T), b) + self.assertAllClose(expected, actual, check_dtypes=True) + + actual = api.jit(linear_solve)(np.dot(a, a.T), b) + expected = np.linalg.solve(np.dot(a, a.T), b) + self.assertAllClose(expected, actual, check_dtypes=True) + + jtu.check_grads(lambda x, y: linear_solve(np.dot(x, x.T), y), + (a, b), order=2) + + def test_custom_root_errors(self): with self.assertRaisesRegex(TypeError, re.escape("f() output pytree")): - lax.root(lambda x: (x, x), 0.0, lambda f, x: x, lambda f, x: x) + lax.custom_root(lambda x: (x, x), 0.0, lambda f, x: x, lambda f, x: x) with self.assertRaisesRegex(TypeError, re.escape("solve() output pytree")): - lax.root(lambda x: x, 0.0, lambda f, x: (x, x), lambda f, x: x) + lax.custom_root(lambda x: x, 0.0, lambda f, x: (x, x), lambda f, x: x) def dummy_root_usage(x): f = lambda y: x - y - return lax.root(f, 0.0, lambda f, x: x, lambda f, x: (x, x)) + return lax.custom_root(f, 0.0, lambda f, x: x, lambda f, x: (x, x)) with self.assertRaisesRegex( TypeError, re.escape("tangent_solve() output pytree")): @@ -1224,7 +1252,7 @@ def build_and_solve(a, b): def test_custom_linear_solve_cholesky(self): - def positive_definive_solve(a, b): + def positive_definite_solve(a, b): factors = jsp.linalg.cho_factor(a) def solve(matvec, x): return jsp.linalg.cho_solve(factors, x) @@ -1236,16 +1264,16 @@ def solve(matvec, x): b = rng.randn(2) expected = np.linalg.solve(high_precision_dot(a, a.T), b) - actual = positive_definive_solve(high_precision_dot(a, a.T), b) + actual = positive_definite_solve(high_precision_dot(a, a.T), b) self.assertAllClose(expected, actual, check_dtypes=True) - actual = api.jit(positive_definive_solve)(high_precision_dot(a, a.T), b) + actual = api.jit(positive_definite_solve)(high_precision_dot(a, a.T), b) self.assertAllClose(expected, actual, check_dtypes=True) # numerical gradients are only well defined if ``a`` is guaranteed to be # positive definite. jtu.check_grads( - lambda x, y: positive_definive_solve(high_precision_dot(x, x.T), y), + lambda x, y: positive_definite_solve(high_precision_dot(x, x.T), y), (a, b), order=2) def test_custom_linear_solve_lu(self): From f7a44523be65098069ad5fadae128d09be1419db Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 29 Oct 2019 20:53:20 -0400 Subject: [PATCH 0263/1053] Add some type helpers to lax_numpy. (#1593) Prefer to use jax.numpy type helpers rather than numpy type helpers in various places. Cleanup in preparation for adding bfloat16 support to jax. --- docs/jax.numpy.rst | 4 +++ jax/lax_linalg.py | 2 +- jax/numpy/lax_numpy.py | 55 ++++++++++++++++++++++------------------- jax/random.py | 10 ++++---- tests/lax_numpy_test.py | 10 ++++---- tests/linalg_test.py | 10 ++++---- tests/random_test.py | 2 +- 7 files changed, 50 insertions(+), 43 deletions(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index 4b480a5c72a0..b50796ccd1b3 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -70,6 +70,7 @@ Not every function in NumPy is implemented; contributions are welcome! blackman broadcast_arrays broadcast_to + can_cast ceil clip column_stack @@ -137,6 +138,7 @@ Not every function in NumPy is implemented; contributions are welcome! isneginf isposinf isreal + isscalar issubdtype issubsctype ix_ @@ -188,6 +190,7 @@ Not every function in NumPy is implemented; contributions are welcome! positive prod product + promote_types ptp quantile rad2deg @@ -198,6 +201,7 @@ Not every function in NumPy is implemented; contributions are welcome! remainder repeat reshape + result_type right_shift roll rot90 diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 62be12a33a27..44b41ccf0956 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -127,7 +127,7 @@ def cholesky_batching_rule(batched_args, batch_dims): def _nan_like(c, operand): shape = c.GetShape(operand) dtype = shape.element_type() - if onp.issubdtype(dtype, onp.complexfloating): + if np.issubdtype(dtype, onp.complexfloating): nan = c.Constant(onp.array(onp.nan * (1. + 1j), dtype=dtype)) else: nan = c.Constant(onp.array(onp.nan, dtype=dtype)) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e768364fd899..46892673a783 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -116,7 +116,7 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, isscalar = onp.isscalar iscomplexobj = onp.iscomplexobj -result_type = onp.result_type + shape = _shape = onp.shape ndim = _ndim = onp.ndim size = onp.size @@ -151,8 +151,11 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, iinfo = onp.iinfo finfo = onp.finfo +can_cast = onp.can_cast issubdtype = onp.issubdtype issubsctype = onp.issubsctype +result_type = onp.result_type +promote_types = onp.promote_types ComplexWarning = onp.ComplexWarning @@ -372,7 +375,7 @@ def _logical_op(np_op, bitwise_op): @_wraps(np_op) def op(*args): zero = lambda x: lax.full_like(x, shape=(), fill_value=0) - args = (x if onp.issubdtype(_dtype(x), onp.bool_) else lax.ne(x, zero(x)) + args = (x if issubdtype(_dtype(x), onp.bool_) else lax.ne(x, zero(x)) for x in args) return bitwise_op(*_promote_args(np_op.__name__, *args)) return op @@ -396,7 +399,7 @@ def divide(x1, x2): # decide whether to perform integer division based on Numpy result dtype, as a # way to check whether Python 3 style division is active in Numpy result_dtype = _result_dtype(onp.divide, x1, x2) - if onp.issubdtype(result_dtype, onp.integer): + if issubdtype(result_dtype, onp.integer): return floor_divide(x1, x2) else: return true_divide(x1, x2) @@ -429,7 +432,7 @@ def floor_divide(x1, x2): @_wraps(onp.divmod) def divmod(x1, x2): x1, x2 = _promote_args("divmod", x1, x2) - if onp.issubdtype(_dtype(x1), onp.integer): + if issubdtype(_dtype(x1), onp.integer): return floor_divide(x1, x2), remainder(x1, x2) else: return _float_divmod(x1, x2) @@ -582,10 +585,10 @@ def arcsinh(x): x, = _promote_to_result_dtype(onp.arcsinh, x) one = lax._const(x, 1) result = lax.log(x + lax.sqrt(x * x + one)) - if onp.issubdtype(_dtype(result), onp.complexfloating): + if issubdtype(_dtype(result), onp.complexfloating): return result a = abs(x) - sqrt_max_value = onp.sqrt(onp.finfo(_dtype(x)).max) + sqrt_max_value = onp.sqrt(finfo(_dtype(x)).max) log2 = lax._const(a, onp.log(2)) return lax.select(a < sqrt_max_value, result, lax.sign(x) * (lax.log(a) + log2)) @@ -601,9 +604,9 @@ def arccosh(x): x, = _promote_to_result_dtype(onp.arccosh, x) one = lax._const(x, 1) result = lax.log(x + lax.sqrt((x + one) * (x - one))) - if onp.issubdtype(_dtype(result), onp.complexfloating): + if issubdtype(_dtype(result), onp.complexfloating): return result - sqrt_max_value = onp.sqrt(onp.finfo(_dtype(x)).max) + sqrt_max_value = onp.sqrt(finfo(_dtype(x)).max) log2 = lax._const(x, onp.log(2)) return lax.select(x < sqrt_max_value, result, lax.log(x) + log2) @@ -614,7 +617,7 @@ def arctanh(x): x, = _promote_to_result_dtype(onp.arctanh, x) one = lax._const(x, 1) result = lax._const(x, 0.5) * lax.log((one + x) / (one - x)) - if onp.issubdtype(_dtype(result), onp.complexfloating): + if issubdtype(_dtype(result), onp.complexfloating): return result return lax.select(abs(x) <= 1, result, lax.full_like(x, onp.nan)) @@ -857,7 +860,7 @@ def _maybe_numpy_1_13_isclose_behavior(a, out): def where(condition, x=None, y=None): if x is None or y is None: raise ValueError("Must use the three-argument form of where().") - if not onp.issubdtype(_dtype(condition), onp.bool_): + if not issubdtype(_dtype(condition), onp.bool_): condition = lax.ne(condition, zeros_like(condition)) condition, x, y = broadcast_arrays(condition, x, y) if not onp.size(x): @@ -948,9 +951,9 @@ def clip(a, a_min=None, a_max=None): def _dtype_info(dtype): """Helper function for to get dtype info needed for clipping.""" - if onp.issubdtype(dtype, onp.integer): + if issubdtype(dtype, onp.integer): return onp.iinfo(dtype) - return onp.finfo(dtype) + return finfo(dtype) def _round_to_nearest_even(x): half = lax._const(x, 0.5) @@ -1097,7 +1100,7 @@ def _reduction_init_val(a, init_val): try: return onp.array(init_val, dtype=a_dtype) except OverflowError: - assert onp.issubdtype(a_dtype, onp.integer) + assert issubdtype(a_dtype, onp.integer) sign, iinfo = onp.sign(init_val), onp.iinfo(a_dtype) return onp.array(iinfo.min if sign < 0 else iinfo.max, dtype=a_dtype) @@ -1121,8 +1124,8 @@ def mean(a, axis=None, dtype=None, out=None, keepdims=False): else: normalizer = onp.prod(onp.take(shape(a), axis)) if dtype is None: - if (onp.issubdtype(_dtype(a), onp.bool_) or - onp.issubdtype(_dtype(a), onp.integer)): + if (issubdtype(_dtype(a), onp.bool_) or + issubdtype(_dtype(a), onp.integer)): dtype = xla_bridge.canonicalize_dtype(onp.float64) else: dtype = _dtype(a) @@ -1187,8 +1190,8 @@ def var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False): raise ValueError("var does not support the `out` argument.") if dtype is None: - if (onp.issubdtype(_dtype(a), onp.bool_) or - onp.issubdtype(_dtype(a), onp.integer)): + if (issubdtype(_dtype(a), onp.bool_) or + issubdtype(_dtype(a), onp.integer)): dtype = xla_bridge.canonicalize_dtype(onp.float64) centered = subtract(a, mean(a, axis, dtype=dtype, keepdims=True)) if iscomplexobj(centered): @@ -1254,8 +1257,8 @@ def nan_reduction(a, axis=None, out=None, keepdims=False, **kwargs): def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): if out is not None: raise ValueError("nanmean does not support the `out` argument.") - if (onp.issubdtype(_dtype(a), onp.bool_) or - onp.issubdtype(_dtype(a), onp.integer)): + if (issubdtype(_dtype(a), onp.bool_) or + issubdtype(_dtype(a), onp.integer)): return mean(a, axis, dtype, out, keepdims) if dtype is None: dtype = _dtype(a) @@ -1603,7 +1606,7 @@ def eye(N, M=None, k=None, dtype=None): return lax.broadcasted_eye(dtype, (N, M), (0, 1)) else: k_dtype = _dtype(k) - if not onp.issubdtype(k_dtype, onp.integer): + if not issubdtype(k_dtype, onp.integer): msg = "eye argument `k` must be of integer dtype, got {}" raise TypeError(msg.format(k_dtype)) rows = k + lax.broadcasted_iota(k_dtype, (N, M), 0) @@ -1623,7 +1626,7 @@ def arange(start, stop=None, step=None, dtype=None): # If called like np.arange(N), we create a lazy lax._IotaConstant. if stop is None and step is None: dtype = dtype or _dtype(start) - if onp.issubdtype(dtype, onp.integer): + if issubdtype(dtype, onp.integer): return lax.iota(dtype, start) # avoids materializing # Fall back to instantiating an ndarray in host memory @@ -1975,7 +1978,7 @@ def matmul(a, b): # pylint: disable=missing-docstring @_wraps(onp.vdot) def vdot(a, b): - if onp.issubdtype(_dtype(a), onp.complexfloating): + if issubdtype(_dtype(a), onp.complexfloating): a = conj(a) return dot(a.ravel(), b.ravel()) @@ -2579,7 +2582,7 @@ def _merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx): return treedef.unflatten(idx) def _int(aval): - return not aval.shape and onp.issubdtype(aval.dtype, onp.integer) + return not aval.shape and issubdtype(aval.dtype, onp.integer) def _index_to_gather(x_shape, idx): # Remove ellipses and add trailing slice(None)s. @@ -2783,8 +2786,8 @@ def _expand_bool_indices(idx): abstract_i = core.get_aval(i) except TypeError: abstract_i = None - if (isinstance(abstract_i, ShapedArray) and onp.issubdtype(abstract_i.dtype, onp.bool_) - or isinstance(i, list) and _all(not _shape(e) and onp.issubdtype(_dtype(e), onp.bool_) + if (isinstance(abstract_i, ShapedArray) and issubdtype(abstract_i.dtype, onp.bool_) + or isinstance(i, list) and _all(not _shape(e) and issubdtype(_dtype(e), onp.bool_) for e in i)): if isinstance(i, list): i = array(i) @@ -2818,7 +2821,7 @@ def _is_advanced_int_indexer(idx): def _is_int_arraylike(x): """Returns True if x is array-like with integer dtype, False otherwise.""" return (isinstance(x, int) and not isinstance(x, bool) - or onp.issubdtype(getattr(x, "dtype", None), onp.integer) + or issubdtype(getattr(x, "dtype", None), onp.integer) or isinstance(x, (list, tuple)) and _all(_is_int_arraylike(e) for e in x)) diff --git a/jax/random.py b/jax/random.py index fa5a548a176d..684115808f61 100644 --- a/jax/random.py +++ b/jax/random.py @@ -73,7 +73,7 @@ def _is_prng_key(key): def _make_rotate_left(dtype): - if not onp.issubdtype(dtype, onp.integer): + if not np.issubdtype(dtype, onp.integer): raise TypeError("_rotate_left only accepts integer dtypes.") nbits = onp.array(onp.iinfo(dtype).bits, dtype) @@ -276,7 +276,7 @@ def uniform(key, shape=(), dtype=onp.float64, minval=0., maxval=1.): @partial(jit, static_argnums=(1, 2)) def _uniform(key, shape, dtype, minval, maxval): _check_shape("uniform", shape) - if not onp.issubdtype(dtype, onp.floating): + if not np.issubdtype(dtype, onp.floating): raise TypeError("uniform only accepts floating point dtypes.") minval = lax.convert_element_type(minval, dtype) @@ -324,7 +324,7 @@ def randint(key, shape, minval, maxval, dtype=onp.int64): @partial(jit, static_argnums=(1, 4)) def _randint(key, shape, minval, maxval, dtype): _check_shape("randint", shape, minval.shape, maxval.shape) - if not onp.issubdtype(dtype, onp.integer): + if not np.issubdtype(dtype, onp.integer): raise TypeError("randint only accepts integer dtypes.") minval = lax.convert_element_type(minval, dtype) @@ -509,7 +509,7 @@ def _truncated_normal(key, lower, upper, shape, dtype): sqrt2 = onp.array(onp.sqrt(2), dtype) a = lax.erf(lax.convert_element_type(lower, dtype) / sqrt2) b = lax.erf(lax.convert_element_type(upper, dtype) / sqrt2) - if not onp.issubdtype(dtype, onp.floating): + if not np.issubdtype(dtype, onp.floating): raise TypeError("truncated_normal only accepts floating point dtypes.") u = uniform(key, shape, dtype, minval=onp.finfo(dtype).tiny) return sqrt2 * lax.erf_inv(a + u * (b - a)) @@ -531,7 +531,7 @@ def bernoulli(key, p=onp.float32(0.5), shape=None): is not None, or else ``p.shape``. """ dtype = xla_bridge.canonicalize_dtype(lax.dtype(p)) - if not onp.issubdtype(dtype, onp.floating): + if not np.issubdtype(dtype, onp.floating): msg = "bernoulli probability `p` must have a floating dtype, got {}." raise TypeError(msg.format(dtype)) p = lax.convert_element_type(p, dtype) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 8392f82e4ab8..0158774b7882 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -315,7 +315,7 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, def _dtypes_are_compatible_for_bitwise_ops(args): if len(args) <= 1: return True - is_signed = lambda dtype: onp.issubdtype(dtype, onp.signedinteger) + is_signed = lambda dtype: lnp.issubdtype(dtype, onp.signedinteger) width = lambda dtype: onp.iinfo(dtype).bits x, y = args if width(x) > width(y): @@ -696,7 +696,7 @@ def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng): for shape in all_shapes for dtype in number_dtypes for decimals in [0, 1, -2])) def testRoundStaticDecimals(self, shape, dtype, decimals, rng): - if onp.issubdtype(dtype, onp.integer) and decimals < 0: + if lnp.issubdtype(dtype, onp.integer) and decimals < 0: self.skipTest("Integer rounding with decimals < 0 not implemented") onp_fun = lambda x: onp.round(x, decimals=decimals) lnp_fun = lambda x: lnp.round(x, decimals=decimals) @@ -1850,8 +1850,8 @@ def testMathSpecialFloatValues(self, op, dtype): lnp_op = getattr(lnp, op) dtype = onp.dtype(xla_bridge.canonicalize_dtype(dtype)).type for x in (onp.nan, -onp.inf, -100., -2. -1., 0., 1., 2., 100., onp.inf, - onp.finfo(dtype).max, onp.sqrt(onp.finfo(dtype).max), - onp.sqrt(onp.finfo(dtype).max) * 2.): + lnp.finfo(dtype).max, onp.sqrt(lnp.finfo(dtype).max), + onp.sqrt(lnp.finfo(dtype).max) * 2.): if onp.isnan(x) and op in ("sinh", "cosh", "expm1", "exp"): # TODO(b/133842876, b/133842870): these return wrong outputs on CPU for # NaN inputs. @@ -2088,7 +2088,7 @@ def grad_test_spec(op, nargs, order, rng, dtypes, name=None, tol=None): ] def num_float_bits(dtype): - return onp.finfo(xla_bridge.canonicalize_dtype(dtype)).bits + return lnp.finfo(xla_bridge.canonicalize_dtype(dtype)).bits class NumpyGradTests(jtu.JaxTestCase): @parameterized.named_parameters(itertools.chain.from_iterable( diff --git a/tests/linalg_test.py b/tests/linalg_test.py index ef8149fce7ac..a5cdd8b52893 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -194,7 +194,7 @@ def testEigh(self, n, dtype, lower, rng): _skip_if_unsupported_type(dtype) tol = 30 if jtu.device_under_test() == "tpu": - if onp.issubdtype(dtype, onp.complexfloating): + if np.issubdtype(dtype, onp.complexfloating): raise unittest.SkipTest("No complex eigh on TPU") # TODO(phawkins): this tolerance is unpleasantly high. tol = 1500 @@ -295,7 +295,7 @@ def testEighGradVectorComplex(self, shape, dtype, rng, lower, eps): def testEighBatching(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) if (jtu.device_under_test() == "tpu" and - onp.issubdtype(dtype, onp.complexfloating)): + np.issubdtype(dtype, onp.complexfloating)): raise unittest.SkipTest("No complex eigh on TPU") shape = (10,) + shape args = rng(shape, dtype) @@ -408,7 +408,7 @@ def norm(x): for rng in [jtu.rand_default()])) def testQr(self, shape, dtype, full_matrices, rng): _skip_if_unsupported_type(dtype) - if (onp.issubdtype(dtype, onp.complexfloating) and + if (np.issubdtype(dtype, onp.complexfloating) and (jtu.device_under_test() == "tpu" or jax.lib.version <= (0, 1, 27))): raise unittest.SkipTest("No complex QR implementation") m, n = shape[-2:] @@ -685,7 +685,7 @@ def args_maker(): for rng in [jtu.rand_default()])) def testSolve(self, lhs_shape, rhs_shape, dtype, sym_pos, lower, rng): _skip_if_unsupported_type(dtype) - if (sym_pos and onp.issubdtype(dtype, onp.complexfloating) and + if (sym_pos and np.issubdtype(dtype, onp.complexfloating) and jtu.device_under_test() == "tpu"): raise unittest.SkipTest( "Complex Cholesky decomposition not implemented on TPU") @@ -765,7 +765,7 @@ def testSolveTriangular(self, lower, transpose_a, unit_diagonal, lhs_shape, for dtype in float_types + complex_types for transpose_a in [False, True] for conjugate_a in ( - [False] if onp.issubdtype(dtype, np.floating) else [False, True]) + [False] if np.issubdtype(dtype, np.floating) else [False, True]) for left_side, a_shape, b_shape in [ (False, (4, 4), (1, 4,)), (False, (3, 3), (4, 3)), diff --git a/tests/random_test.py b/tests/random_test.py index e6e6a86fe048..c4adf71fea8b 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -64,7 +64,7 @@ def _CheckChiSquared(self, samples, pmf): {"testcase_name": "_{}".format(dtype), "dtype": onp.dtype(dtype).name} for dtype in [onp.float32, onp.float64])) def testNumpyAndXLAAgreeOnFloatEndianness(self, dtype): - if not FLAGS.jax_enable_x64 and onp.issubdtype(dtype, onp.float64): + if not FLAGS.jax_enable_x64 and np.issubdtype(dtype, onp.float64): raise SkipTest("can't test float64 agreement") bits_dtype = onp.uint32 if onp.finfo(dtype).bits == 32 else onp.uint64 From fcf5633f95b19abacaad36898dec2d1834c4c7c8 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 30 Oct 2019 12:16:35 -0400 Subject: [PATCH 0264/1053] Fix definition of jax.numpy.divmod for floating-point types. (#1597) --- jax/numpy/lax_numpy.py | 2 +- tests/lax_numpy_test.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 2d29cf822388..bfb13df37269 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -483,7 +483,7 @@ def _float_divmod(x1, x2): div = lax.div(lax.sub(x1, mod), x2) ind = lax.bitwise_and(mod != 0, lax.sign(x2) != lax.sign(mod)) - mod = lax.select(ind, mod + x1, mod) + mod = lax.select(ind, mod + x2, mod) div = lax.select(ind, div - _constant_like(div, 1), div) return lax.round(div), mod diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 0158774b7882..fb82ec441fe8 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -160,6 +160,8 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, op_record("conjugate", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), op_record("deg2rad", 1, float_dtypes, all_shapes, jtu.rand_default(), []), op_record("divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), ["rev"]), + op_record("divmod", 2, int_dtypes + float_dtypes, all_shapes, + jtu.rand_nonzero(), []), op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], tolerance={onp.float16: 1e-2}), # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 From 89c90923db52a9a3fef87a048315b9f4c1a85bb3 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 30 Oct 2019 10:40:02 -0700 Subject: [PATCH 0265/1053] Add np.fft.ifftn (#1594) Fixes GH1010 --- jax/lax/lax.py | 2 +- jax/numpy/fft.py | 28 +++++++++++++++++++-------- tests/fft_test.py | 48 ++++++++++++++++++++++++++++------------------- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index c01bdf25cda2..d418e25cdc98 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -354,7 +354,7 @@ def convert_element_type(operand, new_dtype): if (onp.issubdtype(old_dtype, onp.complexfloating) and not onp.issubdtype(new_dtype, onp.complexfloating)): msg = "Casting complex values to real discards the imaginary part" - warnings.warn(msg, onp.ComplexWarning) + warnings.warn(msg, onp.ComplexWarning, stacklevel=2) operand = real(operand) old_dtype = _dtype(operand) return convert_element_type_p.bind( diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index 8eb9392a8f01..3bb3ce685902 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -33,13 +33,14 @@ def _promote_to_complex(arg): dtype = onp.complex64 return lax.convert_element_type(arg, dtype) -@_wraps(onp.fft.fftn) -def fftn(a, s=None, axes=None, norm=None): + +def _fft_core(func_name, fft_type, a, s, axes, norm): # TODO(skye): implement padding/cropping based on 's'. + full_name = "jax.np.fft." + func_name if s is not None: - raise NotImplementedError("jax.np.fftn only supports s=None, got %s" % s) + raise NotImplementedError("%s only supports s=None, got %s" % (full_name, s)) if norm is not None: - raise NotImplementedError("jax.np.fftn only supports norm=None, got %s" % norm) + raise NotImplementedError("%s only supports norm=None, got %s" % (full_name, norm)) if s is not None and axes is not None and len(s) != len(axes): # Same error as numpy. raise ValueError("Shape and axes have different lengths.") @@ -57,17 +58,28 @@ def fftn(a, s=None, axes=None, norm=None): if len(axes) != len(set(axes)): raise ValueError( - "jax.np.fftn does not support repeated axes. Got axes %s." % axes) + "%s does not support repeated axes. Got axes %s." % (full_name, axes)) if any(axis in range(a.ndim - 3) for axis in axes): raise ValueError( - "jax.np.fftn only supports 1D, 2D, and 3D FFTs over the innermost axes." - " Got axes %s with input rank %s." % (orig_axes, a.ndim)) + "%s only supports 1D, 2D, and 3D FFTs over the innermost axes." + " Got axes %s with input rank %s." % (full_name, orig_axes, a.ndim)) if s is None: s = [a.shape[axis] for axis in axes] a = _promote_to_complex(a) - return lax.fft(a, xla_client.FftType.FFT, s) + return lax.fft(a, fft_type, s) + + +@_wraps(onp.fft.fftn) +def fftn(a, s=None, axes=None, norm=None): + return _fft_core('fftn', xla_client.FftType.FFT, a, s, axes, norm) + + +@_wraps(onp.fft.ifftn) +def ifftn(a, s=None, axes=None, norm=None): + return _fft_core('ifftn', xla_client.FftType.IFFT, a, s, axes, norm) + for func in get_module_functions(onp.fft): if func.__name__ not in globals(): diff --git a/tests/fft_test.py b/tests/fft_test.py index 0def8713edc5..6fcf65dcb0a4 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -51,17 +51,21 @@ def _get_fftn_test_axes(shape): class FftTest(jtu.JaxTestCase): @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_shape={}_axes={}".format( - jtu.format_shape_dtype_string(shape, dtype), axes), - "axes": axes, "shape": shape, "dtype": dtype, "rng": rng} + {"testcase_name": "_inverse={}_shape={}_axes={}".format( + inverse, jtu.format_shape_dtype_string(shape, dtype), axes), + "axes": axes, "shape": shape, "dtype": dtype, "rng": rng, + "inverse": inverse} + for inverse in [False, True] for rng in [jtu.rand_default()] for dtype in all_dtypes for shape in [(10,), (10, 10), (2, 3, 4), (2, 3, 4, 5)] for axes in _get_fftn_test_axes(shape))) - def testFftn(self, shape, dtype, axes, rng): + def testFftn(self, inverse, shape, dtype, axes, rng): args_maker = lambda: (rng(shape, dtype),) - np_fn = lambda a: np.fft.fftn(a, axes=axes) - onp_fn = lambda a: onp.fft.fftn(a, axes=axes) + np_op = np.fft.ifftn if inverse else np.fft.fftn + onp_op = onp.fft.ifftn if inverse else onp.fft.fftn + np_fn = lambda a: np_op(a, axes=axes) + onp_fn = lambda a: onp_op(a, axes=axes) self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=True, tol=1e-4) self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) @@ -72,24 +76,30 @@ def testFftn(self, shape, dtype, axes, rng): jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) - def testFftnErrors(self): + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_inverse={}".format(inverse), + "inverse": inverse} + for inverse in [False, True])) + def testFftnErrors(self, inverse): rng = jtu.rand_default() - self.assertRaisesRegexp( + name = 'ifftn' if inverse else 'fftn' + func = np.fft.ifftn if inverse else np.fft.fftn + self.assertRaisesRegex( ValueError, - "jax.np.fftn only supports 1D, 2D, and 3D FFTs over the innermost axes. " - "Got axes None with input rank 4.", - lambda: np.fft.fftn(rng([2, 3, 4, 5], dtype=onp.float64), axes=None)) - self.assertRaisesRegexp( + "jax.np.fft.{} only supports 1D, 2D, and 3D FFTs over the innermost axes. " + "Got axes None with input rank 4.".format(name), + lambda: func(rng([2, 3, 4, 5], dtype=onp.float64), axes=None)) + self.assertRaisesRegex( ValueError, - "jax.np.fftn only supports 1D, 2D, and 3D FFTs over the innermost axes. " - "Got axes \[0\] with input rank 4.", - lambda: np.fft.fftn(rng([2, 3, 4, 5], dtype=onp.float64), axes=[0])) - self.assertRaisesRegexp( + "jax.np.fft.{} only supports 1D, 2D, and 3D FFTs over the innermost axes. " + "Got axes \\[0\\] with input rank 4.".format(name), + lambda: func(rng([2, 3, 4, 5], dtype=onp.float64), axes=[0])) + self.assertRaisesRegex( ValueError, - "jax.np.fftn does not support repeated axes. Got axes \[1, 1\].", - lambda: np.fft.fftn(rng([2, 3], dtype=onp.float64), axes=[1, 1])) + "jax.np.fft.{} does not support repeated axes. Got axes \\[1, 1\\].".format(name), + lambda: func(rng([2, 3], dtype=onp.float64), axes=[1, 1])) self.assertRaises( - IndexError, lambda: np.fft.fftn(rng([2, 3], dtype=onp.float64), axes=[2])) + IndexError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[2])) if __name__ == "__main__": From 97944a4050ea7592c8a07843f317b58650430b9a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 30 Oct 2019 13:41:53 -0400 Subject: [PATCH 0266/1053] Use log1p in definition of logaddexp2 to match logaddexp. (#1599) --- jax/numpy/lax_numpy.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index bfb13df37269..6e1689f458e2 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -524,9 +524,8 @@ def logaddexp2(x1, x2): x1, x2 = _promote_shapes("logaddexp2", *_promote_to_result_dtype(onp.logaddexp2, x1, x2)) amax = lax.max(x1, x2) - return lax.add(amax, log2(lax.add(exp2(lax.sub(x1, amax)), - exp2(lax.sub(x2, amax))))) - + return lax.add(amax, lax.div(lax.log1p(exp2(-lax.abs(lax.sub(x1, x2)))), + _constant_like(x1, onp.log(2)))) @_wraps(onp.log2) def log2(x): From 57acdfe914d35d640e1b6b71abb37ea095c80af7 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 30 Oct 2019 14:47:11 -0400 Subject: [PATCH 0267/1053] Disable LaxControlFlowTest.test_custom_root_with_custom_linear_solve. (#1601) --- tests/lax_control_flow_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 5141672f2dde..b5f185aa5c9e 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1129,6 +1129,10 @@ def linear_solve(a, b): def test_custom_root_with_custom_linear_solve(self): + # TODO(shoyer): Figure out why this fails and re-enable it. + if jtu.device_under_test() == "tpu": + raise SkipTest("Test fails on TPU") + def linear_solve(a, b): f = lambda x: np.dot(a, x) - b factors = jsp.linalg.cho_factor(a) From affa2dcca415a0c766e4df945179ce555bde8bb5 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 30 Oct 2019 15:50:00 -0400 Subject: [PATCH 0268/1053] Increment jax and jaxlib versions. (#1603) * Update XLA version to https://github.com/tensorflow/tensorflow/commit/7acd3bb9d794e279c6d824f5553fee2703c16f35 * Remove XRT reference from jaxlib build. --- WORKSPACE | 6 +++--- build/install_xla_in_source_tree.sh | 6 ------ jax/version.py | 2 +- jaxlib/version.py | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba534587a7d6..9d194a1b3da3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "147dc4fdad3f8dda7498838482b21a0ea7a0ab73ada3056e2ddf21213c88849d", - strip_prefix = "tensorflow-f616f0662c1703b31e78630fd4cfe638adb2642c", + sha256 = "5c7963c7446157f82eb37eb3b78fce46c236ba80943d0e4596bb1f1aea2a51af", + strip_prefix = "tensorflow-7acd3bb9d794e279c6d824f5553fee2703c16f35", urls = [ - "https://github.com/tensorflow/tensorflow/archive/f616f0662c1703b31e78630fd4cfe638adb2642c.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/7acd3bb9d794e279c6d824f5553fee2703c16f35.tar.gz", ], ) diff --git a/build/install_xla_in_source_tree.sh b/build/install_xla_in_source_tree.sh index 75edea3e6ded..32d922b560d7 100755 --- a/build/install_xla_in_source_tree.sh +++ b/build/install_xla_in_source_tree.sh @@ -67,9 +67,3 @@ sed \ -e 's/from tensorflow.compiler.xla.python.xla_extension import ops/from .xla_extension import ops/' \ < "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/xla_client.py)" \ > "${TARGET}/jaxlib/xla_client.py" -sed \ - -e 's/from tensorflow.compiler.xla.python import xla_client/from . import xla_client/' \ - -e 's/from tensorflow.compiler.xla.python import xla_extension as _xla/from . import xla_extension as _xla/' \ - < "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/xrt.py)" \ - > "${TARGET}/jaxlib/xrt.py" - diff --git a/jax/version.py b/jax/version.py index 282252524cf8..ceb382a1a120 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.48" +__version__ = "0.1.49" diff --git a/jaxlib/version.py b/jaxlib/version.py index 87aed6c83ea4..972a3cedf17d 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.31" +__version__ = "0.1.32" From f5079a6281ec637a55f021cdfeffd48db7c3d471 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 28 Oct 2019 14:03:52 -0700 Subject: [PATCH 0269/1053] improve vmap docstring and tree prefix errors fixes #795 --- jax/api.py | 77 ++++++++++++++++++++++++++++++++++++++--------- tests/api_test.py | 6 ++++ 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/jax/api.py b/jax/api.py index 75c6170bf9be..90647c578d17 100644 --- a/jax/api.py +++ b/jax/api.py @@ -565,21 +565,28 @@ def vmap(fun, in_axes=0, out_axes=0): Args: fun: Function to be mapped over additional axes. - in_axes: Specifies which input axes to map over. Normally this is a tuple with - one axes specification for each function argument. An integer is interpreted - as a tuple with the same value for all arguments. One argument axes specification - can be an integer (0 means first dimension), None (means that the dimension is - broadcasted). If the argument is a tuple of values, then the axes specification - can be a matching tuple as well. - - out_axes: Specifies which output axes to map over. These may be integers, - `None`, or (possibly nested) tuples of integers or `None`. + in_axes: A nonnegative integer, None, or (nested) standard Python container + (tuple/list/dict) thereof specifying which input array axes to map over. + If each positional argument to ``fun`` is an array, then ``in_axes`` can + be a nonnegative integer, a None, or a tuple of integers and Nones with + length equal to the number of positional arguments to ``fun``. An integer + or None indicates which array axis to map over for all arguments (with + None indicating not to map any axis), and a tuple indicates which axis to + map for each corresponding positional argument. More generally, if the + positinal arguments to ``fun`` are container types, the corresponding + element of ``in_axes`` can itself be a matching container, so that + distinct array axes can be mapped for different container elements. The + constraint is that ``in_axes`` must be a container tree prefix of the + positional argument tuple passed to ``fun``. + out_axes: A nonnegative integer, None, or (nested) standard Python container + (tuple/list/dict) thereof indicating where the mapped axis should appear + in the output. Returns: - Batched/vectorized version of `fun` with arguments that correspond to those - of `fun`, but with extra array axes at positions indicated by `in_axes`, and - a return value that corresponds to that of `fun`, but with extra array axes - at positions indicated by `out_axes`. + Batched/vectorized version of ``fun`` with arguments that correspond to + those of ``fun``, but with extra array axes at positions indicated by + ``in_axes``, and a return value that corresponds to that of ``fun``, but + with extra array axes at positions indicated by ``out_axes``. For example, we can implement a matrix-matrix product using a vector dot product: @@ -588,12 +595,47 @@ def vmap(fun, in_axes=0, out_axes=0): >>> mv = vmap(vv, (0, None), 0) # ([b,a], [a]) -> [b] (b is the mapped axis) >>> mm = vmap(mv, (None, 1), 1) # ([b,a], [a,c]) -> [b,c] (c is the mapped axis) - Here we use `[a,b]` to indicate an array with shape (a,b). Here are some + Here we use ``[a,b]`` to indicate an array with shape (a,b). Here are some variants: >>> mv1 = vmap(vv, (0, 0), 0) # ([b,a], [b,a]) -> [b] (b is the mapped axis) >>> mv2 = vmap(vv, (0, 1), 0) # ([b,a], [a,b]) -> [b] (b is the mapped axis) >>> mm2 = vmap(mv2, (1, 1), 0) # ([b,c,a], [a,c,b]) -> [c,b] (c is the mapped axis) + + Here's an example of using container types in ``in_axes`` to specify which + axes of the container elements to map over: + + >>> A, B, C, D = 2, 3, 4, 5 + >>> x = np.ones((A, B)) + >>> y = np.ones((B, C)) + >>> z = np.ones((C, D)) + >>> def foo(tree_arg): + ... x, (y, z) = tree_arg + ... return np.dot(x, np.dot(y, z)) + >>> tree = (x, (y, z)) + >>> print(foo(tree)) + [[12. 12. 12. 12. 12.] + [12. 12. 12. 12. 12.]] + >>> from jax import vmap + >>> K = 6 # batch size + >>> x = np.ones((K, A, B)) # batch axis in different locations + >>> y = np.ones((B, K, C)) + >>> z = np.ones((C, D, K)) + >>> tree = (x, (y, z)) + >>> vfoo = vmap(foo, in_axes=((0, (1, 2)),)) + >>> print(vfoo(tree)) + [[[12. 12. 12. 12. 12.] + [12. 12. 12. 12. 12.]] + [[12. 12. 12. 12. 12.] + [12. 12. 12. 12. 12.]] + [[12. 12. 12. 12. 12.] + [12. 12. 12. 12. 12.]] + [[12. 12. 12. 12. 12.] + [12. 12. 12. 12. 12.]] + [[12. 12. 12. 12. 12.] + [12. 12. 12. 12. 12.]] + [[12. 12. 12. 12. 12.] + [12. 12. 12. 12. 12.]]] """ docstr = ("Vectorized version of {fun}. Takes similar arguments as {fun} " "but with additional array axes over which {fun} is mapped.") @@ -620,7 +662,12 @@ def _flatten_axes(treedef, axis_tree): dummy = tree_unflatten(treedef, [object()] * treedef.num_leaves) axes = [] add_leaves = lambda i, x: axes.extend([i] * len(tree_flatten(x)[0])) - tree_multimap(add_leaves, _replace_nones(axis_tree), dummy) + try: + tree_multimap(add_leaves, _replace_nones(axis_tree), dummy) + except ValueError: + msg = ("axes specification must be a tree prefix of the corresponding " + "value, got specification {} for value {}.") + raise ValueError(msg.format(axis_tree, treedef)) axes = [None if a is _none_proxy else a for a in axes] return axes diff --git a/tests/api_test.py b/tests/api_test.py index ed61d672c96d..53937ac62da0 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1093,6 +1093,12 @@ def vjp(x_tangent): b = np.dot(a + np.eye(a.shape[0]), real_x) print(gf(a, b)) # doesn't crash + def test_vmap_in_axes_tree_prefix_error(self): + # https://github.com/google/jax/issues/795 + jtu.check_raises_regexp( + lambda: api.vmap(lambda x: x, in_axes=(0, 0))(np.ones(3)), + ValueError, "axes specification must be a tree prefix") + if __name__ == '__main__': absltest.main() From cbadfd41cecc59c499bfbe8b86c7dcc2ad279255 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 28 Oct 2019 15:20:49 -0700 Subject: [PATCH 0270/1053] allow unmapped vmap args to be arbitrary objects fixes #183 --- jax/interpreters/batching.py | 3 ++- tests/api_test.py | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index d2848bfe6cab..d782b1387141 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -52,7 +52,8 @@ def batch_fun(fun, in_vals, in_dims): @transformation_with_aux def batch_subtrace(master, in_dims, *in_vals): trace = BatchTrace(master, core.cur_sublevel()) - in_tracers = map(partial(BatchTracer, trace), in_vals, in_dims) + in_tracers = [BatchTracer(trace, val, dim) if dim is not None else val + for val, dim in zip(in_vals, in_dims)] outs = yield in_tracers, {} out_tracers = map(trace.full_raise, outs) out_vals, out_dims = unzip2((t.val, t.batch_dim) for t in out_tracers) diff --git a/tests/api_test.py b/tests/api_test.py index 53937ac62da0..68b4f33cd814 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1099,6 +1099,13 @@ def test_vmap_in_axes_tree_prefix_error(self): lambda: api.vmap(lambda x: x, in_axes=(0, 0))(np.ones(3)), ValueError, "axes specification must be a tree prefix") + def test_vmap_objects_issue_183(self): + # https://github.com/google/jax/issues/183 + fun = lambda f, x: f(x) + vfun = api.vmap(fun, (None, 0)) + ans = vfun(lambda x: x + 1, np.arange(3)) + self.assertAllClose(ans, onp.arange(1, 4), check_dtypes=False) + if __name__ == '__main__': absltest.main() From 39daf07de340bcfb021571b25a9451db31887bfa Mon Sep 17 00:00:00 2001 From: Stephen Tu Date: Wed, 30 Oct 2019 19:29:56 -0700 Subject: [PATCH 0271/1053] Add trivial implementations of eigvals/eigvalsh (#1604) * Add trivial implementations of eigvals/eigvalsh The implementations simply delegate to eig/eigh. * Enable eigvalsh test on TPU/GPU --- jax/numpy/linalg.py | 12 ++++++++++++ tests/linalg_test.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 5fa2d971a05e..c719a3ae8c8b 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -109,6 +109,12 @@ def eig(a): return w, vr +@_wraps(onp.linalg.eigvals) +def eigvals(a): + w, _ = eig(a) + return w + + @_wraps(onp.linalg.eigh) def eigh(a, UPLO=None, symmetrize_input=True): if UPLO is None or UPLO == "L": @@ -124,6 +130,12 @@ def eigh(a, UPLO=None, symmetrize_input=True): return w, v +@_wraps(onp.linalg.eigvalsh) +def eigvalsh(a, UPLO='L'): + w, _ = eigh(a, UPLO) + return w + + @_wraps(onp.linalg.inv) def inv(a): if np.ndim(a) < 2 or a.shape[-1] != a.shape[-2]: diff --git a/tests/linalg_test.py b/tests/linalg_test.py index a5cdd8b52893..072879af779c 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -166,6 +166,25 @@ def norm(x): self._CompileAndCheck(partial(np.linalg.eig), args_maker, check_dtypes=True, rtol=1e-3) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng": rng} + for shape in [(4, 4), (5, 5), (50, 50)] + for dtype in float_types + complex_types + for rng in [jtu.rand_default()])) + # TODO: enable when there is an eigendecomposition implementation + # for GPU/TPU. + @jtu.skip_on_devices("gpu", "tpu") + def testEigvals(self, shape, dtype, rng): + _skip_if_unsupported_type(dtype) + n = shape[-1] + args_maker = lambda: [rng(shape, dtype)] + a, = args_maker() + w1, _ = np.linalg.eig(a) + w2 = np.linalg.eigvals(a) + self.assertAllClose(w1, w2, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), @@ -217,6 +236,23 @@ def norm(x): self._CompileAndCheck(partial(np.linalg.eigh, UPLO=uplo), args_maker, check_dtypes=True, rtol=1e-3) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng": rng} + for shape in [(4, 4), (5, 5), (50, 50)] + for dtype in float_types + complex_types + for rng in [jtu.rand_default()])) + def testEigvalsh(self, shape, dtype, rng): + _skip_if_unsupported_type(dtype) + n = shape[-1] + def args_maker(): + a = rng((n, n), dtype) + a = (a + onp.conj(a.T)) / 2 + return [a] + self._CheckAgainstNumpy(onp.linalg.eigvalsh, np.linalg.eigvalsh, args_maker, + check_dtypes=True, tol=1e-3) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_lower={}".format(jtu.format_shape_dtype_string(shape, dtype), From 5858983fb11cd733955c62dec0e572dd2c9121b5 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 30 Oct 2019 22:56:46 -0400 Subject: [PATCH 0272/1053] Update XLA. (#1607) Includes bfloat16 and Python 3.8 fixes. --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d194a1b3da3..6465e89e9f64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "5c7963c7446157f82eb37eb3b78fce46c236ba80943d0e4596bb1f1aea2a51af", - strip_prefix = "tensorflow-7acd3bb9d794e279c6d824f5553fee2703c16f35", + sha256 = "ea53db536d69c8dcd7385a412cacc0a17edfa4d56ec7a4e27be8e1ad27492604", + strip_prefix = "tensorflow-0f08466d733a81db6c3e9504563bcde56ee944f6", urls = [ - "https://github.com/tensorflow/tensorflow/archive/7acd3bb9d794e279c6d824f5553fee2703c16f35.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/0f08466d733a81db6c3e9504563bcde56ee944f6.tar.gz", ], ) From cba5f229ba77835589eca05071a5f16d18cf5e5d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 31 Oct 2019 08:28:51 -0400 Subject: [PATCH 0273/1053] Update XLA to fix CUDA build failure. (#1609) --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6465e89e9f64..fe7f437b2ff6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "ea53db536d69c8dcd7385a412cacc0a17edfa4d56ec7a4e27be8e1ad27492604", - strip_prefix = "tensorflow-0f08466d733a81db6c3e9504563bcde56ee944f6", + sha256 = "41c49187d4811f0f0e342d6bb7062fb481dcd166b12f7b2f2cd2ced4701a7a07", + strip_prefix = "tensorflow-14bf5cd678293e8461cbfff48b9745d8c69ce957", urls = [ - "https://github.com/tensorflow/tensorflow/archive/0f08466d733a81db6c3e9504563bcde56ee944f6.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/14bf5cd678293e8461cbfff48b9745d8c69ce957.tar.gz", ], ) From 33e5d07304f34c816b9bb80b16371f5116343a4b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 31 Oct 2019 10:12:37 -0400 Subject: [PATCH 0274/1053] Update XLA to fix another CUDA build problem. (#1610) --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe7f437b2ff6..cab0b28a0380 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "41c49187d4811f0f0e342d6bb7062fb481dcd166b12f7b2f2cd2ced4701a7a07", - strip_prefix = "tensorflow-14bf5cd678293e8461cbfff48b9745d8c69ce957", + sha256 = "508eb48faee23f318ab18075af522527074fc67780ac8ff127d21a5a5d1a71cf", + strip_prefix = "tensorflow-d325350fe6db8ef2dda9d94e1551b831980d1115", urls = [ - "https://github.com/tensorflow/tensorflow/archive/14bf5cd678293e8461cbfff48b9745d8c69ce957.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/d325350fe6db8ef2dda9d94e1551b831980d1115.tar.gz", ], ) From b3e4a1a8501fcedde190a19d6f21625ae15e2314 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 31 Oct 2019 11:46:37 -0400 Subject: [PATCH 0275/1053] Update jaxlib build scripts to build Python 3.8.0 wheels. (#1612) --- build/Dockerfile | 16 +++++++++++----- build/build_jaxlib_wheels.sh | 2 +- build/build_jaxlib_wheels_macos.sh | 19 ++++++++++++------- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 1b21ff9e503f..cf4d8ff2cca6 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -2,18 +2,24 @@ FROM gcr.io/tensorflow-testing/nosla-cuda10.0-cudnn7-ubuntu16.04-manylinux2010 LABEL maintainer "Matt Johnson " WORKDIR / -RUN git clone https://github.com/pyenv/pyenv.git /pyenv +RUN git clone --branch v1.2.14 https://github.com/pyenv/pyenv.git /pyenv ENV PYENV_ROOT /pyenv RUN /pyenv/bin/pyenv install 2.7.15 RUN /pyenv/bin/pyenv install 3.5.6 RUN /pyenv/bin/pyenv install 3.6.8 RUN /pyenv/bin/pyenv install 3.7.2 +RUN /pyenv/bin/pyenv install 3.8.0 + +# Install build-dependencies of scipy. +# TODO(phawkins): remove when there are scipy wheels for Python 3.8. +RUN apt-get update && apt-get install -y libopenblas-dev gfortran # We pin numpy to a version < 1.16 to avoid version compatibility issues. -RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 2.7.15 && pip install numpy==1.15.4 scipy cython setuptools wheel future -RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.5.6 && pip install numpy==1.15.4 scipy cython setuptools wheel -RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.6.8 && pip install numpy==1.15.4 scipy cython setuptools wheel -RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.7.2 && pip install numpy==1.15.4 scipy cython setuptools wheel +RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 2.7.15 && pip install numpy==1.15.4 scipy cython setuptools wheel future six +RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.5.6 && pip install numpy==1.15.4 scipy cython setuptools wheel six +RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.6.8 && pip install numpy==1.15.4 scipy cython setuptools wheel six +RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.7.2 && pip install numpy==1.15.4 scipy cython setuptools wheel six +RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.8.0 && pip install numpy==1.17.3 scipy cython setuptools wheel six # Change the CUDA version if it doesn't match the installed version. ARG JAX_CUDA_VERSION=10.0 diff --git a/build/build_jaxlib_wheels.sh b/build/build_jaxlib_wheels.sh index 52e0eef7e85e..846efde70d75 100755 --- a/build/build_jaxlib_wheels.sh +++ b/build/build_jaxlib_wheels.sh @@ -1,7 +1,7 @@ #!/bin/bash set -xev -PYTHON_VERSIONS="2.7.15 3.5.6 3.6.8 3.7.2" +PYTHON_VERSIONS="2.7.15 3.5.6 3.6.8 3.7.2 3.8.0" CUDA_VERSIONS="9.0 9.2 10.0 10.1" CUDA_VARIANTS="cuda" # "cuda-included" diff --git a/build/build_jaxlib_wheels_macos.sh b/build/build_jaxlib_wheels_macos.sh index 6d1ef9641fbb..cc59c74132bd 100755 --- a/build/build_jaxlib_wheels_macos.sh +++ b/build/build_jaxlib_wheels_macos.sh @@ -19,15 +19,19 @@ PLATFORM_TAG="macosx_10_9_x86_64" build_jax () { PY_VERSION="$1" PY_TAG="$2" + NUMPY_VERSION="$3" + SCIPY_VERSION="$4" echo "\nBuilding JAX for Python ${PY_VERSION}, tag ${PY_TAG}" + echo "NumPy version ${NUMPY_VERSION}, SciPy version ${SCIPY_VERSION}" pyenv install -s "${PY_VERSION}" VENV="jax-build-${PY_VERSION}" pyenv virtualenv-delete -f "${VENV}" pyenv virtualenv "${PY_VERSION}" "${VENV}" pyenv activate "${VENV}" - # We pin the Numpy wheel to a version < 1.16.0, because Numpy extensions built - # at 1.16.0 are not backward compatible to earlier Numpy versions. - pip install numpy==1.15.4 scipy==1.2.0 wheel future + # We pin the Numpy wheel to a version < 1.16.0 for Python releases prior to + # 3.8, because Numpy extensions built at 1.16.0 are not backward compatible to + # earlier Numpy versions. + pip install numpy==$NUMPY_VERSION scipy==$SCIPY_VERSION wheel future six rm -fr build/build python build/build.py cd build @@ -39,7 +43,8 @@ build_jax () { rm -fr build/dist -build_jax 2.7.15 cp27 -build_jax 3.5.6 cp35 -build_jax 3.6.8 cp36 -build_jax 3.7.2 cp37 +build_jax 2.7.15 cp27 1.15.4 1.2.0 +build_jax 3.5.6 cp35 1.15.4 1.2.0 +build_jax 3.6.8 cp36 1.15.4 1.2.0 +build_jax 3.7.2 cp37 1.15.4 1.2.0 +build_jax 3.8.0 cp38 1.17.3 1.3.1 From eae47b2330b445d07a79fb2173084d3f13d59ebb Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 30 Oct 2019 17:31:37 -0700 Subject: [PATCH 0276/1053] improve vmap error messages fixes #705 --- jax/api.py | 33 ++++++++++++++++++++++++++++++++- jax/interpreters/batching.py | 6 +++--- tests/api_test.py | 23 +++++++++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/jax/api.py b/jax/api.py index 90647c578d17..853612219385 100644 --- a/jax/api.py +++ b/jax/api.py @@ -647,12 +647,43 @@ def vmap(fun, in_axes=0, out_axes=0): "or a (nested) tuple of those types, got {} and {} respectively.") raise TypeError(msg.format(type(in_axes), type(out_axes))) + def _check_axis_sizes(tree, vals, dims): + try: + sizes, = {x.shape[d] for x, d in zip(vals, dims) if d is not None} + except ValueError: + msg = "vmap got inconsistent sizes for array axes to be mapped:\n{}" + # we switch the error message based on whether args is a tuple of arrays, + # in which case we can produce an error message based on argument indices, + # or if it has nested containers. + # TODO(mattjj,phawkins): add a way to inspect pytree kind more directly + if tree == tree_flatten((core.unit,) * tree.num_leaves)[1]: + lines1 = ["arg {} has shape {} and axis {} is to be mapped" + .format(i, x.shape, d) for i, (x, d) in enumerate(zip(vals, dims))] + sizes = collections.defaultdict(list) + for i, (x, d) in enumerate(zip(vals, dims)): + if d is not None: + sizes[x.shape[d]].append(i) + lines2 = ["{} {} {} {} to be mapped of size {}".format( + "args" if len(idxs) > 1 else "arg", + ", ".join(map(str, idxs)), + "have" if len(idxs) > 1 else "has", + "axes" if len(idxs) > 1 else "an axis", + size) + for size, idxs in sizes.items()] + raise ValueError(msg.format("\n".join(lines1 + ["so"] + lines2))) + else: + sizes = [x.shape[d] if d is not None else None for x, d in zip(vals, dims)] + sizes = tree_unflatten(tree, sizes) + raise ValueError(msg.format("the tree of axis sizes is:\n{}".format(sizes))) + @wraps(fun, docstr=docstr) def batched_fun(*args): args_flat, in_tree = tree_flatten(args) f = lu.wrap_init(fun) flat_fun, out_tree = flatten_fun_nokwargs(f, in_tree) - out_flat = batching.batch(flat_fun, args_flat, _flatten_axes(in_tree, in_axes), + in_axes_flat = _flatten_axes(in_tree, in_axes) + _check_axis_sizes(in_tree, args_flat, in_axes_flat) + out_flat = batching.batch(flat_fun, args_flat, in_axes_flat, lambda: _flatten_axes(out_tree(), out_axes)) return tree_unflatten(out_tree(), out_flat) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index d782b1387141..05fa06a76484 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -38,8 +38,8 @@ def batch(fun, in_vals, in_dims, out_dim_dests): - out_vals, out_dims = batch_fun(fun, in_vals, in_dims) size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} + out_vals, out_dims = batch_fun(fun, in_vals, in_dims) return map(partial(matchaxis, size), out_dims, out_dim_dests(), out_vals) def batch_fun(fun, in_vals, in_dims): @@ -163,8 +163,8 @@ def get_primitive_batcher(p): try: return primitive_batchers[p] except KeyError: - raise NotImplementedError( - "Batching rule for '{}' not implemented".format(p)) + msg = "Batching rule for '{}' not implemented" + raise NotImplementedError(msg.format(p)) def defvectorized(prim): primitive_batchers[prim] = partial(vectorized_batcher, prim) diff --git a/tests/api_test.py b/tests/api_test.py index 68b4f33cd814..67e0f7fe7e11 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1106,6 +1106,29 @@ def test_vmap_objects_issue_183(self): ans = vfun(lambda x: x + 1, np.arange(3)) self.assertAllClose(ans, onp.arange(1, 4), check_dtypes=False) + def test_vmap_error_message_issue_705(self): + # https://github.com/google/jax/issues/705 + def h(a, b): + return np.sum(a) + np.sum(b) + + X = onp.random.randn(10, 4) + U = onp.random.randn(10, 2) + self.assertRaisesRegex( + ValueError, + "vmap got inconsistent sizes for array axes to be mapped:\n" + "arg 0 has shape \(10, 4\) and axis 0 is to be mapped\n" + "arg 1 has shape \(10, 2\) and axis 1 is to be mapped\n" + "so\n" + "arg 0 has an axis to be mapped of size 10\n" + "arg 1 has an axis to be mapped of size 2", + lambda: api.vmap(h, in_axes=(0, 1))(X, U)) + + self.assertRaisesRegex( + ValueError, + "vmap got inconsistent sizes for array axes to be mapped:\n" + "the tree of axis sizes is:\n", + lambda: api.vmap(h, in_axes=(0, 1))(X, [U, U])) + if __name__ == '__main__': absltest.main() From 9d94c423232d9e8c7305d56f399f60332f31537e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 11:22:23 -0700 Subject: [PATCH 0277/1053] Update jax/api.py Co-Authored-By: Stephan Hoyer --- jax/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index 853612219385..78e147ddca46 100644 --- a/jax/api.py +++ b/jax/api.py @@ -573,7 +573,7 @@ def vmap(fun, in_axes=0, out_axes=0): or None indicates which array axis to map over for all arguments (with None indicating not to map any axis), and a tuple indicates which axis to map for each corresponding positional argument. More generally, if the - positinal arguments to ``fun`` are container types, the corresponding + positional arguments to ``fun`` are container types, the corresponding element of ``in_axes`` can itself be a matching container, so that distinct array axes can be mapped for different container elements. The constraint is that ``in_axes`` must be a container tree prefix of the From 14acca7b519b3b7da89c563aee76b44254a78c42 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 11:57:37 -0700 Subject: [PATCH 0278/1053] address reviewer comments, fix test error --- jax/api.py | 29 +++++++++-------------------- tests/api_test.py | 7 ++++--- tests/batching_test.py | 10 ++++++---- 3 files changed, 19 insertions(+), 27 deletions(-) diff --git a/jax/api.py b/jax/api.py index 853612219385..34bae82fc32f 100644 --- a/jax/api.py +++ b/jax/api.py @@ -572,12 +572,11 @@ def vmap(fun, in_axes=0, out_axes=0): length equal to the number of positional arguments to ``fun``. An integer or None indicates which array axis to map over for all arguments (with None indicating not to map any axis), and a tuple indicates which axis to - map for each corresponding positional argument. More generally, if the - positinal arguments to ``fun`` are container types, the corresponding - element of ``in_axes`` can itself be a matching container, so that - distinct array axes can be mapped for different container elements. The - constraint is that ``in_axes`` must be a container tree prefix of the - positional argument tuple passed to ``fun``. + map for each corresponding positional argument. If the positinal arguments + to ``fun`` are container types, the corresponding element of ``in_axes`` + can itself be a matching container, so that distinct array axes can be + mapped for different container elements. ``in_axes`` must be a container + tree prefix of the positional argument tuple passed to ``fun``. out_axes: A nonnegative integer, None, or (nested) standard Python container (tuple/list/dict) thereof indicating where the mapped axis should appear in the output. @@ -623,19 +622,8 @@ def vmap(fun, in_axes=0, out_axes=0): >>> z = np.ones((C, D, K)) >>> tree = (x, (y, z)) >>> vfoo = vmap(foo, in_axes=((0, (1, 2)),)) - >>> print(vfoo(tree)) - [[[12. 12. 12. 12. 12.] - [12. 12. 12. 12. 12.]] - [[12. 12. 12. 12. 12.] - [12. 12. 12. 12. 12.]] - [[12. 12. 12. 12. 12.] - [12. 12. 12. 12. 12.]] - [[12. 12. 12. 12. 12.] - [12. 12. 12. 12. 12.]] - [[12. 12. 12. 12. 12.] - [12. 12. 12. 12. 12.]] - [[12. 12. 12. 12. 12.] - [12. 12. 12. 12. 12.]]] + >>> print(vfoo(tree)).shape + (6, 2, 5) """ docstr = ("Vectorized version of {fun}. Takes similar arguments as {fun} " "but with additional array axes over which {fun} is mapped.") @@ -648,8 +636,9 @@ def vmap(fun, in_axes=0, out_axes=0): raise TypeError(msg.format(type(in_axes), type(out_axes))) def _check_axis_sizes(tree, vals, dims): + mapped_axis_sizes = {x.shape[d] for x, d in zip(vals, dims) if d is not None} try: - sizes, = {x.shape[d] for x, d in zip(vals, dims) if d is not None} + sizes, = mapped_axis_sizes except ValueError: msg = "vmap got inconsistent sizes for array axes to be mapped:\n{}" # we switch the error message based on whether args is a tuple of arrays, diff --git a/tests/api_test.py b/tests/api_test.py index 67e0f7fe7e11..05b758cfeaae 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1099,14 +1099,14 @@ def test_vmap_in_axes_tree_prefix_error(self): lambda: api.vmap(lambda x: x, in_axes=(0, 0))(np.ones(3)), ValueError, "axes specification must be a tree prefix") - def test_vmap_objects_issue_183(self): + def test_vmap_unbatched_object_passthrough_issue_183(self): # https://github.com/google/jax/issues/183 fun = lambda f, x: f(x) vfun = api.vmap(fun, (None, 0)) ans = vfun(lambda x: x + 1, np.arange(3)) self.assertAllClose(ans, onp.arange(1, 4), check_dtypes=False) - def test_vmap_error_message_issue_705(self): + def test_vmap_mismatched_axis_sizes_error_message_issue_705(self): # https://github.com/google/jax/issues/705 def h(a, b): return np.sum(a) + np.sum(b) @@ -1126,7 +1126,8 @@ def h(a, b): self.assertRaisesRegex( ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" - "the tree of axis sizes is:\n", + "the tree of axis sizes is:\n" + "\(10, \[2, 2\]\)", lambda: api.vmap(h, in_axes=(0, 1))(X, [U, U])) diff --git a/tests/batching_test.py b/tests/batching_test.py index 95cc49df3158..41d9446c9837 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -369,20 +369,22 @@ def fun(x, t): def testDynamicSlice(self): # test dynamic_slice via numpy indexing syntax - x = onp.arange(30).reshape((10, 3)) + # see https://github.com/google/jax/issues/1613 for an explanation of why we + # need to use np rather than onp to create x and idx + x = np.arange(30).reshape((10, 3)) ans = vmap(lambda x, i: x[i], in_axes=(0, None))(x, 1) expected = x[:, 1] self.assertAllClose(ans, expected, check_dtypes=False) - idx = onp.array([0, 1, 2, 1, 0] * 2) + idx = np.array([0, 1, 2, 1, 0] * 2) ans = vmap(lambda x, i: x[i], in_axes=(0, 0))(x, idx) expected = x[onp.arange(10), idx] self.assertAllClose(ans, expected, check_dtypes=False) - x = onp.arange(3) - idx = onp.array([0, 1, 2, 1, 0] * 2) + x = np.arange(3) + idx = np.array([0, 1, 2, 1, 0] * 2) ans = vmap(lambda x, i: x[i], in_axes=(None, 0))(x, idx) expected = x[idx] self.assertAllClose(ans, expected, check_dtypes=False) From 8aec519cac26da37c02b4e84f2f0c5a69ab14722 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 12:01:37 -0700 Subject: [PATCH 0279/1053] fix error --- tests/api_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/api_test.py b/tests/api_test.py index 05b758cfeaae..7934a64b19c2 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1116,8 +1116,8 @@ def h(a, b): self.assertRaisesRegex( ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" - "arg 0 has shape \(10, 4\) and axis 0 is to be mapped\n" - "arg 1 has shape \(10, 2\) and axis 1 is to be mapped\n" + r"arg 0 has shape \(10, 4\) and axis 0 is to be mapped" "\n" + r"arg 1 has shape \(10, 2\) and axis 1 is to be mapped" "\n" "so\n" "arg 0 has an axis to be mapped of size 10\n" "arg 1 has an axis to be mapped of size 2", @@ -1127,7 +1127,7 @@ def h(a, b): ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" "the tree of axis sizes is:\n" - "\(10, \[2, 2\]\)", + r"\(10, \[2, 2\]\)", lambda: api.vmap(h, in_axes=(0, 1))(X, [U, U])) From 213b899ef18e3426d421327acadc523609f39fee Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 13:04:12 -0700 Subject: [PATCH 0280/1053] check full error message --- tests/api_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/api_test.py b/tests/api_test.py index 7934a64b19c2..5396ea9eabe9 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1097,7 +1097,11 @@ def test_vmap_in_axes_tree_prefix_error(self): # https://github.com/google/jax/issues/795 jtu.check_raises_regexp( lambda: api.vmap(lambda x: x, in_axes=(0, 0))(np.ones(3)), - ValueError, "axes specification must be a tree prefix") + ValueError, + "axes specification must be a tree prefix of the corresponding " + r"value, got specification \(0, 0\) for value " + r"PyTreeDef\(tuple, \[\*\]\)." + ) def test_vmap_unbatched_object_passthrough_issue_183(self): # https://github.com/google/jax/issues/183 From d09571ebceb8f6a04830a497727768260ddd0bb6 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 13:20:32 -0700 Subject: [PATCH 0281/1053] add test case per reviewer comment --- tests/api_test.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/api_test.py b/tests/api_test.py index 5396ea9eabe9..9b0d04eb240e 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1117,6 +1117,7 @@ def h(a, b): X = onp.random.randn(10, 4) U = onp.random.randn(10, 2) + self.assertRaisesRegex( ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" @@ -1127,6 +1128,17 @@ def h(a, b): "arg 1 has an axis to be mapped of size 2", lambda: api.vmap(h, in_axes=(0, 1))(X, U)) + self.assertRaisesRegex( + ValueError, + "vmap got inconsistent sizes for array axes to be mapped:\n" + r"arg 0 has shape \(10, 4\) and axis 0 is to be mapped" "\n" + r"arg 1 has shape \(10, 2\) and axis 1 is to be mapped" "\n" + r"arg 2 has shape \(10, 4\) and axis 0 is to be mapped" "\n" + "so\n" + "args 0, 2 have axes to be mapped of size 10\n" + "arg 1 has an axis to be mapped of size 2", + lambda: api.vmap(lambda x, y, z: None, in_axes=(0, 1, 0))(X, U, X)) + self.assertRaisesRegex( ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" From 40f65fa66225d3b6a9ffa0fb9b9a5709f90b0e47 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 31 Oct 2019 13:35:46 -0700 Subject: [PATCH 0282/1053] Reimplemented fixpoint computation for scan. With James's help I tried to understand the purpose of the fixpoint computations for scan and while. If I understand this correctly, the fixpoint is monotonic and is guaranteed to terminate without the suspicious-looking up-to-1000 iterations. --- jax/lax/lax_control_flow.py | 40 +++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 511e0e8d3b18..daadc051343e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -243,8 +243,11 @@ def _while_loop_batching_rule(args, dims, cond_nconsts, cond_jaxpr, orig_batched = [d is not batching.not_mapped for d in dims] cconst_bat, bconst_bat, init_bat = split_list(orig_batched, [cond_nconsts, body_nconsts]) + # Fixpoint computation of which carry are batched: either + # batched from init, or the carry out is batched. Each iteration promotes + # at least one carry to batched. carry_bat = init_bat - for _ in range(1000): + while True: batched = bconst_bat + carry_bat body_jaxpr_batched, carry_bat_out = batching.batch_jaxpr( body_jaxpr, size, batched, instantiate=carry_bat) @@ -254,9 +257,7 @@ def _while_loop_batching_rule(args, dims, cond_nconsts, cond_jaxpr, if carry_bat_out == carry_bat: break else: - carry_bat = carry_bat_out - else: - raise FixedPointError + carry_bat = _map(operator.or_, carry_bat, carry_bat_out) consts, init = split_list(args, [cond_nconsts + body_nconsts]) const_dims, init_dims = split_list(dims, [cond_nconsts + body_nconsts]) @@ -536,8 +537,11 @@ def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, nonzeros = [t is not ad_util.zero for t in tangents] const_nz, init_nz, xs_nz = split_list(nonzeros, [num_consts, num_carry]) + # Fixpoint computation of which carry are not ad.zero: either + # non-zero from init, or the carry out is non-zero. Each iteration promotes + # at least one carry to non-zero. carry_nz = init_nz - for _ in range(1000): + while True: nonzeros = const_nz + carry_nz + xs_nz jaxpr_jvp, nonzeros_out = ad.jvp_jaxpr( jaxpr, nonzeros, instantiate=carry_nz + [False] * num_ys) @@ -545,9 +549,8 @@ def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, if carry_nz_out == carry_nz: break else: - carry_nz = carry_nz_out - else: - raise FixedPointError + carry_nz = _map(operator.or_, carry_nz, carry_nz_out) + tangents = [ad.instantiate_zeros(x, t) if t is ad_util.zero and nz else t for x, t, nz in zip(primals, tangents, nonzeros)] @@ -586,11 +589,14 @@ def _scan_partial_eval(trace, *tracers, **kwargs): num_xs = len(jaxpr.in_avals) - num_carry - num_consts num_ys = len(jaxpr.out_avals) - num_carry - unknowns = original_unknowns = [t.pval[0] is not None for t in tracers] + unknowns = [t.pval[0] is not None for t in tracers] const_uk, init_uk, xs_uk = split_list(unknowns, [num_consts, num_carry]) + # Fixpoint computation of which carry are unknown (not a constant): either + # unknown from init, or the carry out is unknown. Each iteration promotes + # at least one carry to unknown. carry_uk = init_uk - for _ in range(1000): + while True: unknowns = const_uk + carry_uk + xs_uk jaxpr_1, jaxpr_2, out_uk = pe.partial_eval_jaxpr( jaxpr, unknowns, instantiate=carry_uk + [False] * num_ys) @@ -598,9 +604,8 @@ def _scan_partial_eval(trace, *tracers, **kwargs): if carry_uk_out == carry_uk: break else: - carry_uk = carry_uk_out - else: - raise FixedPointError + carry_uk = _map(operator.or_, carry_uk, carry_uk_out) + in_consts = [core.unit if uk else t.pval[1] for uk, t in zip(unknowns, tracers)] new_tracers = [trace.instantiate_const(t) if uk else trace.new_instantiated_literal(core.unit) @@ -702,8 +707,11 @@ def _scan_batching_rule(args, dims, forward, length, jaxpr, num_consts, orig_batched = [d is not batching.not_mapped for d in dims] const_batched, init_batched, xs_batched = split_list(orig_batched, [num_consts, num_carry]) + # Fixpoint computation of which carry are batched: either + # batched from init, or the carry out is batched. Each iteration promotes + # at least one carry to batched. carry_batched = init_batched - for _ in range(1000): + while True: batched = const_batched + carry_batched + xs_batched jaxpr_batched, batched_out = batching.batch_jaxpr( jaxpr, size, batched, instantiate=carry_batched + [False] * num_ys) @@ -711,9 +719,7 @@ def _scan_batching_rule(args, dims, forward, length, jaxpr, num_consts, if carry_batched_out == carry_batched: break else: - carry_batched = carry_batched_out - else: - raise FixedPointError + carry_batched = _map(operator.or_, carry_batched, carry_batched_out) consts, init, xs = split_list(args, [num_consts, num_carry]) consts_bdims, init_bdims, xs_bdims = split_list(dims, [num_consts, num_carry]) From 979b38352f23ed2c822481900558867fe7c5baf4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 14:09:12 -0700 Subject: [PATCH 0283/1053] make vmap structured axes work for any pytree --- jax/api.py | 18 +++++++----------- jax/api_util.py | 4 ++-- jax/interpreters/ad.py | 2 +- jax/tree_util.py | 38 ++++++++++++++++++++++++++++++++++---- tests/api_test.py | 35 +++++++++++++++++++++++++++++++++++ tests/tree_util_tests.py | 2 +- 6 files changed, 80 insertions(+), 19 deletions(-) diff --git a/jax/api.py b/jax/api.py index ed72b140c4ba..bfd1c69e5078 100644 --- a/jax/api.py +++ b/jax/api.py @@ -47,7 +47,8 @@ from .api_util import (wraps, flatten_fun, apply_flat_fun, flatten_fun_nokwargs, flatten_fun_nokwargs2, apply_flat_fun_nokwargs) from .tree_util import (tree_map, tree_flatten, tree_unflatten, tree_structure, - tree_transpose, tree_leaves, tree_multimap) + tree_transpose, tree_leaves, tree_multimap, + _replace_nones) from .util import (unzip2, unzip3, curry, partial, safe_map, safe_zip, WrapHashably, Hashable, prod, split_list) from .lib.xla_bridge import (canonicalize_dtype, device_count, @@ -678,27 +679,22 @@ def batched_fun(*args): return batched_fun +# TODO(mattjj,phawkins): improve this implementation def _flatten_axes(treedef, axis_tree): + proxy = object() dummy = tree_unflatten(treedef, [object()] * treedef.num_leaves) axes = [] add_leaves = lambda i, x: axes.extend([i] * len(tree_flatten(x)[0])) try: - tree_multimap(add_leaves, _replace_nones(axis_tree), dummy) + tree_multimap(add_leaves, _replace_nones(proxy, axis_tree), dummy) except ValueError: msg = ("axes specification must be a tree prefix of the corresponding " "value, got specification {} for value {}.") raise ValueError(msg.format(axis_tree, treedef)) - axes = [None if a is _none_proxy else a for a in axes] + axes = [None if a is proxy else a for a in axes] + assert len(axes) == treedef.num_leaves return axes -def _replace_nones(tuptree): - if type(tuptree) in (list, tuple): - return tuple(map(_replace_nones, tuptree)) - else: - return tuptree if tuptree is not None else _none_proxy -class _NoneProxy(object): pass -_none_proxy = _NoneProxy() - def pmap(fun, axis_name=None, devices=None, backend=None): """Parallel map with support for collectives. diff --git a/jax/api_util.py b/jax/api_util.py index 287f8a98a776..7a161bc4a5a0 100644 --- a/jax/api_util.py +++ b/jax/api_util.py @@ -16,8 +16,8 @@ from __future__ import division from __future__ import print_function -from .tree_util import (build_tree, process_pytree, tree_flatten, - tree_unflatten, treedef_is_leaf) +from .tree_util import (build_tree, tree_flatten, tree_unflatten, + treedef_is_leaf) from .linear_util import transformation_with_aux from .util import safe_map, unzip2, partial, curry diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index cf7242cce0c8..36e0cfa6187e 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -25,7 +25,7 @@ zeros_like_p, zero, Zero) from ..abstract_arrays import raise_to_shaped from ..util import unzip2, unzip3, safe_map, safe_zip, partial, split_list -from ..tree_util import process_pytree, build_tree, register_pytree_node, tree_map +from ..tree_util import build_tree, register_pytree_node, tree_map from ..linear_util import thunk, staged, transformation, transformation_with_aux, wrap_init from ..api_util import flatten_fun, flatten_fun_nokwargs from ..tree_util import tree_flatten, tree_unflatten diff --git a/jax/tree_util.py b/jax/tree_util.py index 378a07a3b4f5..e97753df0ad6 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -42,7 +42,7 @@ from .lib import pytree -from .util import partial, safe_zip +from .util import partial, safe_zip, unzip2 def tree_map(f, tree): @@ -83,7 +83,8 @@ def tree_multimap(f, tree, *rest): def tree_leaves(tree): return pytree.flatten(tree)[0] -def process_pytree(process_node, tree): +# TODO(mattjj,phawkins): consider removing this function +def _process_pytree(process_node, tree): leaves, treedef = pytree.flatten(tree) return treedef.walk(process_node, None, leaves), treedef @@ -122,8 +123,37 @@ def treedef_tuple(trees): def treedef_children(treedef): return treedef.children() -register_pytree_node = pytree.register_node - +def register_pytree_node(type_, to_iterable, from_iterable): + pytree.register_node(type_, to_iterable, from_iterable) + _registry[type_] = _RegistryEntry(to_iterable, from_iterable) + +# TODO(mattjj): remove the Python-side registry when the C++-side registry is +# sufficiently queryable that we can express _replace_nones. That may mean once +# we have a flatten_one function. +_RegistryEntry = collections.namedtuple("RegistryEntry", ["to_iter", "from_iter"]) +_registry = { + tuple: _RegistryEntry(lambda xs: (xs, None), lambda _, xs: tuple(xs)), + list: _RegistryEntry(lambda xs: (xs, None), lambda _, xs: list(xs)), + dict: _RegistryEntry(lambda xs: unzip2(sorted(xs.items()))[::-1], + lambda keys, xs: dict(zip(keys, xs))), + type(None): _RegistryEntry(lambda z: ((), None), lambda _, xs: None), +} +def _replace_nones(sentinel, tree): + if tree is None: + return sentinel + else: + handler = _registry.get(type(tree)) + if handler: + children, metadata = handler.to_iter(tree) + proc_children = [_replace_nones(sentinel, child) for child in children] + return handler.from_iter(metadata, proc_children) + elif isinstance(tree, tuple) and hasattr(tree, '_fields'): + # handle namedtuple as a special case, based on heuristic + children = iter(tree) + proc_children = [_replace_nones(sentinel, child) for child in children] + return type(tree)(*proc_children) + else: + return tree def tree_reduce(f, tree): diff --git a/tests/api_test.py b/tests/api_test.py index 9b0d04eb240e..e429be63a865 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1146,6 +1146,41 @@ def h(a, b): r"\(10, \[2, 2\]\)", lambda: api.vmap(h, in_axes=(0, 1))(X, [U, U])) + def test_vmap_structured_in_axes(self): + + A, B, C, D = 2, 3, 4, 5 + K = 6 # batch size + x = onp.ones((K, A, B)) # batch axis in different locations + y = onp.ones((B, K, C)) + z = onp.ones((C, D, K)) + + def foo(tree_arg): + x, (y, z) = tree_arg + return np.dot(x, np.dot(y, z)) + + tree = (x, (y, z)) + vfoo = api.vmap(foo, in_axes=((0, (1, 2)),)) + self.assertEqual(vfoo(tree).shape, (6, 2, 5)) + + Point = collections.namedtuple("Point", ["x", "y"]) + tree = (x, Point(y, z)) + vfoo = api.vmap(foo, in_axes=((0, Point(1, 2)),)) + self.assertEqual(vfoo(tree).shape, (6, 2, 5)) + + def foo(tree_arg): + x, dct = tree_arg + y, z = dct['a'], dct['b'] + return np.dot(x, np.dot(y, z)) + + tree = (x, {'a':y, 'b':z}) + vfoo = api.vmap(foo, in_axes=((0, {'a':1, 'b':2}),)) + self.assertEqual(vfoo(tree).shape, (6, 2, 5)) + + tree = (x, collections.OrderedDict([('a', y), ('b', z)])) + vfoo = api.vmap( + foo, in_axes=((0, collections.OrderedDict([('a', 1), ('b', 2)])),)) + self.assertEqual(vfoo(tree).shape, (6, 2, 5)) + if __name__ == '__main__': absltest.main() diff --git a/tests/tree_util_tests.py b/tests/tree_util_tests.py index 406748fa5a8b..7fe9671c24ab 100644 --- a/tests/tree_util_tests.py +++ b/tests/tree_util_tests.py @@ -103,7 +103,7 @@ def testRoundtripPartial(self, inputs): @parameterized.parameters(*PYTREES) def testRoundtripViaBuild(self, inputs): - xs, tree = tree_util.process_pytree(tuple, inputs) + xs, tree = tree_util._process_pytree(tuple, inputs) actual = tree_util.build_tree(tree, xs) self.assertEqual(actual, inputs) From 46fe76c23a652800d465da27eba10fe9e0753707 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 14:47:16 -0700 Subject: [PATCH 0284/1053] tweak comment --- jax/api.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index bfd1c69e5078..e742fbab8f19 100644 --- a/jax/api.py +++ b/jax/api.py @@ -679,8 +679,12 @@ def batched_fun(*args): return batched_fun -# TODO(mattjj,phawkins): improve this implementation def _flatten_axes(treedef, axis_tree): + # given an axis spec tree axis_tree (a pytree with integers and Nones at the + # leaves, i.e. the Nones are to be considered leaves) that is a tree prefix of + # the given treedef, build a complete axis spec tree with the same structure + # and return the flattened result + # TODO(mattjj,phawkins): improve this implementation proxy = object() dummy = tree_unflatten(treedef, [object()] * treedef.num_leaves) axes = [] From 8bcee8d45fae851154bee2ccfbb01bc6177f46b4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 30 Oct 2019 14:57:00 -0700 Subject: [PATCH 0285/1053] fix a leak where compiled results lived too long The original repro @levskaya showed us was essentially this OOM: for i in range(40): f = jit(lambda: 1. * np.ones((300, 1024, 1024))) f().block_until_ready() Even though f was being rebound on every iteration, the cache entries corresponding to the previous iterations of the loop were sticking around. Instead, if the user drops all references to a function, we want to clear the corresponding compilation cache entries (since they can never be used). The fix here is to use a two-level cache for compiled code: the first level is a WeakKeyDictionary keyed by the raw Python callable underlying the WrappedFun, and the second level is a regular dictionary keyed by (transforms, params, args). Because this logic is now present in linear_util.py:cache, the implementations of WrappedFun.__eq__ and WrappedFun.__hash__ may be superfluous now. One unintended consequence is that this implementation now avoids using fastcache.crlu_cache for the jit and pmap compilation caches. It was easier to implement this logic in pure Python. We might want to revise this for performance reasons. This commit also incidentally fixed #1600. --- jax/api.py | 16 +++++++++++----- jax/interpreters/ad.py | 2 +- jax/linear_util.py | 41 +++++++++++++++------------------------- tests/api_test.py | 43 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 32 deletions(-) diff --git a/jax/api.py b/jax/api.py index e742fbab8f19..6dd64aef6913 100644 --- a/jax/api.py +++ b/jax/api.py @@ -846,7 +846,7 @@ def pmap(fun, axis_name=None, devices=None, backend=None): [ 13. 13.] """ _check_callable(fun) - axis_name = _TempAxisName() if axis_name is None else axis_name + axis_name = _TempAxisName(fun) if axis_name is None else axis_name @wraps(fun) def f_pmapped(*args, **kwargs): @@ -875,13 +875,19 @@ def _pmap_axis_size(xs): raise ValueError(msg.format([x for x in xs if not hasattr(x, 'shape')])) class _TempAxisName(object): + def __init__(self, obj): + self.obj = obj def __repr__(self): - return ''.format(hex(id(self))) + return ''.format(hex(id(self.obj))) + def __hash__(self): + return hash(self.obj) + def __eq__(self, other): + return self.obj is other.obj def soft_pmap(fun, axis_name=None, backend=None): _check_callable(fun) - axis_name = _TempAxisName() if axis_name is None else axis_name + axis_name = _TempAxisName(fun) if axis_name is None else axis_name @wraps(fun) def f_pmapped(*args, **kwargs): @@ -930,7 +936,7 @@ def _reshape_merge(x): def _papply(fun): # This function is for testing purposes. - axis_name = _TempAxisName() + axis_name = _TempAxisName(fun) def papply_fun(*args, **kwargs): f = lu.wrap_init(fun) @@ -944,7 +950,7 @@ def papply_fun(*args, **kwargs): def _parallelize(fun): - axis_name = _TempAxisName() + axis_name = _TempAxisName(fun) def pfun(*args): f = lu.wrap_init(fun) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 36e0cfa6187e..3b2f42424c2a 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -26,7 +26,7 @@ from ..abstract_arrays import raise_to_shaped from ..util import unzip2, unzip3, safe_map, safe_zip, partial, split_list from ..tree_util import build_tree, register_pytree_node, tree_map -from ..linear_util import thunk, staged, transformation, transformation_with_aux, wrap_init +from ..linear_util import thunk, transformation, transformation_with_aux, wrap_init from ..api_util import flatten_fun, flatten_fun_nokwargs from ..tree_util import tree_flatten, tree_unflatten diff --git a/jax/linear_util.py b/jax/linear_util.py index 59d408614c38..e8698f1562dd 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -69,7 +69,7 @@ def scale_transformer_aux(scale, x): from __future__ import division from __future__ import print_function -import fastcache +import weakref from .util import curry, partial @@ -112,18 +112,6 @@ def __nonzero__(self): __bool__ = __nonzero__ -@curry -def staged(f, *init_args): - store = Store() - def f_partial(*rest): - ans, aux = f(*(init_args + rest)) - store.store(aux) - return ans - - f_partial.__name__ = f.__name__ + "_staged" - return f_partial, thunk(lambda: store.val) - - class WrappedFun(object): """Represents a function `f` to which `transforms` are to be applied. @@ -149,8 +137,8 @@ def wrap(self, gen, gen_args, out_store): return WrappedFun(self.f, ((gen, gen_args),) + self.transforms, (out_store,) + self.stores, self.params) - def populate_stores(self, other): - for self_store, other_store in zip(self.stores, other.stores): + def populate_stores(self, stores): + for self_store, other_store in zip(self.stores, stores): if self_store is not None: self_store.store(other_store.val) @@ -208,15 +196,16 @@ def wrap_init(f, params={}): return WrappedFun(f, (), (), tuple(sorted(params.items()))) -def cache(call, max_size=4096): - @fastcache.clru_cache(maxsize=max_size) - def cached_fun_body(f, args): - return call(f, *args), f - - def cached_fun(f, *args): - ans, f_prev = cached_fun_body(f, args) - if id(f_prev) != id(f): - f.populate_stores(f_prev) +def cache(call): + caches = weakref.WeakKeyDictionary() + def memoized_fun(f, *args): + cache = caches.setdefault(f.f, {}) + key = (f.transforms, f.params, args) + if key in cache: + ans, stores = cache[key] + f.populate_stores(stores) + else: + ans = call(f, *args) + cache[key] = (ans, f.stores) return ans - - return cached_fun + return memoized_fun diff --git a/tests/api_test.py b/tests/api_test.py index e429be63a865..071faa58f1fe 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -20,6 +20,7 @@ from functools import partial import unittest import warnings +import weakref from absl.testing import absltest import numpy as onp @@ -1181,6 +1182,48 @@ def foo(tree_arg): foo, in_axes=((0, collections.OrderedDict([('a', 1), ('b', 2)])),)) self.assertEqual(vfoo(tree).shape, (6, 2, 5)) + def test_jit_reference_dropping(self): + x = onp.ones(10) + f = (lambda x: lambda: x)(x) # reference to x in f's closure + g = jit(f) + x = weakref.ref(x) # no more strong ref to x in this scope + assert x() is not None # x is still around + f() # f runs + g() # g runs + g() # g runs a second time + del f # delete the raw callable + assert x() is not None # x is still around + g() # g still runs + del g # no more references to x + assert x() is None # x is gone + + def test_jit_global_cache(self): + def f(x): + assert python_should_be_executing + return x + + python_should_be_executing = True + api.jit(f)(2) + python_should_be_executing = False + api.jit(f)(3) + + def test_pmap_global_cache(self): + def f(x): + assert python_should_be_executing + return x + + x = onp.ones(1) + + python_should_be_executing = True + api.pmap(f)(x) + python_should_be_executing = False + api.pmap(f)(x) + + python_should_be_executing = True + api.pmap(f, 'i')(x) + python_should_be_executing = False + api.pmap(f, 'i')(x) + if __name__ == '__main__': absltest.main() From d2156ea1c5a42bcf93f1ee068c9b29038fda1e87 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 31 Oct 2019 16:21:02 -0700 Subject: [PATCH 0286/1053] improve names, avoid double lookup (thanks @hawkinsp) --- jax/linear_util.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/jax/linear_util.py b/jax/linear_util.py index e8698f1562dd..b71305497033 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -197,15 +197,16 @@ def wrap_init(f, params={}): def cache(call): - caches = weakref.WeakKeyDictionary() - def memoized_fun(f, *args): - cache = caches.setdefault(f.f, {}) - key = (f.transforms, f.params, args) - if key in cache: - ans, stores = cache[key] - f.populate_stores(stores) + fun_caches = weakref.WeakKeyDictionary() + def memoized_fun(fun, *args): + cache = fun_caches.setdefault(fun.f, {}) + key = (fun.transforms, fun.params, args) + result = cache.get(key, None) + if result is not None: + ans, stores = result + fun.populate_stores(stores) else: - ans = call(f, *args) - cache[key] = (ans, f.stores) + ans = call(fun, *args) + cache[key] = (ans, fun.stores) return ans return memoized_fun From a9b110f0e7986b4330c517d1f2dc61c5cb557a58 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 31 Oct 2019 16:49:40 -0700 Subject: [PATCH 0287/1053] Implement Poisson distribution for jax.scipy.stats (#1608) * starter code * Update scipy_stats_test.py * Update __init__.py * Update scipy_stats_test.py --- jax/scipy/stats/__init__.py | 1 + jax/scipy/stats/poisson.py | 36 ++++++++++++++++++++++++++++++++++++ tests/scipy_stats_test.py | 17 +++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 jax/scipy/stats/poisson.py diff --git a/jax/scipy/stats/__init__.py b/jax/scipy/stats/__init__.py index 995253050276..706002064aa9 100644 --- a/jax/scipy/stats/__init__.py +++ b/jax/scipy/stats/__init__.py @@ -14,6 +14,7 @@ from __future__ import absolute_import from . import bernoulli +from . import poisson from . import beta from . import cauchy from . import dirichlet diff --git a/jax/scipy/stats/poisson.py b/jax/scipy/stats/poisson.py new file mode 100644 index 000000000000..a8de822d7d11 --- /dev/null +++ b/jax/scipy/stats/poisson.py @@ -0,0 +1,36 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import scipy.stats as osp_stats + +from ... import lax +from ...numpy import lax_numpy as np +from ..special import xlogy, gammaln + + +@np._wraps(osp_stats.poisson.logpmf, update_doc=False) +def logpmf(k, mu, loc=0): + k, mu, loc = np._promote_args_like(osp_stats.poisson.logpmf, k, mu, loc) + zero = np._constant_like(k, 0) + x = lax.sub(k, loc) + log_probs = xlogy(x, mu) - gammaln(x + 1) - mu + return np.where(lax.lt(x, zero), -np.inf, log_probs) + +@np._wraps(osp_stats.poisson.pmf, update_doc=False) +def pmf(k, mu, loc=0): + return np.exp(pmf(k, mu, loc)) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 08b7fecb7093..a90761bacde4 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -51,6 +51,23 @@ def genNamedParametersNArgs(n, rng): class LaxBackedScipyStatsTests(jtu.JaxTestCase): """Tests for LAX-backed scipy.stats implementations""" + @genNamedParametersNArgs(3, jtu.rand_default()) + def testPoissonLogPmf(self, rng, shapes, dtypes): + scipy_fun = osp_stats.poisson.logpmf + lax_fun = lsp_stats.poisson.logpmf + + def args_maker(): + k, mu, loc = map(rng, shapes, dtypes) + k = onp.floor(k) + # clipping to ensure that rate parameter is strictly positive + mu = onp.clip(onp.abs(mu), a_min=0.1, a_max=None) + loc = onp.floor(loc) + return [k, mu, loc] + + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + @genNamedParametersNArgs(3, jtu.rand_default()) def testBernoulliLogPmf(self, rng, shapes, dtypes): scipy_fun = osp_stats.bernoulli.logpmf From 6f6209838ae3deb2aa14d62bed7e597cec79295b Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Fri, 1 Nov 2019 09:28:48 +0000 Subject: [PATCH 0288/1053] Import nn in jax/__init__.py. --- jax/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/__init__.py b/jax/__init__.py index a9b883516341..e846351e58e1 100644 --- a/jax/__init__.py +++ b/jax/__init__.py @@ -17,5 +17,6 @@ from jax.version import __version__ from jax.api import * +from jax import nn from jax import random import jax.numpy as np # side-effecting import sets up operator overloads From 3e9ce2f69f118d89fde6e3b18f9c4a8da26a2764 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 1 Nov 2019 10:41:51 -0400 Subject: [PATCH 0289/1053] Use --repo_env instead of --action_env to configure Python and CUDA. (#1619) --action_env variables are passed to every build action. This means that if the variable changes, the entire build cache is invalidated. By contrast, --repo_env variables are only passed to repository rules and don't affect every action. In principle this means that we should be able to rebuild JAX for different Python versions without rebuilding 99% of the C++ code. Update bazel release for build script to 0.29.1 (same as TensorFlow.) --- build/build.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build/build.py b/build/build.py index 3d54f9212026..2bc28289e9aa 100755 --- a/build/build.py +++ b/build/build.py @@ -60,19 +60,19 @@ def get_python_bin_path(python_bin_path_flag): # Bazel -BAZEL_BASE_URI = "https://github.com/bazelbuild/bazel/releases/download/0.24.1/" +BAZEL_BASE_URI = "https://github.com/bazelbuild/bazel/releases/download/0.29.1/" BazelPackage = collections.namedtuple("BazelPackage", ["file", "sha256"]) bazel_packages = { "Linux": BazelPackage( - file="bazel-0.24.1-linux-x86_64", + file="bazel-0.29.1-linux-x86_64", sha256= - "e18e2877e18a447eb5d94f5efbec375366d82af6443c6a83a93c62657a7b1c32"), + "da3031d811f42f6208d24a87984b5b07e1c75afede184cad86eb02bef6c3b9b0"), "Darwin": BazelPackage( - file="bazel-0.24.1-darwin-x86_64", + file="bazel-0.29.1-darwin-x86_64", sha256= - "cf763752550050d117e03659aaa6ccd6f97da1f983a6029300a497fdaeaaec46"), + "34daae4caafbdb0952415ed6f97f47f03df84df9af146e9eb910ba65c073efdd"), } @@ -164,9 +164,9 @@ def check_bazel_version(bazel_path, min_version, max_version): BAZELRC_TEMPLATE = """ -build --action_env PYTHON_BIN_PATH="{python_bin_path}" +build --repo_env PYTHON_BIN_PATH="{python_bin_path}" build --python_path="{python_bin_path}" -build --action_env TF_NEED_CUDA="{tf_need_cuda}" +build --repo_env TF_NEED_CUDA="{tf_need_cuda}" build --distinct_host_configuration=false build --copt=-Wno-sign-compare build -c opt From a3a59a44509fdbabd1717c977e44f5f9dfe79203 Mon Sep 17 00:00:00 2001 From: Matteo Hessel Date: Fri, 1 Nov 2019 15:38:24 +0000 Subject: [PATCH 0290/1053] Add optix to experimental optix is a composable gradient processing and optimization library --- jax/experimental/optix.py | 361 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 361 insertions(+) create mode 100644 jax/experimental/optix.py diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py new file mode 100644 index 000000000000..577f0094e462 --- /dev/null +++ b/jax/experimental/optix.py @@ -0,0 +1,361 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A composable gradient processing and optimization library for JAX. + +The `optix` module implements a number of composable gradient transformations, +typically used in the context of optimizing neural nets. + +Each transformation defines: + +* an `init_fn`, to initialize a (possibly empty) set of statistics, or `state`. +* an `update_fn` to transform an input gradient and update the state. + +An (optional) `chainer` utility can be used to build custom optimizers by +chaining arbitrary sequences of transformations. For any sequence of +transformations `chainer` returns a single `init_fn` and `update_fn`. + +An (optional) `apply_updates` function can be used to eventually apply the +transformed gradients to the set of parameters of interest. + +Separating gradient transformations from the parameter update allows to flexibly +chain a sequence of transformations of the same gradients, as well as combine +multiple updates to the same parameters (e.g. in multi-task settings where the +different tasks may benefit from different sets of gradient transformations). + +Many popular optimizers can be implemented using `optix` as one-liners, and, +for convenience, we provide aliases for some of the most popular ones. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections + +from jax import numpy as jnp +from jax.tree_util import tree_leaves +from jax.tree_util import tree_multimap + + +### Composable gradient transformations. ### + + +ClipState = collections.namedtuple("ClipState", "") + + +def clip(max_delta): + """Clip updates element-wise. + + Args: + max_delta: the maximum size of an update, for each variable + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(_): + return ClipState() + + def update_fn(updates, state): + updates = tree_multimap( + lambda g: jnp.clip_by_value(g, -max_delta, max_delta), updates) + return updates, state + + return init_fn, update_fn + + +ClipByGlobalNormState = collections.namedtuple("ClipByGlobalNormState", "") + + +def _global_norm(items): + return jnp.sqrt(jnp.sum([jnp.sum(x**2) for x in tree_leaves(items)])) + + +def clip_by_global_norm(max_norm): + """Clip updates using their global norm. + + References: + [Pascanu et al, 2012](https://arxiv.org/abs/1211.5063) + + Args: + max_norm: the maximum global norm for an update. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(_): + return ClipByGlobalNormState() + + def update_fn(updates, state): + g_norm = _global_norm(updates) + trigger = g_norm < max_norm + updates = tree_multimap( + lambda t: jnp.where(trigger, t, t * (max_norm / g_norm)), updates) + return updates, state + + return init_fn, update_fn + + +TraceState = collections.namedtuple("TraceState", "trace") + + +def trace(decay, nesterov): + """Compute a trace of past updates. + + Args: + decay: the decay rate for the tracing of past updates. + nesterov: whether to use nesterov momentum. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(params): + return TraceState(trace=tree_multimap(jnp.zeros_like, params)) + + def update_fn(updates, state): + f = lambda g, t: g + decay * t + update_trace = tree_multimap(f, updates, state.trace) + updates = ( + tree_multimap(f, updates, update_trace) if nesterov else update_trace) + return updates, TraceState(trace=update_trace) + + return init_fn, update_fn + + +ScaleByRmsState = collections.namedtuple("ScaleByRmsState", "nu") + + +def _update_moment(updates, moments, decay, order): + return tree_multimap( + lambda g, t: (1 - decay) * (g ** order) + decay * t, updates, moments) + + +def scale_by_rms(decay=0.9, eps=1e-8): + """Rescale updates by the root of the exp. moving avg of the square. + + References: + [Hinton](www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf) + + Args: + decay: decay rate for the exponentially weighted average of squared grads. + eps: term added to the denominator to improve numerical stability. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(params): + nu = tree_multimap(jnp.zeros_like, params) # second moment + return ScaleByRmsState(nu=nu) + + def update_fn(updates, state): + nu = _update_moment(updates, state.nu, decay, 2) + updates = tree_multimap(lambda g, n: g / (jnp.sqrt(n + eps)), updates, nu) + return updates, ScaleByRmsState(nu=nu) + + return init_fn, update_fn + + +ScaleByRStdDevState = collections.namedtuple("ScaleByRStdDevState", "mu nu") + + +def scale_by_stddev(decay=0.9, eps=1e-8): + """Rescale updates by the root of the centered exp. moving average of squares. + + References: + [Hinton](www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf) + + Args: + decay: decay rate for the exponentially weighted average of squared grads. + eps: term added to the denominator to improve numerical stability. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(params): + mu = tree_multimap(jnp.zeros_like, params) # First moment + nu = tree_multimap(jnp.zeros_like, params) # Second moment + return ScaleByRStdDevState(mu=mu, nu=nu) + + def update_fn(updates, state): + mu = _update_moment(updates, state.mu, decay, 1) + nu = _update_moment(updates, state.nu, decay, 2) + updates = tree_multimap( + lambda g, m, n: g / jnp.sqrt(n - m**2 + eps), updates, mu, nu) + return updates, ScaleByRStdDevState(mu=mu, nu=nu) + + return init_fn, update_fn + + +ScaleByAdamState = collections.namedtuple("ScaleByAdamState", "count mu nu") + + +def scale_by_adam(b1=0.9, b2=0.999, eps=1e-8): + """Rescale updates according to the Adam algorithm. + + References: + [Kingma et al, 2014](https://arxiv.org/abs/1412.6980) + + Args: + b1: decay rate for the exponentially weighted average of grads. + b2: decay rate for the exponentially weighted average of squared grads. + eps: term added to the denominator to improve numerical stability. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(params): + mu = tree_multimap(jnp.zeros_like, params) # First moment + nu = tree_multimap(jnp.zeros_like, params) # Second moment + return ScaleByAdamState(count=jnp.zeros([]), mu=mu, nu=nu) + + def update_fn(updates, state): + mu = _update_moment(updates, state.mu, b1, 1) + nu = _update_moment(updates, state.nu, b2, 2) + mu_hat = tree_multimap(lambda t: t / (1 - b1 ** (state.count + 1)), mu) + nu_hat = tree_multimap(lambda t: t / (1 - b2 ** (state.count + 1)), nu) + updates = tree_multimap( + lambda m, v: m / (jnp.sqrt(v) + eps), mu_hat, nu_hat) + return updates, ScaleByAdamState(count=state.count + 1, mu=mu, nu=nu) + + return init_fn, update_fn + + +ScaleState = collections.namedtuple("ScaleState", "") + + +def scale(step_size): + """Scale updates by some fixed scalar `step_size`. + + Args: + step_size: a scalar corresponding to a fixed scaling factor for updates. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(_): + return ScaleState() + + def update_fn(updates, state): + updates = tree_multimap(lambda g: step_size * g, updates) + return updates, state + + return init_fn, update_fn + + +ScaleByScheduleState = collections.namedtuple("ScaleByScheduleState", "count") + + +def scale_by_schedule(step_size_fn): + """Scale updates using a custom schedule for the `step_size`. + + Args: + step_size_fn: a function that takes an update count as input and proposes + the step_size to multiply the updates by. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(_): + return ScaleByScheduleState(count=jnp.zeros([])) + + def update_fn(updates, state): + updates = tree_multimap(lambda g: step_size_fn(state.count) * g, updates) + return updates, ScaleByScheduleState(count=state.count + 1) + + return init_fn, update_fn + + +### Utilities for building and using custom optimizers. ### + + +def chainer(*args): + """Applies a list of chainable update transformations. + + Given a sequence of chainable transforms, `chainer` returns an `init_fn` + that constructs a `state` by concatenating the states of the individual + transforms, and returns an `update_fn` which chains the update transformations + feeding the appropriate state to each. + + Args: + *args: a sequence of chainable (init_fn, update_fn) tuples. + + Returns: + A single (init_fn, update_fn) tuple. + """ + + init_fns, update_fns = zip(*args) + + def init(params): + return [fn(params) for fn in init_fns] + + def update(updates, state): + new_state = [] + for s, fn in zip(state, update_fns): + updates, new_s = fn(updates, s) + new_state.append(new_s) + return updates, new_state + + return init, update + + +def apply_updates(params, updates): + """Applies an update to the corresponding parameters. + + This is an (optional) utility functions that applies an update, and returns + the updated parameters to the caller. The update itself is typically the + result of applying any number of `chainable` transformations. + + Args: + params: a tree of parameters. + updates: a tree of updates, the tree structure and the shape of the leaf + nodes must match that of `params`. + + Returns: + Updated parameters, with same structure and shape as `params`. + """ + return tree_multimap(lambda p, u: p + u, params, updates) + + +### Aliases for popular optimizers. ### + + +def sgd(learning_rate, momentum=0., nesterov=False): + return chainer( + trace(decay=momentum, nesterov=nesterov), + scale(-learning_rate)) + + +def adam(learning_rate, b1=0.9, b2=0.999, eps=1e-8): + return chainer( + scale_by_adam(b1=b1, b2=b2, eps=eps), + scale(-learning_rate)) + + +def rmsprop(learning_rate, decay=0.9, eps=1e-8, centered=False): + if not centered: + return chainer( + scale_by_rms(decay=decay, eps=eps), + scale(-learning_rate)) + else: + return chainer( + scale_by_stddev(decay=decay, eps=eps), + scale(-learning_rate)) From 7644b31d98bd9667579d89fb02d3fb72813a9daf Mon Sep 17 00:00:00 2001 From: Matteo Hessel Date: Fri, 1 Nov 2019 15:39:19 +0000 Subject: [PATCH 0291/1053] Add build target for optix --- jax/BUILD | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jax/BUILD b/jax/BUILD index f8999206e1d5..242484c76381 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -60,6 +60,12 @@ py_library( deps = [":jax"], ) +py_library( + name = "optix", + srcs = ["experimental/optix.py"], + deps = [":jax"], +) + py_library( name = "ode", srcs = ["experimental/ode.py"], From 035540578674d0c731b2921fcf7081acfd2831b5 Mon Sep 17 00:00:00 2001 From: Matteo Hessel Date: Fri, 1 Nov 2019 15:40:09 +0000 Subject: [PATCH 0292/1053] Add tests checking equivalence to optimizers.py --- tests/optix_test.py | 110 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/optix_test.py diff --git a/tests/optix_test.py b/tests/optix_test.py new file mode 100644 index 000000000000..14426f6cc5e5 --- /dev/null +++ b/tests/optix_test.py @@ -0,0 +1,110 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the optix module.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +from jax import numpy as jnp +from jax.experimental import optimizers +from jax.experimental import optix +from jax.tree_util import tree_leaves +import numpy as onp + + +STEPS = 50 +LR = 1e-2 + + +class OptixTest(absltest.TestCase): + + def setUp(self): + super(OptixTest, self).setUp() + self.init_params = (jnp.array([1., 2.]), jnp.array([3., 4.])) + self.per_step_updates = (jnp.array([500., 5.]), jnp.array([300., 3.])) + + def test_sgd(self): + + # experimental/optimizers.py + jax_params = self.init_params + opt_init, opt_update, get_params = optimizers.sgd(LR) + state = opt_init(jax_params) + for i in range(STEPS): + state = opt_update(i, self.per_step_updates, state) + jax_params = get_params(state) + + # experimental/optix.py + optix_params = self.init_params + opt_init, opt_update = optix.sgd(LR, 0.0) + state = opt_init(optix_params) + for _ in range(STEPS): + updates, state = opt_update(self.per_step_updates, state) + optix_params = optix.apply_updates(optix_params, updates) + + # Check equivalence. + for x, y in zip(tree_leaves(jax_params), tree_leaves(optix_params)): + onp.testing.assert_allclose(x, y, rtol=1e-5) + + def test_adam(self): + b1, b2, eps = 0.9, 0.999, 1e-8 + + # experimental/optimizers.py + jax_params = self.init_params + opt_init, opt_update, get_params = optimizers.adam(LR, b1, b2, eps) + state = opt_init(jax_params) + for i in range(STEPS): + state = opt_update(i, self.per_step_updates, state) + jax_params = get_params(state) + + # experimental/optix.py + optix_params = self.init_params + opt_init, opt_update = optix.adam(LR, b1, b2, eps) + state = opt_init(optix_params) + for _ in range(STEPS): + updates, state = opt_update(self.per_step_updates, state) + optix_params = optix.apply_updates(optix_params, updates) + + # Check equivalence. + for x, y in zip(tree_leaves(jax_params), tree_leaves(optix_params)): + onp.testing.assert_allclose(x, y, rtol=1e-5) + + def test_rmsprop(self): + decay, eps = .9, 0.1 + + # experimental/optimizers.py + jax_params = self.init_params + opt_init, opt_update, get_params = optimizers.rmsprop(LR, decay, eps) + state = opt_init(jax_params) + for i in range(STEPS): + state = opt_update(i, self.per_step_updates, state) + jax_params = get_params(state) + + # experimental/optix.py + optix_params = self.init_params + opt_init, opt_update = optix.rmsprop(LR, decay, eps) + state = opt_init(optix_params) + for _ in range(STEPS): + updates, state = opt_update(self.per_step_updates, state) + optix_params = optix.apply_updates(optix_params, updates) + + # Check equivalence. + for x, y in zip(tree_leaves(jax_params), tree_leaves(optix_params)): + onp.testing.assert_allclose(x, y, rtol=1e-5) + + +if __name__ == '__main__': + absltest.main() From e6ad9c29da1f3df4aa145da08b315d960aa24597 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 1 Nov 2019 09:04:44 -0700 Subject: [PATCH 0293/1053] Docstring fixss for lax.custom_linear_solve (#1616) Also add a new section for the np.fft module. These functions were previously not appearing in the docs, because fftn is not exposed as np.fftn but only as np.fft.fftn. --- docs/jax.numpy.rst | 12 +++++++++++- jax/lax/lax_control_flow.py | 18 +++++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index b50796ccd1b3..c44c220c658f 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -106,7 +106,6 @@ Not every function in NumPy is implemented; contributions are welcome! expm1 eye fabs - fftn fix flip fliplr @@ -246,6 +245,17 @@ Not every function in NumPy is implemented; contributions are welcome! zeros zeros_like +jax.numpy.fft +------------- + +.. automodule:: jax.numpy.fft + +.. autosummary:: + :toctree: _autosummary + + fftn + ifftn + jax.numpy.linalg ---------------- diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 511e0e8d3b18..c9b43ff70106 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1067,9 +1067,10 @@ def custom_linear_solve( solve directly via implicit differentiation at the solution, rather than by differenting *through* the solve operation. This can sometimes be much faster or more numerically stable, or differentiating through the solve operation - may not even be implemented (e.g., if ``solve`` using ``lax.while_loop``). + may not even be implemented (e.g., if ``solve`` uses ``lax.while_loop``). + + Required invariant:: - Required invariant: x = solve(matvec, b) # solve the linear equation assert matvec(x) == b # not checked @@ -1078,14 +1079,13 @@ def custom_linear_solve( b: constant right handle side of the equation. May be any nested structure of arrays. solve: higher level function that solves for solution to the linear - equation, i.e., ``matvec(solve(matvec, x)) == x`` for all ``x`` of the - same form as ``b``. This function need not be differenatiable. + equation, i.e., ``solve(matvec, x)) == x`` for all ``x`` of the same form + as ``b``. This function need not be differenatiable. transpose_solve: higher level function for solving the transpose linear - equation, i.e., ``vecmat(transpose_solve(vecmat, x)) == x``, where - ``vecmat`` is the transpose of the linear map ``matvec`` (computed - automatically with autodiff). Required for backwards mode automatic - differentiation, unless ``symmetric=True``, in which case ``solve`` - provides the default value. + equation, i.e., ``transpose_solve(vecmat, x) == x``, where ``vecmat`` is + the transpose of the linear map ``matvec`` (computed automatically with + autodiff). Required for backwards mode automatic differentiation, unless + ``symmetric=True``, in which case ``solve`` provides the default value. symmetric: bool indicating if it is safe to assume the linear map corresponds to a symmetric matrix, i.e., ``matvec == vecmat``. From 71b34116e5f887ad923c22bbfc4cbe053ab081f7 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 1 Nov 2019 13:46:13 -0700 Subject: [PATCH 0294/1053] avoid generating a trivial gather from numpy indexing fixes #1621 --- jax/numpy/lax_numpy.py | 6 ++++-- tests/lax_numpy_indexing_test.py | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 6e1689f458e2..e1875a3105c0 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2548,9 +2548,11 @@ def _rewriting_take(arr, idx): def _gather(arr, treedef, static_idx, dynamic_idx): idx = _merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx) indexer = _index_to_gather(shape(arr), idx) # shared with _scatter_update + y = arr - y = lax.gather(arr, indexer.gather_indices, indexer.dnums, - indexer.gather_slice_shape) + if indexer.gather_indices.size: + y = lax.gather(y, indexer.gather_indices, indexer.dnums, + indexer.gather_slice_shape) # Reverses axes with negative strides. if indexer.reversed_y_dims: diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index ebdbbc9e63ad..f362ce030f12 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -730,6 +730,11 @@ def testJVPOfGradOfIndexing(self): self.assertAllClose(expected, primals, check_dtypes=True) self.assertAllClose(onp.zeros_like(x), tangents, check_dtypes=True) + def testTrivialGatherIsntGenerated(self): + # https://github.com/google/jax/issues/1621 + jaxpr = api.make_jaxpr(lambda x: x[:, None])(onp.arange(4)) + self.assertEqual(len(jaxpr.eqns), 1) + self.assertNotIn('gather', str(jaxpr)) def _broadcastable_shapes(shape): @@ -891,6 +896,5 @@ def testSegmentSum(self): self.assertAllClose(ans, expected, check_dtypes=False) - if __name__ == "__main__": absltest.main() From 1f40c9c4d2622b07ba5b8901b041b67cbc223377 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Sun, 3 Nov 2019 15:54:05 -0800 Subject: [PATCH 0295/1053] Fix writing suggestions from mattjj --- .../Writing_custom_interpreters_in_Jax.ipynb | 1524 +++++++++-------- 1 file changed, 768 insertions(+), 756 deletions(-) diff --git a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb index 35d40f89b353..92b39d05c66f 100644 --- a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb +++ b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb @@ -1,765 +1,777 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "M-hPMKlwXjMr" + }, + "source": [ + "# Writing custom Jaxpr interpreters in JAX" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "r-3vMiKRYXPJ" + }, + "source": [ + "JAX offers several composable function transformations (`jit`, `grad`, `vmap`,\n", + "etc.) that enable writing concise, accelerated code. \n", + "\n", + "Here we show how to add your own function transformations to the system, by writing a custom Jaxpr interpreter. And we'll get composability with all the other transformations for free." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "s27RDKvKXFL8" + }, + "outputs": [], + "source": [ + "import numpy as onp\n", + "import jax\n", + "import jax.numpy as np\n", + "from jax import jit, grad, vmap\n", + "from jax import random" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "jb_8mEsJboVM" + }, + "source": [ + "## What is JAX doing?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "KxR2WK0Ubs0R" + }, + "source": [ + "JAX provides a NumPy-like API for numerical computing which can be used as is, but JAX's true power comes from composable function transformations. Take the `jit` function transformation, which takes in a function and returns a semantically identical function but is lazily compiled by XLA for accelerators.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { "colab": { - "name": "Writing custom interpreters in Jax", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" + "height": 54 + }, + "colab_type": "code", + "id": "HmlMcICOcSXR", + "outputId": "546bf21b-7d03-4364-a087-5802792abbb0" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/google/home/sharadmv/workspace/jax/jax/lib/xla_bridge.py:115: UserWarning: No GPU/TPU found, falling back to CPU.\n", + " warnings.warn('No GPU/TPU found, falling back to CPU.')\n" + ] } + ], + "source": [ + "x = random.normal(random.PRNGKey(0), (5000, 5000))\n", + "def f(w, b, x):\n", + " return np.tanh(np.dot(x, w) + b)\n", + "fast_f = jit(f)" + ] }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "M-hPMKlwXjMr", - "colab_type": "text" - }, - "source": [ - "# Writing custom Jaxpr interpreters in `jax`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "r-3vMiKRYXPJ", - "colab_type": "text" - }, - "source": [ - "`jax` offers several composable function transformations (`jit`, `grad`, `vmap`,\n", - "etc.) that enable writing concise, accelerated code. \n", - "\n", - "Here we will go over how the basics of writing your own custom Jaxpr interpreter.\n", - "\n", - "*Disclaimer: This colab may not be up to date and relies on Jax internals that are subject to change.*" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "s27RDKvKXFL8", - "colab_type": "code", - "colab": {} - }, - "source": [ - "import numpy as onp\n", - "import jax\n", - "import jax.numpy as np\n", - "from jax import jit, grad, vmap\n", - "from jax import random" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "jb_8mEsJboVM", - "colab_type": "text" - }, - "source": [ - "## What is `jax` doing?" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KxR2WK0Ubs0R", - "colab_type": "text" - }, - "source": [ - "`jax` provides a `numpy`-like API for numerical computing which can be used as is, but `jax`'s true power comes from composable function transformations. Take the `jit` function transformation, which takes in a function and returns a semantically identical function but is lazily compiled by XLA for accelerators.\n" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "HmlMcICOcSXR", - "colab_type": "code", - "outputId": "546bf21b-7d03-4364-a087-5802792abbb0", - "colab": { - "height": 54 - } - }, - "source": [ - "x = random.normal(random.PRNGKey(0), (5000, 5000))\n", - "def f(w, b, x):\n", - " return np.tanh(np.dot(x, w) + b)\n", - "fast_f = jit(f)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gA8V51wZdsjh", - "colab_type": "text" - }, - "source": [ - "When we call `fast_f`, what happens? `jax` traces the function and constructs an XLA computation graph. The graph is then JIT-compiled and executed. Other transformations work similarly in that they first trace the function and handle the output trace in some way. To learn more about Jax's tracing machinery, you can refer to the [\"How it works\"](https://github.com/google/jax#how-it-works) section in the README." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2Th1vYLVaFBz", - "colab_type": "text" - }, - "source": [ - "## Jaxpr tracer\n", - "\n", - "A tracer of special importance in Jax is the Jaxpr tracer, which records ops into a Jaxpr (Jax expression). A Jaxpr is a data structure that can be evaluated like a mini-functional programming language and \n", - "thus Jaxprs are an incredibly useful intermediate representation\n", - "for function transformation. \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pH7s63lpaHJO", - "colab_type": "text" - }, - "source": [ - "`jax.make_jaxpr` is essentially a \"pretty-printing\" transformation:\n", - "it transforms a function into one that, given example arguments, produces a Jaxpr representation of its computation.\n", - "Although we can't generally use the Jaxprs that it returns, it is useful for debugging and introspection.\n", - "Let's use it to look at how some example Jaxprs\n", - "are structured." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "RSxEiWi-EeYW", - "colab_type": "code", - "outputId": "ee3d4f5c-97d3-4db3-a012-20898920cadb", - "colab": { - "height": 547 - } - }, - "source": [ - "def examine_jaxpr(jaxpr):\n", - " print(\"invars:\", jaxpr.invars)\n", - " print(\"outvars:\", jaxpr.outvars)\n", - " print(\"constvars:\", jaxpr.constvars)\n", - " print(\"freevars:\", jaxpr.freevars)\n", - " for eqn in jaxpr.eqns:\n", - " print(\"equation:\", eqn.invars, eqn.primitive, eqn.outvars, eqn.params)\n", - " print()\n", - " print(\"jaxpr:\", jaxpr)\n", - "\n", - "def foo(x):\n", - " return x + 1\n", - "print(\"foo\")\n", - "print(\"=====\")\n", - "examine_jaxpr(jax.make_jaxpr(foo)(5))\n", - "\n", - "print()\n", - "\n", - "def bar(w, b, x):\n", - " return np.dot(w, x) + b + np.ones(5), x\n", - "print(\"bar\")\n", - "print(\"=====\")\n", - "examine_jaxpr(jax.make_jaxpr(bar)(np.ones((5, 10)), np.ones(5), np.ones(10)))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "foo\n", - "=====\n", - "invars: [a]\n", - "outvars: [b]\n", - "constvars: []\n", - "freevars: []\n", - "equation: [a, 1] add [b] {}\n", - "\n", - "jaxpr: { lambda ; ; a.\n", - " let b = add a 1\n", - " in [b] }\n", - "\n", - "\n", - "bar\n", - "=====\n", - "invars: [a, b, c]\n", - "outvars: [g, c]\n", - "constvars: [f]\n", - "freevars: []\n", - "equation: [a, c] dot_general [d] {'dimension_numbers': (((1,), (0,)), ((), ())), 'precision': None}\n", - "equation: [d, b] add [e] {}\n", - "equation: [e, f] add [g] {}\n", - "\n", - "jaxpr: { lambda f ; ; a b c.\n", - " let d = dot_general[ dimension_numbers=(((1,), (0,)), ((), ()))\n", - " precision=None ] a c\n", - " e = add d b\n", - " g = add e f\n", - " in [g, c] }\n", - "\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "k-HxK9iagnH6", - "colab_type": "text" - }, - "source": [ - "* `jaxpr.invars` - the `invars` of a Jaxpr are a list of the input variables to Jaxpr, analogous to arguments in Python functions\n", - "* `jaxpr.outvars` - the `outvars` of a Jaxpr are the variables that are returned by the Jaxpr. \n", - "* `jaxpr.constvars` - the `constvars` are a list of variables that are also inputs to the Jaxpr, but correspond to constants from the trace (we'll go over these in more detail later)\n", - "* `jaxpr.freevars` - we won't worry about these for now\n", - "* `jaxpr.eqns` - a list of equations. Each equation is list of input variables, a list of output variables, and a *primitive*, which is used to evaluate inputs to produce outputs. Each equation also has a set of `params`, a dictionary of keyword arguments to the primitive.\n", - "\n", - "All together, a Jaxpr encapsulates a simple program that can be evaluated with inputs to produce an output. We'll go over how exactly to do this later. The important thing to note now is that a Jaxpr is a data structure that can be manipulated and evaluated in whatever way we want." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NwY7TurYn6sr", - "colab_type": "text" - }, - "source": [ - "### Why are Jaxprs useful?" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UEy6RorCgdYt", - "colab_type": "text" - }, - "source": [ - "Jaxprs are simple and easy to transform. And because Jax lets us stage out Jaxprs from Python functions, it gives us a way to transform numerical programs written in Python.\n", - "\n", - "A helpful mental model for Jaxprs is that they are one-to-one with computation graphs, so the Jaxpr for a function is just the computation graph from its inputs to outputs." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qizTKpbno_ua", - "colab_type": "text" - }, - "source": [ - "## Your first interpreter: `invert`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "OIto-KX4pD7j", - "colab_type": "text" - }, - "source": [ - "Let's try to implement a very function \"inverter\", which takes in the output of the original function and returns the inputs that produced those outputs. For now, let's focus on simple, unary functions which are composed of other invertible unary functions.\n", - "\n", - "Goal:\n", - "```python\n", - "def f(x):\n", - " return np.exp(np.tanh(x))\n", - "f_inv = inverse(f)\n", - "# f_inv(f(1.0)) == 1.0\n", - "```\n", - "\n", - "The way we'll implement this is by 1) tracing `f` into a Jaxpr, then 2) interpret the Jaxpr *backwards*. Every time we hit a primitive, we'll look it up in a registry of invertible functions.\n", - "\n", - "### 1. Tracing a function\n", - "\n", - "We can't use `jax.make_jaxpr` for this, because we need to pull out constants created during the trace to pass into the Jaxpr. However, we can write a function that does something very similar to `make_jaxpr`." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "BHkg_3P1pXJj", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# Importing Jax functions useful for tracing/interpreting.\n", - "import numpy as onp\n", - "from functools import wraps\n", - "\n", - "from jax import api_util\n", - "from jax import core\n", - "from jax import lax\n", - "from jax import linear_util as lu\n", - "from jax import tree_util\n", - "from jax.abstract_arrays import ShapedArray\n", - "from jax.interpreters import partial_eval as pe\n", - "from jax.util import safe_map" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "aqHqPjuBqrl9", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def make_jaxpr2(fun):\n", - " \n", - " def pv_like(x):\n", - " # ShapedArrays are abstract values that carry around\n", - " # shape and dtype information\n", - " aval = ShapedArray(onp.shape(x), onp.result_type(x))\n", - " return pe.PartialVal((aval, core.unit))\n", - "\n", - " @wraps(fun)\n", - " def jaxpr_const_maker(*args, **kwargs):\n", - " # Set up fun for transformation\n", - " wrapped = lu.wrap_init(fun)\n", - " # Flatten input args\n", - " jax_args, in_tree = tree_util.tree_flatten((args, kwargs))\n", - " # Transform fun to accept flat args\n", - " # and return a flat list result\n", - " jaxtree_fun, out_tree = api_util.flatten_fun(wrapped, in_tree) \n", - " # Abstract and partial-val's flat args\n", - " pvals = safe_map(pv_like, jax_args)\n", - " # Trace function into Jaxpr\n", - " jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) \n", - " return jaxpr, consts, (in_tree, out_tree())\n", - " return jaxpr_const_maker" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "CpTml2PTrzZ4", - "colab_type": "text" - }, - "source": [ - "We won't go into too much detail about this function, but at a high level, it first flattens its arguments into a list, which are the abstracted and wrapped as partial values. the `pe.trace_to_jaxpr` function is used to then trace a function into a Jaxpr\n", - "from a list of partial value inputs." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Tc1REN5aq_fH", - "colab_type": "code", - "outputId": "2e6f2833-5139-48ef-da3f-01ea9cd6a7d3", - "colab": { - "height": 119 - } - }, - "source": [ - "def f(x):\n", - " return np.exp(np.tanh(x))\n", - "jaxpr, consts, _ = make_jaxpr2(f)(np.ones(5))\n", - "print(jaxpr)\n", - "print(consts)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "{ lambda ; ; a.\n", - " let b = tanh a\n", - " c = exp b\n", - " in [c] }\n", - "\n", - "()\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WmZ3BcmZsbfR", - "colab_type": "text" - }, - "source": [ - "This particular function doesn't have any example constants, but in general, this is how you both trace into a Jaxpr and extract the constants.\n", - "\n", - "### 2. Evaluating a Jaxpr\n", - "\n", - "\n", - "Before we write a custom Jaxpr interpreter, let's first implement the \"default\" interpreter, `eval_jaxpr`, which evaluates the Jaxpr as is, effectively running the original Python function. \n", - "\n", - "To do this, we first create an environment to store the values for each of the variables, and update the environment with each equation we evaluate in the Jaxpr." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "ACMxjIHStHwD", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def eval_jaxpr(jaxpr, consts, *args):\n", - " env = {} # Mapping from variable -> value\n", - " \n", - " def read(var):\n", - " # Literals are values baked into the Jaxpr\n", - " if type(var) is core.Literal:\n", - " return var.val\n", - " return env[var]\n", - "\n", - " def write(var, val):\n", - " env[var] = val\n", - "\n", - " # Bind args and consts to environment\n", - " write(core.unitvar, core.unit)\n", - " safe_map(write, jaxpr.invars, args)\n", - " safe_map(write, jaxpr.constvars, consts)\n", - "\n", - " # Loop through equations and evaluate primitives using `bind`\n", - " for eqn in jaxpr.eqns:\n", - " # Read inputs to equation from environment\n", - " invals = safe_map(read, eqn.invars) \n", - " # `bind` is how a primitive is called\n", - " outvals = eqn.primitive.bind( \n", - " *invals, **eqn.params\n", - " )\n", - " # Primitives may return multiple outputs or not\n", - " if not eqn.primitive.multiple_results: \n", - " outvals = [outvals]\n", - " # Write the results of the primitive into the environment\n", - " safe_map(write, eqn.outvars, outvals) \n", - " # Read the final result of the Jaxpr from the environment\n", - " return safe_map(read, jaxpr.outvars) " - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "mGHPc3NruCFV", - "colab_type": "code", - "outputId": "3f459905-02ad-4f43-e70f-3db0a5ff58e4", - "colab": { - "height": 51 - } - }, - "source": [ - "jaxpr, consts, _ = make_jaxpr2(f)(np.ones(5))\n", - "eval_jaxpr(jaxpr, consts, np.ones(5))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[DeviceArray([2.14168763, 2.14168763, 2.14168763, 2.14168763, 2.14168763],\n", - " dtype=float32)]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 8 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "XhZhzbVBvAiT", - "colab_type": "text" - }, - "source": [ - "Notice that `eval_jaxpr` will always return a list even if the original function does not. To \"unflatten\" the list into what the function was originally supposed to return, we can use the `out_tree` object returned by `trace`. \n", - "\n", - "Furthermore, this interpreter does not handle `subjaxprs`, which we will not cover in this guide. You can refer to `core.eval_jaxpr` ([link](https://github.com/google/jax/blob/master/jax/core.py#L185-L212)) to see the edge cases that this interpreter does not cover." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0vb2ZoGrCMM4", - "colab_type": "text" - }, - "source": [ - "\n", - "### Custom `inverse` Jaxpr interpreter\n", - "\n", - "An `inverse` interpreter doesn't look too different from `eval_jaxpr`. We'll first set up the \"registry\" which will map primitives to their inverses. We'll then write a custom interpreter that looks up primitives in the registry.\n", - "\n", - "It turns out that this interpreter will also look similar to the \"transpose\" interpreter used in reverse-mode autodifferentiation [found here](https://github.com/google/jax/blob/master/jax/interpreters/ad.py#L141-L187).\n" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "gSMIT2z1vUpO", - "colab_type": "code", - "colab": {} - }, - "source": [ - "inverse_registry = {}" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JgrpMgDyCrC7", - "colab_type": "text" - }, - "source": [ - "We'll now register inverses for some of the primitives. By convention, primitives in Jax end in `_p` and a lot of the popular ones live in `lax`." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "fUerorGkCqhw", - "colab_type": "code", - "colab": {} - }, - "source": [ - "inverse_registry[lax.exp_p] = np.log\n", - "inverse_registry[lax.tanh_p] = np.arctanh" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "mDtH_lYDC5WK", - "colab_type": "text" - }, - "source": [ - "`inverse` will first trace the function, then custom-interpret the Jaxpr. Let's set up a simple skeleton." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "jGNfV6JJC1B3", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def inverse(fun):\n", - " @wraps(fun)\n", - " def wrapped(*args, **kwargs):\n", - " # Since we assume unary functions, we won't\n", - " # worry about flattening and\n", - " # unflattening arguments\n", - " jaxpr, consts, _ = make_jaxpr2(fun)(*args, **kwargs)\n", - " out = inverse_jaxpr(jaxpr, consts, *args)\n", - " return out[0]\n", - " return wrapped" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "g6v6wV7SDM7g", - "colab_type": "text" - }, - "source": [ - "Now we just need to define `inverse_jaxpr`, which will walk through the Jaxpr backward and invert primitives when it can." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "uUAd-L-BDKT5", - "colab_type": "code", - "colab": {} - }, - "source": [ - "def inverse_jaxpr(jaxpr, consts, *args):\n", - " env = {}\n", - " \n", - " def read(var):\n", - " if type(var) is core.Literal:\n", - " return var.val\n", - " return env[var]\n", - "\n", - " def write(var, val):\n", - " env[var] = val\n", - " # Args now correspond to Jaxpr outvars\n", - " write(core.unitvar, core.unit)\n", - " safe_map(write, jaxpr.outvars, args)\n", - " safe_map(write, jaxpr.constvars, consts)\n", - "\n", - " # Looping backward\n", - " for eqn in jaxpr.eqns[::-1]:\n", - " # outvars are now invars \n", - " invals = safe_map(read, eqn.outvars)\n", - " if eqn.primitive not in inverse_registry:\n", - " raise NotImplementedError(\"{} does not have registered inverse.\".format(\n", - " eqn.primitive\n", - " ))\n", - " # Assuming a unary function \n", - " outval = inverse_registry[eqn.primitive](*invals)\n", - " safe_map(write, eqn.invars, [outval])\n", - " return safe_map(read, jaxpr.invars)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "M8i3wGbVERhA", - "colab_type": "text" - }, - "source": [ - "That's it!" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "cjEKWso-D5Bu", - "colab_type": "code", - "outputId": "54e73a42-a908-448c-d6d5-e6d0fe9adbf9", - "colab": { - "height": 71 - } - }, - "source": [ - "def f(x):\n", - " return np.exp(np.tanh(x))\n", - "f_inv = inverse(f)\n", - "print(f_inv(f(1.0)))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "0.9999999\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Ny7Oo4WLHdXt", - "colab_type": "text" - }, - "source": [ - "Importantly, you can trace through a Jaxpr interpreter." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "j6ov_rveHmTb", - "colab_type": "code", - "outputId": "a7a9b4be-f284-4e78-c469-d84e352d838d", - "colab": { - "height": 238 - } - }, - "source": [ - "jax.make_jaxpr(inverse(f))(f(1.))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{ lambda ; ; a.\n", - " let b = log a\n", - " c = abs b\n", - " d = le c 1.0\n", - " e = add b 1.0\n", - " f = sub 1.0 b\n", - " g = div e f\n", - " h = log g\n", - " i = mul h 0.5\n", - " j = tie_in b nan\n", - " k = broadcast[ sizes=() ] j\n", - " l = select d i k\n", - " in [l] }" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 14 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yfWVBsKwH0j6", - "colab_type": "text" - }, - "source": [ - "That's all it takes to add a new transformation to a system, and you get composition with all the others for free! For example, we can use `jit`, `vmap`, and `grad` with `inverse`!" + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "gA8V51wZdsjh" + }, + "source": [ + "When we call `fast_f`, what happens? JAX traces the function and constructs an XLA computation graph. The graph is then JIT-compiled and executed. Other transformations work similarly in that they first trace the function and handle the output trace in some way. To learn more about Jax's tracing machinery, you can refer to the [\"How it works\"](https://github.com/google/jax#how-it-works) section in the README." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "2Th1vYLVaFBz" + }, + "source": [ + "## Jaxpr tracer\n", + "\n", + "A tracer of special importance in Jax is the Jaxpr tracer, which records ops into a Jaxpr (Jax expression). A Jaxpr is a data structure that can be evaluated like a mini functional programming language and \n", + "thus Jaxprs are a useful intermediate representation\n", + "for function transformation. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "pH7s63lpaHJO" + }, + "source": [ + "To get a first look at Jaxprs, consider the `make_jaxpr` transformation. `make_jaxpr` is essentially a \"pretty-printing\" transformation:\n", + "it transforms a function into one that, given example arguments, produces a Jaxpr representation of its computation.\n", + "Although we can't generally use the Jaxprs that it returns, it is useful for debugging and introspection.\n", + "Let's use it to look at how some example Jaxprs\n", + "are structured." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "height": 547 + }, + "colab_type": "code", + "id": "RSxEiWi-EeYW", + "outputId": "ee3d4f5c-97d3-4db3-a012-20898920cadb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "foo\n", + "=====\n", + "invars: [a]\n", + "outvars: [b]\n", + "constvars: []\n", + "freevars: []\n", + "equation: [a, 1] add [b] {}\n", + "\n", + "jaxpr: { lambda ; ; a.\n", + " let b = add a 1\n", + " in [b] }\n", + "\n", + "\n", + "bar\n", + "=====\n", + "invars: [a, b, c]\n", + "outvars: [g, c]\n", + "constvars: [f]\n", + "freevars: []\n", + "equation: [a, c] dot_general [d] {'dimension_numbers': (((1,), (0,)), ((), ())), 'precision': None}\n", + "equation: [d, b] add [e] {}\n", + "equation: [e, f] add [g] {}\n", + "\n", + "jaxpr: { lambda f ; ; a b c.\n", + " let d = dot_general[ dimension_numbers=(((1,), (0,)), ((), ()))\n", + " precision=None ] a c\n", + " e = add d b\n", + " g = add e f\n", + " in [g, c] }\n", + "\n" + ] + } + ], + "source": [ + "def examine_jaxpr(jaxpr):\n", + " print(\"invars:\", jaxpr.invars)\n", + " print(\"outvars:\", jaxpr.outvars)\n", + " print(\"constvars:\", jaxpr.constvars)\n", + " print(\"freevars:\", jaxpr.freevars)\n", + " for eqn in jaxpr.eqns:\n", + " print(\"equation:\", eqn.invars, eqn.primitive, eqn.outvars, eqn.params)\n", + " print()\n", + " print(\"jaxpr:\", jaxpr)\n", + "\n", + "def foo(x):\n", + " return x + 1\n", + "print(\"foo\")\n", + "print(\"=====\")\n", + "examine_jaxpr(jax.make_jaxpr(foo)(5))\n", + "\n", + "print()\n", + "\n", + "def bar(w, b, x):\n", + " return np.dot(w, x) + b + np.ones(5), x\n", + "print(\"bar\")\n", + "print(\"=====\")\n", + "examine_jaxpr(jax.make_jaxpr(bar)(np.ones((5, 10)), np.ones(5), np.ones(10)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "k-HxK9iagnH6" + }, + "source": [ + "* `jaxpr.invars` - the `invars` of a Jaxpr are a list of the input variables to Jaxpr, analogous to arguments in Python functions\n", + "* `jaxpr.outvars` - the `outvars` of a Jaxpr are the variables that are returned by the Jaxpr. Every Jaxpr has multiple outputs.\n", + "* `jaxpr.constvars` - the `constvars` are a list of variables that are also inputs to the Jaxpr, but correspond to constants from the trace (we'll go over these in more detail later)\n", + "* `jaxpr.freevars` - these can arise when nesting `jit` and `pmap` transformations; we won't worry about them in this colab.\n", + "* `jaxpr.eqns` - a list of equations, which are essentially let-bindings. Each equation is list of input variables, a list of output variables, and a *primitive*, which is used to evaluate inputs to produce outputs. Each equation also has a set of `params`, a dictionary of keyword arguments to the primitive.\n", + "\n", + "All together, a Jaxpr encapsulates a simple program that can be evaluated with inputs to produce an output. We'll go over how exactly to do this later. The important thing to note now is that a Jaxpr is a data structure that can be manipulated and evaluated in whatever way we want." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "NwY7TurYn6sr" + }, + "source": [ + "### Why are Jaxprs useful?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "UEy6RorCgdYt" + }, + "source": [ + "Jaxprs are simple program representations that are easy to transform. And because Jax lets us stage out Jaxprs from Python functions, it gives us a way to transform numerical programs written in Python." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "qizTKpbno_ua" + }, + "source": [ + "## Your first interpreter: `invert`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "OIto-KX4pD7j" + }, + "source": [ + "Let's try to implement a simple function \"inverter\", which takes in the output of the original function and returns the inputs that produced those outputs. For now, let's focus on simple, unary functions which are composed of other invertible unary functions.\n", + "\n", + "Goal:\n", + "```python\n", + "def f(x):\n", + " return np.exp(np.tanh(x))\n", + "f_inv = inverse(f)\n", + "assert np.allclose(f_inv(f(1.0)), 1.0)\n", + "```\n", + "\n", + "The way we'll implement this is by (1) tracing `f` into a Jaxpr, then (2) interpreting the Jaxpr *backwards*. While interpreting the Jaxpr backwards, for each equation we'll look up the primitive's inverse in a table and apply it.\n", + "\n", + "### 1. Tracing a function\n", + "\n", + "We can't use `make_jaxpr` for this, because we need to pull out constants created during the trace to pass into the Jaxpr. However, we can write a function that does something very similar to `make_jaxpr`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "BHkg_3P1pXJj" + }, + "outputs": [], + "source": [ + "# Importing Jax functions useful for tracing/interpreting.\n", + "import numpy as onp\n", + "from functools import wraps\n", + "\n", + "from jax import api_util\n", + "from jax import core\n", + "from jax import lax\n", + "from jax import linear_util as lu\n", + "from jax import tree_util\n", + "from jax.abstract_arrays import ShapedArray\n", + "from jax.interpreters import partial_eval as pe\n", + "from jax.util import safe_map" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "aqHqPjuBqrl9" + }, + "outputs": [], + "source": [ + "def make_jaxpr2(fun):\n", + " \n", + " def pv_like(x):\n", + " # ShapedArrays are abstract values that carry around\n", + " # shape and dtype information\n", + " aval = ShapedArray(onp.shape(x), onp.result_type(x))\n", + " return pe.PartialVal((aval, core.unit))\n", + "\n", + " @wraps(fun)\n", + " def jaxpr_const_maker(*args, **kwargs):\n", + " # Set up fun for transformation\n", + " wrapped = lu.wrap_init(fun)\n", + " # Flatten input args\n", + " jax_args, in_tree = tree_util.tree_flatten((args, kwargs))\n", + " # Transform fun to accept flat args\n", + " # and return a flat list result\n", + " jaxtree_fun, out_tree = api_util.flatten_fun(wrapped, in_tree) \n", + " # Abstract and partial-val's flat args\n", + " pvals = safe_map(pv_like, jax_args)\n", + " # Trace function into Jaxpr\n", + " jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) \n", + " return jaxpr, consts, (in_tree, out_tree())\n", + " return jaxpr_const_maker" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "CpTml2PTrzZ4" + }, + "source": [ + "This function first flattens its arguments into a list, which are the abstracted and wrapped as partial values. The `pe.trace_to_jaxpr` function is used to then trace a function into a Jaxpr\n", + "from a list of partial value inputs." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "height": 119 + }, + "colab_type": "code", + "id": "Tc1REN5aq_fH", + "outputId": "2e6f2833-5139-48ef-da3f-01ea9cd6a7d3" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ lambda ; ; a.\n", + " let b = tanh a\n", + " c = exp b\n", + " in [c] }\n", + "\n", + "()\n" + ] + } + ], + "source": [ + "def f(x):\n", + " return np.exp(np.tanh(x))\n", + "jaxpr, consts, _ = make_jaxpr2(f)(np.ones(5))\n", + "print(jaxpr)\n", + "print(consts)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "WmZ3BcmZsbfR" + }, + "source": [ + "This particular function doesn't have any example constants, but in general, this is how you both trace into a Jaxpr and extract the constants.\n", + "\n", + "### 2. Evaluating a Jaxpr\n", + "\n", + "\n", + "Before we write a custom Jaxpr interpreter, let's first implement the \"default\" interpreter, `eval_jaxpr`, which evaluates the Jaxpr as-is, computing the same values that the original, un-transformed Python function would. \n", + "\n", + "To do this, we first create an environment to store the values for each of the variables, and update the environment with each equation we evaluate in the Jaxpr." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ACMxjIHStHwD" + }, + "outputs": [], + "source": [ + "def eval_jaxpr(jaxpr, consts, *args):\n", + " # Mapping from variable -> value\n", + " env = {}\n", + " \n", + " def read(var):\n", + " # Literals are values baked into the Jaxpr\n", + " if type(var) is core.Literal:\n", + " return var.val\n", + " return env[var]\n", + "\n", + " def write(var, val):\n", + " env[var] = val\n", + "\n", + " # Bind args and consts to environment\n", + " write(core.unitvar, core.unit)\n", + " safe_map(write, jaxpr.invars, args)\n", + " safe_map(write, jaxpr.constvars, consts)\n", + "\n", + " # Loop through equations and evaluate primitives using `bind`\n", + " for eqn in jaxpr.eqns:\n", + " # Read inputs to equation from environment\n", + " invals = safe_map(read, eqn.invars) \n", + " # `bind` is how a primitive is called\n", + " outvals = eqn.primitive.bind(*invals, **eqn.params)\n", + " # Primitives may return multiple outputs or not\n", + " if not eqn.primitive.multiple_results: \n", + " outvals = [outvals]\n", + " # Write the results of the primitive into the environment\n", + " safe_map(write, eqn.outvars, outvals) \n", + " # Read the final result of the Jaxpr from the environment\n", + " return safe_map(read, jaxpr.outvars) " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "height": 51 + }, + "colab_type": "code", + "id": "mGHPc3NruCFV", + "outputId": "3f459905-02ad-4f43-e70f-3db0a5ff58e4" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[DeviceArray([2.14168763, 2.14168763, 2.14168763, 2.14168763, 2.14168763],\n", + " dtype=float32)]" ] - }, - { - "cell_type": "code", - "metadata": { - "id": "3tjNk21CH4yZ", - "colab_type": "code", - "outputId": "4c6d2090-0558-4171-8dce-0ea681ef6e53", - "colab": { - "height": 51 - } - }, - "source": [ - "jit(vmap(grad(inverse(f))))((np.arange(5) + 1.) / 5.)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "DeviceArray([ 0. , 15.58493137, 2.25512528, 1.31550276,\n", - " 1. ], dtype=float32)" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 18 - } + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "jaxpr, consts, _ = make_jaxpr2(f)(np.ones(5))\n", + "eval_jaxpr(jaxpr, consts, np.ones(5))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "XhZhzbVBvAiT" + }, + "source": [ + "Notice that `eval_jaxpr` will always return a list even if the original function does not. To \"unflatten\" the list into what the function was originally supposed to return, we can use the `out_tree` object returned by `trace`. \n", + "\n", + "Furthermore, this interpreter does not handle `subjaxprs`, which we will not cover in this guide. You can refer to `core.eval_jaxpr` ([link](https://github.com/google/jax/blob/master/jax/core.py#L185-L212)) to see the edge cases that this interpreter does not cover." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "0vb2ZoGrCMM4" + }, + "source": [ + "\n", + "### Custom `inverse` Jaxpr interpreter\n", + "\n", + "An `inverse` interpreter doesn't look too different from `eval_jaxpr`. We'll first set up the registry which will map primitives to their inverses. We'll then write a custom interpreter that looks up primitives in the registry.\n", + "\n", + "It turns out that this interpreter will also look similar to the \"transpose\" interpreter used in reverse-mode autodifferentiation [found here](https://github.com/google/jax/blob/master/jax/interpreters/ad.py#L141-L187).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "gSMIT2z1vUpO" + }, + "outputs": [], + "source": [ + "inverse_registry = {}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "JgrpMgDyCrC7" + }, + "source": [ + "We'll now register inverses for some of the primitives. By convention, primitives in Jax end in `_p` and a lot of the popular ones live in `lax`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "fUerorGkCqhw" + }, + "outputs": [], + "source": [ + "inverse_registry[lax.exp_p] = np.log\n", + "inverse_registry[lax.tanh_p] = np.arctanh" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "mDtH_lYDC5WK" + }, + "source": [ + "`inverse` will first trace the function, then custom-interpret the Jaxpr. Let's set up a simple skeleton." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "jGNfV6JJC1B3" + }, + "outputs": [], + "source": [ + "def inverse(fun):\n", + " @wraps(fun)\n", + " def wrapped(*args, **kwargs):\n", + " # Since we assume unary functions, we won't\n", + " # worry about flattening and\n", + " # unflattening arguments\n", + " jaxpr, consts, _ = make_jaxpr2(fun)(*args, **kwargs)\n", + " out = inverse_jaxpr(jaxpr, consts, *args)\n", + " return out[0]\n", + " return wrapped" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "g6v6wV7SDM7g" + }, + "source": [ + "Now we just need to define `inverse_jaxpr`, which will walk through the Jaxpr backward and invert primitives when it can." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "uUAd-L-BDKT5" + }, + "outputs": [], + "source": [ + "def inverse_jaxpr(jaxpr, consts, *args):\n", + " env = {}\n", + " \n", + " def read(var):\n", + " if type(var) is core.Literal:\n", + " return var.val\n", + " return env[var]\n", + "\n", + " def write(var, val):\n", + " env[var] = val\n", + " # Args now correspond to Jaxpr outvars\n", + " write(core.unitvar, core.unit)\n", + " safe_map(write, jaxpr.outvars, args)\n", + " safe_map(write, jaxpr.constvars, consts)\n", + "\n", + " # Looping backward\n", + " for eqn in jaxpr.eqns[::-1]:\n", + " # outvars are now invars \n", + " invals = safe_map(read, eqn.outvars)\n", + " if eqn.primitive not in inverse_registry:\n", + " raise NotImplementedError(\"{} does not have registered inverse.\".format(\n", + " eqn.primitive\n", + " ))\n", + " # Assuming a unary function \n", + " outval = inverse_registry[eqn.primitive](*invals)\n", + " safe_map(write, eqn.invars, [outval])\n", + " return safe_map(read, jaxpr.invars)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "M8i3wGbVERhA" + }, + "source": [ + "That's it!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "height": 71 + }, + "colab_type": "code", + "id": "cjEKWso-D5Bu", + "outputId": "54e73a42-a908-448c-d6d5-e6d0fe9adbf9" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/google/home/sharadmv/workspace/jax/jax/numpy/lax_numpy.py:220: RuntimeWarning: divide by zero encountered in arctanh\n", + " return _dtype(op(*args))\n" + ] + } + ], + "source": [ + "def f(x):\n", + " return np.exp(np.tanh(x))\n", + "f_inv = inverse(f)\n", + "assert np.allclose(f_inv(f(1.0)), 1.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Ny7Oo4WLHdXt" + }, + "source": [ + "Importantly, you can trace through a Jaxpr interpreter." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "height": 238 + }, + "colab_type": "code", + "id": "j6ov_rveHmTb", + "outputId": "a7a9b4be-f284-4e78-c469-d84e352d838d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{ lambda ; ; a.\n", + " let b = log a\n", + " c = abs b\n", + " d = le c 1.0\n", + " e = add b 1.0\n", + " f = sub 1.0 b\n", + " g = div e f\n", + " h = log g\n", + " i = mul h 0.5\n", + " j = tie_in b nan\n", + " k = broadcast[ sizes=() ] j\n", + " l = select d i k\n", + " in [l] }" ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "APtG-u_6E4tK", - "colab_type": "text" - }, - "source": [ - "## Exercises for the reader\n", - "\n", - "* Handle primitives with multiple arguments where inputs are partially known, for example `lax.add_p`, `lax.mul_p`.\n", - "* Handle `xla_call` and `pmap` primitives, which will not work with both `eval_jaxpr` and `inverse_jaxpr` as written." + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "jax.make_jaxpr(inverse(f))(f(1.))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "yfWVBsKwH0j6" + }, + "source": [ + "That's all it takes to add a new transformation to a system, and you get composition with all the others for free! For example, we can use `jit`, `vmap`, and `grad` with `inverse`!" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "height": 51 + }, + "colab_type": "code", + "id": "3tjNk21CH4yZ", + "outputId": "4c6d2090-0558-4171-8dce-0ea681ef6e53" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "DeviceArray([ 0. , 15.58493137, 2.25512528, 1.31550276,\n", + " 1. ], dtype=float32)" ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" } - ] + ], + "source": [ + "jit(vmap(grad(inverse(f))))((np.arange(5) + 1.) / 5.)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "APtG-u_6E4tK" + }, + "source": [ + "## Exercises for the reader\n", + "\n", + "* Handle primitives with multiple arguments where inputs are partially known, for example `lax.add_p`, `lax.mul_p`.\n", + "* Handle `xla_call` and `xla_pmap` primitives, which will not work with both `eval_jaxpr` and `inverse_jaxpr` as written." + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "Writing custom interpreters in Jax", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 } From 72eb6b33fedee78a943553ff1736e98c158f5da9 Mon Sep 17 00:00:00 2001 From: mtthss Date: Mon, 4 Nov 2019 15:43:17 +0000 Subject: [PATCH 0296/1053] Add gradient noise function --- jax/experimental/optix.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 577f0094e462..57b73147401f 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -284,6 +284,42 @@ def update_fn(updates, state): return init_fn, update_fn +AddNoiseState = collections.namedtuple("AddNoiseState", "count rng_key") + + +def add_noise(eta, gamma, seed): + """Add gradient noise. + + References: + [Neelakantan et al, 2014](https://arxiv.org/abs/1511.06807) + + Args: + eta: base variance of the gaussian noise added to the gradient. + gamma: decay exponent for annealing of the variance. + seed: seed for random number generation. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(_): + return AddNoiseState(count=jnp.zeros([]), rng_key=jrandom.PRNGKey(seed)) + + def update_fn(updates, state): + num_vars = len(tree_leaves(updates)) + treedef = tree_structure(updates) + variance = eta / (1 + state.count) ** gamma + keys = jrandom.split(rng_key, num=num_vars + 1) + keys = tree_unflatten(treedef, keys[1:]) + noise = tree_multimap( + lambda g, k: jrandom.normal(k, shape=g.shape), updates, keys) + updates = tree_multimap( + lambda g, n: g + variance * n, updates, noise) + return updates, AddNoiseState(count=state.count + 1, rng_key=keys[0]) + + return init_fn, update_fn + + ### Utilities for building and using custom optimizers. ### From b77d2a61e041d4ae50d7dbd19b5782a4dbfabdf5 Mon Sep 17 00:00:00 2001 From: mtthss Date: Mon, 4 Nov 2019 15:55:14 +0000 Subject: [PATCH 0297/1053] create noisy_sgd variant --- jax/experimental/optix.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 57b73147401f..829eabc610e5 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -380,6 +380,13 @@ def sgd(learning_rate, momentum=0., nesterov=False): scale(-learning_rate)) +def noisy_sgd(learning_rate, eta=0.01, gamma=0.55, seed=42): + return chainer( + trace(decay=0., nesterov=False), + scale(-learning_rate), + add_noise(eta, gamma, seed)) + + def adam(learning_rate, b1=0.9, b2=0.999, eps=1e-8): return chainer( scale_by_adam(b1=b1, b2=b2, eps=eps), From 6b33d54b6a43b80d326fd8e6fecef7a09a05d519 Mon Sep 17 00:00:00 2001 From: mtthss Date: Mon, 4 Nov 2019 16:05:20 +0000 Subject: [PATCH 0298/1053] rename to --- jax/experimental/optix.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 829eabc610e5..9ca248c6f0f1 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -22,9 +22,9 @@ * an `init_fn`, to initialize a (possibly empty) set of statistics, or `state`. * an `update_fn` to transform an input gradient and update the state. -An (optional) `chainer` utility can be used to build custom optimizers by +An (optional) `chain` utility can be used to build custom optimizers by chaining arbitrary sequences of transformations. For any sequence of -transformations `chainer` returns a single `init_fn` and `update_fn`. +transformations `chain` returns a single `init_fn` and `update_fn`. An (optional) `apply_updates` function can be used to eventually apply the transformed gradients to the set of parameters of interest. @@ -323,10 +323,10 @@ def update_fn(updates, state): ### Utilities for building and using custom optimizers. ### -def chainer(*args): +def chain(*args): """Applies a list of chainable update transformations. - Given a sequence of chainable transforms, `chainer` returns an `init_fn` + Given a sequence of chainable transforms, `chain` returns an `init_fn` that constructs a `state` by concatenating the states of the individual transforms, and returns an `update_fn` which chains the update transformations feeding the appropriate state to each. @@ -375,30 +375,30 @@ def apply_updates(params, updates): def sgd(learning_rate, momentum=0., nesterov=False): - return chainer( + return chain( trace(decay=momentum, nesterov=nesterov), scale(-learning_rate)) def noisy_sgd(learning_rate, eta=0.01, gamma=0.55, seed=42): - return chainer( + return chain( trace(decay=0., nesterov=False), scale(-learning_rate), add_noise(eta, gamma, seed)) def adam(learning_rate, b1=0.9, b2=0.999, eps=1e-8): - return chainer( + return chain( scale_by_adam(b1=b1, b2=b2, eps=eps), scale(-learning_rate)) def rmsprop(learning_rate, decay=0.9, eps=1e-8, centered=False): if not centered: - return chainer( + return chain( scale_by_rms(decay=decay, eps=eps), scale(-learning_rate)) else: - return chainer( + return chain( scale_by_stddev(decay=decay, eps=eps), scale(-learning_rate)) From 8d1b58334eec051eeafe73b6cd48eae7f7cdd244 Mon Sep 17 00:00:00 2001 From: mtthss Date: Mon, 4 Nov 2019 16:21:09 +0000 Subject: [PATCH 0299/1053] missing imports for grad_noise --- jax/experimental/optix.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 9ca248c6f0f1..fd6eaffc2afa 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -45,8 +45,12 @@ import collections from jax import numpy as jnp +from jax import random as jrandom + from jax.tree_util import tree_leaves from jax.tree_util import tree_multimap +from jax.tree_util import tree_structure +from jax.tree_util import tree_unflatten ### Composable gradient transformations. ### @@ -305,7 +309,7 @@ def add_noise(eta, gamma, seed): def init_fn(_): return AddNoiseState(count=jnp.zeros([]), rng_key=jrandom.PRNGKey(seed)) - def update_fn(updates, state): + def update_fn(updates, state): # pylint: disable=missing-docstring num_vars = len(tree_leaves(updates)) treedef = tree_structure(updates) variance = eta / (1 + state.count) ** gamma From cf81c834d5a42baf1814c5d8c7860b38d97deed4 Mon Sep 17 00:00:00 2001 From: mtthss Date: Mon, 4 Nov 2019 17:00:26 +0000 Subject: [PATCH 0300/1053] fix indexing of next random key --- jax/experimental/optix.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index fd6eaffc2afa..6aeca8d883d6 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -313,13 +313,13 @@ def update_fn(updates, state): # pylint: disable=missing-docstring num_vars = len(tree_leaves(updates)) treedef = tree_structure(updates) variance = eta / (1 + state.count) ** gamma - keys = jrandom.split(rng_key, num=num_vars + 1) - keys = tree_unflatten(treedef, keys[1:]) + all_keys = jrandom.split(state.rng_key, num=num_vars + 1) noise = tree_multimap( - lambda g, k: jrandom.normal(k, shape=g.shape), updates, keys) + lambda g, k: jrandom.normal(k, shape=g.shape), + updates, tree_unflatten(treedef, all_keys[1:])) updates = tree_multimap( lambda g, n: g + variance * n, updates, noise) - return updates, AddNoiseState(count=state.count + 1, rng_key=keys[0]) + return updates, AddNoiseState(count=state.count + 1, rng_key=all_keys[0]) return init_fn, update_fn From d4a2a2194d29af35e28e82129dcb9cd485023e08 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 4 Nov 2019 16:23:06 -0800 Subject: [PATCH 0301/1053] Fix behavior of np.logaddexp/logaddexp2 and scipy.special.logsumexp for inf and nan inputs. (#1626) --- jax/numpy/lax_numpy.py | 13 ++++++++++--- jax/scipy/special.py | 1 + tests/lax_numpy_test.py | 8 +++++--- tests/lax_scipy_test.py | 5 ++++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e1875a3105c0..9b11fa4c75c1 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -516,7 +516,10 @@ def logaddexp(x1, x2): x1, x2 = _promote_shapes("logaddexp", *_promote_to_result_dtype(onp.logaddexp, x1, x2)) amax = lax.max(x1, x2) - return lax.add(amax, lax.log1p(lax.exp(-lax.abs(lax.sub(x1, x2))))) + delta = lax.sub(x1, x2) + return lax.select(isnan(delta), + lax.add(x1, x2), # NaNs or infinities of the same sign. + lax.add(amax, lax.log1p(lax.exp(-lax.abs(delta))))) @_wraps(onp.logaddexp2) @@ -524,8 +527,12 @@ def logaddexp2(x1, x2): x1, x2 = _promote_shapes("logaddexp2", *_promote_to_result_dtype(onp.logaddexp2, x1, x2)) amax = lax.max(x1, x2) - return lax.add(amax, lax.div(lax.log1p(exp2(-lax.abs(lax.sub(x1, x2)))), - _constant_like(x1, onp.log(2)))) + delta = lax.sub(x1, x2) + return lax.select(isnan(delta), + lax.add(x1, x2), # NaNs or infinities of the same sign. + lax.add(amax, lax.div(lax.log1p(exp2(-lax.abs(delta))), + _constant_like(x1, onp.log(2))))) + @_wraps(onp.log2) def log2(x): diff --git a/jax/scipy/special.py b/jax/scipy/special.py index aca38291bf58..975c0c775e98 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -81,6 +81,7 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False): shape = lax.subvals(onp.shape(a), zip(dims, (1,) * len(dims))) dimadd = lambda x: lax.reshape(x, shape) amax = lax.reduce(a, _constant_like(a, -onp.inf), lax.max, dims) + amax = lax.select(lax.is_finite(amax), amax, lax.full_like(amax, 0)) amax_singletons = dimadd(amax) out = lax.add(lax.log(lax.reduce(lax.exp(lax.sub(a, amax_singletons)), _constant_like(a, 0), lax.add, dims)), amax) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index fb82ec441fe8..a1a2937cde99 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -191,9 +191,11 @@ def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, test_name="log1p_large", tolerance={onp.float64: 1e-12}), op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), [], tolerance={onp.float64: 1e-12}), - op_record("logaddexp", 2, float_dtypes, all_shapes, jtu.rand_default(), ["rev"], + op_record("logaddexp", 2, float_dtypes, all_shapes, + jtu.rand_some_inf_and_nan(), ["rev"], tolerance={onp.float64: 1e-12}), - op_record("logaddexp2", 2, float_dtypes, all_shapes, jtu.rand_default(), ["rev"], + op_record("logaddexp2", 2, float_dtypes, all_shapes, + jtu.rand_some_inf_and_nan(), ["rev"], tolerance={onp.float16: 1e-2}), op_record("polyval", 2, number_dtypes, nonempty_nonscalar_array_shapes, jtu.rand_default(), [], check_dtypes=False, @@ -1851,7 +1853,7 @@ def testMathSpecialFloatValues(self, op, dtype): onp_op = getattr(onp, op) lnp_op = getattr(lnp, op) dtype = onp.dtype(xla_bridge.canonicalize_dtype(dtype)).type - for x in (onp.nan, -onp.inf, -100., -2. -1., 0., 1., 2., 100., onp.inf, + for x in (onp.nan, -onp.inf, -100., -2., -1., 0., 1., 2., 100., onp.inf, lnp.finfo(dtype).max, onp.sqrt(lnp.finfo(dtype).max), onp.sqrt(lnp.finfo(dtype).max) * 2.): if onp.isnan(x) and op in ("sinh", "cosh", "expm1", "exp"): diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index f2cc75ee66d0..c78310c3dbc6 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -84,7 +84,10 @@ def _GetArgsMaker(self, rng, shapes, dtypes): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_axis={}_keepdims={}".format( jtu.format_shape_dtype_string(shape, dtype), axis, keepdims), - "rng": jtu.rand_default(), "shape": shape, "dtype": dtype, + # TODO(b/133842870): re-enable when exp(nan) returns NaN on CPU. + "rng": jtu.rand_some_inf_and_nan() if jtu.device_under_test() != "cpu" + else jtu.rand_default(), + "shape": shape, "dtype": dtype, "axis": axis, "keepdims": keepdims} for shape in all_shapes for dtype in float_dtypes for axis in range(-len(shape), len(shape)) From 077fe26f4f0e30e9d27f97275856df915704b95a Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 5 Nov 2019 15:00:21 -0800 Subject: [PATCH 0302/1053] A more obvious implementation, and a test. Addressed review comments --- jax/lax/lax_control_flow.py | 33 ++++++++++++++++++++++++--------- tests/lax_control_flow_test.py | 16 ++++++++++++++++ 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index daadc051343e..56f02ffa912e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -245,9 +245,11 @@ def _while_loop_batching_rule(args, dims, cond_nconsts, cond_jaxpr, # Fixpoint computation of which carry are batched: either # batched from init, or the carry out is batched. Each iteration promotes - # at least one carry to batched. + # at least one carry to batched. We need at most len(carry) iterations, + # but we need one last iteration to prepare the jaxpr based on the final + # carry_bat. carry_bat = init_bat - while True: + for _ in range(1 + len(carry_bat)): batched = bconst_bat + carry_bat body_jaxpr_batched, carry_bat_out = batching.batch_jaxpr( body_jaxpr, size, batched, instantiate=carry_bat) @@ -258,6 +260,8 @@ def _while_loop_batching_rule(args, dims, cond_nconsts, cond_jaxpr, break else: carry_bat = _map(operator.or_, carry_bat, carry_bat_out) + else: + assert False, "Fixpoint not reached" consts, init = split_list(args, [cond_nconsts + body_nconsts]) const_dims, init_dims = split_list(dims, [cond_nconsts + body_nconsts]) @@ -539,9 +543,11 @@ def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, # Fixpoint computation of which carry are not ad.zero: either # non-zero from init, or the carry out is non-zero. Each iteration promotes - # at least one carry to non-zero. + # at least one carry to non-zero. We need at most len(carry) iterations, + # but we need one last iteration to prepare the jaxpr based on the final + # carry_nz. carry_nz = init_nz - while True: + for _ in range(1 + len(carry_nz)): nonzeros = const_nz + carry_nz + xs_nz jaxpr_jvp, nonzeros_out = ad.jvp_jaxpr( jaxpr, nonzeros, instantiate=carry_nz + [False] * num_ys) @@ -550,6 +556,8 @@ def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, break else: carry_nz = _map(operator.or_, carry_nz, carry_nz_out) + else: + assert False, "Fixpoint not reached" tangents = [ad.instantiate_zeros(x, t) if t is ad_util.zero and nz else t for x, t, nz in zip(primals, tangents, nonzeros)] @@ -594,9 +602,11 @@ def _scan_partial_eval(trace, *tracers, **kwargs): # Fixpoint computation of which carry are unknown (not a constant): either # unknown from init, or the carry out is unknown. Each iteration promotes - # at least one carry to unknown. + # at least one carry to unknown. We need at most len(carry) iterations, + # but we need one last iteration to prepare the jaxpr based on the final + # carry_uk. carry_uk = init_uk - while True: + for _ in range(1 + len(carry_uk)): unknowns = const_uk + carry_uk + xs_uk jaxpr_1, jaxpr_2, out_uk = pe.partial_eval_jaxpr( jaxpr, unknowns, instantiate=carry_uk + [False] * num_ys) @@ -605,7 +615,8 @@ def _scan_partial_eval(trace, *tracers, **kwargs): break else: carry_uk = _map(operator.or_, carry_uk, carry_uk_out) - + else: + assert False, "Fixpoint not reached" in_consts = [core.unit if uk else t.pval[1] for uk, t in zip(unknowns, tracers)] new_tracers = [trace.instantiate_const(t) if uk else trace.new_instantiated_literal(core.unit) @@ -709,9 +720,11 @@ def _scan_batching_rule(args, dims, forward, length, jaxpr, num_consts, # Fixpoint computation of which carry are batched: either # batched from init, or the carry out is batched. Each iteration promotes - # at least one carry to batched. + # at least one carry to batched. We need at most len(carry) iterations, + # but we need one last iteration to prepare the jaxpr based on the final + # carry_batched. carry_batched = init_batched - while True: + for _ in range(1 + len(carry_batched)): batched = const_batched + carry_batched + xs_batched jaxpr_batched, batched_out = batching.batch_jaxpr( jaxpr, size, batched, instantiate=carry_batched + [False] * num_ys) @@ -720,6 +733,8 @@ def _scan_batching_rule(args, dims, forward, length, jaxpr, num_consts, break else: carry_batched = _map(operator.or_, carry_batched, carry_batched_out) + else: + assert False, "Fixpoint not reached" consts, init, xs = split_list(args, [num_consts, num_carry]) consts_bdims, init_bdims, xs_bdims = split_list(dims, [num_consts, num_carry]) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index b5f185aa5c9e..1f5c0c82bcf3 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -950,6 +950,22 @@ def f(c, a): ans = api.vmap(lambda c, as_: lax.scan(f, c, as_), in_axes)(c, as_) self.assertAllClose(ans, expected, check_dtypes=False) + def testScanVmapFixpoint(self): + def f(carry_init): + def scan_body(c, x): + # The carry is a 4-tuple, the last element starts batched, + # and the carry is shifted left at each iteration. + return ((c[1], c[2], c[3], 0.), None) + return lax.scan(scan_body, (0., 1., 2., carry_init), np.zeros(2)) + carry_init = np.array([3., 4., 5.]) + carry_out, _ = api.vmap(f)(carry_init) + self.assertAllClose(carry_out[3], np.array([0., 0., 0.]), check_dtypes=False) + self.assertAllClose(carry_out[2], np.array([0., 0., 0.]), check_dtypes = False) + # After two shifts, we get the carry_init + self.assertAllClose(carry_out[1], carry_init, check_dtypes=False) + self.assertAllClose(carry_out[0], np.array([2., 2., 2.]), check_dtypes = False) + + # TODO(mattjj, dougalm): fix this test when skip_checks is False def testIssue757(self): # code from https://github.com/google/jax/issues/757 From b62fe17a77ba24127a17bb339903c13521754bc9 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 5 Nov 2019 16:25:53 -0800 Subject: [PATCH 0303/1053] update version number for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index ceb382a1a120..31b372f4803a 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.49" +__version__ = "0.1.50" From 67a9247ebe76a691690dba429b5352c7dcd2af1f Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 5 Nov 2019 16:52:46 -0800 Subject: [PATCH 0304/1053] avoid staging out some trivial convert_element_types --- jax/lax/lax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index d418e25cdc98..684f7b557949 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -349,7 +349,7 @@ def convert_element_type(operand, new_dtype): An array with the same shape as `operand`, cast elementwise to `new_dtype`. """ new_dtype = xla_bridge.canonicalize_dtype(new_dtype) - old_dtype = _dtype(operand) + old_dtype = xla_bridge.canonicalize_dtype(_dtype(operand)) if old_dtype != new_dtype: if (onp.issubdtype(old_dtype, onp.complexfloating) and not onp.issubdtype(new_dtype, onp.complexfloating)): From b90f65e4ee69bd026f45f76b32ac874cc4fd94b9 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 6 Nov 2019 08:36:53 -0800 Subject: [PATCH 0305/1053] Fix transpose rule for psum. (#1633) Add check_grads test for grad(pmap(psum(...))). --- jax/lax/lax_parallel.py | 2 +- tests/pmap_test.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 062fdb2bfd22..8e0f56bcd286 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -208,7 +208,7 @@ def _psum_translation_rule(c, val, replica_groups, backend=None): partial(_allreduce_split_axis_rule, psum_p, lax._reduce_sum) xla.parallel_translations[psum_p] = _psum_translation_rule pxla.parallel_pure_rules[psum_p] = lambda x, shape: x * prod(shape) -ad.deflinear(psum_p, lambda t, axis_name: [t]) +ad.deflinear(psum_p, lambda t, axis_name: [psum(t, axis_name)]) pmax_p = standard_pmap_primitive('pmax') diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 7da47b7e9c38..e7b19fd6aab8 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -23,6 +23,7 @@ from absl.testing import absltest from absl.testing import parameterized +import jax import jax.numpy as np from jax import test_util as jtu from jax import core @@ -146,6 +147,15 @@ def f(x): expected = grad(lambda x: np.sum(f(x)))(x) self.assertAllClose(ans, expected, check_dtypes=False) + def testGradOfPsum(self): + @partial(pmap, axis_name='i') + def f(x): + return lax.psum(x, axis_name='i') + + shape = (jax.device_count(), 4) + x = onp.arange(prod(shape), dtype=onp.float32).reshape(shape) + jtu.check_grads(f, (x,), 2, ["fwd", "rev"], 1e-2, 1e-2, eps=1.) + def testGradOfJvp(self): @partial(pmap, axis_name='i') def f(x): From c0776823ba8da82538d104d8f7e0fce5a297f648 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 6 Nov 2019 08:56:29 -0800 Subject: [PATCH 0306/1053] Disable complex eigvalsh test on TPU. (#1634) --- tests/linalg_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 072879af779c..4fed27e5708a 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -245,6 +245,9 @@ def norm(x): for rng in [jtu.rand_default()])) def testEigvalsh(self, shape, dtype, rng): _skip_if_unsupported_type(dtype) + if jtu.device_under_test() == "tpu": + if np.issubdtype(dtype, np.complexfloating): + raise unittest.SkipTest("No complex eigh on TPU") n = shape[-1] def args_maker(): a = rng((n, n), dtype) From bd851ee59f3424cf20a470f54de524b022b98255 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 7 Nov 2019 10:14:16 -0800 Subject: [PATCH 0307/1053] fix indexing error after #1622 involving empty result --- jax/numpy/lax_numpy.py | 4 +++- tests/lax_numpy_indexing_test.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 9b11fa4c75c1..64b34b7685df 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2557,7 +2557,9 @@ def _gather(arr, treedef, static_idx, dynamic_idx): indexer = _index_to_gather(shape(arr), idx) # shared with _scatter_update y = arr - if indexer.gather_indices.size: + # We avoid generating a gather when indexer.gather_indices.size is empty + # unless indexer.slice_shape also corresponds to an empty array. + if indexer.gather_indices.size or not prod(indexer.slice_shape): y = lax.gather(y, indexer.gather_indices, indexer.dnums, indexer.gather_slice_shape) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index f362ce030f12..751b244313b8 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -736,6 +736,15 @@ def testTrivialGatherIsntGenerated(self): self.assertEqual(len(jaxpr.eqns), 1) self.assertNotIn('gather', str(jaxpr)) + def testBooleanIndexingWithEmptyResult(self): + # based on a TensorFlow Probability test that started failing after #1622 + x = lnp.array([-1]) + mask = lnp.array([False]) + ans = x[mask] # doesn't crash + + expected = onp.array([-1])[onp.array([False])] + self.assertAllClose(ans, expected, check_dtypes=False) + def _broadcastable_shapes(shape): """Returns all shapes that broadcast to `shape`.""" From 4be1d1878d86f7ebaf06c08b2f9f6752659fff49 Mon Sep 17 00:00:00 2001 From: pzielinski-nyc <57502161+pzielinski-nyc@users.noreply.github.com> Date: Thu, 7 Nov 2019 17:03:03 -0500 Subject: [PATCH 0308/1053] Add missing parameter to make_tuple (#1642) --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index b8be8c2320b6..0f4f9561fb54 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -465,7 +465,7 @@ def _execute_replicated(compiled, backend, handlers, tuple_args, *args): [device_put(x, device, backend=backend) for x in args if x is not token] for device in compiled.local_devices()] if tuple_args: - input_bufs = [[make_tuple(bufs, device)] for bufs, device in + input_bufs = [[make_tuple(bufs, device, backend)] for bufs, device in zip(input_bufs, compiled.local_devices())] out_bufs = compiled.ExecutePerReplica(input_bufs)[0].destructure() if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) From 1d8157810d7cdaa92dfaae7c00e5bf58dac4ca08 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 8 Nov 2019 10:15:17 -0800 Subject: [PATCH 0309/1053] typo: use _prod not prod --- jax/numpy/lax_numpy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 64b34b7685df..037650637211 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2559,7 +2559,7 @@ def _gather(arr, treedef, static_idx, dynamic_idx): # We avoid generating a gather when indexer.gather_indices.size is empty # unless indexer.slice_shape also corresponds to an empty array. - if indexer.gather_indices.size or not prod(indexer.slice_shape): + if indexer.gather_indices.size or not _prod(indexer.slice_shape): y = lax.gather(y, indexer.gather_indices, indexer.dnums, indexer.gather_slice_shape) From 4b66d9578246816633e2a13177df955bff4cf84b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 8 Nov 2019 12:49:07 -0800 Subject: [PATCH 0310/1053] Fix integer overflow for large matrices in linear algebra kernels. (#1648) --- jaxlib/cusolver.cc | 57 +++++++++++++++++++----------- jaxlib/lapack.pyx | 86 ++++++++++++++++++++++++++++------------------ 2 files changed, 89 insertions(+), 54 deletions(-) diff --git a/jaxlib/cusolver.cc b/jaxlib/cusolver.cc index 190b6b73754e..4e9937f1d1d1 100644 --- a/jaxlib/cusolver.cc +++ b/jaxlib/cusolver.cc @@ -14,6 +14,7 @@ limitations under the License. ==============================================================================*/ #include +#include #include #include #include @@ -256,9 +257,11 @@ void Getrf(cudaStream_t stream, void** buffers, const char* opaque, *UnpackDescriptor(opaque, opaque_len); auto handle = SolverHandlePool::Borrow(stream); if (buffers[1] != buffers[0]) { - ThrowIfError(cudaMemcpyAsync(buffers[1], buffers[0], - SizeOfType(d.type) * d.batch * d.m * d.n, - cudaMemcpyDeviceToDevice, stream)); + ThrowIfError(cudaMemcpyAsync( + buffers[1], buffers[0], + SizeOfType(d.type) * static_cast(d.batch) * + static_cast(d.m) * static_cast(d.n), + cudaMemcpyDeviceToDevice, stream)); } int* ipiv = static_cast(buffers[2]); @@ -360,9 +363,11 @@ void Geqrf(cudaStream_t stream, void** buffers, const char* opaque, *UnpackDescriptor(opaque, opaque_len); auto handle = SolverHandlePool::Borrow(stream); if (buffers[1] != buffers[0]) { - ThrowIfError(cudaMemcpyAsync(buffers[1], buffers[0], - SizeOfType(d.type) * d.batch * d.m * d.n, - cudaMemcpyDeviceToDevice, stream)); + ThrowIfError(cudaMemcpyAsync( + buffers[1], buffers[0], + SizeOfType(d.type) * static_cast(d.batch) * + static_cast(d.m) * static_cast(d.n), + cudaMemcpyDeviceToDevice, stream)); } int* info = static_cast(buffers[3]); @@ -471,9 +476,11 @@ void Orgqr(cudaStream_t stream, void** buffers, const char* opaque, *UnpackDescriptor(opaque, opaque_len); auto handle = SolverHandlePool::Borrow(stream); if (buffers[2] != buffers[0]) { - ThrowIfError(cudaMemcpyAsync(buffers[2], buffers[0], - SizeOfType(d.type) * d.batch * d.m * d.n, - cudaMemcpyDeviceToDevice, stream)); + ThrowIfError(cudaMemcpyAsync( + buffers[2], buffers[0], + SizeOfType(d.type) * static_cast(d.batch) * + static_cast(d.m) * static_cast(d.n), + cudaMemcpyDeviceToDevice, stream)); } int* info = static_cast(buffers[3]); @@ -582,9 +589,11 @@ void Syevd(cudaStream_t stream, void** buffers, const char* opaque, const SyevdDescriptor& d = *UnpackDescriptor(opaque, opaque_len); auto handle = SolverHandlePool::Borrow(stream); - ThrowIfError(cudaMemcpyAsync(buffers[1], buffers[0], - SizeOfType(d.type) * d.batch * d.n * d.n, - cudaMemcpyDeviceToDevice, stream)); + ThrowIfError(cudaMemcpyAsync( + buffers[1], buffers[0], + SizeOfType(d.type) * static_cast(d.batch) * + static_cast(d.n) * static_cast(d.n), + cudaMemcpyDeviceToDevice, stream)); cusolverEigMode_t jobz = CUSOLVER_EIG_MODE_VECTOR; int* info = static_cast(buffers[3]); void* work = buffers[4]; @@ -723,9 +732,11 @@ void Syevj(cudaStream_t stream, void** buffers, const char* opaque, *UnpackDescriptor(opaque, opaque_len); auto handle = SolverHandlePool::Borrow(stream); if (buffers[1] != buffers[0]) { - ThrowIfError(cudaMemcpyAsync(buffers[1], buffers[0], - SizeOfType(d.type) * d.batch * d.n * d.n, - cudaMemcpyDeviceToDevice, stream)); + ThrowIfError(cudaMemcpyAsync( + buffers[1], buffers[0], + SizeOfType(d.type) * static_cast(d.batch) * + static_cast(d.n) * static_cast(d.n), + cudaMemcpyDeviceToDevice, stream)); } syevjInfo_t params; ThrowIfErrorStatus(cusolverDnCreateSyevjInfo(¶ms)); @@ -862,9 +873,11 @@ void Gesvd(cudaStream_t stream, void** buffers, const char* opaque, const GesvdDescriptor& d = *UnpackDescriptor(opaque, opaque_len); auto handle = SolverHandlePool::Borrow(stream); - ThrowIfError(cudaMemcpyAsync(buffers[1], buffers[0], - SizeOfType(d.type) * d.batch * d.m * d.n, - cudaMemcpyDeviceToDevice, stream)); + ThrowIfError(cudaMemcpyAsync( + buffers[1], buffers[0], + SizeOfType(d.type) * static_cast(d.batch) * + static_cast(d.m) * static_cast(d.n), + cudaMemcpyDeviceToDevice, stream)); int* info = static_cast(buffers[5]); void* work = buffers[6]; switch (d.type) { @@ -1036,9 +1049,11 @@ void Gesvdj(cudaStream_t stream, void** buffers, const char* opaque, const GesvdjDescriptor& d = *UnpackDescriptor(opaque, opaque_len); auto handle = SolverHandlePool::Borrow(stream); - ThrowIfError(cudaMemcpyAsync(buffers[1], buffers[0], - SizeOfType(d.type) * d.batch * d.m * d.n, - cudaMemcpyDeviceToDevice, stream)); + ThrowIfError(cudaMemcpyAsync( + buffers[1], buffers[0], + SizeOfType(d.type) * static_cast(d.batch) * + static_cast(d.m) * static_cast(d.n), + cudaMemcpyDeviceToDevice, stream)); int* info = static_cast(buffers[5]); void* work = buffers[6]; gesvdjInfo_t params; diff --git a/jaxlib/lapack.pyx b/jaxlib/lapack.pyx index 9af74007a191..6b9abbbd5041 100644 --- a/jaxlib/lapack.pyx +++ b/jaxlib/lapack.pyx @@ -21,7 +21,7 @@ from __future__ import print_function from libc.stdlib cimport malloc, free -from libc.stdint cimport int32_t +from libc.stdint cimport int32_t, int64_t from libc.string cimport memcpy from libcpp cimport bool as bool_t from libcpp.string cimport string @@ -65,7 +65,7 @@ cdef void blas_strsm(void* out, void** data) nogil: cdef float* x = (out) if x != b: - memcpy(x, b, m * n * sizeof(float)) + memcpy(x, b, (m) * (n) * sizeof(float)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -94,7 +94,7 @@ cdef void blas_dtrsm(void* out, void** data) nogil: cdef double* x = (out) if x != b: - memcpy(x, b, m * n * sizeof(double)) + memcpy(x, b, (m) * (n) * sizeof(double)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -124,7 +124,7 @@ cdef void blas_ctrsm(void* out, void** data) nogil: cdef float complex* x = (out) if x != b: - memcpy(x, b, m * n * sizeof(float complex)) + memcpy(x, b, (m) * (n) * sizeof(float complex)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -153,7 +153,7 @@ cdef void blas_ztrsm(void* out, void** data) nogil: cdef double complex* x = (out) if x != b: - memcpy(x, b, m * n * sizeof(double complex)) + memcpy(x, b, (m) * (n) * sizeof(double complex)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -233,7 +233,8 @@ cdef void lapack_sgetrf(void* out_tuple, void** data) nogil: cdef int* ipiv = (out[1]) cdef int* info = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float)) for i in range(b): sgetrf(&m, &n, a_out, &m, ipiv, info) @@ -255,7 +256,8 @@ cdef void lapack_dgetrf(void* out_tuple, void** data) nogil: cdef int* ipiv = (out[1]) cdef int* info = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double)) for i in range(b): dgetrf(&m, &n, a_out, &m, ipiv, info) @@ -277,7 +279,8 @@ cdef void lapack_cgetrf(void* out_tuple, void** data) nogil: cdef int* ipiv = (out[1]) cdef int* info = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float complex)) for i in range(b): cgetrf(&m, &n, a_out, &m, ipiv, info) @@ -299,7 +302,8 @@ cdef void lapack_zgetrf(void* out_tuple, void** data) nogil: cdef int* ipiv = (out[1]) cdef int* info = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double complex)) for i in range(b): zgetrf(&m, &n, a_out, &m, ipiv, info) @@ -390,7 +394,8 @@ cdef void lapack_sgeqrf(void* out_tuple, void** data) nogil: cdef float* work = (out[3]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float)) for i in range(b): sgeqrf(&m, &n, a_out, &m, tau, work, &lwork, info) @@ -421,7 +426,8 @@ cdef void lapack_dgeqrf(void* out_tuple, void** data) nogil: cdef double* work = (out[3]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double)) for i in range(b): dgeqrf(&m, &n, a_out, &m, tau, work, &lwork, info) @@ -452,7 +458,8 @@ cdef void lapack_cgeqrf(void* out_tuple, void** data) nogil: cdef float complex* work = (out[3]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float complex)) for i in range(b): cgeqrf(&m, &n, a_out, &m, tau, work, &lwork, info) @@ -483,7 +490,8 @@ cdef void lapack_zgeqrf(void* out_tuple, void** data) nogil: cdef double complex* work = (out[3]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double complex)) for i in range(b): zgeqrf(&m, &n, a_out, &m, tau, work, &lwork, info) @@ -580,7 +588,8 @@ cdef void lapack_sorgqr(void* out_tuple, void** data) nogil: cdef float* work = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float)) for i in range(b): sorgqr(&m, &n, &k, a_out, &m, tau, work, &lwork, info) @@ -612,7 +621,8 @@ cdef void lapack_dorgqr(void* out_tuple, void** data) nogil: cdef double* work = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double)) for i in range(b): dorgqr(&m, &n, &k, a_out, &m, tau, work, &lwork, info) @@ -644,7 +654,8 @@ cdef void lapack_cungqr(void* out_tuple, void** data) nogil: cdef float complex* work = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float complex)) for i in range(b): cungqr(&m, &n, &k, a_out, &m, tau, work, &lwork, info) @@ -676,7 +687,8 @@ cdef void lapack_zungqr(void* out_tuple, void** data) nogil: cdef double complex* work = (out[2]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double complex)) for i in range(b): zungqr(&m, &n, &k, a_out, &m, tau, work, &lwork, info) @@ -769,7 +781,7 @@ cdef void lapack_spotrf(void* out_tuple, void** data) nogil: cdef float* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, n * n * sizeof(float)) + memcpy(a_out, a_in, (n) * (n) * sizeof(float)) spotrf(&uplo, &n, a_out, &n, info) @@ -786,7 +798,7 @@ cdef void lapack_dpotrf(void* out_tuple, void** data) nogil: cdef double* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, n * n * sizeof(double)) + memcpy(a_out, a_in, (n) * (n) * sizeof(double)) dpotrf(&uplo, &n, a_out, &n, info) @@ -803,7 +815,7 @@ cdef void lapack_cpotrf(void* out_tuple, void** data) nogil: cdef float complex* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, n * n * sizeof(float complex)) + memcpy(a_out, a_in, (n) * (n) * sizeof(float complex)) cpotrf(&uplo, &n, a_out, &n, info) @@ -819,7 +831,7 @@ cdef void lapack_zpotrf(void* out_tuple, void** data) nogil: cdef double complex* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, n * n * sizeof(double complex)) + memcpy(a_out, a_in, (n) * (n) * sizeof(double complex)) zpotrf(&uplo, &n, a_out, &n, info) @@ -915,7 +927,8 @@ cdef void lapack_sgesdd(void* out_tuple, void** data) nogil: cdef float* work = (out[6]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float)) cdef char jobz = gesdd_jobz(job_opt_compute_uv, job_opt_full_matrices) @@ -966,7 +979,8 @@ cdef void lapack_dgesdd(void* out_tuple, void** data) nogil: cdef double* work = (out[6]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double)) cdef char jobz = gesdd_jobz(job_opt_compute_uv, job_opt_full_matrices) @@ -1017,7 +1031,8 @@ cdef void lapack_cgesdd(void* out_tuple, void** data) nogil: cdef float complex* work = (out[7]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(float complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(float complex)) cdef char jobz = gesdd_jobz(job_opt_compute_uv, job_opt_full_matrices) @@ -1069,7 +1084,8 @@ cdef void lapack_zgesdd(void* out_tuple, void** data) nogil: cdef double complex* work = (out[7]) if a_out != a_in: - memcpy(a_out, a_in, b * m * n * sizeof(double complex)) + memcpy(a_out, a_in, + (b) * (m) * (n) * sizeof(double complex)) cdef char jobz = gesdd_jobz(job_opt_compute_uv, job_opt_full_matrices) @@ -1202,7 +1218,8 @@ cdef void lapack_ssyevd(void* out_tuple, void** data) nogil: cdef float* work = (out[3]) cdef int* iwork = (out[4]) if a_out != a_in: - memcpy(a_out, a_in, b * n * n * sizeof(float)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(float)) cdef char jobz = 'V' cdef char uplo = 'L' if lower else 'U' @@ -1231,7 +1248,8 @@ cdef void lapack_dsyevd(void* out_tuple, void** data) nogil: cdef double* work = (out[3]) cdef int* iwork = (out[4]) if a_out != a_in: - memcpy(a_out, a_in, b * n * n * sizeof(double)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(double)) cdef char jobz = 'V' cdef char uplo = 'L' if lower else 'U' @@ -1269,7 +1287,8 @@ cdef void lapack_cheevd(void* out_tuple, void** data) nogil: cdef float* rwork = (out[4]) cdef int* iwork = (out[5]) if a_out != a_in: - memcpy(a_out, a_in, b * n * n * sizeof(float complex)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(float complex)) cdef char jobz = 'V' cdef char uplo = 'L' if lower else 'U' @@ -1301,7 +1320,8 @@ cdef void lapack_zheevd(void* out_tuple, void** data) nogil: cdef double* rwork = (out[4]) cdef int* iwork = (out[5]) if a_out != a_in: - memcpy(a_out, a_in, b * n * n * sizeof(double complex)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(double complex)) cdef char jobz = 'V' cdef char uplo = 'L' if lower else 'U' @@ -1443,7 +1463,7 @@ cdef void lapack_sgeev(void* out_tuple, void** data) nogil: cdef float* work = malloc(lwork * sizeof(float)) for i in range(b): - memcpy(a_work, a_in, n * n * sizeof(float)) + memcpy(a_work, a_in, (n) * (n) * sizeof(float)) sgeev(&jobvlr, &jobvlr, &n, a_work, &n, wr_out, wi_out, vl_work, &n, vr_work, &n, work, &lwork, info_out) _unpack_float_eigenvectors(n, wi_out, vl_work, vl_out) @@ -1506,7 +1526,7 @@ cdef void lapack_dgeev(void* out_tuple, void** data) nogil: cdef double* work = malloc(lwork * sizeof(double)) for i in range(b): - memcpy(a_work, a_in, n * n * sizeof(double)) + memcpy(a_work, a_in, (n) * (n) * sizeof(double)) dgeev(&jobvlr, &jobvlr, &n, a_work, &n, wr_out, wi_out, vl_work, &n, vr_work, &n, work, &lwork, info_out) _unpack_double_eigenvectors(n, wi_out, vl_work, vl_out) @@ -1547,7 +1567,7 @@ cdef void lapack_cgeev(void* out_tuple, void** data) nogil: lwork * sizeof(float complex)) for i in range(b): - memcpy(a_work, a_in, n * n * sizeof(float complex)) + memcpy(a_work, a_in, (n) * (n) * sizeof(float complex)) cgeev(&jobvlr, &jobvlr, &n, a_work, &n, w_out, vl_out, &n, vr_out, &n, work, &lwork, r_work, info_out) @@ -1585,7 +1605,7 @@ cdef void lapack_zgeev(void* out_tuple, void** data) nogil: lwork * sizeof(double complex)) for i in range(b): - memcpy(a_work, a_in, n * n * sizeof(double complex)) + memcpy(a_work, a_in, (n) * (n) * sizeof(double complex)) zgeev(&jobvlr, &jobvlr, &n, a_work, &n, w_out, vl_out, &n, vr_out, &n, work, &lwork, r_work, info_out) From 7bc2b0878ad868ea81a31c2fa638219bdd327f4a Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Fri, 8 Nov 2019 13:11:17 -0800 Subject: [PATCH 0311/1053] Update description of eqn.parmas --- docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb index 92b39d05c66f..56db249ef0a7 100644 --- a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb +++ b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb @@ -213,7 +213,7 @@ "* `jaxpr.outvars` - the `outvars` of a Jaxpr are the variables that are returned by the Jaxpr. Every Jaxpr has multiple outputs.\n", "* `jaxpr.constvars` - the `constvars` are a list of variables that are also inputs to the Jaxpr, but correspond to constants from the trace (we'll go over these in more detail later)\n", "* `jaxpr.freevars` - these can arise when nesting `jit` and `pmap` transformations; we won't worry about them in this colab.\n", - "* `jaxpr.eqns` - a list of equations, which are essentially let-bindings. Each equation is list of input variables, a list of output variables, and a *primitive*, which is used to evaluate inputs to produce outputs. Each equation also has a set of `params`, a dictionary of keyword arguments to the primitive.\n", + "* `jaxpr.eqns` - a list of equations, which are essentially let-bindings. Each equation is list of input variables, a list of output variables, and a *primitive*, which is used to evaluate inputs to produce outputs. Each equation also has a `params`, a dictionary of parameters.\n", "\n", "All together, a Jaxpr encapsulates a simple program that can be evaluated with inputs to produce an output. We'll go over how exactly to do this later. The important thing to note now is that a Jaxpr is a data structure that can be manipulated and evaluated in whatever way we want." ] From 6fa4cc0240e5e20bb5d64e602ee4989c7682c784 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Fri, 8 Nov 2019 13:15:42 -0800 Subject: [PATCH 0312/1053] Fix np.clip broadcasting --- jax/numpy/lax_numpy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 037650637211..f46655f73e23 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -986,11 +986,11 @@ def clip(a, a_min=None, a_max=None): if a_min is not None: if _dtype(a_min) != _dtype(a): a_min = lax.convert_element_type(a_min, _dtype(a)) - a = lax.max(a_min, a) + a = maximum(a_min, a) if a_max is not None: if _dtype(a_max) != _dtype(a): a_max = lax.convert_element_type(a_max, _dtype(a)) - a = lax.min(a_max, a) + a = minimum(a_max, a) return a From 6c305f3f481208562fc099e41ceba3bda45d16bd Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Fri, 8 Nov 2019 14:12:28 -0800 Subject: [PATCH 0313/1053] Extend clip test to test broadcasting a_min and a_max --- tests/lax_numpy_test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index a1a2937cde99..3b4df8dbdba8 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -683,7 +683,10 @@ def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): "shape": shape, "dtype": dtype, "a_min": a_min, "a_max": a_max, "rng": jtu.rand_default()} for shape in all_shapes for dtype in number_dtypes - for a_min, a_max in [(-1, None), (None, 1), (-1, 1)])) + for a_min, a_max in [(-1, None), (None, 1), (-1, 1), + (-lnp.ones(1), None), + (None, lnp.ones(1)), + (-lnp.ones(1), lnp.ones(1))])) def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng): onp_fun = lambda x: onp.clip(x, a_min=a_min, a_max=a_max) lnp_fun = lambda x: lnp.clip(x, a_min=a_min, a_max=a_max) From fd168752f16d3e2e7d9bbe939c6b6a7ad389c08c Mon Sep 17 00:00:00 2001 From: Matteo Hessel Date: Mon, 11 Nov 2019 13:27:35 +0000 Subject: [PATCH 0314/1053] Expose global_norm The `global_norm` function might be used in user code to build custom chainable `optix` transformations. --- jax/experimental/optix.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 6aeca8d883d6..cbf0450f53ab 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -83,7 +83,7 @@ def update_fn(updates, state): ClipByGlobalNormState = collections.namedtuple("ClipByGlobalNormState", "") -def _global_norm(items): +def global_norm(items): return jnp.sqrt(jnp.sum([jnp.sum(x**2) for x in tree_leaves(items)])) @@ -104,7 +104,7 @@ def init_fn(_): return ClipByGlobalNormState() def update_fn(updates, state): - g_norm = _global_norm(updates) + g_norm = global_norm(updates) trigger = g_norm < max_norm updates = tree_multimap( lambda t: jnp.where(trigger, t, t * (max_norm / g_norm)), updates) From 73bc34a2795917729e7481c02688c757e649aeb5 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 11 Nov 2019 09:25:50 -0500 Subject: [PATCH 0315/1053] Update XLA. (#1662) --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cab0b28a0380..590b16cd33c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "508eb48faee23f318ab18075af522527074fc67780ac8ff127d21a5a5d1a71cf", - strip_prefix = "tensorflow-d325350fe6db8ef2dda9d94e1551b831980d1115", + sha256 = "68676ddd2fb2c0af1ad69ae964a5c23f5d91f3858753b2273833447397d2e95e", + strip_prefix = "tensorflow-fa3a6a43d452dc391b63c97ecd498f95a95c20d9", urls = [ - "https://github.com/tensorflow/tensorflow/archive/d325350fe6db8ef2dda9d94e1551b831980d1115.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/fa3a6a43d452dc391b63c97ecd498f95a95c20d9.tar.gz", ], ) From 6434340d00d4b0a2b05c63fb48e68ee73ec0c27f Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 11 Nov 2019 07:45:31 -0800 Subject: [PATCH 0316/1053] Hoist loop-invariant residuals out of scan in partial eval Fixes #810 Co-authored-by: James Bradbury --- jax/lax/lax_control_flow.py | 139 +++++++++++++++++++++++---------- tests/lax_control_flow_test.py | 14 ++++ 2 files changed, 113 insertions(+), 40 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 8070535c037b..105a61ca7ce1 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -617,34 +617,81 @@ def _scan_partial_eval(trace, *tracers, **kwargs): carry_uk = _map(operator.or_, carry_uk, carry_uk_out) else: assert False, "Fixpoint not reached" + num_res = len(jaxpr_1.out_avals) - len(jaxpr_2.out_avals) + + # The residuals are treated as extensive outputs of jaxpr_1 (and extensive + # inputs to jaxpr_2), but residuals that are loop-invariant can be hoisted. + # TODO(mattjj): hoist other loop-invariant values here too (instantiate=False) + invariant_pvals = [pe.PartialVal((None, core.unit if uk else t.pval[1])) + for uk, t in zip(unknowns[:num_consts], tracers[:num_consts])] + other_pvals = [pe.PartialVal((a, core.unit)) for a in jaxpr_1.in_avals[num_consts:]] + in_pvals_1 = invariant_pvals + other_pvals + untyped_jaxpr_1, out_pvals_1, consts_1 = pe.trace_to_jaxpr( + lu.wrap_init(core.jaxpr_as_fun(jaxpr_1)), in_pvals_1, + instantiate=[True] * (num_carry + num_ys) + [False] * num_res) + const_avals_1 = [raise_to_shaped(core.get_aval(c)) for c in consts_1] + in_avals_1 = [core.abstract_unit] * num_consts + jaxpr_1.in_avals[num_consts:] + out_avals_1 = [core.abstract_unit if pv is None else pv for pv, c in out_pvals_1] + jaxpr_1_opt = pe.TypedJaxpr(pe.closure_convert_jaxpr(untyped_jaxpr_1), + (), const_avals_1 + in_avals_1, out_avals_1) + num_consts_1 = num_consts + len(consts_1) + # any now-known residuals are intensive, so we want to revise jaxpr_2 to take + # those inputs as constants rather than as extensive inputs + _, _, res_pvals = split_list(out_pvals_1, [num_carry, num_ys]) + intensive_residuals = [const for pv, const in res_pvals if pv is None] + move = [False] * len(jaxpr_1.in_avals) + [pv is None for pv, _ in res_pvals] + jaxpr_2_opt = _move_binders_to_front(jaxpr_2, move) + num_consts_2 = num_consts + len(intensive_residuals) + + in_consts = (list(consts_1) + [core.unit] * num_consts + + [core.unit if uk else t.pval[1] + for uk, t in zip(unknowns[num_consts:], tracers[num_consts:])]) + linear_1 = ([False] * len(consts_1) + [True] * num_consts + + [lin or uk for uk, lin in zip(unknowns[num_consts:], linear[num_consts:])]) + out_flat = scan_p.bind( + *in_consts, forward=forward, length=length, jaxpr=jaxpr_1_opt, + num_consts=num_consts_1, num_carry=num_carry, linear=linear_1) + out_carry, ys, res_and_units = split_list(out_flat, [num_carry, num_ys]) + extensive_residuals = [r for r, (pv, _) in zip(res_and_units, res_pvals) if pv is not None] - in_consts = [core.unit if uk else t.pval[1] for uk, t in zip(unknowns, tracers)] new_tracers = [trace.instantiate_const(t) if uk else trace.new_instantiated_literal(core.unit) for uk, t in zip(unknowns, tracers)] - carry_avals, y_avals = split_list(jaxpr.out_avals, [num_carry]) ys_avals = _map(partial(_promote_aval_rank, length), y_avals) out_avals = carry_avals + ys_avals out_pvs = [aval if uk else None for aval, uk in zip(out_avals, out_uk)] - linear_1 = [lin or uk for uk, lin in zip(unknowns, linear)] - out_flat = scan_p.bind( - *in_consts, forward=forward, length=length, jaxpr=jaxpr_1, - num_consts=num_consts, num_carry=num_carry, linear=linear_1) - out_carry, ys, residuals = split_list(out_flat, [num_carry, num_ys]) out_consts = out_carry + ys - residual_tracers = _map(trace.new_instantiated_const, residuals) + int_res_tracers = _map(trace.new_instantiated_const, intensive_residuals) + ext_res_tracers = _map(trace.new_instantiated_const, extensive_residuals) out_tracers = [pe.JaxprTracer(trace, pe.PartialVal((pv, const)), None) for pv, const in zip(out_pvs, out_consts)] - linear_2 = ([lin or not uk for uk, lin in zip(unknowns, linear)] - + [False] * len(residual_tracers)) - eqn = pe.new_jaxpr_eqn(new_tracers + residual_tracers, out_tracers, scan_p, - (), dict(forward=forward, length=length, jaxpr=jaxpr_2, - num_consts=num_consts, num_carry=num_carry, - linear=linear_2)) + linear_2 = ([False] * len(int_res_tracers) + + [lin or not uk for uk, lin in zip(unknowns, linear)] + + [False] * len(ext_res_tracers)) + eqn = pe.new_jaxpr_eqn(int_res_tracers + new_tracers + ext_res_tracers, + out_tracers, scan_p, (), + dict(forward=forward, length=length, jaxpr=jaxpr_2_opt, + num_consts=num_consts_2, + num_carry=num_carry, linear=linear_2)) for t in out_tracers: t.recipe = eqn return out_tracers +def _move_binders_to_front(typed_jaxpr, to_move): + assert not typed_jaxpr.jaxpr.constvars and not typed_jaxpr.jaxpr.freevars + assert len(typed_jaxpr.in_avals) == len(to_move) + new_invars = _move_to_front(typed_jaxpr.jaxpr.invars, to_move) + new_jaxpr = core.Jaxpr((), (), new_invars, typed_jaxpr.jaxpr.outvars, + typed_jaxpr.jaxpr.eqns) + new_in_avals = _move_to_front(typed_jaxpr.in_avals, to_move) + new_typed_jaxpr = core.TypedJaxpr(new_jaxpr, typed_jaxpr.literals, + new_in_avals, typed_jaxpr.out_avals) + return new_typed_jaxpr + +def _move_to_front(lst, to_move): + return ([elt for elt, move in zip(lst, to_move) if move] + + [elt for elt, move in zip(lst, to_move) if not move]) + def _promote_aval_rank(sz, aval): if aval is core.abstract_unit: return core.abstract_unit @@ -655,54 +702,66 @@ def _scan_transpose(cts, *args, **kwargs): forward, length, num_consts, num_carry, jaxpr, linear = split_dict( kwargs, ["forward", "length", "num_consts", "num_carry", "jaxpr", "linear"]) - # we can only transpose scans for which the nonlinear values appear in xs + # we've only implemented transposing scans with specific lin/nonlin patterns consts_lin, init_lin, xs_lin = split_list(linear, [num_consts, num_carry]) - num_lin = sum(xs_lin) - if not all(consts_lin) or not all(init_lin) or not all(xs_lin[:num_lin]): + num_ires = len(consts_lin) - sum(consts_lin) + num_eres = len(xs_lin) - sum(xs_lin) + if consts_lin != [False] * num_ires + [True] * (len(consts_lin) - num_ires): + raise NotImplementedError + if xs_lin != [True] * (len(xs_lin) - num_eres) + [False] * num_eres: + raise NotImplementedError + if not all(init_lin): raise NotImplementedError - consts, init, xs, res = split_list(args, [num_consts, num_carry, num_lin]) - assert not any(r is ad.undefined_primal for r in res) + consts, init, xs = split_list(args, [num_consts, num_carry]) + ires, consts = split_list(consts, [num_ires]) + xs, eres = split_list(xs, [sum(xs_lin)]) + assert not any(r is ad.undefined_primal for r in ires) + assert not any(r is ad.undefined_primal for r in eres) carry_avals, y_avals = split_list(jaxpr.out_avals, [num_carry]) ys_avals = _map(partial(_promote_aval_rank, length), y_avals) ct_carry, ct_ys = split_list(cts, [num_carry]) ct_carry = _map(ad.instantiate_zeros_aval, carry_avals, ct_carry) ct_ys = _map(ad.instantiate_zeros_aval, ys_avals, ct_ys) - ct_consts = _map(ad_util.zeros_like_aval, jaxpr.in_avals[:num_consts]) + ct_consts = _map(ad_util.zeros_like_aval, jaxpr.in_avals[num_ires:num_consts]) - # jaxpr :: [T d] -> [T c] -> [T a, res] -> ([T c], [T b]) - # jaxpr_trans :: [] -> [CT d, CT c] -> [CT b, res] -> ([CT d, CT c], [CT a]) - jaxpr_trans = _transpose_jaxpr(num_consts, len(res), jaxpr) - linear_trans = ([True] * (len(ct_consts) + len(ct_carry) + len(ct_ys)) - + [False] * len(res)) + # jaxpr :: [ires, T d] -> [T c] -> [T a, eres] -> ([T c], [T b]) + # jaxpr_trans :: [ires] -> [CT d, CT c] -> [CT b, eres] -> ([CT d, CT c], [CT a]) + jaxpr_trans = _transpose_jaxpr(num_ires, num_consts - num_ires, num_eres, jaxpr) + linear_trans = ([False] * num_ires + + [True] * (len(ct_consts) + len(ct_carry) + len(ct_ys)) + + [False] * num_eres) outs = scan_p.bind( - *(ct_consts + ct_carry + ct_ys + res), forward=not forward, length=length, - jaxpr=jaxpr_trans, num_consts=0, num_carry=num_consts+num_carry, - linear=linear_trans) - ct_consts, ct_init, ct_xs = split_list(outs, [num_consts, num_carry]) - return ct_consts + ct_init + ct_xs + [None] * len(res) - -# transpose_jaxpr :: ([c, a, res] -> b) -> ([CT c, CT b, res] -> [CT c, CT a] -def _transpose_jaxpr(num_c, num_res, jaxpr): - num_a = len(jaxpr.in_avals) - num_c - num_res - c_avals, a_avals, res_avals = split_list(jaxpr.in_avals, [num_c, num_a]) + *(ires + ct_consts + ct_carry + ct_ys + eres), forward=not forward, + length=length, jaxpr=jaxpr_trans, num_consts=num_ires, + num_carry=num_consts-num_ires+num_carry, linear=linear_trans) + ct_consts, ct_init, ct_xs = split_list(outs, [num_consts - num_ires, num_carry]) + return [None] * num_ires + ct_consts + ct_init + ct_xs + [None] * num_eres + +# transpose_jaxpr :: ([res1, c, a, res2] -> b) +# -> ([res1, CT c, CT b, res2] -> [CT c, CT a]) +def _transpose_jaxpr(num_res1, num_c, num_res2, jaxpr): + num_a = len(jaxpr.in_avals) - num_res1 - num_c - num_res2 + res1_avals, c_avals, a_avals, res2_avals = split_list( + jaxpr.in_avals, [num_res1, num_c, num_a]) num_b = len(jaxpr.out_avals) b_avals = list(jaxpr.out_avals) @lu.wrap_init - def transposed(*cbar_bbar_res): - c_bar, b_bar, res = split_list(cbar_bbar_res, [num_c, num_b]) - primals = [ad.undefined_primal] * (num_c + num_a) + res + def transposed(*res1_cbar_bbar_res2): + res1, c_bar, b_bar, res2 = split_list( + res1_cbar_bbar_res2, [num_res1, num_c, num_b]) + primals = res1 + [ad.undefined_primal] * (num_c + num_a) + res2 _, cbar_abar = ad.backward_pass(jaxpr.jaxpr, jaxpr.literals, (), primals, b_bar) - new_c_bar, a_bar, _ = split_list(cbar_abar, [num_c, num_a]) + _, new_c_bar, a_bar, _ = split_list(cbar_abar, [num_res1, num_c, num_a]) a_bar = _map(ad.instantiate_zeros_aval, a_avals, a_bar) c_bar = _map(ad.instantiate_zeros_aval, c_avals, _map(ad.add_tangents, c_bar, new_c_bar)) return c_bar + a_bar - return _make_typed_jaxpr(transposed, c_avals + b_avals + res_avals) + return _make_typed_jaxpr(transposed, res1_avals + c_avals + b_avals + res2_avals) def _make_typed_jaxpr(traceable, in_avals): pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 1f5c0c82bcf3..a09bd454342d 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1365,6 +1365,20 @@ def bad_matvec_usage(a): with self.assertRaisesRegex(ValueError, re.escape("matvec() output shapes")): api.jvp(bad_matvec_usage, (1.0,), (1.0,)) + def testIssue810(self): + def loss(A): + def step(x, i): + return A @ x, None + init_x = np.zeros(A.shape[-1:]) + last_x, _ = lax.scan(step, init_x, np.arange(10)) + return np.sum(last_x) + + A = np.zeros((3, 3)) + # The second DUS was unnecessarily replicating A across time. + # We check XLA because _scan_impl is "underneath" the jaxpr language. + s = str(api.xla_computation(api.grad(loss))(A).GetHloText()) + assert s.count("dynamic-update-slice(") < 2 + if __name__ == '__main__': absltest.main() From a9a6cf8a2e04d3e49177365b6b3e852efe2d2559 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 11 Nov 2019 12:51:15 -0800 Subject: [PATCH 0317/1053] Faster test collection, second try (#1653) * Faster test collection, second try Follows @hawkinsp's suggestion from #1632 to rewrite everything in terms of RNG factories, creating actual RNG functions *inside* each test method instead of when they are collected. * use np.testing.assert_allclose --- jax/test_util.py | 40 +- tests/batching_test.py | 64 ++- tests/fft_test.py | 7 +- tests/lax_numpy_indexing_test.py | 84 +-- tests/lax_numpy_test.py | 633 +++++++++++--------- tests/lax_scipy_test.py | 52 +- tests/lax_test.py | 953 +++++++++++++++++-------------- tests/linalg_test.py | 183 +++--- tests/scipy_stats_test.py | 89 +-- 9 files changed, 1183 insertions(+), 922 deletions(-) diff --git a/jax/test_util.py b/jax/test_util.py index d3b91e883ee7..44fc4df88c99 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -66,34 +66,33 @@ def is_sequence(x): else: return True -def numpy_eq(x, y): + +def assert_numpy_eq(x, y): testing_tpu = FLAGS.jax_test_dut and FLAGS.jax_test_dut.startswith("tpu") testing_x32 = not FLAGS.jax_enable_x64 if testing_tpu or testing_x32: - return onp.allclose(x, y, 1e-3, 1e-3, equal_nan=testing_tpu) + onp.testing.assert_allclose(x, y, 1e-3, 1e-3) else: - return onp.allclose(x, y) + onp.testing.assert_allclose(x, y) -def numpy_close(a, b, atol=ATOL, rtol=RTOL, equal_nan=False): +def assert_numpy_close(a, b, atol=ATOL, rtol=RTOL): testing_tpu = FLAGS.jax_test_dut and FLAGS.jax_test_dut.startswith("tpu") testing_x32 = not FLAGS.jax_enable_x64 if testing_tpu or testing_x32: atol = max(atol, 1e-1) rtol = max(rtol, 1e-1) assert a.shape == b.shape - return onp.allclose(a, b, atol=atol * a.size, rtol=rtol * b.size, - equal_nan=equal_nan or testing_tpu) + onp.testing.assert_allclose(a, b, atol=atol * a.size, rtol=rtol * b.size) def check_eq(xs, ys): - assert tree_all(tree_multimap(numpy_eq, xs, ys)), \ - '\n{} != \n{}'.format(xs, ys) + tree_all(tree_multimap(assert_numpy_eq, xs, ys)) def check_close(xs, ys, atol=ATOL, rtol=RTOL): - close = partial(numpy_close, atol=atol, rtol=rtol) - assert tree_all(tree_multimap(close, xs, ys)), '\n{} != \n{}'.format(xs, ys) + assert_close = partial(assert_numpy_close, atol=atol, rtol=rtol) + tree_all(tree_multimap(assert_close, xs, ys)) def inner_prod(xs, ys): @@ -494,12 +493,19 @@ def check_raises_regexp(thunk, err_type, pattern): except err_type as e: assert re.match(pattern, str(e)), "{}\n\n{}\n".format(e, pattern) +_CACHED_INDICES = {} + def cases_from_list(xs): - rng = npr.RandomState(42) xs = list(xs) - k = min(len(xs), FLAGS.num_generated_cases) - indices = rng.choice(onp.arange(len(xs)), k, replace=False) - return [xs[i] for i in indices] + n = len(xs) + k = min(n, FLAGS.num_generated_cases) + # Random sampling for every parameterized test is expensive. Do it once and + # cache the result. + indices = _CACHED_INDICES.get(n) + if indices is None: + rng = npr.RandomState(42) + _CACHED_INDICES[n] = indices = rng.permutation(n) + return [xs[i] for i in indices[:k]] def cases_from_gens(*gens): sizes = [1, 3, 10] @@ -524,11 +530,7 @@ def assertArraysAllClose(self, x, y, check_dtypes, atol=None, rtol=None): atol = max(atol, 0.5) rtol = max(rtol, 1e-1) - if not onp.allclose(x, y, atol=atol, rtol=rtol, equal_nan=True): - msg = ('Arguments x and y not equal to tolerance atol={}, rtol={}:\n' - 'x:\n{}\n' - 'y:\n{}\n').format(atol, rtol, x, y) - raise self.failureException(msg) + onp.testing.assert_allclose(x, y, atol=atol, rtol=rtol) if check_dtypes: self.assertDtypesMatch(x, y) diff --git a/tests/batching_test.py b/tests/batching_test.py index 41d9446c9837..b358de0a5deb 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -651,7 +651,8 @@ def testLaxLinalgTriangularSolve(self): jtu.format_shape_dtype_string(shape, dtype), axis, idxs, dnums, slice_sizes), "axis": axis, "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, - "slice_sizes": slice_sizes, "rng": rng, "rng_idx": rng_idx} + "slice_sizes": slice_sizes, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in [onp.float32, onp.int32] for axis, shape, idxs, dnums, slice_sizes in [ (0, (3, 5), onp.array([[0], [2]]), lax.GatherDimensionNumbers( @@ -669,10 +670,12 @@ def testLaxLinalgTriangularSolve(self): start_index_map=(0, 1)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()]) + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default]) def testGatherBatchedOperand(self, axis, shape, dtype, idxs, dnums, - slice_sizes, rng, rng_idx): + slice_sizes, rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) operand = rng(shape, dtype) ans = vmap(fun, (axis, None))(operand, idxs) @@ -685,7 +688,8 @@ def testGatherBatchedOperand(self, axis, shape, dtype, idxs, dnums, jtu.format_shape_dtype_string(shape, dtype), axis, idxs, dnums, slice_sizes), "axis": axis, "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, - "slice_sizes": slice_sizes, "rng": rng, "rng_idx": rng_idx} + "slice_sizes": slice_sizes, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in [onp.float32, onp.float64] for axis, shape, idxs, dnums, slice_sizes in [ (0, (3, 5), onp.array([[0], [2]]), lax.GatherDimensionNumbers( @@ -702,10 +706,12 @@ def testGatherBatchedOperand(self, axis, shape, dtype, idxs, dnums, offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0, 1)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()]) + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default]) def testGatherGradBatchedOperand(self, axis, shape, dtype, idxs, dnums, - slice_sizes, rng, rng_idx): + slice_sizes, rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) gfun = grad(lambda x, idx: np.sum(np.sin(fun(x, idx)))) operand = rng(shape, dtype) @@ -719,7 +725,8 @@ def testGatherGradBatchedOperand(self, axis, shape, dtype, idxs, dnums, jtu.format_shape_dtype_string(shape, dtype), axis, idxs, dnums, slice_sizes), "axis": axis, "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, - "slice_sizes": slice_sizes, "rng": rng, "rng_idx": rng_idx} + "slice_sizes": slice_sizes, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in [onp.float32, onp.int32] for axis, shape, idxs, dnums, slice_sizes in [ (0, (5,), onp.array([[[0], [2]], [[1], [3]]]), lax.GatherDimensionNumbers( @@ -734,10 +741,12 @@ def testGatherGradBatchedOperand(self, axis, shape, dtype, idxs, dnums, [[1, 0], [2, 3]]]), lax.GatherDimensionNumbers( offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0, 1)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()]) + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default]) def testGatherBatchedIndices(self, axis, shape, dtype, idxs, dnums, - slice_sizes, rng, rng_idx): + slice_sizes, rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) operand = rng(shape, dtype) ans = vmap(fun, (None, axis))(operand, idxs) @@ -750,7 +759,8 @@ def testGatherBatchedIndices(self, axis, shape, dtype, idxs, dnums, jtu.format_shape_dtype_string(shape, dtype), axis, idxs, dnums, slice_sizes), "axis": axis, "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, - "slice_sizes": slice_sizes, "rng": rng, "rng_idx": rng_idx} + "slice_sizes": slice_sizes, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in [onp.float32, onp.float64] for axis, shape, idxs, dnums, slice_sizes in [ (0, (5,), onp.array([[[0], [2]], [[1], [3]]]), lax.GatherDimensionNumbers( @@ -765,10 +775,12 @@ def testGatherBatchedIndices(self, axis, shape, dtype, idxs, dnums, [[1, 0], [2, 3]]]), lax.GatherDimensionNumbers( offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0, 1)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()]) + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default]) def testGatherGradBatchedIndices(self, axis, shape, dtype, idxs, dnums, - slice_sizes, rng, rng_idx): + slice_sizes, rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) gfun = grad(lambda x, idx: np.sum(np.sin(fun(x, idx)))) operand = rng(shape, dtype) @@ -783,7 +795,7 @@ def testGatherGradBatchedIndices(self, axis, shape, dtype, idxs, dnums, dnums, slice_sizes), "op_axis": op_axis, "idxs_axis": idxs_axis, "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, "slice_sizes": slice_sizes, - "rng": rng, "rng_idx": rng_idx} + "rng_factory": rng_factory, "rng_idx_factory": rng_idx_factory} for dtype in [onp.float32, onp.int32] for op_axis, idxs_axis, shape, idxs, dnums, slice_sizes in [ (0, 0, (2, 5), onp.array([[[0], [2]], [[1], [3]]]), @@ -804,10 +816,12 @@ def testGatherGradBatchedIndices(self, axis, shape, dtype, idxs, dnums, offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0, 1)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()]) + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default]) def testGatherBatchedBoth(self, op_axis, idxs_axis, shape, dtype, idxs, dnums, - slice_sizes, rng, rng_idx): + slice_sizes, rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) operand = rng(shape, dtype) assert operand.shape[op_axis] == idxs.shape[idxs_axis] @@ -823,7 +837,7 @@ def testGatherBatchedBoth(self, op_axis, idxs_axis, shape, dtype, idxs, dnums, dnums, slice_sizes), "op_axis": op_axis, "idxs_axis": idxs_axis, "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, "slice_sizes": slice_sizes, - "rng": rng, "rng_idx": rng_idx} + "rng_factory": rng_factory, "rng_idx_factory": rng_idx_factory} for dtype in [onp.float32] for op_axis, idxs_axis, shape, idxs, dnums, slice_sizes in [ (0, 0, (2, 5), onp.array([[[0], [2]], [[1], [3]]]), @@ -844,10 +858,12 @@ def testGatherBatchedBoth(self, op_axis, idxs_axis, shape, dtype, idxs, dnums, offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0, 1)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()]) + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default]) def testGatherGradBatchedBoth(self, op_axis, idxs_axis, shape, dtype, idxs, dnums, - slice_sizes, rng, rng_idx): + slice_sizes, rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) gfun = grad(lambda x, idx: np.sum(np.sin(fun(x, idx)))) operand = rng(shape, dtype) diff --git a/tests/fft_test.py b/tests/fft_test.py index 6fcf65dcb0a4..4650020e2190 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -53,14 +53,15 @@ class FftTest(jtu.JaxTestCase): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inverse={}_shape={}_axes={}".format( inverse, jtu.format_shape_dtype_string(shape, dtype), axes), - "axes": axes, "shape": shape, "dtype": dtype, "rng": rng, + "axes": axes, "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "inverse": inverse} for inverse in [False, True] - for rng in [jtu.rand_default()] + for rng_factory in [jtu.rand_default] for dtype in all_dtypes for shape in [(10,), (10, 10), (2, 3, 4), (2, 3, 4, 5)] for axes in _get_fftn_test_axes(shape))) - def testFftn(self, inverse, shape, dtype, axes, rng): + def testFftn(self, inverse, shape, dtype, axes, rng_factory): + rng = rng_factory() args_maker = lambda: (rng(shape, dtype),) np_op = np.fft.ifftn if inverse else np.fft.fftn onp_op = onp.fft.ifftn if inverse else onp.fft.fftn diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 751b244313b8..4c9613b673dd 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -389,12 +389,13 @@ class IndexingTest(jtu.JaxTestCase): @parameterized.named_parameters(jtu.cases_from_list({ "testcase_name": "{}_inshape={}_indexer={}".format( name, jtu.format_shape_dtype_string( shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer } for name, index_specs in STATIC_INDEXING_TESTS for shape, indexer in index_specs for dtype in all_dtypes - for rng in [jtu.rand_default()])) - def testStaticIndexing(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default])) + def testStaticIndexing(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] fun = lambda x: x[indexer] self._CompileAndCheck(fun, args_maker, check_dtypes=True) @@ -404,12 +405,13 @@ def testStaticIndexing(self, shape, dtype, rng, indexer): "{}_inshape={}_indexer={}".format(name, jtu.format_shape_dtype_string( shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer } for name, index_specs in STATIC_INDEXING_GRAD_TESTS for shape, indexer in index_specs for dtype in float_dtypes - for rng in [jtu.rand_default()]) - def testStaticIndexingGrads(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default]) + def testStaticIndexingGrads(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() tol = 1e-2 if onp.finfo(dtype).bits == 32 else None arg = rng(shape, dtype) fun = lambda x: x[indexer]**2 @@ -434,7 +436,7 @@ def _ReplaceSlicesWithTuples(self, idx): @parameterized.named_parameters( {"testcase_name": "{}_inshape={}_indexer={}" .format(name, jtu.format_shape_dtype_string(shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer} for name, index_specs in [ ("OneSliceIndex", [IndexSpec(shape=(5,), indexer=slice(1, 3)), @@ -454,8 +456,9 @@ def _ReplaceSlicesWithTuples(self, idx): ] for shape, indexer in index_specs for dtype in all_dtypes - for rng in [jtu.rand_default()]) - def testDynamicIndexingWithSlicesErrors(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default]) + def testDynamicIndexingWithSlicesErrors(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() unpacked_indexer, pack_indexer = self._ReplaceSlicesWithTuples(indexer) @api.jit @@ -469,7 +472,7 @@ def fun(x, unpacked_indexer): @parameterized.named_parameters( {"testcase_name": "{}_inshape={}_indexer={}" .format(name, jtu.format_shape_dtype_string(shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer} for name, index_specs in [ ("OneIntIndex", [IndexSpec(shape=(3,), indexer=1), @@ -486,8 +489,9 @@ def fun(x, unpacked_indexer): ] for shape, indexer in index_specs for dtype in all_dtypes - for rng in [jtu.rand_default()]) - def testDynamicIndexingWithIntegers(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default]) + def testDynamicIndexingWithIntegers(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() unpacked_indexer, pack_indexer = self._ReplaceSlicesWithTuples(indexer) def fun(x, unpacked_indexer): @@ -500,7 +504,7 @@ def fun(x, unpacked_indexer): @parameterized.named_parameters( {"testcase_name": "{}_inshape={}_indexer={}" .format(name, jtu.format_shape_dtype_string(shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer} for name, index_specs in [ ("OneIntIndex", [IndexSpec(shape=(3,), indexer=1), @@ -519,8 +523,9 @@ def fun(x, unpacked_indexer): ] for shape, indexer in index_specs for dtype in float_dtypes - for rng in [jtu.rand_default()]) - def testDynamicIndexingWithIntegersGrads(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default]) + def testDynamicIndexingWithIntegersGrads(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() tol = 1e-2 if onp.finfo(dtype).bits == 32 else None unpacked_indexer, pack_indexer = self._ReplaceSlicesWithTuples(indexer) @@ -535,12 +540,13 @@ def fun(unpacked_indexer, x): @parameterized.named_parameters( {"testcase_name": "{}_inshape={}_indexer={}" .format(name, jtu.format_shape_dtype_string(shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer} for name, index_specs in ADVANCED_INDEXING_TESTS for shape, indexer in index_specs for dtype in all_dtypes - for rng in [jtu.rand_default()]) - def testAdvancedIntegerIndexing(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default]) + def testAdvancedIntegerIndexing(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype), indexer] fun = lambda x, idx: x[idx] self._CompileAndCheck(fun, args_maker, check_dtypes=True) @@ -548,7 +554,7 @@ def testAdvancedIntegerIndexing(self, shape, dtype, rng, indexer): @parameterized.named_parameters( {"testcase_name": "{}_inshape={}_indexer={}" .format(name, jtu.format_shape_dtype_string(shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer} for name, index_specs in [ ("One1DIntArrayIndex", [IndexSpec(shape=(3,), indexer=onp.array([0, 1])), @@ -597,8 +603,9 @@ def testAdvancedIntegerIndexing(self, shape, dtype, rng, indexer): ] for shape, indexer in index_specs for dtype in float_dtypes - for rng in [jtu.rand_default()]) - def testAdvancedIntegerIndexingGrads(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default]) + def testAdvancedIntegerIndexingGrads(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() tol = 1e-2 if onp.finfo(dtype).bits == 32 else None arg = rng(shape, dtype) fun = lambda x: x[indexer]**2 @@ -607,12 +614,13 @@ def testAdvancedIntegerIndexingGrads(self, shape, dtype, rng, indexer): @parameterized.named_parameters( {"testcase_name": "{}_inshape={}_indexer={}" .format(name, jtu.format_shape_dtype_string(shape, dtype), indexer), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer} for name, index_specs in MIXED_ADVANCED_INDEXING_TESTS for shape, indexer in index_specs for dtype in all_dtypes - for rng in [jtu.rand_default()]) - def testMixedAdvancedIntegerIndexing(self, shape, dtype, rng, indexer): + for rng_factory in [jtu.rand_default]) + def testMixedAdvancedIntegerIndexing(self, shape, dtype, rng_factory, indexer): + rng = rng_factory() indexer_with_dummies = [e if isinstance(e, onp.ndarray) else () for e in indexer] substitutes = [(i, e) for i, e in enumerate(indexer) @@ -794,7 +802,7 @@ class IndexedUpdateTest(jtu.JaxTestCase): "testcase_name": "{}_inshape={}_indexer={}_update={}_op={}".format( name, jtu.format_shape_dtype_string(shape, dtype), indexer, jtu.format_shape_dtype_string(update_shape, update_dtype), op.name), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer, + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer, "update_shape": update_shape, "update_dtype": update_dtype, "op": op } for name, index_specs in STATIC_INDEXING_TESTS @@ -803,9 +811,10 @@ class IndexedUpdateTest(jtu.JaxTestCase): for dtype in (all_dtypes if op == UpdateOps.UPDATE else default_dtypes) for update_shape in _broadcastable_shapes(_update_shape(shape, indexer)) for update_dtype in ([dtype] if op == UpdateOps.ADD else all_dtypes) - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testStaticIndexing(self, shape, dtype, update_shape, update_dtype, - rng, indexer, op): + rng_factory, indexer, op): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype), rng(update_shape, update_dtype)] onp_fn = lambda x, y: UpdateOps.onp_fn(op, indexer, x, y) jax_fn = lambda x, y: UpdateOps.jax_fn(op, indexer, x, y) @@ -816,7 +825,7 @@ def testStaticIndexing(self, shape, dtype, update_shape, update_dtype, "testcase_name": "{}_inshape={}_indexer={}_update={}_op={}".format( name, jtu.format_shape_dtype_string(shape, dtype), indexer, jtu.format_shape_dtype_string(update_shape, update_dtype), op.name), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer, + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer, "update_shape": update_shape, "update_dtype": update_dtype, "op": op } for name, index_specs in ADVANCED_INDEXING_TESTS_NO_REPEATS @@ -825,9 +834,10 @@ def testStaticIndexing(self, shape, dtype, update_shape, update_dtype, for dtype in (all_dtypes if op == UpdateOps.UPDATE else default_dtypes) for update_shape in _broadcastable_shapes(_update_shape(shape, indexer)) for update_dtype in ([dtype] if op == UpdateOps.ADD else all_dtypes) - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testAdvancedIndexing(self, shape, dtype, update_shape, update_dtype, - rng, indexer, op): + rng_factory, indexer, op): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype), rng(update_shape, update_dtype)] onp_fn = lambda x, y: UpdateOps.onp_fn(op, indexer, x, y) jax_fn = lambda x, y: UpdateOps.jax_fn(op, indexer, x, y) @@ -838,7 +848,7 @@ def testAdvancedIndexing(self, shape, dtype, update_shape, update_dtype, "testcase_name": "{}_inshape={}_indexer={}_update={}_op={}".format( name, jtu.format_shape_dtype_string(shape, dtype), indexer, jtu.format_shape_dtype_string(update_shape, update_dtype), op.name), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer, + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer, "update_shape": update_shape, "update_dtype": update_dtype, "op": op } for name, index_specs in MIXED_ADVANCED_INDEXING_TESTS_NO_REPEATS @@ -847,9 +857,10 @@ def testAdvancedIndexing(self, shape, dtype, update_shape, update_dtype, for dtype in (all_dtypes if op == UpdateOps.UPDATE else default_dtypes) for update_shape in _broadcastable_shapes(_update_shape(shape, indexer)) for update_dtype in ([dtype] if op == UpdateOps.ADD else all_dtypes) - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testMixedAdvancedIndexing(self, shape, dtype, update_shape, update_dtype, - rng, indexer, op): + rng_factory, indexer, op): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype), rng(update_shape, update_dtype)] onp_fn = lambda x, y: UpdateOps.onp_fn(op, indexer, x, y) jax_fn = lambda x, y: UpdateOps.jax_fn(op, indexer, x, y) @@ -860,7 +871,7 @@ def testMixedAdvancedIndexing(self, shape, dtype, update_shape, update_dtype, "testcase_name": "{}_inshape={}_indexer={}_update={}_op={}".format( name, jtu.format_shape_dtype_string(shape, dtype), indexer, jtu.format_shape_dtype_string(update_shape, update_dtype), op.name), - "shape": shape, "dtype": dtype, "rng": rng, "indexer": indexer, + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "indexer": indexer, "update_shape": update_shape, "update_dtype": update_dtype, "op": op } for name, index_specs in STATIC_INDEXING_TESTS @@ -869,10 +880,11 @@ def testMixedAdvancedIndexing(self, shape, dtype, update_shape, update_dtype, for dtype in float_dtypes for update_shape in _broadcastable_shapes(_update_shape(shape, indexer)) for update_dtype in ([dtype] if op == UpdateOps.ADD else float_dtypes) - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") # TODO(mattjj,phawkins): tpu issues def testStaticIndexingGrads(self, shape, dtype, update_shape, update_dtype, - rng, indexer, op): + rng_factory, indexer, op): + rng = rng_factory() jax_op = ops.index_update if op == UpdateOps.UPDATE else ops.index_add jax_fn = lambda x, y: jax_op(x, indexer, y) x = rng(shape, dtype) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 3b4df8dbdba8..91f8a5434418 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -69,8 +69,8 @@ OpRecord = collections.namedtuple( "OpRecord", - ["name", "nargs", "dtypes", "shapes", "rng", "diff_modes", "test_name", - "check_dtypes", "tolerance"]) + ["name", "nargs", "dtypes", "shapes", "rng_factory", "diff_modes", + "test_name", "check_dtypes", "tolerance"]) default_tolerance = { onp.bool_: 0, @@ -94,222 +94,222 @@ def tolerance(dtype, tol=None): return tol.get(dtype, default_tolerance[dtype]) -def op_record(name, nargs, dtypes, shapes, rng, diff_modes, test_name=None, - check_dtypes=True, tolerance=None): +def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, + test_name=None, check_dtypes=True, tolerance=None): test_name = test_name or name - return OpRecord(name, nargs, dtypes, shapes, rng, diff_modes, test_name, - check_dtypes, tolerance) + return OpRecord(name, nargs, dtypes, shapes, rng_factory, diff_modes, + test_name, check_dtypes, tolerance) JAX_ONE_TO_ONE_OP_RECORDS = [ - op_record("abs", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("add", 2, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("ceil", 1, float_dtypes, all_shapes, jtu.rand_default(), []), - op_record("conj", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal(), []), - op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("float_power", 2, inexact_dtypes, all_shapes, jtu.rand_default(), ["rev"], + op_record("abs", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("add", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("ceil", 1, float_dtypes, all_shapes, jtu.rand_default, []), + op_record("conj", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("float_power", 2, inexact_dtypes, all_shapes, jtu.rand_default, ["rev"], tolerance={onp.float32: 1e-5, onp.float64: 1e-12, onp.complex64: 1e-5, onp.complex128: 1e-12}), - op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default(), []), - op_record("greater", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), []), - op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), []), - op_record("less", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), []), - op_record("less_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), []), - op_record("log", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), - op_record("logical_and", 2, all_dtypes, all_shapes, jtu.rand_bool(), []), - op_record("logical_not", 1, all_dtypes, all_shapes, jtu.rand_bool(), []), - op_record("logical_or", 2, all_dtypes, all_shapes, jtu.rand_bool(), []), - op_record("logical_xor", 2, all_dtypes, all_shapes, jtu.rand_bool(), []), - op_record("maximum", 2, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("minimum", 2, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("multiply", 2, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("negative", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("not_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), ["rev"]), - op_record("array_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal(), ["rev"]), - op_record("reciprocal", 1, inexact_dtypes, all_shapes, jtu.rand_default(), []), - op_record("subtract", 2, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("sin", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("cos", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("tan", 1, number_dtypes, all_shapes, jtu.rand_uniform(-1.5, 1.5), - ["rev"]), - op_record("sinh", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("cosh", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), + op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default, []), + op_record("greater", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("less", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("less_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("log", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("logical_and", 2, all_dtypes, all_shapes, jtu.rand_bool, []), + op_record("logical_not", 1, all_dtypes, all_shapes, jtu.rand_bool, []), + op_record("logical_or", 2, all_dtypes, all_shapes, jtu.rand_bool, []), + op_record("logical_xor", 2, all_dtypes, all_shapes, jtu.rand_bool, []), + op_record("maximum", 2, number_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("minimum", 2, number_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("multiply", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("negative", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("not_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), + op_record("array_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), + op_record("reciprocal", 1, inexact_dtypes, all_shapes, jtu.rand_default, []), + op_record("subtract", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("sin", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("cos", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("tan", 1, number_dtypes, all_shapes, + partial(jtu.rand_uniform, -1.5, 1.5), ["rev"]), + op_record("sinh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("cosh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), # TODO(b/142975473): on CPU, tanh for complex128 is only accurate to # ~float32 precision. # TODO(b/143135720): on GPU, tanh has only ~float32 precision. - op_record("tanh", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], + op_record("tanh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], tolerance={onp.float64: 1e-7, onp.complex128: 1e-7}), - op_record("arcsin", 1, float_dtypes, all_shapes, jtu.rand_small(), ["rev"]), - op_record("arccos", 1, float_dtypes, all_shapes, jtu.rand_small(), ["rev"]), - op_record("arctan", 1, float_dtypes, all_shapes, jtu.rand_small(), ["rev"]), - op_record("arctan2", 2, float_dtypes, all_shapes, jtu.rand_small(), ["rev"]), - op_record("arcsinh", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), - op_record("arccosh", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), - op_record("arctanh", 1, number_dtypes, all_shapes, jtu.rand_small(), ["rev"]), + op_record("arcsin", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), + op_record("arccos", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), + op_record("arctan", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), + op_record("arctan2", 2, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), + op_record("arcsinh", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("arccosh", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("arctanh", 1, number_dtypes, all_shapes, jtu.rand_small, ["rev"]), ] JAX_COMPOUND_OP_RECORDS = [ # angle has inconsistent 32/64-bit return types across numpy versions. - op_record("angle", 1, number_dtypes, all_shapes, jtu.rand_default(), [], + op_record("angle", 1, number_dtypes, all_shapes, jtu.rand_default, [], check_dtypes=False), - op_record("atleast_1d", 1, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("atleast_2d", 1, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("atleast_3d", 1, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("cbrt", 1, default_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("conjugate", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("deg2rad", 1, float_dtypes, all_shapes, jtu.rand_default(), []), - op_record("divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), ["rev"]), + op_record("atleast_1d", 1, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("atleast_2d", 1, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("atleast_3d", 1, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("cbrt", 1, default_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("conjugate", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("deg2rad", 1, float_dtypes, all_shapes, jtu.rand_default, []), + op_record("divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), op_record("divmod", 2, int_dtypes + float_dtypes, all_shapes, - jtu.rand_nonzero(), []), - op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], + jtu.rand_nonzero, []), + op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], tolerance={onp.float16: 1e-2}), # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 # precision. - op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_positive(), [], + op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_positive, [], test_name="expm1_large", tolerance={onp.float64: 1e-8}), - op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), + op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_small_positive, [], tolerance={onp.float64: 1e-8}), - op_record("fix", 1, float_dtypes, all_shapes, jtu.rand_default(), []), - op_record("floor_divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), ["rev"]), - op_record("heaviside", 2, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("hypot", 2, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("kron", 2, number_dtypes, nonempty_shapes, jtu.rand_default(), []), - op_record("outer", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("imag", 1, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("iscomplex", 1, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("isfinite", 1, inexact_dtypes, all_shapes, jtu.rand_some_inf_and_nan(), []), - op_record("isinf", 1, inexact_dtypes, all_shapes, jtu.rand_some_inf_and_nan(), []), - op_record("isnan", 1, inexact_dtypes, all_shapes, jtu.rand_some_inf_and_nan(), []), - op_record("isneginf", 1, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan(), []), - op_record("isposinf", 1, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan(), []), - op_record("isreal", 1, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("isrealobj", 1, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("log2", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), - op_record("log10", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), - op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_positive(), [], + op_record("fix", 1, float_dtypes, all_shapes, jtu.rand_default, []), + op_record("floor_divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), + op_record("heaviside", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("hypot", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("kron", 2, number_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("outer", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("imag", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("iscomplex", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("isfinite", 1, inexact_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), + op_record("isinf", 1, inexact_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), + op_record("isnan", 1, inexact_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), + op_record("isneginf", 1, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), + op_record("isposinf", 1, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), + op_record("isreal", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("isrealobj", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("log2", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("log10", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_positive, [], test_name="log1p_large", tolerance={onp.float64: 1e-12}), - op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), [], + op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_small_positive, [], tolerance={onp.float64: 1e-12}), op_record("logaddexp", 2, float_dtypes, all_shapes, - jtu.rand_some_inf_and_nan(), ["rev"], + jtu.rand_some_inf_and_nan, ["rev"], tolerance={onp.float64: 1e-12}), op_record("logaddexp2", 2, float_dtypes, all_shapes, - jtu.rand_some_inf_and_nan(), ["rev"], + jtu.rand_some_inf_and_nan, ["rev"], tolerance={onp.float16: 1e-2}), op_record("polyval", 2, number_dtypes, nonempty_nonscalar_array_shapes, - jtu.rand_default(), [], check_dtypes=False, + jtu.rand_default, [], check_dtypes=False, tolerance={onp.float16: 1e-2, onp.float64: 1e-12}), - op_record("positive", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("power", 2, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), - op_record("rad2deg", 1, float_dtypes, all_shapes, jtu.rand_default(), []), - op_record("ravel", 1, all_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("real", 1, number_dtypes, all_shapes, jtu.rand_some_inf(), []), - op_record("remainder", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), [], + op_record("positive", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("power", 2, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("rad2deg", 1, float_dtypes, all_shapes, jtu.rand_default, []), + op_record("ravel", 1, all_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("real", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("remainder", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-2}), - op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), - op_record("sinc", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"], + op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("sinc", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], tolerance={onp.complex64: 1e-5}), - op_record("square", 1, number_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive(), ["rev"]), - op_record("transpose", 1, all_dtypes, all_shapes, jtu.rand_default(), ["rev"]), - op_record("true_divide", 2, all_dtypes, all_shapes, jtu.rand_nonzero(), ["rev"]), - op_record("where", 3, (onp.float32, onp.int64), all_shapes, jtu.rand_some_zero(), []), - op_record("diff", 1, number_dtypes, nonzerodim_shapes, jtu.rand_default(), ["rev"]), + op_record("square", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("transpose", 1, all_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("true_divide", 2, all_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), + op_record("where", 3, (onp.float32, onp.int64), all_shapes, jtu.rand_some_zero, []), + op_record("diff", 1, number_dtypes, nonzerodim_shapes, jtu.rand_default, ["rev"]), ] JAX_BITWISE_OP_RECORDS = [ op_record("bitwise_and", 2, int_dtypes + unsigned_dtypes, all_shapes, - jtu.rand_bool(), []), + jtu.rand_bool, []), op_record("bitwise_not", 1, int_dtypes + unsigned_dtypes, all_shapes, - jtu.rand_bool(), []), + jtu.rand_bool, []), op_record("bitwise_or", 2, int_dtypes + unsigned_dtypes, all_shapes, - jtu.rand_bool(), []), + jtu.rand_bool, []), op_record("bitwise_xor", 2, int_dtypes + unsigned_dtypes, all_shapes, - jtu.rand_bool(), []), + jtu.rand_bool, []), ] JAX_REDUCER_RECORDS = [ - op_record("mean", 1, number_dtypes, nonempty_shapes, jtu.rand_default(), []), - op_record("prod", 1, number_dtypes, all_shapes, jtu.rand_small_positive(), []), - op_record("sum", 1, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("var", 1, number_dtypes, nonempty_shapes, jtu.rand_default(), []), - op_record("std", 1, inexact_dtypes, nonempty_shapes, jtu.rand_default(), []), - op_record("nanmean", 1, inexact_dtypes, nonempty_shapes, jtu.rand_some_nan(), []), - op_record("nanprod", 1, inexact_dtypes, all_shapes, jtu.rand_some_nan(), []), - op_record("nansum", 1, number_dtypes, all_shapes, jtu.rand_some_nan(), []), + op_record("mean", 1, number_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("prod", 1, number_dtypes, all_shapes, jtu.rand_small_positive, []), + op_record("sum", 1, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("var", 1, number_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("std", 1, inexact_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("nanmean", 1, inexact_dtypes, nonempty_shapes, jtu.rand_some_nan, []), + op_record("nanprod", 1, inexact_dtypes, all_shapes, jtu.rand_some_nan, []), + op_record("nansum", 1, number_dtypes, all_shapes, jtu.rand_some_nan, []), ] JAX_REDUCER_NO_DTYPE_RECORDS = [ - op_record("all", 1, all_dtypes, all_shapes, jtu.rand_some_zero(), []), - op_record("any", 1, all_dtypes, all_shapes, jtu.rand_some_zero(), []), - op_record("max", 1, all_dtypes, nonempty_shapes, jtu.rand_default(), []), - op_record("min", 1, all_dtypes, nonempty_shapes, jtu.rand_default(), []), + op_record("all", 1, all_dtypes, all_shapes, jtu.rand_some_zero, []), + op_record("any", 1, all_dtypes, all_shapes, jtu.rand_some_zero, []), + op_record("max", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("min", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), ] JAX_ARGMINMAX_RECORDS = [ - op_record("argmin", 1, all_dtypes, nonempty_shapes, jtu.rand_some_equal(), []), - op_record("argmax", 1, all_dtypes, nonempty_shapes, jtu.rand_some_equal(), []), + op_record("argmin", 1, all_dtypes, nonempty_shapes, jtu.rand_some_equal, []), + op_record("argmax", 1, all_dtypes, nonempty_shapes, jtu.rand_some_equal, []), ] JAX_OPERATOR_OVERLOADS = [ - op_record("__add__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__sub__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__mul__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__eq__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__ne__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__lt__", 2, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__gt__", 2, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__ge__", 2, default_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__neg__", 1, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__pow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive(), []), - op_record("__mod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), [], + op_record("__add__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__sub__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__mul__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__eq__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__ne__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__lt__", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("__gt__", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("__ge__", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("__neg__", 1, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__pow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive, []), + op_record("__mod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), - op_record("__floordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), - op_record("__truediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), - op_record("__abs__", 1, number_dtypes, all_shapes, jtu.rand_default(), []), + op_record("__floordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("__truediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("__abs__", 1, number_dtypes, all_shapes, jtu.rand_default, []), # TODO(mattjj): __invert__ fails on bool dtypes because ~True == -2 - op_record("__invert__", 1, int_dtypes, all_shapes, jtu.rand_default(), []), + op_record("__invert__", 1, int_dtypes, all_shapes, jtu.rand_default, []), # TODO(mattjj): investigate these failures - # op_record("__or__", 2, number_dtypes, all_shapes, jtu.rand_bool(), []), - # op_record("__and__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - # op_record("__xor__", 2, number_dtypes, all_shapes, jtu.rand_bool(), []), - # op_record("__divmod__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), + # op_record("__or__", 2, number_dtypes, all_shapes, jtu.rand_bool, []), + # op_record("__and__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + # op_record("__xor__", 2, number_dtypes, all_shapes, jtu.rand_bool, []), + # op_record("__divmod__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), # TODO(mattjj): lshift, rshift ] JAX_RIGHT_OPERATOR_OVERLOADS = [ - op_record("__radd__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__rsub__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__rmul__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - op_record("__rpow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive(), []), - op_record("__rmod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), [], + op_record("__radd__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__rsub__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__rmul__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + op_record("__rpow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive, []), + op_record("__rmod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), - op_record("__rfloordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero(), []), - op_record("__rtruediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), - # op_record("__ror__", 2, number_dtypes, all_shapes, jtu.rand_bool(), []), - # op_record("__rand__", 2, number_dtypes, all_shapes, jtu.rand_default(), []), - # op_record("__rxor__", 2, number_dtypes, all_shapes, jtu.rand_bool(), []), - # op_record("__rdivmod__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), + op_record("__rfloordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("__rtruediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), + # op_record("__ror__", 2, number_dtypes, all_shapes, jtu.rand_bool, []), + # op_record("__rand__", 2, number_dtypes, all_shapes, jtu.rand_default, []), + # op_record("__rxor__", 2, number_dtypes, all_shapes, jtu.rand_bool, []), + # op_record("__rdivmod__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), ] numpy_version = tuple(map(int, onp.version.version.split('.'))) if numpy_version >= (1, 15): JAX_COMPOUND_OP_RECORDS += [ - op_record("isclose", 2, all_dtypes, all_shapes, jtu.rand_small_positive(), []), - op_record("gcd", 2, int_dtypes, all_shapes, jtu.rand_default(), []), - op_record("lcm", 2, int_dtypes, all_shapes, jtu.rand_default(), []), + op_record("isclose", 2, all_dtypes, all_shapes, jtu.rand_small_positive, []), + op_record("gcd", 2, int_dtypes, all_shapes, jtu.rand_default, []), + op_record("lcm", 2, int_dtypes, all_shapes, jtu.rand_default, []), ] JAX_REDUCER_NO_DTYPE_RECORDS += [ - op_record("ptp", 1, number_dtypes, nonempty_shapes, jtu.rand_default(), []), + op_record("ptp", 1, number_dtypes, nonempty_shapes, jtu.rand_default, []), ] if six.PY2: JAX_OPERATOR_OVERLOADS += [ - op_record("__div__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), + op_record("__div__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), ] JAX_RIGHT_OPERATOR_OVERLOADS += [ - op_record("__rdiv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero(), []), + op_record("__rdiv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), ] @@ -354,7 +354,7 @@ def _GetArgsMaker(self, rng, shapes, dtypes): jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix(rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, + "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), "check_dtypes": rec.check_dtypes, "op_tolerance": rec.tolerance} for shapes in filter( @@ -363,8 +363,9 @@ def _GetArgsMaker(self, rng, shapes, dtypes): for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in itertools.chain(JAX_ONE_TO_ONE_OP_RECORDS, JAX_COMPOUND_OP_RECORDS))) - def testOp(self, onp_op, lnp_op, rng, shapes, dtypes, check_dtypes, + def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, op_tolerance): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or jtu.NUMPY_SCALAR_SHAPE in shapes or @@ -382,14 +383,15 @@ def testOp(self, onp_op, lnp_op, rng, shapes, dtypes, check_dtypes, jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix(rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, "name": rec.name, + "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "name": rec.name, "op_tolerance": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in JAX_OPERATOR_OVERLOADS)) - def testOperatorOverload(self, name, rng, shapes, dtypes, op_tolerance): + def testOperatorOverload(self, name, rng_factory, shapes, dtypes, op_tolerance): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) fun = lambda *xs: getattr(operator, name.strip('_'))(*xs) tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) @@ -405,17 +407,18 @@ def testOperatorOverload(self, name, rng, shapes, dtypes, op_tolerance): jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix(rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, "name": rec.name, + "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "name": rec.name, "op_tolerance": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in JAX_RIGHT_OPERATOR_OVERLOADS)) - def testRightOperatorOverload(self, name, rng, shapes, dtypes, + def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, op_tolerance): if shapes[1] is jtu.PYTHON_SCALAR_SHAPE: raise SkipTest() # TODO(mattjj): clean up + rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) fun = lambda fst, snd: getattr(snd, name)(fst) tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) @@ -431,7 +434,7 @@ def testRightOperatorOverload(self, name, rng, shapes, dtypes, jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, + "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name)} for shapes in filter( _shapes_are_broadcast_compatible, @@ -440,7 +443,8 @@ def testRightOperatorOverload(self, name, rng, shapes, dtypes, _dtypes_are_compatible_for_bitwise_ops, CombosWithReplacement(rec.dtypes, rec.nargs))) for rec in JAX_BITWISE_OP_RECORDS)) - def testBitwiseOp(self, onp_op, lnp_op, rng, shapes, dtypes): + def testBitwiseOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes): + rng = rng_factory() if not FLAGS.jax_enable_x64 and any( onp.iinfo(dtype).bits == 64 for dtype in dtypes): self.skipTest("x64 types are disabled by jax_enable_x64") @@ -454,7 +458,7 @@ def testBitwiseOp(self, onp_op, lnp_op, rng, shapes, dtypes): rec.test_name.capitalize(), jtu.format_shape_dtype_string(shape, dtype), axis, "None" if out_dtype is None else onp.dtype(out_dtype).name, keepdims), - "rng": rec.rng, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, + "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), "axis": axis, "keepdims": keepdims} for rec in JAX_REDUCER_RECORDS @@ -462,7 +466,8 @@ def testBitwiseOp(self, onp_op, lnp_op, rng, shapes, dtypes): for out_dtype in [None] + rec.dtypes for axis in set(range(-len(shape), len(shape))) | set([None]) for keepdims in [False, True])) - def testReducer(self, onp_op, lnp_op, rng, shape, dtype, out_dtype, axis, keepdims): + def testReducer(self, onp_op, lnp_op, rng_factory, shape, dtype, out_dtype, axis, keepdims): + rng = rng_factory() onp_fun = lambda x: onp_op(x, axis, dtype=out_dtype, keepdims=keepdims) lnp_fun = lambda x: lnp_op(x, axis, dtype=out_dtype, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] @@ -479,14 +484,15 @@ def testReducer(self, onp_op, lnp_op, rng, shape, dtype, out_dtype, axis, keepdi {"testcase_name": "{}_inshape={}_axis={}_keepdims={}".format( rec.test_name.capitalize(), jtu.format_shape_dtype_string(shape, dtype), axis, keepdims), - "rng": rec.rng, "shape": shape, "dtype": dtype, + "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), "axis": axis, "keepdims": keepdims} for rec in JAX_REDUCER_NO_DTYPE_RECORDS for shape in rec.shapes for dtype in rec.dtypes for axis in set(range(-len(shape), len(shape))) | set([None]) for keepdims in [False, True])) - def testReducerNoDtype(self, onp_op, lnp_op, rng, shape, dtype, axis, keepdims): + def testReducerNoDtype(self, onp_op, lnp_op, rng_factory, shape, dtype, axis, keepdims): + rng = rng_factory() onp_fun = lambda x: onp_op(x, axis, keepdims=keepdims) lnp_fun = lambda x: lnp_op(x, axis, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] @@ -511,13 +517,14 @@ def testCountNonzero(self, shape, dtype, axis): {"testcase_name": "{}_inshape={}_axis={}".format( rec.test_name.capitalize(), jtu.format_shape_dtype_string(shape, dtype), axis), - "rng": rec.rng, "shape": shape, "dtype": dtype, + "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), "axis": axis} for rec in JAX_ARGMINMAX_RECORDS for shape in rec.shapes for dtype in rec.dtypes for axis in range(-len(shape), len(shape)))) - def testArgMinMax(self, onp_op, lnp_op, rng, shape, dtype, axis): + def testArgMinMax(self, onp_op, lnp_op, rng_factory, shape, dtype, axis): + rng = rng_factory() if dtype == onp.complex128 and jtu.device_under_test() == "gpu": raise unittest.SkipTest("complex128 reductions not supported on GPU") @@ -538,8 +545,8 @@ def lnp_fun(array_to_reduce): axes), "lhs_shape": lhs_shape, "lhs_dtype": lhs_dtype, "rhs_shape": rhs_shape, "rhs_dtype": rhs_dtype, - "axes": axes, "rng": rng} - for rng in [jtu.rand_default()] + "axes": axes, "rng_factory": rng_factory} + for rng_factory in [jtu.rand_default] for lhs_shape, rhs_shape, axes in [ [(2,), (2,), (-1, -1, -1, None)], # scalar output [(2, 4), (2, 4), (-1, -1, -1, 0)], # 2D vectors @@ -553,7 +560,8 @@ def lnp_fun(array_to_reduce): [(4, 5, 2), (4, 5, 2), (-1, -1, -1, None)] # same as before ] for lhs_dtype, rhs_dtype in CombosWithReplacement(number_dtypes, 2))) - def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): + def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] axisa, axisb, axisc, axis = axes lnp_fun = lambda a, b: lnp.cross(a, b, axisa, axisb, axisc, axis) @@ -572,8 +580,8 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): jtu.format_shape_dtype_string(rhs_shape, rhs_dtype)), "lhs_shape": lhs_shape, "lhs_dtype": lhs_dtype, "rhs_shape": rhs_shape, "rhs_dtype": rhs_dtype, - "rng": rng} - for rng in [jtu.rand_default()] + "rng_factory": rng_factory} + for rng_factory in [jtu.rand_default] for name, lhs_shape, rhs_shape in [ ("matrix-scalar", (3, 3), ()), ("scalar-matrix", (), (3, 3)), @@ -586,7 +594,8 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): ("matrix-tensor", (5, 2), (3, 2, 4)), ("tensor-tensor", (2, 3, 4), (5, 4, 1))] for lhs_dtype, rhs_dtype in CombosWithReplacement(number_dtypes, 2))) - def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): + def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] tol_spec = {onp.float16: 1e-2} tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) @@ -602,8 +611,8 @@ def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): jtu.format_shape_dtype_string(rhs_shape, rhs_dtype)), "lhs_shape": lhs_shape, "lhs_dtype": lhs_dtype, "rhs_shape": rhs_shape, "rhs_dtype": rhs_dtype, - "rng": rng} - for rng in [jtu.rand_default()] + "rng_factory": rng_factory} + for rng_factory in [jtu.rand_default] for name, lhs_shape, rhs_shape in [ ("vector-vector", (3,), (3,)), ("matrix-vector", (3, 3), (3,)), @@ -616,7 +625,8 @@ def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): ("tensor-tensor", (5, 3, 4), (5, 4, 1)), ("tensor-tensor-broadcast", (3, 1, 3, 4), (5, 4, 1))] for lhs_dtype, rhs_dtype in CombosWithReplacement(number_dtypes, 2))) - def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): + def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.float64: 1e-12} tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) @@ -632,8 +642,8 @@ def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): axes), "lhs_shape": lhs_shape, "lhs_dtype": lhs_dtype, "rhs_shape": rhs_shape, "rhs_dtype": rhs_dtype, - "axes": axes, "rng": rng} - for rng in [jtu.rand_default()] + "axes": axes, "rng_factory": rng_factory} + for rng_factory in [jtu.rand_default] for lhs_shape, rhs_shape, axes in [ [(2, 3, 4), (5, 6, 7), 0], # from issue #740 [(2, 3, 4), (3, 4, 5, 6), 2], @@ -642,7 +652,8 @@ def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): [(1, 2, 3, 4), (4, 5, 3, 6), [[2, 3], [2, 0]]], ] for lhs_dtype, rhs_dtype in CombosWithReplacement(number_dtypes, 2))) - def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): + def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] lnp_fun = lambda a, b: lnp.tensordot(a, b, axes) onp_fun = lambda a, b: onp.tensordot(a, b, axes) @@ -658,7 +669,7 @@ def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): jtu.format_shape_dtype_string(rhs_shape, rhs_dtype)), "lhs_shape": lhs_shape, "lhs_dtype": lhs_dtype, "rhs_shape": rhs_shape, "rhs_dtype": rhs_dtype, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} # TODO(phawkins): support integer dtypes too. for lhs_dtype, rhs_dtype in CombosWithReplacement(inexact_dtypes, 2) for lhs_shape, rhs_shape in [ @@ -666,7 +677,8 @@ def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng): if len(jtu._dims_of_shape(l)) == 0 or len(jtu._dims_of_shape(r)) == 0 or l[-1] == r[-1]])) - def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): + def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] onp_fun = lambda lhs, rhs: onp.inner(lhs, rhs) lnp_fun = lambda lhs, rhs: lnp.inner(lhs, rhs) @@ -681,13 +693,14 @@ def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng): {"testcase_name": "_{}_amin={}_amax={}".format( jtu.format_shape_dtype_string(shape, dtype), a_min, a_max), "shape": shape, "dtype": dtype, "a_min": a_min, "a_max": a_max, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for shape in all_shapes for dtype in number_dtypes for a_min, a_max in [(-1, None), (None, 1), (-1, 1), (-lnp.ones(1), None), (None, lnp.ones(1)), (-lnp.ones(1), lnp.ones(1))])) - def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng): + def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng_factory): + rng = rng_factory() onp_fun = lambda x: onp.clip(x, a_min=a_min, a_max=a_max) lnp_fun = lambda x: lnp.clip(x, a_min=a_min, a_max=a_max) args_maker = lambda: [rng(shape, dtype)] @@ -699,10 +712,11 @@ def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng): {"testcase_name": "_{}_decimals={}".format( jtu.format_shape_dtype_string(shape, dtype), decimals), "shape": shape, "dtype": dtype, "decimals": decimals, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for shape in all_shapes for dtype in number_dtypes for decimals in [0, 1, -2])) - def testRoundStaticDecimals(self, shape, dtype, decimals, rng): + def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): + rng = rng_factory() if lnp.issubdtype(dtype, onp.integer) and decimals < 0: self.skipTest("Integer rounding with decimals < 0 not implemented") onp_fun = lambda x: onp.round(x, decimals=decimals) @@ -720,8 +734,9 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng): constant_values_rank), "shape": shape, "dtype": dtype, "mode": mode, "pad_width_rank": pad_width_rank, - "constant_values_rank": constant_values_rank, "rng": jtu.rand_default(), - "irng": jtu.rand_int(3)} + "constant_values_rank": constant_values_rank, + "rng_factory": jtu.rand_default, + "irng_factory": partial(jtu.rand_int, 3)} for mode, constant_values_rank, shapes in [ ('constant', 0, all_shapes), ('constant', 1, all_shapes), @@ -733,7 +748,9 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng): for shape in shapes for dtype in all_dtypes for pad_width_rank in range(3))) def testPad(self, shape, dtype, mode, pad_width_rank, constant_values_rank, - rng, irng): + rng_factory, irng_factory): + rng = rng_factory() + irng = irng_factory() pad_width = irng([len(shape), 2][2 - pad_width_rank:], onp.int32) def onp_fun(x, kwargs): if pad_width.size == 0: @@ -756,12 +773,13 @@ def args_maker(): {"testcase_name": "_shape=[{}]_reps={}".format( jtu.format_shape_dtype_string(shape, dtype), reps), "shape": shape, "dtype": dtype, "reps": reps, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for reps in [(), (2,), (3, 4), (2, 3, 4)] for dtype in default_dtypes for shape in all_shapes )) - def testTile(self, shape, dtype, reps, rng): + def testTile(self, shape, dtype, reps, rng_factory): + rng = rng_factory() onp_fun = lambda arg: onp.tile(arg, reps) lnp_fun = lambda arg: lnp.tile(arg, reps) @@ -775,12 +793,13 @@ def testTile(self, shape, dtype, reps, rng): axis, ",".join(str(d) for d in base_shape), ",".join(onp.dtype(dtype).name for dtype in dtypes)), "axis": axis, "base_shape": base_shape, "dtypes": dtypes, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for num_arrs in [3] for dtypes in CombosWithReplacement(default_dtypes, num_arrs) for base_shape in [(4,), (3, 4), (2, 3, 4)] for axis in range(-len(base_shape)+1, len(base_shape)))) - def testConcatenate(self, axis, base_shape, dtypes, rng): + def testConcatenate(self, axis, base_shape, dtypes, rng_factory): + rng = rng_factory() wrapped_axis = axis % len(base_shape) shapes = [base_shape[:wrapped_axis] + (size,) + base_shape[wrapped_axis+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), dtypes)] @@ -798,11 +817,12 @@ def args_maker(): axis, ",".join(str(d) for d in base_shape), ",".join(onp.dtype(dtype).name for dtype in dtypes)), "axis": axis, "base_shape": base_shape, "dtypes": dtypes, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for dtypes in CombosWithReplacement(default_dtypes, 2) for base_shape in [(4,), (3, 4), (2, 3, 4)] for axis in range(-len(base_shape)+1, len(base_shape)))) - def testAppend(self, axis, base_shape, dtypes, rng): + def testAppend(self, axis, base_shape, dtypes, rng_factory): + rng = rng_factory() wrapped_axis = axis % len(base_shape) shapes = [base_shape[:wrapped_axis] + (size,) + base_shape[wrapped_axis+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), dtypes)] @@ -819,12 +839,13 @@ def args_maker(): {"testcase_name": "_shape=[{}]_axis={}_repeats={}".format( jtu.format_shape_dtype_string(shape, dtype), axis, repeats), "axis": axis, "shape": shape, "dtype": dtype, "repeats": repeats, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for repeats in [0, 1, 2] for dtype in default_dtypes for shape in all_shapes for axis in [None] + list(range(-len(shape), len(shape))))) - def testRepeat(self, axis, shape, dtype, repeats, rng): + def testRepeat(self, axis, shape, dtype, repeats, rng_factory): + rng = rng_factory() onp_fun = lambda arg: onp.repeat(arg, repeats=repeats, axis=axis) lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=axis) @@ -867,14 +888,15 @@ def test_single(m, args_maker, repeats, axis): {"testcase_name": "op={}_shape=[{}]_axis={}_out_dtype={}".format( op, jtu.format_shape_dtype_string(shape, dtype), axis, out_dtype), "axis": axis, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, - "rng": jtu.rand_default(), "lnp_op": getattr(lnp, op), + "rng_factory": jtu.rand_default, "lnp_op": getattr(lnp, op), "onp_op": getattr(onp, op)} for op in ["cumsum", "cumprod"] for dtype in default_dtypes for out_dtype in default_dtypes for shape in all_shapes for axis in [None] + list(range(-len(shape), len(shape))))) - def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, lnp_op, rng): + def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, lnp_op, rng_factory): + rng = rng_factory() onp_fun = lambda arg: onp_op(arg, axis=axis, dtype=out_dtype) lnp_fun = lambda arg: lnp_op(arg, axis=axis, dtype=out_dtype) @@ -888,12 +910,13 @@ def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, lnp_op, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_dtype={}_m={}_n={}_k={}".format( onp.dtype(dtype).name, m, n, k), - "m": m, "n": n, "k": k, "dtype": dtype, "rng": jtu.rand_default()} + "m": m, "n": n, "k": k, "dtype": dtype, "rng_factory": jtu.rand_default} for dtype in default_dtypes for n in [0, 4] for m in [None, 0, 1, 3, 4] for k in list(range(-4, 4)))) - def testTri(self, m, n, k, dtype, rng): + def testTri(self, m, n, k, dtype, rng_factory): + rng = rng_factory() onp_fun = lambda: onp.tri(n, M=m, k=k, dtype=dtype) lnp_fun = lambda: lnp.tri(n, M=m, k=k, dtype=dtype) args_maker = lambda: [] @@ -904,12 +927,13 @@ def testTri(self, m, n, k, dtype, rng): {"testcase_name": "_op={}_shape={}_k={}".format( op, jtu.format_shape_dtype_string(shape, dtype), k), "dtype": dtype, "shape": shape, "op": op, "k": k, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for dtype in default_dtypes for shape in [shape for shape in all_shapes if len(shape) >= 2] for op in ["tril", "triu"] for k in list(range(-3, 3)))) - def testTriLU(self, dtype, shape, op, k, rng): + def testTriLU(self, dtype, shape, op, k, rng_factory): + rng = rng_factory() onp_fun = lambda arg: getattr(onp, op)(arg, k=k) lnp_fun = lambda arg: getattr(lnp, op)(arg, k=k) args_maker = lambda: [rng(shape, dtype)] @@ -919,11 +943,12 @@ def testTriLU(self, dtype, shape, op, k, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_k={}".format( jtu.format_shape_dtype_string(shape, dtype), k), - "dtype": dtype, "shape": shape, "k": k, "rng": jtu.rand_default()} + "dtype": dtype, "shape": shape, "k": k, "rng_factory": jtu.rand_default} for dtype in default_dtypes for shape in [shape for shape in all_shapes if len(shape) in (1, 2)] for k in list(range(-4, 4)))) - def testDiag(self, shape, dtype, k, rng): + def testDiag(self, shape, dtype, k, rng_factory): + rng = rng_factory() onp_fun = lambda arg: onp.diag(arg, k) lnp_fun = lambda arg: lnp.diag(arg, k) args_maker = lambda: [rng(shape, dtype)] @@ -934,14 +959,15 @@ def testDiag(self, shape, dtype, k, rng): {"testcase_name": "_shape={}_offset={}_axis1={}_axis2={}".format( jtu.format_shape_dtype_string(shape, dtype), offset, axis1, axis2), "dtype": dtype, "shape": shape, "offset": offset, "axis1": axis1, - "axis2": axis2, "rng": jtu.rand_default()} + "axis2": axis2, "rng_factory": jtu.rand_default} for dtype in default_dtypes for shape in [shape for shape in all_shapes if len(shape) >= 2] for axis1 in range(-len(shape), len(shape)) for axis2 in [a for a in range(-len(shape), len(shape)) if a % len(shape) != axis1 % len(shape)] for offset in list(range(-4, 4)))) - def testDiagonal(self, shape, dtype, offset, axis1, axis2, rng): + def testDiagonal(self, shape, dtype, offset, axis1, axis2, rng_factory): + rng = rng_factory() onp_fun = lambda arg: onp.diagonal(arg, offset, axis1, axis2) lnp_fun = lambda arg: lnp.diagonal(arg, offset, axis1, axis2) args_maker = lambda: [rng(shape, dtype)] @@ -965,7 +991,7 @@ def testIdentity(self, n, dtype): jtu.format_shape_dtype_string(shape, dtype), out_dtype, offset, axis1, axis2), "dtype": dtype, "out_dtype": out_dtype, "shape": shape, "offset": offset, - "axis1": axis1, "axis2": axis2, "rng": jtu.rand_default()} + "axis1": axis1, "axis2": axis2, "rng_factory": jtu.rand_default} for dtype in default_dtypes for out_dtype in [None] + number_dtypes for shape in [shape for shape in all_shapes if len(shape) >= 2] @@ -973,7 +999,8 @@ def testIdentity(self, n, dtype): for axis2 in range(-len(shape), len(shape)) if (axis1 % len(shape)) != (axis2 % len(shape)) for offset in list(range(-4, 4)))) - def testTrace(self, shape, dtype, out_dtype, offset, axis1, axis2, rng): + def testTrace(self, shape, dtype, out_dtype, offset, axis1, axis2, rng_factory): + rng = rng_factory() onp_fun = lambda arg: onp.trace(arg, offset, axis1, axis2, out_dtype) lnp_fun = lambda arg: lnp.trace(arg, offset, axis1, axis2, out_dtype) args_maker = lambda: [rng(shape, dtype)] @@ -983,7 +1010,7 @@ def testTrace(self, shape, dtype, out_dtype, offset, axis1, axis2, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_axis={}".format( jtu.format_test_name_suffix("", [shape] * len(dtypes), dtypes), axis), - "shape": shape, "axis": axis, "dtypes": dtypes, "rng": rng} + "shape": shape, "axis": axis, "dtypes": dtypes, "rng_factory": rng_factory} for dtypes in [ [onp.float32], [onp.float32, onp.float32], @@ -993,8 +1020,9 @@ def testTrace(self, shape, dtype, out_dtype, offset, axis1, axis2, rng): ] for shape in [(), (2,), (3, 4), (1, 100)] for axis in range(-len(shape), len(shape) + 1) - for rng in [jtu.rand_default()])) - def testStack(self, shape, axis, dtypes, rng): + for rng_factory in [jtu.rand_default])) + def testStack(self, shape, axis, dtypes, rng_factory): + rng = rng_factory() args_maker = lambda: [[rng(shape, dtype) for dtype in dtypes]] onp_fun = partial(onp.stack, axis=axis) lnp_fun = partial(lnp.stack, axis=axis) @@ -1004,7 +1032,7 @@ def testStack(self, shape, axis, dtypes, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_{}".format( op, jtu.format_test_name_suffix("", [shape] * len(dtypes), dtypes)), - "shape": shape, "op": op, "dtypes": dtypes, "rng": rng} + "shape": shape, "op": op, "dtypes": dtypes, "rng_factory": rng_factory} for op in ["hstack", "vstack", "dstack"] for dtypes in [ [onp.float32], @@ -1014,8 +1042,9 @@ def testStack(self, shape, axis, dtypes, rng): [onp.float32, onp.int32, onp.float64], ] for shape in [(), (2,), (3, 4), (1, 100), (2, 3, 4)] - for rng in [jtu.rand_default()])) - def testHVDStack(self, shape, op, dtypes, rng): + for rng_factory in [jtu.rand_default])) + def testHVDStack(self, shape, op, dtypes, rng_factory): + rng = rng_factory() args_maker = lambda: [[rng(shape, dtype) for dtype in dtypes]] onp_fun = getattr(onp, op) lnp_fun = getattr(lnp, op) @@ -1026,11 +1055,12 @@ def testHVDStack(self, shape, op, dtypes, rng): jtu.format_shape_dtype_string(shape, fill_value_dtype), onp.dtype(out_dtype).name if out_dtype else "None"), "shape": shape, "fill_value_dtype": fill_value_dtype, - "out_dtype": out_dtype, "rng": jtu.rand_default()} + "out_dtype": out_dtype, "rng_factory": jtu.rand_default} for shape in array_shapes for fill_value_dtype in default_dtypes for out_dtype in [None] + default_dtypes)) - def testFull(self, shape, fill_value_dtype, out_dtype, rng): + def testFull(self, shape, fill_value_dtype, out_dtype, rng_factory): + rng = rng_factory() onp_fun = lambda fill_value: onp.full(shape, fill_value, dtype=out_dtype) lnp_fun = lambda fill_value: lnp.full(shape, fill_value, dtype=out_dtype) args_maker = lambda: [rng((), fill_value_dtype)] @@ -1044,12 +1074,13 @@ def testFull(self, shape, fill_value_dtype, out_dtype, rng): onp.dtype(out_dtype).name), "shape": shape, "in_dtype": in_dtype, "fill_value_dtype": fill_value_dtype, "out_dtype": out_dtype, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for shape in array_shapes for in_dtype in default_dtypes for fill_value_dtype in default_dtypes for out_dtype in default_dtypes)) - def testFullLike(self, shape, in_dtype, fill_value_dtype, out_dtype, rng): + def testFullLike(self, shape, in_dtype, fill_value_dtype, out_dtype, rng_factory): + rng = rng_factory() onp_fun = lambda x, fill_value: onp.full_like(x, fill_value, dtype=out_dtype) lnp_fun = lambda x, fill_value: lnp.full_like(x, fill_value, dtype=out_dtype) args_maker = lambda: [rng(shape, in_dtype), rng((), fill_value_dtype)] @@ -1060,12 +1091,13 @@ def testFullLike(self, shape, in_dtype, fill_value_dtype, out_dtype, rng): {"testcase_name": "_{}_axis={}_{}sections".format( jtu.format_shape_dtype_string(shape, dtype), axis, num_sections), "shape": shape, "num_sections": num_sections, "axis": axis, - "dtype": dtype, "rng": jtu.rand_default()} + "dtype": dtype, "rng_factory": jtu.rand_default} for shape, axis, num_sections in [ ((3,), 0, 3), ((12,), 0, 3), ((12, 4), 0, 4), ((12, 4), 1, 2), ((2, 3, 4), -1, 2), ((2, 3, 4), -2, 3)] for dtype in default_dtypes)) - def testSplitStaticInt(self, shape, num_sections, axis, dtype, rng): + def testSplitStaticInt(self, shape, num_sections, axis, dtype, rng_factory): + rng = rng_factory() onp_fun = lambda x: onp.split(x, num_sections, axis=axis) lnp_fun = lambda x: lnp.split(x, num_sections, axis=axis) args_maker = lambda: [rng(shape, dtype)] @@ -1076,12 +1108,13 @@ def testSplitStaticInt(self, shape, num_sections, axis, dtype, rng): {"testcase_name": "_{}_axis={}_{}sections".format( jtu.format_shape_dtype_string(shape, dtype), axis, num_sections), "shape": shape, "num_sections": num_sections, "axis": axis, - "dtype": dtype, "rng": jtu.rand_default()} + "dtype": dtype, "rng_factory": jtu.rand_default} for shape, axis, num_sections in [ ((12, 4), 0, 4), ((12, 4), 1, 2), ((2, 3, 4), 2, 2), ((4, 3, 4), 0, 2)] for dtype in default_dtypes)) - def testHVDSplit(self, shape, num_sections, axis, dtype, rng): + def testHVDSplit(self, shape, num_sections, axis, dtype, rng_factory): + rng = rng_factory() def fn(module, axis): if axis == 0: return module.vsplit @@ -1103,7 +1136,7 @@ def fn(module, axis): jtu.format_shape_dtype_string(out_shape, dtype), order), "arg_shape": arg_shape, "out_shape": out_shape, "dtype": dtype, - "order": order, "rng": jtu.rand_default()} + "order": order, "rng_factory": jtu.rand_default} for dtype in default_dtypes for order in ["C", "F"] for arg_shape, out_shape in [ @@ -1116,7 +1149,8 @@ def fn(module, axis): ((2, 1, 4), (-1,)), ((2, 2, 4), (2, 8)) ])) - def testReshape(self, arg_shape, out_shape, dtype, order, rng): + def testReshape(self, arg_shape, out_shape, dtype, order, rng_factory): + rng = rng_factory() onp_fun = lambda x: onp.reshape(x, out_shape, order=order) lnp_fun = lambda x: lnp.reshape(x, out_shape, order=order) args_maker = lambda: [rng(arg_shape, dtype)] @@ -1128,14 +1162,15 @@ def testReshape(self, arg_shape, out_shape, dtype, order, rng): jtu.format_shape_dtype_string(arg_shape, dtype), jtu.format_shape_dtype_string(out_shape, dtype)), "arg_shape": arg_shape, "out_shape": out_shape, "dtype": dtype, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for dtype in default_dtypes for arg_shape, out_shape in [ ((7, 0), (0, 42, 101)), ((2, 1, 4), (-1,)), ((2, 2, 4), (2, 8)) ])) - def testReshapeMethod(self, arg_shape, out_shape, dtype, rng): + def testReshapeMethod(self, arg_shape, out_shape, dtype, rng_factory): + rng = rng_factory() onp_fun = lambda x: onp.reshape(x, out_shape) lnp_fun = lambda x: x.reshape(*out_shape) args_maker = lambda: [rng(arg_shape, dtype)] @@ -1146,11 +1181,12 @@ def testReshapeMethod(self, arg_shape, out_shape, dtype, rng): {"testcase_name": "_inshape={}_expanddim={}".format( jtu.format_shape_dtype_string(arg_shape, dtype), dim), "arg_shape": arg_shape, "dtype": dtype, "dim": dim, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for arg_shape in [(), (3,), (3, 4)] for dtype in default_dtypes for dim in range(-len(arg_shape)+1, len(arg_shape)))) - def testExpandDimsStaticDim(self, arg_shape, dtype, dim, rng): + def testExpandDimsStaticDim(self, arg_shape, dtype, dim, rng_factory): + rng = rng_factory() onp_fun = lambda x: onp.expand_dims(x, dim) lnp_fun = lambda x: lnp.expand_dims(x, dim) args_maker = lambda: [rng(arg_shape, dtype)] @@ -1161,12 +1197,13 @@ def testExpandDimsStaticDim(self, arg_shape, dtype, dim, rng): {"testcase_name": "_inshape={}_axes=({},{})".format( jtu.format_shape_dtype_string(arg_shape, dtype), ax1, ax2), "arg_shape": arg_shape, "dtype": dtype, "ax1": ax1, "ax2": ax2, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for arg_shape, ax1, ax2 in [ ((3, 4), 0, 1), ((3, 4), 1, 0), ((3, 4, 5), 1, 2), ((3, 4, 5), -1, -2), ((3, 4, 5), 0, 1)] for dtype in default_dtypes)) - def testSwapAxesStaticAxes(self, arg_shape, dtype, ax1, ax2, rng): + def testSwapAxesStaticAxes(self, arg_shape, dtype, ax1, ax2, rng_factory): + rng = rng_factory() onp_fun = lambda x: onp.swapaxes(x, ax1, ax2) lnp_fun = lambda x: lnp.swapaxes(x, ax1, ax2) args_maker = lambda: [rng(arg_shape, dtype)] @@ -1177,14 +1214,15 @@ def testSwapAxesStaticAxes(self, arg_shape, dtype, ax1, ax2, rng): {"testcase_name": "_inshape={}_axis={}".format( jtu.format_shape_dtype_string(arg_shape, dtype), ax), "arg_shape": arg_shape, "dtype": dtype, "ax": ax, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for arg_shape, ax in [ ((3, 1), None), ((3, 1), 1), ((1, 3, 1), (0, 2)), ((1, 4, 1), (0,))] for dtype in default_dtypes)) - def testSqueeze(self, arg_shape, dtype, ax, rng): + def testSqueeze(self, arg_shape, dtype, ax, rng_factory): + rng = rng_factory() onp_fun = lambda x: onp.squeeze(x, ax) lnp_fun = lambda x: lnp.squeeze(x, ax) args_maker = lambda: [rng(arg_shape, dtype)] @@ -1197,7 +1235,7 @@ def testSqueeze(self, arg_shape, dtype, ax, rng): axis, (None if weights_shape is None else jtu.format_shape_dtype_string(weights_shape, dtype)), returned), - "rng": jtu.rand_default(), "shape": shape, "dtype": dtype, "axis": axis, + "rng_factory": jtu.rand_default, "shape": shape, "dtype": dtype, "axis": axis, "weights_shape": weights_shape, "returned": returned} for shape in nonempty_shapes for dtype in number_dtypes @@ -1207,7 +1245,8 @@ def testSqueeze(self, arg_shape, dtype, ax, rng): for weights_shape in ([None, shape] if axis is None else [None, (shape[axis],), shape]) for returned in [False, True])) - def testAverage(self, shape, dtype, axis, weights_shape, returned, rng): + def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): + rng = rng_factory() if weights_shape is None: onp_fun = lambda x: onp.average(x, axis, returned=returned) lnp_fun = lambda x: lnp.average(x, axis, returned=returned) @@ -1383,12 +1422,13 @@ def testTracingPrimitiveWithNoTranslationErrorMessage(self): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_axis={}".format( jtu.format_shape_dtype_string(shape, dtype), axis), - "rng": rng, "shape": shape, "dtype": dtype, "axis": axis} + "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "axis": axis} for shape in [(3,), (2, 3)] for dtype in default_dtypes for axis in range(-len(shape), len(shape)) # Test negative axes - for rng in [jtu.rand_default()])) - def testFlip(self, shape, dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testFlip(self, shape, dtype, axis, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) lnp_op = lambda x: lnp.flip(x, axis) onp_op = lambda x: onp.flip(x, axis) @@ -1398,11 +1438,12 @@ def testFlip(self, shape, dtype, axis, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format( jtu.format_shape_dtype_string(shape, dtype)), - "rng": rng, "shape": shape, "dtype": dtype} + "rng_factory": rng_factory, "shape": shape, "dtype": dtype} for shape in [(3,), (2, 3), (3, 2, 4)] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testFlipud(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testFlipud(self, shape, dtype, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) lnp_op = lambda x: lnp.flipud(x) onp_op = lambda x: onp.flipud(x) @@ -1413,11 +1454,12 @@ def testFlipud(self, shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format( jtu.format_shape_dtype_string(shape, dtype)), - "rng": rng, "shape": shape, "dtype": dtype} + "rng_factory": rng_factory, "shape": shape, "dtype": dtype} for shape in [(3, 2), (2, 3), (3, 2, 4)] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testFliplr(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testFliplr(self, shape, dtype, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) lnp_op = lambda x: lnp.fliplr(x) onp_op = lambda x: onp.fliplr(x) @@ -1428,7 +1470,7 @@ def testFliplr(self, shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_k={}_axes={}".format( jtu.format_shape_dtype_string(shape, dtype), k, axes), - "rng": rng, "shape": shape, "dtype": dtype, "k": k, "axes": axes} + "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "k": k, "axes": axes} for shape, axes in [ [(2, 3), (0, 1)], [(2, 3), (1, 0)], @@ -1437,8 +1479,9 @@ def testFliplr(self, shape, dtype, rng): ] for k in range(-3, 4) for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testRot90(self, shape, dtype, k, axes, rng): + for rng_factory in [jtu.rand_default])) + def testRot90(self, shape, dtype, k, axes, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) lnp_op = lambda x: lnp.rot90(x, k, axes) onp_op = lambda x: onp.rot90(x, k, axes) @@ -1525,7 +1568,7 @@ def testArgsortManually(self): {"testcase_name": "_{}_shifts={}_axis={}".format( jtu.format_shape_dtype_string(shape, dtype), shifts, axis), - "rng": rng, "shape": shape, "dtype": dtype, "shifts": shifts, + "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "shifts": shifts, "axis": axis} for dtype in all_dtypes for shape in [(3, 4), (3, 4, 5), (7, 4, 0)] @@ -1536,8 +1579,9 @@ def testArgsortManually(self): ((-2,), (-2,)), ((1, 2), (0, -1)) ] - for rng in [jtu.rand_default()])) - def testRoll(self, shape, dtype, shifts, axis, rng): + for rng_factory in [jtu.rand_default])) + def testRoll(self, shape, dtype, shifts, axis, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype), onp.array(shifts)] lnp_op = partial(lnp.roll, axis=axis) onp_op = partial(onp.roll, axis=axis) @@ -1549,24 +1593,26 @@ def testRoll(self, shape, dtype, shifts, axis, rng): jtu.format_shape_dtype_string(shape, dtype), jtu.format_shape_dtype_string(index_shape, index_dtype), axis, mode), - "rng": rng, "rng_indices": rng_indices, "shape": shape, - "index_shape": index_shape, "dtype": dtype, "index_dtype": index_dtype, - "axis": axis, "mode": mode} + "rng_factory": rng_factory, "rng_indices_factory": rng_indices_factory, + "shape": shape, "index_shape": index_shape, "dtype": dtype, + "index_dtype": index_dtype, "axis": axis, "mode": mode} for shape in [(3,), (3, 4), (3, 4, 5)] for index_shape in scalar_shapes + [(3,), (2, 1, 3)] for axis in itertools.chain(range(-len(shape), len(shape)), [None]) for dtype in all_dtypes for index_dtype in int_dtypes for mode in ['wrap', 'clip'] - for rng in [jtu.rand_default()] - for rng_indices in [jtu.rand_int(-5, 5)])) - def testTake(self, shape, dtype, index_shape, index_dtype, axis, mode, rng, - rng_indices): + for rng_factory in [jtu.rand_default] + for rng_indices_factory in [partial(jtu.rand_int, -5, 5)])) + def testTake(self, shape, dtype, index_shape, index_dtype, axis, mode, + rng_factory, rng_indices_factory): def args_maker(): x = rng(shape, dtype) i = rng_indices(index_shape, index_dtype) return x, i + rng = rng_factory() + rng_indices = rng_indices_factory() lnp_op = lambda x, i: lnp.take(x, i, axis=axis, mode=mode) onp_op = lambda x, i: onp.take(x, i, axis=axis, mode=mode) self._CheckAgainstNumpy(lnp_op, onp_op, args_maker, check_dtypes=True) @@ -1575,7 +1621,7 @@ def args_maker(): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_ishape={}_axis={}".format( jtu.format_shape_dtype_string(x_shape, dtype), i_shape, axis), - "rng": rng, "x_shape": x_shape, "i_shape": i_shape, "dtype": dtype, + "rng_factory": rng_factory, "x_shape": x_shape, "i_shape": i_shape, "dtype": dtype, "axis": axis} for x_shape, i_shape in filter( _shapes_are_equal_length, @@ -1583,8 +1629,9 @@ def args_maker(): CombosWithReplacement(nonempty_nonscalar_array_shapes, 2))) for axis in itertools.chain(range(len(x_shape)), [-1], [None]) for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testTakeAlongAxis(self, x_shape, i_shape, dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testTakeAlongAxis(self, x_shape, i_shape, dtype, axis, rng_factory): + rng = rng_factory() i_shape = onp.array(i_shape) if axis is None: i_shape = [onp.prod(i_shape, dtype=onp.int64)] @@ -1610,12 +1657,13 @@ def args_maker(): jtu.format_shape_dtype_string([shape], dtype), n, increasing), "dtype": dtype, "shape": shape, "n": n, "increasing": increasing, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for dtype in inexact_dtypes for shape in [0, 5] for n in [2, 4] for increasing in [False, True])) - def testVander(self, shape, dtype, n, increasing, rng): + def testVander(self, shape, dtype, n, increasing, rng_factory): + rng = rng_factory() onp_fun = lambda arg: onp.vander(arg, N=n, increasing=increasing) lnp_fun = lambda arg: lnp.vander(arg, N=n, increasing=increasing) args_maker = lambda: [rng([shape], dtype)] @@ -1628,10 +1676,12 @@ def testVander(self, shape, dtype, n, increasing, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix("nan_to_num", [shape], [dtype]), - "rng": jtu.rand_some_inf_and_nan(), "shape": shape, "dtype": dtype} + "rng_factory": jtu.rand_some_inf_and_nan, "shape": shape, + "dtype": dtype} for shape in all_shapes for dtype in inexact_dtypes)) - def testNanToNum(self, rng, shape, dtype): + def testNanToNum(self, rng_factory, shape, dtype): + rng = rng_factory() dtype = onp.dtype(xla_bridge.canonicalize_dtype(dtype)).type args_maker = lambda: [rng(shape, dtype)] self._CheckAgainstNumpy(onp.nan_to_num, lnp.nan_to_num, args_maker, @@ -1640,14 +1690,15 @@ def testNanToNum(self, rng, shape, dtype): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix("ix_", shapes, dtypes), - "rng": jtu.rand_default(), "shapes": shapes, "dtypes": dtypes} + "rng_factory": jtu.rand_default, "shapes": shapes, "dtypes": dtypes} for shapes, dtypes in ( ((), ()), (((7,),), (onp.int32,)), (((3,), (4,)), (onp.int32, onp.int32)), (((3,), (1,), (4,)), (onp.int32, onp.int32, onp.int32)), ))) - def testIx_(self, rng, shapes, dtypes): + def testIx_(self, rng_factory, shapes, dtypes): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype) for shape, dtype in zip(shapes, dtypes)] self._CheckAgainstNumpy(onp.ix_, lnp.ix_, args_maker, @@ -1698,13 +1749,14 @@ def testQuantile(self, op, a_rng, q_rng, a_shape, a_dtype, q_shape, q_dtype, @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix("select", shapes, (onp.bool_,) * n + dtypes), - "rng": jtu.rand_default(), "shapes": shapes, "dtypes": dtypes} + "rng_factory": jtu.rand_default, "shapes": shapes, "dtypes": dtypes} for n in range(0, 3) for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(all_shapes, 2 * n + 1)) for dtypes in CombosWithReplacement(all_dtypes, n + 1))) - def test(self, rng, shapes, dtypes): + def test(self, rng_factory, shapes, dtypes): + rng = rng_factory() n = len(dtypes) - 1 def args_maker(): condlist = [rng(shape, onp.bool_) for shape in shapes[:n]] @@ -1898,15 +1950,16 @@ def testIssue956(self): "_shape={}_dtype={}_out_dtype={}_axis={}_ddof={}_keepdims={}" .format(shape, dtype, out_dtype, axis, ddof, keepdims), "shape": shape, "dtype": dtype, "out_dtype": out_dtype, "axis": axis, - "ddof": ddof, "keepdims": keepdims, "rng": rng} + "ddof": ddof, "keepdims": keepdims, "rng_factory": rng_factory} for shape in [(5,), (10, 5)] for dtype in all_dtypes for out_dtype in number_dtypes for axis in [None, 0, -1] for ddof in [0, 1, 2] for keepdims in [False, True] - for rng in [jtu.rand_default()])) - def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng): + for rng_factory in [jtu.rand_default])) + def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) lnp_fun = partial(lnp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) @@ -1921,15 +1974,16 @@ def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng): {"testcase_name": "_shape={}_dtype={}_rowvar={}_ddof={}_bias={}".format( shape, dtype, rowvar, ddof, bias), "shape": shape, "dtype": dtype, "rowvar": rowvar, "ddof": ddof, - "bias": bias, "rng": rng} + "bias": bias, "rng_factory": rng_factory} for shape in [(5,), (10, 5), (3, 10)] for dtype in all_dtypes for rowvar in [True, False] for bias in [True, False] for ddof in [None, 2, 3] - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("gpu") # TODO(b/138003641): test fails on GPU. - def testCov(self, shape, dtype, rowvar, ddof, bias, rng): + def testCov(self, shape, dtype, rowvar, ddof, bias, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.cov, rowvar=rowvar, ddof=ddof, bias=bias) lnp_fun = partial(lnp.cov, rowvar=rowvar, ddof=ddof, bias=bias) @@ -1944,14 +1998,15 @@ def testIssue967(self): {"testcase_name": "_shape={}_dtype={}_rowvar={}_ddof={}_bias={}".format( shape, dtype, rowvar, ddof, bias), "shape": shape, "dtype": dtype, "rowvar": rowvar, "ddof": ddof, - "bias": bias, "rng": rng} + "bias": bias, "rng_factory": rng_factory} for shape in [(5,), (10, 5), (3, 10)] for dtype in number_dtypes for rowvar in [True, False] for bias in [True, False] for ddof in [None, 2, 3] - for rng in [jtu.rand_default()])) - def testCorrCoef(self, shape, dtype, rowvar, ddof, bias, rng): + for rng_factory in [jtu.rand_default])) + def testCorrCoef(self, shape, dtype, rowvar, ddof, bias, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) mat = onp.asarray([rng(shape, dtype)]) onp_fun = partial(onp.corrcoef, rowvar=rowvar, ddof=ddof, bias=bias) @@ -1965,13 +2020,14 @@ def testCorrCoef(self, shape, dtype, rowvar, ddof, bias, rng): {"testcase_name": "_shapes={}_dtype={}_indexing={}_sparse={}".format( shapes, dtype, indexing, sparse), "shapes": shapes, "dtype": dtype, "indexing": indexing, - "sparse": sparse, "rng": rng} + "sparse": sparse, "rng_factory": rng_factory} for shapes in [(), (5,), (5, 3)] for dtype in number_dtypes for indexing in ['xy', 'ij'] for sparse in [True, False] - for rng in [jtu.rand_default()])) - def testMeshGrid(self, shapes, dtype, indexing, sparse, rng): + for rng_factory in [jtu.rand_default])) + def testMeshGrid(self, shapes, dtype, indexing, sparse, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [(x,) for x in shapes], [dtype] * len(shapes)) onp_fun = partial(onp.meshgrid, indexing=indexing, sparse=sparse) @@ -2044,15 +2100,16 @@ def body(i, xy): @parameterized.named_parameters( {"testcase_name": "_from={}_to={}".format(from_shape, to_shape), - "rng": rng, "from_shape": from_shape, "to_shape": to_shape} + "rng_factory": rng_factory, "from_shape": from_shape, "to_shape": to_shape} for from_shape, to_shape in [ [(1, 3), (4, 3)], [(3,), (2, 1, 3)], [(3,), (3, 3)], [(1,), (3,)], ] - for rng in [jtu.rand_default()]) - def testBroadcastTo(self, from_shape, to_shape, rng): + for rng_factory in [jtu.rand_default]) + def testBroadcastTo(self, from_shape, to_shape, rng_factory): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, [from_shape], [onp.float32]) onp_op = lambda x: onp.broadcast_to(x, to_shape) lnp_op = lambda x: lnp.broadcast_to(x, to_shape) @@ -2072,16 +2129,21 @@ def testBroadcastToIntIssue1548(self): # as needed for e.g. particular compound ops of interest. GradTestSpec = collections.namedtuple( - "GradTestSpec", ["op", "nargs", "order", "rng", "dtypes", "name", "tol"]) -def grad_test_spec(op, nargs, order, rng, dtypes, name=None, tol=None): - return GradTestSpec(op, nargs, order, rng, dtypes, name or op.__name__, tol) + "GradTestSpec", + ["op", "nargs", "order", "rng_factory", "dtypes", "name", "tol"]) +def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): + return GradTestSpec( + op, nargs, order, rng_factory, dtypes, name or op.__name__, tol) GRAD_TEST_RECORDS = [ - grad_test_spec(lnp.arcsinh, nargs=1, order=2, rng=jtu.rand_positive(), + grad_test_spec(lnp.arcsinh, nargs=1, order=2, + rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64], tol=1e-4), - grad_test_spec(lnp.arccosh, nargs=1, order=2, rng=jtu.rand_positive(), + grad_test_spec(lnp.arccosh, nargs=1, order=2, + rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64], tol=1e-4), - grad_test_spec(lnp.arctanh, nargs=1, order=2, rng=jtu.rand_uniform(-0.9, 0.9), + grad_test_spec(lnp.arctanh, nargs=1, order=2, + rng_factory=partial(jtu.rand_uniform, -0.9, 0.9), dtypes=[onp.float64, onp.complex64], tol=1e-4), ] @@ -2102,12 +2164,13 @@ class NumpyGradTests(jtu.JaxTestCase): jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( rec.name, shapes, itertools.repeat(dtype)), - "op": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, + "op": rec.op, "rng_factory": rec.rng_factory, "shapes": shapes, "dtype": dtype, "order": rec.order, "tol": rec.tol} for shapes in CombosWithReplacement(nonempty_shapes, rec.nargs) for dtype in rec.dtypes) for rec in GRAD_TEST_RECORDS)) - def testOpGrad(self, op, rng, shapes, dtype, order, tol): + def testOpGrad(self, op, rng_factory, shapes, dtype, order, tol): + rng = rng_factory() tol = 1e-1 if num_float_bits(dtype) == 32 else tol args = tuple(rng(shape, dtype) for shape in shapes) check_grads(op, args, order, ["fwd", "rev"], tol, tol) diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index c78310c3dbc6..785f753c7de7 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -18,6 +18,7 @@ import collections import functools +from functools import partial import itertools import unittest @@ -47,29 +48,31 @@ numeric_dtypes = float_dtypes + complex_dtypes + int_dtypes -OpRecord = collections.namedtuple("OpRecord", ["name", "nargs", "dtypes", "rng", - "test_autodiff", "test_name"]) +OpRecord = collections.namedtuple( + "OpRecord", + ["name", "nargs", "dtypes", "rng_factory", "test_autodiff", "test_name"]) -def op_record(name, nargs, dtypes, rng, test_grad, test_name=None): +def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): test_name = test_name or name - return OpRecord(name, nargs, dtypes, rng, test_grad, test_name) + return OpRecord(name, nargs, dtypes, rng_factory, test_grad, test_name) JAX_SPECIAL_FUNCTION_RECORDS = [ # TODO: digamma has no JVP implemented. - op_record("digamma", 1, float_dtypes, jtu.rand_positive(), False), - op_record("erf", 1, float_dtypes, jtu.rand_small_positive(), True), - op_record("erfc", 1, float_dtypes, jtu.rand_small_positive(), True), - op_record("erfinv", 1, float_dtypes, jtu.rand_small_positive(), True), - op_record("expit", 1, float_dtypes, jtu.rand_small_positive(), True), + op_record("digamma", 1, float_dtypes, jtu.rand_positive, False), + op_record("erf", 1, float_dtypes, jtu.rand_small_positive, True), + op_record("erfc", 1, float_dtypes, jtu.rand_small_positive, True), + op_record("erfinv", 1, float_dtypes, jtu.rand_small_positive, True), + op_record("expit", 1, float_dtypes, jtu.rand_small_positive, True), # TODO: gammaln has slightly high error. - op_record("gammaln", 1, float_dtypes, jtu.rand_positive(), False), - op_record("logit", 1, float_dtypes, jtu.rand_small_positive(), False), - op_record("log_ndtr", 1, float_dtypes, jtu.rand_default(), True), - op_record("ndtri", 1, float_dtypes, jtu.rand_uniform(0.05, 0.95), True), - op_record("ndtr", 1, float_dtypes, jtu.rand_default(), True), + op_record("gammaln", 1, float_dtypes, jtu.rand_positive, False), + op_record("logit", 1, float_dtypes, jtu.rand_small_positive, False), + op_record("log_ndtr", 1, float_dtypes, jtu.rand_default, True), + op_record("ndtri", 1, float_dtypes, partial(jtu.rand_uniform, 0.05, 0.95), + True), + op_record("ndtr", 1, float_dtypes, jtu.rand_default, True), # TODO(phawkins): gradient of entr yields NaNs. - op_record("entr", 1, float_dtypes, jtu.rand_default(), False), + op_record("entr", 1, float_dtypes, jtu.rand_default, False), ] CombosWithReplacement = itertools.combinations_with_replacement @@ -85,15 +88,17 @@ def _GetArgsMaker(self, rng, shapes, dtypes): {"testcase_name": "_inshape={}_axis={}_keepdims={}".format( jtu.format_shape_dtype_string(shape, dtype), axis, keepdims), # TODO(b/133842870): re-enable when exp(nan) returns NaN on CPU. - "rng": jtu.rand_some_inf_and_nan() if jtu.device_under_test() != "cpu" - else jtu.rand_default(), + "rng_factory": jtu.rand_some_inf_and_nan + if jtu.device_under_test() != "cpu" + else jtu.rand_default, "shape": shape, "dtype": dtype, "axis": axis, "keepdims": keepdims} for shape in all_shapes for dtype in float_dtypes for axis in range(-len(shape), len(shape)) for keepdims in [False, True])) @jtu.skip_on_flag("jax_xla_backend", "xrt") - def testLogSumExp(self, rng, shape, dtype, axis, keepdims): + def testLogSumExp(self, rng_factory, shape, dtype, axis, keepdims): + rng = rng_factory() # TODO(mattjj): test autodiff def scipy_fun(array_to_reduce): return osp_special.logsumexp(array_to_reduce, axis, keepdims=keepdims) @@ -109,15 +114,16 @@ def lax_fun(array_to_reduce): jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( rec.test_name, shapes, dtypes), - "rng": rec.rng, "shapes": shapes, "dtypes": dtypes, + "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "test_autodiff": rec.test_autodiff, "scipy_op": getattr(osp_special, rec.name), "lax_op": getattr(lsp_special, rec.name)} for shapes in CombosWithReplacement(all_shapes, rec.nargs) for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in JAX_SPECIAL_FUNCTION_RECORDS)) - def testScipySpecialFun(self, scipy_op, lax_op, rng, shapes, dtypes, + def testScipySpecialFun(self, scipy_op, lax_op, rng_factory, shapes, dtypes, test_autodiff): + rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) args = args_maker() self.assertAllClose(scipy_op(*args), lax_op(*args), atol=1e-3, rtol=1e-3, @@ -130,17 +136,19 @@ def testScipySpecialFun(self, scipy_op, lax_op, rng, shapes, dtypes, @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_d={}".format( jtu.format_shape_dtype_string(shape, dtype), d), - "rng": jtu.rand_positive(), "shape": shape, "dtype": dtype, "d": d} + "rng_factory": jtu.rand_positive, "shape": shape, "dtype": dtype, + "d": d} for shape in all_shapes for dtype in float_dtypes for d in [1, 2, 5])) - def testMultigammaln(self, rng, shape, dtype, d): + def testMultigammaln(self, rng_factory, shape, dtype, d): def scipy_fun(a): return osp_special.multigammaln(a, d) def lax_fun(a): return lsp_special.multigammaln(a, d) + rng = rng_factory() args_maker = lambda: [rng(shape, dtype) + (d - 1) / 2.] self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) diff --git a/tests/lax_test.py b/tests/lax_test.py index 7eb394a4951c..f3bc48e1280d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -86,89 +86,89 @@ def tolerance(dtype, tol=None): return tol.get(dtype, default_tolerance[dtype]) -OpRecord = collections.namedtuple("OpRecord", - ["op", "nargs", "dtypes", "rng", "tol"]) +OpRecord = collections.namedtuple( + "OpRecord", ["op", "nargs", "dtypes", "rng_factory", "tol"]) -def op_record(op, nargs, dtypes, rng, tol=None): - return OpRecord(op, nargs, dtypes, rng, tol) +def op_record(op, nargs, dtypes, rng_factory, tol=None): + return OpRecord(op, nargs, dtypes, rng_factory, tol) LAX_OPS = [ - op_record("neg", 1, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record("sign", 1, default_dtypes, jtu.rand_small()), - op_record("floor", 1, float_dtypes, jtu.rand_small()), - op_record("ceil", 1, float_dtypes, jtu.rand_small()), - op_record("round", 1, float_dtypes, jtu.rand_default()), + op_record("neg", 1, default_dtypes + complex_dtypes, jtu.rand_small), + op_record("sign", 1, default_dtypes, jtu.rand_small), + op_record("floor", 1, float_dtypes, jtu.rand_small), + op_record("ceil", 1, float_dtypes, jtu.rand_small), + op_record("round", 1, float_dtypes, jtu.rand_default), - op_record("is_finite", 1, float_dtypes, jtu.rand_small()), + op_record("is_finite", 1, float_dtypes, jtu.rand_small), - op_record("exp", 1, float_dtypes + complex_dtypes, jtu.rand_small()), + op_record("exp", 1, float_dtypes + complex_dtypes, jtu.rand_small), # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 # precision. - op_record("expm1", 1, float_dtypes + complex_dtypes, jtu.rand_small(), + op_record("expm1", 1, float_dtypes + complex_dtypes, jtu.rand_small, {onp.float64: 1e-8}), - op_record("log", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record("log1p", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), + op_record("log", 1, float_dtypes + complex_dtypes, jtu.rand_positive), + op_record("log1p", 1, float_dtypes + complex_dtypes, jtu.rand_positive), # TODO(b/142975473): on CPU, tanh for complex128 is only accurate to # ~float32 precision. # TODO(b/143135720): on GPU, tanh has only ~float32 precision. - op_record("tanh", 1, float_dtypes + complex_dtypes, jtu.rand_small(), + op_record("tanh", 1, float_dtypes + complex_dtypes, jtu.rand_small, {onp.float64: 1e-9, onp.complex128: 1e-7}), - op_record("sin", 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record("cos", 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record("atan2", 2, float_dtypes, jtu.rand_default()), - - op_record("sqrt", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record("rsqrt", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record("square", 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record("reciprocal", 1, float_dtypes + complex_dtypes, jtu.rand_positive()), - op_record("tan", 1, float_dtypes, jtu.rand_default(), {onp.float32: 1e-5}), - op_record("asin", 1, float_dtypes, jtu.rand_small()), - op_record("acos", 1, float_dtypes, jtu.rand_small()), - op_record("atan", 1, float_dtypes, jtu.rand_small()), - op_record("sinh", 1, float_dtypes + complex_dtypes, jtu.rand_default()), - op_record("cosh", 1, float_dtypes + complex_dtypes, jtu.rand_default()), - - op_record("lgamma", 1, float_dtypes, jtu.rand_positive(), + op_record("sin", 1, float_dtypes + complex_dtypes, jtu.rand_default), + op_record("cos", 1, float_dtypes + complex_dtypes, jtu.rand_default), + op_record("atan2", 2, float_dtypes, jtu.rand_default), + + op_record("sqrt", 1, float_dtypes + complex_dtypes, jtu.rand_positive), + op_record("rsqrt", 1, float_dtypes + complex_dtypes, jtu.rand_positive), + op_record("square", 1, float_dtypes + complex_dtypes, jtu.rand_default), + op_record("reciprocal", 1, float_dtypes + complex_dtypes, jtu.rand_positive), + op_record("tan", 1, float_dtypes, jtu.rand_default, {onp.float32: 1e-5}), + op_record("asin", 1, float_dtypes, jtu.rand_small), + op_record("acos", 1, float_dtypes, jtu.rand_small), + op_record("atan", 1, float_dtypes, jtu.rand_small), + op_record("sinh", 1, float_dtypes + complex_dtypes, jtu.rand_default), + op_record("cosh", 1, float_dtypes + complex_dtypes, jtu.rand_default), + + op_record("lgamma", 1, float_dtypes, jtu.rand_positive, {onp.float32: 1e-5, onp.float64: 1e-14}), - op_record("digamma", 1, float_dtypes, jtu.rand_positive(), + op_record("digamma", 1, float_dtypes, jtu.rand_positive, {onp.float64: 1e-14}), - op_record("erf", 1, float_dtypes, jtu.rand_small()), - op_record("erfc", 1, float_dtypes, jtu.rand_small()), + op_record("erf", 1, float_dtypes, jtu.rand_small), + op_record("erfc", 1, float_dtypes, jtu.rand_small), # TODO(b/142976030): the approximation of erfinf used by XLA is only # accurate to float32 precision. - op_record("erf_inv", 1, float_dtypes, jtu.rand_small(), + op_record("erf_inv", 1, float_dtypes, jtu.rand_small, {onp.float64: 1e-9}), - op_record("bessel_i0e", 1, float_dtypes, jtu.rand_default()), - op_record("bessel_i1e", 1, float_dtypes, jtu.rand_default()), + op_record("bessel_i0e", 1, float_dtypes, jtu.rand_default), + op_record("bessel_i1e", 1, float_dtypes, jtu.rand_default), - op_record("real", 1, complex_dtypes, jtu.rand_default()), - op_record("imag", 1, complex_dtypes, jtu.rand_default()), - op_record("complex", 2, [onp.float32, onp.float64], jtu.rand_default()), + op_record("real", 1, complex_dtypes, jtu.rand_default), + op_record("imag", 1, complex_dtypes, jtu.rand_default), + op_record("complex", 2, [onp.float32, onp.float64], jtu.rand_default), op_record("conj", 1, [onp.float32, onp.float64] + complex_dtypes, - jtu.rand_default()), - op_record("abs", 1, default_dtypes + complex_dtypes, jtu.rand_default()), - op_record("pow", 2, float_dtypes + complex_dtypes, jtu.rand_positive()), - - op_record("bitwise_and", 2, bool_dtypes, jtu.rand_small()), - op_record("bitwise_not", 1, bool_dtypes, jtu.rand_small()), - op_record("bitwise_or", 2, bool_dtypes, jtu.rand_small()), - op_record("bitwise_xor", 2, bool_dtypes, jtu.rand_small()), - - op_record("add", 2, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record("sub", 2, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record("mul", 2, default_dtypes + complex_dtypes, jtu.rand_small()), - op_record("div", 2, default_dtypes + complex_dtypes, jtu.rand_nonzero()), - op_record("rem", 2, default_dtypes, jtu.rand_nonzero()), - - op_record("max", 2, all_dtypes, jtu.rand_small()), - op_record("min", 2, all_dtypes, jtu.rand_small()), - - op_record("eq", 2, all_dtypes, jtu.rand_some_equal()), - op_record("ne", 2, all_dtypes, jtu.rand_small()), - op_record("ge", 2, default_dtypes, jtu.rand_small()), - op_record("gt", 2, default_dtypes, jtu.rand_small()), - op_record("le", 2, default_dtypes, jtu.rand_small()), - op_record("lt", 2, default_dtypes, jtu.rand_small()), + jtu.rand_default), + op_record("abs", 1, default_dtypes + complex_dtypes, jtu.rand_default), + op_record("pow", 2, float_dtypes + complex_dtypes, jtu.rand_positive), + + op_record("bitwise_and", 2, bool_dtypes, jtu.rand_small), + op_record("bitwise_not", 1, bool_dtypes, jtu.rand_small), + op_record("bitwise_or", 2, bool_dtypes, jtu.rand_small), + op_record("bitwise_xor", 2, bool_dtypes, jtu.rand_small), + + op_record("add", 2, default_dtypes + complex_dtypes, jtu.rand_small), + op_record("sub", 2, default_dtypes + complex_dtypes, jtu.rand_small), + op_record("mul", 2, default_dtypes + complex_dtypes, jtu.rand_small), + op_record("div", 2, default_dtypes + complex_dtypes, jtu.rand_nonzero), + op_record("rem", 2, default_dtypes, jtu.rand_nonzero), + + op_record("max", 2, all_dtypes, jtu.rand_small), + op_record("min", 2, all_dtypes, jtu.rand_small), + + op_record("eq", 2, all_dtypes, jtu.rand_some_equal), + op_record("ne", 2, all_dtypes, jtu.rand_small), + op_record("ge", 2, default_dtypes, jtu.rand_small), + op_record("gt", 2, default_dtypes, jtu.rand_small), + op_record("le", 2, default_dtypes, jtu.rand_small), + op_record("lt", 2, default_dtypes, jtu.rand_small), ] CombosWithReplacement = itertools.combinations_with_replacement @@ -181,12 +181,14 @@ class LaxTest(jtu.JaxTestCase): jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( rec.op, shapes, itertools.repeat(dtype)), - "op_name": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype} + "op_name": rec.op, "rng_factory": rec.rng_factory, "shapes": shapes, + "dtype": dtype} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for dtype in rec.dtypes) for rec in LAX_OPS)) - def testOp(self, op_name, rng, shapes, dtype): + def testOp(self, op_name, rng_factory, shapes, dtype): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype) for shape in shapes] op = getattr(lax, op_name) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -195,13 +197,14 @@ def testOp(self, op_name, rng, shapes, dtype): jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( rec.op, shapes, itertools.repeat(dtype)), - "op_name": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, - "tol": rec.tol} + "op_name": rec.op, "rng_factory": rec.rng_factory, "shapes": shapes, + "dtype": dtype, "tol": rec.tol} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for dtype in rec.dtypes) for rec in LAX_OPS)) - def testOpAgainstNumpy(self, op_name, rng, shapes, dtype, tol): + def testOpAgainstNumpy(self, op_name, rng_factory, shapes, dtype, tol): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype) for shape in shapes] op = getattr(lax, op_name) numpy_op = getattr(lax_reference, op_name) @@ -212,11 +215,12 @@ def testOpAgainstNumpy(self, op_name, rng, shapes, dtype, tol): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_from_dtype={}_to_dtype={}".format( from_dtype, to_dtype), - "from_dtype": from_dtype, "to_dtype": to_dtype, "rng": rng} + "from_dtype": from_dtype, "to_dtype": to_dtype, "rng_factory": rng_factory} for from_dtype, to_dtype in itertools.product( [onp.float32, onp.int32, "float32", "int32"], repeat=2) - for rng in [jtu.rand_default()])) - def testConvertElementType(self, from_dtype, to_dtype, rng): + for rng_factory in [jtu.rand_default])) + def testConvertElementType(self, from_dtype, to_dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng((2, 3), from_dtype)] op = lambda x: lax.convert_element_type(x, to_dtype) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -224,11 +228,12 @@ def testConvertElementType(self, from_dtype, to_dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_from_dtype={}_to_dtype={}" .format(from_dtype, to_dtype), - "from_dtype": from_dtype, "to_dtype": to_dtype, "rng": rng} + "from_dtype": from_dtype, "to_dtype": to_dtype, "rng_factory": rng_factory} for from_dtype, to_dtype in itertools.product( [onp.float32, onp.int32, "float32", "int32"], repeat=2) - for rng in [jtu.rand_default()])) - def testConvertElementTypeAgainstNumpy(self, from_dtype, to_dtype, rng): + for rng_factory in [jtu.rand_default])) + def testConvertElementTypeAgainstNumpy(self, from_dtype, to_dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng((2, 3), from_dtype)] op = lambda x: lax.convert_element_type(x, to_dtype) numpy_op = lambda x: lax_reference.convert_element_type(x, to_dtype) @@ -237,11 +242,12 @@ def testConvertElementTypeAgainstNumpy(self, from_dtype, to_dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_from_dtype={}_to_dtype={}" .format(from_dtype, to_dtype), - "from_dtype": from_dtype, "to_dtype": to_dtype, "rng": rng} + "from_dtype": from_dtype, "to_dtype": to_dtype, "rng_factory": rng_factory} for from_dtype, to_dtype in itertools.product( [onp.float32, onp.int32, "float32", "int32"], repeat=2) - for rng in [jtu.rand_default()])) - def testBitcastConvertType(self, from_dtype, to_dtype, rng): + for rng_factory in [jtu.rand_default])) + def testBitcastConvertType(self, from_dtype, to_dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng((2, 3), from_dtype)] op = lambda x: lax.bitcast_convert_type(x, to_dtype) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -249,11 +255,12 @@ def testBitcastConvertType(self, from_dtype, to_dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_from_dtype={}_to_dtype={}" .format(from_dtype, to_dtype), - "from_dtype": from_dtype, "to_dtype": to_dtype, "rng": rng} + "from_dtype": from_dtype, "to_dtype": to_dtype, "rng_factory": rng_factory} for from_dtype, to_dtype in itertools.product( [onp.float32, onp.int32, "float32", "int32"], repeat=2) - for rng in [jtu.rand_default()])) - def testBitcastConvertTypeAgainstNumpy(self, from_dtype, to_dtype, rng): + for rng_factory in [jtu.rand_default])) + def testBitcastConvertTypeAgainstNumpy(self, from_dtype, to_dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng((2, 3), from_dtype)] op = lambda x: lax.bitcast_convert_type(x, to_dtype) numpy_op = lambda x: lax_reference.bitcast_convert_type(x, to_dtype) @@ -265,7 +272,7 @@ def testBitcastConvertTypeAgainstNumpy(self, from_dtype, to_dtype, rng): jtu.format_shape_dtype_string(operand_shape, dtype), jtu.format_shape_dtype_string(max_shape, dtype)), "min_shape": min_shape, "operand_shape": operand_shape, - "max_shape": max_shape, "dtype": dtype, "rng": rng} + "max_shape": max_shape, "dtype": dtype, "rng_factory": rng_factory} for min_shape, operand_shape, max_shape in [ [(), (2, 3), ()], [(2, 3), (2, 3), ()], @@ -273,8 +280,9 @@ def testBitcastConvertTypeAgainstNumpy(self, from_dtype, to_dtype, rng): [(2, 3), (2, 3), (2, 3)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testClamp(self, min_shape, operand_shape, max_shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testClamp(self, min_shape, operand_shape, max_shape, dtype, rng_factory): + rng = rng_factory() shapes = [min_shape, operand_shape, max_shape] args_maker = lambda: [rng(shape, dtype) for shape in shapes] self._CompileAndCheck(lax.clamp, args_maker, check_dtypes=True) @@ -285,7 +293,7 @@ def testClamp(self, min_shape, operand_shape, max_shape, dtype, rng): jtu.format_shape_dtype_string(operand_shape, dtype), jtu.format_shape_dtype_string(max_shape, dtype)), "min_shape": min_shape, "operand_shape": operand_shape, - "max_shape": max_shape, "dtype": dtype, "rng": rng} + "max_shape": max_shape, "dtype": dtype, "rng_factory": rng_factory} for min_shape, operand_shape, max_shape in [ [(), (2, 3), ()], [(2, 3), (2, 3), ()], @@ -293,9 +301,10 @@ def testClamp(self, min_shape, operand_shape, max_shape, dtype, rng): [(2, 3), (2, 3), (2, 3)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testClampAgainstNumpy(self, min_shape, operand_shape, max_shape, dtype, - rng): + rng_factory): + rng = rng_factory() shapes = [min_shape, operand_shape, max_shape] args_maker = lambda: [rng(shape, dtype) for shape in shapes] self._CheckAgainstNumpy(lax.clamp, lax_reference.clamp, args_maker) @@ -305,13 +314,14 @@ def testClampAgainstNumpy(self, min_shape, operand_shape, max_shape, dtype, dim, ",".join(str(d) for d in base_shape), onp.dtype(dtype).name, num_arrs), "dim": dim, "base_shape": base_shape, "dtype": dtype, - "num_arrs": num_arrs, "rng": rng} + "num_arrs": num_arrs, "rng_factory": rng_factory} for num_arrs in [3] for dtype in default_dtypes for base_shape in [(4,), (3, 4), (2, 3, 4)] for dim in range(len(base_shape)) - for rng in [jtu.rand_default()])) - def testConcatenate(self, dim, base_shape, dtype, num_arrs, rng): + for rng_factory in [jtu.rand_default])) + def testConcatenate(self, dim, base_shape, dtype, num_arrs, rng_factory): + rng = rng_factory() shapes = [base_shape[:dim] + (size,) + base_shape[dim+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), range(num_arrs))] args_maker = lambda: [rng(shape, dtype) for shape in shapes] @@ -323,13 +333,14 @@ def testConcatenate(self, dim, base_shape, dtype, num_arrs, rng): dim, ",".join(str(d) for d in base_shape), onp.dtype(dtype).name, num_arrs), "dim": dim, "base_shape": base_shape, "dtype": dtype, - "num_arrs": num_arrs, "rng": rng} + "num_arrs": num_arrs, "rng_factory": rng_factory} for num_arrs in [3] for dtype in default_dtypes for base_shape in [(4,), (3, 4), (2, 3, 4)] for dim in range(len(base_shape)) - for rng in [jtu.rand_default()])) - def testConcatenateAgainstNumpy(self, dim, base_shape, dtype, num_arrs, rng): + for rng_factory in [jtu.rand_default])) + def testConcatenateAgainstNumpy(self, dim, base_shape, dtype, num_arrs, rng_factory): + rng = rng_factory() shapes = [base_shape[:dim] + (size,) + base_shape[dim+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), range(num_arrs))] args_maker = lambda: [rng(shape, dtype) for shape in shapes] @@ -343,15 +354,16 @@ def testConcatenateAgainstNumpy(self, dim, base_shape, dtype, num_arrs, rng): jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng": rng} + "strides": strides, "padding": padding, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((b, i, 9, 10), (j, i, 4, 5)) for b, i, j in itertools.product([2, 3], repeat=3)] for dtype in float_dtypes for strides in [(1, 1), (1, 2), (2, 1)] for padding in ["VALID", "SAME"] - for rng in [jtu.rand_small()])) - def testConv(self, lhs_shape, rhs_shape, dtype, strides, padding, rng): + for rng_factory in [jtu.rand_small])) + def testConv(self, lhs_shape, rhs_shape, dtype, strides, padding, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): @@ -365,16 +377,17 @@ def fun(lhs, rhs): jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng": rng} + "strides": strides, "padding": padding, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((b, i, 9, 10), (j, i, 4, 5)) for b, i, j in itertools.product([2, 3], repeat=3)] for dtype in float_dtypes for strides in [(1, 1), (1, 2), (2, 1)] for padding in ["VALID", "SAME"] - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testConvAgainstNumpy(self, lhs_shape, rhs_shape, dtype, strides, padding, - rng): + rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] op = lambda lhs, rhs: lax.conv(lhs, rhs, strides, padding) numpy_op = lambda lhs, rhs: lax_reference.conv(lhs, rhs, strides, padding) @@ -388,7 +401,7 @@ def testConvAgainstNumpy(self, lhs_shape, rhs_shape, dtype, strides, padding, strides, padding, lhs_dilation, rhs_dilation), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "strides": strides, "padding": padding, "lhs_dilation": lhs_dilation, - "rhs_dilation": rhs_dilation, "rng": rng} + "rhs_dilation": rhs_dilation, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((b, i, 9, 10), (j, i, 4, 5)) for b, i, j in itertools.product([1, 2, 3], repeat=3)] @@ -397,9 +410,10 @@ def testConvAgainstNumpy(self, lhs_shape, rhs_shape, dtype, strides, padding, for padding in [((0, 0), (0, 0)), ((1, 2), (2, 0))] for lhs_dilation, rhs_dilation in itertools.product( [(1, 1), (1, 2), (2, 2)], repeat=2) - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testConvWithGeneralPadding(self, lhs_shape, rhs_shape, dtype, strides, - padding, lhs_dilation, rhs_dilation, rng): + padding, lhs_dilation, rhs_dilation, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): @@ -416,7 +430,7 @@ def fun(lhs, rhs): strides, padding, lhs_dilation, rhs_dilation), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "strides": strides, "padding": padding, "lhs_dilation": lhs_dilation, - "rhs_dilation": rhs_dilation, "rng": rng} + "rhs_dilation": rhs_dilation, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((b, i, 9, 10), (j, i, 4, 5)) for b, i, j in itertools.product([1, 2, 3], repeat=3)] @@ -424,10 +438,11 @@ def fun(lhs, rhs): for padding in [((0, 0), (0, 0)), ((1, 2), (2, 0))] for lhs_dilation, rhs_dilation in itertools.product( [(1, 1), (1, 2), (2, 2)], repeat=2) - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def DISABLED_testConvWithGeneralPaddingAgainstNumpy( self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dilation, - rhs_dilation, rng): + rhs_dilation, rng_factory): + rng = rng_factory() # TODO(mattjj): make this test pass raise SkipTest("this test is incomplete") args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] @@ -453,7 +468,7 @@ def numpy_fun(lhs, rhs): "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "strides": strides, "padding": padding, "lhs_dilation": lhs_dilation, "rhs_dilation": rhs_dilation, "dimension_numbers": dim_nums, - "perms": perms, "rng": rng} + "perms": perms, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((b, i, 9, 10), (j, i, 4, 5)) for b, i, j in itertools.product([2, 3], repeat=3)] @@ -461,7 +476,7 @@ def numpy_fun(lhs, rhs): for padding in [((1, 2), (2, 0))] for lhs_dilation, rhs_dilation in itertools.product( [(1, 1), (1, 2)], repeat=2) - for rng in [jtu.rand_small()] + for rng_factory in [jtu.rand_small] for dim_nums, perms in [ (("NCHW", "OIHW", "NCHW"), ([0, 1, 2, 3], [0, 1, 2, 3])), (("NHWC", "HWIO", "NHWC"), ([0, 2, 3, 1], [2, 3, 1, 0])), @@ -469,7 +484,8 @@ def numpy_fun(lhs, rhs): ])) def testConvGeneralDilated(self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dilation, rhs_dilation, - dimension_numbers, perms, rng): + dimension_numbers, perms, rng_factory): + rng = rng_factory() lhs_perm, rhs_perm = perms # permute to compatible shapes def args_maker(): @@ -529,7 +545,7 @@ def _transpose_conv_kernel(data, kernel, dimension_numbers): jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng": rng, 'dspec': dspec} + "strides": strides, "padding": padding, "rng_factory": rng_factory, 'dspec': dspec} for lhs_shape, rhs_shape in [ ((b, 9, 10, i), (k, k, j, i)) # NB: i,j flipped in RHS for transpose for b, i, j, k in itertools.product([2,3],[2,3],[2,3],[3,4,5])] @@ -537,9 +553,10 @@ def _transpose_conv_kernel(data, kernel, dimension_numbers): for strides in [(1, 1), (1, 2), (2, 1), (2, 2), (3, 3)] for padding in ["VALID", "SAME"] for dspec in [('NHWC', 'HWIO', 'NHWC'),] - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testConvTranspose2DT(self, lhs_shape, rhs_shape, dtype, strides, - padding, dspec, rng): + padding, dspec, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] # NB: this test calculates conv_transpose performing identically to the @@ -562,7 +579,7 @@ def fun_via_grad(lhs, rhs): jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng": rng, 'dspec': dspec} + "strides": strides, "padding": padding, "rng_factory": rng_factory, 'dspec': dspec} for lhs_shape, rhs_shape in [ ((b, 9, 10, i), (k, k, i, j)) for b, i, j, k in itertools.product([2,3],[2,3],[2,3],[3,4,5])] @@ -570,9 +587,10 @@ def fun_via_grad(lhs, rhs): for strides in [(1, 1), (1, 2), (2, 1), (2, 2), (3, 3)] for padding in ["VALID", "SAME"] for dspec in [('NHWC', 'HWIO', 'NHWC'),] - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testConvTranspose2D(self, lhs_shape, rhs_shape, dtype, strides, - padding, dspec, rng): + padding, dspec, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): @@ -594,7 +612,7 @@ def fun_via_grad(lhs, rhs): jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng": rng, 'dspec': dspec} + "strides": strides, "padding": padding, "rng_factory": rng_factory, 'dspec': dspec} for lhs_shape, rhs_shape in [ ((b, 10, i), (k, i, j)) for b, i, j, k in itertools.product([2,3],[2,3],[2,3],[3,4,5])] @@ -602,9 +620,10 @@ def fun_via_grad(lhs, rhs): for strides in [(1,), (2,), (3,)] for padding in ["VALID", "SAME"] for dspec in [('NHC', 'HIO', 'NHC'),] - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testConvTranspose1D(self, lhs_shape, rhs_shape, dtype, strides, - padding, dspec, rng): + padding, dspec, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): @@ -626,13 +645,14 @@ def fun_via_grad(lhs, rhs): jtu.format_shape_dtype_string(rhs_shape, dtype), precision), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "precision": precision, "rng": rng} + "precision": precision, "rng_factory": rng_factory} for lhs_shape in [(3,), (4, 3)] for rhs_shape in [(3,), (3, 6)] for dtype in default_dtypes for precision in [None, lax.Precision.DEFAULT, lax.Precision.HIGH, lax.Precision.HIGHEST] - for rng in [jtu.rand_default()])) - def testDot(self, lhs_shape, rhs_shape, dtype, precision, rng): + for rng_factory in [jtu.rand_default])) + def testDot(self, lhs_shape, rhs_shape, dtype, precision, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] self._CompileAndCheck(partial(lax.dot, precision=precision), args_maker, check_dtypes=True) @@ -642,11 +662,12 @@ def testDot(self, lhs_shape, rhs_shape, dtype, precision, rng): jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype)), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "rng": rng} + "rng_factory": rng_factory} for lhs_shape in [(3,), (4, 3)] for rhs_shape in [(3,), (3, 6)] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] tol = {onp.float16: 1e-2, onp.float64: max(default_tolerance[onp.float64], 1e-14)} @@ -661,7 +682,7 @@ def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng): lhs_contracting, rhs_contracting), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "lhs_contracting": lhs_contracting, "rhs_contracting": rhs_contracting, - "rng": rng} + "rng_factory": rng_factory} for lhs_shape, rhs_shape, lhs_contracting, rhs_contracting in [ [(3, 5), (2, 5), [1], [1]], [(5, 3), (5, 2), [0], [0]], @@ -671,9 +692,10 @@ def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng): [(3, 2), (2, 4), [1], [0]], ] for dtype in default_dtypes - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testDotGeneralContractOnly(self, lhs_shape, rhs_shape, dtype, - lhs_contracting, rhs_contracting, rng): + lhs_contracting, rhs_contracting, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] dimension_numbers = ((lhs_contracting, rhs_contracting), ([], [])) @@ -689,15 +711,16 @@ def fun(lhs, rhs): jtu.format_shape_dtype_string(rhs_shape, dtype), dimension_numbers), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "dimension_numbers": dimension_numbers, "rng": rng} + "dimension_numbers": dimension_numbers, "rng_factory": rng_factory} for lhs_shape, rhs_shape, dimension_numbers in [ ((3, 3, 2), (3, 2, 4), (([2], [1]), ([0], [0]))), ((3, 4, 2, 4), (3, 4, 3, 2), (([2], [3]), ([0, 1], [0, 1]))), ] for dtype in default_dtypes - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testDotGeneralContractAndBatch(self, lhs_shape, rhs_shape, dtype, - dimension_numbers, rng): + dimension_numbers, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): @@ -712,15 +735,16 @@ def fun(lhs, rhs): jtu.format_shape_dtype_string(rhs_shape, dtype), dimension_numbers), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "dimension_numbers": dimension_numbers, "rng": rng} + "dimension_numbers": dimension_numbers, "rng_factory": rng_factory} for lhs_shape, rhs_shape, dimension_numbers in [ ((3, 3, 2), (3, 2, 4), (([2], [1]), ([0], [0]))), ((3, 4, 2, 4), (3, 4, 3, 2), (([2], [3]), ([0, 1], [0, 1]))), ] for dtype in default_dtypes - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testDotGeneralAgainstNumpy(self, lhs_shape, rhs_shape, dtype, - dimension_numbers, rng): + dimension_numbers, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] op = lambda x, y: lax.dot_general(x, y, dimension_numbers) numpy_op = lambda x, y: lax_reference.dot_general(x, y, dimension_numbers) @@ -730,12 +754,13 @@ def testDotGeneralAgainstNumpy(self, lhs_shape, rhs_shape, dtype, {"testcase_name": "_shape={}_dtype={}_broadcast_sizes={}".format( shape, onp.dtype(dtype).name, broadcast_sizes), "shape": shape, "dtype": dtype, "broadcast_sizes": broadcast_sizes, - "rng": rng} + "rng_factory": rng_factory} for shape in [(), (2, 3)] for dtype in default_dtypes for broadcast_sizes in [(), (2,), (1, 2)] - for rng in [jtu.rand_default()])) - def testBroadcast(self, shape, dtype, broadcast_sizes, rng): + for rng_factory in [jtu.rand_default])) + def testBroadcast(self, shape, dtype, broadcast_sizes, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.broadcast(x, broadcast_sizes) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -744,12 +769,13 @@ def testBroadcast(self, shape, dtype, broadcast_sizes, rng): {"testcase_name": "_shape={}_broadcast_sizes={}".format( jtu.format_shape_dtype_string(shape, dtype), broadcast_sizes), "shape": shape, "dtype": dtype, "broadcast_sizes": broadcast_sizes, - "rng": rng} + "rng_factory": rng_factory} for shape in [(), (2, 3)] for dtype in default_dtypes for broadcast_sizes in [(), (2,), (1, 2)] - for rng in [jtu.rand_default()])) - def testBroadcastAgainstNumpy(self, shape, dtype, broadcast_sizes, rng): + for rng_factory in [jtu.rand_default])) + def testBroadcastAgainstNumpy(self, shape, dtype, broadcast_sizes, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.broadcast(x, broadcast_sizes) numpy_op = lambda x: lax_reference.broadcast(x, broadcast_sizes) @@ -760,7 +786,7 @@ def testBroadcastAgainstNumpy(self, shape, dtype, broadcast_sizes, rng): jtu.format_shape_dtype_string(inshape, dtype), outshape, broadcast_dimensions), "inshape": inshape, "dtype": dtype, "outshape": outshape, - "dimensions": broadcast_dimensions, "rng": rng} + "dimensions": broadcast_dimensions, "rng_factory": rng_factory} for inshape, outshape, broadcast_dimensions in [ ([2], [2, 2], [0]), ([2], [2, 2], [1]), @@ -768,8 +794,9 @@ def testBroadcastAgainstNumpy(self, shape, dtype, broadcast_sizes, rng): ([], [2, 3], []), ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, rng): + for rng_factory in [jtu.rand_default])) + def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(inshape, dtype)] op = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -779,7 +806,7 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, rng): jtu.format_shape_dtype_string(inshape, dtype), outshape, broadcast_dimensions), "inshape": inshape, "dtype": dtype, "outshape": outshape, - "dimensions": broadcast_dimensions, "rng": rng} + "dimensions": broadcast_dimensions, "rng_factory": rng_factory} for inshape, outshape, broadcast_dimensions in [ ([2], [2, 2], [0]), ([2], [2, 2], [1]), @@ -787,9 +814,10 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, rng): ([], [2, 3], []), ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testBroadcastInDimAgainstNumpy(self, inshape, dtype, outshape, - dimensions, rng): + dimensions, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(inshape, dtype)] op = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) numpy_op = lambda x: lax_reference.broadcast_in_dim(x, outshape, dimensions) @@ -800,13 +828,14 @@ def testBroadcastInDimAgainstNumpy(self, inshape, dtype, outshape, jtu.format_shape_dtype_string(arg_shape, dtype), jtu.format_shape_dtype_string(out_shape, dtype)), "arg_shape": arg_shape, "out_shape": out_shape, "dtype": dtype, - "rng": rng} + "rng_factory": rng_factory} for dtype in default_dtypes for arg_shape, out_shape in [ [(3, 4), (12,)], [(2, 1, 4), (8,)], [(2, 2, 4), (2, 8)] ] - for rng in [jtu.rand_default()])) - def testReshape(self, arg_shape, out_shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testReshape(self, arg_shape, out_shape, dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(arg_shape, dtype)] op = lambda x: lax.reshape(x, out_shape) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -816,13 +845,14 @@ def testReshape(self, arg_shape, out_shape, dtype, rng): jtu.format_shape_dtype_string(arg_shape, dtype), jtu.format_shape_dtype_string(out_shape, dtype)), "arg_shape": arg_shape, "out_shape": out_shape, "dtype": dtype, - "rng": rng} + "rng_factory": rng_factory} for dtype in default_dtypes for arg_shape, out_shape in [ [(3, 4), (12,)], [(2, 1, 4), (8,)], [(2, 2, 4), (2, 8)] ] - for rng in [jtu.rand_default()])) - def testReshapeAgainstNumpy(self, arg_shape, out_shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testReshapeAgainstNumpy(self, arg_shape, out_shape, dtype, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(arg_shape, dtype)] op = lambda x: lax.reshape(x, out_shape) numpy_op = lambda x: lax_reference.reshape(x, out_shape) @@ -831,11 +861,12 @@ def testReshapeAgainstNumpy(self, arg_shape, out_shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_pads={}" .format(jtu.format_shape_dtype_string(shape, dtype), pads), - "shape": shape, "dtype": dtype, "pads": pads, "rng": jtu.rand_small()} + "shape": shape, "dtype": dtype, "pads": pads, "rng_factory": jtu.rand_small} for shape in [(2, 3)] for dtype in default_dtypes for pads in [[(1, 2, 1), (0, 1, 0)]])) - def testPad(self, shape, dtype, pads, rng): + def testPad(self, shape, dtype, pads, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] fun = lambda operand: lax.pad(operand, onp.array(0, dtype), pads) self._CompileAndCheck(fun, args_maker, check_dtypes=True) @@ -843,11 +874,12 @@ def testPad(self, shape, dtype, pads, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_pads={}" .format(jtu.format_shape_dtype_string(shape, dtype), pads), - "shape": shape, "dtype": dtype, "pads": pads, "rng": jtu.rand_small()} + "shape": shape, "dtype": dtype, "pads": pads, "rng_factory": jtu.rand_small} for shape in [(2, 3)] for dtype in default_dtypes for pads in [[(1, 2, 1), (0, 1, 0)]])) - def testPadAgainstNumpy(self, shape, dtype, pads, rng): + def testPadAgainstNumpy(self, shape, dtype, pads, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.pad(x, onp.array(0, dtype), pads) numpy_op = lambda x: lax_reference.pad(x, onp.array(0, dtype), pads) @@ -870,17 +902,16 @@ def testReverse(self): jtu.format_shape_dtype_string(pred_shape, onp.bool_), jtu.format_shape_dtype_string(arg_shape, arg_dtype)), "pred_shape": pred_shape, "arg_shape": arg_shape, "arg_dtype": arg_dtype, - "rng": rng} + "rng_factory": rng_factory} for arg_shape in [(), (3,), (2, 3)] for pred_shape in ([(), arg_shape] if arg_shape else [()]) for arg_dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testSelect(self, pred_shape, arg_shape, arg_dtype, rng): - + for rng_factory in [jtu.rand_default])) + def testSelect(self, pred_shape, arg_shape, arg_dtype, rng_factory): def args_maker(): return [rng(pred_shape, onp.bool_), rng(arg_shape, arg_dtype), rng(arg_shape, arg_dtype)] - + rng = rng_factory() return self._CompileAndCheck(lax.select, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -888,17 +919,16 @@ def args_maker(): jtu.format_shape_dtype_string(pred_shape, onp.bool_), jtu.format_shape_dtype_string(arg_shape, arg_dtype)), "pred_shape": pred_shape, "arg_shape": arg_shape, "arg_dtype": arg_dtype, - "rng": rng} + "rng_factory": rng_factory} for arg_shape in [(), (3,), (2, 3)] for pred_shape in ([(), arg_shape] if arg_shape else [()]) for arg_dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testSelectAgainstNumpy(self, pred_shape, arg_shape, arg_dtype, rng): - + for rng_factory in [jtu.rand_default])) + def testSelectAgainstNumpy(self, pred_shape, arg_shape, arg_dtype, rng_factory): def args_maker(): return [rng(pred_shape, onp.bool_), rng(arg_shape, arg_dtype), rng(arg_shape, arg_dtype)] - + rng = rng_factory() return self._CheckAgainstNumpy(lax.select, lax_reference.select, args_maker) @parameterized.named_parameters(jtu.cases_from_list( @@ -907,7 +937,7 @@ def args_maker(): jtu.format_shape_dtype_string(shape, dtype), start_indices, limit_indices, strides), "shape": shape, "dtype": dtype, "starts": start_indices, - "limits": limit_indices, "strides": strides, "rng": rng} + "limits": limit_indices, "strides": strides, "rng_factory": rng_factory} for shape, start_indices, limit_indices, strides in [ [(3,), (1,), (2,), None], [(7,), (4,), (7,), None], @@ -920,8 +950,9 @@ def args_maker(): [(5, 3), (1, 1), (5, 3), (2, 1)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testSlice(self, shape, dtype, starts, limits, strides, rng): + for rng_factory in [jtu.rand_default])) + def testSlice(self, shape, dtype, starts, limits, strides, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.slice(x, starts, limits, strides) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -932,7 +963,7 @@ def testSlice(self, shape, dtype, starts, limits, strides, rng): jtu.format_shape_dtype_string(shape, dtype), start_indices, limit_indices, strides), "shape": shape, "dtype": dtype, "starts": start_indices, - "limits": limit_indices, "strides": strides, "rng": rng} + "limits": limit_indices, "strides": strides, "rng_factory": rng_factory} for shape, start_indices, limit_indices, strides in [ [(3,), (1,), (2,), None], [(7,), (4,), (7,), None], @@ -945,9 +976,10 @@ def testSlice(self, shape, dtype, starts, limits, strides, rng): [(5, 3), (1, 1), (5, 3), (2, 1)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testSliceAgainstNumpy(self, shape, dtype, starts, limits, - strides, rng): + strides, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.slice(x, starts, limits, strides) numpy_op = lambda x: lax_reference.slice(x, starts, limits, strides) @@ -958,15 +990,16 @@ def testSliceAgainstNumpy(self, shape, dtype, starts, limits, jtu.format_shape_dtype_string(shape, dtype), start_indices, size_indices), "shape": shape, "dtype": dtype, "start_indices": start_indices, - "size_indices": size_indices, "rng": rng} + "size_indices": size_indices, "rng_factory": rng_factory} for shape, start_indices, size_indices in [ [(3,), (1,), (1,)], [(5, 3), (1, 1), (3, 1)], [(7, 5, 3), (4, 1, 0), (2, 0, 1)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testDynamicSlice(self, shape, dtype, start_indices, size_indices, rng): + for rng_factory in [jtu.rand_default])) + def testDynamicSlice(self, shape, dtype, start_indices, size_indices, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype), onp.array(start_indices)] op = lambda x, starts: lax.dynamic_slice(x, starts, size_indices) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -976,16 +1009,17 @@ def testDynamicSlice(self, shape, dtype, start_indices, size_indices, rng): jtu.format_shape_dtype_string(shape, dtype), start_indices, size_indices), "shape": shape, "dtype": dtype, "start_indices": start_indices, - "size_indices": size_indices, "rng": rng} + "size_indices": size_indices, "rng_factory": rng_factory} for shape, start_indices, size_indices in [ [(3,), (1,), (1,)], [(5, 3), (1, 1), (3, 1)], [(7, 5, 3), (4, 1, 0), (2, 0, 1)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testDynamicSliceAgainstNumpy(self, shape, dtype, start_indices, - size_indices, rng): + size_indices, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype), onp.array(start_indices)] op = lambda x, s: lax.dynamic_slice(x, s, size_indices) numpy_op = lambda x, s: lax_reference.dynamic_slice(x, s, size_indices) @@ -996,16 +1030,17 @@ def testDynamicSliceAgainstNumpy(self, shape, dtype, start_indices, jtu.format_shape_dtype_string(shape, dtype), start_indices, update_shape), "shape": shape, "dtype": dtype, "start_indices": start_indices, - "update_shape": update_shape, "rng": rng} + "update_shape": update_shape, "rng_factory": rng_factory} for shape, start_indices, update_shape in [ [(3,), (1,), (1,)], [(5, 3), (1, 1), (3, 1)], [(7, 5, 3), (4, 1, 0), (2, 0, 1)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testDynamicUpdateSlice(self, shape, dtype, start_indices, update_shape, - rng): + rng_factory): + rng = rng_factory() def args_maker(): return [rng(shape, dtype), rng(update_shape, dtype), @@ -1019,16 +1054,17 @@ def args_maker(): jtu.format_shape_dtype_string(shape, dtype), start_indices, update_shape), "shape": shape, "dtype": dtype, "start_indices": start_indices, - "update_shape": update_shape, "rng": rng} + "update_shape": update_shape, "rng_factory": rng_factory} for shape, start_indices, update_shape in [ [(3,), (1,), (1,)], [(5, 3), (1, 1), (3, 1)], [(7, 5, 3), (4, 1, 0), (2, 0, 1)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testDynamicUpdateSliceAgainstNumpy(self, shape, dtype, start_indices, - update_shape, rng): + update_shape, rng_factory): + rng = rng_factory() def args_maker(): return [rng(shape, dtype), rng(update_shape, dtype), @@ -1040,7 +1076,7 @@ def args_maker(): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_perm={}".format( jtu.format_shape_dtype_string(shape, dtype), perm), - "shape": shape, "dtype": dtype, "perm": perm, "rng": rng} + "shape": shape, "dtype": dtype, "perm": perm, "rng_factory": rng_factory} for shape, perm in [ [(3, 4), (1, 0)], [(3, 4), (0, 1)], @@ -1048,8 +1084,9 @@ def args_maker(): [(3, 4, 5), (1, 0, 2)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testTranspose(self, shape, dtype, perm, rng): + for rng_factory in [jtu.rand_default])) + def testTranspose(self, shape, dtype, perm, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.transpose(x, perm) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -1057,7 +1094,7 @@ def testTranspose(self, shape, dtype, perm, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_perm={}".format( jtu.format_shape_dtype_string(shape, dtype), perm), - "shape": shape, "dtype": dtype, "perm": perm, "rng": rng} + "shape": shape, "dtype": dtype, "perm": perm, "rng_factory": rng_factory} for shape, perm in [ [(3, 4), (1, 0)], [(3, 4), (0, 1)], @@ -1065,8 +1102,9 @@ def testTranspose(self, shape, dtype, perm, rng): [(3, 4, 5), (1, 0, 2)], ] for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testTransposeAgainstNumpy(self, shape, dtype, perm, rng): + for rng_factory in [jtu.rand_default])) + def testTransposeAgainstNumpy(self, shape, dtype, perm, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.transpose(x, perm) numpy_op = lambda x: lax_reference.transpose(x, perm) @@ -1077,7 +1115,7 @@ def testTransposeAgainstNumpy(self, shape, dtype, perm, rng): .format(op.__name__, jtu.format_shape_dtype_string(shape, dtype), dims, init_val), "op": op, "init_val": init_val, "shape": shape, "dtype": dtype, - "dims": dims, "rng": rng} + "dims": dims, "rng_factory": rng_factory} for init_val, op, dtypes in [ (0, lax.add, default_dtypes), (1, lax.mul, default_dtypes), @@ -1098,9 +1136,11 @@ def testTransposeAgainstNumpy(self, shape, dtype, perm, rng): [(3, 4, 5), (0,)], [(3, 4, 5), (1, 2)], [(3, 4, 5), (0, 2)], [(3, 4, 5), (0, 1, 2)] ] - for rng in [jtu.rand_default() if onp.issubdtype(dtype, onp.integer) - else jtu.rand_small()])) - def testReduce(self, op, init_val, shape, dtype, dims, rng): + for rng_factory in [ + jtu.rand_default if onp.issubdtype(dtype, onp.integer) + else jtu.rand_small])) + def testReduce(self, op, init_val, shape, dtype, dims, rng_factory): + rng = rng_factory() init_val = onp.asarray(init_val, dtype=dtype) fun = lambda operand, init_val: lax.reduce(operand, init_val, op, dims) args_maker = lambda: [rng(shape, dtype), init_val] @@ -1116,7 +1156,7 @@ def testReduce(self, op, init_val, shape, dtype, dims, rng): {"testcase_name": "_op={}_dtype={}_padding={}" .format(op.__name__, onp.dtype(dtype).name, padding), "op": op, "init_val": init_val, "dtype": dtype, "padding": padding, - "rng": rng} + "rng_factory": rng_factory} for init_val, op, dtypes in [ (0, lax.add, [onp.float32]), (-onp.inf, lax.max, [onp.float32]), @@ -1124,8 +1164,9 @@ def testReduce(self, op, init_val, shape, dtype, dims, rng): ] for dtype in dtypes for padding in ["VALID", "SAME"] - for rng in [jtu.rand_small()])) - def testReduceWindow(self, op, init_val, dtype, padding, rng): + for rng_factory in [jtu.rand_small])) + def testReduceWindow(self, op, init_val, dtype, padding, rng_factory): + rng = rng_factory() init_val = onp.asarray(init_val, dtype=dtype) all_configs = itertools.chain( @@ -1160,12 +1201,13 @@ def fun(operand): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}".format( jtu.format_shape_dtype_string(shape, dtype), axis), - "rng": rng, "shape": shape, "dtype": dtype, "axis": axis} + "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "axis": axis} for dtype in [onp.float32, onp.int32, onp.uint32] for shape in [(5,), (5, 7)] for axis in [-1, len(shape) - 1] - for rng in [jtu.rand_default()])) - def testSort(self, shape, dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testSort(self, shape, dtype, axis, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] fun = lambda x: lax.sort(x, axis) self._CompileAndCheck(fun, args_maker, check_dtypes=True) @@ -1173,12 +1215,13 @@ def testSort(self, shape, dtype, axis, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}".format( jtu.format_shape_dtype_string(shape, dtype), axis), - "rng": rng, "shape": shape, "dtype": dtype, "axis": axis} + "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "axis": axis} for dtype in [onp.float32, onp.int32, onp.uint32] for shape in [(5,), (5, 7)] for axis in [-1, len(shape) - 1] - for rng in [jtu.rand_default()])) - def testSortAgainstNumpy(self, shape, dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testSortAgainstNumpy(self, shape, dtype, axis, rng_factory): + rng = rng_factory() args_maker = lambda: [rng(shape, dtype)] op = lambda x: lax.sort(x, axis) numpy_op = lambda x: lax_reference.sort(x, axis) @@ -1189,14 +1232,15 @@ def testSortAgainstNumpy(self, shape, dtype, axis, rng): jtu.format_shape_dtype_string(shape, key_dtype), jtu.format_shape_dtype_string(shape, val_dtype), axis), - "rng": rng, "shape": shape, + "rng_factory": rng_factory, "shape": shape, "key_dtype": key_dtype, "val_dtype": val_dtype, "axis": axis} for key_dtype in [onp.float32, onp.int32, onp.uint32] for val_dtype in [onp.float32, onp.int32, onp.uint32] for shape in [(3,), (5, 3)] for axis in [-1, len(shape) - 1] - for rng in [jtu.rand_default()])) - def testSortKeyVal(self, shape, key_dtype, val_dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testSortKeyVal(self, shape, key_dtype, val_dtype, axis, rng_factory): + rng = rng_factory() # This test relies on the property that wherever keys are tied, values are # too, since we don't guarantee the same ordering of values with equal keys. # To avoid that case, we generate unique keys (globally in the key array). @@ -1215,14 +1259,15 @@ def args_maker(): jtu.format_shape_dtype_string(shape, key_dtype), jtu.format_shape_dtype_string(shape, val_dtype), axis), - "rng": rng, "shape": shape, + "rng_factory": rng_factory, "shape": shape, "key_dtype": key_dtype, "val_dtype": val_dtype, "axis": axis} for key_dtype in [onp.float32, onp.int32, onp.uint32] for val_dtype in [onp.float32, onp.int32, onp.uint32] for shape in [(3,), (5, 3)] for axis in [-1, len(shape) - 1] - for rng in [jtu.rand_default()])) - def testSortKeyValAgainstNumpy(self, shape, key_dtype, val_dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testSortKeyValAgainstNumpy(self, shape, key_dtype, val_dtype, axis, rng_factory): + rng = rng_factory() # This test relies on the property that wherever keys are tied, values are # too, since we don't guarantee the same ordering of values with equal keys. # To avoid that case, we generate unique keys (globally in the key array). @@ -1242,13 +1287,14 @@ def args_maker(): .format(jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype)), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "rng": rng} + "rng_factory": rng_factory} for lhs_shape, rhs_shape in [((3, 2), (2, 4)), ((5, 3, 2), (5, 2, 4)), ((1, 2, 2, 3), (1, 2, 3, 1))] for dtype in float_dtypes - for rng in [jtu.rand_small()])) - def testBatchMatMul(self, lhs_shape, rhs_shape, dtype, rng): + for rng_factory in [jtu.rand_small])) + def testBatchMatMul(self, lhs_shape, rhs_shape, dtype, rng_factory): + rng = rng_factory() arg_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] self._CompileAndCheck(lax.batch_matmul, arg_maker, check_dtypes=True) @@ -1266,7 +1312,7 @@ def collapse_first_two(x): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_idxs={}_axes={}".format( jtu.format_shape_dtype_string(shape, dtype), idxs, axes), - "shape": shape, "dtype": dtype, "idxs": idxs, "axes": axes, "rng": rng} + "shape": shape, "dtype": dtype, "idxs": idxs, "axes": axes, "rng_factory": rng_factory} for dtype in all_dtypes for shape, idxs, axes in [ [(3, 4, 5), (onp.array([0, 2, 1]),), (0,)], @@ -1274,8 +1320,9 @@ def collapse_first_two(x): [(3, 4, 5), (onp.array([0, 2]), onp.array([1, 3])), (0, 1)], [(3, 4, 5), (onp.array([0, 2]), onp.array([1, 3])), (0, 2)], ] - for rng in [jtu.rand_default()])) - def testIndexTake(self, shape, dtype, idxs, axes, rng): + for rng_factory in [jtu.rand_default])) + def testIndexTake(self, shape, dtype, idxs, axes, rng_factory): + rng = rng_factory() rand_idxs = lambda: tuple(rng(e.shape, e.dtype) for e in idxs) args_maker = lambda: [rng(shape, dtype), rand_idxs()] fun = lambda src, idxs: lax.index_take(src, idxs, axes) @@ -1286,7 +1333,8 @@ def testIndexTake(self, shape, dtype, idxs, axes, rng): jtu.format_shape_dtype_string(shape, dtype), idxs, dnums, slice_sizes), "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, - "slice_sizes": slice_sizes, "rng": rng, "rng_idx": rng_idx} + "slice_sizes": slice_sizes, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in all_dtypes for shape, idxs, dnums, slice_sizes in [ ((5,), onp.array([[0], [2]]), lax.GatherDimensionNumbers( @@ -1302,9 +1350,12 @@ def testIndexTake(self, shape, dtype, idxs, axes, rng): offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0, 1)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()])) - def testGather(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default])) + def testGather(self, shape, dtype, idxs, dnums, slice_sizes, rng_factory, + rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() rand_idxs = lambda: rng_idx(idxs.shape, idxs.dtype) args_maker = lambda: [rng(shape, dtype), rand_idxs()] fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) @@ -1315,8 +1366,8 @@ def testGather(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): jtu.format_shape_dtype_string(arg_shape, dtype), idxs, update_shape, dnums), "arg_shape": arg_shape, "dtype": dtype, "idxs": idxs, - "update_shape": update_shape, "dnums": dnums, "rng": rng, - "rng_idx": rng_idx} + "update_shape": update_shape, "dnums": dnums, + "rng_factory": rng_factory, "rng_idx_factory": rng_idx_factory} for dtype in float_dtypes for arg_shape, idxs, update_shape, dnums in [ ((5,), onp.array([[0], [2]]), (2,), lax.ScatterDimensionNumbers( @@ -1329,10 +1380,12 @@ def testGather(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): update_window_dims=(1,), inserted_window_dims=(0,), scatter_dims_to_operand_dims=(0,))), ] - for rng_idx in [jtu.rand_int(max(arg_shape))] - for rng in [jtu.rand_default()])) - def testScatterAdd(self, arg_shape, dtype, idxs, update_shape, dnums, rng, - rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(arg_shape))] + for rng_factory in [jtu.rand_default])) + def testScatterAdd(self, arg_shape, dtype, idxs, update_shape, dnums, + rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() rand_idxs = lambda: rng_idx(idxs.shape, idxs.dtype) args_maker = lambda: [rng(arg_shape, dtype), rand_idxs(), rng(update_shape, dtype)] @@ -1344,8 +1397,8 @@ def testScatterAdd(self, arg_shape, dtype, idxs, update_shape, dnums, rng, jtu.format_shape_dtype_string(arg_shape, dtype), idxs, update_shape, dnums), "arg_shape": arg_shape, "dtype": dtype, "idxs": idxs, - "update_shape": update_shape, "dnums": dnums, "rng": rng, - "rng_idx": rng_idx} + "update_shape": update_shape, "dnums": dnums, + "rng_factory": rng_factory, "rng_idx_factory": rng_idx_factory} for dtype in float_dtypes for arg_shape, idxs, update_shape, dnums in [ ((5,), onp.array([[0], [2]]), (2,), lax.ScatterDimensionNumbers( @@ -1358,10 +1411,12 @@ def testScatterAdd(self, arg_shape, dtype, idxs, update_shape, dnums, rng, update_window_dims=(1,), inserted_window_dims=(0,), scatter_dims_to_operand_dims=(0,))), ] - for rng_idx in [jtu.rand_int(max(arg_shape))] - for rng in [jtu.rand_default()])) - def testScatterMin(self, arg_shape, dtype, idxs, update_shape, dnums, rng, - rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(arg_shape))] + for rng_factory in [jtu.rand_default])) + def testScatterMin(self, arg_shape, dtype, idxs, update_shape, dnums, + rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() rand_idxs = lambda: rng_idx(idxs.shape, idxs.dtype) args_maker = lambda: [rng(arg_shape, dtype), rand_idxs(), rng(update_shape, dtype)] @@ -1373,8 +1428,8 @@ def testScatterMin(self, arg_shape, dtype, idxs, update_shape, dnums, rng, jtu.format_shape_dtype_string(arg_shape, dtype), idxs, update_shape, dnums), "arg_shape": arg_shape, "dtype": dtype, "idxs": idxs, - "update_shape": update_shape, "dnums": dnums, "rng": rng, - "rng_idx": rng_idx} + "update_shape": update_shape, "dnums": dnums, + "rng_factory": rng_factory, "rng_idx_factory": rng_idx_factory} for dtype in float_dtypes for arg_shape, idxs, update_shape, dnums in [ ((5,), onp.array([[0], [2]]), (2,), lax.ScatterDimensionNumbers( @@ -1387,10 +1442,12 @@ def testScatterMin(self, arg_shape, dtype, idxs, update_shape, dnums, rng, update_window_dims=(1,), inserted_window_dims=(0,), scatter_dims_to_operand_dims=(0,))), ] - for rng_idx in [jtu.rand_int(max(arg_shape))] - for rng in [jtu.rand_default()])) - def testScatterMax(self, arg_shape, dtype, idxs, update_shape, dnums, rng, - rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(arg_shape))] + for rng_factory in [jtu.rand_default])) + def testScatterMax(self, arg_shape, dtype, idxs, update_shape, dnums, + rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() rand_idxs = lambda: rng_idx(idxs.shape, idxs.dtype) args_maker = lambda: [rng(arg_shape, dtype), rand_idxs(), rng(update_shape, dtype)] @@ -1402,8 +1459,8 @@ def testScatterMax(self, arg_shape, dtype, idxs, update_shape, dnums, rng, jtu.format_shape_dtype_string(arg_shape, dtype), idxs, update_shape, dnums), "arg_shape": arg_shape, "dtype": dtype, "idxs": idxs, - "update_shape": update_shape, "dnums": dnums, "rng": rng, - "rng_idx": rng_idx} + "update_shape": update_shape, "dnums": dnums, + "rng_factory": rng_factory, "rng_idx_factory": rng_idx_factory} for dtype in float_dtypes for arg_shape, idxs, update_shape, dnums in [ ((5,), onp.array([[0], [2]]), (2,), lax.ScatterDimensionNumbers( @@ -1416,10 +1473,12 @@ def testScatterMax(self, arg_shape, dtype, idxs, update_shape, dnums, rng, update_window_dims=(1,), inserted_window_dims=(0,), scatter_dims_to_operand_dims=(0,))), ] - for rng_idx in [jtu.rand_int(max(arg_shape))] - for rng in [jtu.rand_default()])) - def testScatter(self, arg_shape, dtype, idxs, update_shape, dnums, rng, - rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(arg_shape))] + for rng_factory in [jtu.rand_default])) + def testScatter(self, arg_shape, dtype, idxs, update_shape, dnums, + rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() rand_idxs = lambda: rng_idx(idxs.shape, idxs.dtype) args_maker = lambda: [rng(arg_shape, dtype), rand_idxs(), rng(update_shape, dtype)] @@ -1530,93 +1589,98 @@ def testEyeConstant(self, dtype, shape, axes): GradTestSpec = collections.namedtuple( - "GradTestSpec", ["op", "nargs", "order", "rng", "dtypes", "name", "tol"]) -def grad_test_spec(op, nargs, order, rng, dtypes, name=None, tol=None): - return GradTestSpec(op, nargs, order, rng, dtypes, name or op.__name__, tol) + "GradTestSpec", + ["op", "nargs", "order", "rng_factory", "dtypes", "name", "tol"]) +def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): + return GradTestSpec( + op, nargs, order, rng_factory, dtypes, name or op.__name__, tol) LAX_GRAD_OPS = [ - grad_test_spec(lax.neg, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.neg, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.floor, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.floor, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), - grad_test_spec(lax.ceil, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.ceil, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), - grad_test_spec(lax.round, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.round, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), - grad_test_spec(lax.exp, nargs=1, order=2, rng=jtu.rand_small(), + grad_test_spec(lax.exp, nargs=1, order=2, rng_factory=jtu.rand_small, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.expm1, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.expm1, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.log, nargs=1, order=2, rng=jtu.rand_positive(), + grad_test_spec(lax.log, nargs=1, order=2, rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.log1p, nargs=1, order=2, rng=jtu.rand_positive(), + grad_test_spec(lax.log1p, nargs=1, order=2, rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.sinh, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.sinh, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64], tol=1e-5), - grad_test_spec(lax.cosh, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.cosh, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64], tol=1e-5), - grad_test_spec(lax.tanh, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.tanh, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64], tol=1e-5), - grad_test_spec(lax.sin, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.sin, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.cos, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.cos, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.tan, nargs=1, order=2, rng=jtu.rand_uniform(-1.3, 1.3), + grad_test_spec(lax.tan, nargs=1, order=2, + rng_factory=partial(jtu.rand_uniform, -1.3, 1.3), dtypes=[onp.float64, onp.complex64], tol=1e-3), - grad_test_spec(lax.asin, nargs=1, order=2, rng=jtu.rand_uniform(-1., 1.), + grad_test_spec(lax.asin, nargs=1, order=2, + rng_factory=partial(jtu.rand_uniform, -1.3, 1.3), dtypes=[onp.float64], tol=1e-3), - grad_test_spec(lax.acos, nargs=1, order=2, rng=jtu.rand_uniform(-1., 1.), + grad_test_spec(lax.acos, nargs=1, order=2, + rng_factory=partial(jtu.rand_uniform, -1.3, 1.3), dtypes=[onp.float64], tol=1e-3), # TODO(proteneer): atan2 input is already a representation of a # complex number. Need to think harder about what this even means # if each input itself is a complex number. - grad_test_spec(lax.atan2, nargs=2, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.atan2, nargs=2, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), - grad_test_spec(lax.erf, nargs=1, order=2, rng=jtu.rand_small(), + grad_test_spec(lax.erf, nargs=1, order=2, rng_factory=jtu.rand_small, dtypes=[onp.float64]), - grad_test_spec(lax.erfc, nargs=1, order=2, rng=jtu.rand_small(), + grad_test_spec(lax.erfc, nargs=1, order=2, rng_factory=jtu.rand_small, dtypes=[onp.float64]), - grad_test_spec(lax.erf_inv, nargs=1, order=2, rng=jtu.rand_small(), + grad_test_spec(lax.erf_inv, nargs=1, order=2, rng_factory=jtu.rand_small, dtypes=[onp.float64]), - # grad_test_spec(lax.lgamma, nargs=1, order=2, rng=jtu.rand_small(), + # grad_test_spec(lax.lgamma, nargs=1, order=2, rng_factory=jtu.rand_small, # dtypes=[onp.float64]), # TODO(mattjj): enable - grad_test_spec(lax.bessel_i0e, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.bessel_i0e, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), - grad_test_spec(lax.bessel_i1e, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.bessel_i1e, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), - grad_test_spec(lax.real, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.real, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.complex64]), - grad_test_spec(lax.imag, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.imag, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.complex64]), - grad_test_spec(lax.complex, nargs=2, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.complex, nargs=2, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float32]), - grad_test_spec(lax.conj, nargs=1, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.conj, nargs=1, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float32, onp.complex64]), - grad_test_spec(lax.abs, nargs=1, order=2, rng=jtu.rand_positive(), + grad_test_spec(lax.abs, nargs=1, order=2, rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.pow, nargs=2, order=2, rng=jtu.rand_positive(), + grad_test_spec(lax.pow, nargs=2, order=2, rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.add, nargs=2, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.add, nargs=2, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.sub, nargs=2, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.sub, nargs=2, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.mul, nargs=2, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.mul, nargs=2, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.div, nargs=2, order=1, rng=jtu.rand_not_small(), + grad_test_spec(lax.div, nargs=2, order=1, rng_factory=jtu.rand_not_small, dtypes=[onp.float64, onp.complex64]), - grad_test_spec(lax.max, nargs=2, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.max, nargs=2, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), - grad_test_spec(lax.min, nargs=2, order=2, rng=jtu.rand_default(), + grad_test_spec(lax.min, nargs=2, order=2, rng_factory=jtu.rand_default, dtypes=[onp.float64]), # TODO(mattjj): make some-equal checks more robust, enable second-order - # grad_test_spec(lax.max, nargs=2, order=1, rng=jtu.rand_some_equal(), + # grad_test_spec(lax.max, nargs=2, order=1, rng_factory=jtu.rand_some_equal, # dtypes=[onp.float64], name="MaxSomeEqual"), - # grad_test_spec(lax.min, nargs=2, order=1, rng=jtu.rand_some_equal(), + # grad_test_spec(lax.min, nargs=2, order=1, rng_factory=jtu.rand_some_equal, # dtypes=[onp.float64], name="MinSomeEqual"), ] @@ -1674,13 +1738,14 @@ class LaxAutodiffTest(jtu.JaxTestCase): jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( rec.name, shapes, itertools.repeat(dtype)), - "op": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, + "op": rec.op, "rng_factory": rec.rng_factory, "shapes": shapes, "dtype": dtype, "order": rec.order, "tol": rec.tol} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for dtype in rec.dtypes) for rec in LAX_GRAD_OPS)) - def testOpGrad(self, op, rng, shapes, dtype, order, tol): + def testOpGrad(self, op, rng_factory, shapes, dtype, order, tol): + rng = rng_factory() if jtu.device_under_test() == "tpu" and op is lax.pow: raise SkipTest("pow grad imprecise on tpu") tol = 1e-1 if num_float_bits(dtype) == 32 else tol @@ -1699,11 +1764,12 @@ def testOpGradSpecialValue(self, op, special_value): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_from_dtype={}_to_dtype={}".format( jtu.dtype_str(from_dtype), jtu.dtype_str(to_dtype)), - "from_dtype": from_dtype, "to_dtype": to_dtype, "rng": rng} + "from_dtype": from_dtype, "to_dtype": to_dtype, "rng_factory": rng_factory} for from_dtype, to_dtype in itertools.product( float_dtypes + complex_dtypes, repeat=2) - for rng in [jtu.rand_default()])) - def testConvertElementTypeGrad(self, from_dtype, to_dtype, rng): + for rng_factory in [jtu.rand_default])) + def testConvertElementTypeGrad(self, from_dtype, to_dtype, rng_factory): + rng = rng_factory() tol = max(gradient_tolerance(to_dtype), gradient_tolerance(from_dtype)) args = (rng((2, 3), from_dtype),) convert_element_type = lambda x: lax.convert_element_type(x, to_dtype) @@ -1715,15 +1781,16 @@ def testConvertElementTypeGrad(self, from_dtype, to_dtype, rng): jtu.format_shape_dtype_string(operand_shape, dtype), jtu.format_shape_dtype_string(max_shape, dtype)), "min_shape": min_shape, "operand_shape": operand_shape, - "max_shape": max_shape, "dtype": dtype, "rng": rng} + "max_shape": max_shape, "dtype": dtype, "rng_factory": rng_factory} for min_shape, operand_shape, max_shape in [ [(), (), ()], [(), (2, 3), ()], [(2, 3), (2, 3), (2, 3)], ] for dtype in float_dtypes - for rng in [jtu.rand_default()])) - def testClampGrad(self, min_shape, operand_shape, max_shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testClampGrad(self, min_shape, operand_shape, max_shape, dtype, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-2}) shapes = [min_shape, operand_shape, max_shape] min, operand, max = (rng(shape, dtype) for shape in shapes) @@ -1737,13 +1804,14 @@ def testClampGrad(self, min_shape, operand_shape, max_shape, dtype, rng): dim, ",".join(str(d) for d in base_shape), onp.dtype(dtype).name, num_arrs), "dim": dim, "base_shape": base_shape, "dtype": dtype, - "num_arrs": num_arrs, "rng": rng} + "num_arrs": num_arrs, "rng_factory": rng_factory} for num_arrs in [3] for dtype in float_dtypes for base_shape in [(4,), (3, 4), (2, 3, 4)] for dim in range(len(base_shape)) - for rng in [jtu.rand_default()])) - def testConcatenateGrad(self, dim, base_shape, dtype, num_arrs, rng): + for rng_factory in [jtu.rand_default])) + def testConcatenateGrad(self, dim, base_shape, dtype, num_arrs, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) shapes = [base_shape[:dim] + (size,) + base_shape[dim+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), range(num_arrs))] @@ -1758,7 +1826,7 @@ def testConcatenateGrad(self, dim, base_shape, dtype, num_arrs, rng): jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng": rng,} + "strides": strides, "padding": padding, "rng_factory": rng_factory,} for lhs_shape, rhs_shape, all_strides in itertools.chain( [((b, i, 3, 4), (j, i, 1, 2), [(1, 1), (1, 2), (2, 1)]) for b, i, j in itertools.product([2, 3], repeat=3)], @@ -1766,8 +1834,9 @@ def testConcatenateGrad(self, dim, base_shape, dtype, num_arrs, rng): for strides in all_strides for dtype in float_dtypes for padding in ["VALID", "SAME"] - for rng in [jtu.rand_small()])) - def testConvGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, rng): + for rng_factory in [jtu.rand_small])) + def testConvGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, rng_factory): + rng = rng_factory() lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) conv = partial(lax.conv, window_strides=strides, padding=padding, @@ -1784,7 +1853,7 @@ def testConvGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, rng): strides, padding, lhs_dil, rhs_dil), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "strides": strides, "padding": padding, "lhs_dil": lhs_dil, - "rhs_dil": rhs_dil, "rng": rng} + "rhs_dil": rhs_dil, "rng_factory": rng_factory} for lhs_shape, rhs_shape, all_strides, all_pads, lhs_dils, rhs_dils in itertools.chain( [((b, i, 3, 4), (j, i, 1, 2), [(1, 1), (1, 2), (2, 1)], @@ -1798,9 +1867,10 @@ def testConvGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, rng): for lhs_dil in lhs_dils for dtype in float_dtypes for padding in all_pads - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testConvWithGeneralPaddingGrad(self, lhs_shape, rhs_shape, dtype, strides, - padding, lhs_dil, rhs_dil, rng): + padding, lhs_dil, rhs_dil, rng_factory): + rng = rng_factory() lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) conv = partial(lax.conv_with_general_padding, window_strides=strides, @@ -1819,7 +1889,7 @@ def testConvWithGeneralPaddingGrad(self, lhs_shape, rhs_shape, dtype, strides, feature_group_count), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "strides": strides, "padding": padding, "lhs_dil": lhs_dil, - "rhs_dil": rhs_dil, "rng": rng, "dimension_numbers": dim_nums, + "rhs_dil": rhs_dil, "rng_factory": rng_factory, "dimension_numbers": dim_nums, "perms": perms, "feature_group_count": feature_group_count} for lhs_shape, rhs_shape, all_strides, all_pads, lhs_dils, rhs_dils in [ ((b, i, 6, 7), # lhs_shape @@ -1839,12 +1909,13 @@ def testConvWithGeneralPaddingGrad(self, lhs_shape, rhs_shape, dtype, strides, (("NCHW", "OIHW", "NCHW"), ([0, 1, 2, 3], [0, 1, 2, 3])), (("NHWC", "HWIO", "NHWC"), ([0, 2, 3, 1], [2, 3, 1, 0])), (("NHWC", "OIHW", "NCHW"), ([0, 2, 3, 1], [0, 1, 2, 3]))] - for rng in [jtu.rand_default()] + for rng_factory in [jtu.rand_default] )) @jtu.skip_on_devices("tpu") # TODO(phawkins): precision problems on TPU. def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, dimension_numbers, - perms, feature_group_count, rng): + perms, feature_group_count, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype, {onp.float16: 5e-1, onp.float32: 1e-4}) # permute shapes to match dim_spec, scale by feature_group_count @@ -1870,10 +1941,11 @@ def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype)), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "rng": jtu.rand_default()} + "rng_factory": jtu.rand_default} for lhs_shape in [(2,), (3, 2)] for rhs_shape in [(2,), (2, 4)] for dtype in float_dtypes)) - def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng): + def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-4}) lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) @@ -1893,7 +1965,7 @@ def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng): jtu.format_shape_dtype_string(rhs_shape, dtype), dimension_numbers), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "dimension_numbers": dimension_numbers, "rng": jtu.rand_small()} + "dimension_numbers": dimension_numbers, "rng_factory": jtu.rand_small} for lhs_shape, rhs_shape, dimension_numbers in [ ((3, 2), (2, 4), (([1], [0]), ([], []))), ((3, 5), (2, 5), (([1], [1]), ([], []))), @@ -1902,7 +1974,8 @@ def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng): ] for dtype in float_dtypes)) def testDotGeneralContractAndBatchGrads(self, lhs_shape, rhs_shape, dtype, - dimension_numbers, rng): + dimension_numbers, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) @@ -1920,12 +1993,13 @@ def testDotGeneralContractAndBatchGrads(self, lhs_shape, rhs_shape, dtype, {"testcase_name": "_shape={}_dtype={}_broadcast_sizes={}".format( shape, onp.dtype(dtype).name, broadcast_sizes), "shape": shape, "dtype": dtype, "broadcast_sizes": broadcast_sizes, - "rng": rng} + "rng_factory": rng_factory} for shape in [(), (2, 3)] for dtype in float_dtypes for broadcast_sizes in [(), (2,), (1, 2)] - for rng in [jtu.rand_default()])) - def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng): + for rng_factory in [jtu.rand_default])) + def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) args = (rng(shape, dtype),) broadcast = lambda x: lax.broadcast(x, broadcast_sizes) @@ -1936,7 +2010,7 @@ def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng): jtu.format_shape_dtype_string(inshape, dtype), outshape, broadcast_dimensions), "inshape": inshape, "dtype": dtype, "outshape": outshape, - "dimensions": broadcast_dimensions, "rng": rng} + "dimensions": broadcast_dimensions, "rng_factory": rng_factory} for inshape, outshape, broadcast_dimensions in [ ([2], [2, 2], [0]), ([2], [2, 2], [1]), @@ -1944,8 +2018,9 @@ def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng): ([], [2, 3], []), ] for dtype in float_dtypes - for rng in [jtu.rand_default()])) - def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng): + for rng_factory in [jtu.rand_default])) + def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) operand = rng(inshape, dtype) broadcast_in_dim = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) @@ -1958,7 +2033,7 @@ def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng): jtu.format_shape_dtype_string(out_shape, dtype), permutation), "arg_shape": arg_shape, "out_shape": out_shape, "dtype": dtype, - "rng": rng, "permutation": permutation} + "rng_factory": rng_factory, "permutation": permutation} for dtype in float_dtypes for arg_shape, out_shape, permutation in [ [(3, 4), (12,), None], @@ -1971,8 +2046,9 @@ def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng): [(2, 2, 4), (2, 8), (0, 2, 1)], [(2, 2, 4), (2, 8), (2, 0, 1)], ] - for rng in [jtu.rand_default()])) - def testReshapeGrad(self, arg_shape, out_shape, permutation, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testReshapeGrad(self, arg_shape, out_shape, permutation, dtype, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) operand = rng(arg_shape, dtype) reshape = lambda x: lax.reshape(x, out_shape, permutation) @@ -1981,11 +2057,12 @@ def testReshapeGrad(self, arg_shape, out_shape, permutation, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_pads={}" .format(jtu.format_shape_dtype_string(shape, dtype), pads), - "shape": shape, "dtype": dtype, "pads": pads, "rng": jtu.rand_small()} + "shape": shape, "dtype": dtype, "pads": pads, "rng_factory": jtu.rand_small} for shape in [(2, 3)] for dtype in float_dtypes for pads in [[(1, 2, 1), (0, 1, 0)], [(-1, 0, 0), (-1, 0, 2)]])) - def testPadGrad(self, shape, dtype, pads, rng): + def testPadGrad(self, shape, dtype, pads, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) operand = rng(shape, dtype) @@ -2012,12 +2089,13 @@ def testReverseGrad(self): jtu.format_shape_dtype_string(pred_shape, onp.bool_), jtu.format_shape_dtype_string(arg_shape, dtype)), "pred_shape": pred_shape, "arg_shape": arg_shape, "dtype": dtype, - "rng": rng} + "rng_factory": rng_factory} for arg_shape in [(), (3,), (2, 3)] for pred_shape in ([(), arg_shape] if arg_shape else [()]) for dtype in float_dtypes - for rng in [jtu.rand_default()])) - def testSelectGrad(self, pred_shape, arg_shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testSelectGrad(self, pred_shape, arg_shape, dtype, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) pred = rng(pred_shape, onp.bool_) on_true = rng(arg_shape, dtype) @@ -2032,7 +2110,7 @@ def testSelectGrad(self, pred_shape, arg_shape, dtype, rng): jtu.format_shape_dtype_string(shape, dtype), start_indices, limit_indices, strides), "shape": shape, "dtype": dtype, "starts": start_indices, - "limits": limit_indices, "strides": strides, "rng": rng} + "limits": limit_indices, "strides": strides, "rng_factory": rng_factory} for shape, start_indices, limit_indices, strides in [ [(3,), (1,), (2,), None], [(7,), (4,), (7,), None], @@ -2045,8 +2123,9 @@ def testSelectGrad(self, pred_shape, arg_shape, dtype, rng): [(5, 3), (1, 1), (5, 3), (2, 1)], ] for dtype in float_dtypes - for rng in [jtu.rand_default()])) - def testSliceGrad(self, shape, dtype, starts, limits, strides, rng): + for rng_factory in [jtu.rand_default])) + def testSliceGrad(self, shape, dtype, starts, limits, strides, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) operand = rng(shape, dtype) slice = lambda x: lax.slice(x, starts, limits, strides) @@ -2057,16 +2136,17 @@ def testSliceGrad(self, shape, dtype, starts, limits, strides, rng): jtu.format_shape_dtype_string(shape, dtype), start_indices, size_indices), "shape": shape, "dtype": dtype, "start_indices": start_indices, - "size_indices": size_indices, "rng": rng} + "size_indices": size_indices, "rng_factory": rng_factory} for shape, start_indices, size_indices in [ [(3,), (1,), (1,)], [(5, 3), (1, 1), (3, 1)], [(7, 5, 3), (4, 1, 0), (2, 0, 1)], ] for dtype in float_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testDynamicSliceGrad(self, shape, dtype, start_indices, size_indices, - rng): + rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) operand = rng(shape, dtype) dynamic_slice = lambda x: lax.dynamic_slice(x, start_indices, size_indices) @@ -2077,16 +2157,17 @@ def testDynamicSliceGrad(self, shape, dtype, start_indices, size_indices, jtu.format_shape_dtype_string(shape, dtype), start_indices, update_shape), "shape": shape, "dtype": dtype, "start_indices": start_indices, - "update_shape": update_shape, "rng": rng} + "update_shape": update_shape, "rng_factory": rng_factory} for shape, start_indices, update_shape in [ [(3,), (1,), (1,)], [(5, 3), (1, 1), (3, 1)], [(7, 5, 3), (4, 1, 0), (2, 0, 1)], ] for dtype in float_dtypes - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testDynamicUpdateSliceGrad(self, shape, dtype, start_indices, - update_shape, rng): + update_shape, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) operand = rng(shape, dtype) update = rng(update_shape, dtype) @@ -2104,7 +2185,7 @@ def testDynamicUpdateSliceGrad(self, shape, dtype, start_indices, @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_perm={}".format( jtu.format_shape_dtype_string(shape, dtype), perm), - "shape": shape, "dtype": dtype, "perm": perm, "rng": rng} + "shape": shape, "dtype": dtype, "perm": perm, "rng_factory": rng_factory} for shape, perm in [ [(3, 4), (1, 0)], [(3, 4), (0, 1)], @@ -2112,8 +2193,9 @@ def testDynamicUpdateSliceGrad(self, shape, dtype, start_indices, [(3, 4, 5), (1, 0, 2)], ] for dtype in float_dtypes - for rng in [jtu.rand_default()])) - def testTransposeGrad(self, shape, dtype, perm, rng): + for rng_factory in [jtu.rand_default])) + def testTransposeGrad(self, shape, dtype, perm, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype) operand = rng(shape, dtype) transpose = lambda x: lax.transpose(x, perm) @@ -2123,7 +2205,7 @@ def testTransposeGrad(self, shape, dtype, perm, rng): {"testcase_name": "_op={}_inshape={}_reducedims={}" .format(op.__name__, jtu.format_shape_dtype_string(shape, dtype), dims), "op": op, "init_val": init_val, "shape": shape, "dtype": dtype, - "dims": dims, "rng": rng} + "dims": dims, "rng_factory": rng_factory} for init_val, op, dtypes in [ (0, lax.add, inexact_dtypes), # Precision problems for float16 tests. @@ -2141,8 +2223,9 @@ def testTransposeGrad(self, shape, dtype, perm, rng): [(3, 4, 5), (0, 1, 2)], [(3, 1), (1,)], ] - for rng in [jtu.rand_default()])) - def testReduceGrad(self, op, init_val, shape, dtype, dims, rng): + for rng_factory in [jtu.rand_default])) + def testReduceGrad(self, op, init_val, shape, dtype, dims, rng_factory): + rng = rng_factory() if jtu.device_under_test() == "tpu" and op is lax.mul: raise SkipTest("unimplemented case") tol = gradient_tolerance( @@ -2158,16 +2241,17 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng): {"testcase_name": "_op={}_dtype={}_padding={}" .format(op.__name__, onp.dtype(dtype).name, padding), "op": op, "init_val": init_val, "dtype": dtype, "padding": padding, - "rng": rng} + "rng_factory": rng_factory} for init_val, op, dtypes, rng in [ - (0, lax.add, float_dtypes, jtu.rand_small()), - (-onp.inf, lax.max, [onp.float32], jtu.rand_default()), - (onp.inf, lax.min, [onp.float32], jtu.rand_default()), + (0, lax.add, float_dtypes, jtu.rand_small), + (-onp.inf, lax.max, [onp.float32], jtu.rand_default), + (onp.inf, lax.min, [onp.float32], jtu.rand_default), ] for dtype in dtypes for padding in ["VALID", "SAME"] - for rng in [jtu.rand_default()])) - def testReduceWindowGrad(self, op, init_val, dtype, padding, rng): + for rng_factory in [jtu.rand_default])) + def testReduceWindowGrad(self, op, init_val, dtype, padding, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-3}) init_val = onp.asarray(init_val, dtype=dtype) @@ -2213,12 +2297,13 @@ def fun(operand): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}".format( jtu.format_shape_dtype_string(shape, dtype), axis), - "rng": rng, "shape": shape, "dtype": dtype, "axis": axis} + "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "axis": axis} for dtype in [onp.float32] for shape in [(5,), (5, 7)] for axis in [len(shape) - 1] - for rng in [jtu.rand_default()])) - def testSortGrad(self, shape, dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testSortGrad(self, shape, dtype, axis, rng_factory): + rng = rng_factory() tol = gradient_tolerance(dtype, {onp.float32: 1e-3}) operand = rng(shape, dtype) sort = lambda x: lax.sort(x, axis) @@ -2230,14 +2315,15 @@ def testSortGrad(self, shape, dtype, axis, rng): jtu.format_shape_dtype_string(shape, key_dtype), jtu.format_shape_dtype_string(shape, val_dtype), axis), - "rng": rng, "shape": shape, + "rng_factory": rng_factory, "shape": shape, "key_dtype": key_dtype, "val_dtype": val_dtype, "axis": axis} for key_dtype in [onp.float32] for val_dtype in [onp.float32] for shape in [(3,), (5, 3)] for axis in [len(shape) - 1] - for rng in [jtu.rand_default()])) - def testSortKeyValGrad(self, shape, key_dtype, val_dtype, axis, rng): + for rng_factory in [jtu.rand_default])) + def testSortKeyValGrad(self, shape, key_dtype, val_dtype, axis, rng_factory): + rng = rng_factory() # This test relies on the property that wherever keys are tied, values are # too, since we don't guarantee the same ordering of values with equal keys. # To avoid that case, we generate unique keys (globally in the key array). @@ -2255,7 +2341,8 @@ def args_maker(): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_idxs={}_axes={}".format( jtu.format_shape_dtype_string(shape, dtype), idxs, axes), - "shape": shape, "dtype": dtype, "idxs": idxs, "axes": axes, "rng": rng} + "shape": shape, "dtype": dtype, "idxs": idxs, "axes": axes, + "rng_factory": rng_factory} for dtype in float_dtypes for shape, idxs, axes in [ [(3, 4, 5), (onp.array([0, 2, 1]),), (0,)], @@ -2263,8 +2350,9 @@ def args_maker(): [(3, 4, 5), (onp.array([0, 2]), onp.array([1, 3])), (0, 1)], [(3, 4, 5), (onp.array([0, 2]), onp.array([1, 3])), (0, 2)], ] - for rng in [jtu.rand_default()])) - def testIndexTakeGrad(self, shape, dtype, idxs, axes, rng): + for rng_factory in [jtu.rand_default])) + def testIndexTakeGrad(self, shape, dtype, idxs, axes, rng_factory): + rng = rng_factory() src = rng(shape, dtype) index_take = lambda src: lax.index_take(src, idxs, axes) check_grads(index_take, (src,), 2, ["fwd", "rev"], 1e-2, 1e-2, 1) @@ -2274,7 +2362,8 @@ def testIndexTakeGrad(self, shape, dtype, idxs, axes, rng): jtu.format_shape_dtype_string(shape, dtype), idxs, dnums, slice_sizes), "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, - "slice_sizes": slice_sizes, "rng": rng, "rng_idx": rng_idx} + "slice_sizes": slice_sizes, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in float_dtypes for shape, idxs, dnums, slice_sizes in [ ((5,), onp.array([[0], [2]]), lax.GatherDimensionNumbers( @@ -2287,9 +2376,12 @@ def testIndexTakeGrad(self, shape, dtype, idxs, axes, rng): offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0,)), (1, 3)), ] - for rng_idx in [jtu.rand_int(max(shape))] - for rng in [jtu.rand_default()])) - def testGatherGrad(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(shape))] + for rng_factory in [jtu.rand_default])) + def testGatherGrad(self, shape, dtype, idxs, dnums, slice_sizes, rng_factory, + rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() idxs = rng_idx(idxs.shape, idxs.dtype) gather = lambda x: lax.gather(x, idxs, dimension_numbers=dnums, slice_sizes=slice_sizes) @@ -2301,8 +2393,8 @@ def testGatherGrad(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): jtu.format_shape_dtype_string(arg_shape, dtype), idxs, update_shape, dnums), "arg_shape": arg_shape, "dtype": dtype, "idxs": idxs, - "update_shape": update_shape, "dnums": dnums, "rng": rng, - "rng_idx": rng_idx} + "update_shape": update_shape, "dnums": dnums, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in float_dtypes for arg_shape, idxs, update_shape, dnums in [ ((5,), onp.array([[0], [2]]), (2,), lax.ScatterDimensionNumbers( @@ -2315,10 +2407,12 @@ def testGatherGrad(self, shape, dtype, idxs, dnums, slice_sizes, rng, rng_idx): update_window_dims=(1,), inserted_window_dims=(0,), scatter_dims_to_operand_dims=(0,))), ] - for rng_idx in [jtu.rand_int(max(arg_shape))] - for rng in [jtu.rand_default()])) - def testScatterAddGrad(self, arg_shape, dtype, idxs, update_shape, dnums, rng, - rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(arg_shape))] + for rng_factory in [jtu.rand_default])) + def testScatterAddGrad(self, arg_shape, dtype, idxs, update_shape, dnums, + rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() idxs = rng_idx(idxs.shape, idxs.dtype) scatter_add = lambda x, y: lax.scatter_add(x, idxs, y, dimension_numbers=dnums) @@ -2331,8 +2425,8 @@ def testScatterAddGrad(self, arg_shape, dtype, idxs, update_shape, dnums, rng, jtu.format_shape_dtype_string(arg_shape, dtype), idxs, update_shape, dnums), "arg_shape": arg_shape, "dtype": dtype, "idxs": idxs, - "update_shape": update_shape, "dnums": dnums, "rng": rng, - "rng_idx": rng_idx} + "update_shape": update_shape, "dnums": dnums, "rng_factory": rng_factory, + "rng_idx_factory": rng_idx_factory} for dtype in float_dtypes for arg_shape, idxs, update_shape, dnums in [ ((5,), onp.array([[0], [2]]), (2,), lax.ScatterDimensionNumbers( @@ -2345,10 +2439,12 @@ def testScatterAddGrad(self, arg_shape, dtype, idxs, update_shape, dnums, rng, update_window_dims=(1,), inserted_window_dims=(0,), scatter_dims_to_operand_dims=(0,))), ] - for rng_idx in [jtu.rand_int(max(arg_shape))] - for rng in [jtu.rand_default()])) - def testScatterGrad(self, arg_shape, dtype, idxs, update_shape, dnums, rng, - rng_idx): + for rng_idx_factory in [partial(jtu.rand_int, max(arg_shape))] + for rng_factory in [jtu.rand_default])) + def testScatterGrad(self, arg_shape, dtype, idxs, update_shape, dnums, + rng_factory, rng_idx_factory): + rng = rng_factory() + rng_idx = rng_idx_factory() idxs = rng_idx(idxs.shape, idxs.dtype) scatter = lambda x, y: lax.scatter(x, idxs, y, dimension_numbers=dnums) x = rng(arg_shape, dtype) @@ -2428,14 +2524,15 @@ def _CheckBatching(self, op, bdim_size, bdims, shapes, dtype, rng, {"testcase_name": "{}_bdims={}".format( jtu.format_test_name_suffix(rec.op, shapes, itertools.repeat(dtype)), bdims), - "op_name": rec.op, "rng": rec.rng, "shapes": shapes, "dtype": dtype, - "bdims": bdims} + "op_name": rec.op, "rng_factory": rec.rng_factory, "shapes": shapes, + "dtype": dtype, "bdims": bdims} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for bdims in all_bdims(*shapes) for dtype in rec.dtypes) for rec in LAX_OPS)) - def testOp(self, op_name, rng, shapes, dtype, bdims): + def testOp(self, op_name, rng_factory, shapes, dtype, bdims): + rng = rng_factory() op = getattr(lax, op_name) tol = tolerance(dtype) self._CheckBatching(op, 10, bdims, shapes, dtype, rng, tol, tol) @@ -2450,7 +2547,7 @@ def testOp(self, op_name, rng, shapes, dtype, bdims): feature_group_count, lhs_bdim, rhs_bdim), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "strides": strides, "padding": padding, "lhs_dil": lhs_dil, - "rhs_dil": rhs_dil, "rng": rng, "dimension_numbers": dim_nums, + "rhs_dil": rhs_dil, "rng_factory": rng_factory, "dimension_numbers": dim_nums, "perms": perms, "lhs_bdim": lhs_bdim, "rhs_bdim": rhs_bdim, "feature_group_count": feature_group_count} for lhs_shape, rhs_shape, all_strides, all_pads, lhs_dils, rhs_dils in [ @@ -2474,13 +2571,14 @@ def testOp(self, op_name, rng, shapes, dtype, bdims): for lhs_bdim in itertools.chain([None], range(len(lhs_shape) + 1)) for rhs_bdim in itertools.chain([None], range(len(rhs_shape) + 1)) if (lhs_bdim, rhs_bdim) != (None, None) - for rng in [jtu.rand_default()] + for rng_factory in [jtu.rand_default] )) # TODO(mattjj): some cases fail on TPU just due to numerical tolerances @jtu.skip_on_devices("tpu") def testConvGeneralDilatedBatching( self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, - dimension_numbers, perms, feature_group_count, lhs_bdim, rhs_bdim, rng): + dimension_numbers, perms, feature_group_count, lhs_bdim, rhs_bdim, rng_factory): + rng = rng_factory() tol = 1e-1 if onp.finfo(dtype).bits <= 32 else 1e-3 # permute shapes to match dim_spec, scale by feature_group_count @@ -2503,13 +2601,14 @@ def testConvGeneralDilatedBatching( {"testcase_name": "_shape={}_from_dtype={}_to_dtype={}_bdims={}".format( shape, from_dtype, to_dtype, bdims), "shape": shape, "from_dtype": from_dtype, "to_dtype": to_dtype, - "bdims": bdims, "rng": rng} + "bdims": bdims, "rng_factory": rng_factory} for from_dtype, to_dtype in itertools.product( [onp.float32, onp.int32, "float32", "int32"], repeat=2) for shape in [(2, 3)] for bdims in all_bdims(shape) - for rng in [jtu.rand_default()])) - def testConvertElementType(self, shape, from_dtype, to_dtype, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testConvertElementType(self, shape, from_dtype, to_dtype, bdims, rng_factory): + rng = rng_factory() op = lambda x: lax.convert_element_type(x, to_dtype) self._CheckBatching(op, 10, bdims, (shape,), from_dtype, rng) @@ -2517,13 +2616,14 @@ def testConvertElementType(self, shape, from_dtype, to_dtype, bdims, rng): {"testcase_name": "_shape={}_from_dtype={}_to_dtype={}_bdims={}".format( shape, from_dtype, to_dtype, bdims), "shape": shape, "from_dtype": from_dtype, "to_dtype": to_dtype, - "bdims": bdims, "rng": rng} + "bdims": bdims, "rng_factory": rng_factory} for from_dtype, to_dtype in itertools.product( [onp.float32, onp.int32, "float32", "int32"], repeat=2) for shape in [(2, 3)] for bdims in all_bdims(shape) - for rng in [jtu.rand_default()])) - def testBitcastElementType(self, shape, from_dtype, to_dtype, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testBitcastElementType(self, shape, from_dtype, to_dtype, bdims, rng_factory): + rng = rng_factory() op = lambda x: lax.bitcast_convert_type(x, to_dtype) self._CheckBatching(op, 10, bdims, (shape,), from_dtype, rng) @@ -2534,7 +2634,7 @@ def testBitcastElementType(self, shape, from_dtype, to_dtype, bdims, rng): jtu.format_shape_dtype_string(max_shape, dtype), bdims), "min_shape": min_shape, "operand_shape": operand_shape, - "max_shape": max_shape, "dtype": dtype, "bdims": bdims, "rng": rng} + "max_shape": max_shape, "dtype": dtype, "bdims": bdims, "rng_factory": rng_factory} for min_shape, operand_shape, max_shape in [ [(), (2, 3), ()], [(2, 3), (2, 3), ()], @@ -2543,8 +2643,9 @@ def testBitcastElementType(self, shape, from_dtype, to_dtype, bdims, rng): ] for dtype in default_dtypes for bdims in all_bdims(min_shape, operand_shape, max_shape) - for rng in [jtu.rand_default()])) - def testClamp(self, min_shape, operand_shape, max_shape, dtype, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testClamp(self, min_shape, operand_shape, max_shape, dtype, bdims, rng_factory): + rng = rng_factory() raise SkipTest("batching rule for clamp not implemented") # TODO(mattj) shapes = [min_shape, operand_shape, max_shape] self._CheckBatching(lax.clamp, 10, bdims, shapes, dtype, rng) @@ -2555,12 +2656,13 @@ def testClamp(self, min_shape, operand_shape, max_shape, dtype, bdims, rng): jtu.format_shape_dtype_string(rhs_shape, dtype), bdims), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "bdims": bdims, "rng": rng} + "bdims": bdims, "rng_factory": rng_factory} for lhs_shape in [(3,), (4, 3)] for rhs_shape in [(3,), (3, 6)] for bdims in all_bdims(lhs_shape, rhs_shape) for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng_factory): + rng = rng_factory() self._CheckBatching(lax.dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng, rtol=tolerance(dtype, {onp.float16: 5e-2})) @@ -2572,7 +2674,7 @@ def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng): lhs_contracting, rhs_contracting, bdims), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "lhs_contracting": lhs_contracting, "rhs_contracting": rhs_contracting, - "bdims": bdims, "rng": rng} + "bdims": bdims, "rng_factory": rng_factory} for lhs_shape, rhs_shape, lhs_contracting, rhs_contracting in [ [(3, 5), (2, 5), [1], [1]], [(5, 3), (5, 2), [0], [0]], @@ -2583,9 +2685,10 @@ def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng): ] for bdims in all_bdims(lhs_shape, rhs_shape) for dtype in default_dtypes - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testDotGeneralContractOnly(self, lhs_shape, rhs_shape, dtype, - lhs_contracting, rhs_contracting, bdims, rng): + lhs_contracting, rhs_contracting, bdims, rng_factory): + rng = rng_factory() dimension_numbers = ((lhs_contracting, rhs_contracting), ([], [])) dot = partial(lax.dot_general, dimension_numbers=dimension_numbers) self._CheckBatching(dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng) @@ -2597,16 +2700,17 @@ def testDotGeneralContractOnly(self, lhs_shape, rhs_shape, dtype, jtu.format_shape_dtype_string(rhs_shape, dtype), dimension_numbers, bdims), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "dimension_numbers": dimension_numbers, "bdims": bdims, "rng": rng} + "dimension_numbers": dimension_numbers, "bdims": bdims, "rng_factory": rng_factory} for lhs_shape, rhs_shape, dimension_numbers in [ ((3, 3, 2), (3, 2, 4), (([2], [1]), ([0], [0]))), ((3, 4, 2, 4), (3, 4, 3, 2), (([2], [3]), ([0, 1], [0, 1]))), ] for bdims in all_bdims(lhs_shape, rhs_shape) for dtype in default_dtypes - for rng in [jtu.rand_small()])) + for rng_factory in [jtu.rand_small])) def testDotGeneralContractAndBatch(self, lhs_shape, rhs_shape, dtype, - dimension_numbers, bdims, rng): + dimension_numbers, bdims, rng_factory): + rng = rng_factory() dot = partial(lax.dot_general, dimension_numbers=dimension_numbers) self._CheckBatching(dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng) @@ -2614,13 +2718,14 @@ def testDotGeneralContractAndBatch(self, lhs_shape, rhs_shape, dtype, {"testcase_name": "_shape={}_dtype={}_broadcast_sizes={}_bdims={}".format( shape, onp.dtype(dtype).name, broadcast_sizes, bdims), "shape": shape, "dtype": dtype, "broadcast_sizes": broadcast_sizes, - "bdims": bdims, "rng": rng} + "bdims": bdims, "rng_factory": rng_factory} for shape in [(), (2, 3)] for dtype in default_dtypes for broadcast_sizes in [(), (2,), (1, 2)] for bdims in all_bdims(shape) - for rng in [jtu.rand_default()])) - def testBroadcast(self, shape, dtype, broadcast_sizes, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testBroadcast(self, shape, dtype, broadcast_sizes, bdims, rng_factory): + rng = rng_factory() op = lambda x: lax.broadcast(x, broadcast_sizes) self._CheckBatching(op, 5, bdims, (shape,), dtype, rng) @@ -2629,7 +2734,8 @@ def testBroadcast(self, shape, dtype, broadcast_sizes, bdims, rng): jtu.format_shape_dtype_string(inshape, dtype), outshape, broadcast_dimensions, bdims), "inshape": inshape, "dtype": dtype, "outshape": outshape, - "dimensions": broadcast_dimensions, "bdims": bdims, "rng": rng} + "dimensions": broadcast_dimensions, "bdims": bdims, + "rng_factory": rng_factory} for inshape, outshape, broadcast_dimensions in [ ([2], [2, 2], [0]), ([2], [2, 2], [1]), @@ -2638,8 +2744,9 @@ def testBroadcast(self, shape, dtype, broadcast_sizes, bdims, rng): ] for dtype in default_dtypes for bdims in all_bdims(inshape) - for rng in [jtu.rand_default()])) - def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, bdims, rng_factory): + rng = rng_factory() raise SkipTest("this test has failures in some cases") # TODO(mattjj) op = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) self._CheckBatching(op, 5, bdims, (inshape,), dtype, rng) @@ -2650,7 +2757,7 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, bdims, rng): jtu.format_shape_dtype_string(out_shape, dtype), dimensions, bdims), "arg_shape": arg_shape, "out_shape": out_shape, "dtype": dtype, - "dimensions": dimensions, "bdims": bdims, "rng": rng} + "dimensions": dimensions, "bdims": bdims, "rng_factory": rng_factory} for dtype in default_dtypes for arg_shape, dimensions, out_shape in [ [(3, 4), None, (12,)], @@ -2661,21 +2768,23 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, bdims, rng): [(2, 2, 4), (2, 1, 0), (4, 2, 2)] ] for bdims in all_bdims(arg_shape) - for rng in [jtu.rand_default()])) - def testReshape(self, arg_shape, out_shape, dtype, dimensions, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testReshape(self, arg_shape, out_shape, dtype, dimensions, bdims, rng_factory): + rng = rng_factory() op = lambda x: lax.reshape(x, out_shape, dimensions=dimensions) self._CheckBatching(op, 10, bdims, (arg_shape,), dtype, rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_pads={}_bdims={}" .format(jtu.format_shape_dtype_string(shape, dtype), pads, bdims), - "shape": shape, "dtype": dtype, "pads": pads, "rng": jtu.rand_small(), - "bdims": bdims} + "shape": shape, "dtype": dtype, "pads": pads, + "rng_factory": jtu.rand_small, "bdims": bdims} for shape in [(2, 3)] for bdims in all_bdims(shape) for dtype in default_dtypes for pads in [[(1, 2, 1), (0, 1, 0)]])) - def testPad(self, shape, dtype, pads, bdims, rng): + def testPad(self, shape, dtype, pads, bdims, rng_factory): + rng = rng_factory() fun = lambda operand: lax.pad(operand, onp.array(0, dtype), pads) self._CheckBatching(fun, 5, bdims, (shape,), dtype, rng) @@ -2685,13 +2794,14 @@ def testPad(self, shape, dtype, pads, bdims, rng): jtu.format_shape_dtype_string(arg_shape, arg_dtype), bdims), "pred_shape": pred_shape, "arg_shape": arg_shape, "arg_dtype": arg_dtype, - "bdims": bdims, "rng": rng} + "bdims": bdims, "rng_factory": rng_factory} for arg_shape in [(), (3,), (2, 3)] for pred_shape in ([(), arg_shape] if arg_shape else [()]) for bdims in all_bdims(pred_shape, arg_shape, arg_shape) for arg_dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testSelect(self, pred_shape, arg_shape, arg_dtype, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testSelect(self, pred_shape, arg_shape, arg_dtype, bdims, rng_factory): + rng = rng_factory() op = lambda c, x, y: lax.select(c < 0, x, y) self._CheckBatching(op, 5, bdims, (pred_shape, arg_shape, arg_shape,), arg_dtype, rng) @@ -2702,7 +2812,7 @@ def testSelect(self, pred_shape, arg_shape, arg_dtype, bdims, rng): jtu.format_shape_dtype_string(shape, dtype), start_indices, limit_indices, strides, bdims), "shape": shape, "dtype": dtype, "starts": start_indices, - "limits": limit_indices, "strides": strides, "bdims": bdims, "rng": rng} + "limits": limit_indices, "strides": strides, "bdims": bdims, "rng_factory": rng_factory} for shape, start_indices, limit_indices, strides in [ [(3,), (1,), (2,), None], [(7,), (4,), (7,), None], @@ -2716,15 +2826,16 @@ def testSelect(self, pred_shape, arg_shape, arg_dtype, bdims, rng): ] for bdims in all_bdims(shape) for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testSlice(self, shape, dtype, starts, limits, strides, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testSlice(self, shape, dtype, starts, limits, strides, bdims, rng_factory): + rng = rng_factory() op = lambda x: lax.slice(x, starts, limits, strides) self._CheckBatching(op, 5, bdims, (shape,), dtype, rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_perm={}_bdims={}".format( jtu.format_shape_dtype_string(shape, dtype), perm, bdims), - "shape": shape, "dtype": dtype, "perm": perm, "bdims": bdims, "rng": rng} + "shape": shape, "dtype": dtype, "perm": perm, "bdims": bdims, "rng_factory": rng_factory} for shape, perm in [ [(3, 4), (1, 0)], [(3, 4), (0, 1)], @@ -2733,8 +2844,9 @@ def testSlice(self, shape, dtype, starts, limits, strides, bdims, rng): ] for bdims in all_bdims(shape) for dtype in default_dtypes - for rng in [jtu.rand_default()])) - def testTranspose(self, shape, dtype, perm, bdims, rng): + for rng_factory in [jtu.rand_default])) + def testTranspose(self, shape, dtype, perm, bdims, rng_factory): + rng = rng_factory() op = lambda x: lax.transpose(x, perm) self._CheckBatching(op, 5, bdims, (shape,), dtype, rng) @@ -2743,7 +2855,7 @@ def testTranspose(self, shape, dtype, perm, bdims, rng): .format(op.__name__, jtu.format_shape_dtype_string(shape, dtype), dims, init_val, bdims), "op": op, "init_val": init_val, "shape": shape, "dtype": dtype, - "dims": dims, "bdims": bdims, "rng": rng} + "dims": dims, "bdims": bdims, "rng_factory": rng_factory} for init_val, op, dtypes in [ (0, lax.add, default_dtypes), (1, lax.mul, default_dtypes), @@ -2765,8 +2877,9 @@ def testTranspose(self, shape, dtype, perm, bdims, rng): [(3, 4, 5), (0, 2)], [(3, 4, 5), (0, 1, 2)] ] for bdims in all_bdims(shape) - for rng in [jtu.rand_small()])) - def testReduce(self, op, init_val, shape, dtype, dims, bdims, rng): + for rng_factory in [jtu.rand_small])) + def testReduce(self, op, init_val, shape, dtype, dims, bdims, rng_factory): + rng = rng_factory() init_val = onp.asarray(init_val, dtype=dtype) fun = lambda operand: lax.reduce(operand, init_val, op, dims) self._CheckBatching(fun, 5, bdims, (shape,), dtype, rng) @@ -2775,7 +2888,7 @@ def testReduce(self, op, init_val, shape, dtype, dims, bdims, rng): {"testcase_name": "_op={}_dtype={}_padding={}" .format(op.__name__, onp.dtype(dtype).name, padding), "op": op, "init_val": init_val, "dtype": dtype, "padding": padding, - "rng": rng} + "rng_factory": rng_factory} for init_val, op, dtypes in [ (0, lax.add, [onp.float32]), (-onp.inf, lax.max, [onp.float32]), @@ -2783,8 +2896,9 @@ def testReduce(self, op, init_val, shape, dtype, dims, bdims, rng): ] for dtype in dtypes for padding in ["VALID", "SAME"] - for rng in [jtu.rand_small()])) - def testReduceWindow(self, op, init_val, dtype, padding, rng): + for rng_factory in [jtu.rand_small])) + def testReduceWindow(self, op, init_val, dtype, padding, rng_factory): + rng = rng_factory() init_val = onp.asarray(init_val, dtype=dtype) all_configs = itertools.chain( @@ -2806,13 +2920,14 @@ def fun(operand): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_bdims={}_fft_ndims={}" .format(shape, bdims, fft_ndims), - "shape": shape, "bdims": bdims, "fft_ndims": fft_ndims, "rng": rng} + "shape": shape, "bdims": bdims, "fft_ndims": fft_ndims, "rng_factory": rng_factory} for shape in [(5,), (3, 4, 5), (2, 3, 4, 5)] for bdims in all_bdims(shape) for fft_ndims in range(0, min(3, len(shape)) + 1) - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") # TODO(b/137993701): unimplemented cases. - def testFft(self, fft_ndims, shape, bdims, rng): + def testFft(self, fft_ndims, shape, bdims, rng_factory): + rng = rng_factory() ndims = len(shape) axes = range(ndims - fft_ndims, ndims) fft_lengths = [shape[axis] for axis in axes] diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 4fed27e5708a..cf919fb5afee 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -61,11 +61,12 @@ class NumpyLinalgTest(jtu.JaxTestCase): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(1, 1), (4, 4), (2, 5, 5), (200, 200), (1000, 0, 0)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testCholesky(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testCholesky(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) def args_maker(): factor_shape = shape[:-1] + (2 * shape[-1],) @@ -86,11 +87,12 @@ def args_maker(): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_n={}".format(jtu.format_shape_dtype_string((n,n), dtype)), - "n": n, "dtype": dtype, "rng": rng} + "n": n, "dtype": dtype, "rng_factory": rng_factory} for n in [0, 4, 5, 25] # TODO(mattjj): complex64 unstable on large sizes? for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testDet(self, n, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testDet(self, n, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) args_maker = lambda: [rng((n, n), dtype)] @@ -105,13 +107,14 @@ def testDetOfSingularMatrix(self): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(0, 0), (1, 1), (3, 3), (4, 4), (10, 10), (200, 200), (2, 2, 2), (2, 3, 3), (3, 2, 2)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") - def testSlogdet(self, shape, dtype, rng): + def testSlogdet(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) args_maker = lambda: [rng(shape, dtype)] @@ -122,12 +125,13 @@ def testSlogdet(self, shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(1, 1), (4, 4), (5, 5), (2, 7, 7)] for dtype in float_types - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") - def testSlogdetGrad(self, shape, dtype, rng): + def testSlogdetGrad(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) a = rng(shape, dtype) jtu.check_grads(np.linalg.slogdet, (a,), 2, atol=1e-1, rtol=1e-1) @@ -142,14 +146,15 @@ def testIssue1213(self): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format( jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(0, 0), (4, 4), (5, 5), (50, 50), (2, 6, 6)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) # TODO(phawkins): enable when there is an eigendecomposition implementation # for GPU/TPU. @jtu.skip_on_devices("gpu", "tpu") - def testEig(self, shape, dtype, rng): + def testEig(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) n = shape[-1] args_maker = lambda: [rng(shape, dtype)] @@ -169,14 +174,15 @@ def norm(x): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format( jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(4, 4), (5, 5), (50, 50)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) # TODO: enable when there is an eigendecomposition implementation # for GPU/TPU. @jtu.skip_on_devices("gpu", "tpu") - def testEigvals(self, shape, dtype, rng): + def testEigvals(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) n = shape[-1] args_maker = lambda: [rng(shape, dtype)] @@ -188,12 +194,13 @@ def testEigvals(self, shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(1, 1), (4, 4), (5, 5)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("gpu", "tpu") - def testEigBatching(self, shape, dtype, rng): + def testEigBatching(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) shape = (10,) + shape args = rng(shape, dtype) @@ -204,12 +211,13 @@ def testEigBatching(self, shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_n={}_lower={}".format( jtu.format_shape_dtype_string((n,n), dtype), lower), - "n": n, "dtype": dtype, "lower": lower, "rng": rng} + "n": n, "dtype": dtype, "lower": lower, "rng_factory": rng_factory} for n in [0, 4, 5, 50] for dtype in float_types + complex_types for lower in [False, True] - for rng in [jtu.rand_default()])) - def testEigh(self, n, dtype, lower, rng): + for rng_factory in [jtu.rand_default])) + def testEigh(self, n, dtype, lower, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) tol = 30 if jtu.device_under_test() == "tpu": @@ -239,11 +247,12 @@ def norm(x): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format( jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(4, 4), (5, 5), (50, 50)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testEigvalsh(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testEigvalsh(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) if jtu.device_under_test() == "tpu": if np.issubdtype(dtype, np.complexfloating): @@ -260,12 +269,13 @@ def args_maker(): {"testcase_name": "_shape={}_lower={}".format(jtu.format_shape_dtype_string(shape, dtype), lower), - "shape": shape, "dtype": dtype, "rng": rng, "lower":lower} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "lower":lower} for shape in [(1, 1), (4, 4), (5, 5), (50, 50), (2, 10, 10)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()] + for rng_factory in [jtu.rand_default] for lower in [True, False])) - def testEighGrad(self, shape, dtype, rng, lower): + def testEighGrad(self, shape, dtype, rng_factory, lower): + rng = rng_factory() self.skipTest("Test fails with numeric errors.") uplo = "L" if lower else "U" a = rng(shape, dtype) @@ -285,16 +295,17 @@ def testEighGrad(self, shape, dtype, rng, lower): {"testcase_name": "_shape={}_lower={}".format(jtu.format_shape_dtype_string(shape, dtype), lower), - "shape": shape, "dtype": dtype, "rng": rng, "lower":lower, "eps":eps} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, "lower":lower, "eps":eps} for shape in [(1, 1), (4, 4), (5, 5), (50, 50)] for dtype in complex_types - for rng in [jtu.rand_default()] + for rng_factory in [jtu.rand_default] for lower in [True, False] for eps in [1e-4])) # TODO(phawkins): enable when there is a complex eigendecomposition # implementation for TPU. @jtu.skip_on_devices("tpu") - def testEighGradVectorComplex(self, shape, dtype, rng, lower, eps): + def testEighGradVectorComplex(self, shape, dtype, rng_factory, lower, eps): + rng = rng_factory() _skip_if_unsupported_type(dtype) # Special case to test for complex eigenvector grad correctness. # Exact eigenvector coordinate gradients are hard to test numerically for complex @@ -327,11 +338,12 @@ def testEighGradVectorComplex(self, shape, dtype, rng, lower, eps): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(1, 1), (4, 4), (5, 5)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testEighBatching(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testEighBatching(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) if (jtu.device_under_test() == "tpu" and np.issubdtype(dtype, onp.complexfloating)): @@ -347,7 +359,7 @@ def testEighBatching(self, shape, dtype, rng): {"testcase_name": "_shape={}_ord={}_axis={}_keepdims={}".format( jtu.format_shape_dtype_string(shape, dtype), ord, axis, keepdims), "shape": shape, "dtype": dtype, "axis": axis, "keepdims": keepdims, - "ord": ord, "rng": rng} + "ord": ord, "rng_factory": rng_factory} for axis, shape in [ (None, (1,)), (None, (7,)), (None, (5, 8)), (0, (9,)), (0, (4, 5)), ((1,), (10, 7, 3)), ((-2,), (4, 8)), @@ -362,8 +374,9 @@ def testEighBatching(self, shape, dtype, rng): (isinstance(axis, tuple) and len(axis) == 1) else [None, 'fro', 1, 2, -1, -2, np.inf, -np.inf, 'nuc']) for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testNorm(self, shape, dtype, ord, axis, keepdims, rng): + for rng_factory in [jtu.rand_default])) + def testNorm(self, shape, dtype, ord, axis, keepdims, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) if (ord in ('nuc', 2, -2) and ( jtu.device_under_test() != "cpu" or @@ -384,16 +397,17 @@ def testNorm(self, shape, dtype, ord, axis, keepdims, rng): jtu.format_shape_dtype_string(b + (m, n), dtype), full_matrices, compute_uv), "b": b, "m": m, "n": n, "dtype": dtype, "full_matrices": full_matrices, - "compute_uv": compute_uv, "rng": rng} + "compute_uv": compute_uv, "rng_factory": rng_factory} for b in [(), (3,), (2, 3)] for m in [2, 7, 29, 53] for n in [2, 7, 29, 53] for dtype in float_types + complex_types for full_matrices in [False, True] for compute_uv in [False, True] - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") - def testSVD(self, b, m, n, dtype, full_matrices, compute_uv, rng): + def testSVD(self, b, m, n, dtype, full_matrices, compute_uv, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) if b != () and jax.lib.version <= (0, 1, 28): raise unittest.SkipTest("Batched SVD requires jaxlib 0.1.29") @@ -440,12 +454,13 @@ def norm(x): {"testcase_name": "_shape={}_fullmatrices={}".format( jtu.format_shape_dtype_string(shape, dtype), full_matrices), "shape": shape, "dtype": dtype, "full_matrices": full_matrices, - "rng": rng} + "rng_factory": rng_factory} for shape in [(1, 1), (3, 3), (3, 4), (2, 10, 5), (2, 200, 100)] for dtype in float_types + complex_types for full_matrices in [False, True] - for rng in [jtu.rand_default()])) - def testQr(self, shape, dtype, full_matrices, rng): + for rng_factory in [jtu.rand_default])) + def testQr(self, shape, dtype, full_matrices, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) if (np.issubdtype(dtype, onp.complexfloating) and (jtu.device_under_test() == "tpu" or jax.lib.version <= (0, 1, 27))): @@ -499,11 +514,12 @@ def compare_orthogonal(q1, q2): {"testcase_name": "_shape={}".format( jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype, - "rng": rng} + "rng_factory": rng_factory} for shape in [(10, 4, 5), (5, 3, 3), (7, 6, 4)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testQrBatching(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testQrBatching(self, shape, dtype, rng_factory): + rng = rng_factory() args = rng(shape, np.float32) qs, rs = vmap(jsp.linalg.qr)(args) self.assertTrue(onp.all(onp.linalg.norm(args - onp.matmul(qs, rs)) < 1e-3)) @@ -514,7 +530,7 @@ def testQrBatching(self, shape, dtype, rng): jtu.format_shape_dtype_string(lhs_shape, dtype), jtu.format_shape_dtype_string(rhs_shape, dtype)), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "rng": rng} + "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((1, 1), (1, 1)), ((4, 4), (4,)), @@ -523,8 +539,9 @@ def testQrBatching(self, shape, dtype, rng): ((2, 1, 3, 3), (2, 4, 3, 4)), ] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testSolve(self, lhs_shape, rhs_shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testSolve(self, lhs_shape, rhs_shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] @@ -535,11 +552,12 @@ def testSolve(self, lhs_shape, rhs_shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(1, 1), (4, 4), (2, 5, 5), (200, 200), (5, 5, 5)] for dtype in float_types - for rng in [jtu.rand_default()])) - def testInv(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testInv(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) if jtu.device_under_test() == "gpu" and shape == (200, 200): raise unittest.SkipTest("Test is flaky on GPU") @@ -601,11 +619,12 @@ class ScipyLinalgTest(jtu.JaxTestCase): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(1, 1), (4, 5), (10, 5), (50, 50)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testLu(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testLu(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) args_maker = lambda: [rng(shape, dtype)] x, = args_maker() @@ -621,12 +640,13 @@ def testLuOfSingularMatrix(self): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(1, 1), (4, 5), (10, 5), (10, 10), (6, 7, 7)] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") # TODO(phawkins): precision problems on TPU. - def testLuGrad(self, shape, dtype, rng): + def testLuGrad(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) a = rng(shape, dtype) lu = vmap(jsp.linalg.lu) if len(shape) > 2 else jsp.linalg.lu @@ -635,11 +655,12 @@ def testLuGrad(self, shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), - "shape": shape, "dtype": dtype, "rng": rng} + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} for shape in [(4, 5), (6, 5)] for dtype in [np.float32] - for rng in [jtu.rand_default()])) - def testLuBatching(self, shape, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testLuBatching(self, shape, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) args = [rng(shape, np.float32) for _ in range(10)] expected = list(osp.linalg.lu(x) for x in args) @@ -655,11 +676,12 @@ def testLuBatching(self, shape, dtype, rng): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_n={}".format(jtu.format_shape_dtype_string((n,n), dtype)), - "n": n, "dtype": dtype, "rng": rng} + "n": n, "dtype": dtype, "rng_factory": rng_factory} for n in [1, 4, 5, 200] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testLuFactor(self, n, dtype, rng): + for rng_factory in [jtu.rand_default])) + def testLuFactor(self, n, dtype, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) args_maker = lambda: [rng((n, n), dtype)] @@ -679,7 +701,7 @@ def testLuFactor(self, n, dtype, rng): jtu.format_shape_dtype_string(rhs_shape, dtype), trans), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "trans": trans, "rng": rng} + "trans": trans, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((1, 1), (1, 1)), ((4, 4), (4,)), @@ -687,8 +709,9 @@ def testLuFactor(self, n, dtype, rng): ] for trans in [0, 1, 2] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testLuSolve(self, lhs_shape, rhs_shape, dtype, trans, rng): + for rng_factory in [jtu.rand_default])) + def testLuSolve(self, lhs_shape, rhs_shape, dtype, trans, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) osp_fun = lambda lu, piv, rhs: osp.linalg.lu_solve((lu, piv), rhs, trans=trans) jsp_fun = lambda lu, piv, rhs: jsp.linalg.lu_solve((lu, piv), rhs, trans=trans) @@ -709,7 +732,7 @@ def args_maker(): jtu.format_shape_dtype_string(rhs_shape, dtype), sym_pos, lower), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "sym_pos": sym_pos, "lower": lower, "rng": rng} + "sym_pos": sym_pos, "lower": lower, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ ((1, 1), (1, 1)), ((4, 4), (4,)), @@ -721,8 +744,9 @@ def args_maker(): (True, True), ] for dtype in float_types + complex_types - for rng in [jtu.rand_default()])) - def testSolve(self, lhs_shape, rhs_shape, dtype, sym_pos, lower, rng): + for rng_factory in [jtu.rand_default])) + def testSolve(self, lhs_shape, rhs_shape, dtype, sym_pos, lower, rng_factory): + rng = rng_factory() _skip_if_unsupported_type(dtype) if (sym_pos and np.issubdtype(dtype, onp.complexfloating) and jtu.device_under_test() == "tpu"): @@ -750,7 +774,7 @@ def args_maker(): lower, transpose_a, unit_diagonal), "lower": lower, "transpose_a": transpose_a, "unit_diagonal": unit_diagonal, "lhs_shape": lhs_shape, - "rhs_shape": rhs_shape, "dtype": dtype, "rng": rng} + "rhs_shape": rhs_shape, "dtype": dtype, "rng_factory": rng_factory} for lower in [False, True] for transpose_a in [False, True] for unit_diagonal in [False, True] @@ -760,10 +784,11 @@ def args_maker(): ((2, 8, 8), (2, 8, 10)), ] for dtype in float_types - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) def testSolveTriangular(self, lower, transpose_a, unit_diagonal, lhs_shape, - rhs_shape, dtype, rng): + rhs_shape, dtype, rng_factory): _skip_if_unsupported_type(dtype) + rng = rng_factory() k = rng(lhs_shape, dtype) l = onp.linalg.cholesky(onp.matmul(k, T(k)) + lhs_shape[-1] * onp.eye(lhs_shape[-1])) @@ -798,7 +823,8 @@ def testSolveTriangular(self, lower, transpose_a, unit_diagonal, lhs_shape, lower, transpose_a, conjugate_a, unit_diagonal, left_side), "lower": lower, "transpose_a": transpose_a, "conjugate_a": conjugate_a, "unit_diagonal": unit_diagonal, "left_side": left_side, - "a_shape": a_shape, "b_shape": b_shape, "dtype": dtype, "rng": rng} + "a_shape": a_shape, "b_shape": b_shape, "dtype": dtype, + "rng_factory": rng_factory} for lower in [False, True] for unit_diagonal in [False, True] for dtype in float_types + complex_types @@ -812,12 +838,13 @@ def testSolveTriangular(self, lower, transpose_a, unit_diagonal, lhs_shape, (True, (4, 4), (4, 3)), (True, (2, 8, 8), (2, 8, 10)), ] - for rng in [jtu.rand_default()])) + for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") # TODO(phawkins): Test fails on TPU. def testTriangularSolveGrad( self, lower, transpose_a, conjugate_a, unit_diagonal, left_side, a_shape, - b_shape, dtype, rng): + b_shape, dtype, rng_factory): _skip_if_unsupported_type(dtype) + rng = rng_factory() # Test lax_linalg.triangular_solve instead of scipy.linalg.solve_triangular # because it exposes more options. A = np.tril(rng(a_shape, dtype) + 5 * onp.eye(a_shape[-1], dtype=dtype)) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index a90761bacde4..9da08edd1cb6 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -39,11 +39,11 @@ CombosWithReplacement = itertools.combinations_with_replacement -def genNamedParametersNArgs(n, rng): +def genNamedParametersNArgs(n, rng_factory): return parameterized.named_parameters( jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix("", shapes, dtypes), - "rng": rng, "shapes": shapes, "dtypes": dtypes} + "rng_factory": rng_factory, "shapes": shapes, "dtypes": dtypes} for shapes in CombosWithReplacement(all_shapes, n) for dtypes in CombosWithReplacement(float_dtypes, n))) @@ -51,8 +51,9 @@ def genNamedParametersNArgs(n, rng): class LaxBackedScipyStatsTests(jtu.JaxTestCase): """Tests for LAX-backed scipy.stats implementations""" - @genNamedParametersNArgs(3, jtu.rand_default()) - def testPoissonLogPmf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testPoissonLogPmf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.poisson.logpmf lax_fun = lsp_stats.poisson.logpmf @@ -68,8 +69,9 @@ def args_maker(): tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testBernoulliLogPmf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testBernoulliLogPmf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.bernoulli.logpmf lax_fun = lsp_stats.bernoulli.logpmf @@ -84,8 +86,9 @@ def args_maker(): tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(5, jtu.rand_positive()) - def testBetaLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(5, jtu.rand_positive) + def testBetaLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.beta.logpdf lax_fun = lsp_stats.beta.logpdf @@ -97,8 +100,9 @@ def args_maker(): tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testCauchyLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testCauchyLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.cauchy.logpdf lax_fun = lsp_stats.cauchy.logpdf @@ -111,8 +115,9 @@ def args_maker(): self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(2, jtu.rand_positive()) - def testDirichletLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(2, jtu.rand_positive) + def testDirichletLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.cauchy.logpdf lax_fun = lsp_stats.cauchy.logpdf dim = 4 @@ -126,8 +131,9 @@ def args_maker(): self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_positive()) - def testExponLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_positive) + def testExponLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.expon.logpdf lax_fun = lsp_stats.expon.logpdf @@ -138,8 +144,9 @@ def args_maker(): self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(4, jtu.rand_positive()) - def testGammaLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(4, jtu.rand_positive) + def testGammaLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.gamma.logpdf lax_fun = lsp_stats.gamma.logpdf @@ -151,8 +158,9 @@ def args_maker(): tol=5e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_positive()) - def testLaplaceLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_positive) + def testLaplaceLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.laplace.logpdf lax_fun = lsp_stats.laplace.logpdf @@ -165,8 +173,9 @@ def args_maker(): self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testLaplaceCdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testLaplaceCdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.laplace.cdf lax_fun = lsp_stats.laplace.cdf @@ -180,8 +189,9 @@ def args_maker(): self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) # TODO: currently it ignores the argument "shapes" and only tests dim=4 - @genNamedParametersNArgs(3, jtu.rand_default()) - def testMultivariateNormalLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testMultivariateNormalLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.multivariate_normal.logpdf lax_fun = lsp_stats.multivariate_normal.logpdf dim = 4 @@ -196,8 +206,9 @@ def args_maker(): tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testNormLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testNormLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.norm.logpdf lax_fun = lsp_stats.norm.logpdf @@ -211,8 +222,9 @@ def args_maker(): self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testNormLogCdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testNormLogCdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.norm.logcdf lax_fun = lsp_stats.norm.logcdf @@ -226,8 +238,9 @@ def args_maker(): self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testNormCdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testNormCdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.norm.cdf lax_fun = lsp_stats.norm.cdf @@ -241,8 +254,9 @@ def args_maker(): self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testNormPpf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testNormPpf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.norm.ppf lax_fun = lsp_stats.norm.ppf @@ -258,8 +272,9 @@ def args_maker(): self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(4, jtu.rand_positive()) - def testParetoLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(4, jtu.rand_positive) + def testParetoLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.pareto.logpdf lax_fun = lsp_stats.pareto.logpdf @@ -271,8 +286,9 @@ def args_maker(): self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(4, jtu.rand_default()) - def testTLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(4, jtu.rand_default) + def testTLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.t.logpdf lax_fun = lsp_stats.t.logpdf @@ -286,8 +302,9 @@ def args_maker(): self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default()) - def testUniformLogPdf(self, rng, shapes, dtypes): + @genNamedParametersNArgs(3, jtu.rand_default) + def testUniformLogPdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() scipy_fun = osp_stats.uniform.logpdf lax_fun = lsp_stats.uniform.logpdf From 0fa38eccc0e25deb782c7afd83b42dd9335dd6f7 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 11 Nov 2019 13:04:36 -0800 Subject: [PATCH 0318/1053] use np.matmul and not `@` for py27 --- tests/lax_control_flow_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index a09bd454342d..271ce51f4288 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1368,7 +1368,7 @@ def bad_matvec_usage(a): def testIssue810(self): def loss(A): def step(x, i): - return A @ x, None + return np.matmul(A, x), None init_x = np.zeros(A.shape[-1:]) last_x, _ = lax.scan(step, init_x, np.arange(10)) return np.sum(last_x) From a73979f7989ea0c0791ddacdd70d7240225f7623 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 11 Nov 2019 13:24:24 -0800 Subject: [PATCH 0319/1053] use onp not lnp in module-level scope fixes google import --- tests/lax_numpy_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 91f8a5434418..714c2a4e670f 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -696,9 +696,9 @@ def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): "rng_factory": jtu.rand_default} for shape in all_shapes for dtype in number_dtypes for a_min, a_max in [(-1, None), (None, 1), (-1, 1), - (-lnp.ones(1), None), - (None, lnp.ones(1)), - (-lnp.ones(1), lnp.ones(1))])) + (-onp.ones(1), None), + (None, onp.ones(1)), + (-onp.ones(1), onp.ones(1))])) def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.clip(x, a_min=a_min, a_max=a_max) From 5c41c0a4bcc15877e3ccd5b46758d9c0e9970664 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 11 Nov 2019 13:41:13 -0800 Subject: [PATCH 0320/1053] minor test fixes --- tests/lax_numpy_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 714c2a4e670f..d15c60ae50cf 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -597,7 +597,7 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factor def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] - tol_spec = {onp.float16: 1e-2} + tol_spec = {onp.float16: 1e-2, onp.float32: 1e-5, onp.float64: 1e-14} tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) self._CheckAgainstNumpy(onp.dot, lnp.dot, args_maker, check_dtypes=True, tol=tol) @@ -1975,7 +1975,7 @@ def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng_factory): shape, dtype, rowvar, ddof, bias), "shape": shape, "dtype": dtype, "rowvar": rowvar, "ddof": ddof, "bias": bias, "rng_factory": rng_factory} - for shape in [(5,), (10, 5), (3, 10)] + for shape in [(5,), (10, 5), (5, 10)] for dtype in all_dtypes for rowvar in [True, False] for bias in [True, False] From 5ec07491a110de7c42da313b5623417e6aed0c7d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 9 Nov 2019 17:08:02 -0800 Subject: [PATCH 0321/1053] simplify xla op metadata, DeviceArray repr Just minor cleanup. --- jax/interpreters/xla.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 0f4f9561fb54..726ab3b3ee5f 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -143,31 +143,23 @@ def xla_primitive_callable(prim, *abstract_args, **params): @cache() def primitive_computation(prim, *xla_shapes, **params): - backend = params.get('backend', None) - new_params = {k: params[k] for k in params if k != 'backend'} c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) - newvar = core.gensym('') - c.SetOpMetadata(xc.OpMetadata( - op_type=prim.name, - op_name=str(core.new_jaxpr_eqn( - [newvar() for i in range(len(xla_shapes))], - [newvar()], - prim, (), params)) - )) + c.SetOpMetadata(xc.OpMetadata(op_type=prim.name, op_name=str(params))) + backend = params.pop("backend", None) platform = xb.get_backend(backend).platform xla_args = (_parameter_or_create_token(c, shape) for shape in xla_shapes) if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] - rule(c, *xla_args, **new_params) # return val set as a side-effect on c + rule(c, *xla_args, **params) # return val set as a side-effect on c elif prim in translations: rule = translations[prim] - rule(c, *xla_args, **new_params) # return val set as a side-effect on c + rule(c, *xla_args, **params) # return val set as a side-effect on c elif prim in reduction_translations: rule = reduction_translations[prim] - rule(c, *xla_args, backend=backend, **new_params) # return val set as a side-effect on c + rule(c, *xla_args, backend=backend, **params) # return val set as a side-effect on c elif prim in initial_style_translations: rule = initial_style_translations[prim] - rule(c, AxisEnv(), *xla_args, backend=backend, **new_params) # side-effect on c + rule(c, AxisEnv(), *xla_args, backend=backend, **params) # side-effect on c else: raise NotImplementedError("XLA translation rule for {} not found".format(prim)) c.ClearOpMetadata() @@ -307,10 +299,7 @@ def write(v, node): _map(write, jaxpr.freevars, freevars) _map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: - c.SetOpMetadata(xc.OpMetadata( - op_type=eqn.primitive.name, - op_name=str(eqn) - )) + c.SetOpMetadata(xc.OpMetadata( op_type=eqn.primitive.name, op_name=str(eqn))) in_nodes = list(map(read, eqn.invars)) if eqn.primitive in backend_specific_translations[platform]: rule = backend_specific_translations[platform][eqn.primitive] @@ -432,7 +421,7 @@ def _xla_callable(fun, device, backend, *abstract_args): tuple_args = len(abstract_args) > 100 with core.new_master(pe.JaxprTrace, True) as master: jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) - assert not env # no subtraces here (though cond might eventually need them) + assert not env # no subtraces here axis_env = AxisEnv(jaxpr_replicas(jaxpr), [], []) compiled = _compile_jaxpr(jaxpr, device, backend, axis_env, consts, tuple_args, *abstract_args) @@ -658,7 +647,7 @@ def delete(self): self._npy_value = None def __repr__(self): - return onp.array_repr(self) + return onp.array_repr(self._value) def item(self): if onp.issubdtype(self.dtype, onp.complexfloating): From 46db509b30fe1c3067aa6264526a5e2a3d7f6b9d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 9 Nov 2019 17:08:54 -0800 Subject: [PATCH 0322/1053] rename TestSpec -> CallSpec to avoid warning --- tests/core_test.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/core_test.py b/tests/core_test.py index 4a160136f9b7..c7d0e2b7b5cd 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -106,19 +106,19 @@ def product_io_fun(x, y): R = onp.random.randn -TestSpec = namedtuple('TestSpec', ['fun', 'args']) +CallSpec = namedtuple('CallSpec', ['fun', 'args']) test_specs_base = [ - TestSpec(simple_fun, (R(3, 2), R(3, 2))), - TestSpec(simple_fun_fanout, (R(3, 2), R(3, 2))), - TestSpec(product_io_fun, ({'a': R(2, 2), 'b': R(2, 2)}, + CallSpec(simple_fun, (R(3, 2), R(3, 2))), + CallSpec(simple_fun_fanout, (R(3, 2), R(3, 2))), + CallSpec(product_io_fun, ({'a': R(2, 2), 'b': R(2, 2)}, (R(2, 2), (R(2, 2), R(2, 2))))), - TestSpec(fun_with_call, (R(3, 2),)), - TestSpec(fun_with_two_calls, (R(3, 2),)), - TestSpec(fun_with_call_closure, (R(3, 2),)), - TestSpec(fun_call_jitted, (R(1,),)), - TestSpec(fun_with_nested_calls, (R(),)), - TestSpec(fun_with_nested_calls, (R(3, 2),)), - TestSpec(fun_with_nested_calls_2, (R(1, 2),)), + CallSpec(fun_with_call, (R(3, 2),)), + CallSpec(fun_with_two_calls, (R(3, 2),)), + CallSpec(fun_with_call_closure, (R(3, 2),)), + CallSpec(fun_call_jitted, (R(1,),)), + CallSpec(fun_with_nested_calls, (R(),)), + CallSpec(fun_with_nested_calls, (R(3, 2),)), + CallSpec(fun_with_nested_calls_2, (R(1, 2),)), ] def jvp_unlinearized(f, primals, tangents): @@ -128,10 +128,10 @@ def jvp_unlinearized(f, primals, tangents): test_specs = [] for ts in test_specs_base: test_specs.append(ts) - test_specs.append(TestSpec(partial(jvp, ts.fun), (ts.args, ts.args))) - test_specs.append(TestSpec(jit(ts.fun), ts.args)) - test_specs.append(TestSpec(jit(jit(ts.fun)), ts.args)) - test_specs.append(TestSpec(partial(jvp_unlinearized, ts.fun), + test_specs.append(CallSpec(partial(jvp, ts.fun), (ts.args, ts.args))) + test_specs.append(CallSpec(jit(ts.fun), ts.args)) + test_specs.append(CallSpec(jit(jit(ts.fun)), ts.args)) + test_specs.append(CallSpec(partial(jvp_unlinearized, ts.fun), (ts.args, ts.args))) From 4aaf325d3a16a12d3db5f84af51103e4f07a3374 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 11 Nov 2019 07:02:36 -0800 Subject: [PATCH 0323/1053] simplify [p]xla.py by in-lining single-caller function The functions xla._compile_jaxpr and pxla.compile_replicated only had one caller each. The logic was confusing, and they had grown many arguments (and needed more!). By in-lining them we got a few other cleanups: - remove _parameter_or_create_token in favor of a common xla._xla_callable_args - fix a bug in the interaction between token inputs and arg tupling - finally plumb the user function name through to XLA metadata (!!) --- jax/interpreters/pxla.py | 111 ++++++++++++++++++--------------------- jax/interpreters/xla.py | 110 ++++++++++++++------------------------ tests/pmap_test.py | 17 ++---- 3 files changed, 95 insertions(+), 143 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 5352241e6715..c87de5681afb 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -31,7 +31,7 @@ from .. import linear_util as lu from ..abstract_arrays import (ConcreteArray, ShapedArray, array_types, raise_to_shaped) -from ..util import partial, unzip2, concatenate, prod +from ..util import partial, unzip2, concatenate, prod, safe_map from ..lib import xla_bridge as xb from .xla import aval_to_xla_shape, xla_destructure from .partial_eval import trace_to_subjaxpr, merge_pvals, JaxprTrace, PartialVal @@ -41,6 +41,8 @@ from . import xla from . import ad +_map = safe_map + ### util @@ -174,50 +176,6 @@ def replica_groups(nrep, mesh_spec, mesh_axes): return tuple(map(tuple, groups.T)) -### the main pmap machinery lowers SPMD jaxprs to multi-replica XLA computations - -def compile_replicated(jaxpr, backend, axis_name, axis_size, global_axis_size, - devices, consts, tuple_args, *abstract_args): - jaxpr_replicas = xla.jaxpr_replicas(jaxpr) - num_local_replicas = axis_size * jaxpr_replicas - num_replicas = global_axis_size * jaxpr_replicas - logging.vlog( - 1, "compile_replicated: axis_size=%d global_axis_size=%d jaxpr_replicas=%d" - % (axis_size, global_axis_size, jaxpr_replicas)) - - if devices is None: - if num_replicas > xb.device_count(backend): - msg = ("compiling computation that requires {} replicas, but only {} XLA " - "devices are available") - raise ValueError(msg.format(num_replicas, xb.device_count(backend))) - device_assignment = None - else: - assert any(d.host_id == xb.host_id() for d in devices) - local_devices = [d for d in devices if d.host_id == xb.host_id()] - assert len(local_devices) > 0 - if num_local_replicas != len(local_devices): - local_devices_str = ", ".join(map(str, local_devices)) - raise ValueError( - "Leading axis size of input to pmapped function must equal the " - "number of local devices passed to pmap. Got axis_size=%d, " - "num_local_devices=%d.\n(Local devices passed to pmap: %s)" - % (axis_size, len(local_devices), local_devices_str)) - if num_replicas != len(devices): - raise ValueError("compiling computation that requires %s replicas, " - "but %s devices were specified" - % (num_replicas, len(devices))) - device_assignment = tuple(d.id for d in devices) - - axis_env = xla.AxisEnv(num_replicas, [axis_name], [global_axis_size], devices) - arg_shapes = list(map(aval_to_xla_shape, abstract_args)) - built_c = xla.jaxpr_computation(jaxpr, backend, axis_env, consts, (), arg_shapes, - tuple_args=tuple_args, inner=False) - compiled = built_c.Compile( - compile_options=xb.get_compile_options(num_replicas, device_assignment), - backend=xb.get_backend(backend)) - return compiled, num_local_replicas - - ### applying parallel primitives in op-by-op Python dispatch # There are at least two cases where we might want to evaluate a parallel @@ -460,10 +418,6 @@ def parallel_callable(fun, backend, axis_name, axis_size, devices, *avals): if devices is not None and len(devices) == 0: raise ValueError("'devices' argument to pmap must be non-empty, or None.") - avals = tuple(map(partial(shard_aval, axis_size), avals)) - pvals = [PartialVal((aval, core.unit)) for aval in avals] - pval = PartialVal([core.abstract_unit, core.unit]) # dummy value - if devices: global_axis_size = len(devices) elif xb.host_count() > 1: @@ -484,6 +438,9 @@ def dynamic_fun(dummy, *args): with extend_dynamic_axis_env(axis_name, dummy.trace, global_axis_size): return fun.call_wrapped(*args) + avals = tuple(map(partial(shard_aval, axis_size), avals)) + pvals = [PartialVal((aval, core.unit)) for aval in avals] + pval = PartialVal([core.abstract_unit, core.unit]) # dummy value for axis env with core.new_master(JaxprTrace, True) as master: jaxpr, (out_pvals, consts, env) = \ trace_to_subjaxpr(dynamic_fun, master, False).call_wrapped([pval] + pvals) @@ -491,6 +448,7 @@ def dynamic_fun(dummy, *args): assert not env del master out_pvs, out_consts = unzip2(out_pvals) + if all(pv is None for pv in out_pvs): # When the output doesn't depend on the input we don't need to compile an # XLA computation at all; we handle this as a special case so we can stage @@ -499,18 +457,51 @@ def dynamic_fun(dummy, *args): handlers = [_pval_to_result_handler(axis_size, None, pval) for pval in out_pvals] results = [handler(None) for handler in handlers] return lambda *_: results + + jaxpr_replicas = xla.jaxpr_replicas(jaxpr) + num_local_replicas = axis_size * jaxpr_replicas + nrep = global_axis_size * jaxpr_replicas + axis_env = xla.AxisEnv(nrep, [axis_name], [global_axis_size], devices) + + tuple_args = len(avals) > 100 # pass long arg lists as tuple for TPU + + c = xb.make_computation_builder("pmap_{}".format(fun.__name__)) + xla_consts = _map(c.Constant, consts) + xla_args = xla._xla_callable_args(c, avals, tuple_args) + out_nodes = xla.jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, (), *xla_args) + built = c.Build(c.Tuple(*out_nodes)) + + if devices is None: + if nrep > xb.device_count(backend): + msg = ("compiling computation that requires {} replicas, but only {} XLA " + "devices are available") + raise ValueError(msg.format(nrep, xb.device_count(backend))) + device_assignment = None else: - # Condense many arguments into single tuple argument to avoid a TPU issue. - tuple_args = len(avals) > 100 - compiled, nrep = compile_replicated(jaxpr, backend, axis_name, axis_size, - global_axis_size, devices, consts, - tuple_args, *avals) - local_devices = compiled.local_devices() - assignments = assign_shards_to_replicas(nrep, axis_size) - handle_args = partial(shard_args, backend, local_devices, assignments, - axis_size, tuple_args) - handle_outs = _pvals_to_results_handler(axis_size, nrep, out_pvals) - return partial(execute_replicated, compiled, backend, nrep, handle_args, handle_outs) + assert any(d.host_id == xb.host_id() for d in devices) + local_devices = [d for d in devices if d.host_id == xb.host_id()] + assert len(local_devices) > 0 + if num_local_replicas != len(local_devices): + local_devices_str = ", ".join(map(str, local_devices)) + raise ValueError( + "Leading axis size of input to pmapped function must equal the " + "number of local devices passed to pmap. Got axis_size=%d, " + "num_local_devices=%d.\n(Local devices passed to pmap: %s)" + % (axis_size, len(local_devices), local_devices_str)) + if nrep != len(devices): + raise ValueError("compiling computation that requires %s replicas, " + "but %s devices were specified" + % (nrep, len(devices))) + device_assignment = tuple(d.id for d in devices) + compiled = built.Compile( + compile_options=xb.get_compile_options(nrep, device_assignment), + backend=xb.get_backend(backend)) + + handle_args = partial(shard_args, backend, compiled.local_devices(), + assign_shards_to_replicas(nrep, axis_size), + axis_size, tuple_args) + handle_outs = _pvals_to_results_handler(axis_size, nrep, out_pvals) + return partial(execute_replicated, compiled, backend, nrep, handle_args, handle_outs) def _pvals_to_results_handler(size, nrep, out_pvals): nouts = len(out_pvals) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 726ab3b3ee5f..83cbb9bf9699 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -147,7 +147,7 @@ def primitive_computation(prim, *xla_shapes, **params): c.SetOpMetadata(xc.OpMetadata(op_type=prim.name, op_name=str(params))) backend = params.pop("backend", None) platform = xb.get_backend(backend).platform - xla_args = (_parameter_or_create_token(c, shape) for shape in xla_shapes) + xla_args = _map(c.ParameterWithShape, xla_shapes) if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] rule(c, *xla_args, **params) # return val set as a side-effect on c @@ -198,26 +198,6 @@ def _check_nans(name, xla_shape, buf): ### compiling jaxprs -def _compile_jaxpr(jaxpr, device, backend, axis_env, const_vals, tuple_args, - *abstract_args): - if axis_env.nreps > xb.device_count(backend): - msg = ("compiling computation that requires {} replicas, but only {} XLA " - "devices are available") - raise ValueError(msg.format(axis_env.nreps, xb.device_count(backend))) - arg_shapes = tuple(map(aval_to_xla_shape, abstract_args)) - built_c = jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes, - tuple_args=tuple_args, inner=False) - device_assignment = (device.id,) if device else None - compile_opts = xb.get_compile_options(num_replicas=axis_env.nreps, - device_assignment=device_assignment) - return built_c.Compile(compile_options=compile_opts, - backend=xb.get_backend(backend)) - -def build_jaxpr(jaxpr, backend, axis_env, const_vals, tuple_args, *abstract_args): - arg_shapes = map(aval_to_xla_shape, abstract_args) - return jaxpr_computation(jaxpr, backend, axis_env, const_vals, (), arg_shapes, - tuple_args=tuple_args, inner=False) - def prefetch(x): if isinstance(x, DeviceArray): x.copy_to_host_async() @@ -241,45 +221,6 @@ def eqn_literals(eqn): if type(v) is core.Literal: yield v.val -def _parameter_or_create_token(c, shape): - # XLA does not allow token values to be passed as parameters to top-level - # computations, but in JAX that's a reasonable and expected thing to do. - # It should not matter where you put `jit` or if you omit it entirely. - # When calling into an "outermost" computation, we pass JAX Token objects by - # calling CreateToken() to make an XLA token that stands in for the JAX token. - # The manufactured tokens correspond one-to-one with parameters. - # Similarly when returning a token to JAX, we ignore what XLA gives us and - # manufacture a Token object. - if shape.xla_element_type() == xc.PrimitiveType.TOKEN: - return c.CreateToken() - else: - return c.ParameterWithShape(shape) - -def jaxpr_computation(jaxpr, backend, axis_env, const_vals, freevar_shapes, - arg_shapes, tuple_args=False, inner=False): - # If inner is True, tokens can be passed as parameters; if inner is False, - # token parameters become CreateToken instructions. - c = xb.make_computation_builder("jaxpr_computation") # TODO(mattjj): name - _map(prefetch, it.chain(const_vals, jaxpr_literals(jaxpr))) - consts = _map(c.Constant, const_vals) - if tuple_args: - freevar_shapes = list(freevar_shapes) - arg_shapes = list(arg_shapes) - tuple_shape = xc.Shape.tuple_shape( - [s for s in it.chain(freevar_shapes, arg_shapes) - if s.xla_element_type() != xc.PrimitiveType.TOKEN]) - tuple_arg = c.ParameterWithShape(tuple_shape) - nfreevars, nargs = len(freevar_shapes), len(arg_shapes) - freevars = [c.GetTupleElement(tuple_arg, i) for i in range(nfreevars)] - args = [c.GetTupleElement(tuple_arg, i + nfreevars) for i in range(nargs)] - else: - make_parameter = (c.ParameterWithShape if inner - else partial(_parameter_or_create_token, c)) - freevars = _map(make_parameter, freevar_shapes) - args = _map(make_parameter, arg_shapes) - out_nodes = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, freevars, *args) - return c.Build(c.Tuple(*out_nodes)) - def jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, freevars, *args): platform = xb.get_backend(backend).platform @@ -417,21 +358,51 @@ def _xla_callable(fun, device, backend, *abstract_args): if FLAGS.jax_log_compiles: print("Compiling {} for args {}.".format(fun.__name__, abstract_args)) pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] - # Condense many arguments into single tuple argument to avoid a TPU issue. - tuple_args = len(abstract_args) > 100 with core.new_master(pe.JaxprTrace, True) as master: jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) assert not env # no subtraces here - axis_env = AxisEnv(jaxpr_replicas(jaxpr), [], []) - compiled = _compile_jaxpr(jaxpr, device, backend, axis_env, consts, - tuple_args, *abstract_args) - del master, consts, jaxpr, env + del master, env + _map(prefetch, it.chain(consts, jaxpr_literals(jaxpr))) + + nreps = jaxpr_replicas(jaxpr) + if nreps > xb.device_count(backend): + msg = ("compiling computation that requires {} replicas, but only {} XLA " + "devices are available") + raise ValueError(msg.format(num_replicas, xb.device_count(backend))) + axis_env = AxisEnv(nreps, [], []) + + tuple_args = len(abstract_args) > 100 # pass long arg lists as tuple for TPU + + c = xb.make_computation_builder("jit_{}".format(fun.__name__)) + xla_consts = _map(c.Constant, consts) + xla_args = _xla_callable_args(c, abstract_args, tuple_args) + out_nodes = jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, (), *xla_args) + built = c.Build(c.Tuple(*out_nodes)) + + options = xb.get_compile_options( + num_replicas=nreps, device_assignment=(device.id,) if device else None) + compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) + result_handlers = tuple(map(_pval_to_result_handler, pvals)) if axis_env.nreps == 1: return partial(_execute_compiled, compiled, backend, result_handlers, tuple_args) else: return partial(_execute_replicated, compiled, backend, result_handlers, tuple_args) +def _xla_callable_args(c, avals, tuple_args): + if not tuple_args: + xla_args = [c.ParameterWithShape(aval_to_xla_shape(a)) + if a is not abstract_token else c.CreateToken() for a in avals] + return xla_args + else: + tuple_param = c.ParameterWithShape(xc.Shape.tuple_shape( + [aval_to_xla_shape(a) for a in avals if a is not abstract_token])) + xla_inputs = iter(xla_destructure(c, tuple_param)) + xla_args = [next(xla_inputs) if a is not abstract_token else c.CreateToken() + for a in avals] + assert next(xla_inputs, None) is None + return xla_args + def _pval_to_result_handler(pval): pv, const = pval if pv is None: @@ -517,8 +488,7 @@ def add_jaxvals_translation_rule(c, x, y): def lower_fun(fun, instantiate=False, initial_style=False): """Build a translation rule for a traceable function.""" def f(c, *args, **params): - backend = params.get('backend', None) - new_params = {k: params[k] for k in params if k != 'backend'} + backend = params.pop('backend', None) if initial_style: axis_env, xla_args = args[0], args[1:] else: @@ -527,7 +497,7 @@ def f(c, *args, **params): avals = map(_aval_from_xla_shape, xla_shapes) pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( - lu.wrap_init(fun, new_params), pvals, instantiate=True) + lu.wrap_init(fun, params), pvals, instantiate=True) built_c = jaxpr_computation(jaxpr, backend, axis_env, consts, (), xla_shapes, inner=True) return c.Call(built_c, xla_args) @@ -549,7 +519,7 @@ class Token(object): pass core.pytype_aval_mappings[Token] = lambda _: abstract_token xla_shape_handlers[AbstractToken] = lambda _: xc.Shape.token_shape() xla_result_handlers[AbstractToken] = lambda _: lambda _: token -canonicalize_dtype_handlers[Token] = lambda x: x +canonicalize_dtype_handlers[Token] = identity class DeviceValue(object): diff --git a/tests/pmap_test.py b/tests/pmap_test.py index e7b19fd6aab8..10339f93a8f8 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -426,24 +426,15 @@ def testDeviceCountError(self): f = pmap(lambda x: x) x = np.arange(device_count + 1) - self.assertRaisesRegexp( - ValueError, - ".*requires.*replicas", - lambda: f(x)) + self.assertRaisesRegex(ValueError, ".*requires.*replicas", lambda: f(x)) f = pmap(lambda x: x) x = onp.ones((device_count + 1, 10)) - self.assertRaisesRegexp( - ValueError, - ".*requires.*replicas", - lambda: f(x)) + self.assertRaisesRegex(ValueError, ".*requires.*replicas", lambda: f(x)) f = pmap(lambda x: pmap(lambda x: x)(x)) x = onp.ones((device_count, 2, 10)) - self.assertRaisesRegexp( - ValueError, - ".*requires.*replicas", - lambda: f(x)) + self.assertRaisesRegex(ValueError, ".*requires.*replicas", lambda: f(x)) def testPmapConstant(self): device_count = xla_bridge.device_count() @@ -627,7 +618,7 @@ def testSoftPmapDevicePersistence(self): z = x + 2 self.assertIsInstance(z, xla.DeviceArray) # should have forced collection x._npy_value = onp.float32(onp.nan) # can't be coerced to ndarray for xfer - self.assertRaisesRegexp( + self.assertRaisesRegex( RuntimeError, '.*does not match host shape or layout of computation parameter 0.*', lambda: x + 2) From 6f47ac007f9358bcea7ff1cde3c1ad457a55475c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 11 Nov 2019 15:07:46 -0800 Subject: [PATCH 0324/1053] fix xla.lower_fun and jax.xla_computation --- jax/api.py | 22 ++++++++++++---------- jax/interpreters/xla.py | 6 +++--- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/jax/api.py b/jax/api.py index 6dd64aef6913..b74c2873fb09 100644 --- a/jax/api.py +++ b/jax/api.py @@ -51,8 +51,8 @@ _replace_nones) from .util import (unzip2, unzip3, curry, partial, safe_map, safe_zip, WrapHashably, Hashable, prod, split_list) -from .lib.xla_bridge import (canonicalize_dtype, device_count, - local_device_count, devices, local_devices, +from .lib import xla_bridge as xb +from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, host_id, host_ids, host_count) from .abstract_arrays import ShapedArray, raise_to_shaped from .interpreters import partial_eval as pe @@ -276,10 +276,7 @@ def xla_computation(fun, static_argnums=(), axis_env=None, backend=None, } """ _check_callable(fun) - - def pv_like(x): - aval = xla.abstractify(x) - return pe.PartialVal((aval, core.unit)) + fun_name = getattr(fun, '__name__', 'unknown') def make_axis_env(nreps): if axis_env is None: @@ -294,11 +291,16 @@ def computation_maker(*args, **kwargs): wrapped = lu.wrap_init(fun) jax_args, in_tree = tree_flatten((args, kwargs)) jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) - pvals = map(pv_like, jax_args) + avals = map(xla.abstractify, jax_args) + pvals = [pe.PartialVal((aval, core.unit)) for aval in avals] jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) axis_env_ = make_axis_env(xla.jaxpr_replicas(jaxpr)) - return xla.build_jaxpr(jaxpr, backend, axis_env_, consts, tuple_args, - *map(xla.abstractify, jax_args)) + c = xb.make_computation_builder('xla_computation_{}'.format(fun_name)) + xla_consts = map(c.Constant, consts) + xla_args = xla._xla_callable_args(c, avals, tuple_args) + outs = xla.jaxpr_subcomp(c, jaxpr, backend, axis_env_, xla_consts, (), + *xla_args) + return c.Build(c.Tuple(*outs)) return computation_maker def grad(fun, argnums=0, has_aux=False, holomorphic=False): @@ -558,7 +560,7 @@ def _split(x, indices, axis): return x.split(indices, axis) def _dtype(x): - return canonicalize_dtype(onp.result_type(x)) + return xb.canonicalize_dtype(onp.result_type(x)) def vmap(fun, in_axes=0, out_axes=0): diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 83cbb9bf9699..7bea275e2c8f 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -498,9 +498,9 @@ def f(c, *args, **params): pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, params), pvals, instantiate=True) - built_c = jaxpr_computation(jaxpr, backend, axis_env, consts, (), - xla_shapes, inner=True) - return c.Call(built_c, xla_args) + consts = _map(c.Constant, consts) + outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, (), *xla_args) + return c.Tuple(*outs) return f def _aval_from_xla_shape(xla_shape): From d77cf175a9cbcbed54cb1e63d049dbb42348cf0c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 11 Nov 2019 15:17:11 -0800 Subject: [PATCH 0325/1053] add missing attribute in optix (for google tests) --- jax/experimental/optix.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index cbf0450f53ab..2b98a0afb693 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -85,6 +85,7 @@ def update_fn(updates, state): def global_norm(items): return jnp.sqrt(jnp.sum([jnp.sum(x**2) for x in tree_leaves(items)])) +_global_norm = global_norm # TODO(mtthss): remove when google code updated def clip_by_global_norm(max_norm): From 032873047a2788fe30703e8ad86162b69e4e5490 Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Sat, 9 Nov 2019 00:16:18 -0800 Subject: [PATCH 0326/1053] linspace, logspace, geomspace jittable and differentiable in start and stop args --- jax/numpy/lax_numpy.py | 63 ++++++++++++---- tests/lax_numpy_test.py | 161 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+), 14 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index f46655f73e23..72d2ad121cb2 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1677,6 +1677,7 @@ def arange(start, stop=None, step=None, dtype=None): # Fall back to instantiating an ndarray in host memory return onp.arange(start, stop=stop, step=step, dtype=dtype) + def _wrap_numpy_nullary_function(f): """Adapts `f` to return a DeviceArray instead of an onp.ndarray. @@ -1687,24 +1688,58 @@ def wrapper(*args, **kwargs): return asarray(f(*args, **kwargs)) return wrapper + +@_wraps(onp.linspace) def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0): + """Implementation of linspace differentiable in start and stop args.""" lax._check_user_dtype_supported(dtype, "linspace") - try: - out = onp.linspace(start, stop, num, endpoint, retstep, dtype, axis) - if retstep: - return asarray(out[0]), out[1] - else: - return asarray(out) - except TypeError: # Old versions of onp may lack axis arg. - out = onp.linspace(start, stop, num, endpoint, retstep, dtype) - if retstep: - return moveaxis(asarray(out[0]), 0, axis), out[1] - else: - return moveaxis(asarray(out), 0, axis) + dtype = dtype or onp.result_type(start, stop, float(num)) + bounds_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) + broadcast_start = broadcast_to(start, bounds_shape) + axis = len(bounds_shape) + axis + 1 if axis < 0 else axis + bounds_shape.insert(axis, 1) + iota_shape = [1,] * len(bounds_shape) + iota_shape[axis] = num + if endpoint: + delta = (stop - start) / (num - 1) + else: + delta = (stop - start) / num + out = (reshape(broadcast_start, bounds_shape) + + reshape(lax.iota(dtype, num), iota_shape) * + reshape(delta, bounds_shape)) + if retstep: + return lax.convert_element_type(out, dtype), delta + else: + return lax.convert_element_type(out, dtype) + + +@_wraps(onp.logspace) +def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): + """Implementation of logspace differentiable in start and stop args.""" + lin = linspace(start, stop, num, + endpoint=endpoint, retstep=False, dtype=None, axis=axis) + if dtype is None: + return power(base, lin) + else: + return lax.convert_element_type(power(base, lin), dtype) + + +@_wraps(onp.geomspace) +def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): + """Implementation of geomspace differentiable in start and stop args.""" + dtype = dtype or onp.result_type(start, stop, float(num), + zeros((), dtype)) + # follow the numpy geomspace convention for negative and complex endpoints + signflip = 1 - (1 - sign(real(start))) * (1 - sign(real(stop))) // 2 + res = signflip * logspace(log10(signflip * start), + log10(signflip * stop), num, + endpoint=endpoint, base=10.0, + dtype=dtype, axis=0) + if axis != 0: + res = moveaxis(res, 0, axis) + return lax.convert_element_type(res, dtype) -logspace = _wrap_numpy_nullary_function(onp.logspace) -geomspace = _wrap_numpy_nullary_function(onp.geomspace) @_wraps(onp.meshgrid) def meshgrid(*args, **kwargs): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index d15c60ae50cf..620d1ce68c96 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2034,6 +2034,167 @@ def testMeshGrid(self, shapes, dtype, indexing, sparse, rng_factory): lnp_fun = partial(lnp.meshgrid, indexing=indexing, sparse=sparse) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + def assertDowncastDtypeEqual(self, x, y): + """Heuristic for comparing numpy and jax downcast dtypes.""" + x_dt = jtu._dtype(x) + y_dt = jtu._dtype(y) + testing_tpu = jtu.device_under_test().startswith("tpu") + testing_x32 = not jax.config.read('jax_enable_x64') + to32dtype = {onp.int64: onp.int32, onp.uint64: onp.uint32, + onp.float64: onp.float32, onp.float128: onp.float32, + onp.complex128: onp.complex64, onp.complex256: onp.complex64} + to32dtype = {onp.dtype(k): onp.dtype(v) for k,v in to32dtype.items()} + if testing_tpu or testing_x32: + x_dt = to32dtype.get(x_dt, x_dt) + y_dt = to32dtype.get(y_dt, y_dt) + assert x_dt == y_dt, "truncated dtypes %s != %s" % (x_dt, y_dt) + + @parameterized.named_parameters( + jtu.cases_from_list( + {"testcase_name": ("_start_shape={}_stop_shape={}_num={}_endpoint={}" + "_retstep={}_dtype={}").format( + start_shape, stop_shape, num, endpoint, retstep, dtype), + "start_shape": start_shape, "stop_shape": stop_shape, + "num": num, "endpoint": endpoint, "retstep": retstep, + "dtype": dtype, "rng_factory": rng_factory} + for start_shape in [(), (2,), (2, 2)] + for stop_shape in [(), (2,), (2, 2)] + for num in [5, 20] + for endpoint in [True, False] + for retstep in [True, False] + for dtype in number_dtypes + [None,] + for rng_factory in [jtu.rand_default])) + def testLinspace(self, start_shape, stop_shape, num, endpoint, + retstep, dtype, rng_factory): + rng = rng_factory() + # relax default tolerances slightly + tol = tolerance(dtype if dtype else onp.float32) * 10 + args_maker = self._GetArgsMaker(rng, + [start_shape, stop_shape], + [dtype, dtype]) + start, stop = args_maker() + ndim = len(onp.shape(start + stop)) + for axis in range(-ndim, ndim): + lnp_op = lambda start, stop: lnp.linspace( + start, stop, num, + endpoint=endpoint, retstep=retstep, dtype=dtype, axis=axis) + onp_op = lambda start, stop: onp.linspace( + start, stop, num, + endpoint=endpoint, retstep=retstep, dtype=dtype, axis=axis) + self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, + check_dtypes=False, tol=tol) + # Check dtype equivalence within expected 32bit downcasting. + a, b = lnp_op(start, stop), onp_op(start, stop) + if retstep: + self.assertDowncastDtypeEqual(a[0], b[0]) + self.assertDowncastDtypeEqual(a[1], b[1]) + else: + self.assertDowncastDtypeEqual(a, b) + # floating-point compute between jitted platforms and non-jit + rounding + # cause unavoidable variation in integer truncation for some inputs. + if dtype in (inexact_dtypes + [None,]): + self._CompileAndCheck(lnp_op, args_maker, + check_dtypes=False, atol=tol, rtol=tol) + + @parameterized.named_parameters( + jtu.cases_from_list( + {"testcase_name": ("_start_shape={}_stop_shape={}_num={}_endpoint={}" + "_base={}_dtype={}").format( + start_shape, stop_shape, num, endpoint, base, dtype), + "start_shape": start_shape, + "stop_shape": stop_shape, + "num": num, "endpoint": endpoint, "base": base, + "dtype": dtype, "rng_factory": rng_factory} + for start_shape in [(), (2,), (2, 2)] + for stop_shape in [(), (2,), (2, 2)] + for num in [5, 20] + for endpoint in [True, False] + for base in [10.0, 2, onp.e] + for dtype in number_dtypes + [None,] + for rng_factory in [jtu.rand_default])) + def testLogspace(self, start_shape, stop_shape, num, + endpoint, base, dtype, rng_factory): + if (dtype in int_dtypes and + jtu.device_under_test() == "gpu" and + not FLAGS.jax_enable_x64): + raise unittest.SkipTest("GPUx32 truncated exponentiation" + " doesn't exactly match other platforms.") + rng = rng_factory() + # relax default tolerances slightly + tol = tolerance(dtype if dtype else onp.float32) * 10 + args_maker = self._GetArgsMaker(rng, + [start_shape, stop_shape], + [dtype, dtype]) + start, stop = args_maker() + ndim = len(onp.shape(start + stop)) + for axis in range(-ndim, ndim): + lnp_op = lambda start, stop: lnp.logspace( + start, stop, num, endpoint=endpoint, base=base, dtype=dtype, axis=axis) + onp_op = lambda start, stop: onp.logspace( + start, stop, num, endpoint=endpoint, base=base, dtype=dtype, axis=axis) + self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, + check_dtypes=False, tol=tol) + # Check dtype equivalence within expected 32bit downcasting. + a, b = lnp_op(start, stop), onp_op(start, stop) + self.assertDowncastDtypeEqual(a, b) + if dtype in (inexact_dtypes + [None,]): + # Why do compiled and op-by-op float16 np.power numbers differ + # slightly more than expected? + atol = tol if dtype != onp.float16 else 10 * tol + self._CompileAndCheck(lnp_op, args_maker, + check_dtypes=False, atol=atol, rtol=tol) + + @parameterized.named_parameters( + jtu.cases_from_list( + {"testcase_name": ("_start_shape={}_stop_shape={}_num={}_endpoint={}" + "_dtype={}").format( + start_shape, stop_shape, num, endpoint, dtype), + "start_shape": start_shape, + "stop_shape": stop_shape, + "num": num, "endpoint": endpoint, + "dtype": dtype, "rng_factory": rng_factory} + for start_shape in [(), (2,), (2, 2)] + for stop_shape in [(), (2,), (2, 2)] + for num in [5, 20] + for endpoint in [True, False] + # NB: numpy's geomspace gives nonsense results on integer types + for dtype in inexact_dtypes + [None,] + for rng_factory in [jtu.rand_default])) + def testGeomspace(self, start_shape, stop_shape, num, + endpoint, dtype, rng_factory): + rng = rng_factory() + # relax default tolerances slightly + tol = tolerance(dtype if dtype else onp.float32) * 10 + def args_maker(): + """Test the set of inputs onp.geomspace is well-defined on.""" + start, stop = self._GetArgsMaker(rng, + [start_shape, stop_shape], + [dtype, dtype])() + # onp.geomspace can't handle differently ranked tensors + # w. negative numbers! + start, stop = lnp.broadcast_arrays(start, stop) + if dtype in complex_dtypes: + return start, stop + # to avoid NaNs, non-complex start and stop cannot + # differ in sign, elementwise + start = start * lnp.sign(start) * lnp.sign(stop) + return start, stop + start, stop = args_maker() + ndim = len(onp.shape(start + stop)) + for axis in range(-ndim, ndim): + lnp_op = lambda start, stop: lnp.geomspace( + start, stop, num, endpoint=endpoint, dtype=dtype, axis=axis) + onp_op = lambda start, stop: onp.geomspace( + start, stop, num, endpoint=endpoint, dtype=dtype, axis=axis) + self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, + check_dtypes=False, tol=tol) + # Check dtype equivalence within expected 32bit downcasting. + a, b = lnp_op(start, stop), onp_op(start, stop) + self.assertDowncastDtypeEqual(a, b) + if dtype in (inexact_dtypes + [None,]): + self._CompileAndCheck(lnp_op, args_maker, + check_dtypes=False, atol=tol, rtol=tol) + def testDisableNumpyRankPromotionBroadcasting(self): try: prev_flag = FLAGS.jax_numpy_rank_promotion From 3d4bb775a53dbf0a38d0f2331028654de801a92d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 11 Nov 2019 20:11:28 -0500 Subject: [PATCH 0327/1053] Update jaxlib version in README.md. (#1669) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53d7a77a4139..dae30af0ec70 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.31-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.32-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From c4101c562739d87334632e1bd8d08f40e9c768f4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 12 Nov 2019 06:18:43 -0800 Subject: [PATCH 0328/1053] fix DeviceArray repr (for google internal test) --- jax/interpreters/xla.py | 5 ++++- tests/api_test.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 726ab3b3ee5f..ca4ca2e99cce 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -647,7 +647,10 @@ def delete(self): self._npy_value = None def __repr__(self): - return onp.array_repr(self._value) + # TODO(mattjj): consider implementing array_repr ourselves + s = onp.array_repr(self._value) + assert s.startswith('array(') + return 'DeviceArray(' + s[6:] def item(self): if onp.issubdtype(self.dtype, onp.complexfloating): diff --git a/tests/api_test.py b/tests/api_test.py index 071faa58f1fe..3eb43ea31572 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1224,6 +1224,9 @@ def f(x): python_should_be_executing = False api.pmap(f, 'i')(x) + def test_repr(self): + rep = repr(np.ones(()) + 1.) + self.assertStartsWith(rep, 'DeviceArray') if __name__ == '__main__': absltest.main() From 938eb20ba11b48ec7a995e985492b0383fc35c65 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 12 Nov 2019 06:55:01 -0800 Subject: [PATCH 0329/1053] improve DeviceArray.__repr__ with onp.array2string --- jax/interpreters/xla.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index ca4ca2e99cce..52b1f8007b69 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -647,10 +647,8 @@ def delete(self): self._npy_value = None def __repr__(self): - # TODO(mattjj): consider implementing array_repr ourselves - s = onp.array_repr(self._value) - assert s.startswith('array(') - return 'DeviceArray(' + s[6:] + s = onp.array2string(self._value, prefix='DeviceArray(', suffix=')') + return "DeviceArray({})".format(s) def item(self): if onp.issubdtype(self.dtype, onp.complexfloating): From 0d053f0e5b477d965bcb091345fbdc895dc1fff6 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 12 Nov 2019 07:44:53 -0800 Subject: [PATCH 0330/1053] temporarily revert #1658 due to TFP test failures This commit unfortunately un-fixes #1571, but only until we sort out why a TF Probvability test started failing. --- jax/numpy/lax_numpy.py | 112 +++++++++++++++++++++++----------------- tests/lax_numpy_test.py | 9 ++++ 2 files changed, 75 insertions(+), 46 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 72d2ad121cb2..927819157d30 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1689,56 +1689,76 @@ def wrapper(*args, **kwargs): return wrapper -@_wraps(onp.linspace) +# TODO(mattjj,levskaya): use this version when we sort out test failure +# @_wraps(onp.linspace) +# def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, +# axis=0): +# """Implementation of linspace differentiable in start and stop args.""" +# lax._check_user_dtype_supported(dtype, "linspace") +# dtype = dtype or onp.result_type(start, stop, float(num)) +# bounds_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) +# broadcast_start = broadcast_to(start, bounds_shape) +# axis = len(bounds_shape) + axis + 1 if axis < 0 else axis +# bounds_shape.insert(axis, 1) +# iota_shape = [1,] * len(bounds_shape) +# iota_shape[axis] = num +# if endpoint: +# delta = (stop - start) / (num - 1) +# else: +# delta = (stop - start) / num +# out = (reshape(broadcast_start, bounds_shape) + +# reshape(lax.iota(dtype, num), iota_shape) * +# reshape(delta, bounds_shape)) +# if retstep: +# return lax.convert_element_type(out, dtype), delta +# else: +# return lax.convert_element_type(out, dtype) +# +# +# @_wraps(onp.logspace) +# def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): +# """Implementation of logspace differentiable in start and stop args.""" +# lin = linspace(start, stop, num, +# endpoint=endpoint, retstep=False, dtype=None, axis=axis) +# if dtype is None: +# return power(base, lin) +# else: +# return lax.convert_element_type(power(base, lin), dtype) +# +# +# @_wraps(onp.geomspace) +# def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): +# """Implementation of geomspace differentiable in start and stop args.""" +# dtype = dtype or onp.result_type(start, stop, float(num), +# zeros((), dtype)) +# # follow the numpy geomspace convention for negative and complex endpoints +# signflip = 1 - (1 - sign(real(start))) * (1 - sign(real(stop))) // 2 +# res = signflip * logspace(log10(signflip * start), +# log10(signflip * stop), num, +# endpoint=endpoint, base=10.0, +# dtype=dtype, axis=0) +# if axis != 0: +# res = moveaxis(res, 0, axis) +# return lax.convert_element_type(res, dtype) + def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0): - """Implementation of linspace differentiable in start and stop args.""" lax._check_user_dtype_supported(dtype, "linspace") - dtype = dtype or onp.result_type(start, stop, float(num)) - bounds_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) - broadcast_start = broadcast_to(start, bounds_shape) - axis = len(bounds_shape) + axis + 1 if axis < 0 else axis - bounds_shape.insert(axis, 1) - iota_shape = [1,] * len(bounds_shape) - iota_shape[axis] = num - if endpoint: - delta = (stop - start) / (num - 1) - else: - delta = (stop - start) / num - out = (reshape(broadcast_start, bounds_shape) + - reshape(lax.iota(dtype, num), iota_shape) * - reshape(delta, bounds_shape)) - if retstep: - return lax.convert_element_type(out, dtype), delta - else: - return lax.convert_element_type(out, dtype) - + try: + out = onp.linspace(start, stop, num, endpoint, retstep, dtype, axis) + if retstep: + return asarray(out[0]), out[1] + else: + return asarray(out) + except TypeError: # Old versions of onp may lack axis arg. + out = onp.linspace(start, stop, num, endpoint, retstep, dtype) + if retstep: + return moveaxis(asarray(out[0]), 0, axis), out[1] + else: + return moveaxis(asarray(out), 0, axis) -@_wraps(onp.logspace) -def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): - """Implementation of logspace differentiable in start and stop args.""" - lin = linspace(start, stop, num, - endpoint=endpoint, retstep=False, dtype=None, axis=axis) - if dtype is None: - return power(base, lin) - else: - return lax.convert_element_type(power(base, lin), dtype) - - -@_wraps(onp.geomspace) -def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): - """Implementation of geomspace differentiable in start and stop args.""" - dtype = dtype or onp.result_type(start, stop, float(num), - zeros((), dtype)) - # follow the numpy geomspace convention for negative and complex endpoints - signflip = 1 - (1 - sign(real(start))) * (1 - sign(real(stop))) // 2 - res = signflip * logspace(log10(signflip * start), - log10(signflip * stop), num, - endpoint=endpoint, base=10.0, - dtype=dtype, axis=0) - if axis != 0: - res = moveaxis(res, 0, axis) - return lax.convert_element_type(res, dtype) +logspace = _wrap_numpy_nullary_function(onp.logspace) +geomspace = _wrap_numpy_nullary_function(onp.geomspace) @_wraps(onp.meshgrid) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 620d1ce68c96..827440f05814 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2066,6 +2066,9 @@ def assertDowncastDtypeEqual(self, x, y): for rng_factory in [jtu.rand_default])) def testLinspace(self, start_shape, stop_shape, num, endpoint, retstep, dtype, rng_factory): + # TODO(mattjj,levskaya): re-enable when test failure is sorted out + raise SkipTest("tfp test failures") + rng = rng_factory() # relax default tolerances slightly tol = tolerance(dtype if dtype else onp.float32) * 10 @@ -2114,6 +2117,9 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, for rng_factory in [jtu.rand_default])) def testLogspace(self, start_shape, stop_shape, num, endpoint, base, dtype, rng_factory): + # TODO(mattjj,levskaya): re-enable when test failure is sorted out + raise SkipTest("tfp test failures") + if (dtype in int_dtypes and jtu.device_under_test() == "gpu" and not FLAGS.jax_enable_x64): @@ -2162,6 +2168,9 @@ def testLogspace(self, start_shape, stop_shape, num, for rng_factory in [jtu.rand_default])) def testGeomspace(self, start_shape, stop_shape, num, endpoint, dtype, rng_factory): + # TODO(mattjj,levskaya): re-enable when test failure is sorted out + raise SkipTest("tfp test failures") + rng = rng_factory() # relax default tolerances slightly tol = tolerance(dtype if dtype else onp.float32) * 10 From 350630fd1281844005c1f7eb066d839825861c9a Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Tue, 12 Nov 2019 16:40:29 -0800 Subject: [PATCH 0331/1053] fix degenerate case behavior of linspace --- jax/numpy/lax_numpy.py | 121 ++++++++++++++++++---------------------- tests/lax_numpy_test.py | 17 ++---- 2 files changed, 59 insertions(+), 79 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 927819157d30..2caa95222d50 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1689,76 +1689,65 @@ def wrapper(*args, **kwargs): return wrapper -# TODO(mattjj,levskaya): use this version when we sort out test failure -# @_wraps(onp.linspace) -# def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, -# axis=0): -# """Implementation of linspace differentiable in start and stop args.""" -# lax._check_user_dtype_supported(dtype, "linspace") -# dtype = dtype or onp.result_type(start, stop, float(num)) -# bounds_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) -# broadcast_start = broadcast_to(start, bounds_shape) -# axis = len(bounds_shape) + axis + 1 if axis < 0 else axis -# bounds_shape.insert(axis, 1) -# iota_shape = [1,] * len(bounds_shape) -# iota_shape[axis] = num -# if endpoint: -# delta = (stop - start) / (num - 1) -# else: -# delta = (stop - start) / num -# out = (reshape(broadcast_start, bounds_shape) + -# reshape(lax.iota(dtype, num), iota_shape) * -# reshape(delta, bounds_shape)) -# if retstep: -# return lax.convert_element_type(out, dtype), delta -# else: -# return lax.convert_element_type(out, dtype) -# -# -# @_wraps(onp.logspace) -# def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): -# """Implementation of logspace differentiable in start and stop args.""" -# lin = linspace(start, stop, num, -# endpoint=endpoint, retstep=False, dtype=None, axis=axis) -# if dtype is None: -# return power(base, lin) -# else: -# return lax.convert_element_type(power(base, lin), dtype) -# -# -# @_wraps(onp.geomspace) -# def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): -# """Implementation of geomspace differentiable in start and stop args.""" -# dtype = dtype or onp.result_type(start, stop, float(num), -# zeros((), dtype)) -# # follow the numpy geomspace convention for negative and complex endpoints -# signflip = 1 - (1 - sign(real(start))) * (1 - sign(real(stop))) // 2 -# res = signflip * logspace(log10(signflip * start), -# log10(signflip * stop), num, -# endpoint=endpoint, base=10.0, -# dtype=dtype, axis=0) -# if axis != 0: -# res = moveaxis(res, 0, axis) -# return lax.convert_element_type(res, dtype) - +@_wraps(onp.linspace) def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0): + """Implementation of linspace differentiable in start and stop args.""" lax._check_user_dtype_supported(dtype, "linspace") - try: - out = onp.linspace(start, stop, num, endpoint, retstep, dtype, axis) - if retstep: - return asarray(out[0]), out[1] - else: - return asarray(out) - except TypeError: # Old versions of onp may lack axis arg. - out = onp.linspace(start, stop, num, endpoint, retstep, dtype) - if retstep: - return moveaxis(asarray(out[0]), 0, axis), out[1] - else: - return moveaxis(asarray(out), 0, axis) + if num < 0: + raise ValueError("Number of samples, %s, must be non-negative." % num) + dtype = dtype or onp.result_type(start, stop, float(num)) + bounds_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) + broadcast_start = broadcast_to(start, bounds_shape) + axis = len(bounds_shape) + axis + 1 if axis < 0 else axis + bounds_shape.insert(axis, 1) + iota_shape = [1,] * len(bounds_shape) + iota_shape[axis] = num + div = (num - 1) if endpoint else num + if num > 1: + delta = (stop - start) / div + out = (reshape(broadcast_start, bounds_shape) + + reshape(lax.iota(dtype, num), iota_shape) * + reshape(delta, bounds_shape)) + elif num == 1: + delta = nan + out = reshape(broadcast_start, bounds_shape) + else: # num == 0 degenerate case, match onp behavior + empty_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) + empty_shape.insert(axis, 0) + delta = nan + out = reshape(array([]), empty_shape).astype(dtype) + if retstep: + return lax.convert_element_type(out, dtype), delta + else: + return lax.convert_element_type(out, dtype) -logspace = _wrap_numpy_nullary_function(onp.logspace) -geomspace = _wrap_numpy_nullary_function(onp.geomspace) + +@_wraps(onp.logspace) +def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): + """Implementation of logspace differentiable in start and stop args.""" + lin = linspace(start, stop, num, + endpoint=endpoint, retstep=False, dtype=None, axis=axis) + if dtype is None: + return power(base, lin) + else: + return lax.convert_element_type(power(base, lin), dtype) + + +@_wraps(onp.geomspace) +def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): + """Implementation of geomspace differentiable in start and stop args.""" + dtype = dtype or onp.result_type(start, stop, float(num), + zeros((), dtype)) + # follow the numpy geomspace convention for negative and complex endpoints + signflip = 1 - (1 - sign(real(start))) * (1 - sign(real(stop))) // 2 + res = signflip * logspace(log10(signflip * start), + log10(signflip * stop), num, + endpoint=endpoint, base=10.0, + dtype=dtype, axis=0) + if axis != 0: + res = moveaxis(res, 0, axis) + return lax.convert_element_type(res, dtype) @_wraps(onp.meshgrid) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 827440f05814..c8bf57117393 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1242,7 +1242,7 @@ def testSqueeze(self, arg_shape, dtype, ax, rng_factory): for axis in set(range(-len(shape), len(shape))) | set([None]) # `weights_shape` is either `None`, same as the averaged axis, or same as # that of the input - for weights_shape in ([None, shape] if axis is None + for weights_shape in ([None, shape] if axis is None or len(shape) == 1 else [None, (shape[axis],), shape]) for returned in [False, True])) def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): @@ -2059,16 +2059,13 @@ def assertDowncastDtypeEqual(self, x, y): "dtype": dtype, "rng_factory": rng_factory} for start_shape in [(), (2,), (2, 2)] for stop_shape in [(), (2,), (2, 2)] - for num in [5, 20] + for num in [0, 1, 2, 5, 20] for endpoint in [True, False] for retstep in [True, False] for dtype in number_dtypes + [None,] for rng_factory in [jtu.rand_default])) def testLinspace(self, start_shape, stop_shape, num, endpoint, retstep, dtype, rng_factory): - # TODO(mattjj,levskaya): re-enable when test failure is sorted out - raise SkipTest("tfp test failures") - rng = rng_factory() # relax default tolerances slightly tol = tolerance(dtype if dtype else onp.float32) * 10 @@ -2110,16 +2107,13 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, "dtype": dtype, "rng_factory": rng_factory} for start_shape in [(), (2,), (2, 2)] for stop_shape in [(), (2,), (2, 2)] - for num in [5, 20] + for num in [0, 1, 2, 5, 20] for endpoint in [True, False] for base in [10.0, 2, onp.e] for dtype in number_dtypes + [None,] for rng_factory in [jtu.rand_default])) def testLogspace(self, start_shape, stop_shape, num, endpoint, base, dtype, rng_factory): - # TODO(mattjj,levskaya): re-enable when test failure is sorted out - raise SkipTest("tfp test failures") - if (dtype in int_dtypes and jtu.device_under_test() == "gpu" and not FLAGS.jax_enable_x64): @@ -2161,16 +2155,13 @@ def testLogspace(self, start_shape, stop_shape, num, "dtype": dtype, "rng_factory": rng_factory} for start_shape in [(), (2,), (2, 2)] for stop_shape in [(), (2,), (2, 2)] - for num in [5, 20] + for num in [0, 1, 2, 5, 20] for endpoint in [True, False] # NB: numpy's geomspace gives nonsense results on integer types for dtype in inexact_dtypes + [None,] for rng_factory in [jtu.rand_default])) def testGeomspace(self, start_shape, stop_shape, num, endpoint, dtype, rng_factory): - # TODO(mattjj,levskaya): re-enable when test failure is sorted out - raise SkipTest("tfp test failures") - rng = rng_factory() # relax default tolerances slightly tol = tolerance(dtype if dtype else onp.float32) * 10 From ddbdcfb9c965d8c8b27f2114d0369e715d71380a Mon Sep 17 00:00:00 2001 From: android <31932323+henrytansetiawan@users.noreply.github.com> Date: Tue, 12 Nov 2019 18:11:39 -0800 Subject: [PATCH 0332/1053] Add TPU Driver to jaxlib (#1673) --- build/BUILD.bazel | 1 + build/install_xla_in_source_tree.sh | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/build/BUILD.bazel b/build/BUILD.bazel index b51df1da1794..ba43ba2458fa 100644 --- a/build/BUILD.bazel +++ b/build/BUILD.bazel @@ -28,6 +28,7 @@ sh_binary( srcs = ["install_xla_in_source_tree.sh"], data = [ "@org_tensorflow//tensorflow/compiler/xla/python:xla_client", + "@org_tensorflow//tensorflow/compiler/xla/python/tpu_driver/client:py_tpu_client", "//jaxlib", "//jaxlib:lapack.so", "//jaxlib:pytree", diff --git a/build/install_xla_in_source_tree.sh b/build/install_xla_in_source_tree.sh index 32d922b560d7..2b4d4532f454 100755 --- a/build/install_xla_in_source_tree.sh +++ b/build/install_xla_in_source_tree.sh @@ -62,8 +62,16 @@ cp -f "$(rlocation __main__/jaxlib/version.py)" "${TARGET}/jaxlib" cp -f "$(rlocation __main__/jaxlib/cusolver.py)" "${TARGET}/jaxlib" cp -f "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/xla_extension.so)" \ "${TARGET}/jaxlib" +cp -f "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/tpu_driver/client/tpu_client_extension.so)" \ + "${TARGET}/jaxlib" sed \ -e 's/from tensorflow.compiler.xla.python import xla_extension as _xla/from . import xla_extension as _xla/' \ -e 's/from tensorflow.compiler.xla.python.xla_extension import ops/from .xla_extension import ops/' \ < "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/xla_client.py)" \ > "${TARGET}/jaxlib/xla_client.py" +sed \ + -e 's/from tensorflow.compiler.xla.python import xla_extension as _xla/from . import xla_extension as _xla/' \ + -e 's/from tensorflow.compiler.xla.python import xla_client/from . import xla_client/' \ + -e 's/from tensorflow.compiler.xla.python.tpu_driver.client import tpu_client_extension as _tpu_client/from . import tpu_client_extension as _tpu_client/' \ + < "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/tpu_driver/client/tpu_client.py)" \ + > "${TARGET}/jaxlib/tpu_client.py" From 84437839ed29a01e54d218bcc55aa5e18bd3173f Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 12 Nov 2019 18:14:42 -0800 Subject: [PATCH 0333/1053] Bump jaxlib version to 0.1.33 and update WORKSPACE. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 590b16cd33c7..60f70d376b7d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "68676ddd2fb2c0af1ad69ae964a5c23f5d91f3858753b2273833447397d2e95e", - strip_prefix = "tensorflow-fa3a6a43d452dc391b63c97ecd498f95a95c20d9", + sha256 = "78c47befc6992d92d90f605596028828b561ad12eb9c0bcaa70c2ea150633483", + strip_prefix = "tensorflow-4406ec35b6056ea7a1314979292407f1b1dd6409", urls = [ - "https://github.com/tensorflow/tensorflow/archive/fa3a6a43d452dc391b63c97ecd498f95a95c20d9.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/4406ec35b6056ea7a1314979292407f1b1dd6409.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index 972a3cedf17d..3d2b773c7ba4 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.32" +__version__ = "0.1.33" From 6cd995e3ffe8c8fc87679ea3d23f57b488de0196 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 12 Nov 2019 18:38:07 -0800 Subject: [PATCH 0334/1053] allow tokens in op-by-op by calling into _xla_callable_args --- jax/interpreters/xla.py | 7 +++---- jax/lax/lax.py | 14 +++++++------- jax/lax/lax_control_flow.py | 2 +- jax/lax/lax_parallel.py | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 7bea275e2c8f..71bb424ab96a 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -135,19 +135,18 @@ def xla_primitive_callable(prim, *abstract_args, **params): handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) else: handle_result = aval_to_result_handler(aval_out) - xla_shapes = tuple(map(aval_to_xla_shape, abstract_args)) - built_c = primitive_computation(prim, *xla_shapes, **params) + built_c = primitive_computation(prim, *abstract_args, **params) compiled = built_c.Compile(compile_options=xb.get_compile_options(), backend=xb.get_backend(backend)) return partial(_execute_compiled_primitive, prim, compiled, backend, handle_result) @cache() -def primitive_computation(prim, *xla_shapes, **params): +def primitive_computation(prim, *avals, **params): c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) c.SetOpMetadata(xc.OpMetadata(op_type=prim.name, op_name=str(params))) backend = params.pop("backend", None) platform = xb.get_backend(backend).platform - xla_args = _map(c.ParameterWithShape, xla_shapes) + xla_args = _xla_callable_args(c, avals, False) if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] rule(c, *xla_args, **params) # return val set as a side-effect on c diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 684f7b557949..415470108e08 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3345,7 +3345,7 @@ def _reduce_sum_shape_rule(operand, axes, input_shape): def _reduce_sum_translation_rule(c, operand, axes, input_shape): dtype = c.GetShape(operand).numpy_dtype() - scalar = xla_client.Shape.array_shape(dtype, ()) + scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(0, dtype)), xla.primitive_computation(add_p, scalar, scalar), axes) @@ -3369,7 +3369,7 @@ def _reduce_prod_shape_rule(operand, axes): def _reduce_prod_translation_rule(c, operand, axes): dtype = c.GetShape(operand).numpy_dtype() - scalar = xla_client.Shape.array_shape(dtype, ()) + scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(1, dtype)), xla.primitive_computation(mul_p, scalar, scalar), axes) @@ -3415,7 +3415,7 @@ def _reduce_chooser_shape_rule(operand, axes): def _reduce_chooser_translation_rule(prim, identity, c, operand, axes): dtype = c.GetShape(operand).numpy_dtype() - scalar = xla_client.Shape.array_shape(dtype, ()) + scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(identity(dtype)), xla.primitive_computation(prim, scalar, scalar), axes) @@ -3452,7 +3452,7 @@ def _reduce_logical_shape_rule(operand, axes): return tuple(onp.delete(operand.shape, axes)) def _reduce_logical_translation_rule(prim, identity, c, operand, axes): - scalar = xla_client.Shape.array_shape(onp.dtype(onp.bool_), ()) + scalar = ShapedArray((), onp.bool_) return c.Reduce(operand, c.Constant(identity(onp.bool_)), xla.primitive_computation(prim, scalar, scalar), axes) @@ -3515,7 +3515,7 @@ def _reduce_window_sum_shape_rule(operand, window_dimensions, window_strides, def _reduce_window_sum_translation_rule(c, operand, window_dimensions, window_strides, padding, input_shape): dtype = c.GetShape(operand).numpy_dtype() - scalar = xla_client.Shape.array_shape(dtype, ()) + scalar = ShapedArray((), dtype) return c.ReduceWindow(operand, c.Constant(onp.array(0, dtype)), xla.primitive_computation(add_p, scalar, scalar), window_dimensions, window_strides, padding) @@ -3562,7 +3562,7 @@ def _reduce_window_batch_rule( def _reduce_window_chooser_translation_rule( prim, identity, c, operand, window_dimensions, window_strides, padding): dtype = c.GetShape(operand).numpy_dtype() - scalar = xla_client.Shape.array_shape(dtype, ()) + scalar = ShapedArray((), dtype) return c.ReduceWindow(operand, c.Constant(identity(dtype)), xla.primitive_computation(prim, scalar, scalar), window_dimensions, window_strides, padding) @@ -3653,7 +3653,7 @@ def _select_and_scatter_add_translation( c, source, operand, select_prim, window_dimensions, window_strides, padding): dtype = c.GetShape(operand).numpy_dtype() - scalar = xla_client.Shape.array_shape(dtype, ()) + scalar = ShapedArray((), dtype) select = xla.primitive_computation(select_prim, scalar, scalar) scatter = xla.primitive_computation(add_p, scalar, scalar) zero = c.Constant(onp.array(0, dtype)) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 105a61ca7ce1..487d36b55243 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -205,7 +205,7 @@ def _while_loop_translation_rule(c, axis_env, *args, **kwargs): pred, = xla.jaxpr_subcomp(cond_c, cond_jaxpr.jaxpr, backend, axis_env, _map(cond_c.Constant, cond_jaxpr.literals), (), *(x + z)) if batched: - scalar = xla_client.Shape.array_shape(onp.dtype(onp.bool_), ()) + scalar = ShapedArray((), onp.bool_) or_ = xla.primitive_computation(lax.or_p, scalar, scalar) pred = cond_c.Reduce(pred, cond_c.Constant(onp.array(False)), or_, list(range(cond_jaxpr.out_avals[0].ndim))) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 8e0f56bcd286..c3d7d74fb881 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -189,7 +189,7 @@ def _allreduce_split_axis_rule(prim, reducer, vals, which_mapped, axis_name): def _allreduce_translation_rule(prim, c, val, replica_groups, backend=None): dtype = c.GetShape(val).numpy_dtype() - scalar = xla_client.Shape.array_shape(dtype, ()) + scalar = ShapedArray((), dtype) computation = xla.primitive_computation(prim, scalar, scalar, backend=backend) return c.AllReduce(val, computation, replica_groups=replica_groups) From 807a1958bb2a276f012901ba6cd9226371099005 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 13 Nov 2019 09:59:38 -0800 Subject: [PATCH 0335/1053] Update bazel min version to 0.26.0. I think this was the first release including the --repo_env arg: https://github.com/bazelbuild/bazel/commit/d7702b16eb4828b0fe0e92d559fc6de36ee757cc --- build/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.py b/build/build.py index 2bc28289e9aa..0544a6fb5f5c 100755 --- a/build/build.py +++ b/build/build.py @@ -303,7 +303,7 @@ def main(): # Find a working Bazel. bazel_path = get_bazel_path(args.bazel_path) - check_bazel_version(bazel_path, min_version="0.24.0", max_version=None) + check_bazel_version(bazel_path, min_version="0.26.0", max_version=None) print("Bazel binary path: {}".format(bazel_path)) python_bin_path = get_python_bin_path(args.python_bin_path) From 44ccca05df65e2a2e63fee2f6ac54b95ce19efa4 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 13 Nov 2019 10:05:58 -0800 Subject: [PATCH 0336/1053] Revert "Update bazel min version to 0.26.0." It turns out we can't build TF with this bazel version yet. This reverts commit 807a1958bb2a276f012901ba6cd9226371099005. --- build/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.py b/build/build.py index 0544a6fb5f5c..2bc28289e9aa 100755 --- a/build/build.py +++ b/build/build.py @@ -303,7 +303,7 @@ def main(): # Find a working Bazel. bazel_path = get_bazel_path(args.bazel_path) - check_bazel_version(bazel_path, min_version="0.26.0", max_version=None) + check_bazel_version(bazel_path, min_version="0.24.0", max_version=None) print("Bazel binary path: {}".format(bazel_path)) python_bin_path = get_python_bin_path(args.python_bin_path) From 340d82e93e3854c01e5b07c64149187d80410076 Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Wed, 13 Nov 2019 18:25:39 +0000 Subject: [PATCH 0337/1053] [doc] Note that building jaxlib from source isn't always necessary (#1654) * [doc] Note that building jaxlib from source isn't always necessary Building jaxlib from source is time-consuming and the source of most pain for building JAX. It's also not necessary (in my experience) for pure-Python changes. This commit adds notes to the 'building from source' documentation to make this explicit. * Move ``jaxlib`` skip instructions to top --- docs/developer.rst | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/docs/developer.rst b/docs/developer.rst index 943362e06171..df08f024b77e 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -9,7 +9,13 @@ First, obtain the JAX source code. cd jax -You must also install some prerequisites: +There are two steps to building JAX: building ``jaxlib`` and installing ``jax``. + +If you're only modifying Python portions of JAX, you may be able to install +``jaxlib`` from pip or a prebuilt wheel and skip to installing ``jax`` from +source. + +To build ``jaxlib``, you must also install some prerequisites: * a C++ compiler (g++ or clang) * Numpy * Scipy @@ -38,7 +44,6 @@ To build ``jaxlib`` with CUDA support, you can run python build/build.py --enable_cuda pip install -e build # installs jaxlib (includes XLA) - pip install -e . # installs jax (pure Python) See ``python build/build.py --help`` for configuration options, including ways to @@ -52,13 +57,17 @@ To build ``jaxlib`` without CUDA GPU support (CPU only), drop the ``--enable_cud python build/build.py pip install -e build # installs jaxlib (includes XLA) - pip install -e . # installs jax +Once ``jaxlib`` has been installed, you can install ``jax`` by running + +.. code-block:: shell + + pip install -e . # installs jax To upgrade to the latest version from GitHub, just run ``git pull`` from the JAX -repository root, and rebuild by running ``build.py`` if necessary. You shouldn't have -to reinstall because ``pip install -e`` sets up symbolic links from site-packages -into the repository. +repository root, and rebuild by running ``build.py`` or upgrading ``jaxlib`` if +necessary. You shouldn't have to reinstall because ``pip install -e`` sets up +symbolic links from site-packages into the repository. Running the tests ================= @@ -128,17 +137,17 @@ Documentation building on readthedocs.io JAX's auto-generated documentations is at `jax.readthedocs.io `_. -The documentation building is controlled for the entire project by the +The documentation building is controlled for the entire project by the `readthedocs JAX settings `_. The current settings trigger a documentation build as soon as code is pushed to the GitHub ``master`` branch. -For each code version, the building process is driven by the +For each code version, the building process is driven by the ``.readthedocs.yml`` and the ``docs/conf.py`` configuration files. -For each automated documentation build you can see the +For each automated documentation build you can see the `documentation build logs `_. If you want to test the documentation generation on Readthedocs, you can push code to the ``test-docs`` -branch. That branch is also built automatically, and you can +branch. That branch is also built automatically, and you can see the generated documentation `here `_. For a local test, I was able to do it in a fresh directory by replaying the commands From c4f6e54aa882e0a423f06afab8b9ec66da71a9a3 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 13 Nov 2019 15:44:43 -0800 Subject: [PATCH 0338/1053] Update WORKSPACE to include TF build fix. --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60f70d376b7d..23ab75905997 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "78c47befc6992d92d90f605596028828b561ad12eb9c0bcaa70c2ea150633483", - strip_prefix = "tensorflow-4406ec35b6056ea7a1314979292407f1b1dd6409", + sha256 = "cf32fabf086a12f52d1e3dd87eac9b44d44f76713030c45e22d1913ed1edb4d0", + strip_prefix = "tensorflow-d55375021a36e404015abb3439e631f9fac59838", urls = [ - "https://github.com/tensorflow/tensorflow/archive/4406ec35b6056ea7a1314979292407f1b1dd6409.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/d55375021a36e404015abb3439e631f9fac59838.tar.gz", ], ) From a916c58849c3c066f1f9e1884b5bc77dd66b34cd Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 13 Nov 2019 21:10:16 -0800 Subject: [PATCH 0339/1053] fix nested pmap bug (thanks @thenerdstation) This would produce the wrong result (on say an 8 GPU machine): f = lambda x: pmap(pmap(pmap(lambda x: x)))(x) f(np.ones((2, 2, 2))) The logic in _xla_shard, used for inner pmaps, was just incorrect. I wasn't able to make it behave incorrectly for only doubly-nested pmaps, in which case _xla_shard is called only once, and I believe it was okay in that case because `axis_env.nreps // prod(axis_env.sizes) == 1` in that case. Also delete an unused function (pxla.replica_groups, replaced by xla.axis_groups). --- jax/interpreters/pxla.py | 62 +++++++++++----------------------------- tests/pmap_test.py | 11 +++---- 2 files changed, 23 insertions(+), 50 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index c87de5681afb..6d574129002e 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -150,31 +150,6 @@ def assign_shards_to_replicas(nrep, size): indices = onp.tile(onp.arange(size)[:, None], (1, groupsize)) return tuple(indices.ravel()) -def replica_groups(nrep, mesh_spec, mesh_axes): - """Compute XLA replica groups from a replica count and device mesh data. - - Args: - nrep: int, number of replicas (a computation-dependent value). - mesh_spec: tuple of integers, a specification of the logical device mesh, - which depends on the lexical context of nested xla_pmaps. In particular, - each xla_pmap effectively appends its mapped axis size to this tuple. - mesh_axes: tuple of ints, logical device mesh axis indices indicating the - axes along which collective operations are to be executed. - - Returns: - replica_groups, a list of lists of ints encoding a partition of the set - {0, 1, ..., nrep} into equally-sized replica groups (within which - collectives are executed). XLA consumes this replica group specification. - """ - trailing_size, ragged = divmod(nrep, prod(mesh_spec)) - assert not ragged - full_spec = mesh_spec + [trailing_size] - iota = onp.arange(prod(full_spec)).reshape(full_spec) - groups = onp.reshape( - onp.moveaxis(iota, mesh_axes, onp.arange(len(mesh_axes))), - (prod(onp.take(full_spec, mesh_axes)), -1)) - return tuple(map(tuple, groups.T)) - ### applying parallel primitives in op-by-op Python dispatch @@ -545,49 +520,46 @@ def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, if axis_env.devices is not None or (axis_env.names and devices is not None): raise ValueError("Nested pmaps with explicit devices argument.") new_env = xla.extend_axis_env(axis_env, axis_name, axis_size) - in_nodes_sharded = list(map(partial(_xla_shard, c), in_nodes)) + in_nodes_sharded = list(map(partial(_xla_shard, c, new_env), in_nodes)) sharded_outs = xla.jaxpr_subcomp(c, jaxpr, backend, new_env, const_nodes, freevar_nodes, *in_nodes_sharded) - outs = [_xla_unshard(c, xla.axis_groups(new_env, axis_name), r) - for r in sharded_outs] + outs = [_xla_unshard(c, new_env, shard) for shard in sharded_outs] return c.Tuple(*outs) xla.call_translations[xla_pmap_p] = _pmap_translation_rule ad.primitive_transposes[xla_pmap_p] = partial(ad.map_transpose, xla_pmap_p) pe.map_primitives.add(xla_pmap_p) -def _xla_shard(c, x): +def _xla_shard(c, axis_env, x): xla_shape = c.GetShape(x) if xla_shape.is_tuple(): assert not xla_shape.tuple_shapes() return x else: dims = list(xla_shape.dimensions()) - start_indices = _xla_shard_start_indices(c, dims[0], len(dims)) - return c.Reshape(c.DynamicSlice(x, start_indices, [1] + dims[1:]), - None, dims[1:]) + zero = c.Constant(onp.zeros((), dtype=onp.uint32)) + idxs = [_unravel_index(c, axis_env)] + [zero] * (len(dims) - 1) + return c.Reshape(c.DynamicSlice(x, idxs, [1] + dims[1:]), None, dims[1:]) # TODO(b/110096942): more efficient gather -def _xla_unshard(c, replica_groups, x): +def _xla_unshard(c, axis_env, x): xla_shape = c.GetShape(x) if xla_shape.is_tuple(): assert not xla_shape.tuple_shapes() return x else: - axis_size = len(replica_groups[0]) dims = list(xla_shape.dimensions()) - start_indices = _xla_shard_start_indices(c, axis_size, len(dims) + 1) padded = c.Broadcast(c.Constant(onp.array(0, xla_shape.numpy_dtype())), - [axis_size] + dims) - padded = c.DynamicUpdateSlice(padded, c.Reshape(x, None, [1] + dims), - start_indices) - return c.CrossReplicaSum(padded, replica_groups) - -# TODO(mattjj): use more ergonimic form of DynamicUpdateSlice instead! -def _xla_shard_start_indices(c, axis_size, ndim): - idx = c.Rem(c.ReplicaId(), c.Constant(onp.array(axis_size, onp.uint32))) - zero = onp.zeros(ndim - 1, onp.uint32) - return c.Concatenate([c.Reshape(idx, None, [1]), c.Constant(zero)], 0) + [axis_env.sizes[-1]] + dims) + zero = c.Constant(onp.zeros((), dtype=onp.uint32)) + idxs = [_unravel_index(c, axis_env)] + [zero] * len(dims) + padded = c.DynamicUpdateSlice(padded, c.Reshape(x, None, [1] + dims), idxs) + return c.CrossReplicaSum(padded, xla.axis_groups(axis_env, axis_env.names[-1])) + +def _unravel_index(c, axis_env): + div = c.Constant(onp.array(axis_env.nreps // prod(axis_env.sizes), onp.uint32)) + mod = c.Constant(onp.array(axis_env.sizes[-1], onp.uint32)) + return c.Rem(c.Div(c.ReplicaId(), div), mod) ### soft_pmap axis split transformation diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 10339f93a8f8..f871ff7e4121 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -276,17 +276,18 @@ def sum_and_broadcast(x, axis): expected = sum_and_broadcast(sum_and_broadcast(x, 0), 1) self.assertAllClose(ans, expected, check_dtypes=False) - def testReplicaGroups(self): - groups = pxla.replica_groups(8, [4, 2], (0,)) + def testAxisGroups(self): + axis_env = xla.AxisEnv(8, ['i', 'j'], [4, 2]) + groups = xla.axis_groups(axis_env, 'i') self.assertEqual(groups, ((0, 2, 4, 6), (1, 3, 5, 7))) - groups = pxla.replica_groups(8, [4, 2], (1,)) + groups = xla.axis_groups(axis_env, 'j') self.assertEqual(groups, ((0, 1), (2, 3), (4, 5), (6, 7))) - groups = pxla.replica_groups(8, [4, 2], (0, 1)) + groups = xla.axis_groups(axis_env, ('i', 'j')) self.assertEqual(groups, ((0, 1, 2, 3, 4, 5, 6, 7,),)) - groups = pxla.replica_groups(8, [4, 2], (1, 0)) + groups = xla.axis_groups(axis_env, ('j', 'i')) self.assertEqual(len(groups), 1) self.assertEqual((tuple(sorted(groups[0])),), ((0, 1, 2, 3, 4, 5, 6, 7,),)) # order doesn't matter From 87774de3a267f37c8b3b79cec41ab73658c27fe9 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 13 Nov 2019 22:13:01 -0800 Subject: [PATCH 0340/1053] disable lax.axis_index because it's buggy --- jax/interpreters/pxla.py | 1 + tests/parallel_test.py | 3 +++ tests/pmap_test.py | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 6d574129002e..06a12eace4a0 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -227,6 +227,7 @@ def apply_parallel_primitive(prim, *args, **params): def axis_index(axis_name): + raise NotImplementedError # TODO(mattjj): fix dynamic_axis_env = _thread_local_state.dynamic_axis_env frame = dynamic_axis_env[axis_name] dummy_arg = frame.pmap_trace.pure(core.unit) diff --git a/tests/parallel_test.py b/tests/parallel_test.py index d8414f49755c..d24878e51eb8 100644 --- a/tests/parallel_test.py +++ b/tests/parallel_test.py @@ -76,6 +76,7 @@ def testMax(self): self.assertAllClose(ans, expected, check_dtypes=False) def testSelect(self): + raise SkipTest("buggy") # TODO(mattjj): fix p = onp.arange(15).reshape((5, 3)) % 4 == 1 f = onp.zeros((5, 3)) @@ -158,6 +159,7 @@ def f(x): self.assertIn('psum', repr(jaxpr)) def testAdd(self): + raise SkipTest("buggy") # TODO(mattjj): fix x = onp.arange(10) y = 2 * onp.arange(10) def f(x): return x + y @@ -166,6 +168,7 @@ def f(x): return x + y self.assertAllClose(ans, expected, check_dtypes=False) def testAdd2(self): + raise SkipTest("buggy") # TODO(mattjj): fix x = onp.arange(10) y = 2 * onp.arange(10) def f(y): return x + y diff --git a/tests/pmap_test.py b/tests/pmap_test.py index f871ff7e4121..c2f668fcaa1f 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -479,6 +479,7 @@ def g(y): self.assertEqual(c.ravel()[0], device_count * 1) def testAxisIndex(self): + raise SkipTest("buggy") # TODO(mattjj): fix device_count = xla_bridge.device_count() f = pmap(lambda x: x + pxla.axis_index('i'), 'i') x = np.ones(device_count) @@ -558,6 +559,7 @@ def f(x): self.assertAllClose(ans, expected, check_dtypes=False) def testSoftPmapAxisIndex(self): + raise SkipTest("buggy") # TODO(mattjj): fix n = 4 * xla_bridge.device_count() def f(x): return x * lax.axis_index('i') @@ -574,6 +576,7 @@ def f(x): self.assertAllClose(ans, expected, check_dtypes=False) def testSoftPmapNested(self): + raise SkipTest("buggy") # TODO(mattjj): fix n = 4 * xla_bridge.device_count() @partial(soft_pmap, axis_name='i') @@ -587,6 +590,7 @@ def f(x): self.assertAllClose(ans, expected, check_dtypes=False) def testGradOfSoftPmap(self): + raise SkipTest("buggy") # TODO(mattjj): fix n = 4 * xla_bridge.device_count() @partial(soft_pmap, axis_name='i') From 483553ffd700362d4c475ccaab063e412673e4cc Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 14 Nov 2019 00:22:25 -0800 Subject: [PATCH 0341/1053] patch lax.axis_index, add warning about soft_pmap --- jax/api.py | 1 + jax/interpreters/pxla.py | 21 ++++++++++++++++----- tests/parallel_test.py | 3 --- tests/pmap_test.py | 4 ---- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/jax/api.py b/jax/api.py index b74c2873fb09..df3f962788b5 100644 --- a/jax/api.py +++ b/jax/api.py @@ -888,6 +888,7 @@ def __eq__(self, other): def soft_pmap(fun, axis_name=None, backend=None): + warn("soft_pmap is an experimental feature and probably has bugs!") _check_callable(fun) axis_name = _TempAxisName(fun) if axis_name is None else axis_name diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 06a12eace4a0..9e3c77262878 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -187,6 +187,14 @@ def __getitem__(self, axis_name): else: assert False + @property + def sizes(self): + return tuple(frame.hard_size for frame in self) + + @property + def nreps(self): + return prod(frame.hard_size for frame in self) + class _ThreadLocalState(threading.local): def __init__(self): self.dynamic_axis_env = DynamicAxisEnv() @@ -227,13 +235,15 @@ def apply_parallel_primitive(prim, *args, **params): def axis_index(axis_name): - raise NotImplementedError # TODO(mattjj): fix dynamic_axis_env = _thread_local_state.dynamic_axis_env frame = dynamic_axis_env[axis_name] + sizes = dynamic_axis_env.sizes[:dynamic_axis_env.index(frame)+1] + nreps = dynamic_axis_env.nreps dummy_arg = frame.pmap_trace.pure(core.unit) if frame.soft_trace: dummy_arg = frame.soft_trace.pure(dummy_arg) - return axis_index_p.bind(dummy_arg, hard_size=frame.hard_size, + + return axis_index_p.bind(dummy_arg, nreps=nreps, sizes=sizes, soft_size=frame.soft_size, axis_name=axis_name) def _axis_index_partial_eval(trace, _, **params): @@ -246,9 +256,10 @@ def _axis_index_partial_eval(trace, _, **params): out_tracer.recipe = eqn return out_tracer -def _axis_index_translation_rule(c, hard_size, soft_size, axis_name): - unsigned_index = c.Rem(c.ReplicaId(), - c.Constant(onp.array(hard_size, onp.uint32))) +def _axis_index_translation_rule(c, nreps, sizes, soft_size, axis_name): + div = c.Constant(onp.array(nreps // prod(sizes), dtype=onp.uint32)) + mod = c.Constant(onp.array(sizes[-1], dtype=onp.uint32)) + unsigned_index = c.Rem(c.Div(c.ReplicaId(), div), mod) return c.ConvertElementType(unsigned_index, xb.dtype_to_etype(onp.int32)) axis_index_p = core.Primitive('axis_index') diff --git a/tests/parallel_test.py b/tests/parallel_test.py index d24878e51eb8..d8414f49755c 100644 --- a/tests/parallel_test.py +++ b/tests/parallel_test.py @@ -76,7 +76,6 @@ def testMax(self): self.assertAllClose(ans, expected, check_dtypes=False) def testSelect(self): - raise SkipTest("buggy") # TODO(mattjj): fix p = onp.arange(15).reshape((5, 3)) % 4 == 1 f = onp.zeros((5, 3)) @@ -159,7 +158,6 @@ def f(x): self.assertIn('psum', repr(jaxpr)) def testAdd(self): - raise SkipTest("buggy") # TODO(mattjj): fix x = onp.arange(10) y = 2 * onp.arange(10) def f(x): return x + y @@ -168,7 +166,6 @@ def f(x): return x + y self.assertAllClose(ans, expected, check_dtypes=False) def testAdd2(self): - raise SkipTest("buggy") # TODO(mattjj): fix x = onp.arange(10) y = 2 * onp.arange(10) def f(y): return x + y diff --git a/tests/pmap_test.py b/tests/pmap_test.py index c2f668fcaa1f..f871ff7e4121 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -479,7 +479,6 @@ def g(y): self.assertEqual(c.ravel()[0], device_count * 1) def testAxisIndex(self): - raise SkipTest("buggy") # TODO(mattjj): fix device_count = xla_bridge.device_count() f = pmap(lambda x: x + pxla.axis_index('i'), 'i') x = np.ones(device_count) @@ -559,7 +558,6 @@ def f(x): self.assertAllClose(ans, expected, check_dtypes=False) def testSoftPmapAxisIndex(self): - raise SkipTest("buggy") # TODO(mattjj): fix n = 4 * xla_bridge.device_count() def f(x): return x * lax.axis_index('i') @@ -576,7 +574,6 @@ def f(x): self.assertAllClose(ans, expected, check_dtypes=False) def testSoftPmapNested(self): - raise SkipTest("buggy") # TODO(mattjj): fix n = 4 * xla_bridge.device_count() @partial(soft_pmap, axis_name='i') @@ -590,7 +587,6 @@ def f(x): self.assertAllClose(ans, expected, check_dtypes=False) def testGradOfSoftPmap(self): - raise SkipTest("buggy") # TODO(mattjj): fix n = 4 * xla_bridge.device_count() @partial(soft_pmap, axis_name='i') From 4bdfe5a66c92a087625d46de34e60508e9d91d2a Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 14 Nov 2019 12:26:41 +0100 Subject: [PATCH 0342/1053] Strengthened type checking for while and cond See https://github.com/google/jax/issues/1681. --- jax/lax/lax_control_flow.py | 39 +++++++++++++++++++--------------- tests/lax_control_flow_test.py | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 17 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 487d36b55243..65fda9f0af3c 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -121,6 +121,7 @@ def fori_loop(lower, upper, body_fun, init_val): Returns: Loop value from the final iteration, of type ``a``. """ + # TODO: perhaps do some type checking here, for better error messages _, _, result = while_loop(_fori_cond_fun, _fori_body_fun(body_fun), (lower, upper, init_val)) return result @@ -172,9 +173,13 @@ def while_loop(cond_fun, body_fun, init_val): if cond_jaxpr.out_avals != [ShapedArray((), onp.bool_)]: msg = "cond_fun must return a boolean scalar, but got output type(s) {}." raise TypeError(msg.format(cond_jaxpr.out_avals)) - if not treedef_children(in_tree) == [body_tree]: - msg = "body_fun output pytree structure must match init_val, got {} and {}." - raise TypeError(msg.format(body_tree, treedef_children(in_tree)[0])) + + in_tree_children = in_tree.children() + assert len(in_tree_children) == 1 + _check_tree_and_avals("body_fun output and input", + # Extract the subtree and avals for the first element of the return tuple + body_tree, body_jaxpr.out_avals, + in_tree_children[0], init_avals) outs = while_p.bind(*itertools.chain(cond_consts, body_consts, init_vals), cond_nconsts=len(cond_consts), cond_jaxpr=cond_jaxpr, body_nconsts=len(body_consts), body_jaxpr=body_jaxpr) @@ -303,34 +308,34 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): """ if len(onp.shape(pred)) != 0: - raise TypeError("Pred must be a scalar, got {} of shape {}".format(pred, onp.shape(pred))) + raise TypeError("Pred must be a scalar, got {} of shape {}.".format(pred, onp.shape(pred))) + + try: + pred_dtype = onp.result_type(pred) + except TypeError: + msg = ("Pred type must be either boolean or number, got {}.") + raise TypeError(msg.format(pred)) - pred_dtype = onp.result_type(pred) if pred_dtype.kind != 'b': if pred_dtype.kind in 'iuf': pred = pred != 0 else: - msg = ("Pred type must be either boolean or number, got {}") + msg = ("Pred type must be either boolean or number, got {}.") raise TypeError(msg.format(pred_dtype)) true_ops, true_tree = tree_flatten((true_operand,)) true_avals = tuple(_map(_abstractify, true_ops)) - true_jaxpr, true_consts, out_tree = _initial_style_jaxpr(true_fun, true_tree, true_avals) + true_jaxpr, true_consts, true_out_tree = _initial_style_jaxpr(true_fun, true_tree, true_avals) false_ops, false_tree = tree_flatten((false_operand,)) false_avals = tuple(_map(_abstractify, false_ops)) - false_jaxpr, false_consts, out_tree2 = _initial_style_jaxpr(false_fun, false_tree, false_avals) - if out_tree != out_tree2: - msg = ("true_fun and false_fun outputs must have identical tree structure, " - "got {} and {}.") - raise TypeError(msg.format(out_tree, out_tree2)) - if not all(_map(typematch, true_jaxpr.out_avals, false_jaxpr.out_avals)): - msg = ("true_fun and false_fun outputs must have identical types, " - "got {} and {}.") - raise TypeError(msg.format(true_jaxpr.out_avals, false_jaxpr.out_avals)) + false_jaxpr, false_consts, false_out_tree = _initial_style_jaxpr(false_fun, false_tree, false_avals) + _check_tree_and_avals("true_fun and false_fun output", + true_out_tree, true_jaxpr.out_avals, + false_out_tree, false_jaxpr.out_avals) out = cond_p.bind( *itertools.chain([pred], true_consts, true_ops, false_consts, false_ops), true_jaxpr=true_jaxpr, false_jaxpr=false_jaxpr, true_nconsts=len(true_consts), false_nconsts=len(false_consts)) - return tree_unflatten(out_tree, out) + return tree_unflatten(true_out_tree, out) def _cond_abstract_eval(*args, **kwargs): return kwargs["true_jaxpr"].out_avals diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 271ce51f4288..d1c5eea49dba 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -191,6 +191,21 @@ def loop_body(state): self.assertEqual(cloop(3, limit, 1), limit - 3) assert not effect[0] + def testWhileTypeErrors(self): + """Test typing error messages for while.""" + with self.assertRaisesRegex(TypeError, + re.escape("cond_fun must return a boolean scalar, but got pytree PyTreeDef(tuple, [*,*]).")): + lax.while_loop(lambda c: (1., 1.), lambda c: c, 0.) + with self.assertRaisesRegex(TypeError, + re.escape("cond_fun must return a boolean scalar, but got output type(s) [ShapedArray(float32[])].")): + lax.while_loop(lambda c: 1., lambda c: c, 0.) + with self.assertRaisesRegex(TypeError, + re.escape("body_fun output and input must have same type structure, got PyTreeDef(tuple, [*,*]) and *.")): + lax.while_loop(lambda c: True, lambda c: (1., 1.), 0.) + with self.assertRaisesRegex(TypeError, + re.escape("body_fun output and input must have identical types, got ShapedArray(bool[]) and ShapedArray(float32[]).")): + lax.while_loop(lambda c: True, lambda c: True, 0.) + def testNestedWhileWithDynamicUpdateSlice(self): num = 5 @@ -487,6 +502,30 @@ def cfun(x): self.assertEqual(cfun(3), fun(3)) self.assertEqual(cfun(6), fun(6)) + def testCondTypeErrors(self): + """Test typing error messages for cond.""" + with self.assertRaisesRegex(TypeError, + re.escape("Pred type must be either boolean or number, got Date: Thu, 14 Nov 2019 12:54:30 +0100 Subject: [PATCH 0343/1053] Fixed tests for X64 --- docs/developer.rst | 10 ++++++++-- tests/lax_control_flow_test.py | 16 ++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/docs/developer.rst b/docs/developer.rst index df08f024b77e..0a3a35d156cd 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -82,12 +82,18 @@ Then, from the repository root directory run JAX generates test cases combinatorially, and you can control the number of -cases that are generated and checked for each test (default 10): +cases that are generated and checked for each test (default is 10). The automated tests +currently use 25: .. code-block:: shell - JAX_NUM_GENERATED_CASES=100 pytest -n auto tests + JAX_NUM_GENERATED_CASES=25 pytest -n auto tests +The automated tests also run the tests with default 64-bit floats and ints: + +.. code-block:: shell + + JAX_ENABLE_X64=1 JAX_NUM_GENERATED_CASES=25 pytest -n auto tests You can run a more specific set of tests using `pytest `_'s diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index d1c5eea49dba..9ba19bff30eb 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -198,13 +198,13 @@ def testWhileTypeErrors(self): lax.while_loop(lambda c: (1., 1.), lambda c: c, 0.) with self.assertRaisesRegex(TypeError, re.escape("cond_fun must return a boolean scalar, but got output type(s) [ShapedArray(float32[])].")): - lax.while_loop(lambda c: 1., lambda c: c, 0.) + lax.while_loop(lambda c: np.float32(1.), lambda c: c, np.float32(0.)) with self.assertRaisesRegex(TypeError, re.escape("body_fun output and input must have same type structure, got PyTreeDef(tuple, [*,*]) and *.")): lax.while_loop(lambda c: True, lambda c: (1., 1.), 0.) with self.assertRaisesRegex(TypeError, re.escape("body_fun output and input must have identical types, got ShapedArray(bool[]) and ShapedArray(float32[]).")): - lax.while_loop(lambda c: True, lambda c: True, 0.) + lax.while_loop(lambda c: True, lambda c: True, np.float32(0.)) def testNestedWhileWithDynamicUpdateSlice(self): num = 5 @@ -521,9 +521,10 @@ def testCondTypeErrors(self): lax.cond(True, 1., lambda top: 1., 2., lambda fop: (2., 2.)) with self.assertRaisesRegex(TypeError, - re.escape("true_fun and false_fun output must have identical types, got ShapedArray(int32[1]) and ShapedArray(int32[]).")): + re.escape("true_fun and false_fun output must have identical types, got ShapedArray(float32[1]) and ShapedArray(float32[]).")): lax.cond(True, - 1., lambda top: np.array([1]), 2., lambda fop: 1) + 1., lambda top: np.array([1.], np.float32), + 2., lambda fop: np.float32(1.)) def testCondOneBranchConstant(self): @@ -882,14 +883,13 @@ def plus_one(p, iter_idx): 'scan got value with no leading axis to scan over.*', lambda: lax.scan(plus_one, p0, list(range(5)))) - @jtu.skip_on_flag('jax_enable_x64', True) # With float64 error messages are different; hard to check precisely def testScanTypeErrors(self): """Test typing error messages for scan.""" a = np.arange(5) # Body output not a tuple with self.assertRaisesRegex(TypeError, - re.escape("scan body output must be a pair, got ShapedArray(int32[]).")): - lax.scan(lambda c, x: 0, 0, a) + re.escape("scan body output must be a pair, got ShapedArray(float32[]).")): + lax.scan(lambda c, x: np.float32(0.), 0, a) with self.assertRaisesRegex(TypeError, re.escape("scan carry output and input must have same type structure, " "got PyTreeDef(tuple, [*,*,*]) and PyTreeDef(tuple, [*,PyTreeDef(tuple, [*,*])])")): @@ -900,7 +900,7 @@ def testScanTypeErrors(self): with self.assertRaisesRegex(TypeError, re.escape("scan carry output and input must have identical types, " "got ShapedArray(int32[]) and ShapedArray(float32[]).")): - lax.scan(lambda c, x: (0, x), 1.0, a) + lax.scan(lambda c, x: (np.int32(0), x), np.float32(1.0), a) with self.assertRaisesRegex(TypeError, re.escape("scan carry output and input must have same type structure, got * and PyTreeDef(tuple, [*,*]).")): lax.scan(lambda c, x: (0, x), (1, 2), np.arange(5)) From 112dfe51f274c90c8c4447684bf43b3c3feaaf59 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 14 Nov 2019 08:11:31 -0800 Subject: [PATCH 0344/1053] Update DeviceArray.__repr__ so it works for subclasses. (#1680) --- jax/interpreters/xla.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 3b610f07e2d3..f95c50ade0e9 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -616,8 +616,11 @@ def delete(self): self._npy_value = None def __repr__(self): - s = onp.array2string(self._value, prefix='DeviceArray(', suffix=')') - return "DeviceArray({})".format(s) + class_name = self.__class__.__name__ + s = onp.array2string(self._value, + prefix='{}('.format(class_name), + suffix=')') + return "{}({})".format(class_name, s) def item(self): if onp.issubdtype(self.dtype, onp.complexfloating): From ce2d7f6c20df1861bd4c7e211eb13b746001ef9d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 14 Nov 2019 11:44:41 -0500 Subject: [PATCH 0345/1053] Fix the DeviceArray __repr__ function to include the dtype. (#1687) --- jax/interpreters/xla.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index f95c50ade0e9..0d6834021551 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -616,11 +616,16 @@ def delete(self): self._npy_value = None def __repr__(self): - class_name = self.__class__.__name__ - s = onp.array2string(self._value, - prefix='{}('.format(class_name), - suffix=')') - return "{}({})".format(class_name, s) + line_width = onp.get_printoptions()['linewidth'] + prefix = '{}('.format(self.__class__.__name__) + s = onp.array2string(self._value, prefix=prefix, suffix=',', + separator=', ', max_line_width=line_width) + dtype_str = 'dtype={})'.format(self.dtype.name) + last_line_len = len(s) - s.rfind('\n') + 1 + sep = ' ' + if last_line_len + len(dtype_str) + 1 > line_width: + sep = ' ' * len(prefix) + return "{}{},{}{}".format(prefix, s, sep, dtype_str) def item(self): if onp.issubdtype(self.dtype, onp.complexfloating): From 6125157db843ce593f16219df354dbcac1cbb822 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 14 Nov 2019 15:37:33 -0500 Subject: [PATCH 0346/1053] Add type checks that verify JVP primal inputs have the same types as tangent inputs, and JVP cotangent inputs have the same type as primal outputs. (#1690) --- jax/api.py | 31 ++++++++++++++++++++++++++++--- tests/api_test.py | 22 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index df3f962788b5..a49220340d80 100644 --- a/jax/api.py +++ b/jax/api.py @@ -45,7 +45,7 @@ from . import ad_util from .core import eval_jaxpr from .api_util import (wraps, flatten_fun, apply_flat_fun, flatten_fun_nokwargs, - flatten_fun_nokwargs2, apply_flat_fun_nokwargs) + flatten_fun_nokwargs2) from .tree_util import (tree_map, tree_flatten, tree_unflatten, tree_structure, tree_transpose, tree_leaves, tree_multimap, _replace_nones) @@ -1083,7 +1083,16 @@ def jvp(fun, primals, tangents): ps_flat, tree_def = tree_flatten(primals) ts_flat, tree_def_2 = tree_flatten(tangents) - assert tree_def == tree_def_2, (tree_def, tree_def_2) + if tree_def != tree_def_2: + msg = ("primal and tangent arguments to jax.jvp must have the same tree " + "structure; primals have tree structure {} whereas tangents have " + "tree structure {}") + raise TypeError(msg.format(tree_def, tree_def_2)) + for p, t in safe_zip(ps_flat, ts_flat): + if _dtype(p) != _dtype(t): + msg = ("primal and tangent arguments to jax.jvp must have equal types; " + "type mismatch primal {} vs tangent {}") + raise TypeError(msg.format(_dtype(p), _dtype(t))) flat_fun, out_tree = flatten_fun_nokwargs(fun, tree_def) out_primals, out_tangents = ad.jvp(flat_fun).call_wrapped(ps_flat, ts_flat) return (tree_unflatten(out_tree(), out_primals), @@ -1178,6 +1187,21 @@ def _check_inexact_input_vjp(x): "or complex type, got type {}") raise TypeError(msg.format(aval.dtype.name)) +def _vjp_pullback_wrapper(fun, cotangent_dtypes, io_tree, py_args): + in_tree_expected, out_tree = io_tree + args, in_tree = tree_flatten(py_args) + if in_tree != in_tree_expected: + msg = ("Tree structure of cotangent input {}, does not match structure of " + "primal output {}") + raise TypeError(msg.format(in_tree_expected, in_tree)) + for a, dtype in safe_zip(args, cotangent_dtypes): + if _dtype(a) != dtype: + msg = ("Type of cotangent input to vjp pullback function ({}) does not " + "match type of corresponding primal output ({})") + raise TypeError(msg.format(_dtype(a), dtype)) + ans = fun(*args) + return tree_unflatten(out_tree, ans) + def vjp(fun, *primals, **kwargs): """Compute a (reverse-mode) vector-Jacobian product of `fun`. @@ -1229,7 +1253,8 @@ def vjp(fun, *primals, **kwargs): out_primal, out_vjp, aux = ad.vjp(flat_fun, primals_flat, has_aux=True) out_tree, aux_tree = out_aux_trees() out_primal_py = tree_unflatten(out_tree, out_primal) - vjp_py = partial(apply_flat_fun_nokwargs, out_vjp, (out_tree, in_tree)) + vjp_py = partial(_vjp_pullback_wrapper, out_vjp, + [_dtype(x) for x in out_primal], (out_tree, in_tree)) if not has_aux: return out_primal_py, vjp_py else: diff --git a/tests/api_test.py b/tests/api_test.py index 3eb43ea31572..95b721e8ce42 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -468,6 +468,28 @@ def test_grad_and_aux_constant(self): self.assertEqual(g, grad(lambda x: x**3)(4.)) self.assertEqual(aux, [4.**2, 4.]) + def test_jvp_mismatched_arguments(self): + self.assertRaisesRegex( + TypeError, + ("primal and tangent arguments to jax.jvp must have the same tree " + "structure"), + lambda: api.jvp(lambda x, y: x * y, (onp.float32(2),), ())) + self.assertRaisesRegex( + TypeError, + "primal and tangent arguments to jax.jvp must have equal types", + lambda: api.jvp(lambda x: -x, (onp.float16(2),), (onp.float32(4),))) + + def test_vjp_mismatched_arguments(self): + _, pullback = api.vjp(lambda x, y: x * y, onp.float32(3), onp.float32(4)) + self.assertRaisesRegex( + TypeError, + "Tree structure of cotangent input.*does not match", + lambda: pullback((onp.float32(7), onp.float32(100)))) + self.assertRaisesRegex( + TypeError, + "Type of cotangent input to vjp pullback.*does not match type", + lambda: pullback((onp.float16(42)))) + def test_jarrett_jvps(self): def f1(x): return np.sin(np.sin(np.sin(x))) From e670bd1a9a15602a5c4a3528f63adf6886cce1ed Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 14 Nov 2019 15:51:27 -0500 Subject: [PATCH 0347/1053] Add stricter type checks for the start_indices arguments to dynamic_slice and dynamic_update_slice. (#1691) --- jax/lax/lax.py | 15 ++++++++++++++- tests/lax_test.py | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 415470108e08..88fa1c7e65df 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2742,6 +2742,14 @@ def _dynamic_slice_shape_rule(operand, *start_indices, **kwargs): raise TypeError(msg.format(slice_sizes)) return tuple(slice_sizes) +def _dynamic_slice_dtype_rule(operand, *start_indices, **kw): + if any(i.dtype != start_indices[0].dtype or + not onp.issubdtype(i.dtype, onp.integer) for i in start_indices): + msg = ("index arguments to dynamic_slice must be integers of the same " + "type, got: {}") + raise TypeError(msg.format(", ".join(i.dtype.name for i in start_indices))) + return operand.dtype + def _dynamic_slice_translation_rule(c, operand, *start_indices, **kwargs): slice_sizes = kwargs["slice_sizes"] return c.DynamicSlice(operand, start_indices, slice_sizes) @@ -2788,7 +2796,7 @@ def _dynamic_slice_batching_rule(batched_args, batch_dims, slice_sizes, dynamic_slice_p = standard_primitive( - _dynamic_slice_shape_rule, _input_dtype, 'dynamic_slice', + _dynamic_slice_shape_rule, _dynamic_slice_dtype_rule, 'dynamic_slice', _dynamic_slice_translation_rule) ad.primitive_jvps[dynamic_slice_p] = _dynamic_slice_jvp ad.primitive_transposes[dynamic_slice_p] = _dynamic_slice_transpose_rule @@ -2812,6 +2820,11 @@ def _dynamic_update_slice_shape_rule(operand, update, *start_indices, **kwargs): def _dynamic_update_slice_dtype_rule(operand, update, *start_indices, **kwargs): _check_same_dtypes("dynamic_update_slice", False, operand.dtype, update.dtype) + if any(i.dtype != start_indices[0].dtype or + not onp.issubdtype(i.dtype, onp.integer) for i in start_indices): + msg = ("index arguments to dynamic_update_slice must be integers of the " + "same type, got {}") + raise TypeError(msg.format(", ".join(i.dtype.name for i in start_indices))) return operand.dtype def _dynamic_update_slice_jvp(primals, tangents, update_shape): diff --git a/tests/lax_test.py b/tests/lax_test.py index f3bc48e1280d..8f7289c40b79 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1510,6 +1510,21 @@ def testReshapeWithUnusualShapes(self): lambda: lax.reshape(onp.ones(3,), (1.5, 2.0)), TypeError, "Shapes must be 1D sequences of concrete values of integer type.*") + def testDynamicSliceTypeErrors(self): + self.assertRaisesRegexp( + TypeError, + "index arguments to dynamic_slice must be integers of the same type", + lambda: lax.dynamic_slice(onp.ones((3, 4), dtype=onp.float32), + (onp.int32(1), onp.int16(2)), (2, 2))) + + def testDynamicUpdateSliceTypeErrors(self): + self.assertRaisesRegexp( + TypeError, + "index arguments to dynamic_update_slice must be integers of the same " + "type", + lambda: lax.dynamic_update_slice(onp.ones((3, 4), dtype=onp.float32), + onp.zeros((2, 2), dtype=onp.float32), + (onp.int32(1), onp.int16(2)))) class DeviceConstantTest(jtu.JaxTestCase): def _CheckDeviceConstant(self, make_const, expected): From cc0568ef4937c389b57abbbe6a9604c451452df9 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 14 Nov 2019 16:00:55 -0500 Subject: [PATCH 0348/1053] Remove test_util.check_raises_regexp. (#1692) It does nothing that the builtin self.assertRaisesRegexp doesn't already do. --- jax/test_util.py | 7 ------- tests/api_test.py | 49 ++++++++++++++++++++++++---------------------- tests/lax_test.py | 14 +++++++------ tests/pmap_test.py | 7 ++++--- 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/jax/test_util.py b/jax/test_util.py index 44fc4df88c99..1308bcd2ed69 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -486,13 +486,6 @@ def check_raises(thunk, err_type, msg): except err_type as e: assert str(e).startswith(msg), "\n{}\n\n{}\n".format(e, msg) -def check_raises_regexp(thunk, err_type, pattern): - try: - thunk() - assert False - except err_type as e: - assert re.match(pattern, str(e)), "{}\n\n{}\n".format(e, pattern) - _CACHED_INDICES = {} def cases_from_list(xs): diff --git a/tests/api_test.py b/tests/api_test.py index 95b721e8ce42..cc95f2ff68df 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -156,11 +156,13 @@ def test_bad_input(self): def f(x): return x - jtu.check_raises_regexp(lambda: grad(f)("foo"), TypeError, - ".* 'foo' of type <.*'str'> is not a valid JAX type") + self.assertRaisesRegexp( + TypeError, ".* 'foo' of type <.*'str'> is not a valid JAX type", + lambda: grad(f)("foo")) - jtu.check_raises_regexp(lambda: jit(f)("foo"), TypeError, - ".* 'foo' of type <.*'str'> is not a valid JAX type") + self.assertRaisesRegexp( + TypeError, ".* 'foo' of type <.*'str'> is not a valid JAX type", + lambda: jit(f)("foo")) # TODO(dougalm): enable when we remove 'None' from pytree nodes # def test_bad_output(self): @@ -210,9 +212,9 @@ def test_dot_mismatch(self): def f(x, y): return np.dot(x, y) - jtu.check_raises_regexp( - lambda: grad(f)(onp.zeros(3), onp.zeros(4)), TypeError, - "Incompatible shapes for dot: got \\(3L?,\\) and \\(4L?,\\).") + self.assertRaisesRegexp( + TypeError, "Incompatible shapes for dot: got \\(3L?,\\) and \\(4L?,\\).", + lambda: grad(f)(onp.zeros(3), onp.zeros(4))) def test_switch_value_jit(self): def f(x): @@ -233,18 +235,19 @@ def f(x, n): return x assert jit(f, static_argnums=(1,))(0, 5) == 10 - jtu.check_raises_regexp( - lambda: jit(f)(0, 5), TypeError, + self.assertRaisesRegexp( + TypeError, "('JaxprTracer' object cannot be interpreted as an integer" - "|Abstract value passed to .*)") + "|Abstract value passed to .*)", + lambda: jit(f)(0, 5)) def test_casts(self): for castfun in [float, complex, hex, oct] + list(six.integer_types): f = lambda x: castfun(x) - jtu.check_raises_regexp( - lambda: jit(f)(0), TypeError, + self.assertRaisesRegexp( + TypeError, "('JaxprTracer' object cannot be interpreted as an integer" - "|Abstract value passed to .*)") + "|Abstract value passed to .*)", lambda: jit(f)(0)) def test_unimplemented_interpreter_rules(self): foo_p = Primitive('foo') @@ -771,8 +774,8 @@ def test_devicearray_repr(self): def test_devicearray_delete(self): x = device_put(1.) x.delete() - jtu.check_raises_regexp(lambda: repr(x), ValueError, - "DeviceValue has been deleted.") + self.assertRaisesRegexp(ValueError, "DeviceValue has been deleted.", + lambda: repr(x)) def test_devicearray_block_until_ready(self): x = device_put(1.) @@ -923,10 +926,10 @@ def f(a, b, c): def test_grad_of_int_errors(self): dfn = grad(lambda x: x ** 2) - jtu.check_raises_regexp( - lambda: dfn(3), TypeError, + self.assertRaisesRegexp( + TypeError, "Primal inputs to reverse-mode differentiation must be of float or " - "complex type, got type int..") + "complex type, got type int..", lambda: dfn(3)) def test_xla_computation(self): # these tests basically check the examples in the xla_computation docstring @@ -982,8 +985,8 @@ def test_jit_device(self): self.assertEqual(x.device_buffer.device(), device) def test_jit_of_noncallable(self): - jtu.check_raises_regexp(lambda: api.jit(3), TypeError, - "Expected a callable value.*") + self.assertRaisesRegexp(TypeError, "Expected a callable value.*", + lambda: api.jit(3)) def test_issue_1062(self): # code from https://github.com/google/jax/issues/1062 @shoyer @@ -1118,12 +1121,12 @@ def vjp(x_tangent): def test_vmap_in_axes_tree_prefix_error(self): # https://github.com/google/jax/issues/795 - jtu.check_raises_regexp( - lambda: api.vmap(lambda x: x, in_axes=(0, 0))(np.ones(3)), + self.assertRaisesRegexp( ValueError, "axes specification must be a tree prefix of the corresponding " r"value, got specification \(0, 0\) for value " - r"PyTreeDef\(tuple, \[\*\]\)." + r"PyTreeDef\(tuple, \[\*\]\).", + lambda: api.vmap(lambda x: x, in_axes=(0, 0))(np.ones(3)) ) def test_vmap_unbatched_object_passthrough_issue_183(self): diff --git a/tests/lax_test.py b/tests/lax_test.py index 8f7289c40b79..55221f594fed 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1502,13 +1502,15 @@ def testReshapeWithUnusualShapes(self): ans = lax.reshape(onp.ones((3,), onp.float32), (lax.add(1, 2), 1)) self.assertAllClose(ans, onp.ones((3, 1), onp.float32), check_dtypes=True) - jtu.check_raises_regexp( - lambda: lax.reshape(onp.ones(3,), (onp.array([3, 1]),)), TypeError, - "Shapes must be 1D sequences of concrete values of integer type.*") + self.assertRaisesRegexp( + TypeError, + "Shapes must be 1D sequences of concrete values of integer type.*", + lambda: lax.reshape(onp.ones(3,), (onp.array([3, 1]),))) - jtu.check_raises_regexp( - lambda: lax.reshape(onp.ones(3,), (1.5, 2.0)), TypeError, - "Shapes must be 1D sequences of concrete values of integer type.*") + self.assertRaisesRegexp( + TypeError, + "Shapes must be 1D sequences of concrete values of integer type.*", + lambda: lax.reshape(onp.ones(3,), (1.5, 2.0))) def testDynamicSliceTypeErrors(self): self.assertRaisesRegexp( diff --git a/tests/pmap_test.py b/tests/pmap_test.py index f871ff7e4121..daa2f0978028 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -95,9 +95,10 @@ def sum_and_broadcast(x, axis): def testMismatchedAxisSizes(self): n = xla_bridge.device_count() f = pmap(lambda x, y: x + y) - jtu.check_raises_regexp( - lambda: f(onp.random.randn(n), onp.random.randn(n - 1)), ValueError, - "Axis size .* does not match leading dimension of shape .*") + self.assertRaisesRegexp( + ValueError, + "Axis size .* does not match leading dimension of shape .*", + lambda: f(onp.random.randn(n), onp.random.randn(n - 1))) @parameterized.named_parameters( {"testcase_name": "_mesh={}".format(device_mesh_shape), From 9ffdd6bdcf9f23fc36f9de88ba1a75e57c3d609b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 14 Nov 2019 16:18:00 -0500 Subject: [PATCH 0349/1053] Add a type check that verifies the lower and upper arguments to lax.fori_loop have equal types. (#1693) --- jax/lax/lax_control_flow.py | 8 +++++++- tests/lax_control_flow_test.py | 12 +++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 65fda9f0af3c..cb14c8651a68 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -121,7 +121,13 @@ def fori_loop(lower, upper, body_fun, init_val): Returns: Loop value from the final iteration, of type ``a``. """ - # TODO: perhaps do some type checking here, for better error messages + # TODO: perhaps do more type checking here, for better error messages. + lower_dtype = xb.canonicalize_dtype(lax.dtype(lower)) + upper_dtype = xb.canonicalize_dtype(lax.dtype(upper)) + if lower_dtype != upper_dtype: + msg = ("lower and upper arguments to fori_loop must have equal types, " + "got {} and {}") + raise TypeError(msg.format(lower_dtype.name, upper_dtype.name)) _, _, result = while_loop(_fori_cond_fun, _fori_body_fun(body_fun), (lower, upper, init_val)) return result diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 9ba19bff30eb..d2a4dfb09174 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -321,6 +321,12 @@ def fun(x, y): expected = (onp.array([4, 3]), onp.array([1, 2])) self.assertAllClose(ans, expected, check_dtypes=False) + def testForiLoopErrors(self): + """Test typing error messages for while.""" + with self.assertRaisesRegex( + TypeError, "arguments to fori_loop must have equal types"): + lax.fori_loop(np.int16(0), np.int32(10), (lambda i, c: c), np.float32(7)) + def testForiLoopBatched(self): def body_fun(i, loop_carry): x, y = loop_carry @@ -461,11 +467,11 @@ def testIssue1379(self): def fun(pred): return lax.cond(pred, pred, lambda x: (True, x), pred, lambda x: (False, x)) - + @api.jit def cfun(pred): return fun(pred) - + self.assertEqual(fun(0), cfun(0), (False,0)) self.assertEqual(fun(0.), cfun(0.), (False,0.)) self.assertEqual(fun(1), cfun(1), (True,1)) @@ -475,7 +481,7 @@ def cfun(pred): for pred in ["abc", [], [1,2]]: for f in [fun, cfun]: self.assertRaises(TypeError, f, pred) - + def testNestedCond(self): def fun(x): if x < 2: From 3f0c1cd9dd22a3b3c7abcf769a0eb46d2a009fb7 Mon Sep 17 00:00:00 2001 From: android <31932323+henrytansetiawan@users.noreply.github.com> Date: Thu, 14 Nov 2019 14:00:08 -0800 Subject: [PATCH 0350/1053] Add TPU Driver as JAX backend for high-performance access to Google Cloud TPU hardware. (#1675) --- jax/lib/__init__.py | 4 ++++ jax/lib/xla_bridge.py | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index fff24d4fd405..2baf7eb05982 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -44,6 +44,10 @@ def _check_jaxlib_version(): _check_jaxlib_version() +try: + from jaxlib import tpu_client +except: + tpu_client = None from jaxlib import xla_client from jaxlib import lapack diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index f6c917ab3983..7ee0aff69c0a 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -35,6 +35,10 @@ import six import threading +try: + from . import tpu_client +except ImportError: + tpu_client = None from . import version from . import xla_client @@ -44,7 +48,8 @@ 'Enable 64-bit types to be used.') flags.DEFINE_string( 'jax_xla_backend', 'xla', - 'Default is "xla" for the XLA service directly.') + 'Default is "xla" for the XLA service directly, ' + 'or "tpu_driver" for using high-performance access to Cloud TPU hardware.') flags.DEFINE_string( 'jax_backend_target', 'local', 'Either "local" or "rpc:address" to connect to a remote service target.') @@ -116,7 +121,18 @@ def _get_local_backend(platform=None): return backend +def _get_tpu_driver_backend(platform): + del platform + backend_target = FLAGS.jax_backend_target + if backend_target is None: + raise ValueError('When using TPU Driver as the backend, you must specify ' + '--jax_backend_target=:8470.') + return tpu_client.TpuBackend.create(worker=backend_target) + + register_backend('xla', _get_local_backend) +if tpu_client: + register_backend('tpu_driver', _get_tpu_driver_backend) _backend_lock = threading.Lock() From e95098de546ad53a1a0153e047bbb1c5899bf261 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 14 Nov 2019 15:18:41 -0800 Subject: [PATCH 0351/1053] Update jax version to 0.1.51. --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 31b372f4803a..7383ea468320 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.50" +__version__ = "0.1.51" From c19e65b7abc0508599a9cf9175aa33d1e808217d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 14 Nov 2019 16:15:50 -0800 Subject: [PATCH 0352/1053] fix shard_args logic, closes #1688 Co-authored-by: Skye Wanderman-Milne --- jax/interpreters/pxla.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 9e3c77262878..8a8f61f207e3 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -16,7 +16,7 @@ from __future__ import division from __future__ import print_function -from collections import namedtuple +from collections import namedtuple, defaultdict from contextlib import contextmanager import itertools as it import operator as op @@ -49,16 +49,16 @@ def identity(x): return x def shard_args(backend, devices, assignments, axis_size, tuple_args, args): - """Shard an argument data array arg along its leading axis. + """Shard each argument data array along its leading axis. Args: - devices: list of Devices of length num_replicas mapping a logical replica - index to a physical device. - assignments: replica to shard assignment. - axis_size: int, size of the axis to be sharded. + backend: the platform to be used + devices: list of Devices mapping replica index to a physical device. + assignments: list of integers with the same length as `devices` mapping + replica index to an index along the leading axis (i.e. a shard). + axis_size: int, size of the leading axis to be sharded. args: a sequence of JaxTypes representing arguments to be sharded along - their leading axes (or the leading axess of their leaves in the tuple - case) and placed on `devices`. + their leading axes and placed on `devices`. Returns: A list of device buffers with the same length as `devices` indexed by @@ -72,12 +72,28 @@ def shard_args(backend, devices, assignments, axis_size, tuple_args, args): # inline handling for ShardedDeviceArray as a special case for performance if type(arg) is ShardedDeviceArray: if nrep == len(arg.device_buffers): + # The argument is already prepared for the right number of replicas, so + # we just ensure that buf[r] is on devices[r] for each replica index r + # TODO(mattjj): compared to the other case, this logic has less looping + # but could incur more device-to-device data movement for r, buf in enumerate(arg.device_buffers): - buffers[r][a] = (buf if buf.device() == devices[r] - else buf.copy_to_device(devices[r])) + buffers[r][a] = buf if buf.device() == devices[r] else buf.copy_to_device(devices[r]) else: + # The argument is prepared for a different number of replicas, so for + # each of our replica indices we check if there's already a buffer with + # the correct logical assignment on the correct device, and if not just + # copy one of them + prev_assignments = assign_shards_to_replicas(len(arg.device_buffers), axis_size) + candidates = defaultdict(list) for r, buf in enumerate(arg.device_buffers): - buffers[r][a] = xla.device_put(x[assignments[r]], devices[r], backend=backend) + candidates[prev_assignments[r]].append(buf) + for r in range(nrep): + for buf in candidates[assignments[r]]: + if buf.device() == devices[r]: + buffers[r][a] = buf + break + else: + buffers[r][a] = buf.copy_to_device(devices[r]) else: bufs = shard_arg_handlers[type(arg)](arg, devices, assignments, backend=backend) for r, buf in enumerate(bufs): @@ -89,6 +105,7 @@ def shard_args(backend, devices, assignments, axis_size, tuple_args, args): return buffers + shard_arg_handlers = {} shard_arg_handlers[core.Unit] = \ lambda x, devices, _, backend=None: [ From be28700b8babb7e4951f21f7f0356864fcda64ea Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 14 Nov 2019 16:51:39 -0800 Subject: [PATCH 0353/1053] skip some tests on tpu --- tests/lax_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/lax_test.py b/tests/lax_test.py index 55221f594fed..3676c7bbe697 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1512,6 +1512,7 @@ def testReshapeWithUnusualShapes(self): "Shapes must be 1D sequences of concrete values of integer type.*", lambda: lax.reshape(onp.ones(3,), (1.5, 2.0))) + @jtu.skip_on_devices("tpu") # S16 not supported on TPU def testDynamicSliceTypeErrors(self): self.assertRaisesRegexp( TypeError, @@ -1519,6 +1520,7 @@ def testDynamicSliceTypeErrors(self): lambda: lax.dynamic_slice(onp.ones((3, 4), dtype=onp.float32), (onp.int32(1), onp.int16(2)), (2, 2))) + @jtu.skip_on_devices("tpu") # S16 not supported on TPU def testDynamicUpdateSliceTypeErrors(self): self.assertRaisesRegexp( TypeError, From 728cb7fba86843217a67e0b2b5ffd6c1411fec71 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 14 Nov 2019 21:18:23 -0800 Subject: [PATCH 0354/1053] improve grad error message without enough args fixes #1696 --- jax/api.py | 7 +++++++ tests/api_test.py | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/jax/api.py b/jax/api.py index a49220340d80..b11a4b40e158 100644 --- a/jax/api.py +++ b/jax/api.py @@ -388,6 +388,13 @@ def value_and_grad(fun, argnums=0, has_aux=False, holomorphic=False): @wraps(fun, docstr=docstr, argnums=argnums) def value_and_grad_f(*args, **kwargs): + max_argnum = argnums if type(argnums) is int else max(argnums) + if max_argnum >= len(args): + msg = ("differentiating with respect to argnums={} requires at least " + "{} positional arguments to be passed by the caller, but got only " + "{} positional arguments.") + raise TypeError(msg.format(argnums, max_argnum + 1, len(args))) + f = lu.wrap_init(fun, kwargs) f_partial, dyn_args = _argnums_partial(f, argnums, args) if not has_aux: diff --git a/tests/api_test.py b/tests/api_test.py index cc95f2ff68df..d23e7616ee77 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1253,5 +1253,17 @@ def test_repr(self): rep = repr(np.ones(()) + 1.) self.assertStartsWith(rep, 'DeviceArray') + def test_grad_without_enough_args_error_message(self): + # https://github.com/google/jax/issues/1696 + def f(x, y): return x + y + df = api.grad(f, argnums=0) + self.assertRaisesRegexp( + TypeError, + "differentiating with respect to argnums=0 requires at least 1 " + "positional arguments to be passed by the caller, but got only 0 " + "positional arguments.", + lambda: partial(df, x=0.)(y=1.)) + + if __name__ == '__main__': absltest.main() From 3ac3271381dc2628f843ea0a6120a6f9664963f4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 14 Nov 2019 21:37:28 -0800 Subject: [PATCH 0355/1053] improve docs on shape/dtype loop stability also tweak how some error messages are printed, and corresponding tests fixes #1686 --- jax/lax/lax_control_flow.py | 25 ++++++++++++++++++++++++- tests/lax_control_flow_test.py | 25 ++++++++++++++++++------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index cb14c8651a68..77b9c0560874 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -112,6 +112,14 @@ def fori_loop(lower, upper, body_fun, init_val): Unlike that Python version, ``fori_loop`` is implemented in terms of a call to ``while_loop``. See the docstring for ``while_loop`` for more information. + Also unlike the Python analogue, the loop-carried value ``val`` must hold a + fixed shape and dtype across all iterations (and not just be consistent up to + NumPy rank/shape broadcasting and dtype promotion rules, for example). In + other words, the type ``a`` in the type signature above represents an array + with a fixed shape and dtype (or a nested tuple/list/dict container data + structure with a fixed structure and arrays with fixed shape and dtype at the + leaves). + Args: lower: an integer representing the loop index lower bound (inclusive) upper: an integer representing the loop index upper bound (exclusive) @@ -155,6 +163,14 @@ def while_loop(cond_fun, body_fun, init_val): for jit-compiled functions, since native Python loop constructs in an ``@jit`` function are unrolled, leading to large XLA computations. + Also unlike the Python analogue, the loop-carried value ``val`` must hold a + fixed shape and dtype across all iterations (and not just be consistent up to + NumPy rank/shape broadcasting and dtype promotion rules, for example). In + other words, the type ``a`` in the type signature above represents an array + with a fixed shape and dtype (or a nested tuple/list/dict container data + structure with a fixed structure and arrays with fixed shape and dtype at the + leaves). + Another difference from using Python-native loop constructs is that ``while_loop`` is not reverse-mode differentiable because XLA computations require static bounds on memory requirements. @@ -455,6 +471,13 @@ def scan(f, init, xs): for jit-compiled functions, since native Python loop constructs in an ``@jit`` function are unrolled, leading to large XLA computations. + Finally, the loop-carried value ``carry`` must hold a fixed shape and dtype + across all iterations (and not just be consistent up to NumPy rank/shape + broadcasting and dtype promotion rules, for example). In other words, the type + ``c`` in the type signature above represents an array with a fixed shape and + dtype (or a nested tuple/list/dict container data structure with a fixed + structure and arrays with fixed shape and dtype at the leaves). + Args: f: a Python function to be scanned of type ``c -> a -> (c, b)``, meaning that ``f`` accepts two arguments where the first is a value of the loop @@ -968,7 +991,7 @@ def _check_tree_and_avals(what, tree1, avals1, tree2, avals2): raise TypeError(msg.format(what, tree1, tree2)) if not all(safe_map(typematch, avals1, avals2)): msg = ("{} must have identical types, " - "got {} and {}.") + "got\n{}\nand\n{}.") raise TypeError(msg.format(what, tree_unflatten(tree1, avals1), tree_unflatten(tree2, avals2))) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index d2a4dfb09174..9b018979150f 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -202,8 +202,12 @@ def testWhileTypeErrors(self): with self.assertRaisesRegex(TypeError, re.escape("body_fun output and input must have same type structure, got PyTreeDef(tuple, [*,*]) and *.")): lax.while_loop(lambda c: True, lambda c: (1., 1.), 0.) - with self.assertRaisesRegex(TypeError, - re.escape("body_fun output and input must have identical types, got ShapedArray(bool[]) and ShapedArray(float32[]).")): + with self.assertRaisesRegex( + TypeError, + "body_fun output and input must have identical types, got\\n" + "ShapedArray\(bool\[\]\)\\n" + "and\\n" + "ShapedArray\(float32\[\]\)."): lax.while_loop(lambda c: True, lambda c: True, np.float32(0.)) def testNestedWhileWithDynamicUpdateSlice(self): @@ -526,8 +530,12 @@ def testCondTypeErrors(self): re.escape("true_fun and false_fun output must have same type structure, got * and PyTreeDef(tuple, [*,*]).")): lax.cond(True, 1., lambda top: 1., 2., lambda fop: (2., 2.)) - with self.assertRaisesRegex(TypeError, - re.escape("true_fun and false_fun output must have identical types, got ShapedArray(float32[1]) and ShapedArray(float32[]).")): + with self.assertRaisesRegex( + TypeError, + "true_fun and false_fun output must have identical types, got\n" + "ShapedArray\(float32\[1\]\)\n" + "and\n" + "ShapedArray\(float32\[\]\)."): lax.cond(True, 1., lambda top: np.array([1.], np.float32), 2., lambda fop: np.float32(1.)) @@ -903,9 +911,12 @@ def testScanTypeErrors(self): with self.assertRaisesRegex(TypeError, re.escape("scan carry output and input must have same type structure, got * and PyTreeDef(None, []).")): lax.scan(lambda c, x: (0, x), None, a) - with self.assertRaisesRegex(TypeError, - re.escape("scan carry output and input must have identical types, " - "got ShapedArray(int32[]) and ShapedArray(float32[]).")): + with self.assertRaisesRegex( + TypeError, + "scan carry output and input must have identical types, got\n" + "ShapedArray\(int32\[\]\)\\n" + "and\\n" + "ShapedArray\(float32\[\]\)."): lax.scan(lambda c, x: (np.int32(0), x), np.float32(1.0), a) with self.assertRaisesRegex(TypeError, re.escape("scan carry output and input must have same type structure, got * and PyTreeDef(tuple, [*,*]).")): From f4aa5150e87cd90debe86707f5958204a8d9d968 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 15 Nov 2019 10:02:51 -0500 Subject: [PATCH 0356/1053] =?UTF-8?q?Move=20internal=20type-related=20func?= =?UTF-8?q?tions=20into=20a=20new=20(internal)=20jax.types=20=E2=80=A6=20(?= =?UTF-8?q?#1695)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move internal type-related functions into a new (internal) jax.types module. Avoid calling onp type functions in lieu of the wrappers in jax.types. Currently these do the same thing, but future changes will make the behavior of the jax type functions diverge from the classic NumPy versions in some cases. Move xla_bridge.canonicalize_dtype into jax.types, since it fits there more naturally. * Rename jax.types to jax.dtypes. * s/types/dtypes/ in tests. --- jax/abstract_arrays.py | 12 ++-- jax/api.py | 21 ++++--- jax/dtypes.py | 57 +++++++++++++++++ jax/interpreters/xla.py | 13 ++-- jax/lax/lax.py | 101 ++++++++++++++++--------------- jax/lax/lax_control_flow.py | 7 ++- jax/lax/lax_parallel.py | 3 +- jax/lax_linalg.py | 6 +- jax/lib/xla_bridge.py | 32 ++-------- jax/numpy/fft.py | 2 +- jax/numpy/lax_numpy.py | 58 +++++++++--------- jax/numpy/linalg.py | 4 +- jax/random.py | 51 ++++++++-------- jax/test_util.py | 17 +++--- tests/lax_numpy_indexing_test.py | 6 +- tests/lax_numpy_test.py | 12 ++-- tests/lax_test.py | 50 +++++++-------- tests/linalg_test.py | 10 +-- tests/random_test.py | 4 +- 19 files changed, 255 insertions(+), 211 deletions(-) create mode 100644 jax/dtypes.py diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 7ef590837349..0d702b1078cf 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -21,8 +21,8 @@ from . import core from . import ad_util +from . import dtypes from . util import prod -from .lib import xla_bridge def concretization_err_msg(fun): @@ -44,7 +44,7 @@ class UnshapedArray(core.AbstractValue): array_abstraction_level = 3 def __init__(self, dtype): - self.dtype = onp.dtype(xla_bridge.canonicalize_dtype(dtype)) + self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)) def __eq__(self, other): return type(self) is type(other) and self.dtype == other.dtype @@ -88,7 +88,7 @@ class ShapedArray(UnshapedArray): array_abstraction_level = 2 def __init__(self, shape, dtype): - self.dtype = onp.dtype(xla_bridge.canonicalize_dtype(dtype)) + self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)) self.shape = shape ndim = property(lambda self: len(self.shape)) @@ -137,7 +137,7 @@ def __init__(self, val): self.val = val self.shape = onp.shape(val) # canonicalized self.dtype doesn't necessarily match self.val - self.dtype = onp.dtype(xla_bridge.canonicalize_dtype(onp.result_type(val))) + self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtypes.result_type(val))) assert self.dtype != onp.dtype('O') def __eq__(self, other): @@ -170,11 +170,11 @@ class AbstractToken(core.AbstractValue): pass def make_shaped_array(x): - dtype = xla_bridge.canonicalize_dtype(onp.result_type(x)) + dtype = dtypes.canonicalize_dtype(dtypes.result_type(x)) return ShapedArray(onp.shape(x), dtype) def zeros_like_array(x): - dtype = xla_bridge.canonicalize_dtype(onp.result_type(x)) + dtype = dtypes.canonicalize_dtype(dtypes.result_type(x)) return onp.broadcast_to(onp.array(0, dtype), onp.shape(x)) array_types = {onp.ndarray, onp.float64, onp.float32, onp.float16, diff --git a/jax/api.py b/jax/api.py index b11a4b40e158..b32ece17b8a9 100644 --- a/jax/api.py +++ b/jax/api.py @@ -43,6 +43,7 @@ from . import core from . import linear_util as lu from . import ad_util +from . import dtypes from .core import eval_jaxpr from .api_util import (wraps, flatten_fun, apply_flat_fun, flatten_fun_nokwargs, flatten_fun_nokwargs2) @@ -402,8 +403,8 @@ def value_and_grad_f(*args, **kwargs): else: ans, vjp_py, aux = vjp(f_partial, *dyn_args, has_aux=True) _check_scalar(ans) - dtype = onp.result_type(ans) - if not (holomorphic or onp.issubdtype(dtype, onp.floating)): + dtype = dtypes.result_type(ans) + if not (holomorphic or dtypes.issubdtype(dtype, onp.floating)): msg = ("Gradient only defined for real-output functions (with dtype that " "is a subdtype of np.floating), but got dtype {}. For holomorphic " "differentiation, pass holomorphic=True.") @@ -469,7 +470,7 @@ def jacfun(*args, **kwargs): def _check_real_input_jacfwd(x): aval = core.get_aval(x) - if not onp.issubdtype(aval.dtype, onp.floating): + if not dtypes.issubdtype(aval.dtype, onp.floating): msg = ("jacfwd only defined for functions with input dtypes that are " "sub-dtypes of `np.floating` (i.e. that model real values), but got " "{}. For holomorphic differentiation, pass holomorphic=True.") @@ -516,7 +517,7 @@ def jacfun(*args, **kwargs): def _check_real_output_jacrev(x): aval = core.get_aval(x) - if not onp.issubdtype(aval.dtype, onp.floating): + if not dtypes.issubdtype(aval.dtype, onp.floating): msg = ("jacrev only defined for functions with output dtypes that are " "sub-dtypes of `np.floating` (i.e. that model real values), but got " "{}. For holomorphic differentiation, pass holomorphic=True.") @@ -548,7 +549,7 @@ def _std_basis(pytree): leaves, _ = tree_flatten(pytree) ndim = sum(map(onp.size, leaves)) # TODO(mattjj): use a symbolic identity matrix here - dtype = onp.result_type(*leaves) + dtype = dtypes.result_type(*leaves) flat_basis = onp.eye(ndim, dtype=dtype) return _unravel_array_into_pytree(pytree, 1, flat_basis) @@ -567,7 +568,7 @@ def _split(x, indices, axis): return x.split(indices, axis) def _dtype(x): - return xb.canonicalize_dtype(onp.result_type(x)) + return dtypes.canonicalize_dtype(dtypes.result_type(x)) def vmap(fun, in_axes=0, out_axes=0): @@ -1189,7 +1190,7 @@ def fun(*tangents): def _check_inexact_input_vjp(x): aval = core.get_aval(x) - if not onp.issubdtype(aval.dtype, onp.inexact): + if not dtypes.issubdtype(aval.dtype, onp.inexact): msg = ("Primal inputs to reverse-mode differentiation must be of float " "or complex type, got type {}") raise TypeError(msg.format(aval.dtype.name)) @@ -1834,8 +1835,8 @@ def _elementwise_std_basis(pytree): arity = len(leaves) dims = map(onp.size, leaves) # TODO(mattjj): use symbolic constants - dtype = onp.result_type(*leaves) - if not onp.issubdtype(dtype, onp.floating): + dtype = dtypes.result_type(*leaves) + if not dtypes.issubdtype(dtype, onp.floating): msg = ("Jacobian only defined for functions with floating input and output " "dtypes (i.e. dtypes that model real numbers), got {}.") raise TypeError(msg.format(dtype)) # TODO(mattjj, dougalm): handle complex @@ -1971,7 +1972,7 @@ def __init__(self, shape, dtype): dtype('float32') """ def abstractify(x): - return ShapedArray(onp.shape(x), onp.result_type(x)) + return ShapedArray(onp.shape(x), dtypes.result_type(x)) args_flat, in_tree = tree_flatten((args, kwargs)) fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) out = pe.abstract_eval_fun(fun.call_wrapped, *map(abstractify, args_flat)) diff --git a/jax/dtypes.py b/jax/dtypes.py new file mode 100644 index 000000000000..08f4d7a79a88 --- /dev/null +++ b/jax/dtypes.py @@ -0,0 +1,57 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from distutils.util import strtobool +import os + +import numpy as onp + +from .config import flags +from . import util + +FLAGS = flags.FLAGS +flags.DEFINE_bool('jax_enable_x64', + strtobool(os.getenv('JAX_ENABLE_X64', 'False')), + 'Enable 64-bit types to be used.') + +iinfo = onp.iinfo +finfo = onp.finfo + +can_cast = onp.can_cast +issubdtype = onp.issubdtype +issubsctype = onp.issubsctype +result_type = onp.result_type +promote_types = onp.promote_types + + +_dtype_to_32bit_dtype = { + onp.dtype('int64'): onp.dtype('int32'), + onp.dtype('uint64'): onp.dtype('uint32'), + onp.dtype('float64'): onp.dtype('float32'), + onp.dtype('complex128'): onp.dtype('complex64'), +} + +@util.memoize +def canonicalize_dtype(dtype): + """Convert from a dtype to a canonical dtype based on FLAGS.jax_enable_x64.""" + dtype = onp.dtype(dtype) + + if FLAGS.jax_enable_x64: + return dtype + else: + return _dtype_to_32bit_dtype.get(dtype, dtype) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 0d6834021551..7a278b947643 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -30,6 +30,7 @@ from .. import core from .. import ad_util from .. import tree_util +from .. import dtypes from .. import linear_util as lu from ..abstract_arrays import (ConcreteArray, ShapedArray, AbstractToken, make_shaped_array, array_types, raise_to_shaped, @@ -103,7 +104,7 @@ def canonicalize_dtype(x): canonicalize_dtype_handlers = {} canonicalize_dtype_handlers[core.Unit] = identity def _canonicalize_ndarray_dtype(x): - return onp.asarray(x, xb.canonicalize_dtype(onp.result_type(x))) + return onp.asarray(x, dtypes.canonicalize_dtype(dtypes.result_type(x))) for _t in array_types: canonicalize_dtype_handlers[_t] = _canonicalize_ndarray_dtype @@ -190,7 +191,7 @@ def _check_nans(name, xla_shape, buf): if xla_shape.is_tuple(): assert not xla_shape.tuple_shapes() else: - if onp.issubdtype(xla_shape.element_type(), onp.floating): + if dtypes.issubdtype(xla_shape.element_type(), onp.floating): if onp.any(onp.isnan(buf.to_py())): msg = "invalid value (nan) encountered in {}" raise FloatingPointError(msg.format(name)) @@ -628,13 +629,13 @@ def __repr__(self): return "{}{},{}{}".format(prefix, s, sep, dtype_str) def item(self): - if onp.issubdtype(self.dtype, onp.complexfloating): + if dtypes.issubdtype(self.dtype, onp.complexfloating): return complex(self) - elif onp.issubdtype(self.dtype, onp.floating): + elif dtypes.issubdtype(self.dtype, onp.floating): return float(self) - elif onp.issubdtype(self.dtype, onp.integer): + elif dtypes.issubdtype(self.dtype, onp.integer): return int(self) - elif onp.issubdtype(self.dtype, onp.bool_): + elif dtypes.issubdtype(self.dtype, onp.bool_): return bool(self) else: raise TypeError(self.dtype) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 88fa1c7e65df..b64fab334e0c 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -35,6 +35,7 @@ from .. import ad_util from .. import api from .. import linear_util as lu +from .. import dtypes from ..config import flags from ..core import Primitive from ..abstract_arrays import (UnshapedArray, ShapedArray, ConcreteArray, @@ -348,11 +349,11 @@ def convert_element_type(operand, new_dtype): Returns: An array with the same shape as `operand`, cast elementwise to `new_dtype`. """ - new_dtype = xla_bridge.canonicalize_dtype(new_dtype) - old_dtype = xla_bridge.canonicalize_dtype(_dtype(operand)) + new_dtype = dtypes.canonicalize_dtype(new_dtype) + old_dtype = dtypes.canonicalize_dtype(_dtype(operand)) if old_dtype != new_dtype: - if (onp.issubdtype(old_dtype, onp.complexfloating) and - not onp.issubdtype(new_dtype, onp.complexfloating)): + if (dtypes.issubdtype(old_dtype, onp.complexfloating) and + not dtypes.issubdtype(new_dtype, onp.complexfloating)): msg = "Casting complex values to real discards the imaginary part" warnings.warn(msg, onp.ComplexWarning, stacklevel=2) operand = real(operand) @@ -378,7 +379,7 @@ def bitcast_convert_type(operand, new_dtype): An array with the same shape as `operand`, bitcast elementwise to `new_dtype`. """ - new_dtype = xla_bridge.canonicalize_dtype(new_dtype) + new_dtype = dtypes.canonicalize_dtype(new_dtype) old_dtype = _dtype(operand) if old_dtype != new_dtype: return bitcast_convert_type_p.bind(operand, new_dtype=new_dtype) @@ -514,7 +515,7 @@ def dot(lhs, rhs, precision=None): """ # TODO(b/134526360): XLA doesn't support integer dots, so we emit a sum of # products instead. - if onp.issubdtype(lhs.dtype, onp.integer): + if dtypes.issubdtype(lhs.dtype, onp.integer): lhs_shape = onp.shape(lhs) lhs_ndim = len(lhs_shape) rhs_ndim = onp.ndim(rhs) @@ -553,7 +554,7 @@ def dot_general(lhs, rhs, dimension_numbers, precision=None): contract_dims, batch_dims = dimension_numbers contract_dims = tuple(map(tuple, contract_dims)) batch_dims = tuple(map(tuple, batch_dims)) - if onp.issubdtype(lhs.dtype, onp.integer): + if dtypes.issubdtype(lhs.dtype, onp.integer): # TODO(b/134526360): XLA doesn't support integer dots, so we emit a sum of # products instead. lhs_contract_dims, rhs_contract_dims = contract_dims @@ -903,19 +904,19 @@ def _get_monoid_reducer(monoid_op, x): return aval.val == _get_min_identity(dtype) and _reduce_min def _get_max_identity(dtype): - if onp.issubdtype(dtype, onp.inexact): + if dtypes.issubdtype(dtype, onp.inexact): return onp.array(-onp.inf, dtype) - elif onp.issubdtype(dtype, onp.integer): - return onp.array(onp.iinfo(dtype).min, dtype) - elif onp.issubdtype(dtype, onp.bool_): + elif dtypes.issubdtype(dtype, onp.integer): + return onp.array(dtypes.iinfo(dtype).min, dtype) + elif dtypes.issubdtype(dtype, onp.bool_): return onp.array(False, onp.bool_) def _get_min_identity(dtype): - if onp.issubdtype(dtype, onp.inexact): + if dtypes.issubdtype(dtype, onp.inexact): return onp.array(onp.inf, dtype) - elif onp.issubdtype(dtype, onp.integer): - return onp.array(onp.iinfo(dtype).max, dtype) - elif onp.issubdtype(dtype, onp.bool_): + elif dtypes.issubdtype(dtype, onp.integer): + return onp.array(dtypes.iinfo(dtype).max, dtype) + elif dtypes.issubdtype(dtype, onp.bool_): return onp.array(True, onp.bool_) def _reduce_sum(operand, axes): @@ -1052,7 +1053,7 @@ def full(shape, fill_value, dtype=None): msg = "full must be called with scalar fill_value, got fill_value.shape {}." raise TypeError(msg.format(onp.shape(fill_value))) dtype = dtype or _dtype(fill_value) - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) # For constants (defined as Python scalars, raw ndarrays, or DeviceValues), # create a _FilledConstant value, otherwise just call broadcast. @@ -1076,7 +1077,7 @@ def broadcasted_iota(dtype, shape, dimension): `_ operator. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) shape = _canonicalize_shape(shape) dimension = int(dimension) return _IotaConstant(dtype, shape, dimension) @@ -1087,7 +1088,7 @@ def eye(dtype, size): def broadcasted_eye(dtype, shape, axes): if not isinstance(axes, (list, tuple)) or not len(axes) >= 2: raise TypeError("make_diagonal `axes` must be a tuple with len at least 2.") - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) shape = _canonicalize_shape(shape) axes = tuple(map(int, axes)) return _EyeConstant(shape, axes, dtype) @@ -1456,8 +1457,8 @@ def zeros_like_array(x): ### primitives -_input_dtype = lambda *args, **_: xla_bridge.canonicalize_dtype(args[0].dtype) -_fixed_dtype = lambda dtype: lambda *args, **kwargs: xla_bridge.canonicalize_dtype(dtype) +_input_dtype = lambda *args, **_: dtypes.canonicalize_dtype(args[0].dtype) +_fixed_dtype = lambda dtype: lambda *args, **kwargs: dtypes.canonicalize_dtype(dtype) _complex_basetype = lambda dtype: onp.abs(onp.zeros((), dtype)).dtype def standard_primitive(shape_rule, dtype_rule, name, translation_rule=None): @@ -1496,7 +1497,7 @@ def standard_translate(name, c, *args, **kwargs): def unop_dtype_rule(result_dtype, accepted_dtypes, name, aval, **kwargs): - if not any(onp.issubdtype(aval.dtype, t) for t in accepted_dtypes): + if not any(dtypes.issubdtype(aval.dtype, t) for t in accepted_dtypes): msg = '{} does not accept dtype {}. Accepted dtypes are subtypes of {}.' typename = str(onp.dtype(aval.dtype).name) accepted_typenames = (str(onp.dtype(t).name) for t in accepted_dtypes) @@ -1517,7 +1518,7 @@ def unop(result_dtype, accepted_dtypes, name): def binop_dtype_rule(result_dtype, accepted_dtypes, name, *avals, **kwargs): aval_dtypes = [aval.dtype for aval in avals] for i, (aval_dtype, types) in enumerate(zip(aval_dtypes, accepted_dtypes)): - if not any(onp.issubdtype(aval_dtype, t) for t in types): + if not any(dtypes.issubdtype(aval_dtype, t) for t in types): msg = ('{} does not accept dtype {} at position {}. ' 'Accepted dtypes at position {} are subtypes of {}.') typename = str(onp.dtype(aval_dtype).name) @@ -1647,7 +1648,7 @@ def _brcast_to(x, shape): bessel_i1e_p = standard_unop(_float, 'bessel_i1e') def _bessel_i1e_jvp(g, y, x): - eps = onp.finfo(_dtype(x)).eps + eps = dtypes.finfo(_dtype(x)).eps x_is_not_tiny = abs(x) > eps safe_x = select(x_is_not_tiny, x, full_like(x, eps)) dy_dx = bessel_i0e(safe_x) - y * (sign(safe_x) + reciprocal(safe_x)) @@ -1682,7 +1683,7 @@ def _bessel_i1e_jvp(g, y, x): def _conj_transpose_rule(t, x, input_dtype): assert x is ad.undefined_primal - if onp.issubdtype(input_dtype, onp.complexfloating): + if dtypes.issubdtype(input_dtype, onp.complexfloating): return [conj(t)] else: return [real(t)] @@ -1805,7 +1806,7 @@ def _broadcasting_select(c, which, x, y): def _minmax_translation_rule(c, x, y, minmax=None, cmp=None): dtype = c.GetShape(x).numpy_dtype() - if onp.issubdtype(dtype, onp.complexfloating): + if dtypes.issubdtype(dtype, onp.complexfloating): comparator = cmp(c) rx = c.Real(x) ry = c.Real(y) @@ -2575,7 +2576,7 @@ def _select_shape_rule(pred, on_true, on_false): def _select_dtype_rule(pred, on_true, on_false): _check_same_dtypes("select", False, on_true.dtype, on_false.dtype) - if not onp.issubdtype(pred.dtype, onp.bool_): + if not dtypes.issubdtype(pred.dtype, onp.bool_): msg = "select pred must be boolean type, got {}." raise TypeError(msg.format(pred.dtype)) return on_true.dtype @@ -2744,7 +2745,7 @@ def _dynamic_slice_shape_rule(operand, *start_indices, **kwargs): def _dynamic_slice_dtype_rule(operand, *start_indices, **kw): if any(i.dtype != start_indices[0].dtype or - not onp.issubdtype(i.dtype, onp.integer) for i in start_indices): + not dtypes.issubdtype(i.dtype, onp.integer) for i in start_indices): msg = ("index arguments to dynamic_slice must be integers of the same " "type, got: {}") raise TypeError(msg.format(", ".join(i.dtype.name for i in start_indices))) @@ -2821,7 +2822,7 @@ def _dynamic_update_slice_shape_rule(operand, update, *start_indices, **kwargs): def _dynamic_update_slice_dtype_rule(operand, update, *start_indices, **kwargs): _check_same_dtypes("dynamic_update_slice", False, operand.dtype, update.dtype) if any(i.dtype != start_indices[0].dtype or - not onp.issubdtype(i.dtype, onp.integer) for i in start_indices): + not dtypes.issubdtype(i.dtype, onp.integer) for i in start_indices): msg = ("index arguments to dynamic_update_slice must be integers of the " "same type, got {}") raise TypeError(msg.format(", ".join(i.dtype.name for i in start_indices))) @@ -2920,9 +2921,9 @@ def _gather_dimensions_proto(indices_shape, dimension_numbers): return proto def _gather_dtype_rule(operand, start_indices, **kwargs): - if not onp.issubdtype(start_indices.dtype, onp.integer): + if not dtypes.issubdtype(start_indices.dtype, onp.integer): raise ValueError("start_indices must have an integer type") - return xla_bridge.canonicalize_dtype(operand.dtype) + return dtypes.canonicalize_dtype(operand.dtype) def _gather_shape_rule(operand, start_indices, dimension_numbers, slice_sizes, operand_shape): @@ -3060,10 +3061,10 @@ def _scatter_dimensions_proto(indices_shape, dimension_numbers): return proto def _scatter_dtype_rule(operand, scatter_indices, updates, **kwargs): - if not onp.issubdtype(scatter_indices.dtype, onp.integer): + if not dtypes.issubdtype(scatter_indices.dtype, onp.integer): raise ValueError("scatter_indices must have an integer type") _check_same_dtypes("scatter", False, operand.dtype, updates.dtype) - return xla_bridge.canonicalize_dtype(operand.dtype) + return dtypes.canonicalize_dtype(operand.dtype) def _scatter_shape_rule(operand, scatter_indices, updates, **kwargs): return operand.shape @@ -3243,7 +3244,7 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, # is large enough to overflow the number of mantissa bits in a float so IDs # end up colliding. We could also utilize the exponent and sign bits, with a # little more work. - assert num_ids < (2 ** onp.finfo(updates_dtype).nmant) + assert num_ids < (2 ** dtypes.finfo(updates_dtype).nmant) updates = reshape(updates, (1,) + updates_shape) reshaped_update_ids = reshape(update_ids, (1,) + updates_shape) @@ -3760,7 +3761,7 @@ def _select_and_gather_add_translation( shape = c.GetShape(operand) dtype = shape.numpy_dtype() etype = shape.xla_element_type() - nbits = onp.finfo(dtype).bits + nbits = dtypes.finfo(dtype).bits assert nbits <= max_bits double_word_reduction = nbits * 2 <= max_bits @@ -3806,7 +3807,7 @@ def snd(t): "higher derivative of a max-pooling operation.") r_nbits = nbits // 2 # Drop/round the bottom mantissa bits. - nexp = onp.finfo(dtype).nexp + nexp = dtypes.finfo(dtype).nexp nmant = r_nbits - nexp - 1 double_word_dtype = word_dtype = _UINT_DTYPES[nbits] @@ -4048,7 +4049,7 @@ def _value(self): def constant_handler(c, iota_constant, canonicalize_types=True): dtype = iota_constant.dtype if canonicalize_types: - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return c.BroadcastedIota(dtype, iota_constant.shape, iota_constant.axis) @@ -4248,23 +4249,23 @@ def padtype_to_pads(in_shape, window_shape, window_strides, padding): raise TypeError(msg.format(padding)) -def _check_same_dtypes(name, ignore_fp_precision, *dtypes): +def _check_same_dtypes(name, ignore_fp_precision, *ttypes): """Check that dtypes agree, possibly ignoring float precision.""" # the `ignore_fp_precision` flag exists because the XLA shape inference logic # allows mixed floating point precision, but the HLO verifier often rejects it - dtypes = list(map(onp.dtype, dtypes)) # canonicalize + types = list(map(onp.dtype, ttypes)) # canonicalize if ignore_fp_precision: - dtypes = [ - onp.floating if onp.issubdtype(dtype, onp.floating) - else onp.complexfloating if onp.issubdtype(dtype, onp.complexfloating) - else dtype for dtype in dtypes] - if len({xla_bridge.canonicalize_dtype(t) for t in dtypes}) != 1: + types = [ + onp.floating if dtypes.issubdtype(dtype, onp.floating) + else onp.complexfloating if dtypes.issubdtype(dtype, onp.complexfloating) + else dtype for dtype in types] + if len({dtypes.canonicalize_dtype(t) for t in types}) != 1: if ignore_fp_precision: msg = ("{} requires arguments to have same dtypes up to floating point " "precision, got {}.") else: msg = "{} requires arguments to have the same dtypes, got {}." - raise TypeError(msg.format(name, ", ".join(map(str, dtypes)))) + raise TypeError(msg.format(name, ", ".join(map(str, types)))) def _check_conv_shapes(name, lhs_shape, rhs_shape, window_strides): @@ -4346,7 +4347,7 @@ def _check_shapelike(fun_name, arg_name, obj): if obj_arr.ndim != 1: msg = "{} {} must be rank 1, got {}." raise TypeError(msg.format(obj_arr.ndim)) - if not onp.issubdtype(obj_arr.dtype, onp.integer): + if not dtypes.issubdtype(obj_arr.dtype, onp.integer): msg = "{} {} must have every element be an integer type, got {}." raise TypeError(msg.format(fun_name, arg_name, tuple(map(type, obj)))) if not (obj_arr >= 0).all(): @@ -4384,8 +4385,8 @@ def _const(example, val): _twos = partial(full_like, fill_value=2) _two = partial(full_like, shape=(), fill_value=2) -_dtype = dtype = onp.result_type -_iscomplex = lambda x: onp.issubdtype(_dtype(x), onp.complexfloating) +_dtype = dtype = dtypes.result_type +_iscomplex = lambda x: dtypes.issubdtype(_dtype(x), onp.complexfloating) def ranges_like(*xs): @@ -4543,7 +4544,7 @@ def _balanced_eq(x, z, y): def _eq_meet(a, b): a_dtype, b_dtype = _dtype(a), _dtype(b) if a_dtype != b_dtype: - higher_dtype = onp.promote_types(a_dtype, b_dtype) + higher_dtype = dtypes.promote_types(a_dtype, b_dtype) if higher_dtype == a_dtype: a = convert_element_type(a, b_dtype) else: @@ -4563,12 +4564,12 @@ def _abstractify(x): def _check_user_dtype_supported(dtype, fun_name=None): - if dtype is not None and onp.dtype(dtype) != xla_bridge.canonicalize_dtype(dtype): + if dtype is not None and onp.dtype(dtype) != dtypes.canonicalize_dtype(dtype): msg = ("Explicitly requested dtype {} {} is not available, " "and will be truncated to dtype {}. To enable more dtypes, set the " "jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell " "environment variable. " "See https://github.com/google/jax#current-gotchas for more.") fun_name = "requested in {}".format(fun_name) if fun_name else "" - truncated_dtype = xla_bridge.canonicalize_dtype(dtype).name + truncated_dtype = dtypes.canonicalize_dtype(dtype).name warnings.warn(msg.format(dtype, fun_name , truncated_dtype)) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 77b9c0560874..64b313088fd2 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -30,6 +30,7 @@ from jax import api from jax import core +from jax import dtypes from jax.lax import lax from jax import linear_util as lu from jax.abstract_arrays import ShapedArray, raise_to_shaped @@ -130,8 +131,8 @@ def fori_loop(lower, upper, body_fun, init_val): Loop value from the final iteration, of type ``a``. """ # TODO: perhaps do more type checking here, for better error messages. - lower_dtype = xb.canonicalize_dtype(lax.dtype(lower)) - upper_dtype = xb.canonicalize_dtype(lax.dtype(upper)) + lower_dtype = dtypes.canonicalize_dtype(lax.dtype(lower)) + upper_dtype = dtypes.canonicalize_dtype(lax.dtype(upper)) if lower_dtype != upper_dtype: msg = ("lower and upper arguments to fori_loop must have equal types, " "got {} and {}") @@ -333,7 +334,7 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): raise TypeError("Pred must be a scalar, got {} of shape {}.".format(pred, onp.shape(pred))) try: - pred_dtype = onp.result_type(pred) + pred_dtype = dtypes.result_type(pred) except TypeError: msg = ("Pred type must be either boolean or number, got {}.") raise TypeError(msg.format(pred)) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index c3d7d74fb881..05df8bdf4dc8 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -26,6 +26,7 @@ from jax import core from jax import ad_util +from jax import dtypes from jax.lax import lax from jax.abstract_arrays import ShapedArray from jax.interpreters import ad @@ -198,7 +199,7 @@ def _psum_translation_rule(c, val, replica_groups, backend=None): psum = partial(_allreduce_translation_rule, lax.add_p, c, replica_groups=replica_groups, backend=backend) dtype = c.GetShape(val).numpy_dtype() - if onp.issubdtype(dtype, onp.complexfloating): + if dtypes.issubdtype(dtype, onp.complexfloating): return c.Complex(psum(c.Real(val)), psum(c.Imag(val))) else: return psum(val) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 44b41ccf0956..65dd7178ba5b 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -27,6 +27,7 @@ from jax import core from jax import lax from jax import ops +from jax import dtypes from jax.interpreters import xla from jax.interpreters import ad from jax.interpreters import batching @@ -35,7 +36,6 @@ from jax.core import Primitive from jax.lax import (standard_primitive, standard_unop, binop_dtype_rule, _float, _complex, _input_dtype, _broadcasting_select) -from jax.lib import xla_bridge as xb from jax.lib import xla_client from jax.lib import lapack from jax.lib import cusolver @@ -165,8 +165,8 @@ def eig_abstract_eval(operand): batch_dims = operand.shape[:-2] n = operand.shape[-1] - dtype = onp.complex64 if onp.finfo(operand.dtype).bits == 32 else onp.complex128 - dtype = xb.canonicalize_dtype(dtype) + dtype = onp.complex64 if dtypes.finfo(operand.dtype).bits == 32 else onp.complex128 + dtype = dtypes.canonicalize_dtype(dtype) vl = vr = ShapedArray(batch_dims + (n, n), dtype) w = ShapedArray(batch_dims + (n,), dtype) else: diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 7ee0aff69c0a..6a830304319d 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -25,12 +25,12 @@ import os import warnings -from distutils.util import strtobool from absl import logging from ..config import flags from .. import util +from .. import dtypes import numpy as onp # 'onp' rather than 'np' to distinguish from autograd.numpy import six import threading @@ -43,9 +43,7 @@ from . import xla_client FLAGS = flags.FLAGS -flags.DEFINE_bool('jax_enable_x64', - strtobool(os.getenv('JAX_ENABLE_X64', 'False')), - 'Enable 64-bit types to be used.') + flags.DEFINE_string( 'jax_xla_backend', 'xla', 'Default is "xla" for the XLA service directly, ' @@ -223,31 +221,12 @@ def host_count(backend=None): @util.memoize def dtype_to_etype(dtype): """Convert from dtype to canonical etype (reading FLAGS.jax_enable_x64).""" - return xla_client.dtype_to_etype(canonicalize_dtype(dtype)) - - -_dtype_to_32bit_dtype = { - onp.dtype('int64'): onp.dtype('int32'), - onp.dtype('uint64'): onp.dtype('uint32'), - onp.dtype('float64'): onp.dtype('float32'), - onp.dtype('complex128'): onp.dtype('complex64'), -} - - -@util.memoize -def canonicalize_dtype(dtype): - """Convert from a dtype to a canonical dtype based on FLAGS.jax_enable_x64.""" - dtype = onp.dtype(dtype) - - if FLAGS.jax_enable_x64: - return dtype - else: - return _dtype_to_32bit_dtype.get(dtype, dtype) + return xla_client.dtype_to_etype(dtypes.canonicalize_dtype(dtype)) @util.memoize def supported_numpy_dtypes(): - return {canonicalize_dtype(dtype) + return {dtypes.canonicalize_dtype(dtype) for dtype in xla_client.XLA_ELEMENT_TYPE_TO_DTYPE.values()} @@ -255,7 +234,8 @@ def supported_numpy_dtypes(): def normalize_to_xla_dtypes(val): """Normalize dtypes in a value.""" if hasattr(val, '__array__') or onp.isscalar(val): - return onp.asarray(val, dtype=canonicalize_dtype(onp.result_type(val))) + return onp.asarray(val, + dtype=dtypes.canonicalize_dtype(dtypes.result_type(val))) elif isinstance(val, (tuple, list)): return tuple(normalize_to_xla_dtypes(x) for x in val) raise TypeError('Can\'t convert to XLA: {}'.format(val)) diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index 3bb3ce685902..a0494e617607 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -19,7 +19,7 @@ import numpy as onp from .. import lax -from ..lib.xla_bridge import xla_client, canonicalize_dtype +from ..lib import xla_client from ..util import get_module_functions from .lax_numpy import _not_implemented from .lax_numpy import _wraps diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 2caa95222d50..d07d51b582dd 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -47,13 +47,13 @@ from jax import jit, device_put, custom_transforms, defjvp from .. import core +from .. import dtypes from ..abstract_arrays import UnshapedArray, ShapedArray, ConcreteArray from ..config import flags from ..interpreters.xla import DeviceArray from .. import lax from ..util import partial, get_module_functions, unzip2, prod as _prod from ..lib import pytree -from ..lib import xla_bridge from ..lib import xla_client FLAGS = flags.FLAGS @@ -148,14 +148,14 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, signedinteger = onp.signedinteger unsignedinteger = onp.unsignedinteger -iinfo = onp.iinfo -finfo = onp.finfo +iinfo = dtypes.iinfo +finfo = dtypes.finfo -can_cast = onp.can_cast -issubdtype = onp.issubdtype -issubsctype = onp.issubsctype -result_type = onp.result_type -promote_types = onp.promote_types +can_cast = dtypes.can_cast +issubdtype = dtypes.issubdtype +issubsctype = dtypes.issubsctype +result_type = dtypes.result_type +promote_types = dtypes.promote_types ComplexWarning = onp.ComplexWarning @@ -207,7 +207,7 @@ def _promote_dtypes(*args): return args else: from_dtypes = map(_dtype, args) - to_dtype = xla_bridge.canonicalize_dtype(result_type(*from_dtypes)) + to_dtype = dtypes.canonicalize_dtype(result_type(*from_dtypes)) return [lax.convert_element_type(x, to_dtype) if _dtype(x) != to_dtype else x for x in args] @@ -742,7 +742,7 @@ def angle(z): dtype = _dtype(re) if not issubdtype(dtype, inexact) or ( issubdtype(_dtype(z), floating) and ndim(z) == 0): - dtype = xla_bridge.canonicalize_dtype(float64) + dtype = dtypes.canonicalize_dtype(float64) re = lax.convert_element_type(re, dtype) im = lax.convert_element_type(im, dtype) return lax.atan2(im, re) @@ -997,7 +997,7 @@ def clip(a, a_min=None, a_max=None): def _dtype_info(dtype): """Helper function for to get dtype info needed for clipping.""" if issubdtype(dtype, onp.integer): - return onp.iinfo(dtype) + return iinfo(dtype) return finfo(dtype) def _round_to_nearest_even(x): @@ -1095,7 +1095,7 @@ def nan_to_num(x, copy=True): dtype = _dtype(x) if issubdtype(dtype, complexfloating): return lax.complex(nan_to_num(lax.real(x)), nan_to_num(lax.imag(x))) - info = finfo(xla_bridge.canonicalize_dtype(dtype)) + info = finfo(dtypes.canonicalize_dtype(dtype)) x = where(isnan(x), _constant_like(x, 0), x) x = where(isposinf(x), _constant_like(x, info.max), x) x = where(isneginf(x), _constant_like(x, info.min), x) @@ -1139,15 +1139,15 @@ def _reduction_dims(a, axis): raise TypeError("Unexpected type of axis argument: {}".format(type(axis))) def _reduction_init_val(a, init_val): - a_dtype = xla_bridge.canonicalize_dtype(_dtype(a)) + a_dtype = dtypes.canonicalize_dtype(_dtype(a)) if a_dtype == 'bool': return onp.array(init_val > 0, dtype=a_dtype) try: return onp.array(init_val, dtype=a_dtype) except OverflowError: assert issubdtype(a_dtype, onp.integer) - sign, iinfo = onp.sign(init_val), onp.iinfo(a_dtype) - return onp.array(iinfo.min if sign < 0 else iinfo.max, dtype=a_dtype) + sign, info = onp.sign(init_val), iinfo(a_dtype) + return onp.array(info.min if sign < 0 else info.max, dtype=a_dtype) _cast_to_bool = partial(lax.convert_element_type, new_dtype=onp.bool_) @@ -1171,7 +1171,7 @@ def mean(a, axis=None, dtype=None, out=None, keepdims=False): if dtype is None: if (issubdtype(_dtype(a), onp.bool_) or issubdtype(_dtype(a), onp.integer)): - dtype = xla_bridge.canonicalize_dtype(onp.float64) + dtype = dtypes.canonicalize_dtype(onp.float64) else: dtype = _dtype(a) @@ -1193,11 +1193,11 @@ def average(a, axis=None, weights=None, returned=False): weights = asarray(weights) if issubdtype(a.dtype, integer) or issubdtype(a.dtype, bool_): - out_dtype = xla_bridge.canonicalize_dtype(result_type(a.dtype, + out_dtype = dtypes.canonicalize_dtype(result_type(a.dtype, weights.dtype, floating)) else: - out_dtype = xla_bridge.canonicalize_dtype(result_type(a.dtype, weights.dtype)) + out_dtype = dtypes.canonicalize_dtype(result_type(a.dtype, weights.dtype)) a_shape = shape(a) a_ndim = len(a_shape) @@ -1237,7 +1237,7 @@ def var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False): if dtype is None: if (issubdtype(_dtype(a), onp.bool_) or issubdtype(_dtype(a), onp.integer)): - dtype = xla_bridge.canonicalize_dtype(onp.float64) + dtype = dtypes.canonicalize_dtype(onp.float64) centered = subtract(a, mean(a, axis, dtype=dtype, keepdims=True)) if iscomplexobj(centered): centered = lax.abs(centered) @@ -1277,7 +1277,7 @@ def allclose(a, b, rtol=1e-05, atol=1e-08): @_wraps(onp.count_nonzero) def count_nonzero(a, axis=None): return sum(lax.ne(a, _constant_like(a, 0)), axis=axis, - dtype=xla_bridge.canonicalize_dtype(onp.int_)) + dtype=dtypes.canonicalize_dtype(onp.int_)) def _make_nan_reduction(onp_reduction, np_reduction, init_val, nan_if_all_nan): @@ -1546,13 +1546,13 @@ def array(object, dtype=None, copy=True, order="K", ndmin=0): lax._check_user_dtype_supported(dtype, "array") if isinstance(object, ndarray): - if dtype and _dtype(object) != xla_bridge.canonicalize_dtype(dtype): + if dtype and _dtype(object) != dtypes.canonicalize_dtype(dtype): out = lax.convert_element_type(object, dtype) else: out = device_put(object) elif hasattr(object, '__array__'): # this case is for duck-typed handling of objects that implement `__array__` - out = array(object.__array__(), dtype and xla_bridge.canonicalize_dtype(dtype)) + out = array(object.__array__(), dtype and dtypes.canonicalize_dtype(dtype)) elif isinstance(object, (list, tuple)): if object: out = stack([array(elt, dtype=dtype) for elt in object]) @@ -1560,7 +1560,7 @@ def array(object, dtype=None, copy=True, order="K", ndmin=0): out = onp.array([], dtype) elif isscalar(object): out = lax.reshape(object, ()) - if dtype and _dtype(out) != xla_bridge.canonicalize_dtype(dtype): + if dtype and _dtype(out) != dtypes.canonicalize_dtype(dtype): out = lax.convert_element_type(out, dtype) else: try: @@ -1696,7 +1696,7 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, lax._check_user_dtype_supported(dtype, "linspace") if num < 0: raise ValueError("Number of samples, %s, must be non-negative." % num) - dtype = dtype or onp.result_type(start, stop, float(num)) + dtype = dtype or result_type(start, stop, float(num)) bounds_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) broadcast_start = broadcast_to(start, bounds_shape) axis = len(bounds_shape) + axis + 1 if axis < 0 else axis @@ -1737,8 +1737,7 @@ def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): @_wraps(onp.geomspace) def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): """Implementation of geomspace differentiable in start and stop args.""" - dtype = dtype or onp.result_type(start, stop, float(num), - zeros((), dtype)) + dtype = dtype or result_type(start, stop, float(num), zeros((), dtype)) # follow the numpy geomspace convention for negative and complex endpoints signflip = 1 - (1 - sign(real(start))) * (1 - sign(real(stop))) // 2 res = signflip * logspace(log10(signflip * start), @@ -1934,7 +1933,7 @@ def trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None): if dtype is None: dtype = _dtype(a) if issubdtype(dtype, integer): - default_int = xla_bridge.canonicalize_dtype(onp.int_) + default_int = dtypes.canonicalize_dtype(onp.int_) if iinfo(dtype).bits < iinfo(default_int).bits: dtype = default_int @@ -2410,7 +2409,7 @@ def _argminmax(op, a, axis): shape = [1] * a.ndim shape[axis] = a.shape[axis] idxs = lax.tie_in(a, arange(a.shape[axis])).reshape(shape) - maxval = onp.iinfo(xla_bridge.canonicalize_dtype(idxs.dtype)).max + maxval = iinfo(dtypes.canonicalize_dtype(idxs.dtype)).max maxval = lax.tie_in(a, maxval) mask_idxs = where(lax._eq_meet(a, op(a, axis, keepdims=True)), idxs, maxval) return min(mask_idxs, axis) @@ -2998,7 +2997,8 @@ def cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, if m.ndim > 2: raise ValueError("m has more than 2 dimensions") # same as numpy error - X = array(m, ndmin=2, dtype=xla_bridge.canonicalize_dtype(result_type(m, onp.float64)), copy=False) + X = array(m, ndmin=2, dtype=dtypes.canonicalize_dtype( + result_type(m, onp.float64)), copy=False) if not rowvar and X.shape[0] != 1: X = X.T if X.shape[0] == 0: diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index c719a3ae8c8b..daae9027bcf5 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -24,12 +24,12 @@ from jax import jit from .. import lax from .. import lax_linalg +from .. import dtypes from .lax_numpy import _not_implemented from .lax_numpy import _wraps from . import lax_numpy as np from ..api import custom_transforms, defjvp from ..util import get_module_functions -from ..lib import xla_bridge _T = lambda x: np.swapaxes(x, -1, -2) @@ -40,7 +40,7 @@ def _promote_arg_dtypes(*args): def _to_inexact_type(type): return type if np.issubdtype(type, np.inexact) else np.float64 inexact_types = [_to_inexact_type(np._dtype(arg)) for arg in args] - dtype = xla_bridge.canonicalize_dtype(np.result_type(*inexact_types)) + dtype = dtypes.canonicalize_dtype(np.result_type(*inexact_types)) args = [lax.convert_element_type(arg, dtype) for arg in args] if len(args) == 1: return args[0] diff --git a/jax/random.py b/jax/random.py index 684115808f61..8e56b8c9c3c9 100644 --- a/jax/random.py +++ b/jax/random.py @@ -31,6 +31,7 @@ from . import lax from . import numpy as np from . import tree_util +from . import dtypes from .api import custom_transforms, defjvp, jit, vmap from .numpy.lax_numpy import _constant_like, asarray, stack from jax.lib import xla_bridge @@ -75,7 +76,7 @@ def _is_prng_key(key): def _make_rotate_left(dtype): if not np.issubdtype(dtype, onp.integer): raise TypeError("_rotate_left only accepts integer dtypes.") - nbits = onp.array(onp.iinfo(dtype).bits, dtype) + nbits = onp.array(np.iinfo(dtype).bits, dtype) def _rotate_left(x, d): if lax.dtype(d) != lax.dtype(x): @@ -225,7 +226,7 @@ def _random_bits(key, bit_width, shape): if bit_width not in (32, 64): raise TypeError("requires 32- or 64-bit field width.") max_count = (bit_width // 32) * onp.prod(shape) - if max_count >= onp.iinfo(onp.uint32).max: + if max_count >= np.iinfo(onp.uint32).max: # TODO(mattjj): just split the key here raise TypeError("requesting more random bits than a single call provides.") @@ -270,7 +271,7 @@ def uniform(key, shape=(), dtype=onp.float64, minval=0., maxval=1.): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _uniform(key, shape, dtype, minval, maxval) @partial(jit, static_argnums=(1, 2)) @@ -281,7 +282,7 @@ def _uniform(key, shape, dtype, minval, maxval): minval = lax.convert_element_type(minval, dtype) maxval = lax.convert_element_type(maxval, dtype) - finfo = onp.finfo(dtype) + finfo = np.finfo(dtype) nbits, nmant = finfo.bits, finfo.nmant if nbits not in (32, 64): @@ -318,7 +319,7 @@ def randint(key, shape, minval, maxval, dtype=onp.int64): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _randint(key, shape, minval, maxval, dtype) @partial(jit, static_argnums=(1, 4)) @@ -329,7 +330,7 @@ def _randint(key, shape, minval, maxval, dtype): minval = lax.convert_element_type(minval, dtype) maxval = lax.convert_element_type(maxval, dtype) - nbits = onp.iinfo(dtype).bits + nbits = np.iinfo(dtype).bits if nbits not in (32, 64): raise TypeError("randint only accepts 32- or 64-bit dtypes.") @@ -392,7 +393,7 @@ def _shuffle(key, x, axis): # Section 2 of http://people.csail.mit.edu/costis/6896sp11/lec5s.pdf for # another analysis (where the keys are generated one bit at a time). exponent = 3 # see tjablin@'s analysis for explanation of this parameter - uint32max = onp.iinfo(onp.uint32).max + uint32max = np.iinfo(onp.uint32).max num_rounds = int(onp.ceil(exponent * onp.log(x.size) / onp.log(uint32max))) for _ in range(num_rounds): @@ -416,7 +417,7 @@ def normal(key, shape=(), dtype=onp.float64): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _normal(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -449,7 +450,7 @@ def multivariate_normal(key, mean, cov, shape=None, dtype=onp.float64): ``shape + mean.shape[-1:]`` if ``shape`` is not None, or else ``broadcast_shapes(mean.shape[:-1], cov.shape[:-2]) + mean.shape[-1:]``. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _multivariate_normal(key, mean, cov, shape, dtype) @partial(jit, static_argnums=(3, 4)) @@ -496,7 +497,7 @@ def truncated_normal(key, lower, upper, shape=None, dtype=onp.float64): A random array with the specified dtype and shape given by ``shape`` if ``shape`` is not None, or else by broadcasting ``lower`` and ``upper``. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _truncated_normal(key, lower, upper, shape, dtype) @partial(jit, static_argnums=(3, 4)) @@ -511,7 +512,7 @@ def _truncated_normal(key, lower, upper, shape, dtype): b = lax.erf(lax.convert_element_type(upper, dtype) / sqrt2) if not np.issubdtype(dtype, onp.floating): raise TypeError("truncated_normal only accepts floating point dtypes.") - u = uniform(key, shape, dtype, minval=onp.finfo(dtype).tiny) + u = uniform(key, shape, dtype, minval=np.finfo(dtype).tiny) return sqrt2 * lax.erf_inv(a + u * (b - a)) @@ -530,7 +531,7 @@ def bernoulli(key, p=onp.float32(0.5), shape=None): A random array with boolean dtype and shape given by ``shape`` if ``shape`` is not None, or else ``p.shape``. """ - dtype = xla_bridge.canonicalize_dtype(lax.dtype(p)) + dtype = dtypes.canonicalize_dtype(lax.dtype(p)) if not np.issubdtype(dtype, onp.floating): msg = "bernoulli probability `p` must have a floating dtype, got {}." raise TypeError(msg.format(dtype)) @@ -566,7 +567,7 @@ def beta(key, a, b, shape=None, dtype=onp.float64): A random array with the specified dtype and shape given by ``shape`` if ``shape`` is not None, or else by broadcasting ``a`` and ``b``. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _beta(key, a, b, shape, dtype) @partial(jit, static_argnums=(3, 4)) @@ -597,13 +598,13 @@ def cauchy(key, shape=(), dtype=onp.float64): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _cauchy(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) def _cauchy(key, shape, dtype): _check_shape("cauchy", shape) - u = uniform(key, shape, dtype, minval=onp.finfo(dtype).eps, maxval=1.) + u = uniform(key, shape, dtype, minval=np.finfo(dtype).eps, maxval=1.) pi = _constant_like(u, onp.pi) return lax.tan(lax.mul(pi, lax.sub(u, _constant_like(u, 0.5)))) @@ -628,7 +629,7 @@ def dirichlet(key, alpha, shape=None, dtype=onp.float64): ``shape + (alpha.shape[-1],)`` if ``shape`` is not None, or else ``alpha.shape``. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _dirichlet(key, alpha, shape, dtype) @partial(jit, static_argnums=(2, 3)) @@ -660,7 +661,7 @@ def exponential(key, shape=(), dtype=onp.float64): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _exponential(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -724,7 +725,7 @@ def _next_kxv(kxv): # initial state is chosen such that _cond_fn will return True _, _, V, _ = lax.while_loop(_cond_fn, _body_fn, (key, zero, one, _constant_like(alpha, 2))) z = lax.mul(lax.mul(d, V), boost) - return lax.select(lax.eq(z, zero), onp.finfo(z.dtype).tiny, z) + return lax.select(lax.eq(z, zero), np.finfo(z.dtype).tiny, z) _bivariate_coef = [[0.16009398, -0.094634816, 0.025146379, -0.0030648348, 1, 0.3266811, 0.10406087, 0.0014179033], @@ -861,7 +862,7 @@ def gamma(key, a, shape=None, dtype=onp.float64): A random array with the specified dtype and with shape given by ``shape`` if ``shape`` is not None, or else by ``a.shape``. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _gamma(key, a, shape, dtype) @partial(jit, static_argnums=(2, 3)) @@ -890,14 +891,14 @@ def gumbel(key, shape=(), dtype=onp.float64): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _gumbel(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) def _gumbel(key, shape, dtype): _check_shape("gumbel", shape) return -np.log(-np.log( - uniform(key, shape, dtype, minval=onp.finfo(dtype).eps, maxval=1.))) + uniform(key, shape, dtype, minval=np.finfo(dtype).eps, maxval=1.))) def laplace(key, shape=(), dtype=onp.float64): @@ -913,7 +914,7 @@ def laplace(key, shape=(), dtype=onp.float64): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _laplace(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -937,7 +938,7 @@ def logistic(key, shape=(), dtype=onp.float64): Returns: A random array with the specified shape and dtype. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _logistic(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -963,7 +964,7 @@ def pareto(key, b, shape=None, dtype=onp.float64): A random array with the specified dtype and with shape given by ``shape`` if ``shape`` is not None, or else by ``b.shape``. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _pareto(key, b, shape, dtype) @partial(jit, static_argnums=(2, 3)) @@ -995,7 +996,7 @@ def t(key, df, shape=(), dtype=onp.float64): A random array with the specified dtype and with shape given by ``shape`` if ``shape`` is not None, or else by ``df.shape``. """ - dtype = xla_bridge.canonicalize_dtype(dtype) + dtype = dtypes.canonicalize_dtype(dtype) return _t(key, df, shape, dtype) @partial(jit, static_argnums=(2, 3)) diff --git a/jax/test_util.py b/jax/test_util.py index 1308bcd2ed69..ba16329116b5 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -31,6 +31,7 @@ from six.moves import xrange from . import api +from . import dtypes from .config import flags from .util import partial from .tree_util import tree_multimap, tree_all, tree_map, tree_reduce @@ -113,7 +114,7 @@ def rand_like(rng, x): shape = onp.shape(x) dtype = _dtype(x) randn = lambda: onp.asarray(rng.randn(*shape), dtype=dtype) - if onp.issubdtype(dtype, onp.complexfloating): + if dtypes.issubdtype(dtype, onp.complexfloating): return randn() + dtype.type(1.0j) * randn() else: return randn() @@ -299,7 +300,7 @@ def _rand_dtype(rand, shape, dtype, scale=1., post=lambda x: x): to rand but scaled, converted to the appropriate dtype, and post-processed. """ r = lambda: onp.asarray(scale * rand(*_dims_of_shape(shape)), dtype) - if onp.issubdtype(dtype, onp.complexfloating): + if dtypes.issubdtype(dtype, onp.complexfloating): vals = r() + 1.0j * r() else: vals = r() @@ -370,11 +371,11 @@ def rand_some_inf(): """ def rand(shape, dtype): """The random sampler function.""" - if not onp.issubdtype(dtype, onp.floating): + if not dtypes.issubdtype(dtype, onp.floating): # only float types have inf return base_rand(shape, dtype) - if onp.issubdtype(dtype, onp.complexfloating): + if dtypes.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) @@ -397,11 +398,11 @@ def rand_some_nan(): def rand(shape, dtype): """The random sampler function.""" - if onp.issubdtype(dtype, onp.complexfloating): + if dtypes.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) - if not onp.issubdtype(dtype, onp.floating): + if not dtypes.issubdtype(dtype, onp.floating): # only float types have inf return base_rand(shape, dtype) @@ -426,11 +427,11 @@ def rand_some_inf_and_nan(): """ def rand(shape, dtype): """The random sampler function.""" - if not onp.issubdtype(dtype, onp.floating): + if not dtypes.issubdtype(dtype, onp.floating): # only float types have inf return base_rand(shape, dtype) - if onp.issubdtype(dtype, onp.complexfloating): + if dtypes.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 4c9613b673dd..11dd4867279f 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -412,7 +412,7 @@ def testStaticIndexing(self, shape, dtype, rng_factory, indexer): for rng_factory in [jtu.rand_default]) def testStaticIndexingGrads(self, shape, dtype, rng_factory, indexer): rng = rng_factory() - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = 1e-2 if lnp.finfo(dtype).bits == 32 else None arg = rng(shape, dtype) fun = lambda x: x[indexer]**2 check_grads(fun, (arg,), 2, tol, tol, tol) @@ -526,7 +526,7 @@ def fun(x, unpacked_indexer): for rng_factory in [jtu.rand_default]) def testDynamicIndexingWithIntegersGrads(self, shape, dtype, rng_factory, indexer): rng = rng_factory() - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = 1e-2 if lnp.finfo(dtype).bits == 32 else None unpacked_indexer, pack_indexer = self._ReplaceSlicesWithTuples(indexer) @api.jit @@ -606,7 +606,7 @@ def testAdvancedIntegerIndexing(self, shape, dtype, rng_factory, indexer): for rng_factory in [jtu.rand_default]) def testAdvancedIntegerIndexingGrads(self, shape, dtype, rng_factory, indexer): rng = rng_factory() - tol = 1e-2 if onp.finfo(dtype).bits == 32 else None + tol = 1e-2 if lnp.finfo(dtype).bits == 32 else None arg = rng(shape, dtype) fun = lambda x: x[indexer]**2 check_grads(fun, (arg,), 2, tol, tol, tol) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index c8bf57117393..7e3416718b18 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -38,9 +38,9 @@ from jax import linear_util from jax import numpy as lnp from jax import test_util as jtu +from jax import dtypes from jax.interpreters import partial_eval from jax.test_util import check_grads -from jax.lib import xla_bridge from jax.config import config config.parse_flags_with_absl() @@ -320,7 +320,7 @@ def _dtypes_are_compatible_for_bitwise_ops(args): if len(args) <= 1: return True is_signed = lambda dtype: lnp.issubdtype(dtype, onp.signedinteger) - width = lambda dtype: onp.iinfo(dtype).bits + width = lambda dtype: lnp.iinfo(dtype).bits x, y = args if width(x) > width(y): x, y = y, x @@ -446,7 +446,7 @@ def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, def testBitwiseOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes): rng = rng_factory() if not FLAGS.jax_enable_x64 and any( - onp.iinfo(dtype).bits == 64 for dtype in dtypes): + lnp.iinfo(dtype).bits == 64 for dtype in dtypes): self.skipTest("x64 types are disabled by jax_enable_x64") args_maker = self._GetArgsMaker(rng, shapes, dtypes) self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, @@ -1682,7 +1682,7 @@ def testVander(self, shape, dtype, n, increasing, rng_factory): for dtype in inexact_dtypes)) def testNanToNum(self, rng_factory, shape, dtype): rng = rng_factory() - dtype = onp.dtype(xla_bridge.canonicalize_dtype(dtype)).type + dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)).type args_maker = lambda: [rng(shape, dtype)] self._CheckAgainstNumpy(onp.nan_to_num, lnp.nan_to_num, args_maker, check_dtypes=True) @@ -1907,7 +1907,7 @@ def testIssue777(self): def testMathSpecialFloatValues(self, op, dtype): onp_op = getattr(onp, op) lnp_op = getattr(lnp, op) - dtype = onp.dtype(xla_bridge.canonicalize_dtype(dtype)).type + dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)).type for x in (onp.nan, -onp.inf, -100., -2., -1., 0., 1., 2., 100., onp.inf, lnp.finfo(dtype).max, onp.sqrt(lnp.finfo(dtype).max), onp.sqrt(lnp.finfo(dtype).max) * 2.): @@ -2318,7 +2318,7 @@ def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): ] def num_float_bits(dtype): - return lnp.finfo(xla_bridge.canonicalize_dtype(dtype)).bits + return lnp.finfo(dtypes.canonicalize_dtype(dtype)).bits class NumpyGradTests(jtu.JaxTestCase): @parameterized.named_parameters(itertools.chain.from_iterable( diff --git a/tests/lax_test.py b/tests/lax_test.py index 3676c7bbe697..062cb84f5a7e 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -34,9 +34,9 @@ from jax import lax from jax import test_util as jtu from jax import lax_reference +from jax import dtypes from jax.test_util import check_grads from jax.interpreters import xla -from jax.lib import xla_bridge from jax.lib import xla_client from jax.config import config @@ -45,7 +45,7 @@ def num_float_bits(dtype): - return onp.finfo(xla_bridge.canonicalize_dtype(dtype)).bits + return dtypes.finfo(dtypes.canonicalize_dtype(dtype)).bits ### lax tests @@ -1116,28 +1116,28 @@ def testTransposeAgainstNumpy(self, shape, dtype, perm, rng_factory): init_val), "op": op, "init_val": init_val, "shape": shape, "dtype": dtype, "dims": dims, "rng_factory": rng_factory} - for init_val, op, dtypes in [ + for init_val, op, types in [ (0, lax.add, default_dtypes), (1, lax.mul, default_dtypes), (0, lax.max, all_dtypes), # non-monoidal (-onp.inf, lax.max, float_dtypes), - (onp.iinfo(onp.int32).min, lax.max, [onp.int32]), - # (onp.iinfo(onp.int64).min, lax.max, [onp.int64]), # TODO fails - (onp.iinfo(onp.uint32).min, lax.max, [onp.uint32]), - (onp.iinfo(onp.uint64).min, lax.max, [onp.uint64]), + (dtypes.iinfo(onp.int32).min, lax.max, [onp.int32]), + # (dtypes.iinfo(onp.int64).min, lax.max, [onp.int64]), # TODO fails + (dtypes.iinfo(onp.uint32).min, lax.max, [onp.uint32]), + (dtypes.iinfo(onp.uint64).min, lax.max, [onp.uint64]), (onp.inf, lax.min, float_dtypes), - (onp.iinfo(onp.int32).max, lax.min, [onp.int32]), - # (onp.iinfo(onp.int64).max, lax.min, [onp.int64]), # TODO fails - (onp.iinfo(onp.uint32).max, lax.min, [onp.uint32]), - (onp.iinfo(onp.uint64).max, lax.min, [onp.uint64]), + (dtypes.iinfo(onp.int32).max, lax.min, [onp.int32]), + # (dtypes.iinfo(onp.int64).max, lax.min, [onp.int64]), # TODO fails + (dtypes.iinfo(onp.uint32).max, lax.min, [onp.uint32]), + (dtypes.iinfo(onp.uint64).max, lax.min, [onp.uint64]), ] - for dtype in dtypes + for dtype in types for shape, dims in [ [(3, 4, 5), (0,)], [(3, 4, 5), (1, 2)], [(3, 4, 5), (0, 2)], [(3, 4, 5), (0, 1, 2)] ] for rng_factory in [ - jtu.rand_default if onp.issubdtype(dtype, onp.integer) + jtu.rand_default if dtypes.issubdtype(dtype, onp.integer) else jtu.rand_small])) def testReduce(self, op, init_val, shape, dtype, dims, rng_factory): rng = rng_factory() @@ -1576,7 +1576,7 @@ def testFilledConstant(self, shape, fill_value, dtype): def testIotaConstant(self, dtype, shape, dimension): make_const = lambda: lax.broadcasted_iota(dtype, shape, dimension) - arr = onp.arange(shape[dimension], dtype=xla_bridge.canonicalize_dtype(dtype)) + arr = onp.arange(shape[dimension], dtype=dtypes.canonicalize_dtype(dtype)) singleton_shape = [1] * len(shape) singleton_shape[dimension] = shape[dimension] expected = onp.broadcast_to(arr.reshape(singleton_shape), shape) @@ -2252,8 +2252,8 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng_factory): operand = rng(shape, dtype) init_val = onp.asarray(init_val, dtype=dtype) reduce = lambda operand: lax.reduce(operand, init_val, op, dims) - eps = (1.0 if onp.finfo(dtype).bits == 16 and op is lax.add else - 1e-2 if onp.finfo(dtype).bits == 32 else None) + eps = (1.0 if dtypes.finfo(dtype).bits == 16 and op is lax.add else + 1e-2 if dtypes.finfo(dtype).bits == 32 else None) check_grads(reduce, (operand,), 1, ["fwd", "rev"], tol, tol, eps) @parameterized.named_parameters(jtu.cases_from_list( @@ -2598,7 +2598,7 @@ def testConvGeneralDilatedBatching( self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, dimension_numbers, perms, feature_group_count, lhs_bdim, rhs_bdim, rng_factory): rng = rng_factory() - tol = 1e-1 if onp.finfo(dtype).bits <= 32 else 1e-3 + tol = 1e-1 if dtypes.finfo(dtype).bits <= 32 else 1e-3 # permute shapes to match dim_spec, scale by feature_group_count lhs_perm, rhs_perm = perms @@ -2880,15 +2880,15 @@ def testTranspose(self, shape, dtype, perm, bdims, rng_factory): (1, lax.mul, default_dtypes), (0, lax.max, all_dtypes), # non-monoidal (-onp.inf, lax.max, float_dtypes), - (onp.iinfo(onp.int32).min, lax.max, [onp.int32]), - (onp.iinfo(onp.int64).min, lax.max, [onp.int64]), - (onp.iinfo(onp.uint32).min, lax.max, [onp.uint32]), - (onp.iinfo(onp.uint64).min, lax.max, [onp.uint64]), + (dtypes.iinfo(onp.int32).min, lax.max, [onp.int32]), + (dtypes.iinfo(onp.int64).min, lax.max, [onp.int64]), + (dtypes.iinfo(onp.uint32).min, lax.max, [onp.uint32]), + (dtypes.iinfo(onp.uint64).min, lax.max, [onp.uint64]), (onp.inf, lax.min, float_dtypes), - (onp.iinfo(onp.int32).max, lax.min, [onp.int32]), - (onp.iinfo(onp.int64).max, lax.min, [onp.int64]), - (onp.iinfo(onp.uint32).max, lax.min, [onp.uint32]), - (onp.iinfo(onp.uint64).max, lax.min, [onp.uint64]), + (dtypes.iinfo(onp.int32).max, lax.min, [onp.int32]), + (dtypes.iinfo(onp.int64).max, lax.min, [onp.int64]), + (dtypes.iinfo(onp.uint32).max, lax.min, [onp.uint32]), + (dtypes.iinfo(onp.uint64).max, lax.min, [onp.uint64]), ] for dtype in dtypes for shape, dims in [ diff --git a/tests/linalg_test.py b/tests/linalg_test.py index cf919fb5afee..2f131b568c2d 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -81,7 +81,7 @@ def args_maker(): check_dtypes=True, tol=1e-3) self._CompileAndCheck(np.linalg.cholesky, args_maker, check_dtypes=True) - if onp.finfo(dtype).bits == 64: + if np.finfo(dtype).bits == 64: jtu.check_grads(np.linalg.cholesky, args_maker(), order=2) @parameterized.named_parameters(jtu.cases_from_list( @@ -162,7 +162,7 @@ def testEig(self, shape, dtype, rng_factory): # Norm, adjusted for dimension and type. def norm(x): norm = onp.linalg.norm(x, axis=(-2, -1)) - return norm / ((n + 1) * onp.finfo(dtype).eps) + return norm / ((n + 1) * np.finfo(dtype).eps) a, = args_maker() w, v = np.linalg.eig(a) @@ -232,7 +232,7 @@ def testEigh(self, n, dtype, lower, rng_factory): # Norm, adjusted for dimension and type. def norm(x): norm = onp.linalg.norm(x, axis=(-2, -1)) - return norm / ((n + 1) * onp.finfo(dtype).eps) + return norm / ((n + 1) * np.finfo(dtype).eps) a, = args_maker() a = (a + onp.conj(a.T)) / 2 @@ -416,7 +416,7 @@ def testSVD(self, b, m, n, dtype, full_matrices, compute_uv, rng_factory): # Norm, adjusted for dimension and type. def norm(x): norm = onp.linalg.norm(x, axis=(-2, -1)) - return norm / (max(m, n) * onp.finfo(dtype).eps) + return norm / (max(m, n) * np.finfo(dtype).eps) a, = args_maker() out = np.linalg.svd(a, full_matrices=full_matrices, compute_uv=compute_uv) @@ -487,7 +487,7 @@ def testQr(self, shape, dtype, full_matrices, rng_factory): # Norm, adjusted for dimension and type. def norm(x): n = onp.linalg.norm(x, axis=(-2, -1)) - return n / (max_rank * onp.finfo(dtype).eps) + return n / (max_rank * np.finfo(dtype).eps) def compare_orthogonal(q1, q2): # Q is unique up to sign, so normalize the sign first. diff --git a/tests/random_test.py b/tests/random_test.py index c4adf71fea8b..0e135dde7e3f 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -67,7 +67,7 @@ def testNumpyAndXLAAgreeOnFloatEndianness(self, dtype): if not FLAGS.jax_enable_x64 and np.issubdtype(dtype, onp.float64): raise SkipTest("can't test float64 agreement") - bits_dtype = onp.uint32 if onp.finfo(dtype).bits == 32 else onp.uint64 + bits_dtype = onp.uint32 if np.finfo(dtype).bits == 32 else onp.uint64 numpy_bits = onp.array(1., dtype).view(bits_dtype) xla_bits = api.jit( lambda: lax.bitcast_convert_type(onp.array(1., dtype), bits_dtype))() @@ -107,7 +107,7 @@ def testRngUniform(self, dtype): compiled_samples = crand(key) for samples in [uncompiled_samples, compiled_samples]: - self._CheckCollisions(samples, onp.finfo(dtype).nmant) + self._CheckCollisions(samples, np.finfo(dtype).nmant) self._CheckKolmogorovSmirnovCDF(samples, scipy.stats.uniform().cdf) @parameterized.named_parameters(jtu.cases_from_list( From 4fc765241f4317d4f61e7cb4acafbf2272a83fa0 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 15 Nov 2019 14:55:26 -0500 Subject: [PATCH 0357/1053] Drop protobuf dependency from `jax` package. It appears unused. (#1700) --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 52dabf39c67c..f4f3b7af5788 100644 --- a/setup.py +++ b/setup.py @@ -28,8 +28,7 @@ author_email='jax-dev@google.com', packages=find_packages(exclude=["examples"]), install_requires=[ - 'numpy>=1.12', 'six', 'protobuf>=3.6.0', 'absl-py', 'opt_einsum', - 'fastcache' + 'numpy>=1.12', 'six', 'absl-py', 'opt_einsum', 'fastcache' ], url='https://github.com/google/jax', license='Apache-2.0', From 9b853a4255c4219a2e79e58afb865898687b74d5 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 16 Nov 2019 11:01:36 -0500 Subject: [PATCH 0358/1053] Update XLA. (#1702) Add support for building a CPU-only jaxlib with a CUDA-enabled toolchain. --- WORKSPACE | 6 +++--- build/build.py | 9 +++++++++ build/build_wheel_docker_entrypoint.sh | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23ab75905997..40fda0288ce9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "cf32fabf086a12f52d1e3dd87eac9b44d44f76713030c45e22d1913ed1edb4d0", - strip_prefix = "tensorflow-d55375021a36e404015abb3439e631f9fac59838", + sha256 = "f0be98a469fcefab7a48721db63ea28fab24c08fd5171214978f88f02d0f07ad", + strip_prefix = "tensorflow-2bc7129de76dc6fdaab5619aaecf7a6bbfa17104", urls = [ - "https://github.com/tensorflow/tensorflow/archive/d55375021a36e404015abb3439e631f9fac59838.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/2bc7129de76dc6fdaab5619aaecf7a6bbfa17104.tar.gz", ], ) diff --git a/build/build.py b/build/build.py index 2bc28289e9aa..96ca6fef3c99 100755 --- a/build/build.py +++ b/build/build.py @@ -280,6 +280,13 @@ def main(): parser, "enable_cuda", help_str="Should we build with CUDA enabled? Requires CUDA and CuDNN.") + add_boolean_argument( + parser, + "include_gpu_backend_if_cuda_enabled", + default=True, + help_str="If CUDA is enabled, should we build the GPU backend? This is " + "mostly useful to build a CPU-only build with a CUDA-enabled " + "toolchain.") parser.add_argument( "--cuda_path", default=None, @@ -334,6 +341,8 @@ def main(): config_args += ["--config=mkl_open_source_only"] if args.enable_cuda: config_args += ["--config=cuda"] + if args.include_gpu_backend_if_cuda_enabled: + config_args += ["--define=xla_python_enable_gpu=true"] shell( [bazel_path] + args.bazel_startup_options + ["run", "--verbose_failures=true"] + config_args + diff --git a/build/build_wheel_docker_entrypoint.sh b/build/build_wheel_docker_entrypoint.sh index c5df29d11571..d64786274175 100755 --- a/build/build_wheel_docker_entrypoint.sh +++ b/build/build_wheel_docker_entrypoint.sh @@ -49,7 +49,8 @@ case $2 in PLAT_NAME="linux_x86_64" ;; nocuda) - python build.py --bazel_startup_options="--output_user_root=/build/root" + python build.py --enable_cuda --include_gpu_backend_if_cuda_enabled=false \ + --bazel_startup_options="--output_user_root=/build/root" PLAT_NAME="manylinux2010_x86_64" ;; *) From d24c374d591165ce81029c4d6a691e9e6a4ff317 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 13 Oct 2019 14:51:21 +0200 Subject: [PATCH 0359/1053] An implementation of an experimental syntactic sugar for 'for' loops. See description in jax/experimental/loops.py. --- docs/jax.experimental.loops.rst | 6 + docs/jax.experimental.rst | 1 + jax/experimental/loops.py | 504 +++++++++++++++++++++++++++++++ jax/interpreters/partial_eval.py | 2 +- tests/loops_test.py | 369 ++++++++++++++++++++++ 5 files changed, 881 insertions(+), 1 deletion(-) create mode 100644 docs/jax.experimental.loops.rst create mode 100644 jax/experimental/loops.py create mode 100644 tests/loops_test.py diff --git a/docs/jax.experimental.loops.rst b/docs/jax.experimental.loops.rst new file mode 100644 index 000000000000..981eb5845d19 --- /dev/null +++ b/docs/jax.experimental.loops.rst @@ -0,0 +1,6 @@ +jax.experimental.loops module +============================= + +.. automodule:: jax.experimental.loops + :members: + :show-inheritance: \ No newline at end of file diff --git a/docs/jax.experimental.rst b/docs/jax.experimental.rst index c4db97a141f7..5ccc7ddeb683 100644 --- a/docs/jax.experimental.rst +++ b/docs/jax.experimental.rst @@ -4,6 +4,7 @@ jax.experimental package .. toctree:: :maxdepth: 1 + jax.experimental.loops jax.experimental.optimizers jax.experimental.stax jax.experimental.vectorize diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py new file mode 100644 index 000000000000..2f8d54efda34 --- /dev/null +++ b/jax/experimental/loops.py @@ -0,0 +1,504 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Loops is an **experimental** module for syntactic sugar for loops and control-flow in JAX. + +The current implementation should convert loops correctly to JAX internal representation, and most transformation +should work (see below), but we have not yet fine-tuned the performance of the resulting XLA compilation! + +By default, loops and control-flow in JAX are executed and inlined during tracing. For example, in the following code +the `for` loop is unrolled during JAX tracing:: + + arr = np.zeros(5) + for i in range(arr.shape[0]): + arr[i] = i + 2 + if i % 2 == 0: + arr[i] += 1 + +In order to capture the structured control-flow one has to use the higher-order JAX operations, which require +you to express the body of the loops and conditionals as functions, +and the array updates using a functional style that returns an updated array, e.g.:: + + arr = np.zeros(5) + def loop_body(i, acc_arr): + let arr1 = lax.index_update(acc_arr, i, acc_arr[i] + 2) + return lax.cond(i % 2 == 0, + arr1, + lambda arr1: lax.index_update(arr1, i, arr1[i] + 1), + arr1, + lambda arr1: arr1) + arr = lax.fori(0, arr.shape[0], loop_body, arr) + +With the utilities in this module you can write loops and conditionals that look closer to plain Python, +as long as you keep the loop-carried state in a special `loops.scope` object and use `for` loops +over special `scope.range` iterators:: + + from jax.experimental import loops + with loops.scope() as s: + s.arr = np.zeros(5) # Must create the mutable state of the loop as `scope` fields. + for i in s.range(s.arr.shape[0]): + s.arr = lax.index_update(s.arr, i, s.arr[i] + 2) + for _ in s.cond_range(i % 2 == 0): # Conditionals are also sugared as loops with 0 or 1 iterations + s.arr = lax.index_update(s.arr, i, s.arr[i] + 1) + + +Notes: + * Loops and conditionals to be functionalized can appear only inside scopes constructed with `loops.Scope` + and they must use one of the `Scope.range` iterators. All other loops are unrolled during tracing, as usual in JAX. + * Only scope data (stored in fields of the scope object) is functionalized. All other state, e.g., in other + Python variables, will not be considered as being part of the loop output. + All references to the mutable state should be through the scope: `s.arr`. + * Conceptually, this model is still "functional" in the sense that a loop over a `Scope.range` behaves + as a function whose input and output is the scope data. + * Scopes should be passed down to callees that need to use loop functionalization, or they may be nested. + * The programming model is that the loop body over a `scope.range` is traced only once, using abstract shape values, + similar to how JAX traces function bodies. + +Restrictions: + * The tracing of the loop body should not exit prematurely with `return`, `exception`, `break`. + This would be detected and reported as errors when we encounter unnested scopes. + * The loop index variable should not be used after the loop. Similarly, one should not use outside the loop + data computed in the loop body, except data stored in fields of the scope object. + * No new mutable state can be created inside a loop to be functionalized. All mutable state must be created outside + all loops and conditionals. + * For a `while` loop, the conditional function is not allowed to modify the scope state. This is a checked error. + Also, for `while` loops the `grad` transformation does not work. An alternative that allows `grad` is a bounded + loop (`range`) with a conditional to ignore a suffix of iterations. + +Transformations: + * All transformations are supported, except `grad` is not supported for `Scope.while_range` loops. + * `vmap` is very useful for such loops because it pushes more work into the inner-loops, which should help + performance for accelerators. + +For usage example, see tests/loops_test.py. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +from functools import partial +import itertools +import numpy as onp +import traceback +from warnings import warn + +from jax import abstract_arrays +from jax import lax, core +from jax.lax import lax_control_flow +from jax import tree_util +from jax import numpy as jnp +from jax.interpreters import partial_eval as pe +from jax.util import unzip2, safe_map + + +class Scope(object): + """A scope context manager to keep the state of loop bodies for functionalization. + + Usage:: + + with Scope() as s: + s.data = 0. + for i in s.range(5): + s.data += 1. + return s.data + + """ + + def __init__(self): + self._mutable_state = {} # Keep here the state to be functionalized, indexed by name. + self._active_ranges = [] # The stack of active ranges, the last one is the innermost. + + def range(self, first, second=None, third=None): + """Creates a range for bounded iterations to be functionalized. + + The body is converted to a `lax.scan`, for which all JAX transformations work. + + Usage:: + + range(5) # start=0, end=5, step=1 + range(1, 5) # start=1, end=5, step=1 + range(1, 5, 2) # start=1, end=5, step=2 + + s.out = 1. + for i in scope.range(5): + s.out += 1. + """ + if third is not None: + start = int(first) + stop = int(second) + step = int(third) + else: + step = 1 + if second is not None: + start = int(first) + stop = int(second) + else: + start = 0 + stop = int(first) + return _BodyTracer(self, _BoundedLoopBuilder(start, stop, step)) + + def cond_range(self, pred): + """Creates a conditional range with 0 or 1 iterations based on the boolean "pred". + + The body is converted to a `lax.cond`. All JAX transformations work. + + Usage:: + + for _ in scope.cond_range(s.field < 0.): + s.field = - s.field + """ + # TODO: share these checks with lax_control_flow.cond + if len(onp.shape(pred)) != 0: + raise TypeError("Pred must be a scalar, got {} of shape {}.".format(pred, onp.shape(pred))) + + try: + pred_dtype = onp.result_type(pred) + except TypeError: + msg = ("Pred type must be either boolean or number, got {}.") + raise TypeError(msg.format(pred)) + + if pred_dtype.kind != 'b': + if pred_dtype.kind in 'iuf': + pred = pred != 0 + else: + msg = ("Pred type must be either boolean or number, got {}.") + raise TypeError(msg.format(pred_dtype)) + + return _BodyTracer(self, _CondBuilder(pred)) + + def while_range(self, cond_func): + """Creates a range that continues as long as `cond_func` returns true. + + The body is converted to a `lax.while_loop`. The `grad` transformation does not work. + + Usage:: + + for _ in scope.while_range(lambda: s.loss > 1.e-5): + s.loss = loss(...) + + Args: + cond_func: a lambda with no arguments, the condition for the "while". + """ + return _BodyTracer(self, _WhileBuilder(cond_func)) + + def _push_range(self, range): + for ar in self._active_ranges: + if ar is range: + raise ValueError("Range is reused nested inside itself.") # No need to include location, range is in stacktrace + self._active_ranges.append(range) + + def _pop_range(self, range): + if not (range is self._active_ranges[-1]): + self._error_premature_exit_range() + self._active_ranges.pop() + + def _error_premature_exit_range(self): + """Raises error about premature exit from a range""" + msg = "Some ranges have exited prematurely. The innermost such range is at\n{}" + raise ValueError(msg.format(self._active_ranges[-1].location())) + + def __getattr__(self, key): + """Accessor for scope data. + + Called only if the attribute is not found, which will happen when we read + scope data that has been stored in self._mutable_state. + """ + mt_val = self._mutable_state.get(key) + if mt_val is None: + raise AttributeError("Reading uninitialized data '{}' from the scope.".format(key)) + return mt_val + + def __setattr__(self, key, value): + """Update scope data to be functionalized. + + Called for *all* attribute setting. + """ + if key in ["_active_ranges", "_mutable_state"]: + object.__setattr__(self, key, value) + else: + if self._active_ranges and key not in self._mutable_state: + raise ValueError("New mutable state '{}' cannot be created inside a loop.".format(key)) + self._mutable_state[key] = value + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_type is None: + if self._active_ranges: # We have some ranges that we did not exit properly + self._error_premature_exit_range() + return True + else: + # The exception may come from inside one or more ranges. We let the current + # exception propagate, assuming it terminates the tracing. If not, the + # tracers may be left in an inconsistent state. + return False # re-raise + + +class _BodyTracer(object): + """Traces the body of the loop and builds a functional control-flow representation. + + This class is also an iterator, only the first iteration is traced. + """ + + def __init__(self, scope, loop_builder): + """ + Params: + scope: the current scope + loop_builder: instance of _LoopBuilder + """ + self.scope = scope + self.loop_builder = loop_builder + self.first_iteration = True # If we are tracing the first iteration + self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) # Stack trace, without this line and the s.range function + + # The rest is state kept from the start of the first iteration to the end of the iteration. + self.carried_state_initial = {} # The initial values of the mutable state upon entering the range body. + self.carried_state_vars = {} # The parameters that were created for state upon entering an arbitrary iteration. + + self.trace = None + self.carried_state_names = None # List of scope fields carried through the loop + self.init_tree = None # The PyTreeDef corresponding to carried_state_names + self.init_vals = None # The values corresponding to self.init_tree + + def location(self): + """A multiline string representing the source location of the range.""" + return " ".join(self.stack.format()) + + def __iter__(self): + """Called before starting the first iteration.""" + self.first_iteration = True # In case we reuse the range + return self + + def __next__(self): + if self.first_iteration: + self.first_iteration = False + self.scope._push_range(self) + self.start_tracing_body() + return self._index_var + else: + self.end_tracing_body() + self.scope._pop_range(self) + raise StopIteration # Trace only one iteration. + + def start_tracing_body(self): + """Called upon starting the tracing of the loop body.""" + # Make a copy of the current value of the mutable state + self.carried_state_initial = copy.copy(self.scope._mutable_state) + # The entire state is carried. + self.carried_state_names = sorted(self.scope._mutable_state.keys()) + + # TODO: This is the first part of partial_eval.trace_to_subjaxpr. Share. + self.trace = _BodyTracer.start_subtrace() + # Set the scope._mutable_state to new tracing variables. + for key, initial in self.carried_state_initial.items(): + mt_aval = _BodyTracer.abstractify(initial) + mt_pval = pe.PartialVal((mt_aval, core.unit)) + mt_var = self.trace.new_arg(mt_pval) + self.carried_state_vars[key] = mt_var + self.scope._mutable_state[key] = mt_var + + index_var_aval = _BodyTracer.abstractify(0) + index_var_pval = pe.PartialVal((index_var_aval, core.unit)) + self._index_var = self.trace.new_arg(index_var_pval) + + def end_tracing_body(self): + """Called when we are done tracing one iteration of the body.""" + # We will turn the body of the loop into a function that takes some values for the scope state (carried_state_names) + # and returns the values for the same state fields after one execution of the body. For some of the ranges, + # e.g., scope.range, the function will also take the index_var as last parameter. + in_tracers = [self.carried_state_vars[ms] for ms in self.carried_state_names] + if self.loop_builder.can_use_index_var(): + in_tracers += [self._index_var] + + # Make the jaxpr for the body of the loop + # TODO: See which mutable state was changed in the one iteration. For now, we assume all state changes. + body_out_tracers = tuple([self.scope._mutable_state[ms] for ms in self.carried_state_names]) + try: + # If the body actually uses the index variable, and is not allowed to (e.g., cond_range and while_range), + # then in_tracers will not contain the tracer for the index_var, and trace_to_jaxpr_finalize will throw + # an assertion error. + body_typed_jaxpr, body_const_vals = _BodyTracer.trace_to_jaxpr_finalize(in_tracers=in_tracers, + out_tracers=body_out_tracers, + trace=self.trace) + except AssertionError as e: + if "Encountered unexpected tracer" == str(e): + raise ValueError("Body of cond_range or while_range should not use the index variable returned by iterator.") + raise + _BodyTracer.end_subtrace() # End the subtrace for the loop body, before we trace the condition + + carried_init_val = tuple([self.carried_state_initial[ms] for ms in self.carried_state_names]) + carried_init_vals, carried_tree = tree_util.tree_flatten(carried_init_val) + + carried_out_vals = self.loop_builder.build_output_vals( + self.scope, self.carried_state_names, carried_tree, carried_init_vals, body_typed_jaxpr, body_const_vals) + carried_mutable_state_unflattened = tree_util.tree_unflatten(carried_tree, carried_out_vals) + + # Update the mutable state with the values of the changed vars, after the loop. + for ms, mv in zip(self.carried_state_names, carried_mutable_state_unflattened): + self.scope._mutable_state[ms] = mv + + @staticmethod + def start_subtrace(): + """Starts a nested trace, returns the Trace object.""" + # TODO: This follows the __enter__ part of core.new_master. share + level = core.trace_state.trace_stack.next_level(False) + master = core.MasterTrace(level, pe.JaxprTrace) + core.trace_state.trace_stack.push(master, False) + return pe.JaxprTrace(master, core.cur_sublevel()) + + @staticmethod + def end_subtrace(): + # TODO: This follows the __exit__ part of core.new_master + core.trace_state.trace_stack.pop(False) + + @staticmethod + def abstractify(x): + return abstract_arrays.raise_to_shaped(core.get_aval(x)) + + @staticmethod + def trace_to_jaxpr_finalize(in_tracers, out_tracers, trace, instantiate=True): + # TODO: This is the final part of the partial_eval.trace_to_subjaxpr. Share. + instantiate = [instantiate] * len(out_tracers) + out_tracers = safe_map(trace.full_raise, safe_map(core.full_lower, out_tracers)) + out_tracers = safe_map(partial(pe.instantiate_const_at, trace), instantiate, out_tracers) + jaxpr, consts, env = pe.tracers_to_jaxpr(in_tracers, out_tracers) + out_pvals = [t.pval for t in out_tracers] + # TODO: this is from partial_eval.trace_to_jaxpr. Share. + assert not env + + # TODO: this is from the final part of lax_control_flow._initial_style_jaxpr + out_avals = safe_map(abstract_arrays.raise_to_shaped, unzip2(out_pvals)[0]) + const_avals = tuple(abstract_arrays.raise_to_shaped(core.get_aval(c)) for c in consts) + + in_pvals = [t.pval for t in in_tracers] + in_avals = tuple(safe_map(abstract_arrays.raise_to_shaped, unzip2(in_pvals)[0])) + + typed_jaxpr = core.TypedJaxpr(pe.closure_convert_jaxpr(jaxpr), + (), const_avals + in_avals, out_avals) + return typed_jaxpr, consts + + +class _LoopBuilder(object): + """Abstract superclass for the loop builders""" + + def can_use_index_var(self): + """Whether this kind of loop can use the index var returned by the range iterator.""" + raise NotImplementedError + + def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): + """Builds the output values for the loop carried state. + + Params: + scope: the current Scope object. + carried_state_names: the list of names of mutable state fields that is carried through the body. + carried_tree: the PyTreeDef for the tuple of carried_state_names. + init_vals: the initial values on body entry corresponding to the init_tree. + body_typed_jaxpr: the Jaxpr for the body returning the new values of carried_state_names. + body_const_vals: the constant values for the body. + + Returns: + the output tracer corresponding to the lax primitive representing the loop. + """ + raise NotImplementedError + + def __str__(self): + raise NotImplementedError + + +class _BoundedLoopBuilder(_LoopBuilder): + """Builds a lax operation corresponding to a bounded range iteration.""" + + def __init__(self, start, stop, step): + self.start = start + self.stop = stop + self.step = step + self._index_var = None # The parameter for the index variable + + def can_use_index_var(self): + return True + + def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): + arange_val = jnp.arange(self.start, stop=self.stop, step=self.step) + return lax_control_flow.scan_p.bind(*itertools.chain(body_const_vals, init_vals, [arange_val]), + forward=True, length=arange_val.shape[0], jaxpr=body_typed_jaxpr, + num_consts=len(body_const_vals), num_carry=len(init_vals), + linear=(False,) * (len(body_const_vals) + len(init_vals) + 1)) + + +class _CondBuilder(_LoopBuilder): + """Builds a lax.cond operation.""" + + def __init__(self, pred): + self.pred = pred + + def can_use_index_var(self): + return False + + def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): + # Simulate a pass-through false branch + init_avals = safe_map(_BodyTracer.abstractify, init_vals) + false_body_typed_jaxpr, false_body_const_vals, _ = lax_control_flow._initial_style_jaxpr(lambda *args: args, + carried_tree, + tuple(init_avals)) + return lax_control_flow.cond_p.bind( + *itertools.chain([self.pred], body_const_vals, init_vals, false_body_const_vals, init_vals), + true_jaxpr=body_typed_jaxpr, false_jaxpr=false_body_typed_jaxpr, + true_nconsts=len(body_const_vals), false_nconsts=len(false_body_const_vals)) + + +class _WhileBuilder(_LoopBuilder): + """Builds a lax.while operation.""" + + def __init__(self, cond_func): + self.cond_func = cond_func # Function with 0 arguments (can reference the scope) + + def can_use_index_var(self): + return False + + def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): + # Trace the conditional function. cond_func takes 0 arguments, but for lax.while we need a conditional function + # that takes the carried_state_names. _initial_style_jaxpr will start its own trace and will create tracers for + # all the carried state. We must put these values in the scope._mutable_state before we trace the conditional + # function. + def cond_func_wrapped(*args): + assert len(args) == len(carried_state_names) + for ms, init_ms in zip(carried_state_names, args): + scope._mutable_state[ms] = init_ms + res = self.cond_func() + # Conditional function is not allowed to modify the scope state + for ms, init_ms in zip(carried_state_names, args): + if not (scope._mutable_state[ms] is init_ms): + msg = "Conditional function modifies scope.{} field." + raise ValueError(msg.format(ms)) + return res + + init_avals = safe_map(_BodyTracer.abstractify, init_vals) + cond_jaxpr, cond_consts, cond_tree = lax_control_flow._initial_style_jaxpr(cond_func_wrapped, + carried_tree, + tuple(init_avals)) + # TODO: share these checks with lax_control_flow.while + if not tree_util.treedef_is_leaf(cond_tree): + msg = "cond_fun must return a boolean scalar, but got pytree {}." + raise TypeError(msg.format(cond_tree)) + if cond_jaxpr.out_avals != [abstract_arrays.ShapedArray((), onp.bool_)]: + msg = "cond_fun must return a boolean scalar, but got output type(s) {}." + raise TypeError(msg.format(cond_jaxpr.out_avals)) + + return lax_control_flow.while_p.bind(*itertools.chain(cond_consts, body_const_vals, init_vals), + cond_nconsts=len(cond_consts), cond_jaxpr=cond_jaxpr, + body_nconsts=len(body_const_vals), body_jaxpr=body_typed_jaxpr) + diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index f2d00f9b4e7e..6ff450cddebd 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -400,7 +400,7 @@ def tracers_to_jaxpr(in_tracers, out_tracers): eqns.append(eqn_tracer_to_var(var, recipe)) processed_eqns.add(recipe.eqn_id) elif isinstance(recipe, LambdaBinding): - assert any(t is in_tracer for in_tracer in in_tracers) + assert any(t is in_tracer for in_tracer in in_tracers), "Encountered unexpected tracer" assert in_tracers, "Lambda binding with no args" elif isinstance(recipe, FreeVar): env[var(t)] = recipe.val diff --git a/tests/loops_test.py b/tests/loops_test.py new file mode 100644 index 000000000000..952b5b5e3e61 --- /dev/null +++ b/tests/loops_test.py @@ -0,0 +1,369 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the experimental/loops.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +import numpy as onp +import re + +from jax import api, ops +from jax import numpy as np +from jax import test_util as jtu +from jax.experimental import loops + + +class LoopsSugarTest(jtu.JaxTestCase): + + def test_scope_no_loops(self): + def f_op(r): + with loops.Scope() as s: + s.x = r + 1 + return s.x + self.assertAllClose(4.0, f_op(3.), check_dtypes=True) + + def test_loop_empty(self): + def f_op(r): + with loops.Scope() as s: + for _ in s.range(5): + pass + return r + + self.assertAllClose(3.0, f_op(3.), check_dtypes=True) + + def test_loop_1(self): + """One loop with one state var, with transforms.""" + def f_op(inc): + with loops.Scope() as s: + s.out = 10. + for _ in s.range(5): + s.out += inc + return s.out + def f_expected(inc): + return 10 + 5 * inc + self.assertAllClose(f_expected(2.), f_op(2.), check_dtypes=True) + self.assertAllClose(f_expected(2.), api.jit(f_op)(2.), check_dtypes=True) + self.assertAllClose(5., api.grad(f_op)(2.), check_dtypes=True) + self.assertAllClose(5., api.grad(f_op)(2.), check_dtypes=True) + inc_batch = onp.arange(5, dtype=onp.float32) + self.assertAllClose(np.array([f_expected(inc) for inc in inc_batch]), + api.vmap(f_op)(inc_batch), check_dtypes=True) + + + def test_loop_2(self): + """One loop, two state fields.""" + def f_op(inc): + with loops.Scope() as s: + s.out1 = 10. + s.out2 = 20. + for i in s.range(5): + s.out1 += inc + s.out2 += 1. + return (s.out1, s.out2) + + self.assertAllClose((10. + 2. * 5, 20. + 1. * 5), f_op(2.), check_dtypes=True) + + + def test_add_vectors(self): + def add_vec(x, y): + with loops.Scope() as s: + n = x.shape[0] + assert n == y.shape[0] + s.out = np.zeros(shape=[n], dtype=np.float32) + for i in s.range(n): + s.out = ops.index_add(s.out, i, x[i] + y[i]) + return s.out + + x = np.array([1., 2., 3.]) + y = np.array([4., 5., 6.]) + self.assertAllClose(np.add(x, y), add_vec(x, y), check_dtypes=True) + + def test_matmul(self): + def matmul(x, y): + with loops.Scope() as s: + n, m = x.shape + m1, p = y.shape + assert m == m1 + s.out = np.zeros(shape=[n, p], dtype=np.float32) + for i in s.range(n): + for j in s.range(p): + for k in s.range(m): + s.out = ops.index_add(s.out, (i, j), x[i, k] * y[k, j]) + return s.out + + x = np.array([[1., 2., 3.]]) # 1x3 + y = np.array([[4.], [5.], [6.]]) # 3x1 + self.assertAllClose(np.matmul(x, y), matmul(x, y), check_dtypes=True) + + def test_reuse_range(self): + """Ranges can be reused, as long as not nested in each other.""" + def f_op(): + with loops.Scope() as s: + r1 = s.range(5) + s.out = 0 + for _ in r1: + s.out += 1 + for _ in r1: + s.out += 1 + return s.out + + self.assertEqual(10, f_op()) + + + def test_loop_nested(self): + def f_op(inc): + with loops.Scope() as s: + s.out = 10. + for i in s.range(5): + s.out += inc + for j in s.range(6): + s.out += inc + return s.out + + self.assertAllClose(10. + 5 * (2. + 6 * 2.), f_op(2.), check_dtypes=True) + + def test_loop_mutable_used_but_not_changed(self): + def f_op(inc): + with loops.Scope() as s: + s.read_only = inc + s.out = 10. + for i in s.range(5): + s.out += s.read_only + # It is Ok to use regular Python variables outside loops. + save_to_other_var = s.out + + return save_to_other_var + + self.assertAllClose(10. + 5 * 2., f_op(2.), check_dtypes=True) + + def test_range_locations(self): + """Ranges have locations.""" + with loops.Scope() as s: + r = s.range(5) + cr = s.cond_range(True) + wr = s.while_range(lambda: True) + for range in [r, cr, wr]: + self.assertIn("loops_test.py", range.location()) + self.assertIn(self._testMethodName, range.location()) + + def test_error_reuse_range_nested(self): + """Ranges cannot be reused nested in their own iteration.""" + def f_op(): + with loops.Scope() as s: + r1 = s.range(5) + s.out = 0 + for _ in r1: + for _ in r1: + s.out += 1 + return s.out + + with self.assertRaisesWithLiteralMatch(ValueError, "Range is reused nested inside itself."): + f_op() + + def test_error_early_exit_range(self): + """Ranges do not support early exit from loop body.""" + def bad_function(exit_how="break"): + with loops.Scope() as s: + for i in s.range(555): + if exit_how == "break": + break + elif exit_how == "return": + return 1. + elif exit_how == "exception": + raise ValueError("test exception") + # Start another range, we get here after a "break" above + for i in s.range(5): + pass + return 0. + + with self.assertRaisesRegex(ValueError, + re.compile(("Some ranges have exited prematurely. The innermost such range is at" + ".*s.range.555."), re.DOTALL)): + bad_function("break") + with self.assertRaisesRegex(ValueError, "Some ranges have exited prematurely"): + bad_function("return") + # On exception exit, we let the exception propagate + with self.assertRaisesRegex(ValueError, "test exception"): + bad_function("exception") + + def test_error_early_exit_range_nested(self): + """Exit early from a nested range.""" + def bad_function(): + with loops.Scope() as s: + for i in s.range(5): # When we end this range, we'll find the inner range still active + for j in s.range(6): + break + return 0. + + with self.assertRaisesRegex(ValueError, "Some ranges have exited prematurely."): + bad_function() + + def test_loop_index_var_live_expect_fail(self): + """The index variable is live after the loop.""" + self.skipTest("Don't know how to check that index variable is not used after loop.") + def f_op(r): + with loops.Scope() as s: + for i in s.range(r): + pass + return i + + self.assertAllClose(4, f_op(4), check_dtypes=True) + + def test_error_new_state_in_loop(self): + """Error when creating new state in a loop.""" + def f_op(inc): + with loops.Scope() as s: + s.out = 10. + for i in s.range(5): + s.other_state = 1. + s.out += inc + return s.out + + with self.assertRaisesWithLiteralMatch(ValueError, + "New mutable state 'other_state' cannot be created inside a loop."): + f_op(2.) + + def test_error_range_ends_static(self): + def f_op(start, end, inc): + with loops.Scope() as s: + s.out = 0. + for i in s.range(start, end): + s.out += inc + return s.out + + self.assertAllClose(16., f_op(0, 4, 4.), check_dtypes=True) + # Ok to jit, as long as the start and end are static + self.assertAllClose(16., api.jit(f_op, static_argnums=(0, 1))(0, 4, 4.), check_dtypes=True) + with self.assertRaisesRegex(TypeError, "Abstract value passed to `int`, which requires a concrete value"): + self.assertAllClose(16., api.jit(f_op)(0, 4, 4.), check_dtypes=True) + with self.assertRaisesRegex(TypeError, "Abstract value passed to `int`, which requires a concrete value"): + self.assertAllClose(16., api.vmap(f_op)(np.zeros(10), np.ones(10), np.array([4.] * 10)), check_dtypes=True) + + def test_cond(self): + def f_op(inc): + with loops.Scope() as s: + s.out = 10. + for i in s.cond_range(inc > 0): + s.out += inc + return s.out + + self.assertAllClose(10. + 2., f_op(2.), check_dtypes=True) + self.assertAllClose(10., f_op(-2.), check_dtypes=True) + + def test_cond_state(self): + """Conditionals predicated on scope fields.""" + def f_op(init): + with loops.Scope() as s: + s.out = init + for _ in s.cond_range(s.out > 0.): + s.out *= 2. + return s.out + + self.assertAllClose(2. * 2., f_op(2.), check_dtypes=True) + self.assertAllClose(-2., f_op(-2.), check_dtypes=True) + + def test_cond_nested(self): + """Nested conditionals.""" + def f_expected(init): + """Multi-linear function. + x in (..0) x + 1. + x in [0..10) x + 1 + 2 + 4 + x in [10..) x + 1 + 2 + 4 + 8 + """ + out = init + if out >= 0.: + out += 2. + if out - 2. >= 10.: + out += 8. + out += 4. + out += 1. + return out + + def f_op(init): + with loops.Scope() as s: + s.out = init + for _ in s.cond_range(s.out >= 0.): + s.out += 2. + for _ in s.cond_range(s.out - 2. >= 10.): + s.out += 8. + s.out += 4. + s.out += 1. + return s.out + + for init in [-1., 0., 9., 10.]: + self.assertAllClose(f_expected(init), f_op(init), check_dtypes=True) + + + def test_error_cond_using_index_var(self): + """Conditionals should not use the iteration index value.""" + def f_op(inc): + with loops.Scope() as s: + s.out = 10. + for i in s.cond_range(inc > 0): + s.out += i + return s.out + + with self.assertRaisesWithLiteralMatch( + ValueError, + "Body of cond_range or while_range should not use the index variable returned by iterator."): + api.make_jaxpr(f_op)(2.) + + def test_while(self): + def f_op(init): + with loops.Scope() as s: + s.out = init + for _ in s.while_range(lambda: s.out < 5.): + s.out += 2. + s.out += 1. + return s.out + def f_expected(init): + out = init + while out < 5.: + out += 2. + out += 1. + return out + + self.assertAllClose(f_expected(2.), f_op(2.), check_dtypes=True) + self.assertAllClose(f_expected(2.), api.jit(f_op)(2.), check_dtypes=True) + self.assertAllClose(f_expected(1.), f_op(1.), check_dtypes=True) + init_batch = np.array([1., 2., 3.]) + self.assertAllClose(np.array([f_expected(init) for init in init_batch]), + api.vmap(f_op)(init_batch), check_dtypes=True) + + def test_error_while_cond_mutation(self): + """Disallow mutation in the while conditional.""" + def f_op(init): + with loops.Scope() as s: + s.out = init + + def cond_func(): + s.out += 1. # Not allowed + return s.out < 5. + + for _ in s.while_range(cond_func): + s.out += 2. + s.out += 1. + return s.out + + with self.assertRaisesWithLiteralMatch(ValueError, + "Conditional function modifies scope.out field."): + f_op(0.) + + +if __name__ == '__main__': + absltest.main() From 64e186c337e8741dff38ace4ad217357356438a1 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 16 Nov 2019 18:05:45 +0100 Subject: [PATCH 0360/1053] Fix tests for Python 2 and for X64 --- jax/experimental/loops.py | 12 +++++++++--- tests/loops_test.py | 21 ++++++++++++--------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index 2f8d54efda34..af16f1967ea6 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -92,8 +92,8 @@ def loop_body(i, acc_arr): from functools import partial import itertools import numpy as onp +import six import traceback -from warnings import warn from jax import abstract_arrays from jax import lax, core @@ -263,7 +263,10 @@ def __init__(self, scope, loop_builder): self.scope = scope self.loop_builder = loop_builder self.first_iteration = True # If we are tracing the first iteration - self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) # Stack trace, without this line and the s.range function + if six.PY3: + self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) # Stack trace, without this line and the s.range function + else: + self.stack = None # The rest is state kept from the start of the first iteration to the end of the iteration. self.carried_state_initial = {} # The initial values of the mutable state upon entering the range body. @@ -276,7 +279,10 @@ def __init__(self, scope, loop_builder): def location(self): """A multiline string representing the source location of the range.""" - return " ".join(self.stack.format()) + if self.stack is not None: + return " ".join(self.stack.format()) + else: + return "" def __iter__(self): """Called before starting the first iteration.""" diff --git a/tests/loops_test.py b/tests/loops_test.py index 952b5b5e3e61..20a1b2c679b6 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -21,6 +21,7 @@ from absl.testing import absltest import numpy as onp import re +import six from jax import api, ops from jax import numpy as np @@ -28,7 +29,7 @@ from jax.experimental import loops -class LoopsSugarTest(jtu.JaxTestCase): +class LoopsTest(jtu.JaxTestCase): def test_scope_no_loops(self): def f_op(r): @@ -89,8 +90,8 @@ def add_vec(x, y): s.out = ops.index_add(s.out, i, x[i] + y[i]) return s.out - x = np.array([1., 2., 3.]) - y = np.array([4., 5., 6.]) + x = np.array([1., 2., 3.], dtype=np.float32) + y = np.array([4., 5., 6.], dtype=np.float32) self.assertAllClose(np.add(x, y), add_vec(x, y), check_dtypes=True) def test_matmul(self): @@ -106,8 +107,8 @@ def matmul(x, y): s.out = ops.index_add(s.out, (i, j), x[i, k] * y[k, j]) return s.out - x = np.array([[1., 2., 3.]]) # 1x3 - y = np.array([[4.], [5.], [6.]]) # 3x1 + x = np.array([[1., 2., 3.]], dtype=np.float32) # 1x3 + y = np.array([[4.], [5.], [6.]], dtype=np.float32) # 3x1 self.assertAllClose(np.matmul(x, y), matmul(x, y), check_dtypes=True) def test_reuse_range(self): @@ -153,6 +154,7 @@ def f_op(inc): def test_range_locations(self): """Ranges have locations.""" + if six.PY2: self.skipTest("Source location not implemented for PY2") with loops.Scope() as s: r = s.range(5) cr = s.cond_range(True) @@ -191,10 +193,11 @@ def bad_function(exit_how="break"): pass return 0. - with self.assertRaisesRegex(ValueError, - re.compile(("Some ranges have exited prematurely. The innermost such range is at" - ".*s.range.555."), re.DOTALL)): - bad_function("break") + if six.PY3: + with self.assertRaisesRegex(ValueError, + re.compile(("Some ranges have exited prematurely. The innermost such range is at" + ".*s.range.555."), re.DOTALL)): + bad_function("break") with self.assertRaisesRegex(ValueError, "Some ranges have exited prematurely"): bad_function("return") # On exception exit, we let the exception propagate From d549d44e43734b5bd1a41766d207259c89c64063 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 16 Nov 2019 18:32:59 +0100 Subject: [PATCH 0361/1053] Improved documentation Also fix for the Python 2 iterators. --- jax/experimental/loops.py | 31 +++++++++++++++++-------------- tests/loops_test.py | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index af16f1967ea6..6f8adc38efb1 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -20,38 +20,38 @@ By default, loops and control-flow in JAX are executed and inlined during tracing. For example, in the following code the `for` loop is unrolled during JAX tracing:: - arr = np.zeros(5) + arr = onp.zeros(5) for i in range(arr.shape[0]): - arr[i] = i + 2 + arr[i] += 2. if i % 2 == 0: - arr[i] += 1 + arr[i] += 1. In order to capture the structured control-flow one has to use the higher-order JAX operations, which require you to express the body of the loops and conditionals as functions, and the array updates using a functional style that returns an updated array, e.g.:: - arr = np.zeros(5) + arr = onp.zeros(5) def loop_body(i, acc_arr): - let arr1 = lax.index_update(acc_arr, i, acc_arr[i] + 2) + arr1 = ops.index_update(acc_arr, i, acc_arr[i] + 2.) return lax.cond(i % 2 == 0, arr1, - lambda arr1: lax.index_update(arr1, i, arr1[i] + 1), + lambda arr1: ops.index_update(arr1, i, arr1[i] + 1), arr1, lambda arr1: arr1) - arr = lax.fori(0, arr.shape[0], loop_body, arr) + arr = lax.fori_loop(0, arr.shape[0], loop_body, arr) +The default notation quickly gets unreadable with deeper nested loops. With the utilities in this module you can write loops and conditionals that look closer to plain Python, as long as you keep the loop-carried state in a special `loops.scope` object and use `for` loops over special `scope.range` iterators:: from jax.experimental import loops - with loops.scope() as s: - s.arr = np.zeros(5) # Must create the mutable state of the loop as `scope` fields. - for i in s.range(s.arr.shape[0]): - s.arr = lax.index_update(s.arr, i, s.arr[i] + 2) - for _ in s.cond_range(i % 2 == 0): # Conditionals are also sugared as loops with 0 or 1 iterations - s.arr = lax.index_update(s.arr, i, s.arr[i] + 1) - + with loops.Scope() as s: + s.arr = np.zeros(5) # Must create the mutable state of the loop as `scope` fields. + for i in s.range(s.arr.shape[0]): + s.arr = ops.index_update(s.arr, i, s.arr[i] + 2.) + for _ in s.cond_range(i % 2 == 0): # Conditionals are also sugared as loops with 0 or 1 iterations + s.arr = ops.index_update(s.arr, i, s.arr[i] + 1.) Notes: * Loops and conditionals to be functionalized can appear only inside scopes constructed with `loops.Scope` @@ -300,6 +300,9 @@ def __next__(self): self.scope._pop_range(self) raise StopIteration # Trace only one iteration. + def next(self): # For PY2 + return self.__next__() + def start_tracing_body(self): """Called upon starting the tracing of the loop body.""" # Make a copy of the current value of the mutable state diff --git a/tests/loops_test.py b/tests/loops_test.py index 20a1b2c679b6..8565f2942478 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -23,7 +23,7 @@ import re import six -from jax import api, ops +from jax import api, lax, ops from jax import numpy as np from jax import test_util as jtu from jax.experimental import loops @@ -138,6 +138,40 @@ def f_op(inc): self.assertAllClose(10. + 5 * (2. + 6 * 2.), f_op(2.), check_dtypes=True) + def test_example_doc(self): + "The example from the module docstring." + def f_expected(): + arr = onp.zeros(5) + for i in range(arr.shape[0]): + arr[i] += 2. + if i % 2 == 0: + arr[i] += 1. + return arr + + def f_op_jax(): + arr = onp.zeros(5) + def loop_body(i, acc_arr): + arr1 = ops.index_update(acc_arr, i, acc_arr[i] + 2.) + return lax.cond(i % 2 == 0, + arr1, + lambda arr1: ops.index_update(arr1, i, arr1[i] + 1.), + arr1, + lambda arr1: arr1) + arr = lax.fori_loop(0, arr.shape[0], loop_body, arr) + return arr + + def f_op_loops(): + with loops.Scope() as s: + s.arr = np.zeros(5) # Must create the mutable state of the loop as `scope` fields. + for i in s.range(s.arr.shape[0]): + s.arr = ops.index_update(s.arr, i, s.arr[i] + 2.) + for _ in s.cond_range(i % 2 == 0): # Conditionals are also sugared as loops with 0 or 1 iterations + s.arr = ops.index_update(s.arr, i, s.arr[i] + 1.) + return s.arr + + self.assertAllClose(f_expected(), f_op_jax(), check_dtypes=True) + self.assertAllClose(f_expected(), f_op_loops(), check_dtypes=True) + def test_loop_mutable_used_but_not_changed(self): def f_op(inc): with loops.Scope() as s: From bbf8129aa6edfd2c610d06459c41356ecd7b2ed7 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 16 Nov 2019 13:51:42 -0500 Subject: [PATCH 0362/1053] =?UTF-8?q?Change=20test=20tolerance=20logic=20n?= =?UTF-8?q?ot=20to=20choose=20tolerance=20values=20based=20on=20f=E2=80=A6?= =?UTF-8?q?=20(#1701)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Change test tolerance logic not to choose tolerance values based on flags (in particular, --jax_enable_x64). We would like to move away from having global flags to enable 64-bit mode. We therefore need other methods to select test tolerances. Instead, use a per-type default tolerance, and allow tests to pass per-type dictionaries of tolerances as atol and rtol values. Fix up a number of tolerances to make tests pass. * Fix test tolerances. * Fix dtype canonicalization for test tolerances. * Relax core test_vjp tolerance. --- jax/lax/lax_fft.py | 8 +++ jax/test_util.py | 118 ++++++++++++++++++------------- tests/api_test.py | 4 +- tests/batching_test.py | 15 ++-- tests/core_test.py | 6 +- tests/fft_test.py | 7 +- tests/lax_control_flow_test.py | 51 ++++++++------ tests/lax_numpy_einsum_test.py | 7 +- tests/lax_numpy_test.py | 124 ++++++++++++++++----------------- tests/lax_scipy_test.py | 3 +- tests/lax_test.py | 53 ++++++++------ tests/linalg_test.py | 13 ++-- tests/masking_test.py | 4 +- tests/multibackend_test.py | 4 +- tests/nn_test.py | 3 +- tests/optimizers_test.py | 2 +- tests/random_test.py | 3 +- tests/scipy_stats_test.py | 44 +++++++----- 18 files changed, 276 insertions(+), 193 deletions(-) diff --git a/jax/lax/lax_fft.py b/jax/lax/lax_fft.py index 9957b179426b..bfe7658e72d6 100644 --- a/jax/lax/lax_fft.py +++ b/jax/lax/lax_fft.py @@ -16,9 +16,12 @@ from __future__ import division from __future__ import print_function +import numpy as onp + from jax.abstract_arrays import ShapedArray from jax.core import Primitive from jax.interpreters import xla +from .. import dtypes from ..interpreters import ad from ..interpreters import batching @@ -37,6 +40,11 @@ def fft_impl(x, fft_type, fft_lengths): return xla.apply_primitive(fft_p, x, fft_type=fft_type, fft_lengths=fft_lengths) def fft_abstract_eval(x, fft_type, fft_lengths): + if not dtypes.issubdtype(x.dtype, onp.complexfloating): + raise TypeError("FFT requires complex inputs, got {}.".format(x.dtype.name)) + if x.dtype != onp.complex64: + msg = "FFT is only implemented for complex64 types, got {}." + raise NotImplementedError(msg.format(x.dtype.name)) return ShapedArray(x.shape, x.dtype) def fft_translation_rule(c, x, fft_type, fft_lengths): diff --git a/jax/test_util.py b/jax/test_util.py index ba16329116b5..6d97ecf4799c 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -53,8 +53,6 @@ help='Number of generated cases to test') EPS = 1e-4 -ATOL = 1e-4 -RTOL = 1e-4 _dtype = lambda x: getattr(x, 'dtype', None) or onp.asarray(x).dtype @@ -67,32 +65,61 @@ def is_sequence(x): else: return True - -def assert_numpy_eq(x, y): - testing_tpu = FLAGS.jax_test_dut and FLAGS.jax_test_dut.startswith("tpu") - testing_x32 = not FLAGS.jax_enable_x64 - if testing_tpu or testing_x32: - onp.testing.assert_allclose(x, y, 1e-3, 1e-3) - else: - onp.testing.assert_allclose(x, y) - - -def assert_numpy_close(a, b, atol=ATOL, rtol=RTOL): - testing_tpu = FLAGS.jax_test_dut and FLAGS.jax_test_dut.startswith("tpu") - testing_x32 = not FLAGS.jax_enable_x64 - if testing_tpu or testing_x32: - atol = max(atol, 1e-1) - rtol = max(rtol, 1e-1) +default_tolerance = { + onp.dtype(onp.bool_): 0, + onp.dtype(onp.int8): 0, + onp.dtype(onp.int16): 0, + onp.dtype(onp.int32): 0, + onp.dtype(onp.int64): 0, + onp.dtype(onp.uint8): 0, + onp.dtype(onp.uint16): 0, + onp.dtype(onp.uint32): 0, + onp.dtype(onp.uint64): 0, + onp.dtype(onp.float16): 1e-3, + onp.dtype(onp.float32): 1e-6, + onp.dtype(onp.float64): 1e-15, + onp.dtype(onp.complex64): 1e-6, + onp.dtype(onp.complex128): 1e-15, +} + +tpu_default_tolerance = default_tolerance.copy() +tpu_default_tolerance[onp.dtype(onp.float32)] = 1e-3 +tpu_default_tolerance[onp.dtype(onp.complex64)] = 1e-3 + +default_gradient_tolerance = { + onp.dtype(onp.float16): 1e-2, + onp.dtype(onp.float32): 2e-3, + onp.dtype(onp.float64): 1e-6, + onp.dtype(onp.complex64): 1e-3, + onp.dtype(onp.complex128): 1e-6, +} + +def _assert_numpy_eq(x, y): + onp.testing.assert_allclose(x, y) + +def tolerance(dtype, tol=None): + tol = tol or {} + if not isinstance(tol, dict): + return tol + tol = {onp.dtype(key): value for key, value in tol.items()} + default = (tpu_default_tolerance if device_under_test() == "tpu" + else default_tolerance) + dtype = dtypes.canonicalize_dtype(onp.dtype(dtype)) + return tol.get(dtype, default[dtype]) + +def _assert_numpy_close(a, b, atol=None, rtol=None): assert a.shape == b.shape + atol = max(tolerance(a.dtype, atol), tolerance(b.dtype, atol)) + rtol = max(tolerance(a.dtype, rtol), tolerance(b.dtype, rtol)) onp.testing.assert_allclose(a, b, atol=atol * a.size, rtol=rtol * b.size) def check_eq(xs, ys): - tree_all(tree_multimap(assert_numpy_eq, xs, ys)) + tree_all(tree_multimap(_assert_numpy_eq, xs, ys)) -def check_close(xs, ys, atol=ATOL, rtol=RTOL): - assert_close = partial(assert_numpy_close, atol=atol, rtol=rtol) +def check_close(xs, ys, atol=None, rtol=None): + assert_close = partial(_assert_numpy_close, atol=atol, rtol=rtol) tree_all(tree_multimap(assert_close, xs, ys)) @@ -127,7 +154,9 @@ def numerical_jvp(f, primals, tangents, eps=EPS): return scalar_mul(sub(f_pos, f_neg), 0.5 / eps) -def check_jvp(f, f_jvp, args, atol=ATOL, rtol=RTOL, eps=EPS): +def check_jvp(f, f_jvp, args, atol=None, rtol=None, eps=EPS): + atol = atol or default_gradient_tolerance + rtol = rtol or default_gradient_tolerance rng = onp.random.RandomState(0) tangent = tree_map(partial(rand_like, rng), args) v_out, t_out = f_jvp(args, tangent) @@ -140,7 +169,9 @@ def check_jvp(f, f_jvp, args, atol=ATOL, rtol=RTOL, eps=EPS): check_close(t_out, t_out_expected, atol=atol, rtol=rtol) -def check_vjp(f, f_vjp, args, atol=ATOL, rtol=RTOL, eps=EPS): +def check_vjp(f, f_vjp, args, atol=None, rtol=None, eps=EPS): + atol = atol or default_gradient_tolerance + rtol = rtol or default_gradient_tolerance _rand_like = partial(rand_like, onp.random.RandomState(0)) v_out, vjpfun = f_vjp(*args) v_out_expected = f(*args) @@ -157,9 +188,6 @@ def check_vjp(f, f_vjp, args, atol=ATOL, rtol=RTOL, eps=EPS): def check_grads(f, args, order, modes=["fwd", "rev"], atol=None, rtol=None, eps=None): args = tuple(args) - default_tol = 1e-6 if FLAGS.jax_enable_x64 else 1e-2 - atol = atol or default_tol - rtol = rtol or default_tol eps = eps or EPS _check_jvp = partial(check_jvp, atol=atol, rtol=rtol, eps=eps) @@ -487,6 +515,13 @@ def check_raises(thunk, err_type, msg): except err_type as e: assert str(e).startswith(msg), "\n{}\n\n{}\n".format(e, msg) +def check_raises_regexp(thunk, err_type, pattern): + try: + thunk() + assert False + except err_type as e: + assert re.match(pattern, str(e)), "{}\n\n{}\n".format(e, pattern) + _CACHED_INDICES = {} def cases_from_list(xs): @@ -515,14 +550,8 @@ class JaxTestCase(parameterized.TestCase): def assertArraysAllClose(self, x, y, check_dtypes, atol=None, rtol=None): """Assert that x and y are close (up to numerical tolerances).""" self.assertEqual(x.shape, y.shape) - dtype = lambda x: str(onp.asarray(x).dtype) - tol = 1e-2 if str(onp.dtype(onp.float32)) in {dtype(x), dtype(y)} else 1e-5 - atol = atol or tol - rtol = rtol or tol - - if FLAGS.jax_test_dut == 'tpu': - atol = max(atol, 0.5) - rtol = max(rtol, 1e-1) + atol = max(tolerance(_dtype(x), atol), tolerance(_dtype(y), atol)) + rtol = max(tolerance(_dtype(x), rtol), tolerance(_dtype(y), rtol)) onp.testing.assert_allclose(x, y, atol=atol, rtol=rtol) @@ -530,17 +559,8 @@ def assertArraysAllClose(self, x, y, check_dtypes, atol=None, rtol=None): self.assertDtypesMatch(x, y) def assertDtypesMatch(self, x, y): - # special rule for complex128, which XLA doesn't support - def c128_to_c64(dtype): - if dtype == onp.complex128: - return onp.complex64 - else: - return dtype - if FLAGS.jax_enable_x64: - x_dtype = c128_to_c64(onp.asarray(x).dtype) - y_dtype = c128_to_c64(onp.asarray(y).dtype) - self.assertEqual(x_dtype, y_dtype) + self.assertEqual(onp.asarray(x).dtype, onp.asarray(y).dtype) def assertAllClose(self, x, y, check_dtypes, atol=None, rtol=None): """Assert that x and y, either arrays or nested tuples/lists, are close.""" @@ -560,7 +580,7 @@ def assertAllClose(self, x, y, check_dtypes, atol=None, rtol=None): y = onp.asarray(y) self.assertArraysAllClose(x, y, check_dtypes, atol=atol, rtol=rtol) elif x == y: - return + return else: raise TypeError((type(x), type(y))) @@ -590,8 +610,8 @@ def wrapped_fun(*args): python_should_be_executing = False compiled_ans = cfun(*args) - self.assertAllClose(python_ans, monitored_ans, check_dtypes, rtol, atol) - self.assertAllClose(python_ans, compiled_ans, check_dtypes, rtol, atol) + self.assertAllClose(python_ans, monitored_ans, check_dtypes, atol, rtol) + self.assertAllClose(python_ans, compiled_ans, check_dtypes, atol, rtol) args = args_maker() @@ -601,10 +621,10 @@ def wrapped_fun(*args): python_should_be_executing = False compiled_ans = cfun(*args) - self.assertAllClose(python_ans, compiled_ans, check_dtypes, rtol, atol) + self.assertAllClose(python_ans, compiled_ans, check_dtypes, atol, rtol) def _CheckAgainstNumpy(self, numpy_reference_op, lax_op, args_maker, - check_dtypes=False, tol=1e-5): + check_dtypes=False, tol=None): args = args_maker() numpy_ans = numpy_reference_op(*args) lax_ans = lax_op(*args) diff --git a/tests/api_test.py b/tests/api_test.py index d23e7616ee77..5f77c6d0cc86 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -546,7 +546,9 @@ def f(z): -0.70368982+0.35184491j, 0.1886467 -0.09432335j, 0.86873727-0.43436864j]) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose(ans, expected, check_dtypes=False, + atol=jtu.default_gradient_tolerance, + rtol=jtu.default_gradient_tolerance) def test_complex_output_jacrev_raises_error(self): self.assertRaises(TypeError, lambda: jacrev(lambda x: np.sin(x))(1 + 2j)) diff --git a/tests/batching_test.py b/tests/batching_test.py index b358de0a5deb..91f1451df2a5 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -57,7 +57,9 @@ def testNestedBatchingMatMat(self): ans = matmat(A, B) expected = onp.dot(A, B) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose( + ans, expected, check_dtypes=False, + rtol={onp.float32:1e-2} if jtu.device_under_test() == "tpu" else None) jaxpr = make_jaxpr(matmat)(A, B) self.assertEqual(len(jaxpr.eqns), 1) @@ -217,7 +219,9 @@ def testNpMaximumPerExampleGrad(self): np.maximum(np.dot(W_t, np.transpose(x_ex)), 0.0), x_ex) expected_ans = np.transpose(expected_ans) - self.assertAllClose(ans[i], expected_ans, check_dtypes=False) + self.assertAllClose( + ans[i], expected_ans, check_dtypes=False, + atol={onp.float32:5e-2} if jtu.device_under_test() == "tpu" else None) def testDotGeneral(self): R = onp.random.RandomState(0).randn @@ -566,7 +570,8 @@ def f(params, x): per_example_direct += [ np.reshape(g, (1,) + g.shape)] per_example_direct = np.concatenate(per_example_direct, axis=0) - self.assertAllClose(per_example, per_example_direct, check_dtypes=True) + self.assertAllClose(per_example, per_example_direct, check_dtypes=True, + rtol=1e-5) def testCumProd(self): x = np.arange(9).reshape(3, 3) + 1 @@ -616,7 +621,7 @@ def testLaxLinalgCholesky(self): ans = vmap(lax_linalg.cholesky)(a) expected = onp.linalg.cholesky(a) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose(ans, expected, check_dtypes=False, rtol=1e-4) b = onp.random.RandomState(0).randn(10, 5, 5).astype(onp.float32) b = onp.matmul(b, onp.conj(onp.swapaxes(b, -1, -2))) @@ -624,7 +629,7 @@ def testLaxLinalgCholesky(self): ans = vmap(lax_linalg.cholesky, in_axes=1, out_axes=0)(b_trans) expected = onp.linalg.cholesky(b) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose(ans, expected, check_dtypes=False, rtol=1e-4) def testLaxLinalgTriangularSolve(self): a = onp.random.RandomState(0).randn(4, 10, 4).astype(onp.float32) diff --git a/tests/core_test.py b/tests/core_test.py index c7d0e2b7b5cd..91f12cfecb03 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -172,7 +172,7 @@ def test_tree_unflatten(self): @parameterized.parameters(test_specs) def test_jit(self, f, args): - jtu.check_eq(jit(f)(*args), f(*args)) + jtu.check_close(jit(f)(*args), f(*args)) @parameterized.parameters(test_specs) def test_jvp(self, f, args): @@ -192,7 +192,9 @@ def test_jvp_linearized(self, f, args): @parameterized.parameters(test_specs) def test_vjp(self, f, args): - jtu.check_vjp(f, partial(vjp, f), args) + jtu.check_vjp(f, partial(vjp, f), args, + rtol={onp.float32: 3e-2, onp.float64: 1e-5}, + atol={onp.float32: 1e-2, onp.float64: 1e-5}) def test_jvp_closure(self): def foo(x): diff --git a/tests/fft_test.py b/tests/fft_test.py index 4650020e2190..e5702686a35a 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -31,7 +31,9 @@ float_dtypes = [onp.float32, onp.float64] -complex_dtypes = [onp.complex64, onp.complex128] +# TODO(b/144573940): onp.complex128 isn't supported by XLA, and the JAX +# implementation casts to complex64. +complex_dtypes = [onp.complex64] inexact_dtypes = float_dtypes + complex_dtypes int_dtypes = [onp.int32, onp.int64] bool_dtypes = [onp.bool_] @@ -67,7 +69,8 @@ def testFftn(self, inverse, shape, dtype, axes, rng_factory): onp_op = onp.fft.ifftn if inverse else onp.fft.fftn np_fn = lambda a: np_op(a, axes=axes) onp_fn = lambda a: onp_op(a, axes=axes) - self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=True, + # Numpy promotes to complex128 aggressively. + self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) # Test gradient for differentiable types. diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 9b018979150f..fa5ea5a29f98 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -722,7 +722,8 @@ def f(c, a): ans = api.jvp(lambda c, as_: scan(f, c, as_), (c, as_), (c, as_)) expected = api.jvp(lambda c, as_: scan_reference(f, c, as_), (c, as_), (c, as_)) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose(ans, expected, check_dtypes=False, + rtol={onp.float64: 1e-14}) jtu.check_grads(partial(scan, f), (c, as_), order=2, modes=["fwd"]) @@ -755,7 +756,8 @@ def f(c, a): ans = api.linearize(lambda c, as_: scan(f, c, as_), c, as_)[1](c, as_) expected = api.linearize(lambda c, as_: scan_reference(f, c, as_), c, as_)[1](c, as_) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose(ans, expected, check_dtypes=False, + rtol={onp.float64: 1e-14}) @parameterized.named_parameters( {"testcase_name": "_jit_scan={}_jit_f={}".format(jit_scan, jit_f), @@ -786,10 +788,11 @@ def f(c, a): ans = api.grad(lambda c, as_: list( scan(f, c, as_))[0].sum())(c, as_) expected = api.grad(lambda c, as_: list(scan_reference(f, c, as_))[0].sum())(c, as_) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose(ans, expected, check_dtypes=False, + rtol={onp.float32: 2e-5, onp.float64: 1e-13}) jtu.check_grads(partial(scan, f), (c, as_), order=2, modes=["rev"], - atol=1e-3, rtol=1e-3) + atol=1e-3, rtol=2e-3) def testScanRnn(self): r = npr.RandomState(0) @@ -829,7 +832,8 @@ def loss(params, inputs, targets): api.jvp(lambda params: loss(params, inputs, targets), (params,), (params,)) # jvp numerical check passes - jtu.check_grads(loss, (params, inputs, targets), order=2, modes=["fwd"]) + jtu.check_grads(loss, (params, inputs, targets), order=2, modes=["fwd"], + rtol={onp.float32: 2e-2, onp.float64: 1e-6}) # linearize works _, expected = api.jvp(loss, (params, inputs, targets), @@ -842,7 +846,7 @@ def loss(params, inputs, targets): api.grad(loss)(params, inputs, targets) # gradient check passes - jtu.check_grads(loss, (params, inputs, targets), order=2, rtol=1e-2) + jtu.check_grads(loss, (params, inputs, targets), order=2, rtol=2e-2) # we can vmap to batch things batch_size = 7 @@ -852,7 +856,7 @@ def loss(params, inputs, targets): losses = batched_loss(batched_inputs, batched_targets) expected = onp.stack(list(map(lambda x, y: loss(params, x, y), batched_inputs, batched_targets))) - self.assertAllClose(losses, expected, check_dtypes=False) + self.assertAllClose(losses, expected, check_dtypes=False, rtol=1e-2) def testIssue711(self): # Tests reverse-mode differentiation through a scan for which the scanned @@ -934,7 +938,7 @@ def f(c, a): c = 1. jtu.check_grads(lambda c, as_: lax.scan(f, c, as_), (c, as_), - modes=["rev"], order=2) + modes=["rev"], order=2, rtol={onp.float32: 6e-3}) @parameterized.named_parameters( {"testcase_name": "_jit_scan={}_jit_f={}_in_axes={}".format( @@ -1166,8 +1170,9 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): return lax.custom_root(f, 0.0, binary_search, tangent_solve) value, grad = api.value_and_grad(sqrt_cubed)(5.0) - self.assertAllClose(value, 5 ** 1.5, check_dtypes=False) - self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False) + self.assertAllClose(value, 5 ** 1.5, check_dtypes=False, rtol=1e-6) + self.assertAllClose(grad, api.grad(pow)(5.0, 1.5), check_dtypes=False, + rtol=1e-7) jtu.check_grads(sqrt_cubed, (5.0,), order=2, rtol=1e-3) # TODO(shoyer): reenable when batching works @@ -1176,7 +1181,8 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): # self.assertAllClose(results, inputs ** 1.5, check_dtypes=False) results = api.jit(sqrt_cubed)(5.0) - self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False) + self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False, + rtol={onp.float64:1e-7}) def test_custom_root_vector_with_solve_closure(self): @@ -1193,7 +1199,8 @@ def linear_solve(a, b): rng = onp.random.RandomState(0) a = rng.randn(2, 2) b = rng.randn(2) - jtu.check_grads(linear_solve, (a, b), order=2) + jtu.check_grads(linear_solve, (a, b), order=2, + atol={onp.float32: 1e-2, onp.float64: 1e-11}) actual = api.jit(linear_solve)(a, b) expected = np.linalg.solve(a, b) @@ -1264,7 +1271,7 @@ def linear_solve(a, b): if symmetric: a = a + a.T b = rng.randn(3) - jtu.check_grads(linear_solve, (a, b), order=2) + jtu.check_grads(linear_solve, (a, b), order=2, rtol=2e-3) expected = np.linalg.solve(a, b) actual = api.jit(linear_solve)(a, b) @@ -1290,8 +1297,10 @@ def linear_solve(a, b): rng = onp.random.RandomState(0) a = rng.randn(3, 3) b = rng.randn(3) - jtu.check_grads(lambda x: linear_solve(x, b), (a,), order=2) - jtu.check_grads(lambda x: linear_solve(a, x), (b,), order=2) + jtu.check_grads(lambda x: linear_solve(x, b), (a,), order=2, + rtol={onp.float32: 5e-3}) + jtu.check_grads(lambda x: linear_solve(a, x), (b,), order=2, + rtol={onp.float32: 5e-3}) def test_custom_linear_solve_iterative(self): @@ -1319,7 +1328,7 @@ def build_and_solve(a, b): expected = np.linalg.solve(np.exp(a), np.cos(b)) actual = build_and_solve(a, b) self.assertAllClose(expected, actual, atol=1e-5, check_dtypes=True) - jtu.check_grads(build_and_solve, (a, b), atol=1e-5, order=2) + jtu.check_grads(build_and_solve, (a, b), atol=1e-5, order=2, rtol=2e-3) # TODO(shoyer): reenable when batching works # a2 = rng.randn(1, 2, 2) @@ -1350,7 +1359,7 @@ def solve(matvec, x): # positive definite. jtu.check_grads( lambda x, y: positive_definite_solve(high_precision_dot(x, x.T), y), - (a, b), order=2) + (a, b), order=2, rtol=1e-2) def test_custom_linear_solve_lu(self): @@ -1376,10 +1385,11 @@ def transpose_solve(vecmat, x): actual = linear_solve(a, b) self.assertAllClose(expected, actual, check_dtypes=True) - jtu.check_grads(linear_solve, (a, b), order=2) + jtu.check_grads(linear_solve, (a, b), order=2, rtol=2e-3) # regression test for https://github.com/google/jax/issues/1536 - jtu.check_grads(api.jit(linear_solve), (a, b), order=2) + jtu.check_grads(api.jit(linear_solve), (a, b), order=2, + rtol={onp.float32: 2e-3}) def test_custom_linear_solve_without_transpose_solve(self): @@ -1395,7 +1405,8 @@ def loss(a, b): a = rng.randn(2, 2) b = rng.randn(2) - jtu.check_grads(loss, (a, b), atol=1e-5, order=2, modes=['fwd']) + jtu.check_grads(loss, (a, b), order=2, modes=['fwd'], + atol={onp.float32: 2e-3, onp.float64: 1e-11}) with self.assertRaisesRegex(TypeError, "transpose_solve required"): api.grad(loss)(a, b) diff --git a/tests/lax_numpy_einsum_test.py b/tests/lax_numpy_einsum_test.py index dd0cf1d27f59..7014e91032e9 100644 --- a/tests/lax_numpy_einsum_test.py +++ b/tests/lax_numpy_einsum_test.py @@ -39,7 +39,9 @@ class EinsumTest(jtu.JaxTestCase): def _check(self, s, *ops): a = onp.einsum(s, *ops) b = np.einsum(s, *ops) - self.assertAllClose(a, b, atol=1e-4, rtol=1e-4, check_dtypes=True) + + atol = 2e-1 if jtu.device_under_test() == "tpu" else 1e-4 + self.assertAllClose(a, b, atol=atol, rtol=1e-4, check_dtypes=True) def test_three_operands_1(self): r = rng() @@ -311,8 +313,9 @@ def test_einsum_kpmurphy_example(self): L[n,c] = s path = np.einsum_path('ntk,kd,dc->nc', S, W, V, optimize='optimal')[0] + rtol = 1e-2 if jtu.device_under_test() == "tpu" else None self.assertAllClose(L, np.einsum('ntk,kd,dc->nc', S, W, V, optimize=path), - check_dtypes=False) + check_dtypes=False, rtol=rtol) if __name__ == '__main__': diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 7e3416718b18..4869c2d9fad3 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -72,28 +72,6 @@ ["name", "nargs", "dtypes", "shapes", "rng_factory", "diff_modes", "test_name", "check_dtypes", "tolerance"]) -default_tolerance = { - onp.bool_: 0, - onp.int16: 0, - onp.int32: 0, - onp.int64: 0, - onp.float16: 1e-3, - onp.float32: 1e-6, - onp.float64: 1e-15, - onp.complex64: 1e-6, - onp.complex128: 1e-15, -} - -def tolerance(dtype, tol=None): - if not FLAGS.jax_enable_x64: - if dtype == onp.float64: - dtype = onp.float32 - elif dtype == onp.complex128: - dtype = onp.complex64 - tol = tol or {} - return tol.get(dtype, default_tolerance[dtype]) - - def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, test_name=None, check_dtypes=True, tolerance=None): test_name = test_name or name @@ -109,8 +87,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("float_power", 2, inexact_dtypes, all_shapes, jtu.rand_default, ["rev"], - tolerance={onp.float32: 1e-5, onp.float64: 1e-12, - onp.complex64: 1e-5, onp.complex128: 1e-12}), + tolerance={onp.float32: 1e-3, onp.float64: 1e-12, + onp.complex64: 2e-4, onp.complex128: 1e-12}), op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("greater", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), @@ -201,7 +179,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, jtu.rand_default, [], check_dtypes=False, tolerance={onp.float16: 1e-2, onp.float64: 1e-12}), op_record("positive", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), - op_record("power", 2, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("power", 2, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], + tolerance={onp.complex128: 1e-14}), op_record("rad2deg", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("ravel", 1, all_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("real", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), @@ -262,7 +241,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("__gt__", 2, default_dtypes, all_shapes, jtu.rand_default, []), op_record("__ge__", 2, default_dtypes, all_shapes, jtu.rand_default, []), op_record("__neg__", 1, number_dtypes, all_shapes, jtu.rand_default, []), - op_record("__pow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive, []), + op_record("__pow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive, [], + tolerance={onp.float32: 2e-4, onp.complex64: 2e-4, onp.complex128: 1e-14}), op_record("__mod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), op_record("__floordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), @@ -282,7 +262,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("__radd__", 2, number_dtypes, all_shapes, jtu.rand_default, []), op_record("__rsub__", 2, number_dtypes, all_shapes, jtu.rand_default, []), op_record("__rmul__", 2, number_dtypes, all_shapes, jtu.rand_default, []), - op_record("__rpow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive, []), + op_record("__rpow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive, [], + tolerance={onp.float32: 2e-4, onp.complex64: 1e-3}), op_record("__rmod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), op_record("__rfloordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), @@ -356,7 +337,7 @@ def _GetArgsMaker(self, rng, shapes, dtypes): dtypes), "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), - "check_dtypes": rec.check_dtypes, "op_tolerance": rec.tolerance} + "check_dtypes": rec.check_dtypes, "tol": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) @@ -364,14 +345,13 @@ def _GetArgsMaker(self, rng, shapes, dtypes): for rec in itertools.chain(JAX_ONE_TO_ONE_OP_RECORDS, JAX_COMPOUND_OP_RECORDS))) def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, - op_tolerance): + tol): rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or jtu.NUMPY_SCALAR_SHAPE in shapes or () in shapes) empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) - tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) self._CheckAgainstNumpy( onp_op, lnp_op, args_maker, check_dtypes=check_dtypes and not scalar_arg and not empty_shape, @@ -384,17 +364,16 @@ def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, {"testcase_name": jtu.format_test_name_suffix(rec.test_name, shapes, dtypes), "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "name": rec.name, - "op_tolerance": rec.tolerance} + "tol": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) for rec in JAX_OPERATOR_OVERLOADS)) - def testOperatorOverload(self, name, rng_factory, shapes, dtypes, op_tolerance): + def testOperatorOverload(self, name, rng_factory, shapes, dtypes, tol): rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) fun = lambda *xs: getattr(operator, name.strip('_'))(*xs) - tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or jtu.NUMPY_SCALAR_SHAPE in shapes or () in shapes) @@ -421,7 +400,7 @@ def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) fun = lambda fst, snd: getattr(snd, name)(fst) - tol = max(tolerance(dtype, op_tolerance) for dtype in dtypes) + tol = max(jtu.tolerance(dtype, op_tolerance) for dtype in dtypes) scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or jtu.NUMPY_SCALAR_SHAPE in shapes or () in shapes) @@ -473,8 +452,8 @@ def testReducer(self, onp_op, lnp_op, rng_factory, shape, dtype, out_dtype, axis args_maker = lambda: [rng(shape, dtype)] tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.complex64: 1e-3, onp.float64: 1e-5, onp.complex128: 1e-5} - tol = tolerance(dtype, tol_spec) - tol = max(tol, tolerance(out_dtype, tol_spec)) if out_dtype else tol + tol = jtu.tolerance(dtype, tol_spec) + tol = max(tol, jtu.tolerance(out_dtype, tol_spec)) if out_dtype else tol self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, @@ -567,7 +546,8 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factor lnp_fun = lambda a, b: lnp.cross(a, b, axisa, axisb, axisc, axis) onp_fun = lambda a, b: onp.cross(a, b, axisa, axisb, axisc, axis) tol_spec = {onp.float16: 1e-2} - tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) + tol = max(jtu.tolerance(lhs_dtype, tol_spec), + jtu.tolerance(rhs_dtype, tol_spec)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, @@ -597,8 +577,10 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factor def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] - tol_spec = {onp.float16: 1e-2, onp.float32: 1e-5, onp.float64: 1e-14} - tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) + tol = {onp.float16: 1e-2, onp.float32: 1e-5, onp.float64: 1e-14, + onp.complex128: 1e-14} + if jtu.device_under_test() == "tpu": + tol[onp.float32] = tol[onp.complex64] = 2e-1 self._CheckAgainstNumpy(onp.dot, lnp.dot, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp.dot, args_maker, check_dtypes=True, atol=tol, @@ -628,8 +610,9 @@ def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] - tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.float64: 1e-12} - tol = max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec)) + tol = {onp.float16: 1e-2, onp.float32: 2e-2, onp.float64: 1e-12} + if jtu.device_under_test() == "tpu": + tol[onp.float32] = tol[onp.complex64] = 4e-2 self._CheckAgainstNumpy(onp.matmul, lnp.matmul, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp.matmul, args_maker, check_dtypes=True, atol=tol, @@ -657,10 +640,12 @@ def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_fa args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] lnp_fun = lambda a, b: lnp.tensordot(a, b, axes) onp_fun = lambda a, b: onp.tensordot(a, b, axes) - tol_spec = {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-12, - onp.complex64: 1e-3, onp.complex128: 1e-12} + tol = {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-12, + onp.complex64: 1e-3, onp.complex128: 1e-12} + if jtu.device_under_test() == "tpu": + tol[onp.float32] = tol[onp.complex64] = 2e-1 self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, - tol=max(tolerance(lhs_dtype, tol_spec), tolerance(rhs_dtype, tol_spec))) + tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -682,7 +667,10 @@ def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] onp_fun = lambda lhs, rhs: onp.inner(lhs, rhs) lnp_fun = lambda lhs, rhs: lnp.inner(lhs, rhs) - tol = max(tolerance(lhs_dtype), tolerance(rhs_dtype)) + tol_spec = {onp.float64: 1e-13} + if jtu.device_under_test() == "tpu": + tol_spec[onp.float32] = 2e-1 + tol = max(jtu.tolerance(lhs_dtype), jtu.tolerance(rhs_dtype)) # TODO(phawkins): there are float32/float64 disagreements for some inputs. self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, tol=tol) @@ -722,7 +710,7 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): onp_fun = lambda x: onp.round(x, decimals=decimals) lnp_fun = lambda x: lnp.round(x, decimals=decimals) args_maker = lambda: [rng(shape, dtype)] - tol = tolerance(dtype, {onp.float16: 1e-2}) + tol = {onp.float16: 1e-2} self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, @@ -902,7 +890,7 @@ def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, lnp_op, rng_fact args_maker = lambda: [rng(shape, dtype)] - tol = max(tolerance(dtype), tolerance(out_dtype)) + tol = max(jtu.tolerance(dtype), jtu.tolerance(out_dtype)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @@ -1256,9 +1244,9 @@ def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): lnp_fun = lambda x, weights: lnp.average(x, axis, weights, returned) args_maker = lambda: [rng(shape, dtype), rng(weights_shape, dtype)] - tol = tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-3, - onp.float64: 1e-10, onp.complex64: 1e-3, - onp.complex128: 1e-10}) + tol = jtu.tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-3, + onp.float64: 1e-10, onp.complex64: 1e-3, + onp.complex128: 1e-10}) try: self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) @@ -1670,7 +1658,7 @@ def testVander(self, shape, dtype, n, increasing, rng_factory): # np.vander seems to return float64 for all floating types. We could obey # those semantics, but they seem like a bug. self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, - tol=tolerance(dtype)) + tol={onp.float32: 1e-3}) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=False) @parameterized.named_parameters(jtu.cases_from_list( @@ -1743,8 +1731,12 @@ def testQuantile(self, op, a_rng, q_rng, a_shape, a_dtype, q_shape, q_dtype, # TODO(phawkins): we currently set dtype=False because we aren't as # aggressive about promoting to float64. It's not clear we want to mimic # Numpy here. - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + tol_spec = {onp.float32: 1e-5, onp.float64: 5e-6} + tol = max(jtu.tolerance(a_dtype, tol_spec), + jtu.tolerance(q_dtype, tol_spec)) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, + tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix("select", shapes, @@ -1921,7 +1913,7 @@ def testMathSpecialFloatValues(self, op, dtype): x = dtype(x) expected = onp_op(x) actual = lnp_op(x) - tol = tolerance(dtype, {onp.float32: 1e-3, onp.float64: 1e-7}) + tol = jtu.tolerance(dtype, {onp.float32: 1e-3, onp.float64: 1e-7}) self.assertAllClose(expected, actual, check_dtypes=True, atol=tol, rtol=tol) @@ -1963,7 +1955,7 @@ def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng_factory): args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) lnp_fun = partial(lnp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) - tol = tolerance(out_dtype, {onp.float16: 1e-1}) + tol = jtu.tolerance(out_dtype, {onp.float16: 1e-1}) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol, @@ -1987,7 +1979,9 @@ def testCov(self, shape, dtype, rowvar, ddof, bias, rng_factory): args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.cov, rowvar=rowvar, ddof=ddof, bias=bias) lnp_fun = partial(lnp.cov, rowvar=rowvar, ddof=ddof, bias=bias) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy( + onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=7e-2 if jtu.device_under_test() == "tpu" else {onp.float64: 1e-13}) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) def testIssue967(self): @@ -2012,7 +2006,9 @@ def testCorrCoef(self, shape, dtype, rowvar, ddof, bias, rng_factory): onp_fun = partial(onp.corrcoef, rowvar=rowvar, ddof=ddof, bias=bias) lnp_fun = partial(lnp.corrcoef, rowvar=rowvar, ddof=ddof, bias=bias) if not onp.any(onp.isclose(onp.std(mat), 0.0)): - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy( + onp_fun, lnp_fun, args_maker, check_dtypes=True, + tol=1e-2 if jtu.device_under_test() == "tpu" else None) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters( @@ -2068,7 +2064,7 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, retstep, dtype, rng_factory): rng = rng_factory() # relax default tolerances slightly - tol = tolerance(dtype if dtype else onp.float32) * 10 + tol = jtu.tolerance(dtype if dtype else onp.float32) * 10 args_maker = self._GetArgsMaker(rng, [start_shape, stop_shape], [dtype, dtype]) @@ -2115,13 +2111,14 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, def testLogspace(self, start_shape, stop_shape, num, endpoint, base, dtype, rng_factory): if (dtype in int_dtypes and - jtu.device_under_test() == "gpu" and + jtu.device_under_test() in ("gpu", "tpu") and not FLAGS.jax_enable_x64): raise unittest.SkipTest("GPUx32 truncated exponentiation" " doesn't exactly match other platforms.") rng = rng_factory() # relax default tolerances slightly - tol = tolerance(dtype if dtype else onp.float32) * 10 + tol = {onp.float16: 2e-2, onp.float32: 1e-2, onp.float64: 1e-14, + onp.complex64: 1e-3, onp.complex128: 1e-14} args_maker = self._GetArgsMaker(rng, [start_shape, stop_shape], [dtype, dtype]) @@ -2140,7 +2137,7 @@ def testLogspace(self, start_shape, stop_shape, num, if dtype in (inexact_dtypes + [None,]): # Why do compiled and op-by-op float16 np.power numbers differ # slightly more than expected? - atol = tol if dtype != onp.float16 else 10 * tol + atol = {onp.float16: 1e-2} self._CompileAndCheck(lnp_op, args_maker, check_dtypes=False, atol=atol, rtol=tol) @@ -2164,7 +2161,7 @@ def testGeomspace(self, start_shape, stop_shape, num, endpoint, dtype, rng_factory): rng = rng_factory() # relax default tolerances slightly - tol = tolerance(dtype if dtype else onp.float32) * 10 + tol = {onp.float16: 2e-3, onp.float32: 2e-3, onp.complex128: 1e-14} def args_maker(): """Test the set of inputs onp.geomspace is well-defined on.""" start, stop = self._GetArgsMaker(rng, @@ -2343,7 +2340,8 @@ def testOpGrad(self, op, rng_factory, shapes, dtype, order, tol): for special_value in rec.values) for rec in GRAD_SPECIAL_VALUE_TEST_RECORDS)) def testOpGradSpecialValue(self, op, special_value): - check_grads(op, (special_value,), 2, ["fwd", "rev"]) + check_grads(op, (special_value,), 2, ["fwd", "rev"], + atol={onp.float32: 3e-3}) def testTakeAlongAxisIssue1521(self): # https://github.com/google/jax/issues/1521 diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 785f753c7de7..941c1b56977d 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -150,7 +150,8 @@ def lax_fun(a): rng = rng_factory() args_maker = lambda: [rng(shape, dtype) + (d - 1) / 2.] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol={onp.float32: 1e-3, onp.float64: 1e-14}) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) def testIssue980(self): diff --git a/tests/lax_test.py b/tests/lax_test.py index 062cb84f5a7e..759e014ec04d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -129,7 +129,8 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("cosh", 1, float_dtypes + complex_dtypes, jtu.rand_default), op_record("lgamma", 1, float_dtypes, jtu.rand_positive, - {onp.float32: 1e-5, onp.float64: 1e-14}), + {onp.float32: 1e-3 if jtu.device_under_test() == "tpu" else 1e-5, + onp.float64: 1e-14}), op_record("digamma", 1, float_dtypes, jtu.rand_positive, {onp.float64: 1e-14}), op_record("erf", 1, float_dtypes, jtu.rand_small), @@ -208,7 +209,7 @@ def testOpAgainstNumpy(self, op_name, rng_factory, shapes, dtype, tol): args_maker = lambda: [rng(shape, dtype) for shape in shapes] op = getattr(lax, op_name) numpy_op = getattr(lax_reference, op_name) - self._CheckAgainstNumpy(op, numpy_op, args_maker, tol=tolerance(dtype, tol)) + self._CheckAgainstNumpy(op, numpy_op, args_maker, tol=tol) # TODO test shift_left, shift_right_arithmetic, shift_right_logical @@ -671,8 +672,8 @@ def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng_factory): args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] tol = {onp.float16: 1e-2, onp.float64: max(default_tolerance[onp.float64], 1e-14)} - self._CheckAgainstNumpy(lax.dot, lax_reference.dot, args_maker, - tol=tolerance(dtype, tol)) + lax_op = partial(lax.dot, precision=lax.Precision.HIGHEST) + self._CheckAgainstNumpy(lax_op, lax_reference.dot, args_maker, tol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -1704,20 +1705,26 @@ def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): ] GradSpecialValuesTestSpec = collections.namedtuple( - "GradSpecialValuesTestSpec", ["op", "values"]) + "GradSpecialValuesTestSpec", ["op", "values", "tol"]) +def grad_special_values_test_spec(op, values, tol=None): + return GradSpecialValuesTestSpec(op, values, tol) LAX_GRAD_SPECIAL_VALUE_TESTS = [ - GradSpecialValuesTestSpec(lax.sinh, [0.]), - GradSpecialValuesTestSpec(lax.cosh, [0.]), - GradSpecialValuesTestSpec(lax.tanh, [0., 1000.]), - GradSpecialValuesTestSpec(lax.sin, [0., onp.pi, onp.pi/2., onp.pi/4.]), - GradSpecialValuesTestSpec(lax.cos, [0., onp.pi, onp.pi/2., onp.pi/4.]), - GradSpecialValuesTestSpec(lax.tan, [0.]), - GradSpecialValuesTestSpec(lax.asin, [0.]), - GradSpecialValuesTestSpec(lax.acos, [0.]), - GradSpecialValuesTestSpec(lax.atan, [0., 1000.]), - GradSpecialValuesTestSpec(lax.erf, [0., 10.]), - GradSpecialValuesTestSpec(lax.erfc, [0., 10.]), + grad_special_values_test_spec( + lax.sinh, [0.], + tol={onp.float32: 1e-2} if jtu.device_under_test() == "tpu" else None), + grad_special_values_test_spec( + lax.cosh, [0.], + tol={onp.float32: 1e-2} if jtu.device_under_test() == "tpu" else None), + grad_special_values_test_spec(lax.tanh, [0., 1000.]), + grad_special_values_test_spec(lax.sin, [0., onp.pi, onp.pi/2., onp.pi/4.]), + grad_special_values_test_spec(lax.cos, [0., onp.pi, onp.pi/2., onp.pi/4.]), + grad_special_values_test_spec(lax.tan, [0.]), + grad_special_values_test_spec(lax.asin, [0.]), + grad_special_values_test_spec(lax.acos, [0.]), + grad_special_values_test_spec(lax.atan, [0., 1000.]), + grad_special_values_test_spec(lax.erf, [0., 10.]), + grad_special_values_test_spec(lax.erfc, [0., 10.]), ] @@ -1774,11 +1781,11 @@ def testOpGrad(self, op, rng_factory, shapes, dtype, order, tol): @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": "_{}_{}".format(rec.op.__name__, special_value), - "op": rec.op, "special_value": special_value} + "op": rec.op, "special_value": special_value, "tol": rec.tol} for special_value in rec.values) for rec in LAX_GRAD_SPECIAL_VALUE_TESTS)) - def testOpGradSpecialValue(self, op, special_value): - check_grads(op, (special_value,), 2, ["fwd", "rev"]) + def testOpGradSpecialValue(self, op, special_value, tol): + check_grads(op, (special_value,), 2, ["fwd", "rev"], rtol=tol, atol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_from_dtype={}_to_dtype={}".format( @@ -2101,7 +2108,8 @@ def testReverseGrad(self): check_grads(rev, (onp.array([3., 2., 1.]),), 2) dimensions = [0, 1] - check_grads(rev, (onp.array([[6., 5., 4.], [3., 2., 1.]]),), 2) + check_grads(rev, (onp.array([[6., 5., 4.], [3., 2., 1.]]),), 2, + rtol={onp.float32: 3e-3}) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_predshape={}_argshapes={}".format( @@ -2248,7 +2256,7 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng_factory): if jtu.device_under_test() == "tpu" and op is lax.mul: raise SkipTest("unimplemented case") tol = gradient_tolerance( - dtype, {onp.float16: 1e-1, onp.float32: 1e-2, onp.float64: 1e-3}) + dtype, {onp.float16: 1e-1, onp.float32: 4e-2, onp.float64: 1e-3}) operand = rng(shape, dtype) init_val = onp.asarray(init_val, dtype=dtype) reduce = lambda operand: lax.reduce(operand, init_val, op, dims) @@ -2682,7 +2690,8 @@ def testClamp(self, min_shape, operand_shape, max_shape, dtype, bdims, rng_facto for rng_factory in [jtu.rand_default])) def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng_factory): rng = rng_factory() - self._CheckBatching(lax.dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng, + op = partial(lax.dot, precision=lax.Precision.HIGHEST) + self._CheckBatching(op, 5, bdims, (lhs_shape, rhs_shape), dtype, rng, rtol=tolerance(dtype, {onp.float16: 5e-2})) @parameterized.named_parameters(jtu.cases_from_list( diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 2f131b568c2d..56af60e93f0e 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -98,7 +98,8 @@ def testDet(self, n, dtype, rng_factory): self._CheckAgainstNumpy(onp.linalg.det, np.linalg.det, args_maker, check_dtypes=True, tol=1e-3) - self._CompileAndCheck(np.linalg.det, args_maker, check_dtypes=True) + self._CompileAndCheck(np.linalg.det, args_maker, check_dtypes=True, + rtol={onp.float64: 1e-13}) def testDetOfSingularMatrix(self): x = np.array([[-1., 3./2], [2./3, -1.]], dtype=onp.float32) @@ -629,7 +630,9 @@ def testLu(self, shape, dtype, rng_factory): args_maker = lambda: [rng(shape, dtype)] x, = args_maker() p, l, u = jsp.linalg.lu(x) - self.assertAllClose(x, onp.matmul(p, onp.matmul(l, u)), check_dtypes=True) + self.assertAllClose(x, onp.matmul(p, onp.matmul(l, u)), check_dtypes=True, + rtol={onp.float32: 1e-4, onp.float64:1e-12, + onp.complex64: 1e-4, onp.complex128:1e-12}) self._CompileAndCheck(jsp.linalg.lu, args_maker, check_dtypes=True) def testLuOfSingularMatrix(self): @@ -691,7 +694,8 @@ def testLuFactor(self, n, dtype, rng_factory): u = onp.triu(lu) for i in range(n): x[[i, piv[i]],] = x[[piv[i], i],] - self.assertAllClose(x, onp.matmul(l, u), check_dtypes=True, rtol=1e-3) + self.assertAllClose(x, onp.matmul(l, u), check_dtypes=True, rtol=1e-3, + atol=1e-3) self._CompileAndCheck(jsp.linalg.lu_factor, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -813,7 +817,8 @@ def testSolveTriangular(self, lower, transpose_a, unit_diagonal, lhs_shape, l if lower else T(l), b, trans=1 if transpose_a else 0, lower=lower, unit_diagonal=unit_diagonal) - self.assertAllClose(onp_ans, ans, check_dtypes=True) + self.assertAllClose(onp_ans, ans, check_dtypes=True, + rtol={onp.float32: 1e-4, onp.float64: 1e-11}) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": diff --git a/tests/masking_test.py b/tests/masking_test.py index 8e72d3468f7c..f9d920faeba9 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -301,7 +301,9 @@ def rnn_reference(W, seqs, targets): seqs_ = [xs[:t] for xs, t in zip(seqs, ts)] expected = grad(lambda W: rnn_reference(W, seqs_, ys).sum())(W) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose( + ans, expected, check_dtypes=False, + rtol={onp.float32:2e-2} if jtu.device_under_test() == "tpu" else None) def test_nesting(self): raise SkipTest("not yet implemented") diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 0c81398cc367..54a8ae5731d8 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -55,7 +55,7 @@ def fun(x, y): y = npr.uniform(size=(10,10)) z_host = onp.matmul(x, y) z = fun(x, y) - self.assertAllClose(z, z_host, check_dtypes=True) + self.assertAllClose(z, z_host, check_dtypes=True, rtol=1e-2) correct_platform = backend if backend else jtu.device_under_test() self.assertEqual(z.device_buffer.platform(), correct_platform) @@ -77,7 +77,7 @@ def infun(x, y): y = npr.uniform(size=(10,10)) z_host = onp.matmul(x, y) + onp.ones_like(x) z = fun(x, y) - self.assertAllClose(z, z_host, check_dtypes=True) + self.assertAllClose(z, z_host, check_dtypes=True, rtol=1e-2) correct_platform = outer if outer else jtu.device_under_test() self.assertEqual(z.device_buffer.platform(), correct_platform) diff --git a/tests/nn_test.py b/tests/nn_test.py index fddb63382fda..59b1906e88e0 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -37,7 +37,8 @@ class NNFunctionsTest(jtu.JaxTestCase): def testSoftplusGrad(self): - check_grads(nn.softplus, (1e-8,), 4) + check_grads(nn.softplus, (1e-8,), 4, + rtol=1e-2 if jtu.device_under_test() == "tpu" else None) def testSoftplusValue(self): val = nn.softplus(89.) diff --git a/tests/optimizers_test.py b/tests/optimizers_test.py index 749bb81f346a..083dde12dd2e 100644 --- a/tests/optimizers_test.py +++ b/tests/optimizers_test.py @@ -291,7 +291,7 @@ def loss(test_params): J1 = jacrev(loss, argnums=(0,))(initial_params) J2 = jacfwd(loss, argnums=(0,))(initial_params) - self.assertAllClose(J1, J2, check_dtypes=True) + self.assertAllClose(J1, J2, check_dtypes=True, rtol=1e-6) def testUnpackPackRoundTrip(self): opt_init, _, _ = optimizers.momentum(0.1, mass=0.9) diff --git a/tests/random_test.py b/tests/random_test.py index 0e135dde7e3f..8227f626e10a 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -286,7 +286,8 @@ def testGammaGrad(self, alpha): pdf = scipy.stats.gamma.pdf(z, alpha) expected_grad = -cdf_dot / pdf - self.assertAllClose(actual_grad, expected_grad, check_dtypes=True, rtol=0.0005) + self.assertAllClose(actual_grad, expected_grad, check_dtypes=True, + rtol=2e-2 if jtu.device_under_test() == "tpu" else 5e-4) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format(dtype), "dtype": onp.dtype(dtype).name} diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 9da08edd1cb6..c23f9c2c2cf3 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -66,7 +66,7 @@ def args_maker(): return [k, mu, loc] self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, - tol=1e-4) + tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @genNamedParametersNArgs(3, jtu.rand_default) @@ -97,8 +97,8 @@ def args_maker(): return [x, a, b, loc, scale] self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, - tol=1e-4) - self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + tol=1e-3) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True, rtol=2e-5) @genNamedParametersNArgs(3, jtu.rand_default) def testCauchyLogPdf(self, rng_factory, shapes, dtypes): @@ -112,7 +112,8 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @genNamedParametersNArgs(2, jtu.rand_positive) @@ -128,7 +129,8 @@ def args_maker(): x = x / onp.sum(x, axis=-1, keepdims=True) return [x, alpha] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @genNamedParametersNArgs(3, jtu.rand_positive) @@ -141,7 +143,8 @@ def args_maker(): x, loc, scale = map(rng, shapes, dtypes) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @genNamedParametersNArgs(4, jtu.rand_positive) @@ -170,7 +173,8 @@ def args_maker(): scale = onp.clip(scale, a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @genNamedParametersNArgs(3, jtu.rand_default) @@ -185,7 +189,8 @@ def args_maker(): scale = onp.clip(scale, a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-6) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) # TODO: currently it ignores the argument "shapes" and only tests dim=4 @@ -218,7 +223,8 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -234,7 +240,8 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -250,7 +257,8 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-6) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -268,8 +276,9 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [q, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True, rtol=1e-5) @genNamedParametersNArgs(4, jtu.rand_positive) @@ -282,7 +291,8 @@ def args_maker(): x, b, loc, scale = map(rng, shapes, dtypes) return [x, b, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -298,7 +308,8 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, df, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -312,7 +323,8 @@ def args_maker(): x, loc, scale = map(rng, shapes, dtypes) return [x, loc, onp.abs(scale)] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) def testIssue972(self): From 979a8d30b77e2da9cd11e49cbdeaab29fac7c3d8 Mon Sep 17 00:00:00 2001 From: Chase Roberts Date: Fri, 15 Nov 2019 14:33:39 -0800 Subject: [PATCH 0363/1053] Cast perm to tuple --- jax/lax/lax_parallel.py | 2 +- tests/pmap_test.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 05df8bdf4dc8..991b98a22a3c 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -114,7 +114,7 @@ def ppermute(x, axis_name, perm): An array with the same shape as ``x`` with slices along the axis ``axis_name`` gathered from ``x`` according to the permutation ``perm``. """ - return ppermute_p.bind(x, axis_name=axis_name, perm=perm) + return ppermute_p.bind(x, axis_name=axis_name, perm=tuple(perm)) def pswapaxes(x, axis_name, axis): """Swap the pmapped axis ``axis_name`` with the unmapped axis ``axis``. diff --git a/tests/pmap_test.py b/tests/pmap_test.py index daa2f0978028..089ff843373b 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -331,6 +331,16 @@ def testCollectivePermuteCyclicGrad(self): expected = onp.roll(onp.pi + onp.arange(device_count), 1) self.assertAllClose(ans, expected, check_dtypes=False) + @jtu.skip_on_devices("cpu", "gpu") + def testIssue1703(self): + num_devices = xla_bridge.device_count() + perm = [num_devices - 1] + list(range(num_devices - 1)) + f = pmap( + lambda x: lax.ppermute(x, "i", zip(range(num_devices), perm)), "i") + result = f(np.arange(num_devices)) + expected = np.asarray(perm, dtype=np.float32) + self.assertAllClose(result, expected) + @jtu.skip_on_devices("cpu", "gpu") def testRule30(self): # This is a test of collective_permute implementing a simple halo exchange From 3978007be85186cb579af0b9d80d85fb7b85999b Mon Sep 17 00:00:00 2001 From: Chase Roberts Date: Fri, 15 Nov 2019 14:35:12 -0800 Subject: [PATCH 0364/1053] Explict typing --- tests/pmap_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 089ff843373b..b1b27a08ee4c 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -337,7 +337,7 @@ def testIssue1703(self): perm = [num_devices - 1] + list(range(num_devices - 1)) f = pmap( lambda x: lax.ppermute(x, "i", zip(range(num_devices), perm)), "i") - result = f(np.arange(num_devices)) + result = f(np.arange(num_devices, dtype=np.float32)) expected = np.asarray(perm, dtype=np.float32) self.assertAllClose(result, expected) From 063419ab5f6cbcad3df6b2e509b0f1c8cf6b37c3 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 16 Nov 2019 14:40:25 -0800 Subject: [PATCH 0365/1053] tweak test name (cf. #1704) --- tests/pmap_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index b1b27a08ee4c..87b6c548ee5e 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -332,7 +332,8 @@ def testCollectivePermuteCyclicGrad(self): self.assertAllClose(ans, expected, check_dtypes=False) @jtu.skip_on_devices("cpu", "gpu") - def testIssue1703(self): + def testPpermuteWithZipObject(self): + # https://github.com/google/jax/issues/1703 num_devices = xla_bridge.device_count() perm = [num_devices - 1] + list(range(num_devices - 1)) f = pmap( From 5fa68774ea516dd9b3e8808d4446fdf4fe5cdb9d Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Sat, 16 Nov 2019 17:51:16 -0800 Subject: [PATCH 0366/1053] Bump jaxlib version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dae30af0ec70..1533c18d15b4 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.32-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.33-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From f882359511989388949a6011c373039309f7f54d Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Sun, 17 Nov 2019 00:19:24 -0800 Subject: [PATCH 0367/1053] fix lax.scan notes in gotchas notebook Note that lax.scan is now jittable and differentiable in the Gotchas notebook. --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 3fb72f707ca2..ff1d3dcd564a 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -1106,7 +1106,7 @@ " - `lax.cond` _will be differentiable soon_\n", " - `lax.while_loop` __non-differentiable__*\n", " - `lax.fori_loop` __non-differentiable__*\n", - " - `lax.scan` _will be differentiable soon_\n", + " - `lax.scan` _differentiable_\n", "\n", "*_these can in principle be made to be __forward__-differentiable, but this isn't on the current roadmap._" ] @@ -1294,7 +1294,7 @@ "\\textrm{lax.cond} & ✔ & \\textrm{soon!}\\\\\n", "\\textrm{lax.while_loop} & ✔ & ❌\\\\\n", "\\textrm{lax.fori_loop} & ✔ & ❌\\\\\n", - "\\textrm{lax.scan} & \\textrm{soon!} & \\textrm{soon!}\\\\\n", + "\\textrm{lax.scan} & ✔ & ✔\\\\\n", "\\hline\n", "\\end{array}\n", "$$\n", From 8ec6ea47420cb0d3c0af6e2de4eac825a7882ed1 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 18 Nov 2019 11:39:58 +0100 Subject: [PATCH 0368/1053] Implemented suggestions from code review. * added example of while_range to the module docstring. * wrap the very long lines --- jax/experimental/loops.py | 246 +++++++++++++++++++++++--------------- tests/loops_test.py | 2 +- 2 files changed, 153 insertions(+), 95 deletions(-) diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index 6f8adc38efb1..c9ce6d715e2a 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -12,13 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Loops is an **experimental** module for syntactic sugar for loops and control-flow in JAX. +"""Loops is an **experimental** module for syntactic sugar for loops and control-flow. -The current implementation should convert loops correctly to JAX internal representation, and most transformation -should work (see below), but we have not yet fine-tuned the performance of the resulting XLA compilation! +The current implementation should convert loops correctly to JAX internal +representation, and most transformations should work (see below), but we have +not yet fine-tuned the performance of the resulting XLA compilation! -By default, loops and control-flow in JAX are executed and inlined during tracing. For example, in the following code -the `for` loop is unrolled during JAX tracing:: +By default, loops and control-flow in JAX are executed and inlined during tracing. +For example, in the following code the `for` loop is unrolled during JAX tracing:: arr = onp.zeros(5) for i in range(arr.shape[0]): @@ -26,9 +27,10 @@ if i % 2 == 0: arr[i] += 1. -In order to capture the structured control-flow one has to use the higher-order JAX operations, which require -you to express the body of the loops and conditionals as functions, -and the array updates using a functional style that returns an updated array, e.g.:: +In order to capture the structured control-flow one has to use the higher-order +JAX operations, which require you to express the body of the loops and +conditionals as functions, and the array updates using a functional style that +returns an updated array, e.g.:: arr = onp.zeros(5) def loop_body(i, acc_arr): @@ -41,45 +43,62 @@ def loop_body(i, acc_arr): arr = lax.fori_loop(0, arr.shape[0], loop_body, arr) The default notation quickly gets unreadable with deeper nested loops. -With the utilities in this module you can write loops and conditionals that look closer to plain Python, -as long as you keep the loop-carried state in a special `loops.scope` object and use `for` loops -over special `scope.range` iterators:: +With the utilities in this module you can write loops and conditionals that +look closer to plain Python, as long as you keep the loop-carried state in a +special `loops.scope` object and use `for` loops over special +`scope.range` iterators:: from jax.experimental import loops with loops.Scope() as s: - s.arr = np.zeros(5) # Must create the mutable state of the loop as `scope` fields. + s.arr = np.zeros(5) # Create the mutable state of the loop as `scope` fields. for i in s.range(s.arr.shape[0]): s.arr = ops.index_update(s.arr, i, s.arr[i] + 2.) - for _ in s.cond_range(i % 2 == 0): # Conditionals are also sugared as loops with 0 or 1 iterations + for _ in s.cond_range(i % 2 == 0): # Conditionals as loops with 0 or 1 iterations s.arr = ops.index_update(s.arr, i, s.arr[i] + 1.) +Loops constructed with `range` must have literal constant bounds. If you need +loops with dynamic bounds, you can use the more general `while_range` iterator. +However, in that case that `grad` transformation is not supported:: + + s.idx = start + for _ in s.while_range(lambda: s.idx < end): + s.idx += 1 + Notes: - * Loops and conditionals to be functionalized can appear only inside scopes constructed with `loops.Scope` - and they must use one of the `Scope.range` iterators. All other loops are unrolled during tracing, as usual in JAX. - * Only scope data (stored in fields of the scope object) is functionalized. All other state, e.g., in other - Python variables, will not be considered as being part of the loop output. - All references to the mutable state should be through the scope: `s.arr`. - * Conceptually, this model is still "functional" in the sense that a loop over a `Scope.range` behaves - as a function whose input and output is the scope data. - * Scopes should be passed down to callees that need to use loop functionalization, or they may be nested. - * The programming model is that the loop body over a `scope.range` is traced only once, using abstract shape values, - similar to how JAX traces function bodies. + * Loops and conditionals to be functionalized can appear only inside scopes + constructed with `loops.Scope` and they must use one of the `Scope.range` + iterators. All other loops are unrolled during tracing, as usual in JAX. + * Only scope data (stored in fields of the scope object) is functionalized. + All other state, e.g., in other Python variables, will not be considered as + being part of the loop output. All references to the mutable state should be + through the scope: `s.arr`. + * Conceptually, this model is still "functional" in the sense that a loop over + a `Scope.range` behaves as a function whose input and output is the scope data. + * Scopes should be passed down to callees that need to use loop + functionalization, or they may be nested. + * The programming model is that the loop body over a `scope.range` is traced + only once, using abstract shape values, similar to how JAX traces function + bodies. Restrictions: - * The tracing of the loop body should not exit prematurely with `return`, `exception`, `break`. - This would be detected and reported as errors when we encounter unnested scopes. - * The loop index variable should not be used after the loop. Similarly, one should not use outside the loop - data computed in the loop body, except data stored in fields of the scope object. - * No new mutable state can be created inside a loop to be functionalized. All mutable state must be created outside - all loops and conditionals. - * For a `while` loop, the conditional function is not allowed to modify the scope state. This is a checked error. - Also, for `while` loops the `grad` transformation does not work. An alternative that allows `grad` is a bounded - loop (`range`) with a conditional to ignore a suffix of iterations. + * The tracing of the loop body should not exit prematurely with `return`, + `exception`, `break`. This would be detected and reported as errors when we + encounter unnested scopes. + * The loop index variable should not be used after the loop. Similarly, one + should not use outside the loop data computed in the loop body, except data + stored in fields of the scope object. + * No new mutable state can be created inside a loop to be functionalized. + All mutable state must be created outside all loops and conditionals. + * For a `while` loop, the conditional function is not allowed to modify the + scope state. This is a checked error. Also, for `while` loops the `grad` + transformation does not work. An alternative that allows `grad` is a bounded + loop (`range`). Transformations: - * All transformations are supported, except `grad` is not supported for `Scope.while_range` loops. - * `vmap` is very useful for such loops because it pushes more work into the inner-loops, which should help - performance for accelerators. + * All transformations are supported, except `grad` is not supported for + `Scope.while_range` loops. + * `vmap` is very useful for such loops because it pushes more work into the + inner-loops, which should help performance for accelerators. For usage example, see tests/loops_test.py. """ @@ -118,13 +137,14 @@ class Scope(object): """ def __init__(self): - self._mutable_state = {} # Keep here the state to be functionalized, indexed by name. - self._active_ranges = [] # The stack of active ranges, the last one is the innermost. + self._mutable_state = {} # state to be functionalized, indexed by name. + self._active_ranges = [] # stack of active ranges, last one is the innermost. def range(self, first, second=None, third=None): - """Creates a range for bounded iterations to be functionalized. + """Creates an iterator for bounded iterations to be functionalized. The body is converted to a `lax.scan`, for which all JAX transformations work. + The `first`, `second`, and `third` arguments must be integer literals. Usage:: @@ -151,7 +171,7 @@ def range(self, first, second=None, third=None): return _BodyTracer(self, _BoundedLoopBuilder(start, stop, step)) def cond_range(self, pred): - """Creates a conditional range with 0 or 1 iterations based on the boolean "pred". + """Creates a conditional iterator with 0 or 1 iterations based on the boolean. The body is converted to a `lax.cond`. All JAX transformations work. @@ -162,7 +182,8 @@ def cond_range(self, pred): """ # TODO: share these checks with lax_control_flow.cond if len(onp.shape(pred)) != 0: - raise TypeError("Pred must be a scalar, got {} of shape {}.".format(pred, onp.shape(pred))) + raise TypeError( + "Pred must be a scalar, got {} of shape {}.".format(pred, onp.shape(pred))) try: pred_dtype = onp.result_type(pred) @@ -180,9 +201,10 @@ def cond_range(self, pred): return _BodyTracer(self, _CondBuilder(pred)) def while_range(self, cond_func): - """Creates a range that continues as long as `cond_func` returns true. + """Creates an iterator that continues as long as `cond_func` returns true. - The body is converted to a `lax.while_loop`. The `grad` transformation does not work. + The body is converted to a `lax.while_loop`. + The `grad` transformation does not work. Usage:: @@ -194,14 +216,14 @@ def while_range(self, cond_func): """ return _BodyTracer(self, _WhileBuilder(cond_func)) - def _push_range(self, range): + def _push_range(self, range_): for ar in self._active_ranges: - if ar is range: - raise ValueError("Range is reused nested inside itself.") # No need to include location, range is in stacktrace - self._active_ranges.append(range) + if ar is range_: + raise ValueError("Range is reused nested inside itself.") + self._active_ranges.append(range_) - def _pop_range(self, range): - if not (range is self._active_ranges[-1]): + def _pop_range(self, range_): + if not (range_ is self._active_ranges[-1]): self._error_premature_exit_range() self._active_ranges.pop() @@ -218,7 +240,8 @@ def __getattr__(self, key): """ mt_val = self._mutable_state.get(key) if mt_val is None: - raise AttributeError("Reading uninitialized data '{}' from the scope.".format(key)) + raise AttributeError( + "Reading uninitialized data '{}' from the scope.".format(key)) return mt_val def __setattr__(self, key, value): @@ -230,7 +253,8 @@ def __setattr__(self, key, value): object.__setattr__(self, key, value) else: if self._active_ranges and key not in self._mutable_state: - raise ValueError("New mutable state '{}' cannot be created inside a loop.".format(key)) + raise ValueError( + "New mutable state '{}' cannot be created inside a loop.".format(key)) self._mutable_state[key] = value def __enter__(self): @@ -264,16 +288,19 @@ def __init__(self, scope, loop_builder): self.loop_builder = loop_builder self.first_iteration = True # If we are tracing the first iteration if six.PY3: - self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) # Stack trace, without this line and the s.range function + # Stack trace, without this line and the s.range function + self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) else: self.stack = None - # The rest is state kept from the start of the first iteration to the end of the iteration. - self.carried_state_initial = {} # The initial values of the mutable state upon entering the range body. - self.carried_state_vars = {} # The parameters that were created for state upon entering an arbitrary iteration. + # Next are state kept from the start of the first iteration to the end of the iteration. + self.carried_state_initial = {} + # The parameters that were created for state upon entering an arbitrary iteration. + self.carried_state_vars = {} self.trace = None - self.carried_state_names = None # List of scope fields carried through the loop + # List of scope fields carried through the loop + self.carried_state_names = None self.init_tree = None # The PyTreeDef corresponding to carried_state_names self.init_vals = None # The values corresponding to self.init_tree @@ -326,35 +353,45 @@ def start_tracing_body(self): def end_tracing_body(self): """Called when we are done tracing one iteration of the body.""" - # We will turn the body of the loop into a function that takes some values for the scope state (carried_state_names) - # and returns the values for the same state fields after one execution of the body. For some of the ranges, + # We will turn the body of the loop into a function that takes some values + # for the scope state (carried_state_names) and returns the values for the + # same state fields after one execution of the body. For some of the ranges, # e.g., scope.range, the function will also take the index_var as last parameter. in_tracers = [self.carried_state_vars[ms] for ms in self.carried_state_names] if self.loop_builder.can_use_index_var(): in_tracers += [self._index_var] # Make the jaxpr for the body of the loop - # TODO: See which mutable state was changed in the one iteration. For now, we assume all state changes. - body_out_tracers = tuple([self.scope._mutable_state[ms] for ms in self.carried_state_names]) + # TODO: See which mutable state was changed in the one iteration. + # For now, we assume all state changes. + body_out_tracers = tuple([self.scope._mutable_state[ms] + for ms in self.carried_state_names]) try: - # If the body actually uses the index variable, and is not allowed to (e.g., cond_range and while_range), - # then in_tracers will not contain the tracer for the index_var, and trace_to_jaxpr_finalize will throw + # If the body actually uses the index variable, and is not allowed to + # (e.g., cond_range and while_range), then in_tracers will not contain + # the tracer for the index_var, and trace_to_jaxpr_finalize will throw # an assertion error. - body_typed_jaxpr, body_const_vals = _BodyTracer.trace_to_jaxpr_finalize(in_tracers=in_tracers, - out_tracers=body_out_tracers, - trace=self.trace) + body_typed_jaxpr, body_const_vals = _BodyTracer.trace_to_jaxpr_finalize( + in_tracers=in_tracers, + out_tracers=body_out_tracers, + trace=self.trace) except AssertionError as e: if "Encountered unexpected tracer" == str(e): - raise ValueError("Body of cond_range or while_range should not use the index variable returned by iterator.") + raise ValueError("Body of cond_range or while_range should not use the " + "index variable returned by iterator.") raise - _BodyTracer.end_subtrace() # End the subtrace for the loop body, before we trace the condition + # End the subtrace for the loop body, before we trace the condition + _BodyTracer.end_subtrace() - carried_init_val = tuple([self.carried_state_initial[ms] for ms in self.carried_state_names]) + carried_init_val = tuple([self.carried_state_initial[ms] + for ms in self.carried_state_names]) carried_init_vals, carried_tree = tree_util.tree_flatten(carried_init_val) carried_out_vals = self.loop_builder.build_output_vals( - self.scope, self.carried_state_names, carried_tree, carried_init_vals, body_typed_jaxpr, body_const_vals) - carried_mutable_state_unflattened = tree_util.tree_unflatten(carried_tree, carried_out_vals) + self.scope, self.carried_state_names, carried_tree, + carried_init_vals, body_typed_jaxpr, body_const_vals) + carried_mutable_state_unflattened = tree_util.tree_unflatten(carried_tree, + carried_out_vals) # Update the mutable state with the values of the changed vars, after the loop. for ms, mv in zip(self.carried_state_names, carried_mutable_state_unflattened): @@ -383,7 +420,8 @@ def trace_to_jaxpr_finalize(in_tracers, out_tracers, trace, instantiate=True): # TODO: This is the final part of the partial_eval.trace_to_subjaxpr. Share. instantiate = [instantiate] * len(out_tracers) out_tracers = safe_map(trace.full_raise, safe_map(core.full_lower, out_tracers)) - out_tracers = safe_map(partial(pe.instantiate_const_at, trace), instantiate, out_tracers) + out_tracers = safe_map(partial(pe.instantiate_const_at, trace), + instantiate, out_tracers) jaxpr, consts, env = pe.tracers_to_jaxpr(in_tracers, out_tracers) out_pvals = [t.pval for t in out_tracers] # TODO: this is from partial_eval.trace_to_jaxpr. Share. @@ -391,7 +429,8 @@ def trace_to_jaxpr_finalize(in_tracers, out_tracers, trace, instantiate=True): # TODO: this is from the final part of lax_control_flow._initial_style_jaxpr out_avals = safe_map(abstract_arrays.raise_to_shaped, unzip2(out_pvals)[0]) - const_avals = tuple(abstract_arrays.raise_to_shaped(core.get_aval(c)) for c in consts) + const_avals = tuple(abstract_arrays.raise_to_shaped(core.get_aval(c)) + for c in consts) in_pvals = [t.pval for t in in_tracers] in_avals = tuple(safe_map(abstract_arrays.raise_to_shaped, unzip2(in_pvals)[0])) @@ -408,15 +447,18 @@ def can_use_index_var(self): """Whether this kind of loop can use the index var returned by the range iterator.""" raise NotImplementedError - def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): + def build_output_vals(self, scope, carried_state_names, carried_tree, + init_vals, body_typed_jaxpr, body_const_vals): """Builds the output values for the loop carried state. Params: scope: the current Scope object. - carried_state_names: the list of names of mutable state fields that is carried through the body. + carried_state_names: the list of names of mutable state fields that is + carried through the body. carried_tree: the PyTreeDef for the tuple of carried_state_names. init_vals: the initial values on body entry corresponding to the init_tree. - body_typed_jaxpr: the Jaxpr for the body returning the new values of carried_state_names. + body_typed_jaxpr: the Jaxpr for the body returning the new values of + carried_state_names. body_const_vals: the constant values for the body. Returns: @@ -440,12 +482,17 @@ def __init__(self, start, stop, step): def can_use_index_var(self): return True - def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): + def build_output_vals(self, scope, carried_state_names, carried_tree, + init_vals, body_typed_jaxpr, body_const_vals): arange_val = jnp.arange(self.start, stop=self.stop, step=self.step) - return lax_control_flow.scan_p.bind(*itertools.chain(body_const_vals, init_vals, [arange_val]), - forward=True, length=arange_val.shape[0], jaxpr=body_typed_jaxpr, - num_consts=len(body_const_vals), num_carry=len(init_vals), - linear=(False,) * (len(body_const_vals) + len(init_vals) + 1)) + return lax_control_flow.scan_p.bind(*itertools.chain(body_const_vals, + init_vals, [arange_val]), + forward=True, length=arange_val.shape[0], + jaxpr=body_typed_jaxpr, + num_consts=len(body_const_vals), + num_carry=len(init_vals), + linear=(False,) * (len(body_const_vals) + + len(init_vals) + 1)) class _CondBuilder(_LoopBuilder): @@ -457,14 +504,17 @@ def __init__(self, pred): def can_use_index_var(self): return False - def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): + def build_output_vals(self, scope, carried_state_names, carried_tree, + init_vals, body_typed_jaxpr, body_const_vals): # Simulate a pass-through false branch init_avals = safe_map(_BodyTracer.abstractify, init_vals) - false_body_typed_jaxpr, false_body_const_vals, _ = lax_control_flow._initial_style_jaxpr(lambda *args: args, - carried_tree, - tuple(init_avals)) + false_body_typed_jaxpr, false_body_const_vals, _ = ( + lax_control_flow._initial_style_jaxpr(lambda *args: args, + carried_tree, + tuple(init_avals))) return lax_control_flow.cond_p.bind( - *itertools.chain([self.pred], body_const_vals, init_vals, false_body_const_vals, init_vals), + *itertools.chain([self.pred], body_const_vals, + init_vals, false_body_const_vals, init_vals), true_jaxpr=body_typed_jaxpr, false_jaxpr=false_body_typed_jaxpr, true_nconsts=len(body_const_vals), false_nconsts=len(false_body_const_vals)) @@ -478,10 +528,13 @@ def __init__(self, cond_func): def can_use_index_var(self): return False - def build_output_vals(self, scope, carried_state_names, carried_tree, init_vals, body_typed_jaxpr, body_const_vals): - # Trace the conditional function. cond_func takes 0 arguments, but for lax.while we need a conditional function - # that takes the carried_state_names. _initial_style_jaxpr will start its own trace and will create tracers for - # all the carried state. We must put these values in the scope._mutable_state before we trace the conditional + def build_output_vals(self, scope, carried_state_names, carried_tree, + init_vals, body_typed_jaxpr, body_const_vals): + # Trace the conditional function. cond_func takes 0 arguments, but + # for lax.while we need a conditional function that takes the + # carried_state_names. _initial_style_jaxpr will start its own trace and + # will create tracers for all the carried state. We must put these values + # in the scope._mutable_state before we trace the conditional # function. def cond_func_wrapped(*args): assert len(args) == len(carried_state_names) @@ -496,9 +549,10 @@ def cond_func_wrapped(*args): return res init_avals = safe_map(_BodyTracer.abstractify, init_vals) - cond_jaxpr, cond_consts, cond_tree = lax_control_flow._initial_style_jaxpr(cond_func_wrapped, - carried_tree, - tuple(init_avals)) + cond_jaxpr, cond_consts, cond_tree = ( + lax_control_flow._initial_style_jaxpr(cond_func_wrapped, + carried_tree, + tuple(init_avals))) # TODO: share these checks with lax_control_flow.while if not tree_util.treedef_is_leaf(cond_tree): msg = "cond_fun must return a boolean scalar, but got pytree {}." @@ -507,7 +561,11 @@ def cond_func_wrapped(*args): msg = "cond_fun must return a boolean scalar, but got output type(s) {}." raise TypeError(msg.format(cond_jaxpr.out_avals)) - return lax_control_flow.while_p.bind(*itertools.chain(cond_consts, body_const_vals, init_vals), - cond_nconsts=len(cond_consts), cond_jaxpr=cond_jaxpr, - body_nconsts=len(body_const_vals), body_jaxpr=body_typed_jaxpr) + return lax_control_flow.while_p.bind(*itertools.chain(cond_consts, + body_const_vals, + init_vals), + cond_nconsts=len(cond_consts), + cond_jaxpr=cond_jaxpr, + body_nconsts=len(body_const_vals), + body_jaxpr=body_typed_jaxpr) diff --git a/tests/loops_test.py b/tests/loops_test.py index 8565f2942478..9f484ab5d095 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -1,4 +1,4 @@ -# Copyright 2018 Google LLC +# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 42dd736afda0f88e0232095a4df51e5b0ad9855e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 18 Nov 2019 14:51:10 -0500 Subject: [PATCH 0369/1053] Change scalar promotion rules to prefer array types over scalar types. (#1709) * Change scalar promotion rules to prefer array types over scalar types. Currently JAX does not treat Python scalars specially during type promotion. This means that, for example: `1. + np.array([...], np.float32)` ends up as an array of type np.float64. The `1.` is promoted to a default type (here np.float64), and the type promotion of a np.float64 and an np.float32 is an np.float64. This is unlike classic NumPy, which treats scalars specially during type promotion, in particular, preferring the type of an array over the type of a scalar. This change adds a notion of weak_type to JAX avals. During type promotion, we prefer non-weak types, i.e., the type of the array in the example above, ignoring the type of the scalar. In contexts where a Python scalar is to be promoted to a NumPy value, a default type is used (e.g., `np.float_`). This change also makes it possible to use 32-bit default types that differ from NumPy's default types. The JAX test suite passes with 32-bit default types. However, we do not yet enable this change or expose it in the API. --- jax/abstract_arrays.py | 92 +++++++++++++------ jax/core.py | 4 +- jax/dtypes.py | 98 ++++++++++++++++++-- jax/interpreters/batching.py | 3 +- jax/interpreters/xla.py | 15 ++- jax/lax/lax.py | 9 +- jax/lax/lax_control_flow.py | 18 ++-- jax/lib/xla_bridge.py | 10 +- jax/numpy/lax_numpy.py | 48 ++++++---- jax/numpy/linalg.py | 8 +- jax/random.py | 6 +- jax/test_util.py | 35 ++++--- tests/api_test.py | 2 + tests/batching_test.py | 17 ++-- tests/dtypes_test.py | 84 +++++++++++++++++ tests/lax_control_flow_test.py | 38 ++++---- tests/lax_numpy_test.py | 162 +++++++++++++++++++-------------- tests/lax_test.py | 4 +- tests/masking_test.py | 14 +-- tests/optimizers_test.py | 2 +- tests/pmap_test.py | 6 +- 21 files changed, 482 insertions(+), 193 deletions(-) create mode 100644 tests/dtypes_test.py diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 0d702b1078cf..bd966c794e4a 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -40,14 +40,16 @@ def error(self, *args): class UnshapedArray(core.AbstractValue): - __slots__ = ['dtype'] - array_abstraction_level = 3 + __slots__ = ['dtype', 'weak_type'] + array_abstraction_level = 2 - def __init__(self, dtype): + def __init__(self, dtype, weak_type=False): self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)) + self.weak_type = weak_type def __eq__(self, other): - return type(self) is type(other) and self.dtype == other.dtype + return (type(self) is type(other) and self.dtype == other.dtype and + self.weak_type == other.weak_type) def __ne__(self, other): return not self == other @@ -56,10 +58,11 @@ def __hash__(self): # can use hash(self.dtype) and rely on the fact that numpy reuses base dtype # objects, e.g. `onp.zeros(3).dtype is onp.zeros(4).dtype`, or we can use # the unique character code via hash(self.dtype.char) - return hash(self.dtype) + return hash((self.dtype, self.weak_type)) def __repr__(self): - return '{}({})'.format(self.__class__.__name__, self.str_short()) + return '{}({}{})'.format(self.__class__.__name__, self.str_short(), + ", weak_type=True" if self.weak_type else "") _bool = _nonzero = concretization_function_error(bool) _float = concretization_function_error(float) @@ -75,20 +78,27 @@ def at_least_vspace(self): def join(self, other): if self.dtype == other.dtype: - return self + if self.weak_type == other.weak_type: + return self + else: + return UnshapedArray(self.dtype, weak_type=False) else: - raise TypeError(other) + raise TypeError(self, other) def str_short(self): return self.dtype.name + def strip_weak_type(self): + """Returns a copy of the aval with weak_type=False.""" + return UnshapedArray(self.dtype) if self.weak_type else self + class ShapedArray(UnshapedArray): __slots__ = ['shape'] - array_abstraction_level = 2 + array_abstraction_level = 1 - def __init__(self, shape, dtype): - self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)) + def __init__(self, shape, dtype, weak_type=False): + super(ShapedArray, self).__init__(dtype, weak_type=weak_type) self.shape = shape ndim = property(lambda self: len(self.shape)) @@ -96,24 +106,28 @@ def __init__(self, shape, dtype): def __eq__(self, other): return (type(self) is type(other) - and self.dtype == other.dtype and self.shape == other.shape) + and self.dtype == other.dtype and self.shape == other.shape + and self.weak_type == other.weak_type) def __hash__(self): # can use hash(self.dtype) and rely on the fact that numpy reuses base dtype # objects, e.g. `onp.zeros(3).dtype is onp.zeros(4).dtype`, or we can use # the unique character code via hash(self.dtype.char) - return hash((self.shape, self.dtype)) + return hash((self.shape, self.dtype, self.weak_type)) def at_least_vspace(self): return self def join(self, other): if self.shape == other.shape and self.dtype == other.dtype: - return self + if self.weak_type == other.weak_type: + return self + else: + return ShapedArray(self.shape, self.dtype, weak_type=False) elif self.dtype == other.dtype: return UnshapedArray(self.dtype) else: - raise TypeError(other) + raise TypeError(self, other) def str_short(self): shapestr = ','.join(map(str, self.shape)) @@ -128,41 +142,48 @@ def __len__(self): def _len(self, ignored_tracer): return len(self) + def strip_weak_type(self): + return ShapedArray(self.shape, self.dtype) if self.weak_type else self class ConcreteArray(ShapedArray): __slots__ = ['val'] array_abstraction_level = 0 - def __init__(self, val): + def __init__(self, val, weak_type=False): + super(ConcreteArray, self).__init__(onp.shape(val), onp.result_type(val), + weak_type=weak_type) + # Note: canonicalized self.dtype doesn't necessarily match self.val self.val = val - self.shape = onp.shape(val) - # canonicalized self.dtype doesn't necessarily match self.val - self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtypes.result_type(val))) assert self.dtype != onp.dtype('O') def __eq__(self, other): return (type(self) is type(other) and self.dtype == other.dtype - and self.shape == other.shape and onp.all(self.val == other.val)) + and self.shape == other.shape and self.weak_type == other.weak_type + and onp.all(self.val == other.val)) def __hash__(self): return id(self.val) def at_least_vspace(self): - return ShapedArray(self.shape, self.dtype) + return ShapedArray(self.shape, self.dtype, weak_type=self.weak_type) def join(self, other): if self == other: return self elif self.shape == other.shape and self.dtype == other.dtype: - return ShapedArray(self.shape, self.dtype) + return ShapedArray(self.shape, self.dtype, + weak_type=self.weak_type and other.weak_type) elif self.dtype == other.dtype: - return UnshapedArray(self.dtype) + return UnshapedArray(self.dtype, + weak_type=self.weak_type and other.weak_type) else: - raise TypeError(other) + raise TypeError(self, other) def str_short(self): return str(self.val) + def strip_weak_type(self): + return ConcreteArray(self.val) if self.weak_type else self class AbstractToken(core.AbstractValue): pass @@ -181,10 +202,7 @@ def zeros_like_array(x): onp.complex64, onp.complex128, onp.int64, onp.int32, onp.int16, onp.int8, onp.bool_, onp.uint64, onp.uint32, onp.uint16, onp.uint8, - onp.longlong, complex, float, int, bool} - -if six.PY2: - array_types.add(long) # noqa: F821 + onp.longlong} for t in array_types: core.pytype_aval_mappings[t] = ConcreteArray @@ -208,3 +226,21 @@ def raise_to_shaped(aval): raise TypeError(type(aval)) core.literalable_types.update(array_types) + +def make_abstract_python_scalar(x): + return ShapedArray((), dtypes.python_scalar_dtypes[type(x)], + weak_type=True) + +def _zeros_like_python_scalar(x): + return onp.array(0, dtypes.python_scalar_dtypes[type(x)]) + +def _make_concrete_python_scalar(x): + return ConcreteArray( + onp.array(x, dtype=dtypes.python_scalar_dtypes[type(x)]), + weak_type=True) + +for t in dtypes.python_scalar_dtypes.keys(): + core.pytype_aval_mappings[t] = _make_concrete_python_scalar + ad_util.jaxval_zeros_likers[t] = _zeros_like_python_scalar + +core.literalable_types.update(dtypes.python_scalar_dtypes.keys()) diff --git a/jax/core.py b/jax/core.py index f189b54d1888..015ce09ad7a1 100644 --- a/jax/core.py +++ b/jax/core.py @@ -282,7 +282,7 @@ class Tracer(object): __array_priority__ = 1000 __slots__ = ['trace', '__weakref__'] - def __array__(self): + def __array__(self, *args, **kw): raise Exception("Tracer can't be used with raw numpy functions. " "You might have\n import numpy as np\ninstead of\n import jax.numpy as np") @@ -491,6 +491,8 @@ def __repr__(self): except AttributeError: return self.__class__.__name__ + def strip_weak_type(self): + return self class Bot(AbstractValue): pass diff --git a/jax/dtypes.py b/jax/dtypes.py index 08f4d7a79a88..6ddeacae03dd 100644 --- a/jax/dtypes.py +++ b/jax/dtypes.py @@ -20,6 +20,7 @@ import os import numpy as onp +import six from .config import flags from . import util @@ -29,14 +30,18 @@ strtobool(os.getenv('JAX_ENABLE_X64', 'False')), 'Enable 64-bit types to be used.') -iinfo = onp.iinfo -finfo = onp.finfo -can_cast = onp.can_cast -issubdtype = onp.issubdtype -issubsctype = onp.issubsctype -result_type = onp.result_type -promote_types = onp.promote_types +# Default types. + +bool_ = onp.bool_ +int_ = onp.int64 +float_ = onp.float64 +complex_ = onp.complex128 + +# TODO(phawkins): change the above defaults to: +# int_ = onp.int32 +# float_ = onp.float32 +# complex_ = onp.complex64 _dtype_to_32bit_dtype = { @@ -55,3 +60,82 @@ def canonicalize_dtype(dtype): return dtype else: return _dtype_to_32bit_dtype.get(dtype, dtype) + + +# Default dtypes corresponding to Python scalars. +python_scalar_dtypes = { + bool: onp.dtype(bool_), + int: onp.dtype(int_), + float: onp.dtype(float_), + complex: onp.dtype(complex_), +} + +if six.PY2: + python_scalar_dtypes[long] = onp.dtype(int_) # noqa: F821 + +def scalar_type_of(x): + typ = dtype(x) + if onp.issubdtype(typ, onp.bool_): + return bool + elif onp.issubdtype(typ, onp.integer): + return int + elif onp.issubdtype(typ, onp.floating): + return float + elif onp.issubdtype(typ, onp.complexfloating): + return complex + else: + raise TypeError("Invalid scalar value {}".format(x)) + +def coerce_to_array(x): + """Coreces a scalar or NumPy array to an onp.array. + + Handles Python scalar type promotion according to JAX's rules, not NumPy's + rules. + """ + dtype = python_scalar_dtypes.get(type(x), None) + return onp.array(x, dtype) if dtype else onp.array(x) + +iinfo = onp.iinfo +finfo = onp.finfo + +can_cast = onp.can_cast +issubdtype = onp.issubdtype +issubsctype = onp.issubsctype +promote_types = onp.promote_types + + +def is_python_scalar(x): + try: + return x.aval.weak_type and onp.ndim(x) == 0 + except AttributeError: + return type(x) in python_scalar_dtypes + +def _dtype_priority(dtype): + if issubdtype(dtype, onp.bool_): + return 0 + elif issubdtype(dtype, onp.integer): + return 1 + elif issubdtype(dtype, onp.floating): + return 2 + elif issubdtype(dtype, onp.complexfloating): + return 3 + else: + raise TypeError("Dtype {} is not supported by JAX".format(dtype)) + +def dtype(x): + if type(x) in python_scalar_dtypes: + return python_scalar_dtypes[type(x)] + return onp.result_type(x) + +def result_type(*args): + """Convenience function to apply Numpy argument dtype promotion.""" + # TODO(dougalm,mattjj): This is a performance bottleneck. Consider memoizing. + if len(args) < 2: + return dtype(args[0]) + scalars = [] + dtypes = [] + for x in args: + (scalars if is_python_scalar(x) else dtypes).append(dtype(x)) + array_priority = max(map(_dtype_priority, dtypes)) if dtypes else -1 + dtypes += [x for x in scalars if _dtype_priority(x) > array_priority] + return canonicalize_dtype(onp.result_type(*dtypes)) \ No newline at end of file diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 05fa06a76484..f0d09d6c1edc 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -26,6 +26,7 @@ from six.moves import reduce from .. import core +from .. import dtypes from ..core import Trace, Tracer, new_master from ..abstract_arrays import ShapedArray, make_shaped_array, array_types, raise_to_shaped from ..ad_util import add_jaxvals, add_jaxvals_p, zeros_like_jaxval, zeros_like_p @@ -253,7 +254,7 @@ def broadcast(x, sz, axis): shape = list(onp.shape(x)) shape.insert(axis, sz) if isinstance(x, onp.ndarray) or onp.isscalar(x): - return onp.broadcast_to(x, shape) + return onp.broadcast_to(dtypes.coerce_to_array(x), shape) else: broadcast_dims = tuple(onp.delete(onp.arange(len(shape)), axis)) return x.broadcast_in_dim(shape, broadcast_dims) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 7a278b947643..07c8948a50a6 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -34,7 +34,7 @@ from .. import linear_util as lu from ..abstract_arrays import (ConcreteArray, ShapedArray, AbstractToken, make_shaped_array, array_types, raise_to_shaped, - abstract_token) + abstract_token, make_abstract_python_scalar) from ..core import valid_jaxtype, Literal from ..util import partial, partialmethod, cache, safe_map, prod, unzip2 from ..lib import xla_bridge as xb @@ -95,6 +95,12 @@ def _device_put_array(x, device, backend=None): for _t in array_types: device_put_handlers[_t] = _device_put_array +def _device_put_scalar(x, device, backend=None): + return xc.Buffer.from_pyval(dtypes.coerce_to_array(x), device, + backend=xb.get_backend(backend)) +for _t in dtypes.python_scalar_dtypes.keys(): + device_put_handlers[_t] = _device_put_array + # TODO(mattjj): try to remove this canonicalize_dtype stuff def canonicalize_dtype(x): try: @@ -107,6 +113,11 @@ def _canonicalize_ndarray_dtype(x): return onp.asarray(x, dtypes.canonicalize_dtype(dtypes.result_type(x))) for _t in array_types: canonicalize_dtype_handlers[_t] = _canonicalize_ndarray_dtype +def _canonicalize_python_scalar_dtype(x): + return onp.asarray( + x, dtypes.canonicalize_dtype(dtypes.python_scalar_dtypes[type(x)])) +for _t in dtypes.python_scalar_dtypes.keys(): + canonicalize_dtype_handlers[_t] = _canonicalize_python_scalar_dtype def abstractify(x): try: @@ -117,6 +128,8 @@ def abstractify(x): pytype_aval_mappings[core.Unit] = lambda _: core.abstract_unit for _t in array_types: pytype_aval_mappings[_t] = make_shaped_array +for _t in dtypes.python_scalar_dtypes.keys(): + pytype_aval_mappings[_t] = make_abstract_python_scalar ### op-by-op execution diff --git a/jax/lax/lax.py b/jax/lax/lax.py index b64fab334e0c..d3f1b5d1970e 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1318,7 +1318,7 @@ def index_in_dim(operand, index, axis=0, keepdims=True): def dynamic_slice_in_dim(operand, start_index, slice_size, axis=0): """Convenience wrapper around dynamic_slice applying to one dimension.""" - start_indices = [0] * operand.ndim + start_indices = [_zero(start_index)] * operand.ndim slice_sizes = list(operand.shape) axis = int(axis) @@ -1338,7 +1338,7 @@ def dynamic_index_in_dim(operand, index, axis=0, keepdims=True): def dynamic_update_slice_in_dim(operand, update, start_index, axis): axis = int(axis) - start_indices = [0] * _ndim(operand) + start_indices = [_zero(start_index)] * _ndim(operand) start_indices[axis] = start_index return dynamic_update_slice(operand, update, start_indices) @@ -1449,7 +1449,8 @@ def _iter(tracer): def zeros_like_array(x): return full_like(x, 0) -for t in itertools.chain(array_types, [xla.DeviceArray]): +for t in itertools.chain(dtypes.python_scalar_dtypes.keys(), array_types, + [xla.DeviceArray]): ad_util.jaxval_adders[t] = add ad_util.jaxval_zeros_likers[xla.DeviceArray] = zeros_like_array @@ -4376,6 +4377,8 @@ def _dynamic_slice_indices(operand, start_indices): def _const(example, val): + if dtypes.is_python_scalar(example): + return dtypes.scalar_type_of(example)(val) return onp.array(val, _dtype(example)) _zeros = partial(full_like, fill_value=0) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 64b313088fd2..0ce200821010 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -68,14 +68,15 @@ def _abstractify(x): return raise_to_shaped(core.get_aval(x)) def typecheck(aval, x): - aval = raise_to_shaped(aval) + aval = raise_to_shaped(aval).strip_weak_type() try: - return aval == core.lattice_join(aval, core.get_aval(x)) + return aval == core.lattice_join(aval, core.get_aval(x)).strip_weak_type() except TypeError: return False def typematch(aval1, aval2): - return raise_to_shaped(aval1) == raise_to_shaped(aval2) + return (raise_to_shaped(aval1).strip_weak_type() == + raise_to_shaped(aval2).strip_weak_type()) class FixedPointError(Exception): pass @@ -190,10 +191,10 @@ def while_loop(cond_fun, body_fun, init_val): init_avals = tuple(_map(_abstractify, init_vals)) cond_jaxpr, cond_consts, cond_tree = _initial_style_jaxpr(cond_fun, in_tree, init_avals) body_jaxpr, body_consts, body_tree = _initial_style_jaxpr(body_fun, in_tree, init_avals) - if not treedef_is_leaf(cond_tree): + if not treedef_is_leaf(cond_tree) or len(cond_jaxpr.out_avals) != 1: msg = "cond_fun must return a boolean scalar, but got pytree {}." raise TypeError(msg.format(cond_tree)) - if cond_jaxpr.out_avals != [ShapedArray((), onp.bool_)]: + if cond_jaxpr.out_avals[0].strip_weak_type() != ShapedArray((), onp.bool_): msg = "cond_fun must return a boolean scalar, but got output type(s) {}." raise TypeError(msg.format(cond_jaxpr.out_avals)) @@ -515,7 +516,6 @@ def scan(f, init, xs): x_dtypes = [x.dtype for x in xs_flat] x_avals = tuple(_map(ShapedArray, x_shapes, x_dtypes)) jaxpr, consts, out_tree = _initial_style_jaxpr(f, in_tree, carry_avals + x_avals) - out_tree_children = out_tree.children() if len(out_tree_children) != 2: msg = "scan body output must be a pair, got {}." @@ -549,7 +549,7 @@ def body_fun(i, vals): return carry_out + ys_out ys_init = _map(partial(_empty_array, length), y_avals) - return fori_loop(0, length, body_fun, init + ys_init) + return fori_loop(lax._const(length, 0), length, body_fun, init + ys_init) def _index_array(i, aval, x): if aval is core.abstract_unit: @@ -884,7 +884,7 @@ def masked(*args): for new_c, c in zip(new_carry, carry)] return [i + 1] + new_carry + ys - aval = ShapedArray((), onp.int64) + aval = ShapedArray((), dtypes.int_) const_avals, carry_avals, x_avals = split_list(jaxpr.in_avals, [num_consts, num_carry]) return _make_typed_jaxpr(masked, [aval] + const_avals + [aval] + carry_avals + x_avals) @@ -897,7 +897,7 @@ def scan_bind(*args, **kwargs): # check that args match input types consts_avals, init_avals, x_avals = split_list(jaxpr.in_avals, [num_consts, num_carry]) xs_avals = _map(partial(_promote_aval_rank, length), x_avals) - assert all(_map(typecheck, consts_avals, consts)) + assert all(_map(typecheck, consts_avals, consts)), (consts, consts_avals) assert all(_map(typecheck, init_avals, init)) # assert all(_map(typecheck, xs_avals, xs)) # check that output carry type matches input carry type diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 6a830304319d..c46a6a4b34a7 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -23,6 +23,7 @@ from __future__ import division from __future__ import print_function +from functools import partial import os import warnings @@ -347,8 +348,11 @@ def _scalar_constant_handler(c, val, canonicalize_types=True): for scalar_type in [onp.int8, onp.int16, onp.int32, onp.int64, onp.uint8, onp.uint16, onp.uint32, onp.uint64, onp.float16, onp.float32, onp.float64, onp.float128, - float, int, bool, onp.bool_, onp.longlong]: + onp.bool_, onp.longlong]: register_constant_handler(scalar_type, _scalar_constant_handler) -if six.PY2: - register_constant_handler(long, _scalar_constant_handler) # noqa: F821 +def _python_scalar_handler(dtype, c, val, canonicalize_dtypes=True): + return c.NumpyArrayConstant(dtype.type(val)) + +for ptype, dtype in dtypes.python_scalar_dtypes.items(): + register_constant_handler(ptype, partial(_python_scalar_handler, dtype)) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index d07d51b582dd..b7f3eaca6948 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -114,15 +114,18 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, " Use jax.numpy.array, or jax.numpy.zeros instead.") -isscalar = onp.isscalar iscomplexobj = onp.iscomplexobj shape = _shape = onp.shape ndim = _ndim = onp.ndim size = onp.size -_dtype = lax.dtype +_dtype = dtypes.result_type bool_ = onp.bool_ +int_ = dtypes.int_ +float_ = dtypes.float_ +complex_ = dtypes.complex_ + uint8 = onp.uint8 uint16 = onp.uint16 uint32 = onp.uint32 @@ -206,10 +209,8 @@ def _promote_dtypes(*args): if len(args) < 2: return args else: - from_dtypes = map(_dtype, args) - to_dtype = dtypes.canonicalize_dtype(result_type(*from_dtypes)) - return [lax.convert_element_type(x, to_dtype) - if _dtype(x) != to_dtype else x for x in args] + to_dtype = result_type(*args) + return [lax.convert_element_type(x, to_dtype) for x in args] def _promote_to_result_dtype(op, *args): """Convenience function to promote args directly to the op's result dtype.""" @@ -223,11 +224,12 @@ def _result_dtype(op, *args): return _dtype(op(*args)) +def _arraylike(x): return isinstance(x, ndarray) or isscalar(x) def _check_arraylike(fun_name, *args): """Check if all args fit JAX's definition of arraylike (ndarray or scalar).""" - not_array = lambda x: not isinstance(x, ndarray) and not onp.isscalar(x) - if _any(not_array(arg) for arg in args): - pos, arg = next((i, arg) for i, arg in enumerate(args) if not_array(arg)) + if _any(not _arraylike(arg) for arg in args): + pos, arg = next((i, arg) for i, arg in enumerate(args) + if not _arraylike(arg)) msg = "{} requires ndarray or scalar arguments, got {} at position {}." raise TypeError(msg.format(fun_name, type(arg), pos)) @@ -335,6 +337,12 @@ def _canonicalize_axis(axis, num_dims): ### implementations of numpy functions in terms of lax +@_wraps(onp.isscalar) +def isscalar(num): return dtypes.is_python_scalar(num) or onp.isscalar(num) + +@_wraps(onp.result_type) +def result_type(*args): + return dtypes.result_type(*args) def _one_to_one_unop(numpy_fn, lax_fn, promote_like=False): if promote_like: @@ -1550,6 +1558,10 @@ def array(object, dtype=None, copy=True, order="K", ndmin=0): out = lax.convert_element_type(object, dtype) else: out = device_put(object) + elif isscalar(object): + out = lax.reshape(object, ()) + if dtype and _dtype(out) != dtypes.canonicalize_dtype(dtype): + out = lax.convert_element_type(out, dtype) elif hasattr(object, '__array__'): # this case is for duck-typed handling of objects that implement `__array__` out = array(object.__array__(), dtype and dtypes.canonicalize_dtype(dtype)) @@ -1558,10 +1570,6 @@ def array(object, dtype=None, copy=True, order="K", ndmin=0): out = stack([array(elt, dtype=dtype) for elt in object]) else: out = onp.array([], dtype) - elif isscalar(object): - out = lax.reshape(object, ()) - if dtype and _dtype(out) != dtypes.canonicalize_dtype(dtype): - out = lax.convert_element_type(out, dtype) else: try: view = memoryview(object) @@ -1611,8 +1619,8 @@ def zeros(shape, dtype=None): if isinstance(shape, types.GeneratorType): raise TypeError("expected sequence object with len >= 0 or a single integer") lax._check_user_dtype_supported(dtype, "zeros") - dtype = onp.dtype("float64") if dtype is None else dtype - shape = (shape,) if onp.isscalar(shape) else shape + dtype = float_ if dtype is None else dtype + shape = (shape,) if isscalar(shape) else shape return lax.full(shape, 0, dtype) @_wraps(onp.ones) @@ -1620,8 +1628,8 @@ def ones(shape, dtype=None): if isinstance(shape, types.GeneratorType): raise TypeError("expected sequence object with len >= 0 or a single integer") lax._check_user_dtype_supported(dtype, "ones") - dtype = onp.dtype("float64") if dtype is None else dtype - shape = (shape,) if onp.isscalar(shape) else shape + dtype = float_ if dtype is None else dtype + shape = (shape,) if isscalar(shape) else shape return lax.full(shape, 1, dtype) @@ -1642,7 +1650,7 @@ def array_equal(a1, a2): @_wraps(onp.eye) def eye(N, M=None, k=None, dtype=None): lax._check_user_dtype_supported(dtype, "eye") - dtype = onp.dtype("float64") if dtype is None else dtype + dtype = float_ if dtype is None else dtype M = N if M is None else M if N < 0 or M < 0: msg = "negative dimensions are not allowed, got {} and {}" @@ -1675,6 +1683,8 @@ def arange(start, stop=None, step=None, dtype=None): return lax.iota(dtype, start) # avoids materializing # Fall back to instantiating an ndarray in host memory + dtype = dtype or result_type( + *(x for x in (start, stop, step) if x is not None)) return onp.arange(start, stop=stop, step=step, dtype=dtype) @@ -2981,6 +2991,7 @@ def gcd(x1, x2): @_wraps(getattr(onp, "lcm", None)) def lcm(x1, x2): + x1, x2 = _promote_dtypes(x1, x2) d = gcd(x1, x2) return where(d == 0, lax._const(d, 0), lax.div(lax.abs(multiply(x1, x2)), d)) @@ -3067,7 +3078,6 @@ def quantile(a, q, axis=None, out=None, overwrite_input=False, raise NotImplementedError("Only interpolation='linear' is implemented") a = asarray(a) - q = asarray(q) if axis is None: a = ravel(a) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index daae9027bcf5..eabecc00d698 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -38,7 +38,7 @@ def _promote_arg_dtypes(*args): """Promotes `args` to a common inexact type.""" def _to_inexact_type(type): - return type if np.issubdtype(type, np.inexact) else np.float64 + return type if np.issubdtype(type, np.inexact) else np.float_ inexact_types = [_to_inexact_type(np._dtype(arg)) for arg in args] dtype = dtypes.canonicalize_dtype(np.result_type(*inexact_types)) args = [lax.convert_element_type(arg, dtype) for arg in args] @@ -181,8 +181,10 @@ def _norm(x, ord, axis, keepdims): # special case too. return np.sum(np.abs(x), axis=axis, keepdims=keepdims) else: - return np.power(np.sum(np.abs(x) ** ord, axis=axis, keepdims=keepdims), - 1. / ord) + abs_x = np.abs(x) + ord = lax._const(abs_x, ord) + out = np.sum(abs_x ** ord, axis=axis, keepdims=keepdims) + return np.power(out, 1. / ord) elif num_axes == 2: row_axis, col_axis = axis diff --git a/jax/random.py b/jax/random.py index 8e56b8c9c3c9..004b82e7217b 100644 --- a/jax/random.py +++ b/jax/random.py @@ -59,8 +59,8 @@ def PRNGKey(seed): # when jax_enable_x64=False and we don't want to drop the top 32 bits k1 = convert(onp.bitwise_and(onp.right_shift(seed, 32), 0xFFFFFFFF)) else: - k1 = convert(lax.shift_right_logical(seed, 32)) - k2 = convert(lax.bitwise_and(seed, 0xFFFFFFFF)) + k1 = convert(lax.shift_right_logical(seed, lax._const(seed, 32))) + k2 = convert(np.bitwise_and(seed, 0xFFFFFFFF)) return lax.concatenate([k1, k2], 0) def _is_prng_key(key): @@ -823,7 +823,7 @@ def _case4(zagf): _, _, grad, flag = lax.while_loop(lambda zagf: (~zagf[3]) & (zagf[0] < 0.8), _case1, - (z, alpha, 0.0, False)) + (z, alpha, lax._const(alpha, 0.0), False)) _, _, grad, flag = lax.while_loop(_cond2, _case2, (z, alpha, grad, flag)) _, _, grad, flag = lax.while_loop(_cond3, _case3, (z, alpha, grad, flag)) _, _, grad, flag = lax.while_loop(lambda zagf: ~zagf[3], _case4, (z, alpha, grad, flag)) diff --git a/jax/test_util.py b/jax/test_util.py index 6d97ecf4799c..6834c804fa47 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -54,8 +54,10 @@ EPS = 1e-4 -_dtype = lambda x: getattr(x, 'dtype', None) or onp.asarray(x).dtype - +def _dtype(x): + return (getattr(x, 'dtype', None) or + onp.dtype(dtypes.python_scalar_dtypes.get(type(x), None)) or + onp.asarray(x).dtype) def is_sequence(x): try: @@ -89,9 +91,9 @@ def is_sequence(x): default_gradient_tolerance = { onp.dtype(onp.float16): 1e-2, onp.dtype(onp.float32): 2e-3, - onp.dtype(onp.float64): 1e-6, + onp.dtype(onp.float64): 1e-5, onp.dtype(onp.complex64): 1e-3, - onp.dtype(onp.complex128): 1e-6, + onp.dtype(onp.complex128): 1e-5, } def _assert_numpy_eq(x, y): @@ -128,10 +130,9 @@ def inner_prod(xs, ys): return tree_reduce(onp.add, tree_multimap(contract, xs, ys)) -add = partial(tree_multimap, onp.add) -sub = partial(tree_multimap, onp.subtract) -conj = partial(tree_map, onp.conj) - +add = partial(tree_multimap, lambda x, y: onp.add(x, y, dtype=_dtype(x))) +sub = partial(tree_multimap, lambda x, y: onp.subtract(x, y, dtype=_dtype(x))) +conj = partial(tree_map, lambda x: onp.conj(x, dtype=_dtype(x))) def scalar_mul(xs, a): return tree_map(lambda x: onp.multiply(x, a, dtype=_dtype(x)), xs) @@ -154,9 +155,19 @@ def numerical_jvp(f, primals, tangents, eps=EPS): return scalar_mul(sub(f_pos, f_neg), 0.5 / eps) +def _merge_tolerance(tol, default): + if tol is None: + return default + if not isinstance(tol, dict): + return tol + out = default.copy() + for k, v in tol.items(): + out[onp.dtype(k)] = v + return out + def check_jvp(f, f_jvp, args, atol=None, rtol=None, eps=EPS): - atol = atol or default_gradient_tolerance - rtol = rtol or default_gradient_tolerance + atol = _merge_tolerance(atol, default_gradient_tolerance) + rtol = _merge_tolerance(rtol, default_gradient_tolerance) rng = onp.random.RandomState(0) tangent = tree_map(partial(rand_like, rng), args) v_out, t_out = f_jvp(args, tangent) @@ -170,8 +181,8 @@ def check_jvp(f, f_jvp, args, atol=None, rtol=None, eps=EPS): def check_vjp(f, f_vjp, args, atol=None, rtol=None, eps=EPS): - atol = atol or default_gradient_tolerance - rtol = rtol or default_gradient_tolerance + atol = _merge_tolerance(atol, default_gradient_tolerance) + rtol = _merge_tolerance(rtol, default_gradient_tolerance) _rand_like = partial(rand_like, onp.random.RandomState(0)) v_out, vjpfun = f_vjp(*args) v_out_expected = f(*args) diff --git a/tests/api_test.py b/tests/api_test.py index 5f77c6d0cc86..62e8cdbbf9c8 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1266,6 +1266,8 @@ def f(x, y): return x + y "positional arguments.", lambda: partial(df, x=0.)(y=1.)) + def test_scalar_literals(self): + self.assertLen(api.make_jaxpr(lambda x: x + 2)(42).constvars, 0) if __name__ == '__main__': absltest.main() diff --git a/tests/batching_test.py b/tests/batching_test.py index 91f1451df2a5..76ab6606c4f2 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -489,7 +489,8 @@ def f(params, x): per_example_direct += [ np.reshape(g, (1,) + g.shape)] per_example_direct = np.concatenate(per_example_direct, axis=0) - self.assertAllClose(per_example, per_example_direct, check_dtypes=True) + self.assertAllClose(per_example, per_example_direct, check_dtypes=True, + rtol=2e-2) def testConvGeneralDilatedBatchNotMajor(self): W = np.array(onp.random.randn(3, 3, 1, 4), dtype=onp.float32) @@ -540,7 +541,8 @@ def f(params, x): per_example_direct += [ np.reshape(g, (1,) + g.shape)] per_example_direct = np.concatenate(per_example_direct, axis=0) - self.assertAllClose(per_example, per_example_direct, check_dtypes=True) + self.assertAllClose(per_example, per_example_direct, check_dtypes=True, + rtol=1e-3) def testSumPool(self): W = np.array(onp.random.randn(3, 3, 1, 5), dtype=onp.float32) @@ -571,12 +573,13 @@ def f(params, x): np.reshape(g, (1,) + g.shape)] per_example_direct = np.concatenate(per_example_direct, axis=0) self.assertAllClose(per_example, per_example_direct, check_dtypes=True, - rtol=1e-5) + rtol=1e-3) def testCumProd(self): x = np.arange(9).reshape(3, 3) + 1 y = vmap(lambda x: np.cumprod(x, axis=-1))(x) - self.assertAllClose(onp.cumprod(x, axis=1), y, check_dtypes=True) + self.assertAllClose(onp.cumprod(x, axis=1, dtype=np.int_), y, + check_dtypes=True) def testSelect(self): pred = onp.array([True, False]) @@ -935,7 +938,8 @@ def f(scale): scales = onp.array([[0.1], [0.2], [0.3], [0.4], [0.5]]) ans = vmapped_f_grad(scales) # don't crash! expected = onp.stack([grad(f)(scale) for scale in scales]) - self.assertAllClose(ans, expected, check_dtypes=False) + self.assertAllClose(ans, expected, check_dtypes=False, + rtol=jtu.default_gradient_tolerance) def testIssue387(self): # https://github.com/google/jax/issues/387 @@ -962,7 +966,8 @@ def body_fn(uk): key, _ = random.split(key) return u, key - u, _ = lax.while_loop(lambda uk: uk[0] > 0.5, body_fn, (1., key)) + u, _ = lax.while_loop(lambda uk: uk[0] > 0.5, body_fn, + (np.float64(1.), key)) return u print(vmap(f)(random.split(random.PRNGKey(0), 2))) # no crash diff --git a/tests/dtypes_test.py b/tests/dtypes_test.py new file mode 100644 index 000000000000..685a0129638b --- /dev/null +++ b/tests/dtypes_test.py @@ -0,0 +1,84 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import operator + +from absl.testing import absltest +from absl.testing import parameterized + +import jax +from jax import dtypes +from jax import numpy as np +from jax import test_util as jtu + +from jax.config import config +config.parse_flags_with_absl() +FLAGS = config.FLAGS + + +class DtypesTest(jtu.JaxTestCase): + + @parameterized.named_parameters( + {"testcase_name": "_type={}".format(type.__name__), "type": type, + "dtype": dtype} + for type, dtype in [(bool, np.bool_), (int, np.int_), (float, np.float_), + (complex, np.complex_)]) + def testDefaultTypes(self, type, dtype): + for f in [np.array, jax.jit(np.array), jax.jit(lambda x: x)]: + y = f(type(0)) + self.assertTrue(isinstance(y, np.ndarray), msg=(f, y)) + self.assertEqual(y.dtype, dtypes.canonicalize_dtype(dtype), msg=(f, y)) + + @parameterized.named_parameters( + {"testcase_name": "_swap={}_jit={}".format(swap, jit), + "swap": swap, "jit": jit} + for swap in [False, True] for jit in [False, True]) + def testBinaryPromotion(self, swap, jit): + testcases = [ + (np.array(1.), 0., np.float_), + (np.array(1.), np.array(0.), np.float_), + (np.array(1.), np.array(0., dtype=np.float16), np.float_), + (np.array(1.), np.array(0., dtype=np.float32), np.float_), + (np.array(1.), np.array(0., dtype=np.float64), np.float64), + (np.array(1., dtype=np.float16), 0., np.float16), + (np.array(1., dtype=np.float32), 0., np.float32), + (np.array(1., dtype=np.float64), 0., np.float64), + (np.array(1., dtype=np.float16), np.array(0., dtype=np.float16), np.float16), + (np.array(1., dtype=np.float16), np.array(0., dtype=np.float32), np.float32), + (np.array(1., dtype=np.float16), np.array(0., dtype=np.float64), np.float64), + (np.array(1., dtype=np.float32), np.array(0., dtype=np.float32), np.float32), + (np.array(1., dtype=np.float32), np.array(0., dtype=np.float64), np.float64), + (np.array(1., dtype=np.float64), np.array(0., dtype=np.float64), np.float64), + (np.array([1.]), 0., np.float_), + (np.array([1.]), np.array(0.), np.float_), + (np.array([1.]), np.array(0., dtype=np.float16), np.float_), + (np.array([1.]), np.array(0., dtype=np.float32), np.float_), + (np.array([1.]), np.array(0., dtype=np.float64), np.float64), + (np.array([1.], dtype=np.float32), np.array(0., dtype=np.float16), np.float32), + (np.array([1.], dtype=np.float16), np.array(0., dtype=np.float32), np.float32), + (np.array([1.], dtype=np.float16), 0., np.float16), + ] + op = jax.jit(operator.add) if jit else operator.add + for x, y, dtype in testcases: + x, y = (y, x) if swap else (x, y) + z = x + y + self.assertTrue(isinstance(z, np.ndarray), msg=(x, y, z)) + self.assertEqual(z.dtype, dtypes.canonicalize_dtype(dtype), msg=(x, y, z)) + +if __name__ == "__main__": + absltest.main() diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index fa5ea5a29f98..9d9338b0f986 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -271,7 +271,7 @@ def body_fun(state): return total cfun = api.jit(sum_first_n) - x = npr.RandomState(0).randn(10) + x = npr.RandomState(0).randn(10).astype(np.float_) for num in [0, 5, 10, 15]: self.assertAllClose(sum_first_n(x, num), onp.sum(x[:num]), @@ -304,7 +304,7 @@ def testWhileLoopBodyConstsBatched(self): def fun(x, y): return lax.while_loop(lambda x: x < 3, lambda x: x + y, x) - ans = api.vmap(fun, in_axes=(None, 0))(0, onp.array([2, 3])) + ans = api.vmap(fun, in_axes=(None, 0))(0, np.array([2, 3])) expected = onp.array([4, 3]) self.assertAllClose(ans, expected, check_dtypes=False) @@ -393,7 +393,7 @@ def body_fun(i, state): return total cfun = api.jit(sum_first_n) - x = npr.RandomState(0).randn(10) + x = npr.RandomState(0).randn(10).astype(np.float_) for num in [0, 5, 10, 15]: self.assertAllClose(sum_first_n(x, num), onp.sum(x[:num]), @@ -413,7 +413,7 @@ def body_fun(i, state): return out_val['total'] cfun = api.jit(sum_first_n) - x = npr.RandomState(0).randn(10) + x = npr.RandomState(0).randn(10).astype(np.float_) for num in [0, 5, 10, 15]: self.assertAllClose(sum_first_n(x, num), onp.sum(x[:num]), @@ -433,7 +433,7 @@ def body_fun(i, state): return tot cfun = api.jit(sum_first_n) - x = npr.RandomState(0).randn(10) + x = npr.RandomState(0).randn(10).astype(np.float_) for num in [0, 5, 10, 15]: self.assertAllClose(sum_first_n(x, num), onp.sum(x[:num]), @@ -583,16 +583,16 @@ def fun(x, y, z): return lax.cond(pred, y, true_fun, z, false_fun) # these cases stay as cond - x = onp.array(2) - y = onp.array([1, 2]) - z = onp.array([3, 4]) + x = np.array(2) + y = np.array([1, 2]) + z = np.array([3, 4]) ans = api.vmap(fun, (None, 0, 0))(x, y, z) jaxpr = api.make_jaxpr(api.vmap(fun, (None, 0, 0)))(x, y, z) expected = onp.array([1, 2]) self.assertAllClose(ans, expected, check_dtypes=False) assert "select" not in str(jaxpr) - x = onp.array(4) + x = np.array(4) ans = api.vmap(fun, (None, 0, 0))(x, y, z) jaxpr = api.make_jaxpr(api.vmap(fun, (None, 0, 0)))(x, y, z) expected = onp.array([-3, -4]) @@ -604,7 +604,7 @@ def fun(x, y, z): expected = onp.array([-3, -4]) self.assertAllClose(ans, expected, check_dtypes=False) - z = onp.array(5) + z = np.array(5) ans = api.vmap(fun, (None, 0, None))(x, y, z) jaxpr = api.make_jaxpr(api.vmap(fun, (None, 0, None)))(x, y, z) expected = onp.array([-5, -5]) @@ -613,14 +613,14 @@ def fun(x, y, z): # these cases become select - x = onp.array([2, 4]) + x = np.array([2, 4]) ans = api.vmap(fun, (0, 0, None))(x, y, z) jaxpr = api.make_jaxpr(api.vmap(fun, (0, 0, None)))(x, y, z) expected = onp.array([1, -5]) self.assertAllClose(ans, expected, check_dtypes=False) assert "select" in str(jaxpr) - z = onp.array([3, 4]) + z = np.array([3, 4]) ans = api.vmap(fun)(x, y, z) jaxpr = api.make_jaxpr(api.vmap(fun))(x, y, z) expected = onp.array([1, -4]) @@ -802,12 +802,12 @@ def testScanRnn(self): n_out = 1 length = 3 - W_trans = r.randn(n_hid, n_hid + n_in) - W_out = r.randn(n_out, n_hid + n_in) + W_trans = r.randn(n_hid, n_hid + n_in).astype(np.float_) + W_out = r.randn(n_out, n_hid + n_in).astype(np.float_) params = W_trans, W_out - inputs = r.randn(length, n_in) - targets = r.randn(length, n_out) + inputs = r.randn(length, n_in).astype(np.float_) + targets = r.randn(length, n_out).astype(np.float_) def step(params, state, input): W_trans, W_out = params @@ -850,8 +850,8 @@ def loss(params, inputs, targets): # we can vmap to batch things batch_size = 7 - batched_inputs = r.randn(batch_size, length, n_in) - batched_targets = r.randn(batch_size, length, n_out) + batched_inputs = r.randn(batch_size, length, n_in).astype(np.float_) + batched_targets = r.randn(batch_size, length, n_out).astype(np.float_) batched_loss = api.vmap(lambda x, y: loss(params, x, y)) losses = batched_loss(batched_inputs, batched_targets) expected = onp.stack(list(map(lambda x, y: loss(params, x, y), @@ -1166,7 +1166,7 @@ def body(state): return solution def sqrt_cubed(x, tangent_solve=scalar_solve): - f = lambda y: y ** 2 - x ** 3 + f = lambda y: y ** 2. - np.array(x) ** 3. return lax.custom_root(f, 0.0, binary_search, tangent_solve) value, grad = api.value_and_grad(sqrt_cubed)(5.0) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 4869c2d9fad3..ede8ac870a1e 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -67,6 +67,21 @@ number_dtypes = float_dtypes + complex_dtypes + int_dtypes all_dtypes = number_dtypes + bool_dtypes + +python_scalar_dtypes = [lnp.bool_, lnp.int_, lnp.float_, lnp.complex_] + +def _valid_dtypes_for_shape(shape, dtypes): + # Not all (shape, dtype) pairs are valid. In particular, Python scalars only + # have one type in each category (float, bool, etc.) + if shape is jtu.PYTHON_SCALAR_SHAPE: + return [t for t in dtypes if t in python_scalar_dtypes] + return dtypes + +def _shape_and_dtypes(shapes, dtypes): + for shape in shapes: + for dtype in _valid_dtypes_for_shape(shape, dtypes): + yield (shape, dtype) + OpRecord = collections.namedtuple( "OpRecord", ["name", "nargs", "dtypes", "shapes", "rng_factory", "diff_modes", @@ -191,7 +206,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, tolerance={onp.complex64: 1e-5}), op_record("square", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), - op_record("transpose", 1, all_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("transpose", 1, all_dtypes, all_shapes, jtu.rand_default, ["rev"], + check_dtypes=False), op_record("true_divide", 2, all_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), op_record("where", 3, (onp.float32, onp.int64), all_shapes, jtu.rand_some_zero, []), op_record("diff", 1, number_dtypes, nonzerodim_shapes, jtu.rand_default, ["rev"]), @@ -341,13 +357,15 @@ def _GetArgsMaker(self, rng, shapes, dtypes): for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) - for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) + for dtypes in itertools.product( + *(_valid_dtypes_for_shape(s, rec.dtypes) for s in shapes))) for rec in itertools.chain(JAX_ONE_TO_ONE_OP_RECORDS, JAX_COMPOUND_OP_RECORDS))) def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, tol): rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) + python_scalar = jtu.PYTHON_SCALAR_SHAPE in shapes scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or jtu.NUMPY_SCALAR_SHAPE in shapes or () in shapes) @@ -356,7 +374,8 @@ def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, onp_op, lnp_op, args_maker, check_dtypes=check_dtypes and not scalar_arg and not empty_shape, tol=tol) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=check_dtypes, + self._CompileAndCheck(lnp_op, args_maker, + check_dtypes=check_dtypes and not python_scalar, atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( @@ -368,7 +387,8 @@ def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) - for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) + for dtypes in itertools.product( + *(_valid_dtypes_for_shape(s, rec.dtypes) for s in shapes))) for rec in JAX_OPERATOR_OVERLOADS)) def testOperatorOverload(self, name, rng_factory, shapes, dtypes, tol): rng = rng_factory() @@ -391,7 +411,8 @@ def testOperatorOverload(self, name, rng_factory, shapes, dtypes, tol): for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) - for dtypes in CombosWithReplacement(rec.dtypes, rec.nargs)) + for dtypes in itertools.product( + *(_valid_dtypes_for_shape(s, rec.dtypes) for s in shapes))) for rec in JAX_RIGHT_OPERATOR_OVERLOADS)) def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, op_tolerance): @@ -500,7 +521,7 @@ def testCountNonzero(self, shape, dtype, axis): "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), "axis": axis} for rec in JAX_ARGMINMAX_RECORDS - for shape in rec.shapes for dtype in rec.dtypes + for shape, dtype in _shape_and_dtypes(rec.shapes, rec.dtypes) for axis in range(-len(shape), len(shape)))) def testArgMinMax(self, onp_op, lnp_op, rng_factory, shape, dtype, axis): rng = rng_factory() @@ -508,7 +529,7 @@ def testArgMinMax(self, onp_op, lnp_op, rng_factory, shape, dtype, axis): raise unittest.SkipTest("complex128 reductions not supported on GPU") def onp_fun(array_to_reduce): - return onp_op(array_to_reduce, axis) + return onp_op(array_to_reduce, axis).astype(lnp.int_) def lnp_fun(array_to_reduce): return lnp_op(array_to_reduce, axis) @@ -656,21 +677,21 @@ def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_fa "rhs_shape": rhs_shape, "rhs_dtype": rhs_dtype, "rng_factory": jtu.rand_default} # TODO(phawkins): support integer dtypes too. - for lhs_dtype, rhs_dtype in CombosWithReplacement(inexact_dtypes, 2) - for lhs_shape, rhs_shape in [ - (l, r) for l, r in CombosWithReplacement(all_shapes, 2) - if len(jtu._dims_of_shape(l)) == 0 - or len(jtu._dims_of_shape(r)) == 0 - or l[-1] == r[-1]])) + for lhs_shape, lhs_dtype in _shape_and_dtypes(all_shapes, inexact_dtypes) + for rhs_shape, rhs_dtype in _shape_and_dtypes(all_shapes, inexact_dtypes) + if len(jtu._dims_of_shape(lhs_shape)) == 0 + or len(jtu._dims_of_shape(rhs_shape)) == 0 + or lhs_shape[-1] == rhs_shape[-1])) def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] onp_fun = lambda lhs, rhs: onp.inner(lhs, rhs) lnp_fun = lambda lhs, rhs: lnp.inner(lhs, rhs) - tol_spec = {onp.float64: 1e-13} + tol_spec = {onp.float16: 1e-2, onp.float64: 1e-13} if jtu.device_under_test() == "tpu": - tol_spec[onp.float32] = 2e-1 - tol = max(jtu.tolerance(lhs_dtype), jtu.tolerance(rhs_dtype)) + tol_spec[onp.float32] = tol_spec[onp.complex64] = 2e-1 + tol = max(jtu.tolerance(lhs_dtype, tol_spec), + jtu.tolerance(rhs_dtype, tol_spec)) # TODO(phawkins): there are float32/float64 disagreements for some inputs. self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, tol=tol) @@ -701,7 +722,7 @@ def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng_factory): jtu.format_shape_dtype_string(shape, dtype), decimals), "shape": shape, "dtype": dtype, "decimals": decimals, "rng_factory": jtu.rand_default} - for shape in all_shapes for dtype in number_dtypes + for shape, dtype in _shape_and_dtypes(all_shapes, number_dtypes) for decimals in [0, 1, -2])) def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): rng = rng_factory() @@ -711,10 +732,11 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): lnp_fun = lambda x: lnp.round(x, decimals=decimals) args_maker = lambda: [rng(shape, dtype)] tol = {onp.float16: 1e-2} - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, - tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, - rtol=tol) + check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + check_dtypes=check_dtypes, tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=check_dtypes, + atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_mode={}_rpadwidth={}_rconstantvalues={}".format( @@ -733,7 +755,7 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): ('reflect', None, nonempty_shapes), ('wrap', None, nonempty_shapes), ] - for shape in shapes for dtype in all_dtypes + for shape, dtype in _shape_and_dtypes(shapes, all_dtypes) for pad_width_rank in range(3))) def testPad(self, shape, dtype, mode, pad_width_rank, constant_values_rank, rng_factory, irng_factory): @@ -754,7 +776,8 @@ def args_maker(): [len(shape), 2][2 - constant_values_rank:], dtype) return rng(shape, dtype), kwargs - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + check_dtypes=shape is not jtu.PYTHON_SCALAR_SHAPE) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -763,8 +786,7 @@ def args_maker(): "shape": shape, "dtype": dtype, "reps": reps, "rng_factory": jtu.rand_default} for reps in [(), (2,), (3, 4), (2, 3, 4)] - for dtype in default_dtypes - for shape in all_shapes + for shape, dtype in _shape_and_dtypes(all_shapes, default_dtypes) )) def testTile(self, shape, dtype, reps, rng_factory): rng = rng_factory() @@ -773,7 +795,8 @@ def testTile(self, shape, dtype, reps, rng_factory): args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + check_dtypes=shape is not jtu.PYTHON_SCALAR_SHAPE) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -829,8 +852,7 @@ def args_maker(): "axis": axis, "shape": shape, "dtype": dtype, "repeats": repeats, "rng_factory": jtu.rand_default} for repeats in [0, 1, 2] - for dtype in default_dtypes - for shape in all_shapes + for shape, dtype in _shape_and_dtypes(all_shapes, default_dtypes) for axis in [None] + list(range(-len(shape), len(shape))))) def testRepeat(self, axis, shape, dtype, repeats, rng_factory): rng = rng_factory() @@ -1225,8 +1247,7 @@ def testSqueeze(self, arg_shape, dtype, ax, rng_factory): returned), "rng_factory": jtu.rand_default, "shape": shape, "dtype": dtype, "axis": axis, "weights_shape": weights_shape, "returned": returned} - for shape in nonempty_shapes - for dtype in number_dtypes + for shape, dtype in _shape_and_dtypes(nonempty_shapes, number_dtypes) for axis in set(range(-len(shape), len(shape))) | set([None]) # `weights_shape` is either `None`, same as the averaged axis, or same as # that of the input @@ -1244,33 +1265,39 @@ def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): lnp_fun = lambda x, weights: lnp.average(x, axis, weights, returned) args_maker = lambda: [rng(shape, dtype), rng(weights_shape, dtype)] - tol = jtu.tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-3, - onp.float64: 1e-10, onp.complex64: 1e-3, - onp.complex128: 1e-10}) + tol = {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-10, + onp.complex64: 1e-3, onp.complex128: 1e-10} + check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE try: - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, - tol=tol) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + check_dtypes=check_dtypes, tol=tol) except ZeroDivisionError: self.skipTest("don't support checking for ZeroDivisionError") - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol, - atol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=check_dtypes, + rtol=tol, atol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_arg{}_ndmin={}".format(i, ndmin), - "arg": arg, "ndmin": ndmin} - for i, arg in enumerate([ - 3., [1, 2, 3], [1., 2., 3.], - [[1, 2], [3, 4], [5, 6]], [[1, 2.], [3, 4], [5, 6]], - [[3, onp.array(2), 1], onp.arange(3.)], + "arg": arg, "ndmin": ndmin, "dtype": dtype} + for i, (arg, dtype) in enumerate([ + ([True, False, True], lnp.bool_), + (3., lnp.float_), + ([1, 2, 3], lnp.int_), + ([1., 2., 3.], lnp.float_), + ([[1, 2], [3, 4], [5, 6]], lnp.int_), + ([[1, 2.], [3, 4], [5, 6]], lnp.float64), + ([[1., 2j], [3., 4.], [5., 6.]], lnp.complex_), + ([[3, onp.array(2), 1], onp.arange(3.)], onp.float_), ]) for ndmin in [None, onp.ndim(arg), onp.ndim(arg) + 1, onp.ndim(arg) + 2])) - def testArray(self, arg, ndmin): + def testArray(self, arg, ndmin, dtype): args_maker = lambda: [arg] + dtype = dtypes.canonicalize_dtype(dtype) if ndmin is not None: - onp_fun = partial(onp.array, ndmin=ndmin) + onp_fun = partial(onp.array, ndmin=ndmin, dtype=dtype) lnp_fun = partial(lnp.array, ndmin=ndmin) else: - onp_fun = onp.array + onp_fun = partial(onp.array, dtype=dtype) lnp_fun = lnp.array self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @@ -1494,13 +1521,13 @@ def testAstype(self): def testOnpMean(self): # from https://github.com/google/jax/issues/125 - x = lax.add(lnp.eye(3), 0.) + x = lax.add(lnp.eye(3, dtype=lnp.float_), 0.) ans = onp.mean(x) self.assertAllClose(ans, onp.array(1./3), check_dtypes=False) def testArangeOnFloats(self): # from https://github.com/google/jax/issues/145 - expected = onp.arange(0.0, 1.0, 0.1) + expected = onp.arange(0.0, 1.0, 0.1, dtype=lnp.float_) ans = lnp.arange(0.0, 1.0, 0.1) self.assertAllClose(expected, ans, check_dtypes=True) @@ -1672,9 +1699,11 @@ def testNanToNum(self, rng_factory, shape, dtype): rng = rng_factory() dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)).type args_maker = lambda: [rng(shape, dtype)] + check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE self._CheckAgainstNumpy(onp.nan_to_num, lnp.nan_to_num, args_maker, - check_dtypes=True) - self._CompileAndCheck(lnp.nan_to_num, args_maker, check_dtypes=True) + check_dtypes=check_dtypes) + self._CompileAndCheck(lnp.nan_to_num, args_maker, + check_dtypes=check_dtypes) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix("ix_", shapes, dtypes), @@ -1731,7 +1760,7 @@ def testQuantile(self, op, a_rng, q_rng, a_shape, a_dtype, q_shape, q_dtype, # TODO(phawkins): we currently set dtype=False because we aren't as # aggressive about promoting to float64. It's not clear we want to mimic # Numpy here. - tol_spec = {onp.float32: 1e-5, onp.float64: 5e-6} + tol_spec = {onp.float16: 2e-2, onp.float32: 1e-5, onp.float64: 5e-6} tol = max(jtu.tolerance(a_dtype, tol_spec), jtu.tolerance(q_dtype, tol_spec)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, @@ -1803,16 +1832,16 @@ def testIssue453(self): self.assertAllClose(ans, expected, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_op={}_dtype={}".format( - op, {bool: "bool", int: "int", float: "float"}[dtype]), - "dtype": dtype, "op": op} - for dtype in [int, float, bool] + {"testcase_name": "_op={}_dtype={}".format(op, pytype.__name__), + "pytype": pytype, "dtype": dtype, "op": op} + for pytype, dtype in [(int, lnp.int_), (float, lnp.float_), + (bool, lnp.bool_), (complex, lnp.complex_)] for op in ["atleast_1d", "atleast_2d", "atleast_3d"])) - def testAtLeastNdLiterals(self, dtype, op): + def testAtLeastNdLiterals(self, pytype, dtype, op): # Fixes: https://github.com/google/jax/issues/634 - onp_fun = lambda arg: getattr(onp, op)(arg) + onp_fun = lambda arg: getattr(onp, op)(arg).astype(dtype) lnp_fun = lambda arg: getattr(lnp, op)(arg) - args_maker = lambda: [dtype(2)] + args_maker = lambda: [pytype(2)] self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @@ -1825,13 +1854,14 @@ def testArange(self): # test cases inspired by dask tests at # https://github.com/dask/dask/blob/master/dask/array/tests/test_creation.py#L92 self.assertAllClose(lnp.arange(77), - onp.arange(77), check_dtypes=True) + onp.arange(77, dtype=lnp.int_), check_dtypes=True) self.assertAllClose(lnp.arange(2, 13), - onp.arange(2, 13), check_dtypes=True) + onp.arange(2, 13, dtype=lnp.int_), check_dtypes=True) self.assertAllClose(lnp.arange(4, 21, 9), - onp.arange(4, 21, 9), check_dtypes=True) + onp.arange(4, 21, 9, dtype=lnp.int_), check_dtypes=True) self.assertAllClose(lnp.arange(53, 5, -3), - onp.arange(53, 5, -3), check_dtypes=True) + onp.arange(53, 5, -3, dtype=lnp.int_), + check_dtypes=True) # TODO(mattjj): make these tests work when jax_enable_x64=True # self.assertAllClose(lnp.arange(77, dtype=float), # onp.arange(77, dtype=float), check_dtypes=True) @@ -1848,7 +1878,7 @@ def testArange(self): # test that lnp.arange(N, dtype=int32) doesn't instantiate an ndarray self.assertFalse(type(lnp.arange(77, dtype=lnp.int32)) == - type(onp.arange(77, dtype=onp.int32))) + type(onp.arange(77, dtype=onp.int32))) self.assertTrue(type(lnp.arange(77, dtype=lnp.int32)) == type(lax.iota(onp.int32, 77))) @@ -2117,8 +2147,8 @@ def testLogspace(self, start_shape, stop_shape, num, " doesn't exactly match other platforms.") rng = rng_factory() # relax default tolerances slightly - tol = {onp.float16: 2e-2, onp.float32: 1e-2, onp.float64: 1e-14, - onp.complex64: 1e-3, onp.complex128: 1e-14} + tol = {onp.float16: 2e-2, onp.float32: 1e-2, onp.float64: 1e-6, + onp.complex64: 1e-3, onp.complex128: 1e-6} args_maker = self._GetArgsMaker(rng, [start_shape, stop_shape], [dtype, dtype]) @@ -2161,7 +2191,7 @@ def testGeomspace(self, start_shape, stop_shape, num, endpoint, dtype, rng_factory): rng = rng_factory() # relax default tolerances slightly - tol = {onp.float16: 2e-3, onp.float32: 2e-3, onp.complex128: 1e-14} + tol = {onp.float16: 4e-3, onp.float32: 2e-3, onp.complex128: 1e-14} def args_maker(): """Test the set of inputs onp.geomspace is well-defined on.""" start, stop = self._GetArgsMaker(rng, @@ -2329,7 +2359,7 @@ class NumpyGradTests(jtu.JaxTestCase): for rec in GRAD_TEST_RECORDS)) def testOpGrad(self, op, rng_factory, shapes, dtype, order, tol): rng = rng_factory() - tol = 1e-1 if num_float_bits(dtype) == 32 else tol + tol = {onp.float32: 1e-1, onp.complex64: 1e-1} args = tuple(rng(shape, dtype) for shape in shapes) check_grads(op, args, order, ["fwd", "rev"], tol, tol) diff --git a/tests/lax_test.py b/tests/lax_test.py index 759e014ec04d..d3f1c34b0366 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -31,6 +31,7 @@ from jax import api from jax import core +from jax import dtypes from jax import lax from jax import test_util as jtu from jax import lax_reference @@ -1561,7 +1562,8 @@ def _CheckDeviceConstant(self, make_const, expected): for fill_value in [0, 1, onp.pi])) def testFilledConstant(self, shape, fill_value, dtype): make_const = lambda: lax.full(shape, fill_value, dtype) - expected = onp.full(shape, fill_value, dtype) + expected = onp.full(shape, fill_value, + dtype or dtypes.result_type(fill_value)) self._CheckDeviceConstant(make_const, expected) @parameterized.named_parameters(jtu.cases_from_list( diff --git a/tests/masking_test.py b/tests/masking_test.py index f9d920faeba9..f8415fe88a26 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -234,8 +234,8 @@ def step(h, x): return predicted rng = onp.random.RandomState(0) - W = onp.eye(n) - xs = rng.randn(10, n) + W = np.eye(n) + xs = rng.randn(10, n).astype(np.float_) ans = rnn([W, xs], dict(t=4)) expected = xs[:4].sum(0) self.assertAllClose(ans, expected, check_dtypes=False) @@ -252,9 +252,9 @@ def step(h, x): return np.sum((predicted - target)**2) rng = onp.random.RandomState(0) - W = rng.randn(n, n) - xs = rng.randn(10, n) - y = rng.randn(n) + W = rng.randn(n, n).astype(np.float_) + xs = rng.randn(10, n).astype(np.float_) + y = rng.randn(n).astype(np.float_) ans = grad(lambda W: rnn([W, xs, y], dict(t=4)))(W) @@ -281,8 +281,8 @@ def step(h, x): return np.sum((predicted - target)**2) rng = onp.random.RandomState(0) - W = rng.randn(n, n) - seqs = rng.randn(3, 10, n) + W = rng.randn(n, n).astype(np.float_) + seqs = rng.randn(3, 10, n).astype(np.float_) ts = np.array([2, 5, 4]) ys = rng.randn(3, n) diff --git a/tests/optimizers_test.py b/tests/optimizers_test.py index 083dde12dd2e..ee782238cdff 100644 --- a/tests/optimizers_test.py +++ b/tests/optimizers_test.py @@ -280,7 +280,7 @@ def apply_carry(carry, _): assert trip == 75 return opt_final - initial_params = 0.5 + initial_params = np.float64(0.5) minimize_structure(initial_params) def loss(test_params): diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 87b6c548ee5e..a2c9c51e256f 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -340,7 +340,7 @@ def testPpermuteWithZipObject(self): lambda x: lax.ppermute(x, "i", zip(range(num_devices), perm)), "i") result = f(np.arange(num_devices, dtype=np.float32)) expected = np.asarray(perm, dtype=np.float32) - self.assertAllClose(result, expected) + self.assertAllClose(result, expected, check_dtypes=True) @jtu.skip_on_devices("cpu", "gpu") def testRule30(self): @@ -849,7 +849,7 @@ def bar(y): ndevices = xla_bridge.device_count() ans = foo(np.ones((ndevices, 1))) - expected = onp.ones((ndevices, 1)) * ndevices * 2 + expected = onp.ones((ndevices, 1), dtype=np.float_) * ndevices * 2 self.assertAllClose(ans, expected, check_dtypes=True) def testPmapInJit(self): @@ -862,7 +862,7 @@ def bar(y): ndevices = xla_bridge.device_count() ans = foo(np.ones((ndevices, 1))) - expected = onp.ones((ndevices, 1)) * ndevices + expected = onp.ones((ndevices, 1), dtype=np.float_) * ndevices self.assertAllClose(ans, expected, check_dtypes=True) def testGradBasic(self): From 9679a87901e695410f7720565a7dca8827e78a14 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 18 Nov 2019 15:35:07 -0500 Subject: [PATCH 0370/1053] Avoid out-of-bounds dereference for arity-0 nodes. (#1713) --- jaxlib/pytree.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/jaxlib/pytree.cc b/jaxlib/pytree.cc index f8717fe9405b..b55162280991 100644 --- a/jaxlib/pytree.cc +++ b/jaxlib/pytree.cc @@ -343,11 +343,13 @@ py::object PyTreeDef::Unflatten(py::iterable leaves) const { case Kind::kList: case Kind::kDict: case Kind::kCustom: { - int size = agenda.size(); - py::object o = MakeNode( - node, - absl::Span(&agenda[size - node.arity], node.arity)); - agenda.resize(agenda.size() - node.arity); + const int size = agenda.size(); + absl::Span span; + if (node.arity > 0) { + span = absl::Span(&agenda[size - node.arity], node.arity); + } + py::object o = MakeNode(node, span); + agenda.resize(size - node.arity); agenda.push_back(o); break; } From d323431d5e3b8106cb53c3c32964beac615b5dda Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 18 Nov 2019 15:36:29 -0500 Subject: [PATCH 0371/1053] Relax test tolerance for core_test jvp tests. (#1714) --- tests/core_test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/core_test.py b/tests/core_test.py index 91f12cfecb03..17833a55eaf3 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -176,7 +176,7 @@ def test_jit(self, f, args): @parameterized.parameters(test_specs) def test_jvp(self, f, args): - jtu.check_jvp(f, partial(jvp, f), args) + jtu.check_jvp(f, partial(jvp, f), args, rtol={onp.float32: 3e-2}) def test_jvp_zeros(self): def foo(x): @@ -188,7 +188,8 @@ def bar(y): @parameterized.parameters(test_specs) def test_jvp_linearized(self, f, args): - jtu.check_jvp(f, partial(jvp_unlinearized, f), args) + jtu.check_jvp(f, partial(jvp_unlinearized, f), args, + rtol={onp.float32: 3e-2}) @parameterized.parameters(test_specs) def test_vjp(self, f, args): From 6cf2e4b8bf7de1f561e1fac166ca70d15816df6b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 18 Nov 2019 21:04:27 -0500 Subject: [PATCH 0372/1053] Add type check that indexers are integers or boolean values. (#1716) Improves error if, say, a float type is passed as an indexer. --- jax/numpy/lax_numpy.py | 6 ++++++ tests/lax_numpy_indexing_test.py | 3 +++ 2 files changed, 9 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index b7f3eaca6948..e13b9467f909 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2843,6 +2843,12 @@ def _index_to_gather(x_shape, idx): y_axis += 1 x_axis += 1 else: + if (not issubdtype(abstract_i.dtype, integer) + and not issubdtype(abstract_i.dtype, bool_)): + msg = ("Indexer must have integer or boolean type, got indexer " + "with type {} at position {}, indexer value {}") + raise TypeError(msg.format(abstract_i.dtype.name, idx_pos, i)) + msg = "Indexing mode not yet supported. Open a feature request!\n{}" raise IndexError(msg.format(idx)) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 11dd4867279f..0b37495701ed 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -753,6 +753,9 @@ def testBooleanIndexingWithEmptyResult(self): expected = onp.array([-1])[onp.array([False])] self.assertAllClose(ans, expected, check_dtypes=False) + def testFloatIndexingError(self): + x = lnp.array([1, 2, 3]) + self.assertRaises(TypeError, lambda: x[3.5]) def _broadcastable_shapes(shape): """Returns all shapes that broadcast to `shape`.""" From f95e3e969f8549e226402b9035a48b9e35954cc5 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 18 Nov 2019 22:00:23 -0500 Subject: [PATCH 0373/1053] Check for None in indexer dtype check. (#1717) --- jax/numpy/lax_numpy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e13b9467f909..2212c63634e5 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2843,8 +2843,8 @@ def _index_to_gather(x_shape, idx): y_axis += 1 x_axis += 1 else: - if (not issubdtype(abstract_i.dtype, integer) - and not issubdtype(abstract_i.dtype, bool_)): + if abstract_i and not (issubdtype(abstract_i.dtype, integer) or + issubdtype(abstract_i.dtype, bool_)): msg = ("Indexer must have integer or boolean type, got indexer " "with type {} at position {}, indexer value {}") raise TypeError(msg.format(abstract_i.dtype.name, idx_pos, i)) From 5c3b99d0b474101e526b12ed8a8b313f74373b5a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 18 Nov 2019 22:00:32 -0500 Subject: [PATCH 0374/1053] Implement the __pos__ operator on JAX arrays. (#1718) --- jax/core.py | 1 + jax/numpy/lax_numpy.py | 1 + tests/lax_numpy_test.py | 1 + 3 files changed, 3 insertions(+) diff --git a/jax/core.py b/jax/core.py index 015ce09ad7a1..da96aaef602d 100644 --- a/jax/core.py +++ b/jax/core.py @@ -300,6 +300,7 @@ def aval(self): assert False def __neg__(self): return self.aval._neg(self) + def __pos__(self): return self.aval._pos(self) def __eq__(self, other): return self.aval._eq(self, other) def __ne__(self, other): return self.aval._ne(self, other) def __lt__(self, other): return self.aval._lt(self, other) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 2212c63634e5..c795650602f5 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3194,6 +3194,7 @@ def _unimplemented_setitem(self, i, x): "getitem": _rewriting_take, "setitem": _unimplemented_setitem, "neg": negative, + "pos": positive, "eq": equal, "ne": not_equal, "lt": less, diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index ede8ac870a1e..d8f624b83a6b 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -256,6 +256,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("__lt__", 2, default_dtypes, all_shapes, jtu.rand_default, []), op_record("__gt__", 2, default_dtypes, all_shapes, jtu.rand_default, []), op_record("__ge__", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("__pos__", 1, number_dtypes, all_shapes, jtu.rand_default, []), op_record("__neg__", 1, number_dtypes, all_shapes, jtu.rand_default, []), op_record("__pow__", 2, inexact_dtypes, all_shapes, jtu.rand_positive, [], tolerance={onp.float32: 2e-4, onp.complex64: 2e-4, onp.complex128: 1e-14}), From a3474fec38b9fc42663083fd22a7743c6b367f11 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 19 Nov 2019 07:02:29 -0800 Subject: [PATCH 0375/1053] bump version for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 7383ea468320..01758940e21d 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.51" +__version__ = "0.1.52" From 5edda9e66c35cbf6c5398206a4d931e904fe0b3b Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 19 Nov 2019 14:20:49 -0800 Subject: [PATCH 0376/1053] remove very old "what we're working on" --- README.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/README.md b/README.md index 1533c18d15b4..80f030991528 100644 --- a/README.md +++ b/README.md @@ -673,17 +673,6 @@ write unrestricted Python+Numpy and still make use of a hardware accelerator. But when you want to maximize performance, you can often use `jit` in your own code to compile and end-to-end optimize much bigger functions. -## What we're working on -1. Documentation! -2. Cloud TPU support -3. Multi-GPU and multi-TPU support -4. Full NumPy coverage and some SciPy coverage -5. Full coverage for vmap -6. Make everything faster - * Lowering the XLA function dispatch overhead - * Linear algebra routines (MKL on CPU, MAGMA on GPU) -7. `cond` and `while` primitives with efficient automatic differentiation - ## Current gotchas For a survey of current gotchas, with examples and explanations, we highly From 1fcebbaa0ebf3d386dbac21b3fbdeab8b7ea9104 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 19 Nov 2019 12:26:30 -0800 Subject: [PATCH 0377/1053] fix reference cycle in jaxpr tracing using weakrefs As one step in tracing user code to a jaxpr using the machinery in partial_eval.py, we construct a bipartite graph made of JaxprTracer nodes, corresponding to values in the user code, and recipe nodes ,particularly those corresponding to jaxpr equations, representing primitive operations. (This representation was put in place in #1224, since when primitives only had single outputs we could identify each primitive operation with the JaxprTracer value it produced.) This graph had reference cycles because each equation recipe points to both its input and output tracers (as a jaxpr eqn has both input and output vars) and a tracer must be able to point to the equation recipe that produced it (for us to toposort the graph from in_tracers to out_tracers in tracers_to_jaxpr). Those cycles caused memory leaks. This commit removes the strong reference cycle using weakrefs. In particular, equation recipes only hold weak references to their output tracers. Before this change, we used the core.JaxprEqn struct both to represent equations in jaxprs (where invars and outvars are instances of the core.Var class) and to represent equation recipes (where invars and outvars are instances of the partial_eval.JaxprTracer class). That was a bit lazy. This commit distinguishes the two as separate JaxprEqn and JaxprEqnRecipe structs. Bug find and test code from @trevorcai. Thanks! --- jax/core.py | 8 ++-- jax/interpreters/partial_eval.py | 63 ++++++++++++++++++-------------- jax/interpreters/pxla.py | 2 +- jax/lax/lax_control_flow.py | 10 ++--- tests/core_test.py | 20 +++++++++- 5 files changed, 64 insertions(+), 39 deletions(-) diff --git a/jax/core.py b/jax/core.py index da96aaef602d..42c7f2e3f5c2 100644 --- a/jax/core.py +++ b/jax/core.py @@ -80,13 +80,11 @@ def jaxpr_as_fun(typed_jaxpr, *args): return eval_jaxpr(typed_jaxpr.jaxpr, typed_jaxpr.literals, (), *args) -def new_jaxpr_eqn(*args): - return JaxprEqn(object(), *args) - -JaxprEqn = namedtuple('JaxprEqn', ['eqn_id', 'invars', 'outvars', 'primitive', +JaxprEqn = namedtuple('JaxprEqn', ['invars', 'outvars', 'primitive', 'bound_subjaxprs', 'params']) +JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn)).rstrip() +new_jaxpr_eqn = JaxprEqn -JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn))[:-1] class Var(object): def __init__(self, count, suffix): diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 6ff450cddebd..e870f45fbe1c 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -18,6 +18,7 @@ import itertools as it from collections import namedtuple, Counter, defaultdict +from weakref import ref import numpy as onp @@ -26,9 +27,9 @@ from ..abstract_arrays import ShapedArray, ConcreteArray from ..linear_util import thunk, transformation, transformation_with_aux from ..util import unzip2, safe_zip, safe_map, toposort, partial, split_list -from ..core import (Trace, Tracer, new_master, Jaxpr, JaxprEqn, Literal, - get_aval, AbstractValue, unit, unitvar, abstract_unit, - Primitive, call_p, TypedJaxpr, new_jaxpr_eqn) +from ..core import (Trace, Tracer, new_master, Jaxpr, Literal, get_aval, + AbstractValue, unit, unitvar, abstract_unit, Primitive, + call_p, TypedJaxpr, new_jaxpr_eqn) map = safe_map zip = safe_zip @@ -91,16 +92,15 @@ def process_primitive(self, primitive, tracers, params): tracers = map(self.instantiate_const, tracers) avals = [t.aval for t in tracers] out_aval = primitive.abstract_eval(*avals, **params) - # TODO(dougalm): think about whether these ref cycles will leak memory if primitive.multiple_results: out_tracers = [JaxprTracer(self, PartialVal((aval, unit)), None) for aval in out_aval] - eqn = new_jaxpr_eqn(tracers, out_tracers, primitive, (), params) + eqn = new_eqn_recipe(tracers, out_tracers, primitive, (), params) for t in out_tracers: t.recipe = eqn return out_tracers else: out_tracer = JaxprTracer(self, PartialVal((out_aval, unit)), None) - out_tracer.recipe = new_jaxpr_eqn(tracers, [out_tracer], primitive, (), params) + out_tracer.recipe = new_eqn_recipe(tracers, [out_tracer], primitive, (), params) return out_tracer def process_call(self, call_primitive, f, tracers, params): @@ -115,7 +115,7 @@ def process_call(self, call_primitive, f, tracers, params): bound_subjaxpr = (jaxpr, const_tracers, map(self.full_raise, env)) out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_jaxpr_eqn(tracers, out_tracers, call_primitive, (bound_subjaxpr,), params) + eqn = new_eqn_recipe(tracers, out_tracers, call_primitive, (bound_subjaxpr,), params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -134,8 +134,8 @@ def process_map(self, map_primitive, f, tracers, params): bound_subjaxpr = (lifted_jaxpr, (), map(self.full_raise, env)) out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_jaxpr_eqn(tuple(it.chain(const_tracers, tracers)), - out_tracers, map_primitive, (bound_subjaxpr,), params) + eqn = new_eqn_recipe(tuple(it.chain(const_tracers, tracers)), + out_tracers, map_primitive, (bound_subjaxpr,), params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -157,7 +157,7 @@ def todo(x): bound_subjaxpr = (jaxpr, const_tracers, env_tracers) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_jaxpr_eqn([], out_tracers, call_primitive, (bound_subjaxpr,), params) + eqn = new_eqn_recipe([], out_tracers, call_primitive, (bound_subjaxpr,), params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -181,13 +181,14 @@ def todo(x): bound_subjaxpr = (lifted_jaxpr, (), env_tracers) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_jaxpr_eqn(const_tracers, out_tracers, map_primitive, - (bound_subjaxpr,), params) + eqn = new_eqn_recipe(const_tracers, out_tracers, map_primitive, + (bound_subjaxpr,), params) for t in out_tracers: t.recipe = eqn return out_tracers return out, todo + def _mapped_aval(aval): if aval is core.abstract_unit: return aval @@ -254,10 +255,8 @@ def aval(self): @property def parents(self): - if isinstance(self.recipe, JaxprEqn): + if isinstance(self.recipe, JaxprEqnRecipe): return eqn_parents(self.recipe) - elif isinstance(self.recipe, Destructuring): - return eqn_parents(self.recipe.eqn) else: return [] @@ -272,8 +271,6 @@ def full_lower(self): else: return self -Destructuring = namedtuple('Destructuring', ['i', 'eqn', 'key']) - class PartialVal(tuple): def __new__(cls, xs): pv, const = xs @@ -371,11 +368,22 @@ def instantiate_const_at(trace, instantiate, tracer): FreeVar = namedtuple('FreeVar', ['val']) ConstVar = namedtuple('ConstVar', ['val']) LambdaBinding = namedtuple('LambdaBinding', []) - -def eqn_tracer_to_var(var, eqn): - _, in_tracers, out_tracers, primitive, bound_subjaxprs, params = eqn - invars = map(var, in_tracers) - outvars = map(var, out_tracers) +JaxprEqnRecipe = namedtuple('JaxprEqnRecipe', + ['eqn_id', 'invars', 'outvars', 'primitive', + 'bound_subjaxprs', 'params']) + +def new_eqn_recipe(invars, outvars, primitive, bound_subjaxprs, params): + return JaxprEqnRecipe(object(), invars, map(ref, outvars), primitive, + bound_subjaxprs, params) + +def recipe_to_eqn(unused_var, var, recipe): + _, in_tracers, out_tracer_refs, primitive, bound_subjaxprs, params = recipe + out_tracers = [t_ref() if t_ref() is not None else unused_var() + for t_ref in out_tracer_refs] + assert not any(t is None for t in out_tracers) + + invars = [var(t) for t in in_tracers] + outvars = [var(t) for t in out_tracers] new_bound_subjaxprs = [(j, map(var, c), map(var, f)) for j, c, f in bound_subjaxprs] return new_jaxpr_eqn(invars, outvars, primitive, new_bound_subjaxprs, params) @@ -383,6 +391,7 @@ def eqn_tracer_to_var(var, eqn): def tracers_to_jaxpr(in_tracers, out_tracers): newvar = core.gensym('') + unused_var = core.gensym('_unused') t_to_var = defaultdict(newvar) var = lambda t: t_to_var[id(t)] sorted_tracers = toposort(out_tracers) @@ -392,13 +401,13 @@ def tracers_to_jaxpr(in_tracers, out_tracers): consts = {} const_to_var = defaultdict(newvar) destructuring_vars = {} - processed_eqns = set() + processed_recipes = set() for t in sorted_tracers: recipe = t.recipe - if isinstance(recipe, JaxprEqn): - if recipe.eqn_id not in processed_eqns: - eqns.append(eqn_tracer_to_var(var, recipe)) - processed_eqns.add(recipe.eqn_id) + if isinstance(recipe, JaxprEqnRecipe): + if recipe.eqn_id not in processed_recipes: + eqns.append(recipe_to_eqn(unused_var, var, recipe)) + processed_recipes.add(recipe.eqn_id) elif isinstance(recipe, LambdaBinding): assert any(t is in_tracer for in_tracer in in_tracers), "Encountered unexpected tracer" assert in_tracers, "Lambda binding with no args" diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 8a8f61f207e3..647431376e25 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -269,7 +269,7 @@ def _axis_index_partial_eval(trace, _, **params): # rule except that we don't attempt to lower out of the trace. out_aval = ShapedArray((), onp.int32) out_tracer = pe.JaxprTracer(trace, pe.PartialVal((out_aval, core.unit)), None) - eqn = core.new_jaxpr_eqn([], [out_tracer], axis_index_p, (), params) + eqn = pe.new_eqn_recipe([], [out_tracer], axis_index_p, (), params) out_tracer.recipe = eqn return out_tracer diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 0ce200821010..7badc7663b1c 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -704,11 +704,11 @@ def _scan_partial_eval(trace, *tracers, **kwargs): linear_2 = ([False] * len(int_res_tracers) + [lin or not uk for uk, lin in zip(unknowns, linear)] + [False] * len(ext_res_tracers)) - eqn = pe.new_jaxpr_eqn(int_res_tracers + new_tracers + ext_res_tracers, - out_tracers, scan_p, (), - dict(forward=forward, length=length, jaxpr=jaxpr_2_opt, - num_consts=num_consts_2, - num_carry=num_carry, linear=linear_2)) + eqn = pe.new_eqn_recipe(int_res_tracers + new_tracers + ext_res_tracers, + out_tracers, scan_p, (), + dict(forward=forward, length=length, jaxpr=jaxpr_2_opt, + num_consts=num_consts_2, + num_carry=num_carry, linear=linear_2)) for t in out_tracers: t.recipe = eqn return out_tracers diff --git a/tests/core_test.py b/tests/core_test.py index 17833a55eaf3..8c9a23b41426 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -16,8 +16,9 @@ from __future__ import division from __future__ import print_function -import operator from collections import namedtuple +import gc +import operator from unittest import skip import numpy as onp @@ -258,6 +259,23 @@ def test_jvp_2(self): assert d2_sin(0.0) == 0.0 assert d3_sin(0.0) == -1.0 + def test_reference_cycles(self): + gc.collect() + + def f(x): + return x.sum() + + fn = partial(linearize, f) + params = np.zeros([]) + + debug = gc.get_debug() + try: + fn(params) + gc.set_debug(gc.DEBUG_SAVEALL) + self.assertEqual(gc.collect(), 0) + finally: + gc.set_debug(debug) + if __name__ == '__main__': absltest.main() From b1888881dae095cc3eca22ac98ce547e12fccfd8 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 19 Nov 2019 15:30:05 -0800 Subject: [PATCH 0378/1053] Bump jaxlib version to 0.1.33 and update WORKSPACE. Includes XLA fixes for CPU psum. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40fda0288ce9..d3c7891d7936 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "f0be98a469fcefab7a48721db63ea28fab24c08fd5171214978f88f02d0f07ad", - strip_prefix = "tensorflow-2bc7129de76dc6fdaab5619aaecf7a6bbfa17104", + sha256 = "ded15c9a6938ef9a553b256b12ecbf420317a70a7a72104b31da9de0ef55a099", + strip_prefix = "tensorflow-ab9851a867f5b9af250cf7a332bb636d1e64ae16", urls = [ - "https://github.com/tensorflow/tensorflow/archive/2bc7129de76dc6fdaab5619aaecf7a6bbfa17104.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/ab9851a867f5b9af250cf7a332bb636d1e64ae16.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index 3d2b773c7ba4..96dd2189ea9d 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.33" +__version__ = "0.1.34" From 1817cab012a239181dd65c78facaae4d597f5bce Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 19 Nov 2019 16:47:32 -0800 Subject: [PATCH 0379/1053] Use double-where trick to avoid NaNs in grad(sinc) --- jax/numpy/lax_numpy.py | 6 ++++-- tests/lax_numpy_test.py | 15 ++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index c795650602f5..f364548a31bb 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -624,8 +624,10 @@ def reciprocal(x): @_wraps(onp.sinc, update_doc=False) def sinc(x): x, = _promote_to_result_dtype(onp.sinc, x) - pi_x = lax.mul(lax._const(x, pi), x) - return where(lax.eq(x, lax._const(x, 0)), + eq_zero = lax.eq(x, lax._const(x, 0)) + safe_x = where(eq_zero, lax._const(x, 0), x) + pi_x = lax.mul(lax._const(x, pi), safe_x) + return where(eq_zero, lax._const(x, 1), lax.div(lax.sin(pi_x), pi_x)) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index d8f624b83a6b..cb526830950c 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2337,12 +2337,13 @@ def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): ] GradSpecialValuesTestSpec = collections.namedtuple( - "GradSpecialValuesTestSpec", ["op", "values"]) + "GradSpecialValuesTestSpec", ["op", "values", "order"]) GRAD_SPECIAL_VALUE_TEST_RECORDS = [ - GradSpecialValuesTestSpec(lnp.arcsinh, [0., 1000.]), - GradSpecialValuesTestSpec(lnp.arccosh, [1000.]), - GradSpecialValuesTestSpec(lnp.arctanh, [0.]), + GradSpecialValuesTestSpec(lnp.arcsinh, [0., 1000.], 2), + GradSpecialValuesTestSpec(lnp.arccosh, [1000.], 2), + GradSpecialValuesTestSpec(lnp.arctanh, [0.], 2), + GradSpecialValuesTestSpec(lnp.sinc, [0.], 1) ] def num_float_bits(dtype): @@ -2367,11 +2368,11 @@ def testOpGrad(self, op, rng_factory, shapes, dtype, order, tol): @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": "_{}_{}".format(rec.op.__name__, special_value), - "op": rec.op, "special_value": special_value} + "op": rec.op, "special_value": special_value, "order": rec.order} for special_value in rec.values) for rec in GRAD_SPECIAL_VALUE_TEST_RECORDS)) - def testOpGradSpecialValue(self, op, special_value): - check_grads(op, (special_value,), 2, ["fwd", "rev"], + def testOpGradSpecialValue(self, op, special_value, order): + check_grads(op, (special_value,), order, ["fwd", "rev"], atol={onp.float32: 3e-3}) def testTakeAlongAxisIssue1521(self): From 65f0556ead24906852595182879eccbb80b74ee6 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 19 Nov 2019 17:14:09 -0800 Subject: [PATCH 0380/1053] Add support for scipy.ndimage.map_coordinates with order=0 and order=1 (#1711) * Add support for scipy.ndimage.map_coordinates with order=1 Higher dimensional interpolation will be a bit trickier, but this should already be useful. * move around docstring * dtype fixes, more tests * fixup float32 tests * Handle order=0 * Tests for errors from map_coordinates --- jax/numpy/lax_numpy.py | 11 ++-- jax/scipy/__init__.py | 1 + jax/scipy/ndimage.py | 116 ++++++++++++++++++++++++++++++++ tests/scipy_ndimage_test.py | 127 ++++++++++++++++++++++++++++++++++++ 4 files changed, 250 insertions(+), 5 deletions(-) create mode 100644 jax/scipy/ndimage.py create mode 100644 tests/scipy_ndimage_test.py diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index c795650602f5..b5c95ed22f48 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -278,7 +278,7 @@ def update_numpydoc(docstr, fun, op): _numpy_signature_re = re.compile(r'^([\w., ]+=)?\s*[\w\.]+\(.*\)$') -def _wraps(fun, update_doc=True): +def _wraps(fun, update_doc=True, lax_description=""): """Like functools.wraps but works with numpy.ufuncs. It is important that when wrapping numpy functions the parameters names in the original function and in the JAX version are the same @@ -312,11 +312,12 @@ def wrap(op): body = "\n\n".join(signatures + sections[i + 1:]) if update_doc: body = update_numpydoc(body, fun, op) + desc = lax_description + "\n" if lax_description else "" docstr = ( - "{summary}\n\nLAX-backend implementation of :func:`{fun}`. " - "Original docstring below.\n\n{body}".format( - summary=summary, fun=fun.__name__, body=body)) - + "{summary}\n\nLAX-backend implementation of :func:`{fun}`.\n" + "{lax_description}Original docstring below.\n\n{body}" + .format(summary=summary, lax_description=desc, + fun=fun.__name__, body=body)) op.__name__ = fun.__name__ op.__doc__ = docstr diff --git a/jax/scipy/__init__.py b/jax/scipy/__init__.py index ca31f028a75d..095d64a124ff 100644 --- a/jax/scipy/__init__.py +++ b/jax/scipy/__init__.py @@ -14,5 +14,6 @@ from __future__ import absolute_import from . import linalg +from . import ndimage from . import special from . import stats diff --git a/jax/scipy/ndimage.py b/jax/scipy/ndimage.py new file mode 100644 index 000000000000..2ba922233cce --- /dev/null +++ b/jax/scipy/ndimage.py @@ -0,0 +1,116 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import itertools +import operator +import textwrap + +import scipy.ndimage + +from ..numpy import lax_numpy as np +from ..numpy.lax_numpy import _wraps +from ..util import safe_zip as zip + + +_nonempty_prod = functools.partial(functools.reduce, operator.mul) +_nonempty_sum = functools.partial(functools.reduce, operator.add) + +_INDEX_FIXERS = { + 'constant': lambda index, size: index, + 'nearest': lambda index, size: np.clip(index, 0, size - 1), + 'wrap': lambda index, size: index % size, +} + + +def _nearest_indices_and_weights(coordinate): + index = np.around(coordinate).astype(np.int32) + weight = coordinate.dtype.type(1) + return [(index, weight)] + + +def _linear_indices_and_weights(coordinate): + lower = np.floor(coordinate) + upper = np.ceil(coordinate) + l_index = lower.astype(np.int32) + u_index = upper.astype(np.int32) + one = coordinate.dtype.type(1) + l_weight = one - (coordinate - lower) + u_weight = one - l_weight # handles the edge case lower==upper + return [(l_index, l_weight), (u_index, u_weight)] + + +@_wraps(scipy.ndimage.map_coordinates, lax_description=textwrap.dedent("""\ + Only linear interpolation (``order=1``) and modes ``'constant'``, + ``'nearest'`` and ``'wrap'`` are currently supported. Note that + interpolation near boundaries differs from the scipy function, because we + fixed an outstanding bug (https://github.com/scipy/scipy/issues/2640); + this function interprets the ``mode`` argument as documented by SciPy, but + not as implemented by SciPy. + """)) +def map_coordinates( + input, coordinates, order, mode='constant', cval=0.0, +): + input = np.asarray(input) + coordinates = [np.asarray(c, input.dtype) for c in coordinates] + cval = np.asarray(cval, input.dtype) + + if len(coordinates) != input.ndim: + raise ValueError('coordinates must be a sequence of length input.ndim, but ' + '{} != {}'.format(len(coordinates), input.ndim)) + + index_fixer = _INDEX_FIXERS.get(mode) + if index_fixer is None: + raise NotImplementedError( + 'jax.scipy.ndimage.map_coordinates does not yet support mode {}. ' + 'Currently supported modes are {}.'.format(mode, set(_INDEX_FIXERS))) + + if mode == 'constant': + is_valid = lambda index, size: (0 <= index) & (index < size) + else: + is_valid = lambda index, size: True + + if order == 0: + interp_fun = _nearest_indices_and_weights + elif order == 1: + interp_fun = _linear_indices_and_weights + else: + raise NotImplementedError( + 'jax.scipy.ndimage.map_coordinates currently requires order<=1') + + valid_1d_interpolations = [] + for coordinate, size in zip(coordinates, input.shape): + interp_nodes = interp_fun(coordinate) + valid_interp = [] + for index, weight in interp_nodes: + fixed_index = index_fixer(index, size) + valid = is_valid(index, size) + valid_interp.append((fixed_index, valid, weight)) + valid_1d_interpolations.append(valid_interp) + + outputs = [] + for items in itertools.product(*valid_1d_interpolations): + indices, validities, weights = zip(*items) + if any(valid is not True for valid in validities): + all_valid = functools.reduce(operator.and_, validities) + contribution = np.where(all_valid, input[indices], cval) + else: + contribution = input[indices] + outputs.append(_nonempty_prod(weights) * contribution) + result = _nonempty_sum(outputs) + return result diff --git a/tests/scipy_ndimage_test.py b/tests/scipy_ndimage_test.py new file mode 100644 index 000000000000..be3af1b6a233 --- /dev/null +++ b/tests/scipy_ndimage_test.py @@ -0,0 +1,127 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from functools import partial + +import numpy as onp + +from absl.testing import absltest +from absl.testing import parameterized +import scipy.ndimage as osp_ndimage + +from jax import test_util as jtu +from jax import dtypes +from jax.scipy import ndimage as lsp_ndimage + +from jax.config import config +config.parse_flags_with_absl() + + +float_dtypes = [onp.float32, onp.float64] +complex_dtypes = [onp.complex64, onp.complex128] +inexact_dtypes = float_dtypes + complex_dtypes +int_dtypes = [onp.int32, onp.int64] +bool_dtypes = [onp.bool_] +all_dtypes = float_dtypes + complex_dtypes + int_dtypes + bool_dtypes + + +def _fixed_ref_map_coordinates(input, coordinates, order, mode, cval=0.0): + # SciPy's implementation of map_coordinates handles boundaries incorrectly, + # unless mode='reflect'. For order=1, this only affects interpolation outside + # the bounds of the original array. + # https://github.com/scipy/scipy/issues/2640 + assert order <= 1 + padding = [(max(-onp.floor(c.min()).astype(int) + 1, 0), + max(onp.ceil(c.max()).astype(int) + 1 - size, 0)) + for c, size in zip(coordinates, input.shape)] + shifted_coords = [c + p[0] for p, c in zip(padding, coordinates)] + pad_mode = { + 'nearest': 'edge', 'mirror': 'reflect', 'reflect': 'symmetric' + }.get(mode, mode) + if mode == 'constant': + padded = onp.pad(input, padding, mode=pad_mode, constant_values=cval) + else: + padded = onp.pad(input, padding, mode=pad_mode) + dtype = onp.result_type(padded, *shifted_coords) + result = osp_ndimage.map_coordinates( + padded, shifted_coords, order=order, mode=mode, cval=cval) + return result + + +class NdimageTest(jtu.JaxTestCase): + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_{}_coordinates={}_order={}_mode={}_cval={}_impl={}_round={}".format( + jtu.format_shape_dtype_string(shape, dtype), + jtu.format_shape_dtype_string(coords_shape, coords_dtype), + order, mode, cval, impl, round_), + "rng_factory": rng_factory, "shape": shape, + "coords_shape": coords_shape, "dtype": dtype, + "coords_dtype": coords_dtype, "order": order, "mode": mode, + "cval": cval, "impl": impl, "round_": round_} + for shape in [(5,), (3, 4), (3, 4, 5)] + for coords_shape in [(7,), (2, 3, 4)] + for dtype in float_dtypes + for coords_dtype in float_dtypes + for order in [0, 1] + for mode in ['wrap', 'constant', 'nearest'] + for cval in ([0, -1] if mode == 'constant' else [0]) + for impl, rng_factory in [ + ("original", partial(jtu.rand_uniform, 0, 1)), + ("fixed", partial(jtu.rand_uniform, -0.75, 1.75)), + ] + for round_ in [True, False])) + def testMapCoordinates(self, shape, dtype, coords_shape, coords_dtype, order, + mode, cval, impl, round_, rng_factory): + + def args_maker(): + x = onp.arange(onp.prod(shape), dtype=dtype).reshape(shape) + coords = [(size - 1) * rng(coords_shape, coords_dtype) for size in shape] + if round_: + coords = [c.round().astype(int) for c in coords] + return x, coords + + rng = rng_factory() + lsp_op = lambda x, c: lsp_ndimage.map_coordinates( + x, c, order=order, mode=mode, cval=cval) + impl_fun = (osp_ndimage.map_coordinates if impl == "original" + else _fixed_ref_map_coordinates) + osp_op = lambda x, c: impl_fun(x, c, order=order, mode=mode, cval=cval) + epsilon = max([dtypes.finfo(dtypes.canonicalize_dtype(d)).eps + for d in [dtype, coords_dtype]]) + self._CheckAgainstNumpy(lsp_op, osp_op, args_maker, tol=10*epsilon, + check_dtypes=True) + + def testMapCoordinatesErrors(self): + x = onp.arange(5.0) + c = [onp.linspace(0, 5, num=3)] + with self.assertRaisesRegex(NotImplementedError, 'requires order<=1'): + lsp_ndimage.map_coordinates(x, c, order=2) + with self.assertRaisesRegex( + NotImplementedError, 'does not yet support mode'): + lsp_ndimage.map_coordinates(x, c, order=1, mode='reflect') + with self.assertRaisesRegex(ValueError, 'sequence of length'): + lsp_ndimage.map_coordinates(x, [c, c], order=1) + + def testMapCoordinateDocstring(self): + self.assertIn("Only linear interpolation", + lsp_ndimage.map_coordinates.__doc__) + + +if __name__ == "__main__": + absltest.main() From 68b7dc85c3d0ecc6893ca1bab46b0f18e40a0baf Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 20 Nov 2019 07:49:13 -0800 Subject: [PATCH 0381/1053] fix multi-host pmap, disambiguate nrep When #1667 inlined a function into its caller, it mixed up two distinct values referred to as `nrep` in the two functions: num_global_replicas vs num_local_replicas. The result caused errors on multi-host setups. Co-authored-by: Jonathan Heek --- jax/interpreters/pxla.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 647431376e25..a614a3699dd6 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -464,8 +464,8 @@ def dynamic_fun(dummy, *args): jaxpr_replicas = xla.jaxpr_replicas(jaxpr) num_local_replicas = axis_size * jaxpr_replicas - nrep = global_axis_size * jaxpr_replicas - axis_env = xla.AxisEnv(nrep, [axis_name], [global_axis_size], devices) + num_global_replicas = global_axis_size * jaxpr_replicas + axis_env = xla.AxisEnv(num_global_replicas, [axis_name], [global_axis_size], devices) tuple_args = len(avals) > 100 # pass long arg lists as tuple for TPU @@ -476,10 +476,10 @@ def dynamic_fun(dummy, *args): built = c.Build(c.Tuple(*out_nodes)) if devices is None: - if nrep > xb.device_count(backend): + if num_global_replicas > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") - raise ValueError(msg.format(nrep, xb.device_count(backend))) + raise ValueError(msg.format(num_global_replicas, xb.device_count(backend))) device_assignment = None else: assert any(d.host_id == xb.host_id() for d in devices) @@ -492,29 +492,34 @@ def dynamic_fun(dummy, *args): "number of local devices passed to pmap. Got axis_size=%d, " "num_local_devices=%d.\n(Local devices passed to pmap: %s)" % (axis_size, len(local_devices), local_devices_str)) - if nrep != len(devices): + if num_global_replicas != len(devices): raise ValueError("compiling computation that requires %s replicas, " "but %s devices were specified" - % (nrep, len(devices))) + % (num_global_replicas, len(devices))) device_assignment = tuple(d.id for d in devices) compiled = built.Compile( - compile_options=xb.get_compile_options(nrep, device_assignment), + compile_options=xb.get_compile_options(num_global_replicas, device_assignment), backend=xb.get_backend(backend)) handle_args = partial(shard_args, backend, compiled.local_devices(), - assign_shards_to_replicas(nrep, axis_size), + assign_shards_to_replicas(num_local_replicas, axis_size), axis_size, tuple_args) - handle_outs = _pvals_to_results_handler(axis_size, nrep, out_pvals) - return partial(execute_replicated, compiled, backend, nrep, handle_args, handle_outs) + handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, out_pvals) + return partial(execute_replicated, compiled, backend, num_local_replicas, handle_args, handle_outs) + +class ResultToPopulate(object): pass +result_to_populate = ResultToPopulate() def _pvals_to_results_handler(size, nrep, out_pvals): nouts = len(out_pvals) handlers = [_pval_to_result_handler(size, nrep, pval) for pval in out_pvals] def handler(out_bufs): - buffers = [[None] * nrep for _ in range(nouts)] + buffers = [[result_to_populate] * nrep for _ in range(nouts)] for r, tuple_buf in enumerate(out_bufs): for i, buf in enumerate(tuple_buf.destructure()): buffers[i][r] = buf + assert not any(buf is result_to_populate for bufs in buffers + for buf in bufs) return [h(bufs) for h, bufs in zip(handlers, buffers)] return handler From 410ebfeb1cbe8de6655d4093b4983b531291da47 Mon Sep 17 00:00:00 2001 From: Peter Buchlovsky Date: Wed, 20 Nov 2019 11:46:54 +0000 Subject: [PATCH 0382/1053] Fix typo --- docs/notebooks/How_JAX_primitives_work.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 27d9532677bd..32fa6750ca2e 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -129,7 +129,7 @@ "colab_type": "text" }, "source": [ - "In order to understand how JAX is using internally the primitives,\n", + "In order to understand how JAX is internally using the primitives,\n", "we add some helpers for tracing function calls." ] }, From 9d1204689f53a6c2d439c99dc5beeea92baaf747 Mon Sep 17 00:00:00 2001 From: Peter Buchlovsky Date: Wed, 20 Nov 2019 15:23:08 +0000 Subject: [PATCH 0383/1053] Fix typo --- docs/notebooks/How_JAX_primitives_work.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 32fa6750ca2e..27988545c9ad 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -1057,7 +1057,7 @@ }, "source": [ "Notice that first we evaluate `multiply_add_value_and_jvp` abstractly, which in turn\n", - "evaluates abstractly both the primal and the tanger evaluation (a total of \n", + "evaluates abstractly both the primal and the tangent evaluation (a total of \n", "3 invocations of the `ma` primitive). Then we compile the 3 occurrences\n", "of the primitive." ] From 2353345446486c542911a8b434802200a10d85b0 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 20 Nov 2019 09:12:15 -0800 Subject: [PATCH 0384/1053] only use one gensym in tracers_to_jaxpr fixes a bug in #1721 revealed by additional internal testing --- jax/interpreters/partial_eval.py | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index e870f45fbe1c..0b4a7209d639 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -376,43 +376,38 @@ def new_eqn_recipe(invars, outvars, primitive, bound_subjaxprs, params): return JaxprEqnRecipe(object(), invars, map(ref, outvars), primitive, bound_subjaxprs, params) -def recipe_to_eqn(unused_var, var, recipe): +def recipe_to_eqn(unused_var, getvar, recipe): _, in_tracers, out_tracer_refs, primitive, bound_subjaxprs, params = recipe - out_tracers = [t_ref() if t_ref() is not None else unused_var() - for t_ref in out_tracer_refs] - assert not any(t is None for t in out_tracers) - - invars = [var(t) for t in in_tracers] - outvars = [var(t) for t in out_tracers] - new_bound_subjaxprs = [(j, map(var, c), map(var, f)) + out_tracers = [t_ref() for t_ref in out_tracer_refs] + invars = [getvar(t) for t in in_tracers] + outvars = [unused_var() if t is None else getvar(t) for t in out_tracers] + new_bound_subjaxprs = [(j, map(getvar, c), map(getvar, f)) for j, c, f in bound_subjaxprs] return new_jaxpr_eqn(invars, outvars, primitive, new_bound_subjaxprs, params) - def tracers_to_jaxpr(in_tracers, out_tracers): newvar = core.gensym('') - unused_var = core.gensym('_unused') t_to_var = defaultdict(newvar) - var = lambda t: t_to_var[id(t)] + getvar = lambda t: t_to_var[id(t)] sorted_tracers = toposort(out_tracers) - invars = map(var, in_tracers) + invars = map(getvar, in_tracers) eqns = [] env = {} consts = {} const_to_var = defaultdict(newvar) destructuring_vars = {} - processed_recipes = set() + processed_eqn_ids = set() for t in sorted_tracers: recipe = t.recipe if isinstance(recipe, JaxprEqnRecipe): - if recipe.eqn_id not in processed_recipes: - eqns.append(recipe_to_eqn(unused_var, var, recipe)) - processed_recipes.add(recipe.eqn_id) + if recipe.eqn_id not in processed_eqn_ids: + eqns.append(recipe_to_eqn(newvar, getvar, recipe)) + processed_eqn_ids.add(recipe.eqn_id) elif isinstance(recipe, LambdaBinding): assert any(t is in_tracer for in_tracer in in_tracers), "Encountered unexpected tracer" assert in_tracers, "Lambda binding with no args" elif isinstance(recipe, FreeVar): - env[var(t)] = recipe.val + env[getvar(t)] = recipe.val elif isinstance(recipe, ConstVar): v = t_to_var[id(t)] = const_to_var[id(recipe.val)] consts[v] = recipe.val @@ -425,11 +420,12 @@ def tracers_to_jaxpr(in_tracers, out_tracers): env_vars, env_vals = unzip2(env.items()) const_vars, const_vals = unzip2(consts.items()) - jaxpr = Jaxpr(const_vars, env_vars, invars, list(map(var, out_tracers)), eqns) + jaxpr = Jaxpr(const_vars, env_vars, invars, list(map(getvar, out_tracers)), eqns) core.skip_checks or core.check_jaxpr(jaxpr) return jaxpr, const_vals, env_vals + def eqn_parents(eqn): subjaxpr_tracers = [it.chain(c, f) for _, c, f in eqn.bound_subjaxprs] return list(it.chain(eqn.invars, *subjaxpr_tracers)) From db46a22b23293d2ea8dabd33dd51fee8d414d4e9 Mon Sep 17 00:00:00 2001 From: Tzu-Wei Sung Date: Wed, 20 Nov 2019 10:32:43 -0800 Subject: [PATCH 0385/1053] Implementation of np.signbit (#1627) Implement `np.signbit`. --- jax/numpy/lax_numpy.py | 30 ++++++++++++++++++++++++++++++ tests/lax_numpy_test.py | 2 ++ 2 files changed, 32 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index b5c95ed22f48..c82bafb05104 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -561,6 +561,36 @@ def exp2(x): return lax.exp(lax.mul(lax.log(_constant_like(x, 2)), x)) +@_wraps(onp.signbit) +def signbit(x): + x, = _promote_shapes("signbit", x) + + dtype = _dtype(x) + + if issubdtype(dtype, integer): + return lax.lt(x, _constant_like(x, 0)) + elif issubdtype(dtype, bool_): + return full_like(x, False, dtype=bool_) + elif not issubdtype(dtype, floating): + raise ValueError( + "jax.numpy.signbit is not well defined for %s" % dtype) + + info = finfo(_dtype(x)) + + if info.bits == 16: + int_type = onp.int16 + elif info.bits == 32: + int_type = onp.int32 + elif info.bits == 64: + int_type = onp.int64 + else: + raise NotImplementedError( + "jax.numpy.signbit only supports 16, 32, and 64-bit types.") + + x = lax.bitcast_convert_type(x, int_type) + return lax.convert_element_type(x >> (info.nexp + info.nmant), onp.bool) + + @_wraps(onp.remainder) def remainder(x1, x2): x1, x2 = _promote_args("remainder", x1, x2) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index d8f624b83a6b..8fd84981ac58 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -122,6 +122,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("array_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), op_record("reciprocal", 1, inexact_dtypes, all_shapes, jtu.rand_default, []), op_record("subtract", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("signbit", 1, default_dtypes + bool_dtypes, all_shapes, + jtu.rand_some_inf_and_nan, ["rev"]), op_record("sin", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("cos", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("tan", 1, number_dtypes, all_shapes, From ad098220677eb7eb4e648f06d197c1b1a5b5c92a Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 20 Nov 2019 10:59:54 -0800 Subject: [PATCH 0386/1053] Bump README to jaxlib 0.1.34 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 80f030991528..d88414d5f5c8 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.33-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.34-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From ee2970571218328c76f1b1f4b6f8752b2fb429b0 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 20 Nov 2019 12:35:10 -0800 Subject: [PATCH 0387/1053] Add jax.scipy.ndimage to online docs (#1724) --- docs/jax.scipy.rst | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index 9b127095d982..fbd92f564519 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -2,7 +2,7 @@ jax.scipy package ================= jax.scipy.linalg ------------------------ +---------------- .. automodule:: jax.scipy.linalg @@ -25,9 +25,18 @@ jax.scipy.linalg tril triu +jax.scipy.ndimage +----------------- + +.. automodule:: jax.scipy.ndimage + +.. autosummary:: + :toctree: _autosummary + + map_coordinates jax.scipy.special ------------------------- +----------------- .. automodule:: jax.scipy.special @@ -54,10 +63,10 @@ jax.scipy.special jax.scipy.stats ------------------------ +--------------- jax.scipy.stats.beta -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~ .. automodule:: jax.scipy.stats.beta .. autosummary:: @@ -67,7 +76,7 @@ jax.scipy.stats.beta pdf jax.scipy.stats.expon -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~ .. automodule:: jax.scipy.stats.expon .. autosummary:: :toctree: _autosummary @@ -76,7 +85,7 @@ jax.scipy.stats.expon pdf jax.scipy.stats.gamma -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~ .. automodule:: jax.scipy.stats.gamma .. autosummary:: :toctree: _autosummary @@ -85,7 +94,7 @@ jax.scipy.stats.gamma pdf jax.scipy.stats.laplace -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~ .. automodule:: jax.scipy.stats.laplace .. autosummary:: :toctree: _autosummary @@ -95,7 +104,7 @@ jax.scipy.stats.laplace pdf jax.scipy.stats.norm -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~ .. automodule:: jax.scipy.stats.norm .. autosummary:: :toctree: _autosummary @@ -106,7 +115,7 @@ jax.scipy.stats.norm pdf jax.scipy.stats.uniform -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~ .. automodule:: jax.scipy.stats.uniform .. autosummary:: :toctree: _autosummary From 16484352685af5934facd32d07cd9664192e57ac Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Wed, 20 Nov 2019 14:25:09 -0800 Subject: [PATCH 0388/1053] enable kernel regression example test --- examples/examples_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/examples_test.py b/examples/examples_test.py index 859c21a7d89e..4393cbc53dd2 100644 --- a/examples/examples_test.py +++ b/examples/examples_test.py @@ -88,8 +88,6 @@ def testKernelRegressionGram(self): check_dtypes=False) def testKernelRegressionTrainAndPredict(self): - # TODO(frostig): reenable this test. - self.skipTest("Test is broken") n, d = 100, 20 rng = onp.random.RandomState(0) truth = rng.randn(d) From b7d11ab90db071d54211f09117d1b57765c933db Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 20 Nov 2019 15:58:22 -0800 Subject: [PATCH 0389/1053] Bump jaxlib version to 0.1.35 --- jaxlib/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaxlib/version.py b/jaxlib/version.py index 96dd2189ea9d..5d0719edcbb3 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.34" +__version__ = "0.1.35" From ee36818a589d9c5d82b7b2f636c2f6c88cf9c796 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 20 Nov 2019 22:43:46 -0500 Subject: [PATCH 0390/1053] Add bfloat16 support to JAX. (#1720) bfloat16 support is still immature, but this PR adds some initial support. Fixes #76, at least enough that we can declare it fixed and open specific issues for specific bfloat16 problems. The main awkwardness that this change deals with is that classic NumPy doesn't understand bfloat16 promotion rules, so we must: implement our own type promotion operators that understand bfloat16 types wrap a number of the reference implementations in tests to temporarily cast to float32 for computation. --- jax/abstract_arrays.py | 7 +- jax/dtypes.py | 81 +++++++++++++++- jax/lax/lax.py | 51 +++++----- jax/lax_reference.py | 16 +++- jax/numpy/lax_numpy.py | 104 +++++++++++++------- jax/test_util.py | 75 ++++++++++----- tests/lax_numpy_test.py | 208 +++++++++++++++++++++++++++------------- tests/lax_test.py | 127 +++++++----------------- 8 files changed, 418 insertions(+), 251 deletions(-) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index bd966c794e4a..28f151011015 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -198,10 +198,11 @@ def zeros_like_array(x): dtype = dtypes.canonicalize_dtype(dtypes.result_type(x)) return onp.broadcast_to(onp.array(0, dtype), onp.shape(x)) -array_types = {onp.ndarray, onp.float64, onp.float32, onp.float16, +array_types = {onp.ndarray, onp.bool_, + onp.int8, onp.int16, onp.int32, onp.int64, + onp.uint8, onp.uint16, onp.uint32, onp.uint64, + dtypes.bfloat16, onp.float16, onp.float32, onp.float64, onp.complex64, onp.complex128, - onp.int64, onp.int32, onp.int16, onp.int8, - onp.bool_, onp.uint64, onp.uint32, onp.uint16, onp.uint8, onp.longlong} for t in array_types: diff --git a/jax/dtypes.py b/jax/dtypes.py index 6ddeacae03dd..efd2547ed20f 100644 --- a/jax/dtypes.py +++ b/jax/dtypes.py @@ -12,24 +12,51 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Array type functions. +# +# JAX dtypes differ from NumPy in both: +# a) their type promotion rules, and +# b) the set of supported types (e.g., bfloat16), +# so we need our own implementation that deviates from NumPy in places. + from __future__ import absolute_import from __future__ import division from __future__ import print_function from distutils.util import strtobool +import functools import os import numpy as onp import six -from .config import flags from . import util +from .config import flags +from .lib import xla_client FLAGS = flags.FLAGS flags.DEFINE_bool('jax_enable_x64', strtobool(os.getenv('JAX_ENABLE_X64', 'False')), 'Enable 64-bit types to be used.') +# bfloat16 support +bfloat16 = xla_client.bfloat16 +_bfloat16_dtype = onp.dtype(bfloat16) + +class _bfloat16_finfo(object): + bits = 16 + eps = bfloat16(float.fromhex("0x1p-7")) + epsneg = bfloat16(float.fromhex("0x1p-8")) + machep = -7 + negep = -8 + max = bfloat16(float.fromhex("0x1.FEp127")) + min = -max + nexp = 8 + nmant = 7 + iexp = nexp + precision = 2 + resolution = 10 ** -2 + tiny = bfloat16(float.fromhex("0x1p-126")) # Default types. @@ -96,12 +123,56 @@ def coerce_to_array(x): return onp.array(x, dtype) if dtype else onp.array(x) iinfo = onp.iinfo -finfo = onp.finfo + +def finfo(dtype): + # Since NumPy doesn't consider bfloat16 a floating-point type, we have to + # provide an alternative implementation of finfo that does so. + if onp.result_type(dtype) == _bfloat16_dtype: + return _bfloat16_finfo + else: + return onp.finfo(dtype) + + +def issubdtype(a, b): + if a == bfloat16: + return b in [onp.floating, onp.inexact, onp.number] + return onp.issubdtype(a, b) can_cast = onp.can_cast -issubdtype = onp.issubdtype issubsctype = onp.issubsctype -promote_types = onp.promote_types + +_bfloat16_type_promotions = { + onp.dtype('bool'): onp.dtype(bfloat16), + onp.dtype(bfloat16): onp.dtype(bfloat16), + onp.dtype('float16'): onp.dtype('float32'), + onp.dtype('float32'): onp.dtype('float32'), + onp.dtype('float64'): onp.dtype('float64'), + onp.dtype('complex64'): onp.dtype('complex64'), + onp.dtype('complex128'): onp.dtype('complex128'), + onp.dtype('int8'): onp.dtype(bfloat16), + onp.dtype('int16'): onp.dtype('float32'), + onp.dtype('int32'): onp.dtype('float64'), + onp.dtype('int64'): onp.dtype('float64'), + onp.dtype('uint8'): onp.dtype(bfloat16), + onp.dtype('uint16'): onp.dtype('float32'), + onp.dtype('uint32'): onp.dtype('float64'), + onp.dtype('uint64'): onp.dtype('float64'), +} + +def promote_types(a, b): + a = onp.dtype(a) + b = onp.dtype(b) + if b == _bfloat16_dtype: + a, b = b, a + + if a == _bfloat16_dtype: + try: + return _bfloat16_type_promotions[b] + except: + raise TypeError("invalid type promotion of bfloat16 type and {}" + .format(b)) + + return onp.promote_types(a, b) def is_python_scalar(x): @@ -138,4 +209,4 @@ def result_type(*args): (scalars if is_python_scalar(x) else dtypes).append(dtype(x)) array_priority = max(map(_dtype_priority, dtypes)) if dtypes else -1 dtypes += [x for x in scalars if _dtype_priority(x) > array_priority] - return canonicalize_dtype(onp.result_type(*dtypes)) \ No newline at end of file + return canonicalize_dtype(functools.reduce(promote_types, dtypes)) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index d3f1b5d1970e..f74c0c966e0c 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -351,17 +351,23 @@ def convert_element_type(operand, new_dtype): """ new_dtype = dtypes.canonicalize_dtype(new_dtype) old_dtype = dtypes.canonicalize_dtype(_dtype(operand)) - if old_dtype != new_dtype: - if (dtypes.issubdtype(old_dtype, onp.complexfloating) and - not dtypes.issubdtype(new_dtype, onp.complexfloating)): - msg = "Casting complex values to real discards the imaginary part" - warnings.warn(msg, onp.ComplexWarning, stacklevel=2) - operand = real(operand) - old_dtype = _dtype(operand) - return convert_element_type_p.bind( - operand, new_dtype=new_dtype, old_dtype=old_dtype) - else: + if old_dtype == new_dtype: return operand + if (dtypes.issubdtype(old_dtype, onp.complexfloating) and + not dtypes.issubdtype(new_dtype, onp.complexfloating)): + msg = "Casting complex values to real discards the imaginary part" + warnings.warn(msg, onp.ComplexWarning, stacklevel=2) + operand = real(operand) + old_dtype = _dtype(operand) + # TODO(b/143311238, b/142974574): work around bfloat16 conversion bugs by + # introducing an intermediate cast via float32. + if ((old_dtype == dtypes.bfloat16 and new_dtype != onp.float32) or + (new_dtype == dtypes.bfloat16 and old_dtype != onp.float32)): + operand = convert_element_type_p.bind( + operand, new_dtype=onp.float32, old_dtype=old_dtype) + old_dtype = onp.float32 + return convert_element_type_p.bind( + operand, new_dtype=new_dtype, old_dtype=old_dtype) def bitcast_convert_type(operand, new_dtype): """Elementwise bitcast. @@ -1377,7 +1383,19 @@ def reciprocal(x): r"""Elementwise reciprocal: :math:`1 \over x`.""" return div(_const(x, 1), x) +def _upcast_fp16_for_computation(f): + @functools.wraps(f) + def f_wrapped(x): + dtype = _dtype(x) + if dtype == onp.float16 or dtype == dtypes.bfloat16: + return convert_element_type( + f(convert_element_type(x, onp.float32)), dtype) + return f(x) + + return f_wrapped + @api.jit +@_upcast_fp16_for_computation def tan(x): r"""Elementwise tangent: :math:`\mathrm{tan}(x)`.""" return div(sin(x), cos(x)) @@ -1401,17 +1419,6 @@ def atan(x): r"""Elementwise arc tangent: :math:`\mathrm{atan}(x)`.""" return atan2(x, _const(x, 1)) -def _upcast_fp16_for_computation(f): - @functools.wraps(f) - def f_wrapped(x): - dtype = _dtype(x) - if dtype == onp.float16: - return convert_element_type( - f(convert_element_type(x, onp.float32)), dtype) - return f(x) - - return f_wrapped - @api.jit @_upcast_fp16_for_computation def sinh(x): @@ -1586,7 +1593,7 @@ def _brcast_to(x, shape): return broadcast(x, shape) -_float = {onp.floating} +_float = {onp.floating, dtypes.bfloat16} _complex = {onp.complexfloating} _complex_elem_types = {onp.float32, onp.float64} _int = {onp.integer} diff --git a/jax/lax_reference.py b/jax/lax_reference.py index 4dd5327dec84..6fda3d5365f9 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -25,6 +25,8 @@ from six.moves import builtins +from . import dtypes + _slice = builtins.slice _max = builtins.max _min = builtins.min @@ -88,7 +90,7 @@ def complex(x, y): mul = onp.multiply def div(lhs, rhs): - if onp.issubdtype(onp.result_type(lhs), onp.integer): + if dtypes.issubdtype(dtypes.result_type(lhs), onp.integer): quotient = onp.floor_divide(lhs, rhs) select = onp.logical_and(onp.sign(lhs) != onp.sign(rhs), onp.remainder(lhs, rhs) != 0) @@ -176,7 +178,11 @@ def dot_general(lhs, rhs, dimension_numbers): not_none = lambda x: x is not None out_axis_ids = filter(not_none, batch_ids + lhs_out_axis_ids + rhs_out_axis_ids) - return onp.einsum(lhs, lhs_axis_ids, rhs, rhs_axis_ids, out_axis_ids) + assert lhs.dtype == rhs.dtype + dtype = onp.float32 if lhs.dtype == dtypes.bfloat16 else None + out = onp.einsum(lhs, lhs_axis_ids, rhs, rhs_axis_ids, out_axis_ids, + dtype=dtype) + return out.astype(dtypes.bfloat16) if lhs.dtype == dtypes.bfloat16 else out def broadcast(operand, sizes): return onp.broadcast_to(operand, sizes + onp.shape(operand)) @@ -352,15 +358,15 @@ def _make_reducer(py_binop, init_val): monoid_record = _monoids.get(getattr(py_binop, '__name__')) if monoid_record: reducer, monoid_identity = monoid_record - if init_val == monoid_identity(onp.result_type(init_val)): + if init_val == monoid_identity(dtypes.result_type(init_val)): return reducer return _reducer_from_pyfunc(py_binop, init_val) def _get_max_identity(dt): - return -onp.inf if onp.issubdtype(dt, onp.floating) else onp.iinfo(dt).min + return -onp.inf if dtypes.issubdtype(dt, onp.floating) else onp.iinfo(dt).min def _get_min_identity(dt): - return onp.inf if onp.issubdtype(dt, onp.floating) else onp.iinfo(dt).max + return onp.inf if dtypes.issubdtype(dt, onp.floating) else onp.iinfo(dt).max def _identity_getter(op): return lambda dtype: onp.asarray(op.identity, dtype=dtype) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index c82bafb05104..ad265dc1d8a1 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -134,6 +134,7 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, int16 = onp.int16 int32 = onp.int32 int64 = onp.int64 +bfloat16 = dtypes.bfloat16 float16 = onp.float16 float32 = single = onp.float32 float64 = double = onp.float64 @@ -152,10 +153,8 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, unsignedinteger = onp.unsignedinteger iinfo = dtypes.iinfo -finfo = dtypes.finfo can_cast = dtypes.can_cast -issubdtype = dtypes.issubdtype issubsctype = dtypes.issubsctype result_type = dtypes.result_type promote_types = dtypes.promote_types @@ -338,6 +337,14 @@ def _canonicalize_axis(axis, num_dims): ### implementations of numpy functions in terms of lax +@_wraps(onp.finfo) +def finfo(dtype): return dtypes.finfo(dtype) + +@_wraps(onp.issubdtype) +def issubdtype(arg1, arg2): return dtypes.issubdtype(arg1, arg2) + +issubdtype = dtypes.issubdtype + @_wraps(onp.isscalar) def isscalar(num): return dtypes.is_python_scalar(num) or onp.isscalar(num) @@ -1143,9 +1150,12 @@ def nan_to_num(x, copy=True): ### Reducers -def _make_reduction(np_fun, op, init_val, preproc=None): +def _make_reduction(np_fun, op, init_val, preproc=None, bool_op=None, + upcast_f16_for_computation=False): """Creates reduction function given a binary operation and monoid identity.""" + bool_op = bool_op or op + @_wraps(np_fun) def reduction(a, axis=None, dtype=None, out=None, keepdims=False): if out is not None: @@ -1154,16 +1164,18 @@ def reduction(a, axis=None, dtype=None, out=None, keepdims=False): a = a if isinstance(a, ndarray) else asarray(a) a = preproc(a) if preproc else a dims = _reduction_dims(a, axis) - result_dtype = _dtype(np_fun(onp.ones((), dtype=dtype or _dtype(a)))) - if _dtype(a) != result_dtype: - a = lax.convert_element_type(a, result_dtype) - result = lax.reduce(a, _reduction_init_val(a, init_val), op, dims) + result_dtype = dtype or _dtype(np_fun(onp.ones((), dtype=_dtype(a)))) + if upcast_f16_for_computation and issubdtype(result_dtype, inexact): + computation_dtype = promote_types(result_dtype, float32) + else: + computation_dtype = result_dtype + a = lax.convert_element_type(a, computation_dtype) + result = lax.reduce(a, _reduction_init_val(a, init_val), + op if computation_dtype != bool_ else bool_op, dims) if keepdims: shape_with_singletons = lax.subvals(shape(a), zip(dims, (1,) * len(dims))) result = lax.reshape(result, shape_with_singletons) - if dtype and onp.dtype(dtype) != onp.dtype(result_dtype): - result = lax.convert_element_type(result, dtype) - return result + return lax.convert_element_type(result, dtype or result_dtype) return reduction @@ -1188,10 +1200,12 @@ def _reduction_init_val(a, init_val): sign, info = onp.sign(init_val), iinfo(a_dtype) return onp.array(info.min if sign < 0 else info.max, dtype=a_dtype) -_cast_to_bool = partial(lax.convert_element_type, new_dtype=onp.bool_) +_cast_to_bool = partial(lax.convert_element_type, new_dtype=bool_) -sum = _make_reduction(onp.sum, lax.add, 0) -product = prod = _make_reduction(onp.prod, lax.mul, 1) +sum = _make_reduction(onp.sum, lax.add, 0, upcast_f16_for_computation=True, + bool_op=lax.bitwise_or) +product = prod = _make_reduction(onp.prod, lax.mul, 1, bool_op=lax.bitwise_and, + upcast_f16_for_computation=True) amax = max = _make_reduction(onp.max, lax.max, -onp.inf) amin = min = _make_reduction(onp.min, lax.min, onp.inf) all = alltrue = _make_reduction(onp.all, lax.bitwise_and, True, _cast_to_bool) @@ -1210,7 +1224,7 @@ def mean(a, axis=None, dtype=None, out=None, keepdims=False): if dtype is None: if (issubdtype(_dtype(a), onp.bool_) or issubdtype(_dtype(a), onp.integer)): - dtype = dtypes.canonicalize_dtype(onp.float64) + dtype = float_ else: dtype = _dtype(a) @@ -1267,19 +1281,28 @@ def average(a, axis=None, weights=None, returned=False): return avg, weights_sum return avg +_complex_basetype = lambda dtype: onp.abs(onp.zeros((), dtype)).dtype @_wraps(onp.var) def var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False): if out is not None: raise ValueError("var does not support the `out` argument.") - if dtype is None: - if (issubdtype(_dtype(a), onp.bool_) or - issubdtype(_dtype(a), onp.integer)): - dtype = dtypes.canonicalize_dtype(onp.float64) - centered = subtract(a, mean(a, axis, dtype=dtype, keepdims=True)) - if iscomplexobj(centered): - centered = lax.abs(centered) + a_dtype = _dtype(a) + if dtype: + a_dtype = promote_types(a_dtype, dtype) + else: + if not issubdtype(a_dtype, inexact): + dtype = a_dtype = float_ + else: + dtype = _complex_basetype(a_dtype) + a_dtype = promote_types(a_dtype, float32) + a_mean = mean(a, axis, dtype=a_dtype, keepdims=True) + centered = a - a_mean + if issubdtype(centered.dtype, complexfloating): + centered = lax.real(lax.mul(centered, lax.conj(centered))) + else: + centered = lax.square(centered) if axis is None: normalizer = size(a) @@ -1287,9 +1310,10 @@ def var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False): normalizer = onp.prod(onp.take(shape(a), axis)) normalizer = normalizer - ddof - result = sum(lax.mul(centered, centered), axis, - dtype=dtype, keepdims=keepdims) - return lax.div(result, lax.convert_element_type(normalizer, _dtype(result))) + result = sum(centered, axis, keepdims=keepdims) + out = lax.div(result, lax.convert_element_type(normalizer, result.dtype)) + return lax.convert_element_type(out, dtype) + @_wraps(onp.std) @@ -1767,24 +1791,28 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, @_wraps(onp.logspace) def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): """Implementation of logspace differentiable in start and stop args.""" + dtype = dtype or result_type(start, stop, float_) + computation_dtype = promote_types(dtype, float_) + start = asarray(start, dtype=computation_dtype) + stop = asarray(stop, dtype=computation_dtype) lin = linspace(start, stop, num, endpoint=endpoint, retstep=False, dtype=None, axis=axis) - if dtype is None: - return power(base, lin) - else: - return lax.convert_element_type(power(base, lin), dtype) + return lax.convert_element_type(power(base, lin), dtype) @_wraps(onp.geomspace) def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): """Implementation of geomspace differentiable in start and stop args.""" dtype = dtype or result_type(start, stop, float(num), zeros((), dtype)) + computation_dtype = promote_types(dtype, float32) + start = asarray(start, dtype=computation_dtype) + stop = asarray(stop, dtype=computation_dtype) # follow the numpy geomspace convention for negative and complex endpoints signflip = 1 - (1 - sign(real(start))) * (1 - sign(real(stop))) // 2 res = signflip * logspace(log10(signflip * start), log10(signflip * stop), num, endpoint=endpoint, base=10.0, - dtype=dtype, axis=0) + dtype=computation_dtype, axis=0) if axis != 0: res = moveaxis(res, 0, axis) return lax.convert_element_type(res, dtype) @@ -3104,6 +3132,7 @@ def corrcoef(x, y=None, rowvar=True, bias=None, ddof=None): c = real_part return c + @_wraps(getattr(onp, "quantile", None)) def quantile(a, q, axis=None, out=None, overwrite_input=False, interpolation="linear", keepdims=False): @@ -3113,9 +3142,11 @@ def quantile(a, q, axis=None, out=None, overwrite_input=False, raise ValueError(msg) if interpolation != "linear": raise NotImplementedError("Only interpolation='linear' is implemented") + return _quantile(a, q, axis, keepdims) +@partial(jit, static_argnums=(2, 3)) +def _quantile(a, q, axis, keepdims): a = asarray(a) - if axis is None: a = ravel(a) axis = 0 @@ -3128,11 +3159,15 @@ def quantile(a, q, axis=None, out=None, overwrite_input=False, if q_ndim > 1: raise ValueError("q must be have rank <= 1, got shape {}".format(shape(q))) - a, q = _promote_dtypes(a, q) - if not issubdtype(a.dtype, floating): + q = asarray(q) + + if not issubdtype(a.dtype, floating) or not issubdtype(q.dtype, floating): msg = "q and a arguments to quantile must be of float type, got {} and {}" raise TypeError(msg.format(a.dtype, q.dtype)) + # Promote q to at least float32 for precise interpolation. + q = lax.convert_element_type(q, promote_types(q.dtype, float32)) + a_shape = shape(a) a = lax.sort(a, dimension=axis) @@ -3168,8 +3203,9 @@ def quantile(a, q, axis=None, out=None, overwrite_input=False, broadcast_dimensions=(0,)) high_weight = lax.broadcast_in_dim(high_weight, high_value.shape, broadcast_dimensions=(0,)) - return lax.add(lax.mul(low_value, low_weight), - lax.mul(high_value, high_weight)) + return lax.convert_element_type( + lax.add(lax.mul(low_value.astype(q.dtype), low_weight), + lax.mul(high_value.astype(q.dtype), high_weight)), a.dtype) @_wraps(onp.percentile) diff --git a/jax/test_util.py b/jax/test_util.py index 6834c804fa47..84a8746f4149 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -67,7 +67,7 @@ def is_sequence(x): else: return True -default_tolerance = { +_default_tolerance = { onp.dtype(onp.bool_): 0, onp.dtype(onp.int8): 0, onp.dtype(onp.int16): 0, @@ -77,6 +77,7 @@ def is_sequence(x): onp.dtype(onp.uint16): 0, onp.dtype(onp.uint32): 0, onp.dtype(onp.uint64): 0, + onp.dtype(dtypes.bfloat16): 1e-2, onp.dtype(onp.float16): 1e-3, onp.dtype(onp.float32): 1e-6, onp.dtype(onp.float64): 1e-15, @@ -84,11 +85,16 @@ def is_sequence(x): onp.dtype(onp.complex128): 1e-15, } -tpu_default_tolerance = default_tolerance.copy() -tpu_default_tolerance[onp.dtype(onp.float32)] = 1e-3 -tpu_default_tolerance[onp.dtype(onp.complex64)] = 1e-3 +def default_tolerance(): + if device_under_test() != "tpu": + return _default_tolerance + tol = _default_tolerance.copy() + tol[onp.dtype(onp.float32)] = 1e-3 + tol[onp.dtype(onp.complex64)] = 1e-3 + return tol default_gradient_tolerance = { + onp.dtype(dtypes.bfloat16): 1e-1, onp.dtype(onp.float16): 1e-2, onp.dtype(onp.float32): 2e-3, onp.dtype(onp.float64): 1e-5, @@ -96,28 +102,46 @@ def is_sequence(x): onp.dtype(onp.complex128): 1e-5, } -def _assert_numpy_eq(x, y): - onp.testing.assert_allclose(x, y) +def _assert_numpy_allclose(a, b, atol=None, rtol=None): + a = a.astype(onp.float32) if a.dtype == dtypes.bfloat16 else a + b = b.astype(onp.float32) if b.dtype == dtypes.bfloat16 else b + kw = {} + if atol: kw["atol"] = atol + if rtol: kw["rtol"] = rtol + onp.testing.assert_allclose(a, b, **kw) def tolerance(dtype, tol=None): tol = tol or {} if not isinstance(tol, dict): return tol tol = {onp.dtype(key): value for key, value in tol.items()} - default = (tpu_default_tolerance if device_under_test() == "tpu" - else default_tolerance) dtype = dtypes.canonicalize_dtype(onp.dtype(dtype)) - return tol.get(dtype, default[dtype]) + return tol.get(dtype, default_tolerance()[dtype]) + +def _normalize_tolerance(tol): + tol = tol or 0 + if isinstance(tol, dict): + return {onp.dtype(k): v for k, v in tol.items()} + else: + return {k: tol for k in _default_tolerance.keys()} + +def join_tolerance(tol1, tol2): + tol1 = _normalize_tolerance(tol1) + tol2 = _normalize_tolerance(tol2) + out = tol1 + for k, v in tol2.items(): + out[k] = max(v, tol1.get(k, 0)) + return out def _assert_numpy_close(a, b, atol=None, rtol=None): assert a.shape == b.shape atol = max(tolerance(a.dtype, atol), tolerance(b.dtype, atol)) rtol = max(tolerance(a.dtype, rtol), tolerance(b.dtype, rtol)) - onp.testing.assert_allclose(a, b, atol=atol * a.size, rtol=rtol * b.size) + _assert_numpy_allclose(a, b, atol=atol * a.size, rtol=rtol * b.size) def check_eq(xs, ys): - tree_all(tree_multimap(_assert_numpy_eq, xs, ys)) + tree_all(tree_multimap(_assert_numpy_allclose, xs, ys)) def check_close(xs, ys, atol=None, rtol=None): @@ -126,7 +150,8 @@ def check_close(xs, ys, atol=None, rtol=None): def inner_prod(xs, ys): - contract = lambda x, y: onp.real(onp.vdot(x, y)) + def contract(x, y): + return onp.real(onp.dot(onp.conj(x).reshape(-1), y.reshape(-1))) return tree_reduce(onp.add, tree_multimap(contract, xs, ys)) @@ -226,12 +251,12 @@ def device_under_test(): def supported_dtypes(): if device_under_test() == "tpu": return {onp.bool_, onp.int32, onp.int64, onp.uint32, onp.uint64, - onp.float32, onp.complex64} + dtypes.bfloat16, onp.float32, onp.complex64} else: return {onp.bool_, onp.int8, onp.int16, onp.int32, onp.int64, onp.uint8, onp.uint16, onp.uint32, onp.uint64, - onp.float16, onp.float32, onp.float64, onp.complex64, - onp.complex128} + dtypes.bfloat16, onp.float16, onp.float32, onp.float64, + onp.complex64, onp.complex128} def skip_on_devices(*disabled_devices): """A decorator for test methods to skip the test on certain devices.""" @@ -352,7 +377,7 @@ def rand_default(): def rand_nonzero(): - post = lambda x: onp.where(x == 0, 1, x) + post = lambda x: onp.where(x == 0, onp.array(1, dtype=x.dtype), x) randn = npr.RandomState(0).randn return partial(_rand_dtype, randn, scale=3, post=post) @@ -423,8 +448,8 @@ def rand(shape, dtype): neginf_flips = rng.rand(*dims) < 0.1 vals = base_rand(shape, dtype) - vals = onp.where(posinf_flips, onp.inf, vals) - vals = onp.where(neginf_flips, -onp.inf, vals) + vals = onp.where(posinf_flips, onp.array(onp.inf, dtype=dtype), vals) + vals = onp.where(neginf_flips, onp.array(-onp.inf, dtype=dtype), vals) return _cast_to_shape(onp.asarray(vals, dtype=dtype), shape, dtype) @@ -449,7 +474,7 @@ def rand(shape, dtype): nan_flips = rng.rand(*dims) < 0.1 vals = base_rand(shape, dtype) - vals = onp.where(nan_flips, onp.nan, vals) + vals = onp.where(nan_flips, onp.array(onp.nan, dtype=dtype), vals) return _cast_to_shape(onp.asarray(vals, dtype=dtype), shape, dtype) @@ -480,9 +505,9 @@ def rand(shape, dtype): nan_flips = rng.rand(*dims) < 0.1 vals = base_rand(shape, dtype) - vals = onp.where(posinf_flips, onp.inf, vals) - vals = onp.where(neginf_flips, -onp.inf, vals) - vals = onp.where(nan_flips, onp.nan, vals) + vals = onp.where(posinf_flips, onp.array(onp.inf, dtype=dtype), vals) + vals = onp.where(neginf_flips, onp.array(-onp.inf, dtype=dtype), vals) + vals = onp.where(nan_flips, onp.array(onp.nan, dtype=dtype), vals) return _cast_to_shape(onp.asarray(vals, dtype=dtype), shape, dtype) @@ -500,7 +525,7 @@ def rand(shape, dtype): zeros = rng.rand(*dims) < 0.5 vals = base_rand(shape, dtype) - vals = onp.where(zeros, 0, vals) + vals = onp.where(zeros, onp.array(0, dtype=dtype), vals) return _cast_to_shape(onp.asarray(vals, dtype=dtype), shape, dtype) @@ -564,7 +589,7 @@ def assertArraysAllClose(self, x, y, check_dtypes, atol=None, rtol=None): atol = max(tolerance(_dtype(x), atol), tolerance(_dtype(y), atol)) rtol = max(tolerance(_dtype(x), rtol), tolerance(_dtype(y), rtol)) - onp.testing.assert_allclose(x, y, atol=atol, rtol=rtol) + _assert_numpy_allclose(x, y, atol=atol, rtol=rtol) if check_dtypes: self.assertDtypesMatch(x, y) @@ -639,5 +664,5 @@ def _CheckAgainstNumpy(self, numpy_reference_op, lax_op, args_maker, args = args_maker() numpy_ans = numpy_reference_op(*args) lax_ans = lax_op(*args) - self.assertAllClose(lax_ans, numpy_ans, check_dtypes=check_dtypes, + self.assertAllClose(numpy_ans, lax_ans, check_dtypes=check_dtypes, atol=tol, rtol=tol) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 8fd84981ac58..d4e29fb7f8ae 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -57,7 +57,7 @@ all_shapes = scalar_shapes + array_shapes float_dtypes = list(jtu.supported_dtypes().intersection( - {onp.float16, onp.float32, onp.float64})) + {lnp.bfloat16, onp.float16, onp.float32, onp.float64})) complex_dtypes = [onp.complex64, onp.complex128] int_dtypes = [onp.int32, onp.int64] unsigned_dtypes = [onp.uint32, onp.uint64] @@ -102,8 +102,9 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("float_power", 2, inexact_dtypes, all_shapes, jtu.rand_default, ["rev"], - tolerance={onp.float32: 1e-3, onp.float64: 1e-12, - onp.complex64: 2e-4, onp.complex128: 1e-12}), + tolerance={lnp.bfloat16: 1e-2, onp.float32: 1e-3, + onp.float64: 1e-12, onp.complex64: 2e-4, + onp.complex128: 1e-12}), op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("greater", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), @@ -158,7 +159,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("divmod", 2, int_dtypes + float_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], - tolerance={onp.float16: 1e-2}), + tolerance={lnp.bfloat16: 2e-2, onp.float16: 1e-2}), # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 # precision. op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_positive, [], @@ -204,7 +205,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("remainder", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-2}), op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), - op_record("sinc", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], + op_record("sinc", 1, [t for t in number_dtypes if t != lnp.bfloat16], + all_shapes, jtu.rand_default, ["rev"], tolerance={onp.complex64: 1e-5}), op_record("square", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), @@ -228,10 +230,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, JAX_REDUCER_RECORDS = [ op_record("mean", 1, number_dtypes, nonempty_shapes, jtu.rand_default, []), - op_record("prod", 1, number_dtypes, all_shapes, jtu.rand_small_positive, []), - op_record("sum", 1, number_dtypes, all_shapes, jtu.rand_default, []), - op_record("var", 1, number_dtypes, nonempty_shapes, jtu.rand_default, []), - op_record("std", 1, inexact_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("prod", 1, all_dtypes, all_shapes, jtu.rand_small_positive, []), + op_record("sum", 1, all_dtypes, all_shapes, jtu.rand_default, []), op_record("nanmean", 1, inexact_dtypes, nonempty_shapes, jtu.rand_some_nan, []), op_record("nanprod", 1, inexact_dtypes, all_shapes, jtu.rand_some_nan, []), op_record("nansum", 1, number_dtypes, all_shapes, jtu.rand_some_nan, []), @@ -242,6 +242,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("any", 1, all_dtypes, all_shapes, jtu.rand_some_zero, []), op_record("max", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), op_record("min", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("var", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("std", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), ] JAX_ARGMINMAX_RECORDS = [ @@ -296,7 +298,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, numpy_version = tuple(map(int, onp.version.version.split('.'))) if numpy_version >= (1, 15): JAX_COMPOUND_OP_RECORDS += [ - op_record("isclose", 2, all_dtypes, all_shapes, jtu.rand_small_positive, []), + op_record("isclose", 2, [t for t in all_dtypes if t != lnp.bfloat16], + all_shapes, jtu.rand_small_positive, []), op_record("gcd", 2, int_dtypes, all_shapes, jtu.rand_default, []), op_record("lcm", 2, int_dtypes, all_shapes, jtu.rand_default, []), ] @@ -356,7 +359,7 @@ def _GetArgsMaker(self, rng, shapes, dtypes): dtypes), "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), - "check_dtypes": rec.check_dtypes, "tol": rec.tolerance} + "check_dtypes": rec.check_dtypes, "tolerance": rec.tolerance} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) @@ -365,7 +368,7 @@ def _GetArgsMaker(self, rng, shapes, dtypes): for rec in itertools.chain(JAX_ONE_TO_ONE_OP_RECORDS, JAX_COMPOUND_OP_RECORDS))) def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, - tol): + tolerance): rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes) python_scalar = jtu.PYTHON_SCALAR_SHAPE in shapes @@ -373,6 +376,9 @@ def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, jtu.NUMPY_SCALAR_SHAPE in shapes or () in shapes) empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) + tol = max(jtu.tolerance(dtype, tolerance) for dtype in dtypes) + tol = functools.reduce(jtu.join_tolerance, + [tolerance, tol, jtu.default_tolerance()]) self._CheckAgainstNumpy( onp_op, lnp_op, args_maker, check_dtypes=check_dtypes and not scalar_arg and not empty_shape, @@ -456,29 +462,34 @@ def testBitwiseOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes): check_dtypes=jtu.PYTHON_SCALAR_SHAPE not in shapes) self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) - @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "{}_inshape={}_axis={}_dtype={}_keepdims={}".format( - rec.test_name.capitalize(), - jtu.format_shape_dtype_string(shape, dtype), axis, - "None" if out_dtype is None else onp.dtype(out_dtype).name, keepdims), - "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, - "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), - "axis": axis, "keepdims": keepdims} - for rec in JAX_REDUCER_RECORDS - for shape in rec.shapes for dtype in rec.dtypes - for out_dtype in [None] + rec.dtypes - for axis in set(range(-len(shape), len(shape))) | set([None]) - for keepdims in [False, True])) + @parameterized.named_parameters(itertools.chain.from_iterable( + jtu.cases_from_list( + {"testcase_name": "{}_inshape={}_axis={}_dtype={}_keepdims={}".format( + rec.test_name.capitalize(), + jtu.format_shape_dtype_string(shape, dtype), axis, + "None" if out_dtype is None else onp.dtype(out_dtype).name, keepdims), + "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, + "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), + "axis": axis, "keepdims": keepdims} + for shape in rec.shapes for dtype in rec.dtypes + for out_dtype in [None] + rec.dtypes + for axis in set(range(-len(shape), len(shape))) | set([None]) + for keepdims in [False, True]) + for rec in JAX_REDUCER_RECORDS)) def testReducer(self, onp_op, lnp_op, rng_factory, shape, dtype, out_dtype, axis, keepdims): rng = rng_factory() - onp_fun = lambda x: onp_op(x, axis, dtype=out_dtype, keepdims=keepdims) + def onp_fun(x): + x_cast = x if dtype != lnp.bfloat16 else x.astype(onp.float32) + t = out_dtype if out_dtype != lnp.bfloat16 else onp.float32 + return onp_op(x_cast, axis, dtype=t, keepdims=keepdims) lnp_fun = lambda x: lnp_op(x, axis, dtype=out_dtype, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.complex64: 1e-3, onp.float64: 1e-5, onp.complex128: 1e-5} tol = jtu.tolerance(dtype, tol_spec) tol = max(tol, jtu.tolerance(out_dtype, tol_spec)) if out_dtype else tol - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + check_dtypes=lnp.bfloat16 not in (dtype, out_dtype), tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, rtol=tol) @@ -568,8 +579,12 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factor args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] axisa, axisb, axisc, axis = axes lnp_fun = lambda a, b: lnp.cross(a, b, axisa, axisb, axisc, axis) - onp_fun = lambda a, b: onp.cross(a, b, axisa, axisb, axisc, axis) - tol_spec = {onp.float16: 1e-2} + def onp_fun(a, b): + a = a.astype(onp.float32) if lhs_dtype == lnp.bfloat16 else a + b = b.astype(onp.float32) if rhs_dtype == lnp.bfloat16 else b + out = onp.cross(a, b, axisa, axisb, axisc, axis) + return out.astype(lnp.promote_types(lhs_dtype, rhs_dtype)) + tol_spec = {dtypes.bfloat16: 3e-1, onp.float16: 1e-2} tol = max(jtu.tolerance(lhs_dtype, tol_spec), jtu.tolerance(rhs_dtype, tol_spec)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, @@ -605,7 +620,11 @@ def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): onp.complex128: 1e-14} if jtu.device_under_test() == "tpu": tol[onp.float32] = tol[onp.complex64] = 2e-1 - self._CheckAgainstNumpy(onp.dot, lnp.dot, args_maker, check_dtypes=True, + def onp_dot(x, y): + x = x.astype(onp.float32) if lhs_dtype == lnp.bfloat16 else x + y = y.astype(onp.float32) if rhs_dtype == lnp.bfloat16 else y + return onp.dot(x, y).astype(lnp.promote_types(lhs_dtype, rhs_dtype)) + self._CheckAgainstNumpy(onp_dot, lnp.dot, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp.dot, args_maker, check_dtypes=True, atol=tol, rtol=tol) @@ -633,11 +652,15 @@ def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): for lhs_dtype, rhs_dtype in CombosWithReplacement(number_dtypes, 2))) def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() + def onp_fun(x, y): + dtype = lnp.promote_types(lhs_dtype, rhs_dtype) + return onp.matmul(x, y).astype(dtype) args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] - tol = {onp.float16: 1e-2, onp.float32: 2e-2, onp.float64: 1e-12} + tol = {onp.float16: 1e-2, onp.float32: 2e-2, onp.float64: 1e-12, + onp.complex128: 1e-12} if jtu.device_under_test() == "tpu": tol[onp.float32] = tol[onp.complex64] = 4e-2 - self._CheckAgainstNumpy(onp.matmul, lnp.matmul, args_maker, + self._CheckAgainstNumpy(onp_fun, lnp.matmul, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp.matmul, args_maker, check_dtypes=True, atol=tol, rtol=tol) @@ -663,7 +686,11 @@ def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_fa rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] lnp_fun = lambda a, b: lnp.tensordot(a, b, axes) - onp_fun = lambda a, b: onp.tensordot(a, b, axes) + def onp_fun(a, b): + a = a if lhs_dtype != lnp.bfloat16 else a.astype(onp.float32) + b = b if rhs_dtype != lnp.bfloat16 else b.astype(onp.float32) + dtype = lnp.promote_types(lhs_dtype, rhs_dtype) + return onp.tensordot(a, b, axes).astype(dtype) tol = {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-12, onp.complex64: 1e-3, onp.complex128: 1e-12} if jtu.device_under_test() == "tpu": @@ -688,9 +715,13 @@ def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_fa def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] - onp_fun = lambda lhs, rhs: onp.inner(lhs, rhs) + def onp_fun(lhs, rhs): + lhs = lhs if lhs_dtype != lnp.bfloat16 else lhs.astype(onp.float32) + rhs = rhs if rhs_dtype != lnp.bfloat16 else rhs.astype(onp.float32) + dtype = lnp.promote_types(lhs_dtype, rhs_dtype) + return onp.inner(lhs, rhs).astype(dtype) lnp_fun = lambda lhs, rhs: lnp.inner(lhs, rhs) - tol_spec = {onp.float16: 1e-2, onp.float64: 1e-13} + tol_spec = {onp.float16: 1e-2, onp.float32: 1e-5, onp.float64: 1e-13} if jtu.device_under_test() == "tpu": tol_spec[onp.float32] = tol_spec[onp.complex64] = 2e-1 tol = max(jtu.tolerance(lhs_dtype, tol_spec), @@ -734,7 +765,7 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): onp_fun = lambda x: onp.round(x, decimals=decimals) lnp_fun = lambda x: lnp.round(x, decimals=decimals) args_maker = lambda: [rng(shape, dtype)] - tol = {onp.float16: 1e-2} + tol = {lnp.bfloat16: 5e-2, onp.float16: 1e-2} check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=check_dtypes, tol=tol) @@ -805,23 +836,27 @@ def testTile(self, shape, dtype, reps, rng_factory): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_axis={}_baseshape=[{}]_dtypes=[{}]".format( axis, ",".join(str(d) for d in base_shape), - ",".join(onp.dtype(dtype).name for dtype in dtypes)), - "axis": axis, "base_shape": base_shape, "dtypes": dtypes, + ",".join(onp.dtype(dtype).name for dtype in arg_dtypes)), + "axis": axis, "base_shape": base_shape, "arg_dtypes": arg_dtypes, "rng_factory": jtu.rand_default} for num_arrs in [3] - for dtypes in CombosWithReplacement(default_dtypes, num_arrs) + for arg_dtypes in CombosWithReplacement(default_dtypes, num_arrs) for base_shape in [(4,), (3, 4), (2, 3, 4)] for axis in range(-len(base_shape)+1, len(base_shape)))) - def testConcatenate(self, axis, base_shape, dtypes, rng_factory): + def testConcatenate(self, axis, base_shape, arg_dtypes, rng_factory): rng = rng_factory() wrapped_axis = axis % len(base_shape) shapes = [base_shape[:wrapped_axis] + (size,) + base_shape[wrapped_axis+1:] - for size, _ in zip(itertools.cycle([3, 1, 4]), dtypes)] - onp_fun = lambda *args: onp.concatenate(args, axis=axis) + for size, _ in zip(itertools.cycle([3, 1, 4]), arg_dtypes)] + def onp_fun(*args): + args = [x if x.dtype != lnp.bfloat16 else x.astype(onp.float32) + for x in args] + dtype = functools.reduce(lnp.promote_types, arg_dtypes) + return onp.concatenate(args, axis=axis).astype(dtype) lnp_fun = lambda *args: lnp.concatenate(args, axis=axis) def args_maker(): - return [rng(shape, dtype) for shape, dtype in zip(shapes, dtypes)] + return [rng(shape, dtype) for shape, dtype in zip(shapes, arg_dtypes)] self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @@ -829,22 +864,27 @@ def args_maker(): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_axis={}_baseshape=[{}]_dtypes=[{}]".format( axis, ",".join(str(d) for d in base_shape), - ",".join(onp.dtype(dtype).name for dtype in dtypes)), - "axis": axis, "base_shape": base_shape, "dtypes": dtypes, + ",".join(onp.dtype(dtype).name for dtype in arg_dtypes)), + "axis": axis, "base_shape": base_shape, "arg_dtypes": arg_dtypes, "rng_factory": jtu.rand_default} - for dtypes in CombosWithReplacement(default_dtypes, 2) + for arg_dtypes in CombosWithReplacement(default_dtypes, 2) for base_shape in [(4,), (3, 4), (2, 3, 4)] for axis in range(-len(base_shape)+1, len(base_shape)))) - def testAppend(self, axis, base_shape, dtypes, rng_factory): + def testAppend(self, axis, base_shape, arg_dtypes, rng_factory): rng = rng_factory() wrapped_axis = axis % len(base_shape) shapes = [base_shape[:wrapped_axis] + (size,) + base_shape[wrapped_axis+1:] - for size, _ in zip(itertools.cycle([3, 1, 4]), dtypes)] - onp_fun = lambda arr, values: onp.append(arr, values, axis=axis) + for size, _ in zip(itertools.cycle([3, 1, 4]), arg_dtypes)] + def onp_fun(arr, values): + arr = arr.astype(onp.float32) if arr.dtype == lnp.bfloat16 else arr + values = (values.astype(onp.float32) if values.dtype == lnp.bfloat16 + else values) + out = onp.append(arr, values, axis=axis) + return out.astype(lnp.promote_types(*arg_dtypes)) lnp_fun = lambda arr, values: lnp.append(arr, values, axis=axis) def args_maker(): - return [rng(shape, dtype) for shape, dtype in zip(shapes, dtypes)] + return [rng(shape, dtype) for shape, dtype in zip(shapes, arg_dtypes)] self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @@ -1014,7 +1054,11 @@ def testIdentity(self, n, dtype): for offset in list(range(-4, 4)))) def testTrace(self, shape, dtype, out_dtype, offset, axis1, axis2, rng_factory): rng = rng_factory() - onp_fun = lambda arg: onp.trace(arg, offset, axis1, axis2, out_dtype) + def onp_fun(arg): + if out_dtype == lnp.bfloat16: + return onp.trace(arg, offset, axis1, axis2, onp.float32).astype(lnp.bfloat16) + else: + return onp.trace(arg, offset, axis1, axis2, out_dtype) lnp_fun = lambda arg: lnp.trace(arg, offset, axis1, axis2, out_dtype) args_maker = lambda: [rng(shape, dtype)] self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) @@ -1268,8 +1312,8 @@ def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): lnp_fun = lambda x, weights: lnp.average(x, axis, weights, returned) args_maker = lambda: [rng(shape, dtype), rng(weights_shape, dtype)] - tol = {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-10, - onp.complex64: 1e-3, onp.complex128: 1e-10} + tol = {lnp.bfloat16: 1e-1, onp.float16: 1e-1, onp.float32: 1e-3, + onp.float64: 1e-10, onp.complex64: 1e-3, onp.complex128: 1e-10} check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE try: self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, @@ -1682,7 +1726,9 @@ def args_maker(): for increasing in [False, True])) def testVander(self, shape, dtype, n, increasing, rng_factory): rng = rng_factory() - onp_fun = lambda arg: onp.vander(arg, N=n, increasing=increasing) + def onp_fun(arg): + arg = arg.astype(onp.float32) if dtype == lnp.bfloat16 else arg + return onp.vander(arg, N=n, increasing=increasing) lnp_fun = lambda arg: lnp.vander(arg, N=n, increasing=increasing) args_maker = lambda: [rng([shape], dtype)] # np.vander seems to return float64 for all floating types. We could obey @@ -1701,9 +1747,18 @@ def testVander(self, shape, dtype, n, increasing, rng_factory): def testNanToNum(self, rng_factory, shape, dtype): rng = rng_factory() dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)).type + def onp_fun(x): + if dtype == lnp.bfloat16: + x = onp.where(onp.isnan(x), dtype(0), x) + x = onp.where(onp.isposinf(x), lnp.finfo(dtype).max, x) + x = onp.where(onp.isneginf(x), lnp.finfo(dtype).min, x) + return x + else: + return onp.nan_to_num(x).astype(dtype) + args_maker = lambda: [rng(shape, dtype)] check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE - self._CheckAgainstNumpy(onp.nan_to_num, lnp.nan_to_num, args_maker, + self._CheckAgainstNumpy(onp_fun, lnp.nan_to_num, args_maker, check_dtypes=check_dtypes) self._CompileAndCheck(lnp.nan_to_num, args_maker, check_dtypes=check_dtypes) @@ -1758,12 +1813,15 @@ def testQuantile(self, op, a_rng, q_rng, a_shape, a_dtype, q_shape, q_dtype, args_maker = lambda: [a_rng(a_shape, a_dtype)] else: args_maker = lambda: [a_rng(a_shape, a_dtype), q_rng(q_shape, q_dtype)] - onp_fun = partial(getattr(onp, op), axis=axis, keepdims=keepdims) + def onp_fun(*args): + args = [x if lnp.result_type(x) != lnp.bfloat16 else + onp.asarray(x, onp.float32) for x in args] + return getattr(onp, op)(*args, axis=axis, keepdims=keepdims) lnp_fun = partial(getattr(lnp, op), axis=axis, keepdims=keepdims) # TODO(phawkins): we currently set dtype=False because we aren't as # aggressive about promoting to float64. It's not clear we want to mimic # Numpy here. - tol_spec = {onp.float16: 2e-2, onp.float32: 1e-5, onp.float64: 5e-6} + tol_spec = {onp.float32: 1e-5, onp.float64: 5e-6} tol = max(jtu.tolerance(a_dtype, tol_spec), jtu.tolerance(q_dtype, tol_spec)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, @@ -1789,7 +1847,12 @@ def args_maker(): default = rng(shapes[-1], dtypes[-1]) return condlist, choicelist, default # TODO(phawkins): float32/float64 type mismatches - self._CheckAgainstNumpy(onp.select, lnp.select, args_maker, + def onp_fun(condlist, choicelist, default): + choicelist = [x if lnp.result_type(x) != lnp.bfloat16 + else x.astype(onp.float32) for x in choicelist] + dtype = lnp.result_type(default, *choicelist) + return onp.select(condlist, choicelist, default).astype(dtype) + self._CheckAgainstNumpy(onp_fun, lnp.select, args_maker, check_dtypes=False) self._CompileAndCheck(lnp.select, args_maker, check_dtypes=True) @@ -1978,7 +2041,7 @@ def testIssue956(self): "ddof": ddof, "keepdims": keepdims, "rng_factory": rng_factory} for shape in [(5,), (10, 5)] for dtype in all_dtypes - for out_dtype in number_dtypes + for out_dtype in inexact_dtypes for axis in [None, 0, -1] for ddof in [0, 1, 2] for keepdims in [False, True] @@ -1986,9 +2049,13 @@ def testIssue956(self): def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) - onp_fun = partial(onp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) + def onp_fun(x): + out = onp.var(x.astype(lnp.promote_types(onp.float32, dtype)), + axis=axis, ddof=ddof, keepdims=keepdims) + return out.astype(out_dtype) lnp_fun = partial(lnp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) - tol = jtu.tolerance(out_dtype, {onp.float16: 1e-1}) + tol = jtu.tolerance(out_dtype, {onp.float16: 1e-1, onp.float32: 1e-3, + onp.float64: 1e-3, onp.complex128: 1e-6}) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol, @@ -2129,7 +2196,8 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, jtu.cases_from_list( {"testcase_name": ("_start_shape={}_stop_shape={}_num={}_endpoint={}" "_base={}_dtype={}").format( - start_shape, stop_shape, num, endpoint, base, dtype), + start_shape, stop_shape, num, endpoint, base, + dtype.__name__ if dtype else "None"), "start_shape": start_shape, "stop_shape": stop_shape, "num": num, "endpoint": endpoint, "base": base, @@ -2139,7 +2207,7 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, for num in [0, 1, 2, 5, 20] for endpoint in [True, False] for base in [10.0, 2, onp.e] - for dtype in number_dtypes + [None,] + for dtype in inexact_dtypes + [None,] for rng_factory in [jtu.rand_default])) def testLogspace(self, start_shape, stop_shape, num, endpoint, base, dtype, rng_factory): @@ -2212,10 +2280,16 @@ def args_maker(): start, stop = args_maker() ndim = len(onp.shape(start + stop)) for axis in range(-ndim, ndim): - lnp_op = lambda start, stop: lnp.geomspace( - start, stop, num, endpoint=endpoint, dtype=dtype, axis=axis) - onp_op = lambda start, stop: onp.geomspace( - start, stop, num, endpoint=endpoint, dtype=dtype, axis=axis) + def lnp_op(start, stop): + return lnp.geomspace(start, stop, num, endpoint=endpoint, dtype=dtype, + axis=axis) + def onp_op(start, stop): + start = start.astype(onp.float32) if dtype == lnp.bfloat16 else start + stop = stop.astype(onp.float32) if dtype == lnp.bfloat16 else stop + return onp.geomspace( + start, stop, num, endpoint=endpoint, + dtype=dtype if dtype != lnp.bfloat16 else onp.float32, + axis=axis).astype(dtype) self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=False, tol=tol) # Check dtype equivalence within expected 32bit downcasting. diff --git a/tests/lax_test.py b/tests/lax_test.py index d3f1c34b0366..7cfff54b0dd4 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -55,7 +55,7 @@ def num_float_bits(dtype): # arguments of appropriate shapes and dtypes using the following table. float_dtypes = list(jtu.supported_dtypes().intersection( - {onp.float16, onp.float32, onp.float64})) + {dtypes.bfloat16, onp.float16, onp.float32, onp.float64})) complex_dtypes = [onp.complex64, onp.complex128] inexact_dtypes = float_dtypes + complex_dtypes int_dtypes = [onp.int32, onp.int64] @@ -65,27 +65,6 @@ def num_float_bits(dtype): compatible_shapes = [[(3,)], [(3, 4), (3, 1), (1, 4)], [(2, 3, 4), (2, 1, 4)]] -default_tolerance = { - onp.bool_: 0, - onp.int16: 0, - onp.int32: 0, - onp.int64: 0, - onp.float16: 1e-3, - onp.float32: 1e-6, - onp.float64: 1e-15, - onp.complex64: 1e-6, - onp.complex128: 1e-15, -} - -def tolerance(dtype, tol=None): - if not FLAGS.jax_enable_x64: - if dtype == onp.float64: - dtype = onp.float32 - elif dtype == onp.complex128: - dtype = onp.complex64 - tol = tol or {} - return tol.get(dtype, default_tolerance[dtype]) - OpRecord = collections.namedtuple( "OpRecord", ["op", "nargs", "dtypes", "rng_factory", "tol"]) @@ -671,8 +650,10 @@ def testDot(self, lhs_shape, rhs_shape, dtype, precision, rng_factory): def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] - tol = {onp.float16: 1e-2, - onp.float64: max(default_tolerance[onp.float64], 1e-14)} + tol = { + onp.float16: 1e-2, + onp.float64: max(jtu.default_tolerance()[onp.dtype(onp.float64)], 1e-14) + } lax_op = partial(lax.dot, precision=lax.Precision.HIGHEST) self._CheckAgainstNumpy(lax_op, lax_reference.dot, args_maker, tol=tol) @@ -1740,26 +1721,6 @@ def check_grads_bilinear(f, args, order, check_grads(lambda rhs: f(lhs, rhs), (rhs,), order, modes=modes, atol=atol, rtol=rtol, eps=1.) - -default_gradient_tolerance = { - onp.float16: 1e-2, - onp.float32: 1e-6, - onp.float64: 1e-10, - onp.complex64: 1e-6, - onp.complex128: 1e-10, -} - -def gradient_tolerance(dtype, tol=None): - if dtype == onp.complex64: - dtype = onp.float32 - elif dtype == onp.complex128: - dtype = onp.float64 - if not FLAGS.jax_enable_x64 and dtype == onp.float64: - dtype = onp.float32 - tol = tol or {} - return tol.get(dtype, default_gradient_tolerance[dtype]) - - class LaxAutodiffTest(jtu.JaxTestCase): @parameterized.named_parameters(itertools.chain.from_iterable( @@ -1798,7 +1759,8 @@ def testOpGradSpecialValue(self, op, special_value, tol): for rng_factory in [jtu.rand_default])) def testConvertElementTypeGrad(self, from_dtype, to_dtype, rng_factory): rng = rng_factory() - tol = max(gradient_tolerance(to_dtype), gradient_tolerance(from_dtype)) + tol = max(jtu.tolerance(to_dtype, jtu.default_gradient_tolerance), + jtu.tolerance(from_dtype, jtu.default_gradient_tolerance)) args = (rng((2, 3), from_dtype),) convert_element_type = lambda x: lax.convert_element_type(x, to_dtype) check_grads(convert_element_type, args, 2, ["fwd", "rev"], tol, tol, eps=1.) @@ -1815,15 +1777,16 @@ def testConvertElementTypeGrad(self, from_dtype, to_dtype, rng_factory): [(), (2, 3), ()], [(2, 3), (2, 3), (2, 3)], ] - for dtype in float_dtypes + # TODO(phawkins): this test fails for bfloat16. + for dtype in [t for t in float_dtypes if t != dtypes.bfloat16] for rng_factory in [jtu.rand_default])) def testClampGrad(self, min_shape, operand_shape, max_shape, dtype, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-2}) + tol = {dtypes.bfloat16: 1e-1, onp.float16: 1e-1, onp.float32: 1e-2} shapes = [min_shape, operand_shape, max_shape] min, operand, max = (rng(shape, dtype) for shape in shapes) min, max = onp.minimum(min, max), onp.maximum(min, max) # broadcast - eps = 1e-1 if dtype == onp.float16 else 1e-2 + eps = 1e-1 if dtypes.finfo(dtype).bits == 16 else 1e-2 check_grads(lax.clamp, (min, operand, max), 2, ["fwd", "rev"], tol, tol, eps=eps) @@ -1840,12 +1803,11 @@ def testClampGrad(self, min_shape, operand_shape, max_shape, dtype, rng_factory) for rng_factory in [jtu.rand_default])) def testConcatenateGrad(self, dim, base_shape, dtype, num_arrs, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) shapes = [base_shape[:dim] + (size,) + base_shape[dim+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), range(num_arrs))] operands = tuple(rng(shape, dtype) for shape in shapes) concatenate = lambda *args: lax.concatenate(args, dim) - check_grads(concatenate, operands, 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(concatenate, operands, 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -1944,7 +1906,7 @@ def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, dimension_numbers, perms, feature_group_count, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype, {onp.float16: 5e-1, onp.float32: 1e-4}) + tol = {dtypes.bfloat16: 3e-1, onp.float16: 5e-1, onp.float32: 1e-4} # permute shapes to match dim_spec, scale by feature_group_count lhs_perm, rhs_perm = perms @@ -1974,7 +1936,7 @@ def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, for dtype in float_dtypes)) def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-4}) + tol = {onp.float16: 1e-1, onp.float32: 1e-4} lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) dot = partial(lax.dot, precision=lax.Precision.HIGHEST) @@ -2004,13 +1966,11 @@ def testDotGrad(self, lhs_shape, rhs_shape, dtype, rng_factory): def testDotGeneralContractAndBatchGrads(self, lhs_shape, rhs_shape, dtype, dimension_numbers, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) lhs = rng(lhs_shape, dtype) rhs = rng(rhs_shape, dtype) dot_general = partial(lax.dot_general, dimension_numbers=dimension_numbers, precision=lax.Precision.HIGHEST) - check_grads_bilinear(dot_general, (lhs, rhs), order=2, modes=["fwd", "rev"], - atol=tol, rtol=tol) + check_grads_bilinear(dot_general, (lhs, rhs), order=2, modes=["fwd", "rev"]) # check that precision config is preserved result, pullback = api.vjp(dot_general, lhs, rhs) gresult = lax.zeros_like_array(result) @@ -2028,10 +1988,9 @@ def testDotGeneralContractAndBatchGrads(self, lhs_shape, rhs_shape, dtype, for rng_factory in [jtu.rand_default])) def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) args = (rng(shape, dtype),) broadcast = lambda x: lax.broadcast(x, broadcast_sizes) - check_grads(broadcast, args, 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(broadcast, args, 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_bcdims={}".format( @@ -2049,11 +2008,9 @@ def testBroadcastGrad(self, shape, dtype, broadcast_sizes, rng_factory): for rng_factory in [jtu.rand_default])) def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) operand = rng(inshape, dtype) broadcast_in_dim = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) - check_grads(broadcast_in_dim, (operand,), 2, ["fwd", "rev"], tol, tol, - eps=1.) + check_grads(broadcast_in_dim, (operand,), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_perm={}".format( @@ -2077,10 +2034,9 @@ def testBroadcastInDimGrad(self, inshape, dtype, outshape, dimensions, rng_facto for rng_factory in [jtu.rand_default])) def testReshapeGrad(self, arg_shape, out_shape, permutation, dtype, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) operand = rng(arg_shape, dtype) reshape = lambda x: lax.reshape(x, out_shape, permutation) - check_grads(reshape, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(reshape, (operand,), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_pads={}" @@ -2091,17 +2047,14 @@ def testReshapeGrad(self, arg_shape, out_shape, permutation, dtype, rng_factory) for pads in [[(1, 2, 1), (0, 1, 0)], [(-1, 0, 0), (-1, 0, 2)]])) def testPadGrad(self, shape, dtype, pads, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) - operand = rng(shape, dtype) pad = lambda operand: lax.pad(operand, onp.array(0, dtype), pads) - check_grads(pad, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(pad, (operand,), 2, ["fwd", "rev"], eps=1.) operand = rng(shape, dtype) padding_value = onp.array(0., dtype) pad = lambda operand, padding_value: lax.pad(operand, padding_value, pads) - check_grads(pad, (operand, padding_value), 2, ["fwd", "rev"], tol, tol, - eps=1.) + check_grads(pad, (operand, padding_value), 2, ["fwd", "rev"], eps=1.) def testReverseGrad(self): rev = lambda operand: lax.rev(operand, dimensions) @@ -2125,13 +2078,11 @@ def testReverseGrad(self): for rng_factory in [jtu.rand_default])) def testSelectGrad(self, pred_shape, arg_shape, dtype, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) pred = rng(pred_shape, onp.bool_) on_true = rng(arg_shape, dtype) on_false = rng(arg_shape, dtype) select = lambda on_true, on_false: lax.select(pred, on_true, on_false) - check_grads(select, (on_true, on_false), 2, ["fwd", "rev"], tol, tol, - eps=1.) + check_grads(select, (on_true, on_false), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2155,10 +2106,9 @@ def testSelectGrad(self, pred_shape, arg_shape, dtype, rng_factory): for rng_factory in [jtu.rand_default])) def testSliceGrad(self, shape, dtype, starts, limits, strides, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) operand = rng(shape, dtype) slice = lambda x: lax.slice(x, starts, limits, strides) - check_grads(slice, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(slice, (operand,), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_start_indices={}_size_indices={}".format( @@ -2176,10 +2126,9 @@ def testSliceGrad(self, shape, dtype, starts, limits, strides, rng_factory): def testDynamicSliceGrad(self, shape, dtype, start_indices, size_indices, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) operand = rng(shape, dtype) dynamic_slice = lambda x: lax.dynamic_slice(x, start_indices, size_indices) - check_grads(dynamic_slice, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(dynamic_slice, (operand,), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_start_indices={}_update_shape={}".format( @@ -2197,19 +2146,18 @@ def testDynamicSliceGrad(self, shape, dtype, start_indices, size_indices, def testDynamicUpdateSliceGrad(self, shape, dtype, start_indices, update_shape, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) operand = rng(shape, dtype) update = rng(update_shape, dtype) start_indices = onp.array(start_indices) dus = lambda x, y: lax.dynamic_update_slice(x, y, start_indices) - check_grads(dus, (operand, update), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(dus, (operand, update), 2, ["fwd", "rev"], eps=1.) dus = lambda x: lax.dynamic_update_slice(x, update, start_indices) - check_grads(dus, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(dus, (operand,), 2, ["fwd", "rev"], eps=1.) dus = lambda y: lax.dynamic_update_slice(operand, y, start_indices) - check_grads(dus, (update,), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(dus, (update,), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_perm={}".format( @@ -2225,10 +2173,9 @@ def testDynamicUpdateSliceGrad(self, shape, dtype, start_indices, for rng_factory in [jtu.rand_default])) def testTransposeGrad(self, shape, dtype, perm, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype) operand = rng(shape, dtype) transpose = lambda x: lax.transpose(x, perm) - check_grads(transpose, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1.) + check_grads(transpose, (operand,), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_inshape={}_reducedims={}" @@ -2241,7 +2188,8 @@ def testTransposeGrad(self, shape, dtype, perm, rng_factory): (-onp.inf, lax.max, [t for t in inexact_dtypes if t != onp.float16]), (onp.inf, lax.min, [t for t in inexact_dtypes if t != onp.float16]), # The mul test overflows the range of a float16. - (1, lax.mul, [t for t in inexact_dtypes if t != onp.float16]), + (1, lax.mul, [t for t in inexact_dtypes + if t not in (onp.float16, dtypes.bfloat16)]), ] for dtype in dtypes for shape, dims in [ @@ -2257,12 +2205,13 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng_factory): rng = rng_factory() if jtu.device_under_test() == "tpu" and op is lax.mul: raise SkipTest("unimplemented case") - tol = gradient_tolerance( - dtype, {onp.float16: 1e-1, onp.float32: 4e-2, onp.float64: 1e-3}) + tol = {dtypes.bfloat16: 2e-1, onp.float16: 1e-1, onp.float32: 4e-2, + onp.float64: 1e-3, onp.complex64: 1e-2} operand = rng(shape, dtype) init_val = onp.asarray(init_val, dtype=dtype) reduce = lambda operand: lax.reduce(operand, init_val, op, dims) eps = (1.0 if dtypes.finfo(dtype).bits == 16 and op is lax.add else + 1e-1 if dtype == dtypes.bfloat16 else 1e-2 if dtypes.finfo(dtype).bits == 32 else None) check_grads(reduce, (operand,), 1, ["fwd", "rev"], tol, tol, eps) @@ -2281,7 +2230,7 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng_factory): for rng_factory in [jtu.rand_default])) def testReduceWindowGrad(self, op, init_val, dtype, padding, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype, {onp.float16: 1e-1, onp.float32: 1e-3}) + tol = {onp.float16: 1e-1, onp.float32: 1e-3} init_val = onp.asarray(init_val, dtype=dtype) # We need this conditional and the corresponding loop logic to be in the @@ -2333,10 +2282,9 @@ def fun(operand): for rng_factory in [jtu.rand_default])) def testSortGrad(self, shape, dtype, axis, rng_factory): rng = rng_factory() - tol = gradient_tolerance(dtype, {onp.float32: 1e-3}) operand = rng(shape, dtype) sort = lambda x: lax.sort(x, axis) - check_grads(sort, (operand,), 2, ["fwd", "rev"], tol, tol, eps=1e-2) + check_grads(sort, (operand,), 2, ["fwd", "rev"], eps=1e-2) # TODO(b/205052657): enable more tests when supported @parameterized.named_parameters(jtu.cases_from_list( @@ -2384,7 +2332,7 @@ def testIndexTakeGrad(self, shape, dtype, idxs, axes, rng_factory): rng = rng_factory() src = rng(shape, dtype) index_take = lambda src: lax.index_take(src, idxs, axes) - check_grads(index_take, (src,), 2, ["fwd", "rev"], 1e-2, 1e-2, 1) + check_grads(index_take, (src,), 2, ["fwd", "rev"], eps=1.) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_idxs={}_dnums={}_slice_sizes={}".format( @@ -2563,8 +2511,7 @@ def _CheckBatching(self, op, bdim_size, bdims, shapes, dtype, rng, def testOp(self, op_name, rng_factory, shapes, dtype, bdims): rng = rng_factory() op = getattr(lax, op_name) - tol = tolerance(dtype) - self._CheckBatching(op, 10, bdims, shapes, dtype, rng, tol, tol) + self._CheckBatching(op, 10, bdims, shapes, dtype, rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2694,7 +2641,7 @@ def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng_factory): rng = rng_factory() op = partial(lax.dot, precision=lax.Precision.HIGHEST) self._CheckBatching(op, 5, bdims, (lhs_shape, rhs_shape), dtype, rng, - rtol=tolerance(dtype, {onp.float16: 5e-2})) + rtol={onp.float16: 5e-2}) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": From c60f3fd65d7762d7037d84a425bfb2cc25d15c3d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 21 Nov 2019 09:51:26 -0500 Subject: [PATCH 0391/1053] Minor documentation fixes. (#1734) --- README.md | 1 - docs/jax.numpy.rst | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d88414d5f5c8..f84cfd6972b9 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,6 @@ open](https://github.com/google/jax) by a growing number of * [Random numbers are different](#random-numbers-are-different) * [Mini-libraries](#mini-libraries) * [How it works](#how-it-works) -* [What we're working on](#what-were-working-on) * [Current gotchas](#current-gotchas) * [Citing JAX](#citing-jax) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index c44c220c658f..a302e0ff5126 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -208,6 +208,7 @@ Not every function in NumPy is implemented; contributions are welcome! row_stack select sign + signbit sin sinc sinh From 2b0cde3648e3f405b87558e3a3eff352a6c377a8 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 21 Nov 2019 10:48:53 -0500 Subject: [PATCH 0392/1053] Fix test failure for jax.numpy.signbit(bfloat16) on TPU. (#1735) --- jax/numpy/lax_numpy.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ad265dc1d8a1..097ac4682a1b 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -571,9 +571,7 @@ def exp2(x): @_wraps(onp.signbit) def signbit(x): x, = _promote_shapes("signbit", x) - dtype = _dtype(x) - if issubdtype(dtype, integer): return lax.lt(x, _constant_like(x, 0)) elif issubdtype(dtype, bool_): @@ -582,8 +580,13 @@ def signbit(x): raise ValueError( "jax.numpy.signbit is not well defined for %s" % dtype) - info = finfo(_dtype(x)) + # TPU supports BF16 but not S16 types, so as a workaround, convert BF16 to + # F32. + if dtype == bfloat16: + dtype = float32 + x = lax.convert_element_type(x, float32) + info = finfo(dtype) if info.bits == 16: int_type = onp.int16 elif info.bits == 32: From a8a19e196ce07dc0c20864672804de36967612e8 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 21 Nov 2019 11:52:58 -0500 Subject: [PATCH 0393/1053] Implement batching rule for lax._select_and_gather_add (#1736) --- jax/interpreters/batching.py | 2 ++ jax/lax/__init__.py | 3 ++- jax/lax/lax.py | 24 +++++++++++++++++++++--- tests/lax_test.py | 26 ++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index f0d09d6c1edc..9674cba1e7d4 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -262,6 +262,8 @@ def broadcast(x, sz, axis): def moveaxis(x, src, dst): if core.get_aval(x) is core.abstract_unit: return core.unit + if src == dst: + return x src, dst = src % x.ndim, dst % x.ndim perm = [i for i in range(onp.ndim(x)) if i != src] perm.insert(dst, src) diff --git a/jax/lax/__init__.py b/jax/lax/__init__.py index 97a20246fd8a..cfbccfebf8c0 100644 --- a/jax/lax/__init__.py +++ b/jax/lax/__init__.py @@ -16,7 +16,8 @@ from .lax import * from .lax import (_reduce_sum, _reduce_max, _reduce_min, _reduce_or, _reduce_and, _reduce_window_sum, _reduce_window_max, - _reduce_window_min, _reduce_window_prod, _float, _complex, + _reduce_window_min, _reduce_window_prod, + _select_and_gather_add, _float, _complex, _input_dtype, _const, _eq_meet, _safe_mul, _broadcasting_select, _check_user_dtype_supported, _one, _const, _upcast_fp16_for_computation) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index f74c0c966e0c..d4897b621ffa 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3778,7 +3778,7 @@ def _select_and_gather_add_translation( canonicalize_types=False) if double_word_reduction: - # XLA doesn't yet implement ReduceWindow on tuples (Google bug b/73062247), so + # TODO(b/73062247): XLA doesn't yet implement ReduceWindow on tuples, so # we implement a pair-wise ReduceWindow by packing two k-bit values into # 2k-bit unsigned integer using bit tricks. word_dtype = _UINT_DTYPES[nbits] @@ -3852,7 +3852,7 @@ def reducer(): return c.Build() - assert select_prim is ge_p or select_prim is le_p + assert select_prim is ge_p or select_prim is le_p, select_prim init = -onp.inf if select_prim is ge_p else onp.inf out = c.ReduceWindow(pack(operand, tangents), pack(const(c, dtype, init), const(c, dtype, 0)), @@ -3885,12 +3885,30 @@ def _select_and_gather_add_transpose( window_strides, padding) return [result, None] +def _select_and_gather_add_batching_rule( + batched_args, batch_dims, select_prim, window_dimensions, window_strides, + padding): + t, x = batched_args + t_bdim, x_bdim = batch_dims + size = next(a.shape[bdim] for a, bdim in zip(batched_args, batch_dims) + if bdim is not None) + t = batching.bdim_at_front(t, t_bdim, size) + x = batching.bdim_at_front(x, x_bdim, size) + window_dimensions = (1,) + window_dimensions + window_strides = (1,) + window_strides + out = _select_and_gather_add(t, x, select_prim, window_dimensions, + window_strides, padding) + return (out, 0) + + select_and_gather_add_p = standard_primitive( _select_and_gather_add_shape_rule, _input_dtype, 'select_and_gather_add', _select_and_gather_add_translation) ad.primitive_jvps[select_and_gather_add_p] = _select_and_gather_add_jvp ad.primitive_transposes[select_and_gather_add_p] = \ - _select_and_gather_add_transpose + _select_and_gather_add_transpose +batching.primitive_batchers[select_and_gather_add_p] = \ + _select_and_gather_add_batching_rule xla.backend_specific_translations['tpu'][select_and_gather_add_p] = partial( _select_and_gather_add_translation, max_bits=32) diff --git a/tests/lax_test.py b/tests/lax_test.py index 7cfff54b0dd4..2aa37cc4f8cd 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -2894,6 +2894,32 @@ def fun(operand): for bdims in all_bdims(shape): self._CheckBatching(fun, 3, bdims, (shape,), dtype, rng) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_dtype={}_padding={}".format(onp.dtype(dtype).name, + padding), + "dtype": dtype, "padding": padding, "rng_factory": rng_factory} + for dtype in float_dtypes + for padding in ["VALID", "SAME"] + for rng_factory in [jtu.rand_small])) + def testSelectAndGatherAdd(self, dtype, padding, rng_factory): + rng = rng_factory() + all_configs = itertools.chain( + itertools.product( + [(4, 6)], + [(2, 1), (1, 2)], + [(1, 1), (2, 1), (1, 2)]), + itertools.product( + [(3, 2, 4, 6)], [(1, 1, 2, 1), (2, 1, 2, 1)], + [(1, 2, 2, 1), (1, 1, 1, 1)])) + + def fun(operand, tangents): + return lax._select_and_gather_add(operand, tangents, lax.ge_p, dims, + strides, padding) + + for shape, dims, strides in all_configs: + for bdims in all_bdims(shape, shape): + self._CheckBatching(fun, 3, bdims, (shape, shape), dtype, rng) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_bdims={}_fft_ndims={}" .format(shape, bdims, fft_ndims), From c601950b1bf5762dce0cd6be18be6a7a5e7e3473 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 21 Nov 2019 13:52:08 -0500 Subject: [PATCH 0394/1053] Build Mac wheels for Python 3.8 with scipy 1.3.2. (#1739) scipy 1.3.1 never had a Python 3.8 wheel. --- build/build_jaxlib_wheels_macos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build_jaxlib_wheels_macos.sh b/build/build_jaxlib_wheels_macos.sh index cc59c74132bd..01fcb0559e4f 100755 --- a/build/build_jaxlib_wheels_macos.sh +++ b/build/build_jaxlib_wheels_macos.sh @@ -47,4 +47,4 @@ build_jax 2.7.15 cp27 1.15.4 1.2.0 build_jax 3.5.6 cp35 1.15.4 1.2.0 build_jax 3.6.8 cp36 1.15.4 1.2.0 build_jax 3.7.2 cp37 1.15.4 1.2.0 -build_jax 3.8.0 cp38 1.17.3 1.3.1 +build_jax 3.8.0 cp38 1.17.3 1.3.2 From c77cdb51441cfeb198f63a7619409e2bd2d3647c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 21 Nov 2019 11:02:54 -0800 Subject: [PATCH 0395/1053] Bump README to jaxlib 0.1.35 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f84cfd6972b9..402eaed11e91 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.34-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.35-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From eff7b45dbacad0358246130c70a1b44901945bda Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 21 Nov 2019 16:31:16 -0500 Subject: [PATCH 0396/1053] Add jit decorators to most functions in jax.scipy.linalg. (#1741) --- jax/scipy/linalg.py | 69 +++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index 64a93c837740..9fef2b3ab167 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -30,24 +30,23 @@ _T = lambda x: np.swapaxes(x, -1, -2) -@_wraps(scipy.linalg.cholesky) -def cholesky(a, lower=False, overwrite_a=False, check_finite=True): - del overwrite_a, check_finite +@partial(jit, static_argnums=(1,)) +def _cholesky(a, lower): a = np_linalg._promote_arg_dtypes(np.asarray(a)) l = lax_linalg.cholesky(a if lower else np.conj(_T(a)), symmetrize_input=False) return l if lower else np.conj(_T(l)) +@_wraps(scipy.linalg.cholesky) +def cholesky(a, lower=False, overwrite_a=False, check_finite=True): + del overwrite_a, check_finite + return _cholesky(a, lower) @_wraps(scipy.linalg.cho_factor) def cho_factor(a, lower=False, overwrite_a=False, check_finite=True): return (cholesky(a, lower=lower), lower) - -@_wraps(scipy.linalg.cho_solve, update_doc=False) -def cho_solve(c_and_lower, b, overwrite_b=False, check_finite=True): - del overwrite_b, check_finite - c, lower = c_and_lower - +@partial(jit, static_argnums=(2,)) +def _cho_solve(c, b, lower): c, b = np_linalg._promote_arg_dtypes(np.asarray(c), np.asarray(b)) c_shape = np.shape(c) b_shape = np.shape(b) @@ -68,6 +67,11 @@ def cho_solve(c_and_lower, b, overwrite_b=False, check_finite=True): transpose_a=lower, conjugate_a=lower) return b[..., 0] if c_ndims != b_ndims else b +@_wraps(scipy.linalg.cho_solve, update_doc=False) +def cho_solve(c_and_lower, b, overwrite_b=False, check_finite=True): + del overwrite_b, check_finite + c, lower = c_and_lower + return _cho_solve(c, b, lower) @_wraps(scipy.linalg.svd) def svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, @@ -159,9 +163,9 @@ def lu_solve(lu_and_piv, b, trans=0, overwrite_b=False, check_finite=True): lu, pivots = lu_and_piv return _lu_solve(lu, pivots, b, trans) -@_wraps(scipy.linalg.lu, update_doc=False) -def lu(a, permute_l=False, overwrite_a=False, check_finite=True): - del overwrite_a, check_finite + +@partial(jit, static_argnums=(1,)) +def _lu(a, permute_l): a = np_linalg._promote_arg_dtypes(np.asarray(a)) lu, pivots = lax_linalg.lu(a) dtype = lax.dtype(a) @@ -176,11 +180,13 @@ def lu(a, permute_l=False, overwrite_a=False, check_finite=True): else: return p, l, u +@_wraps(scipy.linalg.lu, update_doc=False) +def lu(a, permute_l=False, overwrite_a=False, check_finite=True): + del overwrite_a, check_finite + return _lu(a, permute_l) -@_wraps(scipy.linalg.qr) -def qr(a, overwrite_a=False, lwork=None, mode="full", pivoting=False, - check_finite=True): - del overwrite_a, lwork, check_finite +@partial(jit, static_argnums=(1, 2)) +def _qr(a, mode, pivoting): if pivoting: raise NotImplementedError( "The pivoting=True case of qr is not implemented.") @@ -196,22 +202,28 @@ def qr(a, overwrite_a=False, lwork=None, mode="full", pivoting=False, return r return q, r -@_wraps(scipy.linalg.solve) -def solve(a, b, sym_pos=False, lower=False, overwrite_a=False, overwrite_b=False, - debug=False, check_finite=True): - del overwrite_a, overwrite_b, debug, check_finite +@_wraps(scipy.linalg.qr) +def qr(a, overwrite_a=False, lwork=None, mode="full", pivoting=False, + check_finite=True): + del overwrite_a, lwork, check_finite + return _qr(a, mode, pivoting) + +@partial(jit, static_argnums=(2, 3)) +def _solve(a, b, sym_pos, lower): if not sym_pos: return np_linalg.solve(a, b) a, b = np_linalg._promote_arg_dtypes(np.asarray(a), np.asarray(b)) return cho_solve(cho_factor(a, lower=lower), b) +@_wraps(scipy.linalg.solve) +def solve(a, b, sym_pos=False, lower=False, overwrite_a=False, overwrite_b=False, + debug=False, check_finite=True): + del overwrite_a, overwrite_b, debug, check_finite + return _solve(a, b, sym_pos, lower) -@_wraps(scipy.linalg.solve_triangular) -def solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False, - overwrite_b=False, debug=None, check_finite=True): - del overwrite_b, debug, check_finite - +@partial(jit, static_argnums=(2, 3, 4)) +def _solve_triangular(a, b, trans, lower, unit_diagonal): if trans == 0 or trans == "N": transpose_a, conjugate_a = False, False elif trans == 1 or trans == "T": @@ -236,6 +248,13 @@ def solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False, else: return out +@_wraps(scipy.linalg.solve_triangular) +def solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False, + overwrite_b=False, debug=None, check_finite=True): + del overwrite_b, debug, check_finite + return _solve_triangular(a, b, trans, lower, unit_diagonal) + + @_wraps(scipy.linalg.tril) def tril(m, k=0): From 27aa76e6a6895fa62e2fe23555178c59df411c70 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 21 Nov 2019 15:30:02 -0800 Subject: [PATCH 0397/1053] Add precision to jax.numpy functions that use lax.dot_general (#1728) * Add precision to jax.numpy functions that use lax.dot_general * Test precision argument * check default precision * test with jaxprs * Document precision --- jax/numpy/lax_numpy.py | 63 +++++++++++++++++++++++------------------ tests/lax_numpy_test.py | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 27 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 9d568e5d418e..33c884b47a31 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2096,26 +2096,33 @@ def append(arr, values, axis=None): ### Tensor contraction operations -@_wraps(onp.dot) -def dot(a, b): # pylint: disable=missing-docstring +_PRECISION_DOC = """\ +In addition to the original NumPy arguments listed below, also supports +``precision`` for extra control over matrix-multiplication precision +on supported devices. See :py:func:`jax.lax.dot` for details. +""" + + +@_wraps(onp.dot, lax_description=_PRECISION_DOC) +def dot(a, b, precision=None): # pylint: disable=missing-docstring _check_arraylike("dot", a, b) a, b = _promote_dtypes(a, b) a_ndim, b_ndim = ndim(a), ndim(b) if a_ndim == 0 or b_ndim == 0: return lax.mul(a, b) if _max(a_ndim, b_ndim) <= 2: - return lax.dot(a, b) + return lax.dot(a, b, precision=precision) if b_ndim == 1: contract_dims = ((a_ndim - 1,), (0,)) else: contract_dims = ((a_ndim - 1,), (b_ndim - 2,)) batch_dims = ((), ()) - return lax.dot_general(a, b, (contract_dims, batch_dims)) + return lax.dot_general(a, b, (contract_dims, batch_dims), precision) -@_wraps(onp.matmul) -def matmul(a, b): # pylint: disable=missing-docstring +@_wraps(onp.matmul, lax_description=_PRECISION_DOC) +def matmul(a, b, precision=None): # pylint: disable=missing-docstring _check_arraylike("matmul", a, b) a_is_vec, b_is_vec = (ndim(a) == 1), (ndim(b) == 1) a = lax.reshape(a, (1,) + shape(a)) if a_is_vec else a @@ -2126,8 +2133,8 @@ def matmul(a, b): # pylint: disable=missing-docstring a = broadcast_to(a, batch_shape + shape(a)[-2:]) b = broadcast_to(b, batch_shape + shape(b)[-2:]) batch_dims = tuple(range(len(batch_shape))) - result = lax.dot_general(a, b, (((ndim(a) - 1,), (ndim(b) - 2,)), - (batch_dims, batch_dims))) + dim_numbers = (((ndim(a) - 1,), (ndim(b) - 2,)), (batch_dims, batch_dims)) + result = lax.dot_general(a, b, dim_numbers, precision) if a_is_vec or b_is_vec: m, n = shape(result)[-2:] @@ -2138,15 +2145,15 @@ def matmul(a, b): # pylint: disable=missing-docstring return result -@_wraps(onp.vdot) -def vdot(a, b): +@_wraps(onp.vdot, lax_description=_PRECISION_DOC) +def vdot(a, b, precision=None): if issubdtype(_dtype(a), onp.complexfloating): a = conj(a) - return dot(a.ravel(), b.ravel()) + return dot(a.ravel(), b.ravel(), precision=precision) -@_wraps(onp.tensordot) -def tensordot(a, b, axes=2): +@_wraps(onp.tensordot, lax_description=_PRECISION_DOC) +def tensordot(a, b, axes=2, precision=None): _check_arraylike("tensordot", a, b) if not (ndim(a) >= 1 and ndim(b) >= 1): msg = "tensordot requires a.ndim and b.dim to be at least 1, got {} and {}." @@ -2161,14 +2168,14 @@ def tensordot(a, b, axes=2): a, b = _promote_dtypes(a, b) a_reshape = lax.reshape(a, (_prod(a.shape[:-axes]), _prod(a.shape[-axes:]))) b_reshape = lax.reshape(b, (_prod(b.shape[:axes]), _prod(b.shape[axes:]))) - out_reshape = lax.dot(a_reshape, b_reshape) + out_reshape = lax.dot(a_reshape, b_reshape, precision=precision) return lax.reshape(out_reshape, a.shape[:-axes] + b.shape[axes:]) elif type(axes) in (list, tuple) and len(axes) == 2: ax1, ax2 = axes if type(ax1) == type(ax2) == int: a_transposed = moveaxis(a, ax1, -1) if ax1 != a.ndim - 1 else a b_transposed = moveaxis(b, ax2, 0) if ax2 != 0 else b - return tensordot(a_transposed, b_transposed, 1) + return tensordot(a_transposed, b_transposed, 1, precision) elif type(ax1) in (list, tuple) and type(ax2) in (list, tuple): if len(ax1) != len(ax2): msg = "tensordot requires axes lists to have equal length, got {} and {}." @@ -2176,16 +2183,17 @@ def tensordot(a, b, axes=2): num_axes = len(ax1) a_transposed = moveaxis(a, ax1, tuple(range(a.ndim - num_axes, a.ndim))) b_transposed = moveaxis(b, ax2, tuple(range(num_axes))) - return tensordot(a_transposed, b_transposed, num_axes) + return tensordot(a_transposed, b_transposed, num_axes, precision) msg = ("tensordot axes argument must be an int, a pair of ints, or a pair of " "lists/tuples of ints.") raise TypeError(msg) -@_wraps(onp.einsum) +@_wraps(onp.einsum, lax_description=_PRECISION_DOC) def einsum(*operands, **kwargs): optimize = kwargs.pop('optimize', 'auto') optimize = 'greedy' if optimize is True else optimize + precision = kwargs.pop('precision', None) if kwargs: msg = 'invalid keyword arguments for einsum: {}' raise TypeError(msg.format(', '.join(kwargs))) @@ -2193,7 +2201,7 @@ def einsum(*operands, **kwargs): operands, contractions = opt_einsum.contract_path( *operands, einsum_call=True, use_blas=True, optimize=optimize) contractions = tuple(data[:3] for data in contractions) - return _einsum(operands, contractions) + return _einsum(operands, contractions, precision) @_wraps(onp.einsum_path) def einsum_path(subscripts, *operands, **kwargs): @@ -2201,8 +2209,8 @@ def einsum_path(subscripts, *operands, **kwargs): # using einsum_call=True here is an internal api for opt_einsum return opt_einsum.contract_path(subscripts, *operands, optimize=optimize) -@partial(jit, static_argnums=(1,)) -def _einsum(operands, contractions): +@partial(jit, static_argnums=(1, 2)) +def _einsum(operands, contractions, precision): operands = list(_promote_dtypes(*operands)) sum = lambda x, axes: lax.reduce(x, onp.array(0, x.dtype), lax.add, axes) @@ -2292,7 +2300,8 @@ def sum_repeats(operand, names, counts, keep_names): # contract using lax.dot_general lhs_cont, rhs_cont = unzip2((lhs_names.index(n), rhs_names.index(n)) for n in contracted_names) - operand = _dot_general(lhs, rhs, lhs_cont, rhs_cont, len(batch_dims)) + operand = _dot_general(lhs, rhs, lhs_cont, rhs_cont, len(batch_dims), + precision) deleted_names = batch_names + ''.join(contracted_names) names = (batch_names + removechars(lhs_names, deleted_names) + removechars(rhs_names, deleted_names)) @@ -2320,7 +2329,7 @@ def sum_repeats(operand, names, counts, keep_names): return operands[0] -def _dot_general(lhs, rhs, lhs_cont, rhs_cont, nbatch): +def _dot_general(lhs, rhs, lhs_cont, rhs_cont, nbatch, precision): """Helper for einsum contractions.""" # lax.dot_general has some tight constraints on dimension_numbers that this # wrapper loosens via transposes and reshapes @@ -2332,7 +2341,7 @@ def _dot_general(lhs, rhs, lhs_cont, rhs_cont, nbatch): if ncont == 1 and 0 <= lhs_ntensor <= 1 and 0 <= rhs_ntensor <= 1: dimension_numbers = [(lhs_cont, rhs_cont), (batch_dims, batch_dims)] - return lax.dot_general(lhs, rhs, dimension_numbers) + return lax.dot_general(lhs, rhs, dimension_numbers, precision) else: # move contracting dimensions to the end. lax.dot_general only allows one # contracting dimension, so if there's more than one we collapse them. @@ -2360,7 +2369,7 @@ def _dot_general(lhs, rhs, lhs_cont, rhs_cont, nbatch): lhs_cont, rhs_cont = [lhs.ndim - 1], [rhs.ndim - 1] dimension_numbers = [(lhs_cont, rhs_cont), (batch_dims, batch_dims)] - result = lax.dot_general(lhs, rhs, dimension_numbers) + result = lax.dot_general(lhs, rhs, dimension_numbers, precision) return lax.reshape(result, result_shape) @@ -2372,11 +2381,11 @@ def _movechars(s, src, dst): return ''.join(chars) -@_wraps(onp.inner) -def inner(a, b): +@_wraps(onp.inner, lax_description=_PRECISION_DOC) +def inner(a, b, precision=None): if ndim(a) == 0 or ndim(b) == 0: return a * b - return tensordot(a, b, (-1, -1)) + return tensordot(a, b, (-1, -1), precision=precision) @_wraps(onp.outer) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 62b98acbfcec..44fcb8e032b1 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2390,6 +2390,68 @@ def testBroadcastToIntIssue1548(self): self.assertAllClose(lnp.broadcast_to(1, (3, 2)), onp.ones((3, 2)), check_dtypes=False) + def testPrecision(self): + + def iter_eqns(jaxpr): + for eqn in jaxpr.eqns: + yield eqn + for subjaxpr, _, _ in eqn.bound_subjaxprs: + for sub_eqn in iter_eqns(subjaxpr): + yield sub_eqn + + def assert_precision(expected, fun, *args): + jaxpr = jax.make_jaxpr(fun)(*args) + precision, = [eqn.params['precision'] for eqn in iter_eqns(jaxpr) + if eqn.primitive == lax.dot_general_p] + self.assertEqual(precision, expected) + + ones_1d = onp.ones((2,)) + ones_2d = onp.ones((2, 2)) + ones_3d = onp.ones((2, 2, 2)) + HIGHEST = lax.Precision.HIGHEST + + assert_precision(None, lnp.dot, ones_1d, ones_1d) + assert_precision( + HIGHEST, + partial(lnp.dot, precision=HIGHEST), + ones_1d, ones_1d) + assert_precision( + HIGHEST, + partial(lnp.dot, precision=HIGHEST), + ones_3d, ones_3d) + assert_precision( + HIGHEST, + partial(lnp.matmul, precision=HIGHEST), + ones_2d, ones_2d) + assert_precision( + HIGHEST, + partial(lnp.vdot, precision=HIGHEST), + ones_1d, ones_1d) + assert_precision( + HIGHEST, + partial(lnp.tensordot, axes=2, precision=HIGHEST), + ones_2d, ones_2d) + assert_precision( + HIGHEST, + partial(lnp.tensordot, axes=(0, 0), precision=HIGHEST), + ones_1d, ones_1d) + assert_precision( + HIGHEST, + partial(lnp.tensordot, axes=((0,), (0,)), precision=HIGHEST), + ones_1d, ones_1d) + assert_precision( + HIGHEST, + partial(lnp.einsum, 'i,i', precision=HIGHEST), + ones_1d, ones_1d) + assert_precision( + HIGHEST, + partial(lnp.einsum, 'ij,ij', precision=HIGHEST), + ones_2d, ones_2d) + assert_precision( + HIGHEST, + partial(lnp.inner, precision=HIGHEST), + ones_1d, ones_1d) + # Most grad tests are at the lax level (see lax_test.py), but we add some here # as needed for e.g. particular compound ops of interest. From 39e17398ee1c0b249856209056a37ba99cce426e Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 21 Nov 2019 16:25:24 -0800 Subject: [PATCH 0398/1053] jaxlib build improvements (#1742) --- build/Dockerfile | 2 ++ build/build_jaxlib_wheels.sh | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index cf4d8ff2cca6..4b8285df87a5 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -2,6 +2,8 @@ FROM gcr.io/tensorflow-testing/nosla-cuda10.0-cudnn7-ubuntu16.04-manylinux2010 LABEL maintainer "Matt Johnson " WORKDIR / +RUN apt-get update +RUN apt-get install libffi-dev RUN git clone --branch v1.2.14 https://github.com/pyenv/pyenv.git /pyenv ENV PYENV_ROOT /pyenv RUN /pyenv/bin/pyenv install 2.7.15 diff --git a/build/build_jaxlib_wheels.sh b/build/build_jaxlib_wheels.sh index 846efde70d75..fea98164be89 100755 --- a/build/build_jaxlib_wheels.sh +++ b/build/build_jaxlib_wheels.sh @@ -13,7 +13,7 @@ for PYTHON_VERSION in $PYTHON_VERSIONS do mkdir -p dist/nocuda/ docker run -it --tmpfs /build:exec --rm -v $(pwd)/dist:/dist jaxbuild $PYTHON_VERSION nocuda - mv dist/*.whl dist/nocuda/ + mv -f dist/*.whl dist/nocuda/ done # build the cuda linux packages, tagging with linux_x86_64 @@ -26,7 +26,7 @@ do do mkdir -p dist/${CUDA_VARIANT}${CUDA_VERSION//.} docker run -it --tmpfs /build:exec --rm -v $(pwd)/dist:/dist jaxbuild $PYTHON_VERSION $CUDA_VARIANT - mv dist/*.whl dist/${CUDA_VARIANT}${CUDA_VERSION//.}/ + mv -f dist/*.whl dist/${CUDA_VARIANT}${CUDA_VERSION//.}/ done done done From 9dfb3cac28d269a3104942134bfb12abbd60b5dc Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 21 Nov 2019 20:42:28 -0500 Subject: [PATCH 0399/1053] Relax test tolerances to fix flakiness. (#1743) --- tests/lax_numpy_test.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 44fcb8e032b1..ce018649e9fc 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1821,7 +1821,7 @@ def onp_fun(*args): # TODO(phawkins): we currently set dtype=False because we aren't as # aggressive about promoting to float64. It's not clear we want to mimic # Numpy here. - tol_spec = {onp.float32: 1e-5, onp.float64: 5e-6} + tol_spec = {onp.float32: 1e-4, onp.float64: 5e-6} tol = max(jtu.tolerance(a_dtype, tol_spec), jtu.tolerance(q_dtype, tol_spec)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, @@ -2079,10 +2079,11 @@ def testCov(self, shape, dtype, rowvar, ddof, bias, rng_factory): args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.cov, rowvar=rowvar, ddof=ddof, bias=bias) lnp_fun = partial(lnp.cov, rowvar=rowvar, ddof=ddof, bias=bias) + tol = 7e-2 if jtu.device_under_test() == "tpu" else {onp.float64: 1e-13} self._CheckAgainstNumpy( - onp_fun, lnp_fun, args_maker, check_dtypes=True, - tol=7e-2 if jtu.device_under_test() == "tpu" else {onp.float64: 1e-13}) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, + rtol=tol) def testIssue967(self): self.assertRaises(TypeError, lambda: lnp.zeros(1.5)) From 1314fb7cb10dc5d484aef3f44feadc0814712ad5 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 21 Nov 2019 18:34:28 -0800 Subject: [PATCH 0400/1053] Bump jaxlib version to 0.1.36 and update WORKSPACE. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3c7891d7936..40d3d289b2e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "ded15c9a6938ef9a553b256b12ecbf420317a70a7a72104b31da9de0ef55a099", - strip_prefix = "tensorflow-ab9851a867f5b9af250cf7a332bb636d1e64ae16", + sha256 = "d83221d413fd510ac8bc68ae158fcc17c2300c7c8c3bd439e30300438c2e3ce0", + strip_prefix = "tensorflow-d85c68d5bdcb3f72abfe22a73a638c11def69a7e", urls = [ - "https://github.com/tensorflow/tensorflow/archive/ab9851a867f5b9af250cf7a332bb636d1e64ae16.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/d85c68d5bdcb3f72abfe22a73a638c11def69a7e.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index 5d0719edcbb3..1c408a9aee92 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.35" +__version__ = "0.1.36" From dc5a599a9c9cc7eca8a86a234debcc55f84c18a0 Mon Sep 17 00:00:00 2001 From: Thomas Keck Date: Fri, 22 Nov 2019 02:51:57 +0000 Subject: [PATCH 0401/1053] Fix bug in jax repeat which caused a value error for repeat arguments containing 0. (#1740) --- jax/numpy/lax_numpy.py | 3 ++- tests/lax_numpy_test.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 33c884b47a31..0bd9aed16017 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1958,7 +1958,8 @@ def repeat(a, repeats, axis=None): for i, repeat in enumerate(repeats_tiled): if not isinstance(repeat, int): repeat = repeat.item() - ret = concatenate((ret, tile(a_splitted[i], repeat))) + if repeat != 0: + ret = concatenate((ret, tile(a_splitted[i], repeat))) return reshape(ret, new_shape) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index ce018649e9fc..4e682adae058 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -925,7 +925,7 @@ def test_single(m, args_maker, repeats, axis): m = lnp.array([1,2,3,4,5,6]) args_maker = lambda: [m] - for repeats in [2, [1,3,2,1,1,2], [2], lnp.array([1,3,2,1,1,2]), lnp.array([2])]: + for repeats in [2, [1,3,2,1,1,2], [1,3,0,1,1,2], [2], lnp.array([1,3,2,1,1,2]), lnp.array([2])]: test_single(m, args_maker, repeats, None) m_rect = m.reshape((2,3)) From 15d276ce0ca7e8c99598fe07fdcf33514230e627 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 22 Nov 2019 10:41:59 -0800 Subject: [PATCH 0402/1053] Bump README to jaxlib 0.1.36 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 402eaed11e91..5b2ab1b2c1f0 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.35-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.36-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From 9c966f9fb54f01753ca434b429524796cc1beb5f Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Fri, 22 Nov 2019 15:19:01 +0000 Subject: [PATCH 0403/1053] Fix `as_abstract_value`. The `JaxprTracerTuple` appears to no longer exist and the function could return `None` if `pv` was another type other than `AbstractValue`, instead of raising an error. --- jax/interpreters/partial_eval.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 0b4a7209d639..6fbacf8ad876 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -319,9 +319,7 @@ def join_pvals(pval1, pval2): def as_abstract_val(pv): if isinstance(pv, AbstractValue): return pv - elif isinstance(pv, JaxprTracerTuple): - return AbstractTuple(map(as_abstract_val, pv)) - elif pv is None: + else: raise TypeError("{} is not abstract".format(pv)) def partial_val_aval(pv, const): From 20a7e7b3f49287ac59bfdef6ee80195209a143b6 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Fri, 22 Nov 2019 16:08:30 +0000 Subject: [PATCH 0404/1053] Remove `as_abstract_val`. --- jax/interpreters/partial_eval.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 6fbacf8ad876..cbface4180e8 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -316,12 +316,6 @@ def join_pvals(pval1, pval2): else: raise TypeError((pval1, pval2)) -def as_abstract_val(pv): - if isinstance(pv, AbstractValue): - return pv - else: - raise TypeError("{} is not abstract".format(pv)) - def partial_val_aval(pv, const): if isinstance(pv, AbstractValue): return pv From b358c27c92f614b6ab24e7c99ea5902a4da92e39 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 22 Nov 2019 10:54:03 -0800 Subject: [PATCH 0405/1053] replace x.shape with onp.shape(x) in random.py fixes #1748 (thanks @vitchyr) --- jax/random.py | 34 +++++++++++++++++----------------- tests/random_test.py | 3 +++ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/jax/random.py b/jax/random.py index 004b82e7217b..647b8effebaa 100644 --- a/jax/random.py +++ b/jax/random.py @@ -324,7 +324,7 @@ def randint(key, shape, minval, maxval, dtype=onp.int64): @partial(jit, static_argnums=(1, 4)) def _randint(key, shape, minval, maxval, dtype): - _check_shape("randint", shape, minval.shape, maxval.shape) + _check_shape("randint", shape, onp.shape(minval), onp.shape(maxval)) if not np.issubdtype(dtype, onp.integer): raise TypeError("randint only accepts integer dtypes.") @@ -503,9 +503,9 @@ def truncated_normal(key, lower, upper, shape=None, dtype=onp.float64): @partial(jit, static_argnums=(3, 4)) def _truncated_normal(key, lower, upper, shape, dtype): if shape is None: - shape = lax.broadcast_shapes(lower.shape, upper.shape) + shape = lax.broadcast_shapes(onp.shape(lower), onp.shape(upper)) else: - _check_shape("truncated_normal", shape, lower.shape, upper.shape) + _check_shape("truncated_normal", shape, onp.shape(lower), onp.shape(upper)) sqrt2 = onp.array(onp.sqrt(2), dtype) a = lax.erf(lax.convert_element_type(lower, dtype) / sqrt2) @@ -541,9 +541,9 @@ def bernoulli(key, p=onp.float32(0.5), shape=None): @partial(jit, static_argnums=(2,)) def _bernoulli(key, p, shape): if shape is None: - shape = p.shape + shape = onp.shape(p) else: - _check_shape("bernoulli", shape, p.shape) + _check_shape("bernoulli", shape, onp.shape(p)) return uniform(key, shape, lax.dtype(p)) < p @@ -573,9 +573,9 @@ def beta(key, a, b, shape=None, dtype=onp.float64): @partial(jit, static_argnums=(3, 4)) def _beta(key, a, b, shape, dtype): if shape is None: - shape = lax.broadcast_shapes(a.shape, b.shape) + shape = lax.broadcast_shapes(onp.shape(a), onp.shape(b)) else: - _check_shape("beta", shape, a.shape, b.shape) + _check_shape("beta", shape, onp.shape(a), onp.shape(b)) a = lax.convert_element_type(a, dtype) b = lax.convert_element_type(b, dtype) @@ -639,12 +639,12 @@ def _dirichlet(key, alpha, shape, dtype): raise ValueError(msg.format(onp.ndim(alpha))) if shape is None: - shape = alpha.shape[:-1] + shape = onp.shape(alpha)[:-1] else: - _check_shape("dirichlet", shape, alpha.shape[:-1]) + _check_shape("dirichlet", shape, onp.shape(alpha)[:-1]) alpha = lax.convert_element_type(alpha, dtype) - gamma_samples = gamma(key, alpha, shape + alpha.shape[-1:], dtype) + gamma_samples = gamma(key, alpha, shape + onp.shape(alpha)[-1:], dtype) return gamma_samples / np.sum(gamma_samples, axis=-1, keepdims=True) @@ -833,14 +833,14 @@ def _gamma_grad(sample, a): samples = np.reshape(sample, -1) alphas = np.reshape(a, -1) grads = vmap(_gamma_grad_one)(samples, alphas) - return grads.reshape(a.shape) + return grads.reshape(onp.shape(a)) @custom_transforms def _gamma_impl(key, a): alphas = np.reshape(a, -1) keys = split(key, onp.size(alphas)) samples = vmap(_gamma_one)(keys, alphas) - return np.reshape(samples, np.shape(a)) + return np.reshape(samples, onp.shape(a)) defjvp(_gamma_impl, None, lambda tangent, ans, key, a, **kwargs: tangent * _gamma_grad(ans, a)) @@ -868,9 +868,9 @@ def gamma(key, a, shape=None, dtype=onp.float64): @partial(jit, static_argnums=(2, 3)) def _gamma(key, a, shape, dtype): if shape is None: - shape = a.shape + shape = onp.shape(a) else: - _check_shape("gamma", shape, a.shape) + _check_shape("gamma", shape, onp.shape(a)) a = lax.convert_element_type(a, dtype) if onp.shape(a) != shape: @@ -970,7 +970,7 @@ def pareto(key, b, shape=None, dtype=onp.float64): @partial(jit, static_argnums=(2, 3)) def _pareto(key, b, shape, dtype): if shape is None: - shape = b.shape + shape = onp.shape(b) else: _check_shape("pareto", shape) @@ -1002,9 +1002,9 @@ def t(key, df, shape=(), dtype=onp.float64): @partial(jit, static_argnums=(2, 3)) def _t(key, df, shape, dtype): if shape is None: - shape = df.shape + shape = onp.shape(df) else: - _check_shape("t", shape, df.shape) + _check_shape("t", shape, onp.shape(df)) df = lax.convert_element_type(df, dtype) key_n, key_g = split(key) diff --git a/tests/random_test.py b/tests/random_test.py index 8227f626e10a..95ebe30f803b 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -408,6 +408,9 @@ def testFoldIn(self): assert onp.unique(onp.ravel(keys)).shape == (20,) def testStaticShapeErrors(self): + if config.read("jax_disable_jit"): + raise SkipTest("test only relevant when jit enabled") + @api.jit def feature_map(n, d, sigma=1.0, seed=123): key = random.PRNGKey(seed) From 6f3cb1c3eef772268ea061158196d9d33412bb37 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 22 Nov 2019 11:03:26 -0800 Subject: [PATCH 0406/1053] Add jax.devices(), etc. to the docs. --- docs/jax.rst | 7 +++++++ jax/lib/xla_bridge.py | 13 +++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/jax.rst b/docs/jax.rst index 557fe84ff3d0..dc2bf8c389ad 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -56,3 +56,10 @@ Parallelization (:code:`pmap`) ------------------------------ .. autofunction:: pmap +.. autofunction:: devices +.. autofunction:: local_devices +.. autofunction:: host_id +.. autofunction:: host_ids +.. autofunction:: device_count +.. autofunction:: local_device_count +.. autofunction:: host_count diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index c46a6a4b34a7..b8e7df12935f 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -148,13 +148,13 @@ def get_backend(platform=None): def device_count(backend=None): """Returns the total number of devices. - On most platforms, this is the same as `local_device_count()`. However, on + On most platforms, this is the same as ``local_device_count()``. However, on multi-host platforms, this will return the total number of devices across all hosts. Args: backend: This is an experimental feature and the API is likely to change. - Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. + Optional, a string representing the xla backend. 'cpu', 'gpu', or 'tpu'. Returns: Number of devices. @@ -172,12 +172,12 @@ def devices(backend=None): Each device is represented by a subclass of Device (e.g. CpuDevice, GpuDevice). The length of the returned list is equal to - `device_count()`. Local devices can be identified by comparing - `Device.host_id` to `host_id()`. + ``device_count()``. Local devices can be identified by comparing + ``Device.host_id`` to ``host_id()``. Args: backend: This is an experimental feature and the API is likely to change. - Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. + Optional, a string representing the xla backend. 'cpu', 'gpu', or 'tpu'. Returns: List of Device subclasses. @@ -200,7 +200,7 @@ def host_id(backend=None): Args: backend: This is an experimental feature and the API is likely to change. - Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. + Optional, a string representing the xla backend. 'cpu', 'gpu', or 'tpu'. Returns: Integer host ID. @@ -214,6 +214,7 @@ def host_ids(backend=None): def host_count(backend=None): + """Returns the number of hosts.""" return len(host_ids(backend)) From 3d1d140acd059138fb5f7c1d9be61a7edf290c05 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 22 Nov 2019 11:34:14 -0800 Subject: [PATCH 0407/1053] Disable failing test (#1744) --- tests/lax_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index 2aa37cc4f8cd..37cc26ac4537 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1335,7 +1335,7 @@ def testIndexTake(self, shape, dtype, idxs, axes, rng_factory): ] for rng_idx_factory in [partial(jtu.rand_int, max(shape))] for rng_factory in [jtu.rand_default])) - def testGather(self, shape, dtype, idxs, dnums, slice_sizes, rng_factory, + def testGather(self, shape, dtype, idxs, dnums, slice_sizes, rng_factory, rng_idx_factory): rng = rng_factory() rng_idx = rng_idx_factory() @@ -2902,6 +2902,8 @@ def fun(operand): for padding in ["VALID", "SAME"] for rng_factory in [jtu.rand_small])) def testSelectAndGatherAdd(self, dtype, padding, rng_factory): + if jtu.device_under_test() == "tpu" and dtype == dtypes.bfloat16: + raise SkipTest("bfloat16 _select_and_gather_add doesn't work on tpu") rng = rng_factory() all_configs = itertools.chain( itertools.product( From 1dcddde4a0eb71230a4190e63775133d483b956b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 22 Nov 2019 16:06:56 -0500 Subject: [PATCH 0408/1053] Add jax.numpy.dtype as an alias of numpy.dtype. (#1750) --- jax/numpy/lax_numpy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0bd9aed16017..a50ac7141280 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -154,6 +154,7 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, iinfo = dtypes.iinfo +dtype = onp.dtype can_cast = dtypes.can_cast issubsctype = dtypes.issubsctype result_type = dtypes.result_type From a9d1b770e428f197c6b296df884e868d66c434ab Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 22 Nov 2019 16:36:32 -0500 Subject: [PATCH 0409/1053] Relax test tolerances to reduce flakiness. (#1751) * Relax test tolerances to reduce flakiness. * Relax test tolerance for np.cov test. --- tests/batching_test.py | 4 ++-- tests/core_test.py | 2 +- tests/lax_numpy_test.py | 6 ++++-- tests/lax_test.py | 2 +- tests/linalg_test.py | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/batching_test.py b/tests/batching_test.py index 76ab6606c4f2..4f3bdac734f2 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -542,7 +542,7 @@ def f(params, x): np.reshape(g, (1,) + g.shape)] per_example_direct = np.concatenate(per_example_direct, axis=0) self.assertAllClose(per_example, per_example_direct, check_dtypes=True, - rtol=1e-3) + rtol=5e-2) def testSumPool(self): W = np.array(onp.random.randn(3, 3, 1, 5), dtype=onp.float32) @@ -573,7 +573,7 @@ def f(params, x): np.reshape(g, (1,) + g.shape)] per_example_direct = np.concatenate(per_example_direct, axis=0) self.assertAllClose(per_example, per_example_direct, check_dtypes=True, - rtol=1e-3) + rtol=3e-2) def testCumProd(self): x = np.arange(9).reshape(3, 3) + 1 diff --git a/tests/core_test.py b/tests/core_test.py index 8c9a23b41426..cc092519b2d0 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -195,7 +195,7 @@ def test_jvp_linearized(self, f, args): @parameterized.parameters(test_specs) def test_vjp(self, f, args): jtu.check_vjp(f, partial(vjp, f), args, - rtol={onp.float32: 3e-2, onp.float64: 1e-5}, + rtol={onp.float32: 7e-2, onp.float64: 1e-5}, atol={onp.float32: 1e-2, onp.float64: 1e-5}) def test_jvp_closure(self): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 4e682adae058..06730af3cf5c 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2068,7 +2068,7 @@ def onp_fun(x): "shape": shape, "dtype": dtype, "rowvar": rowvar, "ddof": ddof, "bias": bias, "rng_factory": rng_factory} for shape in [(5,), (10, 5), (5, 10)] - for dtype in all_dtypes + for dtype in [onp.float16] #all_dtypes for rowvar in [True, False] for bias in [True, False] for ddof in [None, 2, 3] @@ -2079,7 +2079,9 @@ def testCov(self, shape, dtype, rowvar, ddof, bias, rng_factory): args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.cov, rowvar=rowvar, ddof=ddof, bias=bias) lnp_fun = partial(lnp.cov, rowvar=rowvar, ddof=ddof, bias=bias) - tol = 7e-2 if jtu.device_under_test() == "tpu" else {onp.float64: 1e-13} + tol = {onp.float64: 1e-13, onp.complex128: 1e-13} + tol = 7e-2 if jtu.device_under_test() == "tpu" else tol + tol = jtu.join_tolerance(tol, jtu.tolerance(dtype)) self._CheckAgainstNumpy( onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, diff --git a/tests/lax_test.py b/tests/lax_test.py index 37cc26ac4537..a799f953155d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -2571,7 +2571,7 @@ def testConvGeneralDilatedBatching( feature_group_count=feature_group_count, precision=lax.Precision.HIGHEST) self._CheckBatching(conv, 5, (lhs_bdim, rhs_bdim), (lhs_shape, rhs_shape), - dtype, rng) + dtype, rng, rtol=tol, atol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_from_dtype={}_to_dtype={}_bdims={}".format( diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 56af60e93f0e..6c2b9ab5e9b4 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -593,7 +593,7 @@ def testIssue1151(self): A = np.array(onp.random.randn(100, 3, 3), dtype=np.float32) b = np.array(onp.random.randn(100, 3), dtype=np.float32) x = np.linalg.solve(A, b) - self.assertAllClose(vmap(np.dot)(A, x), b, atol=1e-3, rtol=1e-3, + self.assertAllClose(vmap(np.dot)(A, x), b, atol=1e-3, rtol=1e-2, check_dtypes=True) jac0 = jax.jacobian(np.linalg.solve, argnums=0)(A, b) jac1 = jax.jacobian(np.linalg.solve, argnums=1)(A, b) From 9f86b53af386a586936d8743b843da20f955024f Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 22 Nov 2019 14:28:47 -0800 Subject: [PATCH 0410/1053] Revert LaxBackedNumpyTests.testCov to use all_dtypes --- tests/lax_numpy_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 06730af3cf5c..2019f9d12ecf 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -912,7 +912,7 @@ def testIssue1233(self): Following numpy test suite from `test_repeat` at https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_multiarray.py ''' tol = 1e-5 - + def test_single(m, args_maker, repeats, axis): lax_ans = lnp.repeat(m, repeats, axis) numpy_ans = onp.repeat(m, repeats, axis) @@ -2068,7 +2068,7 @@ def onp_fun(x): "shape": shape, "dtype": dtype, "rowvar": rowvar, "ddof": ddof, "bias": bias, "rng_factory": rng_factory} for shape in [(5,), (10, 5), (5, 10)] - for dtype in [onp.float16] #all_dtypes + for dtype in all_dtypes for rowvar in [True, False] for bias in [True, False] for ddof in [None, 2, 3] From 8f2a050e1ed0817d368d3c38c92fa4e7b4f8301c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 22 Nov 2019 18:06:10 -0800 Subject: [PATCH 0411/1053] fix cov test tol Co-authored-by: Skye Wanderman-Milne --- tests/lax_numpy_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 2019f9d12ecf..e25e5e0540ac 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2079,7 +2079,7 @@ def testCov(self, shape, dtype, rowvar, ddof, bias, rng_factory): args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.cov, rowvar=rowvar, ddof=ddof, bias=bias) lnp_fun = partial(lnp.cov, rowvar=rowvar, ddof=ddof, bias=bias) - tol = {onp.float64: 1e-13, onp.complex128: 1e-13} + tol = {onp.float32: 1e-5, onp.float64: 1e-13, onp.complex128: 1e-13} tol = 7e-2 if jtu.device_under_test() == "tpu" else tol tol = jtu.join_tolerance(tol, jtu.tolerance(dtype)) self._CheckAgainstNumpy( From 45a1ba0bbcfc64e9c65f9d2589bb474a59312c99 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 23 Nov 2019 12:28:26 -0500 Subject: [PATCH 0412/1053] Make more tests pass on TPU. (#1752) --- tests/dtypes_test.py | 1 + tests/loops_test.py | 2 ++ tests/optix_test.py | 6 +++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/dtypes_test.py b/tests/dtypes_test.py index 685a0129638b..83ffad3e9af0 100644 --- a/tests/dtypes_test.py +++ b/tests/dtypes_test.py @@ -48,6 +48,7 @@ def testDefaultTypes(self, type, dtype): {"testcase_name": "_swap={}_jit={}".format(swap, jit), "swap": swap, "jit": jit} for swap in [False, True] for jit in [False, True]) + @jtu.skip_on_devices("tpu") # F16 not supported on TPU def testBinaryPromotion(self, swap, jit): testcases = [ (np.array(1.), 0., np.float_), diff --git a/tests/loops_test.py b/tests/loops_test.py index 9f484ab5d095..e9302477c612 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -28,6 +28,8 @@ from jax import test_util as jtu from jax.experimental import loops +from jax.config import config +config.parse_flags_with_absl() class LoopsTest(jtu.JaxTestCase): diff --git a/tests/optix_test.py b/tests/optix_test.py index 14426f6cc5e5..c0126c56dff1 100644 --- a/tests/optix_test.py +++ b/tests/optix_test.py @@ -22,9 +22,13 @@ from jax import numpy as jnp from jax.experimental import optimizers from jax.experimental import optix +import jax.test_util # imported only for flags from jax.tree_util import tree_leaves import numpy as onp +from jax.config import config +config.parse_flags_with_absl() + STEPS = 50 LR = 1e-2 @@ -80,7 +84,7 @@ def test_adam(self): # Check equivalence. for x, y in zip(tree_leaves(jax_params), tree_leaves(optix_params)): - onp.testing.assert_allclose(x, y, rtol=1e-5) + onp.testing.assert_allclose(x, y, rtol=1e-4) def test_rmsprop(self): decay, eps = .9, 0.1 From 67038321f8b33bdab99c1fc3d003719553769c61 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sun, 24 Nov 2019 13:06:10 -0500 Subject: [PATCH 0413/1053] Revert support for building a non-GPU build with --config=cuda enabled. (#1757) It turns out there are implicit CUDA dependencies inside the TF libraries used by JAX, so the attempt to disable GPU dependencies conditionally didn't work. --- build/build.py | 15 ++++----------- build/build_wheel_docker_entrypoint.sh | 3 +-- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/build/build.py b/build/build.py index 96ca6fef3c99..e0f880dd81f1 100755 --- a/build/build.py +++ b/build/build.py @@ -280,13 +280,6 @@ def main(): parser, "enable_cuda", help_str="Should we build with CUDA enabled? Requires CUDA and CuDNN.") - add_boolean_argument( - parser, - "include_gpu_backend_if_cuda_enabled", - default=True, - help_str="If CUDA is enabled, should we build the GPU backend? This is " - "mostly useful to build a CPU-only build with a CUDA-enabled " - "toolchain.") parser.add_argument( "--cuda_path", default=None, @@ -341,12 +334,12 @@ def main(): config_args += ["--config=mkl_open_source_only"] if args.enable_cuda: config_args += ["--config=cuda"] - if args.include_gpu_backend_if_cuda_enabled: - config_args += ["--define=xla_python_enable_gpu=true"] - shell( - [bazel_path] + args.bazel_startup_options + + config_args += ["--define=xla_python_enable_gpu=true"] + command = ([bazel_path] + args.bazel_startup_options + ["run", "--verbose_failures=true"] + config_args + [":install_xla_in_source_tree", os.getcwd()]) + print(" ".join(command)) + shell(command) shell([bazel_path, "shutdown"]) diff --git a/build/build_wheel_docker_entrypoint.sh b/build/build_wheel_docker_entrypoint.sh index d64786274175..c5df29d11571 100755 --- a/build/build_wheel_docker_entrypoint.sh +++ b/build/build_wheel_docker_entrypoint.sh @@ -49,8 +49,7 @@ case $2 in PLAT_NAME="linux_x86_64" ;; nocuda) - python build.py --enable_cuda --include_gpu_backend_if_cuda_enabled=false \ - --bazel_startup_options="--output_user_root=/build/root" + python build.py --bazel_startup_options="--output_user_root=/build/root" PLAT_NAME="manylinux2010_x86_64" ;; *) From 534d812b5777cc2da5bba11130626498f6aa2667 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sun, 24 Nov 2019 13:06:23 -0500 Subject: [PATCH 0414/1053] Add a handwritten ThreeFry2x32 CUDA kernel. (#1756) In principle, JAX should not need a hand-written CUDA kernel for the ThreeFry2x32 algorithm. In practice XLA aggresively inlines, which causes compilation times on GPU blow up when compiling potentially many copies of the PRNG kernel in a program. As a workaround, we add a hand-written CUDA kernel mostly to reduce compilation time. When XLA becomes smarter about compiling this particular hash function, we should be able to remove the hand-written kernel once again. --- WORKSPACE | 6 +- build/BUILD.bazel | 8 +- build/build.py | 3 + build/install_xla_in_source_tree.sh | 2 + jax/interpreters/batching.py | 6 +- jax/lax/__init__.py | 3 +- jax/lib/__init__.py | 4 + jax/random.py | 90 ++++++++++++++----- jaxlib/BUILD | 58 ++++++++++++- jaxlib/cublas.cc | 29 +------ jaxlib/cuda_prng.py | 58 +++++++++++++ jaxlib/cuda_prng_kernels.cc | 36 ++++++++ jaxlib/cuda_prng_kernels.cu.cc | 128 ++++++++++++++++++++++++++++ jaxlib/cuda_prng_kernels.h | 33 +++++++ jaxlib/cusolver.cc | 27 +----- jaxlib/kernel_helpers.h | 55 ++++++++++++ tests/random_test.py | 11 +++ 17 files changed, 470 insertions(+), 87 deletions(-) create mode 100644 jaxlib/cuda_prng.py create mode 100644 jaxlib/cuda_prng_kernels.cc create mode 100644 jaxlib/cuda_prng_kernels.cu.cc create mode 100644 jaxlib/cuda_prng_kernels.h create mode 100644 jaxlib/kernel_helpers.h diff --git a/WORKSPACE b/WORKSPACE index 40d3d289b2e1..71428af8a583 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "d83221d413fd510ac8bc68ae158fcc17c2300c7c8c3bd439e30300438c2e3ce0", - strip_prefix = "tensorflow-d85c68d5bdcb3f72abfe22a73a638c11def69a7e", + sha256 = "412ef0824d5dcfe6e139e1fa25f72569e699b3ec06d374c0e19ba0bf60c32952", + strip_prefix = "tensorflow-883b5becaced22f7dd9e3c23d9d259f55e087cb5", urls = [ - "https://github.com/tensorflow/tensorflow/archive/d85c68d5bdcb3f72abfe22a73a638c11def69a7e.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/883b5becaced22f7dd9e3c23d9d259f55e087cb5.tar.gz", ], ) diff --git a/build/BUILD.bazel b/build/BUILD.bazel index ba43ba2458fa..2120997c9490 100644 --- a/build/BUILD.bazel +++ b/build/BUILD.bazel @@ -14,10 +14,7 @@ # JAX is Autograd and XLA -load( - "@org_tensorflow//tensorflow/core/platform:default/cuda_build_defs.bzl", - "if_cuda_is_configured", -) +load("@local_config_cuda//cuda:build_defs.bzl", "if_cuda") licenses(["notice"]) # Apache 2 @@ -32,9 +29,10 @@ sh_binary( "//jaxlib", "//jaxlib:lapack.so", "//jaxlib:pytree", - ] + if_cuda_is_configured([ + ] + if_cuda([ "//jaxlib:cublas_kernels", "//jaxlib:cusolver_kernels", + "//jaxlib:cuda_prng_kernels", ]), deps = ["@bazel_tools//tools/bash/runfiles"], ) diff --git a/build/build.py b/build/build.py index e0f880dd81f1..414135a6a825 100755 --- a/build/build.py +++ b/build/build.py @@ -177,6 +177,9 @@ def check_bazel_version(bazel_path, min_version, max_version): # Sets the default Apple platform to macOS. build --apple_platform_type=macos +# Make Bazel print out all options from rc files. +build --announce_rc + # Disable enabled-by-default TensorFlow features that we don't care about. build --define=no_aws_support=true build --define=no_gcp_support=true diff --git a/build/install_xla_in_source_tree.sh b/build/install_xla_in_source_tree.sh index 2b4d4532f454..6542f5fbab6e 100755 --- a/build/install_xla_in_source_tree.sh +++ b/build/install_xla_in_source_tree.sh @@ -57,9 +57,11 @@ cp -f "$(rlocation __main__/jaxlib/pytree.so)" "${TARGET}/jaxlib" if [[ -x "$(rlocation __main__/jaxlib/cusolver_kernels.so)" ]]; then cp -f "$(rlocation __main__/jaxlib/cublas_kernels.so)" "${TARGET}/jaxlib" cp -f "$(rlocation __main__/jaxlib/cusolver_kernels.so)" "${TARGET}/jaxlib" + cp -f "$(rlocation __main__/jaxlib/cuda_prng_kernels.so)" "${TARGET}/jaxlib" fi cp -f "$(rlocation __main__/jaxlib/version.py)" "${TARGET}/jaxlib" cp -f "$(rlocation __main__/jaxlib/cusolver.py)" "${TARGET}/jaxlib" +cp -f "$(rlocation __main__/jaxlib/cuda_prng.py)" "${TARGET}/jaxlib" cp -f "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/xla_extension.so)" \ "${TARGET}/jaxlib" cp -f "$(rlocation org_tensorflow/tensorflow/compiler/xla/python/tpu_driver/client/tpu_client_extension.so)" \ diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 9674cba1e7d4..102409aae03c 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -182,13 +182,15 @@ def broadcast_batcher(prim, args, dims, **params): if len(shapes) == 1: # if there's only agreeing batch dims and scalars, just call the primitive d = next(d for d in dims if d is not not_mapped) - return prim.bind(*args, **params), d + out = prim.bind(*args, **params) + return (out, (d,) * len(out)) if prim.multiple_results else (out, d) else: size, = {shape[d] for shape, d in shapes if d is not not_mapped} args = [bdim_at_front(x, d, size) for x, d in zip(args, dims)] ndim = max(onp.ndim(x) for x in args) # special-case scalar broadcasting args = [_handle_scalar_broadcasting(ndim, x, d) for x, d in zip(args, dims)] - return prim.bind(*args, **params), 0 + out = prim.bind(*args, **params) + return (out, (0,) * len(out)) if prim.multiple_results else (out, 0) def _handle_scalar_broadcasting(nd, x, d): if d is not_mapped or nd == onp.ndim(x): diff --git a/jax/lax/__init__.py b/jax/lax/__init__.py index cfbccfebf8c0..c40c3531b233 100644 --- a/jax/lax/__init__.py +++ b/jax/lax/__init__.py @@ -20,7 +20,8 @@ _select_and_gather_add, _float, _complex, _input_dtype, _const, _eq_meet, _safe_mul, _broadcasting_select, _check_user_dtype_supported, - _one, _const, _upcast_fp16_for_computation) + _one, _const, _upcast_fp16_for_computation, + _broadcasting_shape_rule) from .lax_control_flow import * from .lax_fft import * from .lax_parallel import * diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 2baf7eb05982..482cd5a3c4db 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -53,3 +53,7 @@ def _check_jaxlib_version(): from jaxlib import pytree from jaxlib import cusolver +try: + from jaxlib import cuda_prng +except ImportError: + cuda_prng = None diff --git a/jax/random.py b/jax/random.py index 647b8effebaa..92806f1c7308 100644 --- a/jax/random.py +++ b/jax/random.py @@ -25,6 +25,7 @@ from __future__ import print_function from functools import partial +import itertools import numpy as onp @@ -35,9 +36,13 @@ from .api import custom_transforms, defjvp, jit, vmap from .numpy.lax_numpy import _constant_like, asarray, stack from jax.lib import xla_bridge +from jax.lib import cuda_prng from jax import core +from jax import abstract_arrays from jax.scipy.special import logit from jax.scipy.linalg import cholesky +from jax.interpreters import batching +from jax.interpreters import xla def PRNGKey(seed): @@ -92,9 +97,18 @@ def _bit_stats(bits): ### hash function and split +def _threefry2x32_abstract_eval(*args): + if any(a.dtype != np.uint32 for a in args): + raise TypeError("Arguments to threefry2x32 must have uint32 type, got {}" + .format(args)) + if all(isinstance(arg, abstract_arrays.ShapedArray) for arg in args): + shape = lax._broadcasting_shape_rule(*args) + aval = abstract_arrays.ShapedArray(shape, np.dtype(np.uint32)) + else: + aval = abstract_arrays.UnshapedArray(np.dtype(np.uint32)) + return (aval,) * 2 -@jit -def threefry_2x32(keypair, count): +def _threefry2x32_lowering(key1, key2, x1, x2, use_rolled_loops=True): """Apply the Threefry 2x32 hash. Args: @@ -104,13 +118,8 @@ def threefry_2x32(keypair, count): Returns: An array of dtype uint32 with the same shape as `count`. """ - # Based on ThreeFry2x32 by phawkins@ in //.../xla/client/lib/prng.cc - key1, key2 = keypair - if not lax.dtype(key1) == lax.dtype(key2) == lax.dtype(count) == onp.uint32: - msg = "threefry_2x32 requires uint32 arguments, got {}" - raise TypeError(msg.format([lax.dtype(x) for x in [key1, key2, count]])) - - rotate_left = _make_rotate_left(lax.dtype(count)) + x = [x1, x2] + rotate_left = _make_rotate_left(onp.uint32) def apply_round(v, rot): v = v[:] @@ -119,24 +128,11 @@ def apply_round(v, rot): v[1] = v[0] ^ v[1] return v - odd_size = count.size % 2 - if odd_size: - x = list(np.split(np.concatenate([count.ravel(), onp.uint32([0])]), 2)) - else: - x = list(np.split(count.ravel(), 2)) rotations = [onp.array([13, 15, 26, 6], dtype=onp.uint32), onp.array([17, 29, 16, 24], dtype=onp.uint32)] ks = [key1, key2, key1 ^ key2 ^ onp.uint32(0x1BD11BDA)] - # TODO(mattjj): see https://github.com/google/jax/issues/1267, as a hopefully - # temporary workaround for the facts that (1) XLA:CPU compile time is too slow - # with unrolled loops and (2) XLA:GPU execution time is too slow with rolled - # loops, we switch on whether the default backend is CPU or GPU. If this kind - # of switch ends up sticking around, we should take into account #1211 and put - # the switch in the translation rule rather than here in the traceable. - use_rolled_loops = xla_bridge.get_backend().platform == "cpu" - x[0] = x[0] + ks[0] x[1] = x[1] + ks[1] @@ -176,6 +172,56 @@ def step(i, state): x[0] = x[0] + ks[2] x[1] = x[1] + ks[0] + onp.uint32(5) + return tuple(x) + + +def _threefry2x32_gpu_translation_rule(c, k1, k2, x1, x2): + shape = lax.broadcast_shapes( + c.GetShape(k1).dimensions(), c.GetShape(k2).dimensions(), + c.GetShape(x1).dimensions(), c.GetShape(x2).dimensions()) + rank = len(shape) + def _broadcast(x): + ndims = c.GetShape(x).rank() + return c.BroadcastInDim(x, shape, tuple(range(rank - ndims, rank))) + return cuda_prng.threefry2x32( + c, (_broadcast(k1), _broadcast(k2)), (_broadcast(x1), _broadcast(x2))) + +threefry2x32_p = core.Primitive("threefry2x32") +threefry2x32_p.multiple_results = True +threefry2x32_p.def_impl(partial(xla.apply_primitive, threefry2x32_p)) +threefry2x32_p.def_abstract_eval(_threefry2x32_abstract_eval) +batching.defbroadcasting(threefry2x32_p) +xla.translations[threefry2x32_p] = xla.lower_fun( + partial(_threefry2x32_lowering, use_rolled_loops=False), instantiate=True) +xla.backend_specific_translations['cpu'][threefry2x32_p] = xla.lower_fun( + partial(_threefry2x32_lowering, use_rolled_loops=True), instantiate=True) +if cuda_prng: + xla.backend_specific_translations['gpu'][threefry2x32_p] = \ + _threefry2x32_gpu_translation_rule + +@jit +def threefry_2x32(keypair, count): + """Apply the Threefry 2x32 hash. + + Args: + keypair: a pair of 32bit unsigned integers used for the key. + count: an array of dtype uint32 used for the counts. + + Returns: + An array of dtype uint32 with the same shape as `count`. + """ + key1, key2 = keypair + if not lax.dtype(key1) == lax.dtype(key2) == lax.dtype(count) == onp.uint32: + msg = "threefry_2x32 requires uint32 arguments, got {}" + raise TypeError(msg.format([lax.dtype(x) for x in [key1, key2, count]])) + + odd_size = count.size % 2 + if odd_size: + x = list(np.split(np.concatenate([count.ravel(), onp.uint32([0])]), 2)) + else: + x = list(np.split(count.ravel(), 2)) + + x = threefry2x32_p.bind(key1, key2, x[0], x[1]) out = np.concatenate(x) assert out.dtype == onp.uint32 return lax.reshape(out[:-1] if odd_size else out, count.shape) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index 764d635b2eb7..bfab4e22182d 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -16,11 +16,24 @@ load("@org_tensorflow//tensorflow/core/platform:default/build_config.bzl", "pyx_library") load("@org_tensorflow//tensorflow:tensorflow.bzl", "pybind_extension") - +load("@local_config_cuda//cuda:build_defs.bzl", "cuda_library") licenses(["notice"]) package(default_visibility = ["//visibility:public"]) +cc_library( + name = "kernel_helpers", + hdrs = ["kernel_helpers.h"], + copts = [ + "-fexceptions", + "-fno-strict-aliasing", + ], + deps = [ + "@com_google_absl//absl/base", + "@pybind11", + ], +) + pyx_library( name = "lapack", srcs = ["lapack.pyx"], @@ -30,11 +43,21 @@ pyx_library( py_library( name = "jaxlib", srcs = [ + "cuda_prng.py", "cusolver.py", "version.py", ], ) +py_library( + name = "gpu_support", + deps = [ + ":cublas_kernels", + ":cuda_prng_kernels", + ":cusolver_kernels", + ], +) + pybind_extension( name = "pytree", srcs = ["pytree.cc"], @@ -65,6 +88,7 @@ pybind_extension( features = ["-use_header_modules"], module_name = "cublas_kernels", deps = [ + ":kernel_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", "@com_google_absl//absl/container:flat_hash_map", @@ -91,6 +115,7 @@ pybind_extension( features = ["-use_header_modules"], module_name = "cusolver_kernels", deps = [ + ":kernel_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", "@com_google_absl//absl/container:flat_hash_map", @@ -102,6 +127,37 @@ pybind_extension( "@local_config_cuda//cuda:cuda_headers", "@local_config_cuda//cuda:cudart", "@local_config_cuda//cuda:cusolver", + ], +) + +cuda_library( + name = "cuda_prng_kernels_lib", + srcs = ["cuda_prng_kernels.cu.cc"], + hdrs = ["cuda_prng_kernels.h"], + copts = [ + "-fexceptions", + "-fno-strict-aliasing", + ], + deps = [ + ":kernel_helpers", + "@local_config_cuda//cuda:cuda_headers", + ], +) + +pybind_extension( + name = "cuda_prng_kernels", + srcs = ["cuda_prng_kernels.cc"], + copts = [ + "-fexceptions", + "-fno-strict-aliasing", + ], + features = ["-use_header_modules"], + module_name = "cuda_prng_kernels", + deps = [ + ":cuda_prng_kernels_lib", + ":kernel_helpers", + "@local_config_cuda//cuda:cuda_headers", + "@local_config_cuda//cuda:cudart", "@pybind11", ], ) diff --git a/jaxlib/cublas.cc b/jaxlib/cublas.cc index c94dc93baa37..ce6397081c1b 100644 --- a/jaxlib/cublas.cc +++ b/jaxlib/cublas.cc @@ -28,6 +28,7 @@ limitations under the License. #include "include/pybind11/numpy.h" #include "include/pybind11/pybind11.h" #include "include/pybind11/stl.h" +#include "jaxlib/kernel_helpers.h" namespace jax { namespace { @@ -186,27 +187,6 @@ int SizeOfType(Type type) { } } -// Descriptor objects are opaque host-side objects used to pass data from JAX -// to the custom kernel launched by XLA. Currently simply treat host-side -// structures as byte-strings; this is not portable across architectures. If -// portability is needed, we could switch to using a representation such as -// protocol buffers or flatbuffers. - -// Packs a descriptor object into a py::bytes structure. -template -py::bytes PackDescriptor(const T& descriptor) { - return py::bytes(absl::bit_cast(&descriptor), sizeof(T)); -} - -// Unpacks a descriptor object from a byte string. -template -const T* UnpackDescriptor(const char* opaque, size_t opaque_len) { - if (opaque_len != sizeof(T)) { - throw std::runtime_error("Invalid size for linalg operation descriptor."); - } - return absl::bit_cast(opaque); -} - // Builds an array of pointers to each array in a batch, in device memory. template cudaError_t MakeBatchPointers(T* buffer, T** dev_ptrs, int batch, @@ -390,11 +370,6 @@ void GetrfBatched(cudaStream_t stream, void** buffers, const char* opaque, } } -template -py::capsule EncapsulateFunction(T* fn) { - return py::capsule(absl::bit_cast(fn), "xla._CUSTOM_CALL_TARGET"); -} - py::dict Registrations() { py::dict dict; dict["cublas_trsm_batched"] = EncapsulateFunction(TrsmBatched); @@ -409,4 +384,4 @@ PYBIND11_MODULE(cublas_kernels, m) { } } // namespace -} // namespace jax \ No newline at end of file +} // namespace jax diff --git a/jaxlib/cuda_prng.py b/jaxlib/cuda_prng.py new file mode 100644 index 000000000000..795dfdb70d0e --- /dev/null +++ b/jaxlib/cuda_prng.py @@ -0,0 +1,58 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import itertools +import operator + +import numpy as np +from six.moves import reduce + +from jaxlib import xla_client + +try: + from jaxlib import cuda_prng_kernels + for _name, _value in cuda_prng_kernels.registrations().items(): + xla_client.register_custom_call_target(_name, _value, platform="gpu") +except ImportError: + pass + +_prod = lambda xs: reduce(operator.mul, xs, 1) + + +def threefry2x32(c, keys, data): + """ThreeFry2x32 kernel for GPU.""" + assert len(keys) == 2, keys + assert len(data) == 2, data + dims = c.GetShape(keys[0]).dimensions() + dtype = np.dtype(np.uint32) + for x in itertools.chain(keys, data): + x_shape = c.GetShape(x) + assert x_shape.element_type() == dtype + assert dims == x_shape.dimensions(), (dims, x_shape) + ndims = len(dims) + + opaque = cuda_prng_kernels.cuda_threefry2x32_descriptor(_prod(dims)) + layout = tuple(range(ndims - 1, -1, -1)) + shape = xla_client.Shape.array_shape(dtype, dims, layout) + return c.CustomCall( + b"cuda_threefry2x32", + operands=(keys[0], keys[1], data[0], data[1]), + shape_with_layout=xla_client.Shape.tuple_shape([shape, shape]), + operand_shapes_with_layout=(shape,) * 4, + opaque=opaque) + diff --git a/jaxlib/cuda_prng_kernels.cc b/jaxlib/cuda_prng_kernels.cc new file mode 100644 index 000000000000..3f9eb9c97d1f --- /dev/null +++ b/jaxlib/cuda_prng_kernels.cc @@ -0,0 +1,36 @@ +/* Copyright 2019 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "jaxlib/cuda_prng_kernels.h" + +#include "jaxlib/kernel_helpers.h" +#include "include/pybind11/pybind11.h" + +namespace jax { +namespace { + +pybind11::dict Registrations() { + pybind11::dict dict; + dict["cuda_threefry2x32"] = EncapsulateFunction(CudaThreeFry2x32); + return dict; +} + +PYBIND11_MODULE(cuda_prng_kernels, m) { + m.def("registrations", &Registrations); + m.def("cuda_threefry2x32_descriptor", &BuildCudaThreeFry2x32Descriptor); +} + +} // namespace +} // namespace jax diff --git a/jaxlib/cuda_prng_kernels.cu.cc b/jaxlib/cuda_prng_kernels.cu.cc new file mode 100644 index 000000000000..71895042428c --- /dev/null +++ b/jaxlib/cuda_prng_kernels.cu.cc @@ -0,0 +1,128 @@ +/* Copyright 2019 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "jaxlib/cuda_prng_kernels.h" +#include "jaxlib/kernel_helpers.h" + +namespace jax { +namespace { + +__global__ void ThreeFry2x32Kernel(const std::uint32_t* key0, + const std::uint32_t* key1, + const std::uint32_t* data0, + const std::uint32_t* data1, + std::uint32_t* out0, std::uint32_t* out1, + std::int64_t n) { + for (std::int64_t idx = blockIdx.x * blockDim.x + threadIdx.x; idx < n; + idx += blockDim.x * gridDim.x) { + // Rotation distances specified by the Threefry2x32 algorithm. + std::uint32_t rotations[8] = {13, 15, 26, 6, 17, 29, 16, 24}; + std::uint32_t x[2]; + std::uint32_t ks[3]; + + // 0x1BD11BDA is a parity constant specified by the ThreeFry2x32 algorithm. + ks[2] = 0x1BD11BDA; + + ks[0] = key0[idx]; + x[0] = data0[idx]; + ks[2] = ks[2] ^ key0[idx]; + + ks[1] = key1[idx]; + x[1] = data1[idx]; + ks[2] = ks[2] ^ key1[idx]; + + auto rotate_left = [](std::uint32_t v, std::uint32_t distance) { + return (v << distance) | (v >> (32 - distance)); + }; + + // Performs a single round of the Threefry2x32 algorithm, with a rotation + // amount 'rotation'. + auto round = [&](std::uint32_t* v, std::uint32_t rotation) { + v[0] += v[1]; + v[1] = rotate_left(v[1], rotation); + v[1] ^= v[0]; + }; + + // There are no known statistical flaws with 13 rounds of Threefry2x32. + // We are conservative and use 20 rounds. + x[0] = x[0] + ks[0]; + x[1] = x[1] + ks[1]; + for (int i = 0; i < 4; ++i) { + round(x, rotations[i]); + } + + x[0] = x[0] + ks[1]; + x[1] = x[1] + ks[2] + 1u; + for (int i = 4; i < 8; ++i) { + round(x, rotations[i]); + } + + x[0] = x[0] + ks[2]; + x[1] = x[1] + ks[0] + 2u; + for (int i = 0; i < 4; ++i) { + round(x, rotations[i]); + } + + x[0] = x[0] + ks[0]; + x[1] = x[1] + ks[1] + 3u; + for (int i = 4; i < 8; ++i) { + round(x, rotations[i]); + } + + x[0] = x[0] + ks[1]; + x[1] = x[1] + ks[2] + 4u; + for (int i = 0; i < 4; ++i) { + round(x, rotations[i]); + } + + out0[idx] = x[0] + ks[2]; + out1[idx] = x[1] + ks[0] + 5u; + } +} + +} // namespace + +struct ThreeFry2x32Descriptor { + std::int64_t n; +}; + +pybind11::bytes BuildCudaThreeFry2x32Descriptor(std::int64_t n) { + return PackDescriptor(ThreeFry2x32Descriptor{n}); +} + +void CudaThreeFry2x32(cudaStream_t stream, void** buffers, const char* opaque, + std::size_t opaque_len) { + std::array keys; + keys[0] = reinterpret_cast(buffers[0]); + keys[1] = reinterpret_cast(buffers[1]); + std::array data; + data[0] = reinterpret_cast(buffers[2]); + data[1] = reinterpret_cast(buffers[3]); + std::array out; + out[0] = reinterpret_cast(buffers[4]); + out[1] = reinterpret_cast(buffers[5]); + const auto& descriptor = + *UnpackDescriptor(opaque, opaque_len); + const int block_dim = 128; + const std::int64_t grid_dim = + std::min(1024, (descriptor.n + block_dim - 1) / block_dim); + ThreeFry2x32Kernel<<>>(keys[0], keys[1], data[0], data[1], out[0], + out[1], descriptor.n); +} + +} // namespace jax diff --git a/jaxlib/cuda_prng_kernels.h b/jaxlib/cuda_prng_kernels.h new file mode 100644 index 000000000000..406eeed1dbbc --- /dev/null +++ b/jaxlib/cuda_prng_kernels.h @@ -0,0 +1,33 @@ +/* Copyright 2019 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef JAXLIB_PRNG_KERNELS_H_ +#define JAXLIB_PRNG_KERNELS_H_ + +#include + +#include "third_party/gpus/cuda/include/cuda_runtime_api.h" +#include "include/pybind11/pybind11.h" + +namespace jax { + +pybind11::bytes BuildCudaThreeFry2x32Descriptor(std::int64_t n); + +void CudaThreeFry2x32(cudaStream_t stream, void** buffers, const char* opaque, + std::size_t opaque_len); + +} // namespace jax + +#endif // JAXLIB_PRNG_KERNELS_H_ diff --git a/jaxlib/cusolver.cc b/jaxlib/cusolver.cc index 4e9937f1d1d1..59b17150cf54 100644 --- a/jaxlib/cusolver.cc +++ b/jaxlib/cusolver.cc @@ -29,6 +29,7 @@ limitations under the License. #include "include/pybind11/numpy.h" #include "include/pybind11/pybind11.h" #include "include/pybind11/stl.h" +#include "jaxlib/kernel_helpers.h" namespace jax { namespace { @@ -192,27 +193,6 @@ int SizeOfType(Type type) { } } -// Descriptor objects are opaque host-side objects used to pass data from JAX -// to the custom kernel launched by XLA. Currently simply treat host-side -// structures as byte-strings; this is not portable across architectures. If -// portability is needed, we could switch to using a representation such as -// protocol buffers or flatbuffers. - -// Packs a descriptor object into a py::bytes structure. -template -py::bytes PackDescriptor(const T& descriptor) { - return py::bytes(absl::bit_cast(&descriptor), sizeof(T)); -} - -// Unpacks a descriptor object from a byte string. -template -const T* UnpackDescriptor(const char* opaque, size_t opaque_len) { - if (opaque_len != sizeof(T)) { - throw std::runtime_error("Invalid size for linalg operation descriptor."); - } - return absl::bit_cast(opaque); -} - // getrf: LU decomposition struct GetrfDescriptor { @@ -1150,11 +1130,6 @@ void Gesvdj(cudaStream_t stream, void** buffers, const char* opaque, } } -template -py::capsule EncapsulateFunction(T* fn) { - return py::capsule(absl::bit_cast(fn), "xla._CUSTOM_CALL_TARGET"); -} - py::dict Registrations() { py::dict dict; dict["cusolver_getrf"] = EncapsulateFunction(Getrf); diff --git a/jaxlib/kernel_helpers.h b/jaxlib/kernel_helpers.h new file mode 100644 index 000000000000..ce818b4c01db --- /dev/null +++ b/jaxlib/kernel_helpers.h @@ -0,0 +1,55 @@ +/* Copyright 2019 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef JAXLIB_KERNEL_HELPERS_H_ +#define JAXLIB_KERNEL_HELPERS_H_ + +#include +#include + +#include "absl/base/casts.h" +#include "include/pybind11/pybind11.h" + +namespace jax { + +// Descriptor objects are opaque host-side objects used to pass data from JAX +// to the custom kernel launched by XLA. Currently simply treat host-side +// structures as byte-strings; this is not portable across architectures. If +// portability is needed, we could switch to using a representation such as +// protocol buffers or flatbuffers. + +// Packs a descriptor object into a pybind11::bytes structure. +template +pybind11::bytes PackDescriptor(const T& descriptor) { + return pybind11::bytes(absl::bit_cast(&descriptor), sizeof(T)); +} + +// Unpacks a descriptor object from a byte string. +template +const T* UnpackDescriptor(const char* opaque, std::size_t opaque_len) { + if (opaque_len != sizeof(T)) { + throw std::runtime_error("Invalid size for linalg operation descriptor."); + } + return absl::bit_cast(opaque); +} + +template +pybind11::capsule EncapsulateFunction(T* fn) { + return pybind11::capsule(absl::bit_cast(fn), "xla._CUSTOM_CALL_TARGET"); +} + +} // namespace jax + +#endif // JAXLIB_KERNEL_HELPERS_H_ diff --git a/tests/random_test.py b/tests/random_test.py index 95ebe30f803b..f025626e5a32 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -95,6 +95,17 @@ def result_to_hex(result): onp.uint32([0x243f6a88, 0x85a308d3])) self.assertEqual(expected, result_to_hex(result)) + def testThreefry2x32Large(self): + n = 10000000 + result = random.threefry_2x32( + (onp.uint32(0x13198a2e), onp.uint32(0x03707344)), + np.concatenate([ + np.full((n,), 0x243f6a88, np.uint32), + np.full((n,), 0x85a308d3, np.uint32) + ])) + onp.testing.assert_equal(result[:n], onp.full((n,), 0xc4923a9c, dtype=onp.uint32)) + onp.testing.assert_equal(result[n:], onp.full((n,), 0x483df7a0, dtype=onp.uint32)) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format(dtype), "dtype": onp.dtype(dtype).name} for dtype in [onp.float32, onp.float64])) From d1aa01874d2e25fba07c23aaa78cc3d623d17c21 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sun, 24 Nov 2019 13:13:39 -0500 Subject: [PATCH 0415/1053] Fix BUILD file formatting. --- jaxlib/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index bfab4e22182d..fde4320644a9 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -17,6 +17,7 @@ load("@org_tensorflow//tensorflow/core/platform:default/build_config.bzl", "pyx_library") load("@org_tensorflow//tensorflow:tensorflow.bzl", "pybind_extension") load("@local_config_cuda//cuda:build_defs.bzl", "cuda_library") + licenses(["notice"]) package(default_visibility = ["//visibility:public"]) From 3b7d92db79442b64fc24f695b80e95cbcbe825c8 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sun, 24 Nov 2019 14:17:18 -0500 Subject: [PATCH 0416/1053] Add missing pybind11 dependency. --- jaxlib/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index fde4320644a9..a706a34cbfc3 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -128,6 +128,7 @@ pybind_extension( "@local_config_cuda//cuda:cuda_headers", "@local_config_cuda//cuda:cudart", "@local_config_cuda//cuda:cusolver", + "@pybind11", ], ) From 4e89d43a75a9d7a9d803ba8777b867c487e55ed6 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 27 Oct 2019 10:29:33 +0100 Subject: [PATCH 0417/1053] Added JAX pytrees notebook Also added docstrings to the tree_util module. --- docs/index.rst | 1 + docs/jax.experimental.vectorize.rst | 2 +- docs/jax.random.rst | 2 +- docs/jax.tree_util.rst | 2 +- docs/notebooks/JAX_pytrees.ipynb | 323 ++++++++++++++++++++++++++++ jax/tree_util.py | 95 +++++--- 6 files changed, 393 insertions(+), 32 deletions(-) create mode 100644 docs/notebooks/JAX_pytrees.ipynb diff --git a/docs/index.rst b/docs/index.rst index 843ed9b96cdb..3ad3b0527483 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,6 +22,7 @@ For an introduction to JAX, start at the notebooks/Common_Gotchas_in_JAX notebooks/XLA_in_Python + notebooks/JAX_pytrees notebooks/How_JAX_primitives_work notebooks/Writing_custom_interpreters_in_Jax.ipynb Training a Simple Neural Network, with Tensorflow Datasets Data Loading diff --git a/docs/jax.experimental.vectorize.rst b/docs/jax.experimental.vectorize.rst index 14a9a2bb7d7e..58c1a3d68115 100644 --- a/docs/jax.experimental.vectorize.rst +++ b/docs/jax.experimental.vectorize.rst @@ -1,5 +1,5 @@ jax.experimental.vectorize module -============================ +================================= .. automodule:: jax.experimental.vectorize :members: diff --git a/docs/jax.random.rst b/docs/jax.random.rst index a6c27486a9c4..d3d5ed637b83 100644 --- a/docs/jax.random.rst +++ b/docs/jax.random.rst @@ -1,5 +1,5 @@ jax.random package -================ +================== .. automodule:: jax.random :members: diff --git a/docs/jax.tree_util.rst b/docs/jax.tree_util.rst index 481320e577b8..6f6b2787ef15 100644 --- a/docs/jax.tree_util.rst +++ b/docs/jax.tree_util.rst @@ -1,5 +1,5 @@ jax.tree_util package -================ +===================== .. automodule:: jax.tree_util :members: diff --git a/docs/notebooks/JAX_pytrees.ipynb b/docs/notebooks/JAX_pytrees.ipynb new file mode 100644 index 000000000000..12f918468a91 --- /dev/null +++ b/docs/notebooks/JAX_pytrees.ipynb @@ -0,0 +1,323 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "JAX pytrees", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "g_vouXWulcNh", + "colab_type": "text" + }, + "source": [ + "# JAX pytrees\n", + "\n", + "Date: October 2019" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lu00ShwgaPEW", + "colab_type": "text" + }, + "source": [ + "**This is primarily JAX internal documentation, end-users are not supposed to need to understand this to use JAX, except when registering new user-defined container types with JAX. Some of these details may change.**\n", + "\n", + "Python has a lot of container data types (list, tuple, dict, namedtuple, etc.), and users sometimes define their own. To keep the JAX internals simpler while supporting lots of container types, we canonicalize nested containers into flat lists of numeric or array types at the `api.py` boundary (and also in control flow primitives). That way `grad`, `jit`, `vmap` etc., can handle user functions that accept and return these containers, while all the other parts of the system can operate on functions that only take (multiple) array arguments and always return a flat list of arrays. \n", + "\n", + "We refer to a recursive structured value whose leaves are basic types as a `pytree`. When JAX flattens a pytree it will produce a list of leaves and a `treedef` object that encodes the structure of the original value. The `treedef` can then be used to construct a matching structured value after transforming the leaves. Pytrees are tree-like, rather than DAG-like or graph-like, in that we handle them assuming referential transparency and that they can't contain reference cycles. \n", + "\n", + "Here is a simple example:\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "X8DlAmOMmufl", + "colab_type": "code", + "outputId": "2e7821f3-7d0d-48c2-e9d3-6e19cef07255", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + } + }, + "source": [ + "from jax.tree_util import tree_flatten, tree_unflatten, register_pytree_node\n", + "from jax import numpy as np\n", + "\n", + "# The structured value to be transformed\n", + "value_structured = [1., (2., 3.)]\n", + "\n", + "# The leaves in value_flat correspond to the `*` markers in value_tree\n", + "value_flat, value_tree = tree_flatten(value_structured)\n", + "print(\"value_flat={}\\nvalue_tree={}\".format(value_flat, value_tree))\n", + "\n", + "# Transform the flt value list using an element-wise numeric transformer\n", + "transformed_flat = list(map(lambda v: v * 2., value_flat))\n", + "print(\"transformed_flat={}\".format(transformed_flat))\n", + "\n", + "# Reconstruct the structured output, using the original \n", + "transformed_structured = tree_unflatten(value_tree, transformed_flat)\n", + "print(\"transformed_structured={}\", transformed_structured)" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "value_flat=[1.0, 2.0, 3.0]\n", + "value_tree=PyTreeDef(list, [*,PyTreeDef(tuple, [*,*])])\n", + "transformed_flat=[2.0, 4.0, 6.0]\n", + "transformed_structured={} [2.0, (4.0, 6.0)]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sgUJpiXSsRSi", + "colab_type": "text" + }, + "source": [ + "Pytrees containers can be lists, tuples, dicts, namedtuple. Leaves as numeric and ndarrays:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ViXja8YxsXZC", + "colab_type": "code", + "outputId": "75ae4b11-262f-47cc-d962-0a3334043cd0", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 425 + } + }, + "source": [ + "from collections import namedtuple\n", + "Point = namedtuple('Point', ['x', 'y'])\n", + "\n", + "example_containers = [\n", + " (1., [2., 3.]),\n", + " (1., {'b': 2., 'a': 3.}),\n", + " 1.,\n", + " None,\n", + " np.zeros(2),\n", + " Point(1., 2.)\n", + "]\n", + "def show_example(structured):\n", + " flat, tree = tree_flatten(structured)\n", + " unflattened = tree_unflatten(tree, flat)\n", + " print(\"structured={}\\n flat={}\\n tree={}\\n unflattened={}\".format(\n", + " structured, flat, tree, unflattened))\n", + " \n", + "for structured in example_containers:\n", + " show_example(structured)\n", + " " + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "structured=(1.0, [2.0, 3.0])\n", + " flat=[1.0, 2.0, 3.0]\n", + " tree=PyTreeDef(tuple, [*,PyTreeDef(list, [*,*])])\n", + " unflattened=(1.0, [2.0, 3.0])\n", + "structured=(1.0, {'b': 2.0, 'a': 3.0})\n", + " flat=[1.0, 3.0, 2.0]\n", + " tree=PyTreeDef(tuple, [*,PyTreeDef(dict[['a', 'b']], [*,*])])\n", + " unflattened=(1.0, {'a': 3.0, 'b': 2.0})\n", + "structured=1.0\n", + " flat=[1.0]\n", + " tree=*\n", + " unflattened=1.0\n", + "structured=None\n", + " flat=[]\n", + " tree=PyTreeDef(None, [])\n", + " unflattened=None\n", + "structured=[0. 0.]\n", + " flat=[_FilledConstant([0., 0.], dtype=float32)]\n", + " tree=*\n", + " unflattened=[0. 0.]\n", + "structured=Point(x=1.0, y=2.0)\n", + " flat=[1.0, 2.0]\n", + " tree=PyTreeDef(namedtuple[], [*,*])\n", + " unflattened=Point(x=1.0, y=2.0)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f5iYkKRx2ILR", + "colab_type": "text" + }, + "source": [ + "## Pytrees are extensible" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Cb35Y8vBtVKp", + "colab_type": "text" + }, + "source": [ + "By default, any part of a structured value that is not recognized as an internal pytree node is treated as a leaf (and such containers could not be passed to JAX-traceable functions):\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "17JyT_arth7P", + "colab_type": "code", + "outputId": "142485b6-c7fb-4bfd-b9a3-c01e8be7e9e4", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + } + }, + "source": [ + "class Special(object):\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + " \n", + " def __repr__(self):\n", + " return \"Special(x={}, y={})\".format(self.x, self.y)\n", + " \n", + "\n", + "show_example(Special(1., 2.))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "structured=Special(x=1.0, y=2.0)\n", + " flat=[Special(x=1.0, y=2.0)]\n", + " tree=*\n", + " unflattened=Special(x=1.0, y=2.0)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3y9NECzRthKi", + "colab_type": "text" + }, + "source": [ + "The set of Python types that are considered internal pytree nodes is extensible, through a global registry of types. Values of registered types\n", + "are traversed recursively:\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3Emk3EN5uPMr", + "colab_type": "code", + "outputId": "4b5b3ff6-6b80-424c-a6c0-8da97b943a7b", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + } + }, + "source": [ + "class RegisteredSpecial(Special):\n", + " def __repr__(self):\n", + " return \"RegisteredSpecial(x={}, y={})\".format(self.x, self.y)\n", + "\n", + "def special_flatten(v):\n", + " \"\"\"Specifies a flattening recipe.\n", + " \n", + " Params:\n", + " v: the value of registered type to flatten.\n", + " Returns: \n", + " a pair of an iterable with the children to be flattened recursively,\n", + " and some opaque auxiliary data to pass back to the unflattening recipe.\n", + " The auxiliary data is stored in the treedef for use during unflattening.\n", + " The auxiliary data could be used, e.g., for dictionay keys.\n", + " \"\"\"\n", + " children = (v.x, v.y)\n", + " aux_data = None\n", + " return (children, aux_data)\n", + "\n", + "def special_unflatten(aux_data, children):\n", + " \"\"\"Specifies an unflattening recipe.\n", + " \n", + " Params:\n", + " aux_data: the opaque data that was specified during flattening of the \n", + " current treedef.\n", + " children: the unflattened children\n", + " \n", + " Returns:\n", + " a re-constructed object of the registered type, using the specified \n", + " children and auxiliary data.\n", + " \"\"\"\n", + " return RegisteredSpecial(*children)\n", + "\n", + "# Global registration\n", + "register_pytree_node(\n", + " RegisteredSpecial,\n", + " special_flatten, # tell JAX what are the children nodes\n", + " special_unflatten # tell JAX how to pack back into a RegisteredSpecial\n", + ")\n", + "\n", + "show_example(RegisteredSpecial(1., 2.))" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "structured=RegisteredSpecial(x=1.0, y=2.0)\n", + " flat=[1.0, 2.0]\n", + " tree=PyTreeDef([None], [*,*])\n", + " unflattened=RegisteredSpecial(x=1.0, y=2.0)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TIBrH5KaxImR", + "colab_type": "text" + }, + "source": [ + "JAX needs sometimes to compare treedef for equality. Therefore care must be taken to ensure that the auxiliary data specified in the flattening recipe supports a meaningful equality comparison. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Qoi69-I64_qe", + "colab_type": "text" + }, + "source": [ + "The whole set of functions for operating on pytrees are in the [tree_util module](https://jax.readthedocs.io/en/latest/jax.tree_util.html).\n" + ] + } + ] +} \ No newline at end of file diff --git a/jax/tree_util.py b/jax/tree_util.py index e97753df0ad6..5e28c28ebb53 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -30,6 +30,9 @@ The primary purpose of this module is to enable the interoperability between user defined data structures and JAX transformations (e.g. `jit`). This is not meant to be a general purpose tree-like data structure handling library. + +See the `JAX pytrees notebook `_ +for examples. """ from __future__ import absolute_import @@ -44,9 +47,70 @@ from .util import partial, safe_zip, unzip2 +def tree_flatten(tree): + """Flattens a pytree. + + Args: + tree: a pytree to flatten. + Returns: + a pair with a list of leaves and the corresponding treedef. + """ + return pytree.flatten(tree) + +def tree_unflatten(treedef, leaves): + """Reconstructs a pytree from the treedef and the leaves. + + The inverse of `tree_flatten`. + + Args: + treedef: the treedef to reconstruct + leaves: the list of leaves to use for reconstruction. The list must + match the leaves of the treedef. + Returns: + The reconstructed pytree, containing the `leaves` places in the + structure described by `treedef`. + """ + return treedef.unflatten(leaves) + +def tree_leaves(tree): + """Gets the leaves of a pytree.""" + return pytree.flatten(tree)[0] + +def tree_structure(tree): + """Gets the treedef for a pytree.""" + return pytree.flatten(tree)[1] + +def treedef_tuple(treedefs): + """Makes a tuple treedef from a list of child treedefs.""" + return pytree.tuple(list(treedefs)) + +def treedef_children(treedef): + return treedef.children() + +def treedef_is_leaf(treedef): + return treedef.num_nodes == 1 + +def register_pytree_node(nodetype, flatten_func, unflatten_func): + """Extends the set of types that are considered internal nodes in pytrees. + + See `example usage `_. + + Args: + nodetype: a Python type to treat as an internal pytree node. + flatten_func: a function to be used during flattening, taking a value + of type `nodetype` and returning a pair, with (1) an iterable for + the children to be flattened recursively, and (2) some auxiliary data + to be stored in the treedef and to be passed to the `unflatten_func`. + unflatten_func: a function taking two arguments: the auxiliary data that + was returned by `flatten_func` and stored in the treedef, and the + unflattened children. The function should return an instance of + `nodetype`. + """ + pytree.register_node(nodetype, flatten_func, unflatten_func) + _registry[nodetype] = _RegistryEntry(flatten_func, unflatten_func) def tree_map(f, tree): - """Map a function over a pytree to produce a new pytree. + """Maps a function over a pytree to produce a new pytree. Args: f: function to be applied at each leaf. @@ -61,7 +125,7 @@ def tree_map(f, tree): return treedef.unflatten(map(f, leaves)) def tree_multimap(f, tree, *rest): - """Map a multi-input function over pytree args to produce a new pytree. + """Maps a multi-input function over pytree args to produce a new pytree. Args: f: function that takes `1 + len(rest)` arguments, to be applied at the @@ -80,25 +144,14 @@ def tree_multimap(f, tree, *rest): all_leaves = [leaves] + [treedef.flatten_up_to(r) for r in rest] return treedef.unflatten(f(*xs) for xs in zip(*all_leaves)) -def tree_leaves(tree): - return pytree.flatten(tree)[0] - # TODO(mattjj,phawkins): consider removing this function def _process_pytree(process_node, tree): leaves, treedef = pytree.flatten(tree) return treedef.walk(process_node, None, leaves), treedef -tree_flatten = pytree.flatten - def build_tree(treedef, xs): return treedef.from_iterable_tree(xs) -def treedef_is_leaf(treedef): - return treedef.num_nodes == 1 - -def tree_unflatten(treedef, xs): - return treedef.unflatten(xs) - def tree_transpose(outer_treedef, inner_treedef, pytree_to_transpose): flat, treedef = tree_flatten(pytree_to_transpose) expected_treedef = outer_treedef.compose(inner_treedef) @@ -113,20 +166,6 @@ def tree_transpose(outer_treedef, inner_treedef, pytree_to_transpose): subtrees = map(partial(tree_unflatten, outer_treedef), transposed_lol) return tree_unflatten(inner_treedef, subtrees) -def tree_structure(tree): - _, treedef = pytree.flatten(tree) - return treedef - -def treedef_tuple(trees): - return pytree.tuple(list(trees)) - -def treedef_children(treedef): - return treedef.children() - -def register_pytree_node(type_, to_iterable, from_iterable): - pytree.register_node(type_, to_iterable, from_iterable) - _registry[type_] = _RegistryEntry(to_iterable, from_iterable) - # TODO(mattjj): remove the Python-side registry when the C++-side registry is # sufficiently queryable that we can express _replace_nones. That may mean once # we have a flatten_one function. @@ -155,11 +194,9 @@ def _replace_nones(sentinel, tree): else: return tree - def tree_reduce(f, tree): return reduce(f, tree_leaves(tree)) - def tree_all(tree): return all(tree_leaves(tree)) From b12a8019c8711afaef9b4d1a9f437bf944575cee Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 29 Oct 2019 08:56:39 +0100 Subject: [PATCH 0418/1053] Update docs/notebooks/JAX_pytrees.ipynb Co-Authored-By: Stephan Hoyer --- docs/notebooks/JAX_pytrees.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/JAX_pytrees.ipynb b/docs/notebooks/JAX_pytrees.ipynb index 12f918468a91..3414098ee353 100644 --- a/docs/notebooks/JAX_pytrees.ipynb +++ b/docs/notebooks/JAX_pytrees.ipynb @@ -92,7 +92,7 @@ "colab_type": "text" }, "source": [ - "Pytrees containers can be lists, tuples, dicts, namedtuple. Leaves as numeric and ndarrays:" + "Pytrees containers can be lists, tuples, dicts, namedtuple. Numeric and ndarray values are treated as leaves:" ] }, { @@ -320,4 +320,4 @@ ] } ] -} \ No newline at end of file +} From 8777864c96d91d205cdf96236f4ad86818f957c6 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 30 Oct 2019 04:52:46 +0100 Subject: [PATCH 0419/1053] Minor edits --- docs/notebooks/JAX_pytrees.ipynb | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/docs/notebooks/JAX_pytrees.ipynb b/docs/notebooks/JAX_pytrees.ipynb index 3414098ee353..f53cc3baf47a 100644 --- a/docs/notebooks/JAX_pytrees.ipynb +++ b/docs/notebooks/JAX_pytrees.ipynb @@ -3,7 +3,7 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "JAX pytrees", + "name": "JAX_pytrees.ipynb", "provenance": [], "collapsed_sections": [] }, @@ -46,7 +46,7 @@ "metadata": { "id": "X8DlAmOMmufl", "colab_type": "code", - "outputId": "2e7821f3-7d0d-48c2-e9d3-6e19cef07255", + "outputId": "f5069593-b36e-4f2d-b8f0-7642e7034bbd", "colab": { "base_uri": "https://localhost:8080/", "height": 85 @@ -69,7 +69,7 @@ "\n", "# Reconstruct the structured output, using the original \n", "transformed_structured = tree_unflatten(value_tree, transformed_flat)\n", - "print(\"transformed_structured={}\", transformed_structured)" + "print(\"transformed_structured={}\".format(transformed_structured))" ], "execution_count": 1, "outputs": [ @@ -79,7 +79,7 @@ "value_flat=[1.0, 2.0, 3.0]\n", "value_tree=PyTreeDef(list, [*,PyTreeDef(tuple, [*,*])])\n", "transformed_flat=[2.0, 4.0, 6.0]\n", - "transformed_structured={} [2.0, (4.0, 6.0)]\n" + "transformed_structured=[2.0, (4.0, 6.0)]\n" ], "name": "stdout" } @@ -92,7 +92,7 @@ "colab_type": "text" }, "source": [ - "Pytrees containers can be lists, tuples, dicts, namedtuple. Numeric and ndarray values are treated as leaves:" + "Pytrees containers can be lists, tuples, dicts, namedtuple, None, OrderedDict. Other types of values, including numeric and ndarray values, are treated as leaves:" ] }, { @@ -100,10 +100,10 @@ "metadata": { "id": "ViXja8YxsXZC", "colab_type": "code", - "outputId": "75ae4b11-262f-47cc-d962-0a3334043cd0", + "outputId": "ff8120b2-f1fc-4647-9e0d-c35ee87bdd2e", "colab": { "base_uri": "https://localhost:8080/", - "height": 425 + "height": 459 } }, "source": [ @@ -128,7 +128,7 @@ " show_example(structured)\n", " " ], - "execution_count": 0, + "execution_count": 2, "outputs": [ { "output_type": "stream", @@ -148,7 +148,13 @@ "structured=None\n", " flat=[]\n", " tree=PyTreeDef(None, [])\n", - " unflattened=None\n", + " unflattened=None\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ "structured=[0. 0.]\n", " flat=[_FilledConstant([0., 0.], dtype=float32)]\n", " tree=*\n", @@ -320,4 +326,4 @@ ] } ] -} +} \ No newline at end of file From 132102498bd81867a7a07e578444d4639f70ba1a Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 25 Nov 2019 09:08:00 +0100 Subject: [PATCH 0420/1053] Minor edit --- jax/tree_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/tree_util.py b/jax/tree_util.py index 5e28c28ebb53..6578a5109666 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -67,7 +67,7 @@ def tree_unflatten(treedef, leaves): leaves: the list of leaves to use for reconstruction. The list must match the leaves of the treedef. Returns: - The reconstructed pytree, containing the `leaves` places in the + The reconstructed pytree, containing the `leaves` placed in the structure described by `treedef`. """ return treedef.unflatten(leaves) From ace14bbb942bb1dd532fb07d3524e141b85808fc Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Mon, 25 Nov 2019 14:00:48 +0000 Subject: [PATCH 0421/1053] Remove `join_pvals` This function is appears to be unused. --- jax/interpreters/partial_eval.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index cbface4180e8..45cb51070fde 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -294,28 +294,6 @@ def merge_pvals(val, pval): else: raise TypeError(pv) -def join_pvals(pval1, pval2): - pv1, const1 = pval1 - pv2, const2 = pval2 - if pv1 is None and pv2 is None: - aval1, aval2 = core.get_aval(const1), core.get_aval(const2) - if aval1 == aval2: - return pval1 # both pvals known, equal constants - else: - aval = core.lattice_join(aval1, aval2) - return PartialVal((aval, unit)) # both pvals known, different constants - elif pv1 is None and isinstance(pv2, AbstractValue): - aval = pv2 - return PartialVal((aval, unit)) # first pval known, second not known - elif isinstance(pv1, AbstractValue) and pv2 is None: - aval = pv1 - return PartialVal((aval, unit)) # first pval not known, second known - elif isinstance(pv1, AbstractValue) and isinstance(pv2, AbstractValue): - aval = core.lattice_join(pv1, pv2) - return PartialVal((aval, unit)) # neither is known - else: - raise TypeError((pval1, pval2)) - def partial_val_aval(pv, const): if isinstance(pv, AbstractValue): return pv From 34dfbc8ae6c697118b6a18faf02547aaab5946dc Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 25 Nov 2019 11:48:45 -0500 Subject: [PATCH 0422/1053] Add error checking to PRNG CUDA kernel. (#1760) Refactor error checking code into a common helper library. --- jaxlib/BUILD | 18 ++++++++++++++++++ jaxlib/cublas.cc | 7 +------ jaxlib/cuda_prng_kernels.cu.cc | 2 ++ jaxlib/cusolver.cc | 7 +------ jaxlib/gpu_kernel_helpers.cc | 32 ++++++++++++++++++++++++++++++++ jaxlib/gpu_kernel_helpers.h | 27 +++++++++++++++++++++++++++ 6 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 jaxlib/gpu_kernel_helpers.cc create mode 100644 jaxlib/gpu_kernel_helpers.h diff --git a/jaxlib/BUILD b/jaxlib/BUILD index a706a34cbfc3..972c786ce97e 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -35,6 +35,21 @@ cc_library( ], ) +cc_library( + name = "gpu_kernel_helpers", + srcs = ["gpu_kernel_helpers.cc"], + hdrs = ["gpu_kernel_helpers.h"], + copts = [ + "-fexceptions", + ], + features = ["-use_header_modules"], + deps = [ + "@com_google_absl//absl/base", + "@com_google_absl//absl/strings", + "@local_config_cuda//cuda:cuda_headers", + ], +) + pyx_library( name = "lapack", srcs = ["lapack.pyx"], @@ -89,6 +104,7 @@ pybind_extension( features = ["-use_header_modules"], module_name = "cublas_kernels", deps = [ + ":gpu_kernel_helpers", ":kernel_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", @@ -116,6 +132,7 @@ pybind_extension( features = ["-use_header_modules"], module_name = "cusolver_kernels", deps = [ + ":gpu_kernel_helpers", ":kernel_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", @@ -141,6 +158,7 @@ cuda_library( "-fno-strict-aliasing", ], deps = [ + ":gpu_kernel_helpers", ":kernel_helpers", "@local_config_cuda//cuda:cuda_headers", ], diff --git a/jaxlib/cublas.cc b/jaxlib/cublas.cc index ce6397081c1b..f96f0498741a 100644 --- a/jaxlib/cublas.cc +++ b/jaxlib/cublas.cc @@ -28,6 +28,7 @@ limitations under the License. #include "include/pybind11/numpy.h" #include "include/pybind11/pybind11.h" #include "include/pybind11/stl.h" +#include "jaxlib/gpu_kernel_helpers.h" #include "jaxlib/kernel_helpers.h" namespace jax { @@ -35,12 +36,6 @@ namespace { namespace py = pybind11; -void ThrowIfError(cudaError_t error) { - if (error != cudaSuccess) { - throw std::runtime_error("CUDA operation failed"); - } -} - void ThrowIfErrorStatus(cublasStatus_t status) { switch (status) { case CUBLAS_STATUS_SUCCESS: diff --git a/jaxlib/cuda_prng_kernels.cu.cc b/jaxlib/cuda_prng_kernels.cu.cc index 71895042428c..f318c584e4f3 100644 --- a/jaxlib/cuda_prng_kernels.cu.cc +++ b/jaxlib/cuda_prng_kernels.cu.cc @@ -16,6 +16,7 @@ limitations under the License. #include #include "jaxlib/cuda_prng_kernels.h" +#include "jaxlib/gpu_kernel_helpers.h" #include "jaxlib/kernel_helpers.h" namespace jax { @@ -123,6 +124,7 @@ void CudaThreeFry2x32(cudaStream_t stream, void** buffers, const char* opaque, ThreeFry2x32Kernel<<>>(keys[0], keys[1], data[0], data[1], out[0], out[1], descriptor.n); + ThrowIfError(cudaGetLastError()); } } // namespace jax diff --git a/jaxlib/cusolver.cc b/jaxlib/cusolver.cc index 59b17150cf54..161cadcbc574 100644 --- a/jaxlib/cusolver.cc +++ b/jaxlib/cusolver.cc @@ -29,6 +29,7 @@ limitations under the License. #include "include/pybind11/numpy.h" #include "include/pybind11/pybind11.h" #include "include/pybind11/stl.h" +#include "jaxlib/gpu_kernel_helpers.h" #include "jaxlib/kernel_helpers.h" namespace jax { @@ -36,12 +37,6 @@ namespace { namespace py = pybind11; -void ThrowIfError(cudaError_t error) { - if (error != cudaSuccess) { - throw std::runtime_error("CUDA operation failed"); - } -} - void ThrowIfErrorStatus(cusolverStatus_t status) { switch (status) { case CUSOLVER_STATUS_SUCCESS: diff --git a/jaxlib/gpu_kernel_helpers.cc b/jaxlib/gpu_kernel_helpers.cc new file mode 100644 index 000000000000..a8b521eaabbd --- /dev/null +++ b/jaxlib/gpu_kernel_helpers.cc @@ -0,0 +1,32 @@ +/* Copyright 2019 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "jaxlib/gpu_kernel_helpers.h" + +#include + +#include "absl/strings/str_cat.h" + +namespace jax { + +void ThrowIfError(cudaError_t error) { + if (error != cudaSuccess) { + throw std::runtime_error( + absl::StrCat("CUDA operation failed: ", cudaGetErrorString(error))); + } +} + +} // namespace jax + diff --git a/jaxlib/gpu_kernel_helpers.h b/jaxlib/gpu_kernel_helpers.h new file mode 100644 index 000000000000..fc4d8b72ab3d --- /dev/null +++ b/jaxlib/gpu_kernel_helpers.h @@ -0,0 +1,27 @@ +/* Copyright 2019 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef JAXLIB_GPU_KERNEL_HELPERS_H_ +#define JAXLIB_GPU_KERNEL_HELPERS_H_ + +#include "third_party/gpus/cuda/include/cuda_runtime_api.h" + +namespace jax { + +void ThrowIfError(cudaError_t error); + +} // namespace jax + +#endif // JAXLIB_GPU_KERNEL_HELPERS_H_ From 36c882ba469fc009dba1a29df640c72eec12b36b Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 25 Nov 2019 14:03:59 -0800 Subject: [PATCH 0423/1053] raise an error on jit-of-multi-host-pmap (#1761) Co-authored-by: Skye Wanderman-Milne --- jax/interpreters/xla.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 07c8948a50a6..ba47893f308b 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -352,6 +352,20 @@ def eqn_replicas(eqn): else: return 1 +def jaxpr_has_pmap(jaxpr): + return any(eqn_has_pmap(eqn) for eqn in jaxpr.eqns) + +def eqn_has_pmap(eqn): + if eqn.bound_subjaxprs: + (subjaxpr, _, _), = eqn.bound_subjaxprs + return jaxpr_has_pmap(subjaxpr) + elif eqn.primitive in initial_style_translations: + return any(jaxpr_has_pmap(param if type(param) is core.Jaxpr else param.jaxpr) + for param in eqn.params.values() + if type(param) in (core.Jaxpr, core.TypedJaxpr)) + else: + return 'pmap' in eqn.primitive.name + ### xla_call underlying jit @@ -384,6 +398,11 @@ def _xla_callable(fun, device, backend, *abstract_args): raise ValueError(msg.format(num_replicas, xb.device_count(backend))) axis_env = AxisEnv(nreps, [], []) + if xb.host_count() > 1 and (nreps > 1 or jaxpr_has_pmap(jaxpr)): + raise NotImplementedError( + "jit of multi-host pmap not implemented (and jit-of-pmap can cause " + "extra data movement anyway, so maybe you don't want it after all).") + tuple_args = len(abstract_args) > 100 # pass long arg lists as tuple for TPU c = xb.make_computation_builder("jit_{}".format(fun.__name__)) @@ -392,12 +411,14 @@ def _xla_callable(fun, device, backend, *abstract_args): out_nodes = jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, (), *xla_args) built = c.Build(c.Tuple(*out_nodes)) + if device is not None and nreps > 1: + raise ValueError("can't specify device assignment for jit-of-pmap") options = xb.get_compile_options( num_replicas=nreps, device_assignment=(device.id,) if device else None) compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) result_handlers = tuple(map(_pval_to_result_handler, pvals)) - if axis_env.nreps == 1: + if nreps == 1: return partial(_execute_compiled, compiled, backend, result_handlers, tuple_args) else: return partial(_execute_replicated, compiled, backend, result_handlers, tuple_args) From f415f266b890e7b1476879c108f6e846d7f93177 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 25 Nov 2019 16:23:40 -0800 Subject: [PATCH 0424/1053] Remove 'backend' argument from device_put. (#1762) The appropriate Backend is instead inferred from the 'device' argument. This is a first step towards removing the 'backend' argument from more functions. --- jax/api.py | 4 ++-- jax/interpreters/pxla.py | 13 ++++++------- jax/interpreters/xla.py | 34 ++++++++++++++++------------------ jax/lib/xla_bridge.py | 6 ++++++ tests/api_test.py | 17 +++++++++++++++++ 5 files changed, 47 insertions(+), 27 deletions(-) diff --git a/jax/api.py b/jax/api.py index b32ece17b8a9..212df9677267 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1333,8 +1333,8 @@ def jaxpr_maker(*args, **kwargs): return jaxpr_maker -def device_put(x, device=None, backend=None): - return tree_map(lambda y: xla.device_put_p.bind(y, device=device, backend=backend), x) +def device_put(x, device=None): + return tree_map(lambda y: xla.device_put_p.bind(y, device=device), x) # TODO(mattjj): consider revising diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index a614a3699dd6..4a142a3512ff 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -95,7 +95,7 @@ def shard_args(backend, devices, assignments, axis_size, tuple_args, args): else: buffers[r][a] = buf.copy_to_device(devices[r]) else: - bufs = shard_arg_handlers[type(arg)](arg, devices, assignments, backend=backend) + bufs = shard_arg_handlers[type(arg)](arg, devices, assignments) for r, buf in enumerate(bufs): buffers[r][a] = buf @@ -108,18 +108,17 @@ def shard_args(backend, devices, assignments, axis_size, tuple_args, args): shard_arg_handlers = {} shard_arg_handlers[core.Unit] = \ - lambda x, devices, _, backend=None: [ - xla.device_put(core.unit, d, backend=backend) for d in devices] -def _shard_array(x, devices, assignments, backend=None): + lambda x, devices, _: [xla.device_put(core.unit, d) for d in devices] +def _shard_array(x, devices, assignments): nrep = len(devices) - return (xla.device_put(x[assignments[r]], devices[r], backend=backend) for r in range(nrep)) + return (xla.device_put(x[assignments[r]], devices[r]) for r in range(nrep)) for _t in array_types: shard_arg_handlers[_t] = _shard_array -def _shard_device_array(x, devices, assignments, backend=None): +def _shard_device_array(x, devices, assignments): nrep = len(devices) xs = x._unstack() - return (xla.device_put(xs[assignments[r]], devices[r], backend=backend) + return (xla.device_put(xs[assignments[r]], devices[r]) for r in range(nrep)) shard_arg_handlers[xla.DeviceArray] = _shard_device_array diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index ba47893f308b..cc17789a7191 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -79,25 +79,25 @@ def array_result_handler(aval): return partial(DeviceArray, raise_to_shaped(aval xla_result_handlers[ShapedArray] = array_result_handler xla_result_handlers[ConcreteArray] = array_result_handler -def device_put(x, device=None, backend=None): +def device_put(x, device=None): x = canonicalize_dtype(x) try: - return device_put_handlers[type(x)](x, device, backend=backend) + return device_put_handlers[type(x)](x, device) except KeyError: raise TypeError("No device_put handler for type: {}".format(type(x))) device_put_handlers = {} device_put_handlers[core.Unit] = \ - lambda _, device, backend=None: xc.Buffer.from_pyval( - (), device, backend=xb.get_backend(backend)) -def _device_put_array(x, device, backend=None): - return xc.Buffer.from_pyval(x, device, backend=xb.get_backend(backend)) + lambda _, device: xc.Buffer.from_pyval( + (), device, backend=xb.get_device_backend(device)) +def _device_put_array(x, device): + return xc.Buffer.from_pyval(x, device, backend=xb.get_device_backend(device)) for _t in array_types: device_put_handlers[_t] = _device_put_array -def _device_put_scalar(x, device, backend=None): +def _device_put_scalar(x, device): return xc.Buffer.from_pyval(dtypes.coerce_to_array(x), device, - backend=xb.get_backend(backend)) + backend=xb.get_device_backend(device)) for _t in dtypes.python_scalar_dtypes.keys(): device_put_handlers[_t] = _device_put_array @@ -186,8 +186,7 @@ def primitive_computation(prim, *avals, **params): def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): device, = compiled.local_devices() - input_bufs = [device_put(x, device, backend=backend) for x in args - if x is not token] + input_bufs = [device_put(x, device) for x in args if x is not token] out_buf = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) @@ -446,8 +445,7 @@ def _pval_to_result_handler(pval): def _execute_compiled(compiled, backend, handlers, tuple_args, *args): device, = compiled.local_devices() - input_bufs = [device_put(x, device, backend=backend) for x in args - if x is not token] + input_bufs = [device_put(x, device) for x in args if x is not token] if tuple_args: input_bufs = [make_tuple(input_bufs, device, backend)] out_bufs = compiled.Execute(input_bufs).destructure() @@ -456,7 +454,7 @@ def _execute_compiled(compiled, backend, handlers, tuple_args, *args): def _execute_replicated(compiled, backend, handlers, tuple_args, *args): input_bufs = [ - [device_put(x, device, backend=backend) for x in args if x is not token] + [device_put(x, device) for x in args if x is not token] for device in compiled.local_devices()] if tuple_args: input_bufs = [[make_tuple(bufs, device, backend)] for bufs, device in @@ -731,29 +729,29 @@ def _device_array_constant_handler(c, val, canonicalize_types=True): return c.Constant(onp.asarray(val), canonicalize_types=canonicalize_types) xb.register_constant_handler(DeviceArray, _device_array_constant_handler) -def _device_put_device_array(x, device, backend): +def _device_put_device_array(x, device): # TODO(skye): we're assuming the DeviceBuffers without "platform" are # XrtBuffers. Figure out a less risky way to deal with XrtBuffers. if (not hasattr(x.device_buffer, "platform") or - xb.get_backend(backend).platform == x.device_buffer.platform()): + xb.get_device_backend(device).platform == x.device_buffer.platform()): if device is None or x.device_buffer.device() == device: return x.device_buffer else: return x.device_buffer.copy_to_device(device) else: # Buffers from different XLA backends are passed through the host. - return xc.Buffer.from_pyval(x, device, backend=xb.get_backend(backend)) + return xc.Buffer.from_pyval(x, device, backend=xb.get_device_backend(device)) device_put_handlers[DeviceArray] = _device_put_device_array -def _device_put_impl(x, device=None, backend=None): +def _device_put_impl(x, device=None): try: a = abstractify(x) except TypeError: raise TypeError("Argument '{}' of type {} is not a valid JAX type" .format(x, type(x))) handler = aval_to_result_handler(a) - return handler(device_put(x, device, backend=backend)) + return handler(device_put(x, device)) device_put_p = core.Primitive('device_put') device_put_p.def_impl(_device_put_impl) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index b8e7df12935f..3420a3b3df58 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -145,6 +145,12 @@ def get_backend(platform=None): return backend(platform) +def get_device_backend(device=None): + """Returns the Backend associated with `device`, or the default Backend.""" + platform = device.platform if device else None + return get_backend(platform) + + def device_count(backend=None): """Returns the total number of devices. diff --git a/tests/api_test.py b/tests/api_test.py index 62e8cdbbf9c8..9abcd624fb99 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -306,6 +306,23 @@ def test_device_put_across_devices(self): api.device_put(x) api.device_put(y) + @jtu.skip_on_devices("cpu") + def test_device_put_across_platforms(self): + default_device = jax.devices()[0] + cpu_device = jax.devices("cpu")[0] + + onp_arr = onp.array([1,2,3]) + scalar = 1 + device_arr = np.array([1,2,3]) + assert device_arr.device_buffer.device() is default_device + + for val in [onp_arr, device_arr, scalar]: + x = api.device_put(val, device=cpu_device) + self.assertEqual(x.device_buffer.device(), cpu_device) + + y = api.device_put(x) + self.assertEqual(y.device_buffer.device(), default_device) + @jtu.skip_on_devices("tpu") def test_jacobian(self): R = onp.random.RandomState(0).randn From 227a91220b51ed883e28023e1f7eea5662af28f5 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 26 Nov 2019 08:16:53 +0100 Subject: [PATCH 0425/1053] Update minimum jaxlib to 0.1.36. This is needed in part to pull in new Device.platform from Tensorflow. See #1764. --- jax/lib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 482cd5a3c4db..f02c7e3690b1 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 31) +_minimum_jaxlib_version = (0, 1, 36) try: from jaxlib import version as jaxlib_version except: From 5c15dda2c973598ef4130e5cd3979c74dda32cf2 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 26 Nov 2019 08:18:53 +0100 Subject: [PATCH 0426/1053] Changed api.make_jaxpr to return a TypedJaxpr * A TypedJaxpr contains more useful information (consts, types) * Also forced the instantiation of constants when producing the jaxpr. Before: >>>print(api.make_jaxpr(lambda x: 1.)(0.)) lambda ; ; a. let in [*]} After this change: >>>print(api.make_jaxpr(lambda x: 1.)(0.)) lambda ; ; a. let in [1.0]} --- jax/api.py | 33 ++++++++++++------------ jax/test_util.py | 8 ++++++ tests/api_test.py | 44 ++++++++++++++++++++++++++++++-- tests/batching_test.py | 2 +- tests/core_test.py | 2 -- tests/lax_control_flow_test.py | 2 +- tests/lax_numpy_indexing_test.py | 2 +- tests/lax_numpy_test.py | 2 +- 8 files changed, 70 insertions(+), 25 deletions(-) diff --git a/jax/api.py b/jax/api.py index 212df9677267..23ce13d6ffe6 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1279,7 +1279,7 @@ def make_jaxpr(fun): Returns: A wrapped version of `fun` that when applied to example arguments returns a - jaxpr representation of `fun` on those arguments. + TypedJaxpr representation of `fun` on those arguments. A `jaxpr` is JAX's intermediate representation for program traces. The `jaxpr` language is based on the simply-typed first-order lambda calculus with @@ -1299,20 +1299,16 @@ def make_jaxpr(fun): { lambda ; ; a. let b = cos a c = sin b - in c } + in [c] } >>> jax.make_jaxpr(jax.grad(f))(3.0) - { lambda b ; ; a. - let c = pack a - (d) = id c - e = cos d - f = cos e - g = mul b f - h = neg g - i = sin d - j = mul h i - k = pack j - (l) = id k - in l } + { lambda ; ; a. + let b = cos a + c = cos b + d = mul 1.0 c + e = neg d + f = sin a + g = mul e f + in [g] } """ _check_callable(fun) @@ -1325,9 +1321,12 @@ def jaxpr_maker(*args, **kwargs): wrapped = lu.wrap_init(fun) jax_args, in_tree = tree_flatten((args, kwargs)) jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) - pvals = map(pv_like, jax_args) - jaxpr, _, _ = pe.trace_to_jaxpr(jaxtree_fun, pvals) - return jaxpr + in_pvals = map(pv_like, jax_args) + jaxpr, out_pvals, consts = pe.trace_to_jaxpr(jaxtree_fun, in_pvals, instantiate=True) + out_avals = map(raise_to_shaped, unzip2(out_pvals)[0]) + in_avals = tuple(raise_to_shaped(in_aval) for in_aval, _ in in_pvals) + typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) + return typed_jaxpr jaxpr_maker.__name__ = "make_jaxpr({})".format(jaxpr_maker.__name__) return jaxpr_maker diff --git a/jax/test_util.py b/jax/test_util.py index 84a8746f4149..0b63a34bf808 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -620,6 +620,14 @@ def assertAllClose(self, x, y, check_dtypes, atol=None, rtol=None): else: raise TypeError((type(x), type(y))) + def assertEqualIgnoreWhitespace(self, expected, what): + """Asserts two strings are equal ignoring whitespace.""" + ignore_space_re = re.compile(r"[\n\s]+") + expected_clean = re.sub(ignore_space_re, " ", expected).strip() + what_clean = re.sub(ignore_space_re, " ", what).strip() + if expected_clean != what_clean: + self.assertEqual(expected, what, "Checking " + what) # For error msg + def _CompileAndCheck(self, fun, args_maker, check_dtypes, rtol=None, atol=None): """Helper method for running JAX compilation and allclose assertions.""" diff --git a/tests/api_test.py b/tests/api_test.py index 9abcd624fb99..664538ab9376 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -939,7 +939,7 @@ def f(a, b, c): c = onp.ones((2, 3, 3)) jaxpr = api.make_jaxpr(lambda b, c: f(a, b, c))(b, c) - subjaxpr = next(eqn.bound_subjaxprs[0][0] for eqn in jaxpr.eqns + subjaxpr = next(eqn.bound_subjaxprs[0][0] for eqn in jaxpr.jaxpr.eqns if eqn.bound_subjaxprs) self.assertEqual(len(subjaxpr.eqns), 1) @@ -1283,8 +1283,48 @@ def f(x, y): return x + y "positional arguments.", lambda: partial(df, x=0.)(y=1.)) + +class JaxprTest(jtu.JaxTestCase): + def test_scalar_literals(self): - self.assertLen(api.make_jaxpr(lambda x: x + 2)(42).constvars, 0) + jaxpr = api.make_jaxpr(lambda x: x + 2)(42) + self.assertLen(jaxpr.jaxpr.constvars, 0) + + def test_const(self): + def fun(x): + return (x, 1., np.zeros(1)) + + jaxpr = api.make_jaxpr(fun)(0.) + self.assertEqualIgnoreWhitespace(str(jaxpr), """ + { lambda b ; ; a. + let + in [a, 1.0, b] } + """) + + def test_cond(self): + def f(x): + return lax.cond(x >= 0., + x + 1., + lambda xt: xt + x, + x + 2., + lambda xf: xf - x) + jaxpr = api.make_jaxpr(f)(3.) + self.assertEqualIgnoreWhitespace(str(jaxpr), """ + { lambda ; ; a. + let b = ge a 0.0 + c = add a 1.0 + d = add a 2.0 + e = cond[ true_jaxpr={ lambda ; ; b a. + let c = add a b + in [c] } + false_jaxpr={ lambda ; ; b a. + let c = sub a b + in [c] } + true_nconsts=1 + false_nconsts=1 ] b a c a d + in [e] } + """) + if __name__ == '__main__': absltest.main() diff --git a/tests/batching_test.py b/tests/batching_test.py index 4f3bdac734f2..c442b6490a88 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -62,7 +62,7 @@ def testNestedBatchingMatMat(self): rtol={onp.float32:1e-2} if jtu.device_under_test() == "tpu" else None) jaxpr = make_jaxpr(matmat)(A, B) - self.assertEqual(len(jaxpr.eqns), 1) + self.assertEqual(len(jaxpr.jaxpr.eqns), 1) def testPerExampleGradients(self): def predict(params, inputs): diff --git a/tests/core_test.py b/tests/core_test.py index cc092519b2d0..3d9de2dbeac5 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -19,7 +19,6 @@ from collections import namedtuple import gc import operator -from unittest import skip import numpy as onp from absl.testing import absltest @@ -276,6 +275,5 @@ def f(x): finally: gc.set_debug(debug) - if __name__ == '__main__': absltest.main() diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 9d9338b0f986..480fb8dbd151 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -348,7 +348,7 @@ def fun(x): def testForiLoopBatchedIssue1190(self): f = lambda x: lax.fori_loop(0, 4, lambda _, x: x + 1, x) jaxpr = api.make_jaxpr(api.vmap(f))(np.arange(3)) - eqn = jaxpr.eqns[0] + eqn = jaxpr.jaxpr.eqns[0] self.assertIs(eqn.primitive, lax.while_p) self.assertEqual(eqn.params['cond_jaxpr'].in_avals[0].shape, ()) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 0b37495701ed..e0579abcf84a 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -741,7 +741,7 @@ def testJVPOfGradOfIndexing(self): def testTrivialGatherIsntGenerated(self): # https://github.com/google/jax/issues/1621 jaxpr = api.make_jaxpr(lambda x: x[:, None])(onp.arange(4)) - self.assertEqual(len(jaxpr.eqns), 1) + self.assertEqual(len(jaxpr.jaxpr.eqns), 1) self.assertNotIn('gather', str(jaxpr)) def testBooleanIndexingWithEmptyResult(self): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index e25e5e0540ac..f810e39291e5 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2396,7 +2396,7 @@ def testBroadcastToIntIssue1548(self): def testPrecision(self): def iter_eqns(jaxpr): - for eqn in jaxpr.eqns: + for eqn in jaxpr.jaxpr.eqns: yield eqn for subjaxpr, _, _ in eqn.bound_subjaxprs: for sub_eqn in iter_eqns(subjaxpr): From 603258ebb825d61978fe47da34bc69af94ad3040 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 26 Nov 2019 13:56:58 +0100 Subject: [PATCH 0427/1053] Fixed a couple of tests --- jax/test_util.py | 13 ++++++------- tests/api_test.py | 6 +++--- tests/lax_numpy_test.py | 4 ++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/jax/test_util.py b/jax/test_util.py index 0b63a34bf808..f91292348653 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -620,13 +620,12 @@ def assertAllClose(self, x, y, check_dtypes, atol=None, rtol=None): else: raise TypeError((type(x), type(y))) - def assertEqualIgnoreWhitespace(self, expected, what): - """Asserts two strings are equal ignoring whitespace.""" - ignore_space_re = re.compile(r"[\n\s]+") - expected_clean = re.sub(ignore_space_re, " ", expected).strip() - what_clean = re.sub(ignore_space_re, " ", what).strip() - if expected_clean != what_clean: - self.assertEqual(expected, what, "Checking " + what) # For error msg + def assertMultiLineStrippedEqual(self, expected, what): + """Asserts two strings are equal, after stripping each line.""" + ignore_space_re = re.compile(r'\s*\n\s*') + expected_clean = re.sub(ignore_space_re, '\n', expected.strip()) + what_clean = re.sub(ignore_space_re, '\n', what.strip()) + self.assertMultiLineEqual(expected_clean, what_clean) def _CompileAndCheck(self, fun, args_maker, check_dtypes, rtol=None, atol=None): diff --git a/tests/api_test.py b/tests/api_test.py index 664538ab9376..d210bda6c86d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1295,8 +1295,8 @@ def fun(x): return (x, 1., np.zeros(1)) jaxpr = api.make_jaxpr(fun)(0.) - self.assertEqualIgnoreWhitespace(str(jaxpr), """ - { lambda b ; ; a. + self.assertMultiLineStrippedEqual(str(jaxpr), """ + { lambda b ; ; a. let in [a, 1.0, b] } """) @@ -1309,7 +1309,7 @@ def f(x): x + 2., lambda xf: xf - x) jaxpr = api.make_jaxpr(f)(3.) - self.assertEqualIgnoreWhitespace(str(jaxpr), """ + self.assertMultiLineStrippedEqual(str(jaxpr), """ { lambda ; ; a. let b = ge a 0.0 c = add a 1.0 diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index f810e39291e5..6ddaabecfd88 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2396,7 +2396,7 @@ def testBroadcastToIntIssue1548(self): def testPrecision(self): def iter_eqns(jaxpr): - for eqn in jaxpr.jaxpr.eqns: + for eqn in jaxpr.eqns: yield eqn for subjaxpr, _, _ in eqn.bound_subjaxprs: for sub_eqn in iter_eqns(subjaxpr): @@ -2404,7 +2404,7 @@ def iter_eqns(jaxpr): def assert_precision(expected, fun, *args): jaxpr = jax.make_jaxpr(fun)(*args) - precision, = [eqn.params['precision'] for eqn in iter_eqns(jaxpr) + precision, = [eqn.params['precision'] for eqn in iter_eqns(jaxpr.jaxpr) if eqn.primitive == lax.dot_general_p] self.assertEqual(precision, expected) From 2bb74b627e0382f27f2f11e197d93e58f859f3fe Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 26 Nov 2019 14:05:08 +0100 Subject: [PATCH 0428/1053] Ensure jaxpr.eqn.params are printed sorted, so we get deterministic output --- jax/core.py | 2 +- jax/pprint_util.py | 2 +- jax/test_util.py | 3 ++- tests/api_test.py | 24 ++++++++++++------------ 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/jax/core.py b/jax/core.py index 42c7f2e3f5c2..2a5d601ca492 100644 --- a/jax/core.py +++ b/jax/core.py @@ -652,7 +652,7 @@ def pp_eqn(eqn): >> pp(' [ {} ; {} ]'.format(pp_vars(const_vars), pp_vars(bound_vars)))) return (pp('{} = '.format(lhs)) >> - pp(eqn.primitive.name) >> pp_kv_pairs(eqn.params.items()) + pp(eqn.primitive.name) >> pp_kv_pairs(eqn.params) >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr def pp_jaxpr(jaxpr): diff --git a/jax/pprint_util.py b/jax/pprint_util.py index 62e2afb539e1..1c664bfdd25f 100644 --- a/jax/pprint_util.py +++ b/jax/pprint_util.py @@ -64,7 +64,7 @@ def vcat(ps): def pp_kv_pairs(kv_pairs): if kv_pairs: - kv_pairs = vcat([pp('{}='.format(k)) >> pp(v) for k, v in kv_pairs]) + kv_pairs = vcat([pp('{}='.format(k)) >> pp(kv_pairs[k]) for k in sorted(kv_pairs)]) return pp('[ ') >> kv_pairs >> pp(' ]') else: return pp('') diff --git a/jax/test_util.py b/jax/test_util.py index f91292348653..36dbd19810b7 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -625,7 +625,8 @@ def assertMultiLineStrippedEqual(self, expected, what): ignore_space_re = re.compile(r'\s*\n\s*') expected_clean = re.sub(ignore_space_re, '\n', expected.strip()) what_clean = re.sub(ignore_space_re, '\n', what.strip()) - self.assertMultiLineEqual(expected_clean, what_clean) + self.assertMultiLineEqual(expected_clean, what_clean, + msg="Expecting\n"+expected) def _CompileAndCheck(self, fun, args_maker, check_dtypes, rtol=None, atol=None): diff --git a/tests/api_test.py b/tests/api_test.py index d210bda6c86d..dabc0be2a941 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1311,18 +1311,18 @@ def f(x): jaxpr = api.make_jaxpr(f)(3.) self.assertMultiLineStrippedEqual(str(jaxpr), """ { lambda ; ; a. - let b = ge a 0.0 - c = add a 1.0 - d = add a 2.0 - e = cond[ true_jaxpr={ lambda ; ; b a. - let c = add a b - in [c] } - false_jaxpr={ lambda ; ; b a. - let c = sub a b - in [c] } - true_nconsts=1 - false_nconsts=1 ] b a c a d - in [e] } + let b = ge a 0.0 + c = add a 1.0 + d = add a 2.0 + e = cond[ false_jaxpr={ lambda ; ; b a. + let c = sub a b + in [c] } + false_nconsts=1 + true_jaxpr={ lambda ; ; b a. + let c = add a b + in [c] } + true_nconsts=1 ] b a c a d + in [e] } """) From 7a9f1f3f1c90b112fc1830da68a89b514716acce Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 26 Nov 2019 10:24:06 -0500 Subject: [PATCH 0429/1053] Pin the minimum jaxlib version in travis.yml. (#1767) --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2deacdba12d3..d23acaa237bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,7 +30,10 @@ before_install: - conda update -q conda install: - conda install --yes python=$TRAVIS_PYTHON_VERSION pip six protobuf>=3.6.0 absl-py opt_einsum numpy scipy pytest-xdist fastcache - - pip install jaxlib + # The jaxlib version should match the minimum jaxlib version in + # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted + # jaxlib. + - pip install jaxlib==0.1.36 - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - if [[ "$JAX_ONLY_DOCUMENTATION" != "" ]]; then From 2867e4be082237e2b184d7b533dfcbfa31b24f63 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 26 Nov 2019 07:56:48 -0800 Subject: [PATCH 0430/1053] fix grad of jit caching bug Co-authored-by: Dougal Maclaurin --- jax/interpreters/ad.py | 9 +++++---- jax/interpreters/xla.py | 7 +++++-- jax/linear_util.py | 5 +++++ tests/api_test.py | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 3b2f42424c2a..88f92b3f95a6 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -26,7 +26,8 @@ from ..abstract_arrays import raise_to_shaped from ..util import unzip2, unzip3, safe_map, safe_zip, partial, split_list from ..tree_util import build_tree, register_pytree_node, tree_map -from ..linear_util import thunk, transformation, transformation_with_aux, wrap_init +from ..linear_util import (thunk, transformation, transformation_with_aux, + wrap_init, hashable_partial) from ..api_util import flatten_fun, flatten_fun_nokwargs from ..tree_util import tree_flatten, tree_unflatten @@ -451,18 +452,18 @@ def traceable(num_primals, in_tree_def, *primals_and_tangents): out_flat, tree_def = tree_flatten((primal_out, tangent_out)) yield out_flat, tree_def + def call_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) - fun = wrap_init(partial(backward_pass, jaxpr)) + fun = hashable_partial(wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) out_flat = primitive.bind(fun, *all_args, **params) return tree_unflatten(out_tree(), out_flat) - primitive_transposes[core.call_p] = partial(call_transpose, call_p) def map_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) - fun = wrap_init(partial(backward_pass, jaxpr)) + fun = hashable_partial(wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) out_flat = primitive.bind(fun, *all_args, **params) freevar_cts, arg_cts = tree_unflatten(out_tree(), out_flat) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index cc17789a7191..0a67b5b806bb 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -22,6 +22,7 @@ import operator as op import os +from absl import logging import numpy as onp import six from six.moves import xrange @@ -381,8 +382,10 @@ def _xla_call_impl(fun, *args, **params): @lu.cache def _xla_callable(fun, device, backend, *abstract_args): - if FLAGS.jax_log_compiles: - print("Compiling {} for args {}.".format(fun.__name__, abstract_args)) + log_priority = logging.WARNING if FLAGS.jax_log_compiles else logging.DEBUG + logging.log(log_priority, + "Compiling {} for args {}.".format(fun.__name__, abstract_args)) + pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] with core.new_master(pe.JaxprTrace, True) as master: jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) diff --git a/jax/linear_util.py b/jax/linear_util.py index b71305497033..8cf970ff14ba 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -210,3 +210,8 @@ def memoized_fun(fun, *args): cache[key] = (ans, fun.stores) return ans return memoized_fun + +@transformation +def hashable_partial(x, *args): + ans = yield (x,) + args, {} + yield ans diff --git a/tests/api_test.py b/tests/api_test.py index 9abcd624fb99..4cd5d116296a 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -22,6 +22,7 @@ import warnings import weakref +from absl import logging from absl.testing import absltest import numpy as onp import six @@ -1286,5 +1287,22 @@ def f(x, y): return x + y def test_scalar_literals(self): self.assertLen(api.make_jaxpr(lambda x: x + 2)(42).constvars, 0) + def test_grad_of_jit_compilation_caching(self): + if not hasattr(self, "assertLogs"): + raise unittest.SkipTest("test requires assertLogs (python 3)") + + lax.add(1, 2) # make sure some initial warnings are already printed + + sin = api.jit(np.sin) + + with self.assertLogs(level=logging.DEBUG) as l: + ans1 = api.grad(sin)(2.) + ans2 = api.grad(sin)(3.) + self.assertLen(l.output, 2) + + self.assertAllClose(ans1, onp.cos(2.), check_dtypes=False) + self.assertAllClose(ans2, onp.cos(3.), check_dtypes=False) + + if __name__ == '__main__': absltest.main() From fbc9446afa13b85a68484e8240aec07cfcb0fb8f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 26 Nov 2019 14:09:35 -0500 Subject: [PATCH 0431/1053] Fix some missing docstrings for Numpy functions. (#1768) --- jax/numpy/lax_numpy.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index a50ac7141280..e68720dbd1ff 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -256,6 +256,8 @@ def update_numpydoc(docstr, fun, op): #Some numpy functions have an extra tab at the beginning of each line, #If this function is one of those we remove this extra tab from all the lines + if not hasattr(op, '__code__'): + return docstr if docstr[:4] == ' ': lines = docstr.split('\n') for idx, line in enumerate(lines): @@ -289,6 +291,8 @@ def _wraps(fun, update_doc=True, lax_description=""): If False, include the numpy docstring verbatim. """ def wrap(op): + if not hasattr(fun, '__doc__') or fun.__doc__ is None: + return op try: # Numpy doc comments have the form: # fn(x, y, z) (optional) From 3ae4a41320d6a116656626bfd0d87cde6c928335 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 26 Nov 2019 12:44:09 -0800 Subject: [PATCH 0432/1053] Add "loops" BUILD target. (#1771) --- jax/BUILD | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jax/BUILD b/jax/BUILD index 242484c76381..f99717dfcff6 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -77,3 +77,9 @@ py_library( srcs = ["experimental/vectorize.py"], deps = [":jax"], ) + +py_library( + name = "loops", + srcs = ["experimental/loops.py"], + deps = [":jax"], +) From b7579492690b1d94da89b7f1d1b6ddcfadbaacae Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 26 Nov 2019 17:06:57 -0800 Subject: [PATCH 0433/1053] fix pulldown bugs --- jaxlib/BUILD | 2 ++ tests/api_test.py | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index 972c786ce97e..4db2b9fb4b5d 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -29,6 +29,7 @@ cc_library( "-fexceptions", "-fno-strict-aliasing", ], + features = ["-use_header_modules"], deps = [ "@com_google_absl//absl/base", "@pybind11", @@ -161,6 +162,7 @@ cuda_library( ":gpu_kernel_helpers", ":kernel_helpers", "@local_config_cuda//cuda:cuda_headers", + "@pybind11", ], ) diff --git a/tests/api_test.py b/tests/api_test.py index 4cd5d116296a..fa342f5847df 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1295,9 +1295,14 @@ def test_grad_of_jit_compilation_caching(self): sin = api.jit(np.sin) - with self.assertLogs(level=logging.DEBUG) as l: - ans1 = api.grad(sin)(2.) - ans2 = api.grad(sin)(3.) + prev_level = logging.get_verbosity() + try: + logging.set_verbosity('DEBUG') + with self.assertLogs(level=logging.DEBUG) as l: + ans1 = api.grad(sin)(2.) + ans2 = api.grad(sin)(3.) + finally: + logging.set_verbosity(prev_level) self.assertLen(l.output, 2) self.assertAllClose(ans1, onp.cos(2.), check_dtypes=False) From 8df1ccf42b6025e6e966df8a4ce034c27bdbff7e Mon Sep 17 00:00:00 2001 From: Peter Buchlovsky Date: Wed, 27 Nov 2019 03:17:08 +0000 Subject: [PATCH 0434/1053] Make jax.numpy.broadcast_to consistent with numpy. (#1773) * Make jax.numpy.broadcast_to consistent with numpy. jax.numpy.broadcast(10.0, ()) should return array(10.0) and not 10.0. * Improve broadcast_to test. --- jax/numpy/lax_numpy.py | 2 +- tests/lax_numpy_test.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e68720dbd1ff..6e6358e84b85 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -997,7 +997,7 @@ def broadcast_arrays(*args): def broadcast_to(arr, shape): """Like Numpy's broadcast_to but doesn't necessarily return views.""" - arr = arr if isinstance(arr, ndarray) or isscalar(arr) else array(arr) + arr = arr if isinstance(arr, ndarray) else array(arr) shape = tuple(map(int, shape)) # check that shape is concrete arr_shape = _shape(arr) if arr_shape == shape: diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index e25e5e0540ac..c639f5b4f952 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2393,6 +2393,10 @@ def testBroadcastToIntIssue1548(self): self.assertAllClose(lnp.broadcast_to(1, (3, 2)), onp.ones((3, 2)), check_dtypes=False) + def testBroadcastToOnScalar(self): + self.assertIsInstance(lnp.broadcast_to(10.0, ()), lnp.ndarray) + self.assertIsInstance(onp.broadcast_to(10.0, ()), onp.ndarray) + def testPrecision(self): def iter_eqns(jaxpr): From 5c96d83ea6247a8d27cd1f1a591d3f41fb8c0b64 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 26 Nov 2019 22:24:22 -0500 Subject: [PATCH 0435/1053] Simplify einsum implementation. (#1774) XLA's DotGeneral operator has been generalized so we no longer need the _dot_general wrapper. Avoids the need for unnecessary reshapes. --- jax/numpy/lax_numpy.py | 49 +++--------------------------------------- 1 file changed, 3 insertions(+), 46 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 6e6358e84b85..6c9cafdddada 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2306,8 +2306,9 @@ def sum_repeats(operand, names, counts, keep_names): # contract using lax.dot_general lhs_cont, rhs_cont = unzip2((lhs_names.index(n), rhs_names.index(n)) for n in contracted_names) - operand = _dot_general(lhs, rhs, lhs_cont, rhs_cont, len(batch_dims), - precision) + bdims = tuple(range(len(batch_dims))) + dimension_numbers = [(lhs_cont, rhs_cont), (bdims, bdims)] + operand = lax.dot_general(lhs, rhs, dimension_numbers, precision) deleted_names = batch_names + ''.join(contracted_names) names = (batch_names + removechars(lhs_names, deleted_names) + removechars(rhs_names, deleted_names)) @@ -2335,50 +2336,6 @@ def sum_repeats(operand, names, counts, keep_names): return operands[0] -def _dot_general(lhs, rhs, lhs_cont, rhs_cont, nbatch, precision): - """Helper for einsum contractions.""" - # lax.dot_general has some tight constraints on dimension_numbers that this - # wrapper loosens via transposes and reshapes - assert len(lhs_cont) == len(rhs_cont) > 0 - ncont = len(lhs_cont) - lhs_ntensor = lhs.ndim - nbatch - ncont - rhs_ntensor = rhs.ndim - nbatch - ncont - batch_dims = tuple(range(nbatch)) - - if ncont == 1 and 0 <= lhs_ntensor <= 1 and 0 <= rhs_ntensor <= 1: - dimension_numbers = [(lhs_cont, rhs_cont), (batch_dims, batch_dims)] - return lax.dot_general(lhs, rhs, dimension_numbers, precision) - else: - # move contracting dimensions to the end. lax.dot_general only allows one - # contracting dimension, so if there's more than one we collapse them. - if ncont > 1: - lhs_cdims = tuple(range(lhs.ndim - ncont, lhs.ndim)) - lhs = moveaxis(lhs, lhs_cont, lhs_cdims) - lhs = lhs.reshape(lhs.shape[:-ncont] + (-1,)) - - rhs_cdims = tuple(range(rhs.ndim - ncont, rhs.ndim)) - rhs = moveaxis(rhs, rhs_cont, rhs_cdims) - rhs = rhs.reshape(rhs.shape[:-ncont] + (-1,)) - else: - lhs = moveaxis(lhs, lhs_cont[0], -1) - rhs = moveaxis(rhs, rhs_cont[0], -1) - - # lax.dot_general only allows zero or one tensor product dims per operand, - # so if there's more than one we collapse them. - result_shape = lhs.shape[:nbatch] + lhs.shape[nbatch:-1] + rhs.shape[nbatch:-1] - - if lhs_ntensor > 1: - lhs = lhs.reshape(lhs.shape[:nbatch] + (-1,) + lhs.shape[-1:]) - - if rhs_ntensor > 1: - rhs = rhs.reshape(rhs.shape[:nbatch] + (-1,) + rhs.shape[-1:]) - - lhs_cont, rhs_cont = [lhs.ndim - 1], [rhs.ndim - 1] - dimension_numbers = [(lhs_cont, rhs_cont), (batch_dims, batch_dims)] - result = lax.dot_general(lhs, rhs, dimension_numbers, precision) - return lax.reshape(result, result_shape) - - def _movechars(s, src, dst): """Helper for einsum string munging, like moveaxis on identifier strings.""" chars = [c for i, c in enumerate(s) if i not in src] From da6a474a63bea7d7d27f3ee112cff75be6693a74 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 26 Nov 2019 22:47:03 -0500 Subject: [PATCH 0436/1053] Simplify jax.numpy.tensordot by using lax.dot_general. (#1775) --- jax/numpy/lax_numpy.py | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 6c9cafdddada..e09396b9018d 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2161,38 +2161,35 @@ def vdot(a, b, precision=None): @_wraps(onp.tensordot, lax_description=_PRECISION_DOC) def tensordot(a, b, axes=2, precision=None): _check_arraylike("tensordot", a, b) - if not (ndim(a) >= 1 and ndim(b) >= 1): + a_ndim = ndim(a) + b_ndim = ndim(b) + if a_ndim < 1 or b_ndim < 1: msg = "tensordot requires a.ndim and b.dim to be at least 1, got {} and {}." raise TypeError(msg.format(ndim(a), ndim(b))) + a, b = _promote_dtypes(a, b) if type(axes) is int: - if axes == 0: - a, b = _promote_dtypes(a, b) - return lax.mul(lax.reshape(a, shape(a) + (1,) * ndim(b)), - lax.reshape(b, (1,) * ndim(a) + shape(b))) - else: - a, b = _promote_dtypes(a, b) - a_reshape = lax.reshape(a, (_prod(a.shape[:-axes]), _prod(a.shape[-axes:]))) - b_reshape = lax.reshape(b, (_prod(b.shape[:axes]), _prod(b.shape[axes:]))) - out_reshape = lax.dot(a_reshape, b_reshape, precision=precision) - return lax.reshape(out_reshape, a.shape[:-axes] + b.shape[axes:]) + if axes > _min(a_ndim, b_ndim): + msg = "Number of tensordot axes (axes {}) exceeds input ranks ({} and {})" + raise msg.format(axes, a.shape, b.shape) + contracting_dims = tuple(range(a_ndim - axes, a_ndim)), tuple(range(axes)) elif type(axes) in (list, tuple) and len(axes) == 2: ax1, ax2 = axes if type(ax1) == type(ax2) == int: - a_transposed = moveaxis(a, ax1, -1) if ax1 != a.ndim - 1 else a - b_transposed = moveaxis(b, ax2, 0) if ax2 != 0 else b - return tensordot(a_transposed, b_transposed, 1, precision) + contracting_dims = ((_canonicalize_axis(ax1, a_ndim),), + (_canonicalize_axis(ax2, b_ndim),)) elif type(ax1) in (list, tuple) and type(ax2) in (list, tuple): if len(ax1) != len(ax2): msg = "tensordot requires axes lists to have equal length, got {} and {}." raise TypeError(msg.format(ax1, ax2)) - num_axes = len(ax1) - a_transposed = moveaxis(a, ax1, tuple(range(a.ndim - num_axes, a.ndim))) - b_transposed = moveaxis(b, ax2, tuple(range(num_axes))) - return tensordot(a_transposed, b_transposed, num_axes, precision) - msg = ("tensordot axes argument must be an int, a pair of ints, or a pair of " - "lists/tuples of ints.") - raise TypeError(msg) + contracting_dims = (tuple(_canonicalize_axis(i, a_ndim) for i in ax1), + tuple(_canonicalize_axis(i, b_ndim) for i in ax2)) + else: + msg = ("tensordot axes argument must be an int, a pair of ints, or a pair " + "of lists/tuples of ints.") + raise TypeError(msg) + return lax.dot_general(a, b, (contracting_dims, ((), ())), + precision=precision) @_wraps(onp.einsum, lax_description=_PRECISION_DOC) From ec79adccbb22730124210ef801d7e6ecfbf88316 Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Tue, 26 Nov 2019 21:54:36 +0000 Subject: [PATCH 0437/1053] source sync PiperOrigin-RevId: 282633556 --- jax/experimental/optix.py | 25 +++++++++++++------------ tests/optix_test.py | 18 +++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 2b98a0afb693..344a29f0110a 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -56,6 +56,7 @@ ### Composable gradient transformations. ### +InitUpdate = collections.namedtuple("InitUpdate", ("init", "update")) ClipState = collections.namedtuple("ClipState", "") @@ -77,7 +78,7 @@ def update_fn(updates, state): lambda g: jnp.clip_by_value(g, -max_delta, max_delta), updates) return updates, state - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) ClipByGlobalNormState = collections.namedtuple("ClipByGlobalNormState", "") @@ -111,7 +112,7 @@ def update_fn(updates, state): lambda t: jnp.where(trigger, t, t * (max_norm / g_norm)), updates) return updates, state - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) TraceState = collections.namedtuple("TraceState", "trace") @@ -138,7 +139,7 @@ def update_fn(updates, state): tree_multimap(f, updates, update_trace) if nesterov else update_trace) return updates, TraceState(trace=update_trace) - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) ScaleByRmsState = collections.namedtuple("ScaleByRmsState", "nu") @@ -172,7 +173,7 @@ def update_fn(updates, state): updates = tree_multimap(lambda g, n: g / (jnp.sqrt(n + eps)), updates, nu) return updates, ScaleByRmsState(nu=nu) - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) ScaleByRStdDevState = collections.namedtuple("ScaleByRStdDevState", "mu nu") @@ -204,7 +205,7 @@ def update_fn(updates, state): lambda g, m, n: g / jnp.sqrt(n - m**2 + eps), updates, mu, nu) return updates, ScaleByRStdDevState(mu=mu, nu=nu) - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) ScaleByAdamState = collections.namedtuple("ScaleByAdamState", "count mu nu") @@ -239,7 +240,7 @@ def update_fn(updates, state): lambda m, v: m / (jnp.sqrt(v) + eps), mu_hat, nu_hat) return updates, ScaleByAdamState(count=state.count + 1, mu=mu, nu=nu) - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) ScaleState = collections.namedtuple("ScaleState", "") @@ -262,7 +263,7 @@ def update_fn(updates, state): updates = tree_multimap(lambda g: step_size * g, updates) return updates, state - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) ScaleByScheduleState = collections.namedtuple("ScaleByScheduleState", "count") @@ -286,7 +287,7 @@ def update_fn(updates, state): updates = tree_multimap(lambda g: step_size_fn(state.count) * g, updates) return updates, ScaleByScheduleState(count=state.count + 1) - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) AddNoiseState = collections.namedtuple("AddNoiseState", "count rng_key") @@ -322,7 +323,7 @@ def update_fn(updates, state): # pylint: disable=missing-docstring lambda g, n: g + variance * n, updates, noise) return updates, AddNoiseState(count=state.count + 1, rng_key=all_keys[0]) - return init_fn, update_fn + return InitUpdate(init_fn, update_fn) ### Utilities for building and using custom optimizers. ### @@ -345,17 +346,17 @@ def chain(*args): init_fns, update_fns = zip(*args) - def init(params): + def init_fn(params): return [fn(params) for fn in init_fns] - def update(updates, state): + def update_fn(updates, state): new_state = [] for s, fn in zip(state, update_fns): updates, new_s = fn(updates, s) new_state.append(new_s) return updates, new_state - return init, update + return InitUpdate(init_fn, update_fn) def apply_updates(params, updates): diff --git a/tests/optix_test.py b/tests/optix_test.py index c0126c56dff1..f5dbf4caf07b 100644 --- a/tests/optix_test.py +++ b/tests/optix_test.py @@ -53,10 +53,10 @@ def test_sgd(self): # experimental/optix.py optix_params = self.init_params - opt_init, opt_update = optix.sgd(LR, 0.0) - state = opt_init(optix_params) + sgd = optix.sgd(LR, 0.0) + state = sgd.init(optix_params) for _ in range(STEPS): - updates, state = opt_update(self.per_step_updates, state) + updates, state = sgd.update(self.per_step_updates, state) optix_params = optix.apply_updates(optix_params, updates) # Check equivalence. @@ -76,10 +76,10 @@ def test_adam(self): # experimental/optix.py optix_params = self.init_params - opt_init, opt_update = optix.adam(LR, b1, b2, eps) - state = opt_init(optix_params) + adam = optix.adam(LR, b1, b2, eps) + state = adam.init(optix_params) for _ in range(STEPS): - updates, state = opt_update(self.per_step_updates, state) + updates, state = adam.update(self.per_step_updates, state) optix_params = optix.apply_updates(optix_params, updates) # Check equivalence. @@ -99,10 +99,10 @@ def test_rmsprop(self): # experimental/optix.py optix_params = self.init_params - opt_init, opt_update = optix.rmsprop(LR, decay, eps) - state = opt_init(optix_params) + rmsprop = optix.rmsprop(LR, decay, eps) + state = rmsprop.init(optix_params) for _ in range(STEPS): - updates, state = opt_update(self.per_step_updates, state) + updates, state = rmsprop.update(self.per_step_updates, state) optix_params = optix.apply_updates(optix_params, updates) # Check equivalence. From b0ffbaf1f6af38cdd0087dad3b2ac7147cfb6c50 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 27 Nov 2019 07:26:46 +0100 Subject: [PATCH 0438/1053] Fixed also a notebook that has gone stale --- docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb index 56db249ef0a7..f5a021dc4440 100644 --- a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb +++ b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb @@ -177,7 +177,8 @@ } ], "source": [ - "def examine_jaxpr(jaxpr):\n", + "def examine_jaxpr(typed_jaxpr):\n", + " jaxpr = typed_jaxpr.jaxpr\n", " print(\"invars:\", jaxpr.invars)\n", " print(\"outvars:\", jaxpr.outvars)\n", " print(\"constvars:\", jaxpr.constvars)\n", From c1d8d3f74d422222fe173d8e0ef5b05f9e2fd300 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 27 Nov 2019 13:12:24 +0100 Subject: [PATCH 0439/1053] Add error checking that arguments of jvp are tuples --- jax/api.py | 5 +++++ tests/api_test.py | 12 ++++++++++++ tests/generated_fun_test.py | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index 212df9677267..098ad4e23af3 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1089,6 +1089,11 @@ def jvp(fun, primals, tangents): if not isinstance(fun, lu.WrappedFun): fun = lu.wrap_init(fun) + if not isinstance(primals, tuple) or not isinstance(tangents, tuple): + msg = ("primal and tangent arguments to jax.jvp must be tuples; " + "found {} and {}.") + raise TypeError(msg.format(type(primals).__name__, type(tangents).__name__)) + ps_flat, tree_def = tree_flatten(primals) ts_flat, tree_def_2 = tree_flatten(tangents) if tree_def != tree_def_2: diff --git a/tests/api_test.py b/tests/api_test.py index fa342f5847df..ddb6bc52eddd 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -500,6 +500,18 @@ def test_jvp_mismatched_arguments(self): "primal and tangent arguments to jax.jvp must have equal types", lambda: api.jvp(lambda x: -x, (onp.float16(2),), (onp.float32(4),))) + + def test_jvp_non_tuple_arguments(self): + def f(x, y): return x + y + self.assertRaisesRegex( + TypeError, + "primal and tangent arguments to jax.jvp must be tuples; found float and tuple.", + lambda: partial(api.jvp(f, 0., (1.,)))) + self.assertRaisesRegex( + TypeError, + "primal and tangent arguments to jax.jvp must be tuples; found tuple and ndarray.", + lambda: partial(api.jvp(f, (0.,), onp.array([1., 2.])))) + def test_vjp_mismatched_arguments(self): _, pullback = api.vjp(lambda x, y: x * y, onp.float32(3), onp.float32(4)) self.assertRaisesRegex( diff --git a/tests/generated_fun_test.py b/tests/generated_fun_test.py index 470078db77ad..50dbf5d1e862 100644 --- a/tests/generated_fun_test.py +++ b/tests/generated_fun_test.py @@ -248,7 +248,7 @@ def testJVPMatchesFD(self, fun): tangents = [tangents[i] for i in dyn_argnums] fun, vals = partial_argnums(fun, vals, dyn_argnums) ans1, deriv1 = jvp_fd(fun, vals, tangents) - ans2, deriv2 = jvp(fun, vals, tangents) + ans2, deriv2 = jvp(fun, tuple(vals), tuple(tangents)) check_all_close(ans1, ans2) check_all_close(deriv1, deriv2) From e0706ff86476271bfeb1b3e0055818c343fdf862 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 27 Nov 2019 14:24:41 +0100 Subject: [PATCH 0440/1053] Relaxed check to allow both tuples and lists --- jax/api.py | 15 +++++++-------- tests/api_test.py | 10 ++++++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/jax/api.py b/jax/api.py index 098ad4e23af3..dcb8043f4108 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1064,13 +1064,11 @@ def jvp(fun, primals, tangents): or standard Python containers of arrays or scalars. It should return an array, scalar, or standard Python container of arrays or scalars. primals: The primal values at which the Jacobian of `fun` should be - evaluated. Should be a tuple of arrays, scalar, or standard Python - container thereof. The length of the tuple is equal to the number of - positional parameters of `fun`. + evaluated. Should be either a tuple or a list of arguments, + and its length should equal to the number of positional parameters of `fun`. tangents: The tangent vector for which the Jacobian-vector product should be - evaluated. Should be a tuple of arrays, scalar, or standard Python - container thereof, with the same tree structure and array shapes as - `primals`. + evaluated. Should be either a tuple or a list of tangents, with the same + tree structure and array shapes as `primals`. Returns: A `(primals_out, tangents_out)` pair, where `primals_out` is @@ -1089,8 +1087,9 @@ def jvp(fun, primals, tangents): if not isinstance(fun, lu.WrappedFun): fun = lu.wrap_init(fun) - if not isinstance(primals, tuple) or not isinstance(tangents, tuple): - msg = ("primal and tangent arguments to jax.jvp must be tuples; " + if (not isinstance(primals, (tuple, list)) or + not isinstance(tangents, (tuple, list))): + msg = ("primal and tangent arguments to jax.jvp must be tuples or lists; " "found {} and {}.") raise TypeError(msg.format(type(primals).__name__, type(tangents).__name__)) diff --git a/tests/api_test.py b/tests/api_test.py index ddb6bc52eddd..18730e65ce96 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -495,6 +495,12 @@ def test_jvp_mismatched_arguments(self): ("primal and tangent arguments to jax.jvp must have the same tree " "structure"), lambda: api.jvp(lambda x, y: x * y, (onp.float32(2),), ())) + # If primals and tangents must both be tuples or both lists + self.assertRaisesRegex( + TypeError, + ("primal and tangent arguments to jax.jvp must have the same tree " + "structure"), + lambda: api.jvp(lambda x, y: x * y, (onp.float32(2),), [onp.float32(2)])) self.assertRaisesRegex( TypeError, "primal and tangent arguments to jax.jvp must have equal types", @@ -505,11 +511,11 @@ def test_jvp_non_tuple_arguments(self): def f(x, y): return x + y self.assertRaisesRegex( TypeError, - "primal and tangent arguments to jax.jvp must be tuples; found float and tuple.", + "primal and tangent arguments to jax.jvp must be tuples or lists; found float and tuple.", lambda: partial(api.jvp(f, 0., (1.,)))) self.assertRaisesRegex( TypeError, - "primal and tangent arguments to jax.jvp must be tuples; found tuple and ndarray.", + "primal and tangent arguments to jax.jvp must be tuples or lists; found tuple and ndarray.", lambda: partial(api.jvp(f, (0.,), onp.array([1., 2.])))) def test_vjp_mismatched_arguments(self): From 6931489733a568a98a452ba3581f70bc3d7d1dea Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 27 Nov 2019 07:01:46 -0800 Subject: [PATCH 0441/1053] update version for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 01758940e21d..9b239a2bc0bc 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.52" +__version__ = "0.1.53" From 43a1c00d054d7da5f2819062e9b2ab00e1c0f478 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Wed, 27 Nov 2019 15:13:23 +0000 Subject: [PATCH 0442/1053] Fix variable name in error message --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 07c8948a50a6..6bf98cc95f50 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -381,7 +381,7 @@ def _xla_callable(fun, device, backend, *abstract_args): if nreps > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") - raise ValueError(msg.format(num_replicas, xb.device_count(backend))) + raise ValueError(msg.format(nreps, xb.device_count(backend))) axis_env = AxisEnv(nreps, [], []) tuple_args = len(abstract_args) > 100 # pass long arg lists as tuple for TPU From 14b98d37510ad2af326e2c3b11a009a3267241d4 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 27 Nov 2019 10:55:02 -0500 Subject: [PATCH 0443/1053] Remove degenerate non-contracting special case from jax.numpy.einsum. (#1778) XLA knows how to simplify DotGenerals with no contracting dimensions. So I can't see any additional benefit for JAX having this special case, either directly or for transformations. --- jax/numpy/lax_numpy.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e09396b9018d..bd007fb4e089 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2299,25 +2299,15 @@ def sum_repeats(operand, names, counts, keep_names): batch_names = ''.join(lhs_names[i] for i in range(len(lhs_names)) if i in batch_dims) - if contracted_names: - # contract using lax.dot_general - lhs_cont, rhs_cont = unzip2((lhs_names.index(n), rhs_names.index(n)) - for n in contracted_names) - bdims = tuple(range(len(batch_dims))) - dimension_numbers = [(lhs_cont, rhs_cont), (bdims, bdims)] - operand = lax.dot_general(lhs, rhs, dimension_numbers, precision) - deleted_names = batch_names + ''.join(contracted_names) - names = (batch_names + removechars(lhs_names, deleted_names) - + removechars(rhs_names, deleted_names)) - else: - # no contraction, just a tensor product - nbatch = len(batch_names) - assert lhs.shape[:nbatch] == rhs.shape[:nbatch] - names = batch_names + lhs_names[nbatch:] + rhs_names[nbatch:] - lhs_shape = lhs.shape + (1,) * (rhs.ndim - nbatch) - rhs_shape = rhs.shape[:nbatch] + (1,) * (lhs.ndim - nbatch) + rhs.shape[nbatch:] - operand = lax.reshape(lhs, lhs_shape) * lax.reshape(rhs, rhs_shape) - + # contract using lax.dot_general + lhs_cont, rhs_cont = unzip2((lhs_names.index(n), rhs_names.index(n)) + for n in contracted_names) + bdims = tuple(range(len(batch_dims))) + dimension_numbers = [(lhs_cont, rhs_cont), (bdims, bdims)] + operand = lax.dot_general(lhs, rhs, dimension_numbers, precision) + deleted_names = batch_names + ''.join(contracted_names) + names = (batch_names + removechars(lhs_names, deleted_names) + + removechars(rhs_names, deleted_names)) else: raise NotImplementedError # if this is actually reachable, open an issue! From 9a8523603c0d4efbdd82b2bd174060ac7825c051 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 22 Nov 2019 10:53:11 -0800 Subject: [PATCH 0444/1053] Add experimental rematerialization decorator We want to allow users to control how reverse-mode autodiff saves values from the forward pass. In particular, we want it to be easy to signal that a function shouldn't have any of its intermediate residuals stored for the backward pass, and instead those values should be recomputed from the function's saved inputs. (This feature is especially handy for accelerators on which memory access is much more expensive than FLOPs are.) In JAX terms, since we implement reverse-mode as a composition of forward-mode, partial evaluation, and transposition, we want users to control how partial evaluation behaves. See https://github.com/google/jax/pull/1749 for more. Co-authored-by: Dougal Maclaurin --- docs/jax.lax.rst | 1 - jax/abstract_arrays.py | 14 ++- jax/api.py | 13 ++- jax/core.py | 3 +- jax/interpreters/ad.py | 84 ++++++++++++++++- jax/interpreters/partial_eval.py | 110 +++++++++++++++++++++- jax/interpreters/xla.py | 26 +++++ jax/lax/lax.py | 25 ++--- jax/lax/lax_control_flow.py | 4 +- jax/linear_util.py | 2 +- tests/api_test.py | 157 +++++++++++++++++++++++++++++++ 11 files changed, 410 insertions(+), 29 deletions(-) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index 14aaadf37511..6d3122725109 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -104,7 +104,6 @@ Operators scatter scatter_add select - shaped_identity shift_left shift_right_arithmetic shift_right_logical diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 28f151011015..1c0353c2cf5f 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -22,7 +22,7 @@ from . import core from . import ad_util from . import dtypes -from . util import prod +from . util import prod, partialmethod def concretization_err_msg(fun): @@ -145,6 +145,9 @@ def _len(self, ignored_tracer): def strip_weak_type(self): return ShapedArray(self.shape, self.dtype) if self.weak_type else self +def _forward_to_value(self, fun, ignored_tracer, *args): + return fun(self.val, *args) + class ConcreteArray(ShapedArray): __slots__ = ['val'] array_abstraction_level = 0 @@ -185,6 +188,15 @@ def str_short(self): def strip_weak_type(self): return ConcreteArray(self.val) if self.weak_type else self + _bool = _nonzero = partialmethod(_forward_to_value, bool) + _float = partialmethod(_forward_to_value, float) + _int = partialmethod(_forward_to_value, int) + if six.PY2: + _long = partialmethod(_forward_to_value, long) # noqa: F821 + _complex = partialmethod(_forward_to_value, complex) + _hex = partialmethod(_forward_to_value, hex) + _oct = partialmethod(_forward_to_value, oct) + class AbstractToken(core.AbstractValue): pass abstract_token = AbstractToken() diff --git a/jax/api.py b/jax/api.py index dcb8043f4108..b64030ee60e8 100644 --- a/jax/api.py +++ b/jax/api.py @@ -55,7 +55,7 @@ from .lib import xla_bridge as xb from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, host_id, host_ids, host_count) -from .abstract_arrays import ShapedArray, raise_to_shaped +from .abstract_arrays import ConcreteArray, ShapedArray, raise_to_shaped from .interpreters import partial_eval as pe from .interpreters import xla from .interpreters import pxla @@ -1982,3 +1982,14 @@ def abstractify(x): out = pe.abstract_eval_fun(fun.call_wrapped, *map(abstractify, args_flat)) out = [ShapeDtypeStruct(x.shape, x.dtype) for x in out] return tree_unflatten(out_tree(), out) + + +def checkpoint(fun, concrete=False): + @wraps(fun) + def fun_remat(*args, **kwargs): + args_flat, in_tree = tree_flatten((args, kwargs)) + flat_fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) + out_flat = pe.remat_call(flat_fun, *args_flat, concrete=concrete) + return tree_unflatten(out_tree(), out_flat) + return fun_remat +remat = checkpoint diff --git a/jax/core.py b/jax/core.py index 42c7f2e3f5c2..7c7c23aea0e5 100644 --- a/jax/core.py +++ b/jax/core.py @@ -597,7 +597,8 @@ def call_bind(primitive, f, *args, **params): def call_impl(f, *args, **params): - return f.call_wrapped(*args, **params) + del params # params parameterize the call primitive, not the function + return f.call_wrapped(*args) call_p = Primitive('call') diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 88f92b3f95a6..9eba7b5bca98 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -140,6 +140,9 @@ def unpair_pval(pval): return (aval_1, const_1), (aval_2, const_2) def backward_pass(jaxpr, consts, freevar_vals, args, cotangents_in): + if all(ct is zero for ct in cotangents_in): + return [zero] * len(jaxpr.freevars), [zero] * len(jaxpr.invars) + def write_cotangent(v, ct): # assert v not in primal_env if ct is not None: @@ -159,13 +162,46 @@ def write_primal(v, val): primal_env[v] = val primal_env = {} + write_primal(core.unitvar, core.unit) map(write_primal, jaxpr.constvars, consts) map(write_primal, jaxpr.freevars, freevar_vals) map(write_primal, jaxpr.invars, args) + def is_linear(var): + if type(var) is Literal: + return False + else: + return primal_env.get(var, undefined_primal) is undefined_primal + + linear_eqns = [] + for eqn in jaxpr.eqns: + if not eqn.bound_subjaxprs: + if any(is_linear(v) for v in eqn.invars): + linear_eqns.append(eqn) + else: + in_vals = map(read_primal, eqn.invars) + ans = eqn.primitive.bind(*in_vals, **eqn.params) + if eqn.primitive.multiple_results: + map(write_primal, eqn.outvars, ans) + else: + write_primal(eqn.outvars[0], ans) + else: + (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs + if any(is_linear(v) for v in it.chain(eqn.invars, const_vars, bound_vars)): + linear_eqns.append(eqn) + sub_consts = map(read_primal, const_vars) + sub_freevar_vals = map(read_primal, bound_vars) + in_vals = map(read_primal, eqn.invars) + all_args, in_tree_def = tree_flatten((sub_consts, sub_freevar_vals, in_vals)) + fun = hashable_partial(wrap_init(_eval_primals), subjaxpr) + fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) + out_flat = eqn.primitive.bind(fun, *all_args, **eqn.params) + ans = tree_unflatten(out_tree(), out_flat) + map(write_primal, eqn.outvars, ans) + ct_env = {} map(write_cotangent, jaxpr.outvars, cotangents_in) - for eqn in jaxpr.eqns[::-1]: + for eqn in linear_eqns[::-1]: invals = map(read_primal, eqn.invars) if eqn.primitive.multiple_results: cts_in = map(read_cotangent, eqn.outvars) @@ -187,6 +223,51 @@ def write_primal(v, val): cotangents_out = map(read_cotangent, jaxpr.invars) return freevar_cts, cotangents_out +def _eval_primals(jaxpr, consts, freevar_vals, args): + primal_env = {} + + def read_primal(v): + if type(v) is Literal: + return v.val + else: + return primal_env.get(v, undefined_primal) + + def write_primal(v, val): + if val is not undefined_primal: + primal_env[v] = val + + def is_linear(var): + if type(var) is Literal: + return False + else: + return primal_env.get(var, undefined_primal) is undefined_primal + + write_primal(core.unitvar, core.unit) + map(write_primal, jaxpr.constvars, consts) + map(write_primal, jaxpr.freevars, freevar_vals) + map(write_primal, jaxpr.invars, args) + for eqn in jaxpr.eqns: + if not eqn.bound_subjaxprs: + if not any(is_linear(v) for v in eqn.invars): + in_vals = map(read_primal, eqn.invars) + ans = eqn.primitive.bind(*in_vals, **eqn.params) + if eqn.primitive.multiple_results: + map(write_primal, eqn.outvars, ans) + else: + write_primal(eqn.outvars[0], ans) + else: + (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs + sub_consts = map(read_primal, const_vars) + sub_freevar_vals = map(read_primal, bound_vars) + in_vals = map(read_primal, eqn.invars) + all_args, in_tree_def = tree_flatten((sub_consts, sub_freevar_vals, in_vals)) + fun = hashable_partial(wrap_init(_eval_primals), subjaxpr) + fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) + out_flat = eqn.primitive.bind(fun, *all_args, **eqn.params) + ans = tree_unflatten(out_tree(), out_flat) + map(write_primal, eqn.outvars, ans) + return map(read_primal, jaxpr.outvars) + class UndefinedPrimal(object): def __repr__(self): return '_' undefined_primal = UndefinedPrimal() @@ -460,6 +541,7 @@ def call_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): out_flat = primitive.bind(fun, *all_args, **params) return tree_unflatten(out_tree(), out_flat) primitive_transposes[core.call_p] = partial(call_transpose, call_p) +primitive_transposes[pe.remat_call_p] = partial(call_transpose, pe.remat_call_p) def map_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 45cb51070fde..6952636c7276 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -24,7 +24,7 @@ from .. import core from .. import linear_util as lu -from ..abstract_arrays import ShapedArray, ConcreteArray +from ..abstract_arrays import ShapedArray, ConcreteArray, raise_to_shaped from ..linear_util import thunk, transformation, transformation_with_aux from ..util import unzip2, safe_zip, safe_map, toposort, partial, split_list from ..core import (Trace, Tracer, new_master, Jaxpr, Literal, get_aval, @@ -104,6 +104,8 @@ def process_primitive(self, primitive, tracers, params): return out_tracer def process_call(self, call_primitive, f, tracers, params): + if call_primitive in call_partial_eval_rules: + return call_partial_eval_rules[call_primitive](self, f, tracers, params) if call_primitive in map_primitives: return self.process_map(call_primitive, f, tracers, params) in_pvs, in_consts = unzip2([t.pval for t in tracers]) @@ -188,7 +190,6 @@ def todo(x): return out_tracers return out, todo - def _mapped_aval(aval): if aval is core.abstract_unit: return aval @@ -207,6 +208,8 @@ def _unmapped_aval(size, aval): raise TypeError(aval) map_primitives = set() +custom_partial_eval_rules = {} +call_partial_eval_rules = {} def partial_eval(f, trace, pvs): @@ -450,4 +453,105 @@ def fun(*vals): def _split_aval(unknown, aval): return (abstract_unit, aval) if unknown else (aval, abstract_unit) -custom_partial_eval_rules = {} + +remat_call_p = core.Primitive('remat_call') +remat_call = partial(core.call_bind, remat_call_p) +remat_call_p.def_custom_bind(remat_call) +remat_call_p.def_impl(core.call_impl) +remat_call_p.multiple_results = True + +def _remat_partial_eval(trace, f, tracers, params): + concrete = params['concrete'] + + # Unlike JaxprTrace.process_call, we want to form a jaxpr for the entirety of + # the function being called, not just for the unknown parts. To do that, we + # instantiate all the input tracers as constants in the jaxpr being formed. + # Those tracers might have concrete avals, and doing abstract interpretation + # on concrete avals engenders a tradeoff: it allows data-dependent Python + # control flow to work, but it can in some cases lead to redundant FLOPs (done + # both in the `bind` call below and the `core.jaxpr_as_fun` call). We use the + # `concrete` parameter to switch this behavior, and if `concrete` is False + # then we raise the avals to the Shaped level. + instantiated_tracers = map(trace.instantiate_const, tracers) + if not concrete: + instantiated_tracers = [ + JaxprTracer(trace, PartialVal((raise_to_shaped(t.pval[0]), unit)), t.recipe) + if type(t.pval[0]) is ConcreteArray else t for t in instantiated_tracers] + + # Using the instantiated tracers, run call_bind like JaxprTrace.process_call. + in_pvs, in_consts = unzip2(t.pval for t in instantiated_tracers) + fun, aux = partial_eval(f, trace, in_pvs) + out_flat = remat_call_p.bind(fun, *in_consts, **params) + out_pvs, jaxpr, env = aux() + out_pval_consts1, consts = split_list(out_flat, [len(out_flat)-len(jaxpr.constvars)]) + out_pvals1 = [PartialVal((pv, const)) for pv, const in zip(out_pvs, out_pval_consts1)] + + # Since we traced with everything marked as unknown, but we need to know which + # outputs are known/unknown, we use partial_eval_jaxpr to get out_unknowns. + in_avals = [raise_to_shaped(pv) for pv in in_pvs] + out_avals = [raise_to_shaped(pv if pv is not None else core.get_aval(const)) + for pv, const in zip(out_pvs, out_pval_consts1)] + typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) + in_unknowns = [t.pval[0] is not None for t in tracers] + jaxpr_1, jaxpr_2, out_unknowns = partial_eval_jaxpr(typed_jaxpr, in_unknowns, False) + num_res = len(jaxpr_1.out_avals) - len(jaxpr_2.out_avals) + + # First, we revise the jaxpr to be staged out not to output too much. + typed_jaxpr = _dce_jaxpr(typed_jaxpr, out_unknowns) + + # Next, we need values for the outputs that should be known. Since consts + # weren't passed through Python for evaluation, we need to evaluate jaxpr_1, + # minus the residual outputs that we don't need. When `concrete=True`, as an + # optimization we can avoid redoing *some* redundant FLOPs, namely those that + # produced concrete avals at the output, simply by using those as computed + # values. For the use case of reverse-mode ad, all the primal outputs should + # be concrete (thus not recomputed). + to_compute = [not uk and type(pv) is not ConcreteArray + for uk, pv in zip(out_unknowns, out_pvs)] + jaxpr_1 = _dce_jaxpr(jaxpr_1, to_compute + [False] * num_res) + _, in_consts = unzip2(t.pval for t in tracers) + out_pval_consts2 = core.jaxpr_as_fun(jaxpr_1)(*in_consts)[:-num_res or None] + out_pvals = map(_reconstruct_pval, out_pvals1, out_pval_consts2, out_unknowns) + + # Now that we have out_pvals, the rest is just like JaxprTrace.process_call. + const_tracers = map(trace.new_instantiated_const, consts) + bound_subjaxpr = (jaxpr, const_tracers, map(trace.full_raise, env)) + out_tracers = [JaxprTracer(trace, out_pval, None) for out_pval in out_pvals] + eqn = new_eqn_recipe(instantiated_tracers, out_tracers, remat_call_p, + (bound_subjaxpr,), params) + for t in out_tracers: + t.recipe = eqn + return out_tracers +call_partial_eval_rules[remat_call_p] = _remat_partial_eval + +def _dce_jaxpr(typed_jaxpr, outputs): + # This dead-code elimination is pretty rudimentary, and in particular doesn't + # nontrivially DCE through scan or other higher-order primitives. + jaxpr = typed_jaxpr.jaxpr + outvars, out_avals = jaxpr.outvars, typed_jaxpr.out_avals + out_pairs = [(var, aval) if output else (core.unitvar, core.abstract_unit) + for var, aval, output in zip(outvars, out_avals, outputs)] + new_outvars, new_out_avals = unzip2(out_pairs) + + needed_vars = set(new_outvars) + new_eqns = [] + for eqn in jaxpr.eqns[::-1]: + if set(eqn.outvars) & needed_vars: + new_eqns.append(eqn) + needed_vars.update(eqn.invars) + new_eqns = new_eqns[::-1] + + new_jaxpr = core.Jaxpr(jaxpr.constvars, jaxpr.freevars, jaxpr.invars, + new_outvars, new_eqns) + return core.TypedJaxpr(new_jaxpr, typed_jaxpr.literals, typed_jaxpr.in_avals, + new_out_avals) + +def _reconstruct_pval(pval1, const2, unknown): + pv1, const1 = pval1 + if unknown or pv1 is None: + return pval1 + else: + if type(pv1) is ConcreteArray: + return PartialVal((None, pv1.val)) + else: + return PartialVal((None, const2)) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 4520d5cd9c62..509437e7d7b2 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -762,6 +762,32 @@ def _device_put_impl(x, device=None): ad.deflinear(device_put_p, lambda cotangent, **kwargs: [cotangent]) +def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, in_nodes, + backend=None, device=None, concrete=None): + # This looks a lot like _xla_call_translation_rule, except for a widget we use + # to foil CSE. + del device, concrete # Unused. + subc = xb.make_computation_builder("remat_call_subcomputation") + consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] + freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] + args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] + args = [_foil_cse(subc, x) for x in args] + out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, *args) + subc = subc.Build(subc.Tuple(*out_nodes)) + return c.Call(subc, list(const_nodes) + list(freevar_nodes) + list(in_nodes)) +call_translations[pe.remat_call_p] = _remat_translation_rule + +def _foil_cse(c, x): + rng = c.RngNormal(c.Constant(onp.array(0, dtype=onp.float32)), + c.Constant(onp.array(1, dtype=onp.float32)), + []) + pred = c.Lt(rng, c.Constant(onp.finfo(onp.float32).max)) + xla_shape = c.GetShape(x) + shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() + zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) + return c.Select(pred, x, zero) + + ### lazy constants class DeviceConstant(DeviceArray): diff --git a/jax/lax/lax.py b/jax/lax/lax.py index d4897b621ffa..0c84b1dce1cd 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1035,9 +1035,6 @@ def sort_key_val(keys, values, dimension=-1): def tie_in(x, y): return tie_in_p.bind(x, y) -def shaped_identity(x): - return shaped_identity_p.bind(x, shape=x.shape) - def full(shape, fill_value, dtype=None): """Returns an array of `shape` filled with `fill_value`. @@ -1472,7 +1469,7 @@ def zeros_like_array(x): def standard_primitive(shape_rule, dtype_rule, name, translation_rule=None): prim = Primitive(name) prim.def_impl(partial(xla.apply_primitive, prim)) - prim.def_abstract_eval(partial(standard_abstract_eval, shape_rule, dtype_rule)) + prim.def_abstract_eval(partial(standard_abstract_eval, prim, shape_rule, dtype_rule)) xla.translations[prim] = translation_rule or partial(standard_translate, name) return prim @@ -1480,17 +1477,17 @@ def standard_primitive(shape_rule, dtype_rule, name, translation_rule=None): def standard_reduction_primitive(shape_rule, dtype_rule, name, translation_rule=None): prim = Primitive(name) prim.def_impl(partial(xla.apply_primitive, prim)) - prim.def_abstract_eval(partial(standard_abstract_eval, shape_rule, dtype_rule)) + prim.def_abstract_eval(partial(standard_abstract_eval, prim, shape_rule, dtype_rule)) xla.reduction_translations[prim] = translation_rule or partial(standard_translate, name) return prim -def standard_abstract_eval(shape_rule, dtype_rule, *args, **kwargs): +def standard_abstract_eval(prim, shape_rule, dtype_rule, *args, **kwargs): assert all(isinstance(arg, UnshapedArray) for arg in args), args least_specialized = _max( map(type, args), key=operator.attrgetter('array_abstraction_level')) if least_specialized is ConcreteArray: - return ShapedArray(shape_rule(*args, **kwargs), dtype_rule(*args, **kwargs)) + return ConcreteArray(prim.impl(*[x.val for x in args], **kwargs)) elif least_specialized is ShapedArray: return ShapedArray(shape_rule(*args, **kwargs), dtype_rule(*args, **kwargs)) elif least_specialized is UnshapedArray: @@ -3933,7 +3930,7 @@ def _sort_batch_rule(batched_args, batch_dims, dimension): def _sort_key_val_abstract_eval(keys, values, dimension): - return keys, values + return raise_to_shaped(keys), raise_to_shaped(values) def _sort_key_val_jvp(primals, tangents, dimension): # NOTE(mattjj): this re-sorts three times, but if we had a variadic @@ -3991,7 +3988,7 @@ def _sort_key_val_batch_rule(batched_args, batch_dims, dimension): new_dimension = dimension + (keys_bdim <= dimension) return sort_key_val(keys, new_values, new_dimension), (keys_bdim, keys_bdim) else: - raise Exception # unreachable + assert False # unreachable sort_key_val_p = Primitive('sort_key_val') sort_key_val_p.multiple_results = True @@ -4013,21 +4010,13 @@ def _tie_in_batch_rule(batched_args, batch_dims): tie_in_p = Primitive('tie_in') tie_in_p.def_impl(lambda x, y: y) -tie_in_p.def_abstract_eval(lambda x, y: y) +tie_in_p.def_abstract_eval(lambda x, y: raise_to_shaped(y)) xla.translations[tie_in_p] = lambda c, x, y: y ad.deflinear(tie_in_p, _tie_in_transpose_rule) batching.primitive_batchers[tie_in_p] = _tie_in_batch_rule masking.shape_rules[tie_in_p] = lambda shape_exprs: shape_exprs[1] masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] -shaped_identity_p = Primitive('shape_id') -shaped_identity_p.def_impl(lambda x, shape: x) -shaped_identity_p.def_abstract_eval(lambda x, shape: x) -xla.translations[shaped_identity_p] = lambda c, x, shape: x -ad.deflinear(shaped_identity_p, lambda t, shape: [shaped_identity(t)]) -batching.primitive_batchers[shaped_identity_p] = \ - lambda a, d, shape: (shaped_identity(a[0]), d[0]) - ### constants diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 7badc7663b1c..7ec583c7670e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1084,7 +1084,7 @@ def linearize_and_solve(x, b): def _root_abstract_eval(*args, **kwargs): - return args[sum(kwargs['const_lengths']):] + return _map(raise_to_shaped, args[sum(kwargs['const_lengths']):]) def _root_impl(*args, **kwargs): @@ -1253,7 +1253,7 @@ def custom_linear_solve( def _linear_solve_abstract_eval(*args, **kwargs): - return args[sum(kwargs['const_lengths']):] + return _map(raise_to_shaped, args[sum(kwargs['const_lengths']):]) def _custom_linear_solve_impl(*args, **kwargs): diff --git a/jax/linear_util.py b/jax/linear_util.py index 8cf970ff14ba..b462774edbdf 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -148,8 +148,8 @@ def call_wrapped(self, *args, **kwargs): gen = gen(*(gen_args + tuple(args)), **kwargs) args, kwargs = next(gen) stack.append((gen, out_store)) + gen = None - del gen ans = self.f(*args, **dict(self.params, **kwargs)) del args while stack: diff --git a/tests/api_test.py b/tests/api_test.py index 18730e65ce96..e83050294399 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1326,6 +1326,163 @@ def test_grad_of_jit_compilation_caching(self): self.assertAllClose(ans1, onp.cos(2.), check_dtypes=False) self.assertAllClose(ans2, onp.cos(3.), check_dtypes=False) + def test_remat_basic(self): + @api.remat + def g(x): + return lax.sin(x), 3. + + def f(x): + x, _ = g(x) + return x + + ans = f(2.) + expected = onp.sin(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans, f_lin = api.linearize(f, 2.) + expected = onp.sin(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = f_lin(3.) + expected = onp.cos(2.) * 3. + self.assertAllClose(ans, expected, check_dtypes=False) + + jaxpr = api.make_jaxpr(f_lin)(3.) + self.assertIn('sin', str(jaxpr)) + + def test_remat_grad_python_control_flow(self): + @partial(api.remat, concrete=True) + def g(x): + if x > 0: + return lax.sin(x), 3. + else: + return lax.cos(x), 4. + + def f(x): + x, _ = g(x) + return x + + ans = f(2.) + expected = onp.sin(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(f)(2.) + expected = onp.cos(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_remat_jit(self): + @api.remat + def g(x): + return lax.sin(lax.sin(x)) + + def f_(x): + return g(x) + f = api.jit(f_) + + ans = f(2.) + expected = onp.sin(onp.sin(2.)) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(f)(2.) + expected = onp.cos(onp.sin(2.)) * onp.cos(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.jit(api.grad(f_))(2.) + expected = onp.cos(onp.sin(2.)) * onp.cos(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_remat_vmap(self): + @api.remat + def g(x): + return lax.sin(lax.sin(x)) + + x = onp.arange(3.) + + ans = api.vmap(g)(x) + expected = onp.sin(onp.sin(x)) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.jacfwd(g)(x) + expected = onp.diag(onp.cos(onp.sin(x)) * onp.cos(x)) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.jacrev(g)(x) + expected = onp.diag(onp.cos(onp.sin(x)) * onp.cos(x)) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_remat_higher_order_autodiff(self): + def f(x): + return lax.cos(lax.sin(x)) + g = api.remat(f) + + ans = api.grad(api.grad(g))(3.) + expected = api.grad(api.grad(f))(3.) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_remat_scan(self): + to_scan = lambda c, x: (np.sin(c), None) + + def f_noremat(x): + y, _ = lax.scan(to_scan, x, onp.arange(3.)) + return y + + def f_yesremat(x): + y, _ = lax.scan(api.remat(to_scan), x, onp.arange(3.)) + return y + + ans = f_yesremat(4.) + expected = f_noremat(4.) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(f_yesremat)(4.) + expected = api.grad(f_noremat)(4.) + self.assertAllClose(ans, expected, check_dtypes=False) + + jaxpr = api.make_jaxpr(api.linearize(f_yesremat, 4.)[1])(1.) + scan_eqn, = jaxpr.eqns + self.assertIn(' sin ', str(scan_eqn.params['jaxpr'])) + + jaxpr = api.make_jaxpr(api.vjp(f_yesremat, 4.)[1])(1.) + scan_eqn, = jaxpr.eqns + self.assertIn(' cos ', str(scan_eqn.params['jaxpr'])) + + def test_remat_no_redundant_flops(self): + # see https://github.com/google/jax/pull/1749#issuecomment-558267584 + + @api.jit + def g(x): + return f(2., x) + + @api.remat + def f(x, y): + return np.sin(x) * y + + # We swap out sin_p's impl rule to count how many times it's invoked + called = [] + sin_impl = lax.sin_p.impl + try: + lax.sin_p.def_impl(lambda x: called.append(1) or sin_impl(x)) + api.grad(g)(3.) + finally: + lax.sin_p.def_impl(sin_impl) + num_calls = len(called) + self.assertEqual(num_calls, 1) + + def test_remat_binomial_checkpointing(self): + def binom_checkpoint(funs): + if len(funs) == 1: + return funs[0] + else: + f1 = binom_checkpoint(funs[:len(funs)//2]) + f2 = binom_checkpoint(funs[len(funs)//2:]) + return api.remat(lambda x: f1(f2(x))) + + f1 = binom_checkpoint([np.sin, np.sin, np.sin, np.sin]) + f2 = lambda x: np.sin(np.sin(np.sin(np.sin(x)))) + x = 4. + self.assertAllClose(f1(x), f2(x), check_dtypes=False) + self.assertAllClose(api.grad(f1)(x), api.grad(f2)(x), check_dtypes=False) + if __name__ == '__main__': absltest.main() From b2b5049eb52d69c836a72a77f50822ec27f5b9b2 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 27 Nov 2019 14:28:13 -0800 Subject: [PATCH 0445/1053] try remat_call partial-eval into two remat_calls The idea here was for the resulting jaxpr to have a purely nonlinear remat_call and a linear one with no primals to evaluate. (I wanted to avoid having to recurse into all calls in _eval_primal in backward_pass.) But the issue is that makes jaxprs not round-trippable, since the first remat_call, depending only on constants, would get partial-eval'd away at the first attempted round-trip. And we round-trip in partial_eval_jaxpr, particularly for partial eval of scan. That meant remat of scan didn't work, and that's no good! --- jax/interpreters/ad.py | 22 ++++---- jax/interpreters/partial_eval.py | 96 +++++++++++++++++++++++++------- jax/interpreters/xla.py | 18 +++--- jax/lax/lax_control_flow.py | 17 +----- tests/api_test.py | 43 ++++++++++++-- 5 files changed, 136 insertions(+), 60 deletions(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 9eba7b5bca98..32b2ba7a9df9 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -187,17 +187,19 @@ def is_linear(var): write_primal(eqn.outvars[0], ans) else: (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs - if any(is_linear(v) for v in it.chain(eqn.invars, const_vars, bound_vars)): + if any(is_linear(v) for v in it.chain(eqn.invars, bound_vars)): linear_eqns.append(eqn) - sub_consts = map(read_primal, const_vars) - sub_freevar_vals = map(read_primal, bound_vars) - in_vals = map(read_primal, eqn.invars) - all_args, in_tree_def = tree_flatten((sub_consts, sub_freevar_vals, in_vals)) - fun = hashable_partial(wrap_init(_eval_primals), subjaxpr) - fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) - out_flat = eqn.primitive.bind(fun, *all_args, **eqn.params) - ans = tree_unflatten(out_tree(), out_flat) - map(write_primal, eqn.outvars, ans) + else: + assert not any(is_linear(v) for v in const_vars) + sub_consts = map(read_primal, const_vars) + sub_freevar_vals = map(read_primal, bound_vars) + in_vals = map(read_primal, eqn.invars) + all_args, in_tree_def = tree_flatten((sub_consts, sub_freevar_vals, in_vals)) + fun = hashable_partial(wrap_init(_eval_primals), subjaxpr) + fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) + out_flat = eqn.primitive.bind(fun, *all_args, **eqn.params) + ans = tree_unflatten(out_tree(), out_flat) + map(write_primal, eqn.outvars, ans) ct_env = {} map(write_cotangent, jaxpr.outvars, cotangents_in) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 6952636c7276..2f3dcf23a035 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -411,6 +411,14 @@ def closure_convert_jaxpr(jaxpr): core.skip_checks or core.check_jaxpr(lifted_jaxpr) return lifted_jaxpr +def convert_freevars_jaxpr(jaxpr): + core.skip_checks or core.check_jaxpr(jaxpr) + lifted_jaxpr = Jaxpr(constvars=jaxpr.constvars, freevars=(), + invars=jaxpr.freevars + jaxpr.invars, + outvars=jaxpr.outvars, eqns=jaxpr.eqns) + core.skip_checks or core.check_jaxpr(lifted_jaxpr) + return lifted_jaxpr + def partial_eval_jaxpr(jaxpr, unknowns, instantiate): f = lu.wrap_init(core.jaxpr_as_fun(jaxpr)) @@ -483,54 +491,83 @@ def _remat_partial_eval(trace, f, tracers, params): fun, aux = partial_eval(f, trace, in_pvs) out_flat = remat_call_p.bind(fun, *in_consts, **params) out_pvs, jaxpr, env = aux() + env = map(trace.full_raise, env) out_pval_consts1, consts = split_list(out_flat, [len(out_flat)-len(jaxpr.constvars)]) out_pvals1 = [PartialVal((pv, const)) for pv, const in zip(out_pvs, out_pval_consts1)] # Since we traced with everything marked as unknown, but we need to know which # outputs are known/unknown, we use partial_eval_jaxpr to get out_unknowns. - in_avals = [raise_to_shaped(pv) for pv in in_pvs] + jaxpr_converted = convert_freevars_jaxpr(jaxpr) + in_avals = ([raise_to_shaped(t.pval[0]) for t in env] + + [raise_to_shaped(pv) for pv in in_pvs]) out_avals = [raise_to_shaped(pv if pv is not None else core.get_aval(const)) for pv, const in zip(out_pvs, out_pval_consts1)] - typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) - in_unknowns = [t.pval[0] is not None for t in tracers] + typed_jaxpr = core.TypedJaxpr(jaxpr_converted, consts, in_avals, out_avals) + in_unknowns = [t.pval[0] is not None for t in it.chain(env, tracers)] jaxpr_1, jaxpr_2, out_unknowns = partial_eval_jaxpr(typed_jaxpr, in_unknowns, False) num_res = len(jaxpr_1.out_avals) - len(jaxpr_2.out_avals) - # First, we revise the jaxpr to be staged out not to output too much. - typed_jaxpr = _dce_jaxpr(typed_jaxpr, out_unknowns) - # Next, we need values for the outputs that should be known. Since consts # weren't passed through Python for evaluation, we need to evaluate jaxpr_1, # minus the residual outputs that we don't need. When `concrete=True`, as an # optimization we can avoid redoing *some* redundant FLOPs, namely those that # produced concrete avals at the output, simply by using those as computed - # values. For the use case of reverse-mode ad, all the primal outputs should - # be concrete (thus not recomputed). + # values. For the use case of reverse-mode ad in op-by-op ("eager mode") + # evaluation, all the primal outputs should be concrete (thus not recomputed). to_compute = [not uk and type(pv) is not ConcreteArray for uk, pv in zip(out_unknowns, out_pvs)] - jaxpr_1 = _dce_jaxpr(jaxpr_1, to_compute + [False] * num_res) - _, in_consts = unzip2(t.pval for t in tracers) - out_pval_consts2 = core.jaxpr_as_fun(jaxpr_1)(*in_consts)[:-num_res or None] + jaxpr_1_primals = _dce_jaxpr(jaxpr_1, to_compute + [False] * num_res) + _, in_consts = unzip2(t.pval for t in it.chain(env, tracers)) + out_pval_consts2 = core.jaxpr_as_fun(jaxpr_1_primals)(*in_consts)[:-num_res or None] out_pvals = map(_reconstruct_pval, out_pvals1, out_pval_consts2, out_unknowns) - # Now that we have out_pvals, the rest is just like JaxprTrace.process_call. + # Now that we have out_pvals, the rest is just like JaxprTrace.process_call + # except we stage out two calls: one based on jaxpr_1 for computing the + # residuals (which in the case of reverse-mode ad involves no linear + # variables) and the other based on jaxpr_2 for evaluating everything given + # the residuals (which in reverse-mode ad is linear). + instantiated_tracers = env + instantiated_tracers + num_nonres = len(jaxpr_2.out_avals) + jaxpr_1_res = _dce_jaxpr(jaxpr_1, [False] * num_nonres + [True] * num_res, + prune_outputs=True) + const_tracers = map(trace.new_instantiated_const, consts) - bound_subjaxpr = (jaxpr, const_tracers, map(trace.full_raise, env)) + bound_subjaxpr_1 = (jaxpr_1_res.jaxpr, const_tracers, ()) + res_avals = jaxpr_1.out_avals[num_nonres:] + res_tracers = [JaxprTracer(trace, PartialVal((aval, unit)), None) + for aval in res_avals] + tracers_1 = [t if not uk else trace.new_instantiated_literal(unit) + for t, uk in zip(instantiated_tracers, in_unknowns)] + eqn_1 = new_eqn_recipe(tracers_1, res_tracers, remat_call_p, + (bound_subjaxpr_1,), params) + for t in res_tracers: t.recipe = eqn_1 + + bound_subjaxpr_2 = (jaxpr_2.jaxpr, (), ()) out_tracers = [JaxprTracer(trace, out_pval, None) for out_pval in out_pvals] - eqn = new_eqn_recipe(instantiated_tracers, out_tracers, remat_call_p, - (bound_subjaxpr,), params) - for t in out_tracers: - t.recipe = eqn + tracers_2 = [t if uk else trace.new_instantiated_literal(unit) + for t, uk in zip(instantiated_tracers, in_unknowns)] + eqn_2 = new_eqn_recipe(tracers_2 + res_tracers, out_tracers, remat_call_p, + (bound_subjaxpr_2,), params) + for t in out_tracers: t.recipe = eqn_2 return out_tracers call_partial_eval_rules[remat_call_p] = _remat_partial_eval +# NOTE to future self: the problem with the above strategy is that the jaxpr +# produced wouldn't be round-trippable, in the sense that by forming two remat +# calls we ensured the first one would be partial-eval'd away when we tried to +# round-trip e.g. for partial eval of scan. -def _dce_jaxpr(typed_jaxpr, outputs): +def _dce_jaxpr(typed_jaxpr, outputs, prune_outputs=False): # This dead-code elimination is pretty rudimentary, and in particular doesn't - # nontrivially DCE through scan or other higher-order primitives. + # nontrivially DCE through scan, call, or other higher-order primitives. + # TODO(mattjj): better DCE jaxpr = typed_jaxpr.jaxpr outvars, out_avals = jaxpr.outvars, typed_jaxpr.out_avals - out_pairs = [(var, aval) if output else (core.unitvar, core.abstract_unit) - for var, aval, output in zip(outvars, out_avals, outputs)] + if prune_outputs: + out_pairs = [(var, aval) for var, aval, output + in zip(outvars, out_avals, outputs) if output] + else: + out_pairs = [(var, aval) if output else (core.unitvar, core.abstract_unit) + for var, aval, output in zip(outvars, out_avals, outputs)] new_outvars, new_out_avals = unzip2(out_pairs) needed_vars = set(new_outvars) @@ -555,3 +592,20 @@ def _reconstruct_pval(pval1, const2, unknown): return PartialVal((None, pv1.val)) else: return PartialVal((None, const2)) + + +def move_binders_to_front(typed_jaxpr, to_move): + assert not typed_jaxpr.jaxpr.constvars and not typed_jaxpr.jaxpr.freevars + assert len(typed_jaxpr.in_avals) == len(to_move) + new_invars = _move_to_front(typed_jaxpr.jaxpr.invars, to_move) + new_jaxpr = core.Jaxpr((), (), new_invars, typed_jaxpr.jaxpr.outvars, + typed_jaxpr.jaxpr.eqns) + new_in_avals = _move_to_front(typed_jaxpr.in_avals, to_move) + new_typed_jaxpr = core.TypedJaxpr(new_jaxpr, typed_jaxpr.literals, + new_in_avals, typed_jaxpr.out_avals) + return new_typed_jaxpr + +def _move_to_front(lst, to_move): + return ([elt for elt, move in zip(lst, to_move) if move] + + [elt for elt, move in zip(lst, to_move) if not move]) + diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 509437e7d7b2..94cc770670f3 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -778,14 +778,18 @@ def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, in_n call_translations[pe.remat_call_p] = _remat_translation_rule def _foil_cse(c, x): - rng = c.RngNormal(c.Constant(onp.array(0, dtype=onp.float32)), - c.Constant(onp.array(1, dtype=onp.float32)), - []) - pred = c.Lt(rng, c.Constant(onp.finfo(onp.float32).max)) xla_shape = c.GetShape(x) - shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() - zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) - return c.Select(pred, x, zero) + if xla_shape.is_tuple(): + assert not xla_shape.tuple_shapes() + return x + else: + rng = c.RngNormal(c.Constant(onp.array(0, dtype=onp.float32)), + c.Constant(onp.array(1, dtype=onp.float32)), + []) + pred = c.Lt(rng, c.Constant(onp.finfo(onp.float32).max)) + shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() + zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) + return c.Select(pred, x, zero) ### lazy constants diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 7ec583c7670e..5ea578450130 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -675,7 +675,7 @@ def _scan_partial_eval(trace, *tracers, **kwargs): _, _, res_pvals = split_list(out_pvals_1, [num_carry, num_ys]) intensive_residuals = [const for pv, const in res_pvals if pv is None] move = [False] * len(jaxpr_1.in_avals) + [pv is None for pv, _ in res_pvals] - jaxpr_2_opt = _move_binders_to_front(jaxpr_2, move) + jaxpr_2_opt = pe.move_binders_to_front(jaxpr_2, move) num_consts_2 = num_consts + len(intensive_residuals) in_consts = (list(consts_1) + [core.unit] * num_consts + @@ -712,21 +712,6 @@ def _scan_partial_eval(trace, *tracers, **kwargs): for t in out_tracers: t.recipe = eqn return out_tracers -def _move_binders_to_front(typed_jaxpr, to_move): - assert not typed_jaxpr.jaxpr.constvars and not typed_jaxpr.jaxpr.freevars - assert len(typed_jaxpr.in_avals) == len(to_move) - new_invars = _move_to_front(typed_jaxpr.jaxpr.invars, to_move) - new_jaxpr = core.Jaxpr((), (), new_invars, typed_jaxpr.jaxpr.outvars, - typed_jaxpr.jaxpr.eqns) - new_in_avals = _move_to_front(typed_jaxpr.in_avals, to_move) - new_typed_jaxpr = core.TypedJaxpr(new_jaxpr, typed_jaxpr.literals, - new_in_avals, typed_jaxpr.out_avals) - return new_typed_jaxpr - -def _move_to_front(lst, to_move): - return ([elt for elt, move in zip(lst, to_move) if move] + - [elt for elt, move in zip(lst, to_move) if not move]) - def _promote_aval_rank(sz, aval): if aval is core.abstract_unit: return core.abstract_unit diff --git a/tests/api_test.py b/tests/api_test.py index e83050294399..f6b541e74bac 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1329,26 +1329,56 @@ def test_grad_of_jit_compilation_caching(self): def test_remat_basic(self): @api.remat def g(x): - return lax.sin(x), 3. + return lax.sin(lax.sin(x)), 3. def f(x): x, _ = g(x) return x ans = f(2.) - expected = onp.sin(2.) + expected = onp.sin(onp.sin(2.)) self.assertAllClose(ans, expected, check_dtypes=False) ans, f_lin = api.linearize(f, 2.) - expected = onp.sin(2.) + expected = onp.sin(onp.sin(2.)) self.assertAllClose(ans, expected, check_dtypes=False) ans = f_lin(3.) - expected = onp.cos(2.) * 3. + expected = onp.cos(onp.sin(2.)) * onp.cos(2.) * 3. + self.assertAllClose(ans, expected, check_dtypes=False) + + sin_calls = [] + cos_calls = [] + sin_impl = lax.sin_p.impl + cos_impl = lax.cos_p.impl + try: + lax.sin_p.def_impl(lambda x: sin_calls.append(1) or sin_impl(x)) + lax.cos_p.def_impl(lambda x: cos_calls.append(1) or cos_impl(x)) + f_lin(3.) + finally: + lax.sin_p.def_impl(sin_impl) + lax.cos_p.def_impl(cos_impl) + self.assertEqual(len(sin_calls), 1) + self.assertEqual(len(cos_calls), 2) + + def test_remat_freevars(self): + def f1(x): + y = 2 * np.sin(x) + z = np.cos(x) * np.sin(y) + return z + + def f2(x): + y = 2 * np.sin(x) + z = api.remat(lambda x: np.cos(x) * np.sin(y))(x) + return z + + ans, f_lin = api.linearize(f2, 2.) + expected, f_lin_expected = api.linearize(f1, 2.) self.assertAllClose(ans, expected, check_dtypes=False) - jaxpr = api.make_jaxpr(f_lin)(3.) - self.assertIn('sin', str(jaxpr)) + ans = f_lin(3.) + expected = f_lin_expected(3.) + self.assertAllClose(ans, expected, check_dtypes=False) def test_remat_grad_python_control_flow(self): @partial(api.remat, concrete=True) @@ -1440,6 +1470,7 @@ def f_yesremat(x): jaxpr = api.make_jaxpr(api.linearize(f_yesremat, 4.)[1])(1.) scan_eqn, = jaxpr.eqns + import ipdb; ipdb.set_trace() self.assertIn(' sin ', str(scan_eqn.params['jaxpr'])) jaxpr = api.make_jaxpr(api.vjp(f_yesremat, 4.)[1])(1.) From ac251046fcbe0a940ab79fe49d58227e61f7c675 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 27 Nov 2019 15:25:49 -0800 Subject: [PATCH 0446/1053] make remat_call partial-eval into one remat_call --- jax/interpreters/ad.py | 46 ++++++++++++++++++------------- jax/interpreters/partial_eval.py | 47 ++++++++------------------------ tests/api_test.py | 3 +- 3 files changed, 39 insertions(+), 57 deletions(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 32b2ba7a9df9..ac5cefc14ac1 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -187,18 +187,21 @@ def is_linear(var): write_primal(eqn.outvars[0], ans) else: (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs + assert not any(is_linear(v) for v in const_vars) if any(is_linear(v) for v in it.chain(eqn.invars, bound_vars)): linear_eqns.append(eqn) - else: - assert not any(is_linear(v) for v in const_vars) - sub_consts = map(read_primal, const_vars) - sub_freevar_vals = map(read_primal, bound_vars) - in_vals = map(read_primal, eqn.invars) - all_args, in_tree_def = tree_flatten((sub_consts, sub_freevar_vals, in_vals)) - fun = hashable_partial(wrap_init(_eval_primals), subjaxpr) - fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) - out_flat = eqn.primitive.bind(fun, *all_args, **eqn.params) - ans = tree_unflatten(out_tree(), out_flat) + elif eqn.primitive is not pe.remat_call_p: + ans = _eval_subjaxpr_primals( + eqn.primitive, subjaxpr, map(read_primal, const_vars), + map(read_primal, bound_vars), map(read_primal, eqn.invars), eqn.params) + map(write_primal, eqn.outvars, ans) + + # we special-case remat_call here because it can be mixed linear / + # nonlinear, so we always evaluate it even if it has a linear part + if eqn.primitive is pe.remat_call_p: + ans = _eval_subjaxpr_primals( + eqn.primitive, subjaxpr, map(read_primal, const_vars), + map(read_primal, bound_vars), map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) ct_env = {} @@ -225,6 +228,13 @@ def is_linear(var): cotangents_out = map(read_cotangent, jaxpr.invars) return freevar_cts, cotangents_out +def _eval_subjaxpr_primals(prim, jaxpr, consts, freevar_vals, in_vals, params): + all_args, in_tree_def = tree_flatten((consts, freevar_vals, in_vals)) + fun = hashable_partial(wrap_init(_eval_primals), jaxpr) + fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) + out_flat = prim.bind(fun, *all_args, **params) + return tree_unflatten(out_tree(), out_flat) + def _eval_primals(jaxpr, consts, freevar_vals, args): primal_env = {} @@ -259,15 +269,13 @@ def is_linear(var): write_primal(eqn.outvars[0], ans) else: (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs - sub_consts = map(read_primal, const_vars) - sub_freevar_vals = map(read_primal, bound_vars) - in_vals = map(read_primal, eqn.invars) - all_args, in_tree_def = tree_flatten((sub_consts, sub_freevar_vals, in_vals)) - fun = hashable_partial(wrap_init(_eval_primals), subjaxpr) - fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) - out_flat = eqn.primitive.bind(fun, *all_args, **eqn.params) - ans = tree_unflatten(out_tree(), out_flat) - map(write_primal, eqn.outvars, ans) + assert not any(is_linear(v) for v in const_vars) + if (eqn.primitive is pe.remat_call_p or + not any(is_linear(v) for v in it.chain(eqn.invars, bound_vars))): + ans = _eval_subjaxpr_primals( + eqn.primitive, subjaxpr, map(read_primal, const_vars), + map(read_primal, bound_vars), map(read_primal, eqn.invars), eqn.params) + map(write_primal, eqn.outvars, ans) return map(read_primal, jaxpr.outvars) class UndefinedPrimal(object): diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 2f3dcf23a035..e70ccd07c5bf 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -507,6 +507,9 @@ def _remat_partial_eval(trace, f, tracers, params): jaxpr_1, jaxpr_2, out_unknowns = partial_eval_jaxpr(typed_jaxpr, in_unknowns, False) num_res = len(jaxpr_1.out_avals) - len(jaxpr_2.out_avals) + # First, we prune the jaxpr to be staged out not to have too many outputs. + typed_jaxpr = _dce_jaxpr(typed_jaxpr, out_unknowns) + # Next, we need values for the outputs that should be known. Since consts # weren't passed through Python for evaluation, we need to evaluate jaxpr_1, # minus the residual outputs that we don't need. When `concrete=True`, as an @@ -521,53 +524,25 @@ def _remat_partial_eval(trace, f, tracers, params): out_pval_consts2 = core.jaxpr_as_fun(jaxpr_1_primals)(*in_consts)[:-num_res or None] out_pvals = map(_reconstruct_pval, out_pvals1, out_pval_consts2, out_unknowns) - # Now that we have out_pvals, the rest is just like JaxprTrace.process_call - # except we stage out two calls: one based on jaxpr_1 for computing the - # residuals (which in the case of reverse-mode ad involves no linear - # variables) and the other based on jaxpr_2 for evaluating everything given - # the residuals (which in reverse-mode ad is linear). + # Now that we have out_pvals, the rest is just like JaxprTrace.process_call. instantiated_tracers = env + instantiated_tracers - num_nonres = len(jaxpr_2.out_avals) - jaxpr_1_res = _dce_jaxpr(jaxpr_1, [False] * num_nonres + [True] * num_res, - prune_outputs=True) - const_tracers = map(trace.new_instantiated_const, consts) - bound_subjaxpr_1 = (jaxpr_1_res.jaxpr, const_tracers, ()) - res_avals = jaxpr_1.out_avals[num_nonres:] - res_tracers = [JaxprTracer(trace, PartialVal((aval, unit)), None) - for aval in res_avals] - tracers_1 = [t if not uk else trace.new_instantiated_literal(unit) - for t, uk in zip(instantiated_tracers, in_unknowns)] - eqn_1 = new_eqn_recipe(tracers_1, res_tracers, remat_call_p, - (bound_subjaxpr_1,), params) - for t in res_tracers: t.recipe = eqn_1 - - bound_subjaxpr_2 = (jaxpr_2.jaxpr, (), ()) + bound_subjaxpr = (typed_jaxpr.jaxpr, const_tracers, ()) out_tracers = [JaxprTracer(trace, out_pval, None) for out_pval in out_pvals] - tracers_2 = [t if uk else trace.new_instantiated_literal(unit) - for t, uk in zip(instantiated_tracers, in_unknowns)] - eqn_2 = new_eqn_recipe(tracers_2 + res_tracers, out_tracers, remat_call_p, - (bound_subjaxpr_2,), params) - for t in out_tracers: t.recipe = eqn_2 + eqn = new_eqn_recipe(instantiated_tracers, out_tracers, remat_call_p, + (bound_subjaxpr,), params) + for t in out_tracers: t.recipe = eqn return out_tracers call_partial_eval_rules[remat_call_p] = _remat_partial_eval -# NOTE to future self: the problem with the above strategy is that the jaxpr -# produced wouldn't be round-trippable, in the sense that by forming two remat -# calls we ensured the first one would be partial-eval'd away when we tried to -# round-trip e.g. for partial eval of scan. -def _dce_jaxpr(typed_jaxpr, outputs, prune_outputs=False): +def _dce_jaxpr(typed_jaxpr, outputs): # This dead-code elimination is pretty rudimentary, and in particular doesn't # nontrivially DCE through scan, call, or other higher-order primitives. # TODO(mattjj): better DCE jaxpr = typed_jaxpr.jaxpr outvars, out_avals = jaxpr.outvars, typed_jaxpr.out_avals - if prune_outputs: - out_pairs = [(var, aval) for var, aval, output - in zip(outvars, out_avals, outputs) if output] - else: - out_pairs = [(var, aval) if output else (core.unitvar, core.abstract_unit) - for var, aval, output in zip(outvars, out_avals, outputs)] + out_pairs = [(var, aval) if output else (core.unitvar, core.abstract_unit) + for var, aval, output in zip(outvars, out_avals, outputs)] new_outvars, new_out_avals = unzip2(out_pairs) needed_vars = set(new_outvars) diff --git a/tests/api_test.py b/tests/api_test.py index f6b541e74bac..b837baa0fc1f 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1470,8 +1470,7 @@ def f_yesremat(x): jaxpr = api.make_jaxpr(api.linearize(f_yesremat, 4.)[1])(1.) scan_eqn, = jaxpr.eqns - import ipdb; ipdb.set_trace() - self.assertIn(' sin ', str(scan_eqn.params['jaxpr'])) + self.assertIn(' cos ', str(scan_eqn.params['jaxpr'])) jaxpr = api.make_jaxpr(api.vjp(f_yesremat, 4.)[1])(1.) scan_eqn, = jaxpr.eqns From 115d365a92ef038426b5d2777943948463c2725b Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 27 Nov 2019 19:15:53 -0800 Subject: [PATCH 0447/1053] raise error if we do concrete aval FLOPs w/o remat --- jax/interpreters/partial_eval.py | 26 +++++++++++++++++++++++++- jax/lax/lax.py | 4 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index e70ccd07c5bf..6e7430f74e9d 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -18,6 +18,8 @@ import itertools as it from collections import namedtuple, Counter, defaultdict +import contextlib +import threading from weakref import ref import numpy as onp @@ -489,7 +491,12 @@ def _remat_partial_eval(trace, f, tracers, params): # Using the instantiated tracers, run call_bind like JaxprTrace.process_call. in_pvs, in_consts = unzip2(t.pval for t in instantiated_tracers) fun, aux = partial_eval(f, trace, in_pvs) - out_flat = remat_call_p.bind(fun, *in_consts, **params) + if concrete: + # TODO(mattjj): remove `remat_context` when confident no accidental FLOPs + with remat_context(): + out_flat = remat_call_p.bind(fun, *in_consts, **params) + else: + out_flat = remat_call_p.bind(fun, *in_consts, **params) out_pvs, jaxpr, env = aux() env = map(trace.full_raise, env) out_pval_consts1, consts = split_list(out_flat, [len(out_flat)-len(jaxpr.constvars)]) @@ -568,6 +575,23 @@ def _reconstruct_pval(pval1, const2, unknown): else: return PartialVal((None, const2)) +# TODO(mattjj): for https://github.com/google/jax/pull/1749 we allowed +# standard_abstract_eval to perform concrete evaluation (i.e. FLOPs), but we +# don't think it should happen except for in a remat context +@contextlib.contextmanager +def remat_context(): + try: + prev_state = _thread_local_state.remat + _thread_local_state.remat = True + yield + finally: + _thread_local_state.remat = prev_state + +class _ThreadLocalState(threading.local): + def __init__(self): + self.remat = False +_thread_local_state = _ThreadLocalState() + def move_binders_to_front(typed_jaxpr, to_move): assert not typed_jaxpr.jaxpr.constvars and not typed_jaxpr.jaxpr.freevars diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 0c84b1dce1cd..a72e1f013119 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1487,6 +1487,10 @@ def standard_abstract_eval(prim, shape_rule, dtype_rule, *args, **kwargs): least_specialized = _max( map(type, args), key=operator.attrgetter('array_abstraction_level')) if least_specialized is ConcreteArray: + msg = ("If you see this error, please let us know by opening an issue at\n" + "https://github.com/google/jax/issues \n" + "since we thought this was unreachable!") + assert pe._thread_local_state.remat, msg return ConcreteArray(prim.impl(*[x.val for x in args], **kwargs)) elif least_specialized is ShapedArray: return ShapedArray(shape_rule(*args, **kwargs), dtype_rule(*args, **kwargs)) From 0cb3b433b516efd94046d8346ad397a04e5521fa Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 28 Nov 2019 07:34:40 +0100 Subject: [PATCH 0448/1053] Change in how we print sorted params for eqns --- jax/api.py | 3 ++- jax/core.py | 2 +- jax/pprint_util.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index 23ce13d6ffe6..c3414c116b44 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1322,7 +1322,8 @@ def jaxpr_maker(*args, **kwargs): jax_args, in_tree = tree_flatten((args, kwargs)) jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) in_pvals = map(pv_like, jax_args) - jaxpr, out_pvals, consts = pe.trace_to_jaxpr(jaxtree_fun, in_pvals, instantiate=True) + jaxpr, out_pvals, consts = pe.trace_to_jaxpr(jaxtree_fun, in_pvals, + instantiate=True) out_avals = map(raise_to_shaped, unzip2(out_pvals)[0]) in_avals = tuple(raise_to_shaped(in_aval) for in_aval, _ in in_pvals) typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) diff --git a/jax/core.py b/jax/core.py index 2a5d601ca492..22f038b4be35 100644 --- a/jax/core.py +++ b/jax/core.py @@ -652,7 +652,7 @@ def pp_eqn(eqn): >> pp(' [ {} ; {} ]'.format(pp_vars(const_vars), pp_vars(bound_vars)))) return (pp('{} = '.format(lhs)) >> - pp(eqn.primitive.name) >> pp_kv_pairs(eqn.params) + pp(eqn.primitive.name) >> pp_kv_pairs(sorted(eqn.params.items())) >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr def pp_jaxpr(jaxpr): diff --git a/jax/pprint_util.py b/jax/pprint_util.py index 1c664bfdd25f..62e2afb539e1 100644 --- a/jax/pprint_util.py +++ b/jax/pprint_util.py @@ -64,7 +64,7 @@ def vcat(ps): def pp_kv_pairs(kv_pairs): if kv_pairs: - kv_pairs = vcat([pp('{}='.format(k)) >> pp(kv_pairs[k]) for k in sorted(kv_pairs)]) + kv_pairs = vcat([pp('{}='.format(k)) >> pp(v) for k, v in kv_pairs]) return pp('[ ') >> kv_pairs >> pp(' ]') else: return pp('') From a47f365c924269029b2366870ebe69020ddf7785 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 28 Nov 2019 08:48:10 +0100 Subject: [PATCH 0449/1053] Cleaned some test warnings. Specifically: * lax_control_flow_test.py:...: DeprecationWarning: invalid escape sequence \( * Deprecated assertRaisesRegexp, replace with assertRaisesRegex --- tests/api_test.py | 20 ++++++++++---------- tests/lax_control_flow_test.py | 24 ++++++++++++------------ tests/lax_test.py | 8 ++++---- tests/pmap_test.py | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/tests/api_test.py b/tests/api_test.py index 18730e65ce96..c0f43b2c2252 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -157,11 +157,11 @@ def test_bad_input(self): def f(x): return x - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, ".* 'foo' of type <.*'str'> is not a valid JAX type", lambda: grad(f)("foo")) - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, ".* 'foo' of type <.*'str'> is not a valid JAX type", lambda: jit(f)("foo")) @@ -213,7 +213,7 @@ def test_dot_mismatch(self): def f(x, y): return np.dot(x, y) - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "Incompatible shapes for dot: got \\(3L?,\\) and \\(4L?,\\).", lambda: grad(f)(onp.zeros(3), onp.zeros(4))) @@ -236,7 +236,7 @@ def f(x, n): return x assert jit(f, static_argnums=(1,))(0, 5) == 10 - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "('JaxprTracer' object cannot be interpreted as an integer" "|Abstract value passed to .*)", @@ -245,7 +245,7 @@ def f(x, n): def test_casts(self): for castfun in [float, complex, hex, oct] + list(six.integer_types): f = lambda x: castfun(x) - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "('JaxprTracer' object cannot be interpreted as an integer" "|Abstract value passed to .*)", lambda: jit(f)(0)) @@ -812,7 +812,7 @@ def test_devicearray_repr(self): def test_devicearray_delete(self): x = device_put(1.) x.delete() - self.assertRaisesRegexp(ValueError, "DeviceValue has been deleted.", + self.assertRaisesRegex(ValueError, "DeviceValue has been deleted.", lambda: repr(x)) def test_devicearray_block_until_ready(self): @@ -964,7 +964,7 @@ def f(a, b, c): def test_grad_of_int_errors(self): dfn = grad(lambda x: x ** 2) - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "Primal inputs to reverse-mode differentiation must be of float or " "complex type, got type int..", lambda: dfn(3)) @@ -1023,7 +1023,7 @@ def test_jit_device(self): self.assertEqual(x.device_buffer.device(), device) def test_jit_of_noncallable(self): - self.assertRaisesRegexp(TypeError, "Expected a callable value.*", + self.assertRaisesRegex(TypeError, "Expected a callable value.*", lambda: api.jit(3)) def test_issue_1062(self): @@ -1159,7 +1159,7 @@ def vjp(x_tangent): def test_vmap_in_axes_tree_prefix_error(self): # https://github.com/google/jax/issues/795 - self.assertRaisesRegexp( + self.assertRaisesRegex( ValueError, "axes specification must be a tree prefix of the corresponding " r"value, got specification \(0, 0\) for value " @@ -1295,7 +1295,7 @@ def test_grad_without_enough_args_error_message(self): # https://github.com/google/jax/issues/1696 def f(x, y): return x + y df = api.grad(f, argnums=0) - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "differentiating with respect to argnums=0 requires at least 1 " "positional arguments to be passed by the caller, but got only 0 " diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 9d9338b0f986..fc4fd99b633c 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -202,12 +202,12 @@ def testWhileTypeErrors(self): with self.assertRaisesRegex(TypeError, re.escape("body_fun output and input must have same type structure, got PyTreeDef(tuple, [*,*]) and *.")): lax.while_loop(lambda c: True, lambda c: (1., 1.), 0.) - with self.assertRaisesRegex( + with self.assertRaisesWithLiteralMatch( TypeError, - "body_fun output and input must have identical types, got\\n" - "ShapedArray\(bool\[\]\)\\n" - "and\\n" - "ShapedArray\(float32\[\]\)."): + "body_fun output and input must have identical types, got\n" + "ShapedArray(bool[])\n" + "and\n" + "ShapedArray(float32[])."): lax.while_loop(lambda c: True, lambda c: True, np.float32(0.)) def testNestedWhileWithDynamicUpdateSlice(self): @@ -530,12 +530,12 @@ def testCondTypeErrors(self): re.escape("true_fun and false_fun output must have same type structure, got * and PyTreeDef(tuple, [*,*]).")): lax.cond(True, 1., lambda top: 1., 2., lambda fop: (2., 2.)) - with self.assertRaisesRegex( + with self.assertRaisesWithLiteralMatch( TypeError, "true_fun and false_fun output must have identical types, got\n" - "ShapedArray\(float32\[1\]\)\n" + "ShapedArray(float32[1])\n" "and\n" - "ShapedArray\(float32\[\]\)."): + "ShapedArray(float32[])."): lax.cond(True, 1., lambda top: np.array([1.], np.float32), 2., lambda fop: np.float32(1.)) @@ -915,12 +915,12 @@ def testScanTypeErrors(self): with self.assertRaisesRegex(TypeError, re.escape("scan carry output and input must have same type structure, got * and PyTreeDef(None, []).")): lax.scan(lambda c, x: (0, x), None, a) - with self.assertRaisesRegex( + with self.assertRaisesWithLiteralMatch( TypeError, "scan carry output and input must have identical types, got\n" - "ShapedArray\(int32\[\]\)\\n" - "and\\n" - "ShapedArray\(float32\[\]\)."): + "ShapedArray(int32[])\n" + "and\n" + "ShapedArray(float32[])."): lax.scan(lambda c, x: (np.int32(0), x), np.float32(1.0), a) with self.assertRaisesRegex(TypeError, re.escape("scan carry output and input must have same type structure, got * and PyTreeDef(tuple, [*,*]).")): diff --git a/tests/lax_test.py b/tests/lax_test.py index a799f953155d..91e4535710b9 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1485,19 +1485,19 @@ def testReshapeWithUnusualShapes(self): ans = lax.reshape(onp.ones((3,), onp.float32), (lax.add(1, 2), 1)) self.assertAllClose(ans, onp.ones((3, 1), onp.float32), check_dtypes=True) - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "Shapes must be 1D sequences of concrete values of integer type.*", lambda: lax.reshape(onp.ones(3,), (onp.array([3, 1]),))) - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "Shapes must be 1D sequences of concrete values of integer type.*", lambda: lax.reshape(onp.ones(3,), (1.5, 2.0))) @jtu.skip_on_devices("tpu") # S16 not supported on TPU def testDynamicSliceTypeErrors(self): - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "index arguments to dynamic_slice must be integers of the same type", lambda: lax.dynamic_slice(onp.ones((3, 4), dtype=onp.float32), @@ -1505,7 +1505,7 @@ def testDynamicSliceTypeErrors(self): @jtu.skip_on_devices("tpu") # S16 not supported on TPU def testDynamicUpdateSliceTypeErrors(self): - self.assertRaisesRegexp( + self.assertRaisesRegex( TypeError, "index arguments to dynamic_update_slice must be integers of the same " "type", diff --git a/tests/pmap_test.py b/tests/pmap_test.py index a2c9c51e256f..6bba86d88e41 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -95,7 +95,7 @@ def sum_and_broadcast(x, axis): def testMismatchedAxisSizes(self): n = xla_bridge.device_count() f = pmap(lambda x, y: x + y) - self.assertRaisesRegexp( + self.assertRaisesRegex( ValueError, "Axis size .* does not match leading dimension of shape .*", lambda: f(onp.random.randn(n), onp.random.randn(n - 1))) From 3b97c5f792c0053b283eec77c7e638a2907f8f15 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 28 Nov 2019 09:00:55 +0100 Subject: [PATCH 0450/1053] Updated uses of make_jaxpr in new code --- tests/api_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/api_test.py b/tests/api_test.py index 174b90e82349..fa72da3ad4b9 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1509,11 +1509,11 @@ def f_yesremat(x): self.assertAllClose(ans, expected, check_dtypes=False) jaxpr = api.make_jaxpr(api.linearize(f_yesremat, 4.)[1])(1.) - scan_eqn, = jaxpr.eqns + scan_eqn, = jaxpr.jaxpr.eqns self.assertIn(' cos ', str(scan_eqn.params['jaxpr'])) jaxpr = api.make_jaxpr(api.vjp(f_yesremat, 4.)[1])(1.) - scan_eqn, = jaxpr.eqns + scan_eqn, = jaxpr.jaxpr.eqns self.assertIn(' cos ', str(scan_eqn.params['jaxpr'])) def test_remat_no_redundant_flops(self): From 0ebf8488ae53737f77edc35bae04fc3e53e90a7a Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 28 Nov 2019 11:54:29 -0800 Subject: [PATCH 0451/1053] Implement np.flip with axis = None (#1783) * super minimal starter code * Update optimizers.py * implement flip with axis = None --- jax/numpy/lax_numpy.py | 4 +++- tests/lax_numpy_test.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index bd007fb4e089..3b5355a0c229 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -751,7 +751,9 @@ def rot90(m, k=1, axes=(0, 1)): @_wraps(onp.flip) -def flip(m, axis): +def flip(m, axis=None): + if axis is None: + return lax.rev(m, list(range(len(m.shape)))) return lax.rev(m, [_canonicalize_axis(axis, len(m.shape))]) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 6051c9dd0232..33bac518b12d 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1487,7 +1487,7 @@ def testTracingPrimitiveWithNoTranslationErrorMessage(self): "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "axis": axis} for shape in [(3,), (2, 3)] for dtype in default_dtypes - for axis in range(-len(shape), len(shape)) # Test negative axes + for axis in list(range(-len(shape), len(shape))) + [None] # Test negative axes for rng_factory in [jtu.rand_default])) def testFlip(self, shape, dtype, axis, rng_factory): rng = rng_factory() From 7ec2ac58ca3fb2142dc1bf2b4eb5335f119273cc Mon Sep 17 00:00:00 2001 From: fehiepsi Date: Sun, 1 Dec 2019 09:44:45 -0500 Subject: [PATCH 0452/1053] not use custom transform for gamma sampler --- jax/random.py | 52 ++++++++++++++++++++++++++++++++++---------- tests/random_test.py | 8 +++++++ 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/jax/random.py b/jax/random.py index 92806f1c7308..941a0ddec2e8 100644 --- a/jax/random.py +++ b/jax/random.py @@ -41,7 +41,9 @@ from jax import abstract_arrays from jax.scipy.special import logit from jax.scipy.linalg import cholesky +from jax.interpreters import ad from jax.interpreters import batching +from jax.interpreters import partial_eval as pe from jax.interpreters import xla @@ -878,18 +880,46 @@ def _case4(zagf): def _gamma_grad(sample, a): samples = np.reshape(sample, -1) alphas = np.reshape(a, -1) - grads = vmap(_gamma_grad_one)(samples, alphas) + if np.size(alphas) == 1: + grads = _gamma_grad_one(samples[0], alphas[0]) + else: + # TODO: benchmark execute time against grads = vmap(_gamma_grad_one)(samples, alphas) + grads = lax.map(lambda args: _gamma_grad_one(*args), (samples, alphas)) return grads.reshape(onp.shape(a)) -@custom_transforms def _gamma_impl(key, a): - alphas = np.reshape(a, -1) - keys = split(key, onp.size(alphas)) - samples = vmap(_gamma_one)(keys, alphas) - return np.reshape(samples, onp.shape(a)) - -defjvp(_gamma_impl, None, - lambda tangent, ans, key, a, **kwargs: tangent * _gamma_grad(ans, a)) + if key.ndim == 2: # batch of keys and alphas + size = np.size(a[0]) + if size > 1: + key = lax.map(lambda k: split(k, size), key) + else: + size = np.size(a) + if size > 1: + key = split(key, size) + alphas = np.reshape(a, -1) + keys = np.reshape(key, (-1, 2)) + if np.size(alphas) == 1: + samples = _gamma_one(keys[0], alphas[0]) + else: + # XXX in GPU, using lax.map is slower than using vmap if alphas.size > 50000 + # but that usage case is rare and can be resolved by vectorizing gamma sampler + samples = lax.map(lambda args: _gamma_one(*args), (keys, alphas)) + return np.reshape(samples, np.shape(a)) + +def _gamma_batching_rule(batched_args, batch_dims): + k, a = batched_args + bk, ba = batch_dims + size = next(t.shape[i] for t, i in zip(batched_args, batch_dims) if i is not None) + k = batching.bdim_at_front(k, bk, size) + a = batching.bdim_at_front(a, ba, size) + return random_gamma_p.bind(k, a), 0 + +random_gamma_p = core.Primitive('random_gamma') +random_gamma_p.def_impl(_gamma_impl) # partial(xla.apply_primitive, random_gamma_p)) +random_gamma_p.def_abstract_eval(lambda key, a: abstract_arrays.raise_to_shaped(a)) +ad.defjvp2(random_gamma_p, None, lambda tangent, ans, key, a, **kwargs: tangent * _gamma_grad(ans, a)) +xla.translations[random_gamma_p] = xla.lower_fun(_gamma_impl, instantiate=True) +batching.primitive_batchers[random_gamma_p] = _gamma_batching_rule def gamma(key, a, shape=None, dtype=onp.float64): """Sample Gamma random values with given shape and float dtype. @@ -911,7 +941,7 @@ def gamma(key, a, shape=None, dtype=onp.float64): dtype = dtypes.canonicalize_dtype(dtype) return _gamma(key, a, shape, dtype) -@partial(jit, static_argnums=(2, 3)) +# @partial(jit, static_argnums=(2, 3)) def _gamma(key, a, shape, dtype): if shape is None: shape = onp.shape(a) @@ -921,7 +951,7 @@ def _gamma(key, a, shape, dtype): a = lax.convert_element_type(a, dtype) if onp.shape(a) != shape: a = np.broadcast_to(a, shape) - return _gamma_impl(key, a) + return random_gamma_p.bind(key, a) def gumbel(key, shape=(), dtype=onp.float64): diff --git a/tests/random_test.py b/tests/random_test.py index f025626e5a32..3ace0c05c3fd 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -27,10 +27,12 @@ import scipy.stats from jax import api +from jax import grad from jax import lax from jax import numpy as np from jax import random from jax import test_util as jtu +from jax import vmap from jax.interpreters import xla from jax.config import config @@ -443,6 +445,12 @@ def testIssue756(self): else: self.assertEqual(onp.result_type(w), onp.float32) + def testIssue1789(self): + def f(x): + return random.gamma(random.PRNGKey(0), x) + + grad(lambda x: np.sum(vmap(f)(x)))(np.ones(2)) + def testNoOpByOpUnderHash(self): def fail(*args, **kwargs): assert False apply_primitive, xla.apply_primitive = xla.apply_primitive, fail From 6d2eb6790ee4ba7b6fd9d6117668b42e54c17e55 Mon Sep 17 00:00:00 2001 From: Srinivas Vasudevan Date: Sun, 1 Dec 2019 10:57:03 -0800 Subject: [PATCH 0453/1053] Add betaln, a wrapper for the Beta function (scipy.special.betaln). (#1788) * Add betaln, a wrapper for the Beta function (scipy.special.betaln). * Use infix operators for addition and multiplication. --- jax/scipy/special.py | 8 +++++++- jax/scipy/stats/beta.py | 5 ++--- tests/lax_scipy_test.py | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index 975c0c775e98..e1ddd7bfb4bf 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -32,6 +32,12 @@ def gammaln(x): return lax.lgamma(x) +@_wraps(osp_special.betaln) +def betaln(x, y): + x, y = _promote_args_like(osp_special.betaln, x, y) + return lax.lgamma(x) + lax.lgamma(y) - lax.lgamma(x + y) + + @_wraps(osp_special.digamma, update_doc=False) def digamma(x): x, = _promote_args_like(osp_special.digamma, x) @@ -529,4 +535,4 @@ def i0e(x): @_wraps(osp_special.i1e) def i1e(x): - return lax.bessel_i1e(x) \ No newline at end of file + return lax.bessel_i1e(x) diff --git a/jax/scipy/stats/beta.py b/jax/scipy/stats/beta.py index 660aba207e2d..244bce67a9d3 100644 --- a/jax/scipy/stats/beta.py +++ b/jax/scipy/stats/beta.py @@ -22,15 +22,14 @@ from ... import lax from ...numpy.lax_numpy import (_promote_args_like, _constant_like, _wraps, where, inf, logical_or) -from ..special import gammaln +from ..special import betaln @_wraps(osp_stats.beta.logpdf, update_doc=False) def logpdf(x, a, b, loc=0, scale=1): x, a, b, loc, scale = _promote_args_like(osp_stats.beta.logpdf, x, a, b, loc, scale) one = _constant_like(x, 1) - shape_term_tmp = lax.add(gammaln(a), gammaln(b)) - shape_term = lax.sub(gammaln(lax.add(a, b)), shape_term_tmp) + shape_term = lax.neg(betaln(a, b)) y = lax.div(lax.sub(x, loc), scale) log_linear_term = lax.add(lax.mul(lax.sub(a, one), lax.log(y)), lax.mul(lax.sub(b, one), lax.log1p(lax.neg(y)))) diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 941c1b56977d..6ed7439f4abe 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -59,6 +59,7 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): JAX_SPECIAL_FUNCTION_RECORDS = [ # TODO: digamma has no JVP implemented. + op_record("betaln", 2, float_dtypes, jtu.rand_positive, False), op_record("digamma", 1, float_dtypes, jtu.rand_positive, False), op_record("erf", 1, float_dtypes, jtu.rand_small_positive, True), op_record("erfc", 1, float_dtypes, jtu.rand_small_positive, True), From f0d93333791db927a98e8029878c4c027b97bb49 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 2 Dec 2019 14:21:10 -0500 Subject: [PATCH 0454/1053] Document functions in jax.nn. (#1795) --- docs/jax.nn.rst | 1 + jax/nn/functions.py | 171 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 160 insertions(+), 12 deletions(-) diff --git a/docs/jax.nn.rst b/docs/jax.nn.rst index bbce4931569d..2f024e6617ac 100644 --- a/docs/jax.nn.rst +++ b/docs/jax.nn.rst @@ -30,6 +30,7 @@ Activation functions celu selu gelu + glu Other functions --------------- diff --git a/jax/nn/functions.py b/jax/nn/functions.py index a3242fd30c7b..a6d3f9aeaed0 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -27,44 +27,165 @@ # activations -def relu(x): return np.maximum(x, 0) -def softplus(x): return np.logaddexp(x, 0) -def soft_sign(x): return x / (np.abs(x) + 1) -def sigmoid(x): return expit(x) -def swish(x): return x * sigmoid(x) -def log_sigmoid(x): return -softplus(-x) +def relu(x): + r"""Rectified linear unit activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{relu}(x) = \max(x, 0) + """ + return np.maximum(x, 0) + +def softplus(x): + r"""Softplus activation function. + + Computes the element-wise function + + .. math:: + \mathrm{softplus}(x) = \log(1 + e^x) + """ + return np.logaddexp(x, 0) + +def soft_sign(x): + r"""Soft-sign activation function. + + Computes the element-wise function + + .. math:: + \mathrm{soft\_sign}(x) = \frac{x}{|x| + 1} + """ + return x / (np.abs(x) + 1) + +def sigmoid(x): + r"""Sigmoid activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{sigmoid}(x) = \frac{1}{1 + e^{-x}} + """ + return expit(x) + +def swish(x): + r"""Swish activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{swish}(x) = x \cdot \mathrm{sigmoid}(x) = \frac{x}{1 + e^{-x}} + """ + return x * sigmoid(x) + +def log_sigmoid(x): + r"""Log-sigmoid activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{log\_sigmoid}(x) = \log(\mathrm{sigmoid}(x)) = -\log(1 + e^{-x}) + """ + return -softplus(-x) def elu(x, alpha=1.0): + r"""Exponential linear unit activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{elu}(x) = \begin{cases} + x, & x > 0\\ + \alpha \exp(x - 1), & x \le 0 + \end{cases} + """ safe_x = np.where(x > 0, 0., x) return np.where(x > 0, x, alpha * np.expm1(safe_x)) def leaky_relu(x, negative_slope=1e-2): + r"""Leaky rectified linear unit activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{leaky\_relu}(x) = \begin{cases} + x, & x \ge 0\\ + \alpha x, & x < 0 + \end{cases} + + where :math:`\alpha` = :code:`negative_slope`. + """ return np.where(x >= 0, x, negative_slope * x) def hard_tanh(x): + r"""Hard :math:`\mathrm{tanh}` activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{hard\_tanh}(x) = \begin{cases} + -1, & x < -1\\ + x, & 0 \le x \le 1\\ + 1, & 1 < x + \end{cases} + """ return np.where(x > 1, 1, np.where(x < -1, -1, x)) def celu(x, alpha=1.0): - """Continuously-differentiable exponential linear unit activation""" + r"""Continuously-differentiable exponential linear unit activation. + + Computes the element-wise function: + + .. math:: + \mathrm{celu}(x) = \begin{cases} + x, & x > 0\\ + \alpha \exp(\frac{x}{\alpha} - 1), & x \le 0 + \end{cases} + + For more information, see + `Continuously Differentiable Exponential Linear Units + `_.""" return np.where(x > 0, x, alpha * np.expm1(x / alpha)) def selu(x): - """Scaled exponential linear unit activation""" + r"""Scaled exponential linear unit activation. + + Computes the element-wise function: + + .. math:: + \mathrm{selu}(x) = \lambda \begin{cases} + x, & x > 0\\ + \alpha e^x - \alpha, & x \le 0 + \end{cases} + + where :math:`\lambda = 1.0507009873554804934193349852946` and + :math:`\alpha = 1.6732632423543772848170429916717`. + + For more information, see + `Self-Normalizing Neural Networks + `_. + """ alpha = 1.6732632423543772848170429916717 scale = 1.0507009873554804934193349852946 return scale * elu(x, alpha) def gelu(x): - """GELU activation function. + r"""Gaussian error linear unit activation function. + + Computes the element-wise function: + + .. math:: + \mathrm{gelu}(x) = \frac{x}{2} \left(1 + \mathrm{tanh} \left( + \sqrt{\frac{2}{\pi}} \left(x + 0.044715 x^3 \right) \right) \right) We explicitly use the approximation rather than the exact formulation for - speed. See: https://arxiv.org/abs/1606.08415 Section 2. + speed. For more information, see `Gaussian Error Linear Units (GELUs) + `_, section 2. """ cdf = 0.5 * (1.0 + np.tanh((np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))) return x * cdf def glu(x, axis=-1): - """Gated linear unit activation""" + """Gated linear unit activation function.""" size = x.shape[axis] assert size % 2 == 0, "axis size must be divisible by 2" return x[..., :size] * sigmoid(x[..., size:]) @@ -72,15 +193,41 @@ def glu(x, axis=-1): # other functions def log_softmax(x, axis=-1): + r"""Log-Softmax function. + + Computes the logarithm of the :code:`softmax` function, which rescales + elements to the range :math:`[-\infty, 0)`. + + .. math :: + \mathrm{log\_softmax}(x) = \log \left( \frac{\exp(x_i)}{\sum_j \exp(x_j)} + \right) + + Args: + axis: the axis or axes along which the :code:`log_softmax` should be + computed. Either an integer or a tuple of integers. + """ shifted = x - x.max(axis, keepdims=True) return shifted - np.log(np.sum(np.exp(shifted), axis, keepdims=True)) def softmax(x, axis=-1): + r"""Softmax function. + + Computes the function which rescales elements to the range :math:`[0, 1]` + such that the elements along :code:`axis` sum to :math:`1`. + + .. math :: + \mathrm{softmax}(x) = \frac{\exp(x_i)}{\sum_j \exp(x_j)} + + Args: + axis: the axis or axes along which the softmax should be computed. The + softmax output summed across these dimensions should sum to :math:`1`. + Either an integer or a tuple of integers. + """ unnormalized = np.exp(x - x.max(axis, keepdims=True)) return unnormalized / unnormalized.sum(axis, keepdims=True) def normalize(x, axis=-1, mean=None, variance=None, epsilon=1e-5): - """Normalize an array by subtracting mean and dividing by sqrt(var).""" + """Normalizes an array by subtracting mean and dividing by sqrt(var).""" if mean is None: mean = np.mean(x, axis, keepdims=True) if variance is None: From f3c8af49e78b04542535824be9e8d3c95b0cc778 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 2 Dec 2019 14:43:43 -0500 Subject: [PATCH 0455/1053] Fix bugs in handling of convolutions whose LHS has spatial size 0. (#1794) * Fix bugs in handling of convolutions whose LHS has spatial size 0. * Use onp.shape to compute shapes. --- jax/lax/lax.py | 7 +++++-- jax/test_util.py | 4 ++++ tests/lax_test.py | 16 +++++++++------- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index a72e1f013119..d2d4a8bc839b 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1974,7 +1974,9 @@ def _conv_general_dilated_transpose_rhs( dimension_numbers, feature_group_count, lhs_shape, rhs_shape, precision): assert type(dimension_numbers) is ConvDimensionNumbers - + if onp.size(g) == 0: + # Avoids forming degenerate convolutions where the RHS has spatial size 0. + return ad_util.zero lhs_sdims, rhs_sdims, out_sdims = map(_conv_sdims, dimension_numbers) lhs_trans, rhs_trans, out_trans = map(_conv_spec_transpose, dimension_numbers) if feature_group_count > 1: @@ -4239,7 +4241,8 @@ def _dilate_shape(shape, dilation): msg = "All dilations must be positive, got {}." raise TypeError(msg.format(dilation)) dilation = (1,) * (len(shape) - len(dilation)) + tuple(dilation) - return onp.multiply(dilation, onp.subtract(shape, 1)) + 1 + return onp.where(shape == 0, 0, + onp.multiply(dilation, onp.subtract(shape, 1)) + 1) diff --git a/jax/test_util.py b/jax/test_util.py index 36dbd19810b7..f82e3fb8ffca 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -640,6 +640,10 @@ def wrapped_fun(*args): python_should_be_executing = True python_ans = fun(*args) + python_shapes = tree_map(lambda x: onp.shape(x), python_ans) + onp_shapes = tree_map(lambda x: onp.shape(onp.asarray(x)), python_ans) + self.assertEqual(python_shapes, onp_shapes) + cache_misses = xla.xla_primitive_callable.cache_info().misses python_ans = fun(*args) self.assertEqual( diff --git a/tests/lax_test.py b/tests/lax_test.py index 91e4535710b9..1c3965a14655 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -451,12 +451,13 @@ def numpy_fun(lhs, rhs): "rhs_dilation": rhs_dilation, "dimension_numbers": dim_nums, "perms": perms, "rng_factory": rng_factory} for lhs_shape, rhs_shape in [ - ((b, i, 9, 10), (j, i, 4, 5)) + ((b, i, 9, w), (j, i, 4, 5)) + for w in [0, 10] for b, i, j in itertools.product([2, 3], repeat=3)] for dtype in float_dtypes for strides in [(1, 1), (2, 1)] - for padding in [((1, 2), (2, 0))] + for padding in [((1, 2), (2, 0)), ((10, 8), (7, 13))] for lhs_dilation, rhs_dilation in itertools.product( - [(1, 1), (1, 2)], repeat=2) + [(1, 1), (1, 2), (1, 4)], repeat=2) for rng_factory in [jtu.rand_small] for dim_nums, perms in [ (("NCHW", "OIHW", "NCHW"), ([0, 1, 2, 3], [0, 1, 2, 3])), @@ -1881,20 +1882,21 @@ def testConvWithGeneralPaddingGrad(self, lhs_shape, rhs_shape, dtype, strides, "strides": strides, "padding": padding, "lhs_dil": lhs_dil, "rhs_dil": rhs_dil, "rng_factory": rng_factory, "dimension_numbers": dim_nums, "perms": perms, "feature_group_count": feature_group_count} - for lhs_shape, rhs_shape, all_strides, all_pads, lhs_dils, rhs_dils in [ - ((b, i, 6, 7), # lhs_shape + for lhs_shapes, rhs_shape, all_strides, lhs_dils, rhs_dils in [ + ([(b, i, 6, 7), (b, i, 0, 4)], # lhs_shape (j, i, 1, 2), # rhs_shape [(1, 1), (1, 2), (2, 1)], # strides - [((0, 0), (0, 0)), ((1, 0), (0, 1)), ((0, -1), (0, 0))], # pads [(1, 1), (2, 1)], # lhs_dils [(1, 1), (2, 2)]) # rhs_dils for b, i, j in itertools.product([1, 2], repeat=3)] + for lhs_shape in lhs_shapes for feature_group_count in [1, 2] for strides in all_strides for rhs_dil in rhs_dils for lhs_dil in lhs_dils for dtype in float_dtypes - for padding in all_pads + for padding in ([((0, 0), (0, 0)), ((1, 0), (0, 1))] + + ([((0, -1), (0, 0))] if lhs_shape[2] != 0 else [])) for dim_nums, perms in [ (("NCHW", "OIHW", "NCHW"), ([0, 1, 2, 3], [0, 1, 2, 3])), (("NHWC", "HWIO", "NHWC"), ([0, 2, 3, 1], [2, 3, 1, 0])), From 8782860d0bdc84a52ee4d33db3d48abe3ec34892 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 2 Dec 2019 15:01:49 -0500 Subject: [PATCH 0456/1053] Relax test tolerances to fix test flakiness. --- tests/lax_test.py | 2 +- tests/scipy_stats_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index 1c3965a14655..f828c54504a2 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1908,7 +1908,7 @@ def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, dimension_numbers, perms, feature_group_count, rng_factory): rng = rng_factory() - tol = {dtypes.bfloat16: 3e-1, onp.float16: 5e-1, onp.float32: 1e-4} + tol = {dtypes.bfloat16: 1e-0, onp.float16: 5e-1, onp.float32: 1e-4} # permute shapes to match dim_spec, scale by feature_group_count lhs_perm, rhs_perm = perms diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index c23f9c2c2cf3..4be7503cff74 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -98,7 +98,7 @@ def args_maker(): self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, tol=1e-3) - self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True, rtol=2e-5) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True, rtol=1e-4) @genNamedParametersNArgs(3, jtu.rand_default) def testCauchyLogPdf(self, rng_factory, shapes, dtypes): From 441ad4dbbdc5f38d9f61017621228d7dbf994a57 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 2 Dec 2019 15:18:04 -0500 Subject: [PATCH 0457/1053] Relax test tolerances for scipy test. --- tests/lax_scipy_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 6ed7439f4abe..f6cf1c16e3ca 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -129,7 +129,7 @@ def testScipySpecialFun(self, scipy_op, lax_op, rng_factory, shapes, dtypes, args = args_maker() self.assertAllClose(scipy_op(*args), lax_op(*args), atol=1e-3, rtol=1e-3, check_dtypes=False) - self._CompileAndCheck(lax_op, args_maker, check_dtypes=True) + self._CompileAndCheck(lax_op, args_maker, check_dtypes=True, rtol=1e-5) if test_autodiff: jtu.check_grads(lax_op, args, order=1, atol=1e-3, rtol=3e-3, eps=1e-3) From f6da1fcc7a0d054f1081709d70f29bc0aea3f8e6 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 2 Dec 2019 12:55:22 -0800 Subject: [PATCH 0458/1053] Use a simpler code path for np.pad with mode='wrap' (#1781) This code path avoids any calls to lax.rev(), and seems to make a small but measurable performance improvement for some of use cases. --- jax/numpy/lax_numpy.py | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 3b5355a0c229..8764000dfeef 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -80,6 +80,7 @@ def removechars(s, chars): _max = builtins.max _min = builtins.min _sum = builtins.sum +_divmod = builtins.divmod # We need some numpy scalars pi = onp.pi @@ -1449,6 +1450,12 @@ def cumulative_reduction(a, axis=None, dtype=None): ### Array-creation functions +def _check_no_padding(axis_padding, mode): + if (axis_padding[0] > 0 or axis_padding[1] > 0): + msg = "Cannot apply '{}' padding to empty axis" + raise ValueError(msg.format(mode)) + + @partial(jit, static_argnums=(1, 2)) def _pad(array, pad_width, mode, constant_values): array = asarray(array) @@ -1467,18 +1474,31 @@ def _pad(array, pad_width, mode, constant_values): widths[i] = (0, pad_width[i, 1], 0) array = lax.pad(array, constant_values[i, 1], widths) return array - elif mode in ("symmetric", "reflect", "wrap"): + elif mode == "wrap": + for i in xrange(nd): + if array.shape[i] == 0: + _check_no_padding(pad_width[i], mode) + continue + size = array.shape[i] + repeats, (left_remainder, right_remainder) = _divmod(pad_width[i], size) + total_repeats = repeats.sum() + 1 + parts = [] + if left_remainder: + parts += [lax.slice_in_dim(array, size - left_remainder, size, axis=i)] + parts += total_repeats * [array] + if right_remainder: + parts += [lax.slice_in_dim(array, 0, right_remainder, axis=i)] + array = lax.concatenate(parts, dimension=i) + return array + elif mode in ("symmetric", "reflect"): for i in xrange(nd): if array.shape[i] == 0: - if (pad_width[i, 0] > 0 or pad_width[i, 1] > 0): - msg = "Cannot apply '{}' padding to empty axis" - raise ValueError(msg.format(mode)) + _check_no_padding(pad_width[i], mode) continue n = array.shape[i] rarray = lax.rev(array, dimensions=(i,)) offset = 1 if (mode == "reflect" and n > 1) else 0 - wrap_mode = mode == "wrap" def build_padding(padding, forward): xs = [] @@ -1487,18 +1507,17 @@ def build_padding(padding, forward): padding -= delta p = array if forward else rarray xs.append(lax.slice_in_dim(p, offset, n, axis=i)) - if not wrap_mode: - forward = not forward + forward = not forward if padding > 0: x = lax.slice_in_dim(array if forward else rarray, offset, padding + offset, axis=i) xs.append(x) return xs - parts = reversed(build_padding(pad_width[i, 0], forward=not wrap_mode)) + parts = reversed(build_padding(pad_width[i, 0], forward=True)) parts = [lax.rev(x, dimensions=(i,)) for x in parts] parts += [array] - parts += build_padding(pad_width[i, 1], forward=wrap_mode) + parts += build_padding(pad_width[i, 1], forward=False) array = lax.concatenate(parts, dimension=i) return array else: From 32b5d6e9db3758eba5c75b0103bc4b509dfcbef2 Mon Sep 17 00:00:00 2001 From: Russell Power Date: Mon, 2 Dec 2019 15:02:27 -0800 Subject: [PATCH 0459/1053] Memoize TPU driver backend to be consistent with other XLA clients. (#1798) --- jax/lib/xla_bridge.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 3420a3b3df58..184162a94ae2 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -120,19 +120,27 @@ def _get_local_backend(platform=None): return backend +register_backend('xla', _get_local_backend) + +# memoize the TPU driver to be consistent with xla_client behavior +_tpu_backend = None + def _get_tpu_driver_backend(platform): del platform - backend_target = FLAGS.jax_backend_target - if backend_target is None: - raise ValueError('When using TPU Driver as the backend, you must specify ' - '--jax_backend_target=:8470.') - return tpu_client.TpuBackend.create(worker=backend_target) + global _tpu_backend + if _tpu_backend is None: + backend_target = FLAGS.jax_backend_target + if backend_target is None: + raise ValueError('When using TPU Driver as the backend, you must specify ' + '--jax_backend_target=:8470.') + _tpu_backend = tpu_client.TpuBackend.create(worker=backend_target) + return _tpu_backend -register_backend('xla', _get_local_backend) if tpu_client: register_backend('tpu_driver', _get_tpu_driver_backend) + _backend_lock = threading.Lock() @util.memoize From 51686f43d390e209923b476d04d352bb2a340f01 Mon Sep 17 00:00:00 2001 From: wang12tao Date: Mon, 2 Dec 2019 16:07:23 -0800 Subject: [PATCH 0460/1053] Make get_compile_options API accept 2D device assignment. --- jax/lib/xla_bridge.py | 4 +++- tests/xla_bridge_test.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 tests/xla_bridge_test.py diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 184162a94ae2..e99521dbacd0 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -85,7 +85,9 @@ def get_compile_options(num_replicas=None, device_assignment=None): msg = "device_assignment does not match num_replicas: {} vs {}." raise ValueError(msg.format(device_assignment, num_replicas)) compile_options = compile_options or xla_client.CompileOptions() - device_assignment = onp.array(device_assignment)[:, None] + device_assignment = onp.array(device_assignment) + if device_assignment.ndim == 1: + device_assignment = device_assignment[:, None] device_assignment = xla_client.DeviceAssignment.create(device_assignment) assert num_replicas is None or device_assignment.replica_count() == num_replicas compile_options.device_assignment = device_assignment diff --git a/tests/xla_bridge_test.py b/tests/xla_bridge_test.py new file mode 100644 index 000000000000..4d11f55d9048 --- /dev/null +++ b/tests/xla_bridge_test.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +from jax.lib import xla_bridge as xb + + +class XlaBridgeTest(absltest.TestCase): + + def test_set_device_assignment_no_partition(self): + compile_options = xb.get_compile_options( + num_replicas=4, device_assignment=[0, 1, 2, 3]) + expected_device_assignment = ("Computations: 1 Replicas: 4\nComputation 0: " + "0 1 2 3 \n") + self.assertEqual(compile_options.device_assignment.__repr__(), + expected_device_assignment) + + def test_set_device_assignment_with_partition(self): + compile_options = xb.get_compile_options( + num_replicas=2, device_assignment=[[0, 1], [2, 3]]) + expected_device_assignment = ("Computations: 2 Replicas: 2\nComputation 0: " + "0 2 \nComputation 1: 1 3 \n") + self.assertEqual(compile_options.device_assignment.__repr__(), + expected_device_assignment) + + +if __name__ == "__main__": + absltest.main() From 09f94a1e3d6a4f43d82f43e85ed1dc74f5290b93 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 2 Dec 2019 17:44:58 -0800 Subject: [PATCH 0461/1053] add optional `length` argument to scan --- jax/lax/lax_control_flow.py | 31 +++++++++++++++++++++++++------ tests/lax_control_flow_test.py | 8 ++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 5ea578450130..4cee58335fe1 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -438,7 +438,7 @@ def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr, true_nconsts, ### scan -def scan(f, init, xs): +def scan(f, init, xs, length=None): """Scan a function over leading array axes while carrying along state. The type signature in brief is @@ -493,6 +493,9 @@ def scan(f, init, xs): xs: the value of type ``[a]`` over which to scan along the leading axis, where ``[a]`` can be an array or any pytree (nested Python tuple/list/dict) thereof with consistent leading axis sizes. + length: optional integer specifying the number of loop iterations, which + must agree with the sizes of leading axes of the arrays in ``xs`` (but can + be used to perform scans where no input ``xs`` are needed). Returns: A pair of type ``(c, [b])`` where the first element represents the final @@ -502,14 +505,30 @@ def scan(f, init, xs): init_flat, init_tree = tree_flatten(init) xs_flat, _ = tree_flatten(xs) in_flat, in_tree = tree_flatten((init, xs)) + try: - length, = {x.shape[0] for x in xs_flat} + lengths = [x.shape[0] for x in xs_flat] except AttributeError: msg = "scan got value with no leading axis to scan over: {}." - raise ValueError(msg.format([x for x in xs_flat if not hasattr(x, 'shape')])) - except ValueError: - msg = "scan got values with different leading axis sizes: {}." - raise ValueError(msg.format([x.shape[0] for x in xs_flat])) + raise ValueError(msg.format(', '.join(str(x) for x in xs_flat + if not hasattr(x, 'shape')))) + + if length is not None: + length = int(length) + if not all(length == l for l in lengths): + msg = ("scan got `length` argument of {} which disagrees with " + "leading axis sizes {}.") + raise ValueError(msg.format(length, [x.shape[0] for x in xs_flat])) + else: + unique_lengths = set(lengths) + if len(unique_lengths) > 1: + msg = "scan got values with different leading axis sizes: {}." + raise ValueError(msg.format(', '.join(str(x.shape[0]) for x in xs_flat))) + elif len(unique_lengths) == 0: + msg = "scan got no values to scan over and `length` not provided." + raise ValueError(msg) + else: + length, = unique_lengths carry_avals = tuple(_map(_abstractify, init_flat)) x_shapes = [masking.padded_shape_as_value(x.shape[1:]) for x in xs_flat] diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 7ec94ce6e660..84e720af1dfe 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1446,6 +1446,14 @@ def step(x, i): s = str(api.xla_computation(api.grad(loss))(A).GetHloText()) assert s.count("dynamic-update-slice(") < 2 + def testScanLengthArg(self): + def arange(n): + return lax.scan(lambda c, _: (c + 1, c), 0, None, length=n)[1] + + ans = arange(10) + expected = onp.arange(10) + self.assertAllClose(ans, expected, check_dtypes=False) + if __name__ == '__main__': absltest.main() From ac2af106ed35556841a6fc3bf643b0e200ca0fa4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 2 Dec 2019 18:39:59 -0800 Subject: [PATCH 0462/1053] adjust scan docstring (thanks @shoyer) --- jax/lax/lax_control_flow.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 4cee58335fe1..c44938307098 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -453,10 +453,12 @@ def scan(f, init, xs, length=None): represents the type with the same pytree structure and corresponding leaves each with an additional leading axis. - When both ``a`` and ``b`` are array types, the semantics of ``scan`` are given - by this Python implementation:: + When ``a`` is an array type or None, and ``b`` is an array type, the semantics + of ``scan`` are given roughly by this Python implementation:: - def scan(f, init, xs): + def scan(f, init, xs, length=None): + if xs is None: + xs = [None] * length carry = init ys = [] for x in xs: @@ -466,7 +468,7 @@ def scan(f, init, xs): Unlike that Python version, both ``a`` and ``b`` may be arbitrary pytree types, and so multiple arrays can be scanned over at once and produce multiple - output arrays. + output arrays. (None is actually an empty pytree.) Also unlike that Python version, ``scan`` is a JAX primitive and is lowered to a single XLA While HLO. That makes it useful for reducing compilation times From cbc5aa0222145a103897a3bc9c7cc84bd2a114f2 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 2 Dec 2019 22:47:28 -0500 Subject: [PATCH 0463/1053] Fix scalar type promotion of np.where. (#1801) Broadcasting before promoting causes scalars to be promoted to the default type. Also reenable a test for scalar promotion. --- jax/numpy/lax_numpy.py | 7 ++----- tests/lax_numpy_test.py | 9 +++++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 8764000dfeef..a0d9ba46a420 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -966,12 +966,9 @@ def where(condition, x=None, y=None): raise ValueError("Must use the three-argument form of where().") if not issubdtype(_dtype(condition), onp.bool_): condition = lax.ne(condition, zeros_like(condition)) + x, y = _promote_dtypes(x, y) condition, x, y = broadcast_arrays(condition, x, y) - if not onp.size(x): - empty, _ = _promote_dtypes(x, y) - return empty - else: - return lax.select(condition, *_promote_dtypes(x, y)) + return lax.select(condition, x, y) if onp.size(x) else x @_wraps(onp.select) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 33bac518b12d..69600ce40b76 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1862,14 +1862,15 @@ def testIssue330(self): self.assertEqual(x[0, 0], 1) def testScalarDtypePromotion(self): - # disabled this test after https://github.com/google/jax/issues/732 - msg = ("jax.numpy differs from numpy in promotion rules for Python scalars." - " See https://github.com/google/jax/issues/732.") - raise SkipTest(msg) orig_numpy_result = (1 + onp.eye(1, dtype=onp.float32)).dtype jax_numpy_result = (1 + lnp.eye(1, dtype=lnp.float32)).dtype self.assertEqual(orig_numpy_result, jax_numpy_result) + def testWhereScalarPromotion(self): + x = lnp.where(lnp.array([True, False]), 3, + lnp.ones((2,), dtype=lnp.float32)) + self.assertEqual(x.dtype, onp.dtype(onp.float32)) + def testSymmetrizeDtypePromotion(self): x = onp.eye(3, dtype=onp.float32) orig_numpy_result = ((x + x.T) / 2).dtype From ff94b4442a71e999bedddd779ab08f0e9fcda317 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 3 Dec 2019 10:05:51 -0500 Subject: [PATCH 0464/1053] =?UTF-8?q?Remove=20np.=5Fpromote=5Fargs=5Flike,?= =?UTF-8?q?=20and=20replace=20its=20users=20with=20a=20newer=20=5Fpro?= =?UTF-8?q?=E2=80=A6=20(#1802)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove np._promote_args_like, and replace its users with a newer _promote_args_inexact. We no longer want to promote arguments exactly like NumPy; NumPy has a bad habit of promoting integer types to float64, whereas we want to promote to jax.numpy.float_, which may not be the same. For example ``` import numpy as onp onp.sin(3).dtype ``` returns `onp.dtype(float64)`. However, it turns out that all of the users of `_promote_args_like` are using it for exactly one behavior: promoting integers or bools to inexact types like float. Implement that behavior explicitly rather than mimicing the behavior of NumPy. * Relax test tolerances. --- jax/numpy/lax_numpy.py | 91 ++++++++++++++------------ jax/scipy/special.py | 22 +++---- jax/scipy/stats/bernoulli.py | 2 +- jax/scipy/stats/beta.py | 4 +- jax/scipy/stats/cauchy.py | 4 +- jax/scipy/stats/expon.py | 4 +- jax/scipy/stats/gamma.py | 4 +- jax/scipy/stats/laplace.py | 6 +- jax/scipy/stats/multivariate_normal.py | 9 +-- jax/scipy/stats/norm.py | 8 +-- jax/scipy/stats/pareto.py | 4 +- jax/scipy/stats/poisson.py | 2 +- jax/scipy/stats/t.py | 4 +- jax/scipy/stats/uniform.py | 8 ++- jax/test_util.py | 4 +- tests/lax_numpy_test.py | 11 ++-- tests/linalg_test.py | 12 ++-- tests/masking_test.py | 2 +- tests/scipy_stats_test.py | 32 ++++----- 19 files changed, 117 insertions(+), 116 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index a0d9ba46a420..3f75a2b0aa78 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -213,11 +213,21 @@ def _promote_dtypes(*args): to_dtype = result_type(*args) return [lax.convert_element_type(x, to_dtype) for x in args] -def _promote_to_result_dtype(op, *args): - """Convenience function to promote args directly to the op's result dtype.""" - to_dtype = _result_dtype(op, *args) - return [lax.convert_element_type(arg, to_dtype) for arg in args] +def _promote_dtypes_inexact(*args): + """Convenience function to apply Numpy argument dtype promotion. + Promotes arguments to an inexact type.""" + to_dtype = _to_inexact_dtype(result_type(*args)) + return [lax.convert_element_type(x, to_dtype) for x in args] + + +def _to_inexact_dtype(dtype): + """Promotes a dtype into an inexact dtype, if it is not already one.""" + return dtype if issubdtype(dtype, inexact) else promote_types(dtype, float_) + +def _complex_elem_type(dtype): + """Returns the float type of the real/imaginary parts of a complex dtype.""" + return onp.abs(onp.zeros((), dtype)).dtype def _result_dtype(op, *args): """Compute result dtype of applying op to arguments with given dtypes.""" @@ -240,12 +250,12 @@ def _promote_args(fun_name, *args): _check_arraylike(fun_name, *args) return _promote_shapes(fun_name, *_promote_dtypes(*args)) +def _promote_args_inexact(fun_name, *args): + """Convenience function to apply Numpy argument shape and dtype promotion. -def _promote_args_like(op, *args): - """Convenience function to apply shape and dtype promotion to result type.""" - _check_arraylike(op.__name__, *args) - return _promote_shapes(op.__name__, *_promote_to_result_dtype(op, *args)) - + Promotes non-inexact types to an inexact type.""" + _check_arraylike(fun_name, *args) + return _promote_shapes(fun_name, *_promote_dtypes_inexact(*args)) def _constant_like(x, const): return onp.array(const, dtype=_dtype(x)) @@ -358,16 +368,18 @@ def isscalar(num): return dtypes.is_python_scalar(num) or onp.isscalar(num) def result_type(*args): return dtypes.result_type(*args) -def _one_to_one_unop(numpy_fn, lax_fn, promote_like=False): - if promote_like: - fn = lambda x: lax_fn(lax.convert_element_type(x, _result_dtype(numpy_fn, x))) +def _one_to_one_unop(numpy_fn, lax_fn, promote_to_inexact=False): + if promote_to_inexact: + def fn(x): + x = lax.convert_element_type(x, _to_inexact_dtype(_dtype(x))) + return lax_fn(x) else: fn = lambda x: lax_fn(x) return _wraps(numpy_fn)(fn) -def _one_to_one_binop(numpy_fn, lax_fn, promote_like=False): - if promote_like: - fn = lambda x1, x2: lax_fn(*_promote_args_like(numpy_fn, x1, x2)) +def _one_to_one_binop(numpy_fn, lax_fn, promote_to_inexact=False): + if promote_to_inexact: + fn = lambda x1, x2: lax_fn(*_promote_args_inexact(numpy_fn, x1, x2)) else: fn = lambda x1, x2: lax_fn(*_promote_args(numpy_fn.__name__, x1, x2)) return _wraps(numpy_fn)(fn) @@ -449,10 +461,8 @@ def op(*args): @_wraps(onp.true_divide) def true_divide(x1, x2): - result_dtype = _result_dtype(onp.true_divide, x1, x2) - x1, x2 = _promote_shapes("true_divide", x1, x2) - return lax.div(lax.convert_element_type(x1, result_dtype), - lax.convert_element_type(x2, result_dtype)) + x1, x2 = _promote_args_inexact("true_divide", x1, x2) + return lax.div(x1, x2) @_wraps(onp.divide) @@ -515,7 +525,7 @@ def _float_divmod(x1, x2): def power(x1, x2): x1 = asarray(x1) x2 = asarray(x2) - x1, x2 = _promote_args_like(onp.power, x1, x2) + x1, x2 = _promote_args(onp.power, x1, x2) dtype = _dtype(x1) if not issubdtype(dtype, integer): return lax.pow(x1, x2) @@ -535,8 +545,7 @@ def power(x1, x2): @_wraps(onp.logaddexp) def logaddexp(x1, x2): - x1, x2 = _promote_shapes("logaddexp", - *_promote_to_result_dtype(onp.logaddexp, x1, x2)) + x1, x2 = _promote_shapes("logaddexp", *_promote_dtypes_inexact(x1, x2)) amax = lax.max(x1, x2) delta = lax.sub(x1, x2) return lax.select(isnan(delta), @@ -546,8 +555,7 @@ def logaddexp(x1, x2): @_wraps(onp.logaddexp2) def logaddexp2(x1, x2): - x1, x2 = _promote_shapes("logaddexp2", - *_promote_to_result_dtype(onp.logaddexp2, x1, x2)) + x1, x2 = _promote_shapes("logaddexp2", *_promote_dtypes_inexact(x1, x2)) amax = lax.max(x1, x2) delta = lax.sub(x1, x2) return lax.select(isnan(delta), @@ -558,19 +566,19 @@ def logaddexp2(x1, x2): @_wraps(onp.log2) def log2(x): - x, = _promote_to_result_dtype(onp.log2, x) + x, = _promote_dtypes_inexact(x) return lax.div(lax.log(x), lax.log(_constant_like(x, 2))) @_wraps(onp.log10) def log10(x): - x, = _promote_to_result_dtype(onp.log10, x) + x, = _promote_dtypes_inexact(x) return lax.div(lax.log(x), lax.log(_constant_like(x, 10))) @_wraps(onp.exp2) def exp2(x): - x, = _promote_to_result_dtype(onp.exp2, x) + x, = _promote_dtypes_inexact(x) return lax.exp(lax.mul(lax.log(_constant_like(x, 2)), x)) @@ -622,25 +630,23 @@ def remainder(x1, x2): @_wraps(onp.cbrt) def cbrt(x): - x, = _promote_to_result_dtype(onp.cbrt, x) + x, = _promote_dtypes_inexact(x) return lax.sign(x) * power(lax.abs(x), _constant_like(x, 1. / 3.)) @_wraps(onp.square) -def square(x): - x, = _promote_to_result_dtype(onp.square, x) - return x * x +def square(x): return lax.mul(x, x) @_wraps(onp.deg2rad) def deg2rad(x): - x, = _promote_to_result_dtype(onp.deg2rad, x) + x, = _promote_dtypes_inexact(x) return lax.mul(x, lax._const(x, pi / 180)) @_wraps(onp.rad2deg) def rad2deg(x): - x, = _promote_to_result_dtype(onp.rad2deg, x) + x, = _promote_dtypes_inexact(x) return lax.mul(x, lax._const(x, 180 / pi)) @@ -650,7 +656,7 @@ def rad2deg(x): @_wraps(onp.heaviside) def heaviside(x1, x2): - x1, x2 = _promote_to_result_dtype(onp.heaviside, x1, x2) + x1, x2 = _promote_dtypes_inexact(x1, x2) zero = lax._const(x1, 0) return where(lax.lt(x1, zero), zero, where(lax.gt(x1, zero), lax._const(x1, 1), x2)) @@ -658,19 +664,19 @@ def heaviside(x1, x2): @_wraps(onp.hypot) def hypot(x1, x2): - x1, x2 = _promote_to_result_dtype(onp.hypot, x1, x2) + x1, x2 = _promote_dtypes_inexact(x1, x2) return lax.sqrt(x1*x1 + x2*x2) @_wraps(onp.reciprocal) def reciprocal(x): - x, = _promote_to_result_dtype(onp.reciprocal, x) + x, = _promote_dtypes_inexact(x) return lax.div(lax._const(x, 1), x) @_wraps(onp.sinc, update_doc=False) def sinc(x): - x, = _promote_to_result_dtype(onp.sinc, x) + x, = _promote_dtypes_inexact(x) eq_zero = lax.eq(x, lax._const(x, 0)) safe_x = where(eq_zero, lax._const(x, 0), x) pi_x = lax.mul(lax._const(x, pi), safe_x) @@ -684,7 +690,7 @@ def sinc(x): @lax._upcast_fp16_for_computation def arcsinh(x): # asinh(x) = log(x + sqrt(x**2 + 1)) - x, = _promote_to_result_dtype(onp.arcsinh, x) + x, = _promote_dtypes_inexact(x) one = lax._const(x, 1) result = lax.log(x + lax.sqrt(x * x + one)) if issubdtype(_dtype(result), onp.complexfloating): @@ -703,7 +709,7 @@ def arcsinh(x): def arccosh(x): # acosh(x) = log(x + sqrt((x + 1) * (x - 1))) if x < sqrt_max_value # log(x) + log(2) otherwise - x, = _promote_to_result_dtype(onp.arccosh, x) + x, = _promote_dtypes_inexact(x) one = lax._const(x, 1) result = lax.log(x + lax.sqrt((x + one) * (x - one))) if issubdtype(_dtype(result), onp.complexfloating): @@ -716,7 +722,7 @@ def arccosh(x): @_wraps(onp.arctanh) def arctanh(x): # atanh(x) = 0.5 * log((1 + x) / (1 - x)) - x, = _promote_to_result_dtype(onp.arctanh, x) + x, = _promote_dtypes_inexact(x) one = lax._const(x, 1) result = lax._const(x, 0.5) * lax.log((one + x) / (one - x)) if issubdtype(_dtype(result), onp.complexfloating): @@ -933,7 +939,7 @@ def isclose(a, b, rtol=1e-05, atol=1e-08): dtype = _dtype(a) if issubdtype(dtype, inexact): if issubdtype(dtype, complexfloating): - dtype = _result_dtype(real, a) + dtype = _complex_elem_type(dtype) rtol = lax.convert_element_type(rtol, dtype) atol = lax.convert_element_type(atol, dtype) out = lax.le( @@ -1291,7 +1297,6 @@ def average(a, axis=None, weights=None, returned=False): return avg, weights_sum return avg -_complex_basetype = lambda dtype: onp.abs(onp.zeros((), dtype)).dtype @_wraps(onp.var) def var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False): @@ -1305,7 +1310,7 @@ def var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False): if not issubdtype(a_dtype, inexact): dtype = a_dtype = float_ else: - dtype = _complex_basetype(a_dtype) + dtype = _complex_elem_type(a_dtype) a_dtype = promote_types(a_dtype, float32) a_mean = mean(a, axis, dtype=a_dtype, keepdims=True) centered = a - a_mean diff --git a/jax/scipy/special.py b/jax/scipy/special.py index e1ddd7bfb4bf..5129d0ff112b 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -23,42 +23,42 @@ from ..api import custom_transforms, defjvp from ..numpy import lax_numpy as np from ..numpy.lax_numpy import (_wraps, asarray, _reduction_dims, _constant_like, - _promote_args_like) + _promote_args_inexact) @_wraps(osp_special.gammaln) def gammaln(x): - x, = _promote_args_like(osp_special.gammaln, x) + x, = _promote_args_inexact("gammaln", x) return lax.lgamma(x) @_wraps(osp_special.betaln) def betaln(x, y): - x, y = _promote_args_like(osp_special.betaln, x, y) + x, y = _promote_args_inexact("betaln", x, y) return lax.lgamma(x) + lax.lgamma(y) - lax.lgamma(x + y) @_wraps(osp_special.digamma, update_doc=False) def digamma(x): - x, = _promote_args_like(osp_special.digamma, x) + x, = _promote_args_inexact("digamma", x) return lax.digamma(x) @_wraps(osp_special.erf) def erf(x): - x, = _promote_args_like(osp_special.erf, x) + x, = _promote_args_inexact("erf", x) return lax.erf(x) @_wraps(osp_special.erfc, update_doc=False) def erfc(x): - x, = _promote_args_like(osp_special.erfc, x) + x, = _promote_args_inexact("erfc", x) return lax.erfc(x) @_wraps(osp_special.erfinv) def erfinv(x): - x, = _promote_args_like(osp_special.erfinv, x) + x, = _promote_args_inexact("erfinv", x) return lax.erf_inv(x) @@ -96,19 +96,19 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False): @_wraps(osp_special.xlogy) def xlogy(x, y): - x, y = _promote_args_like(osp_special.xlogy, x, y) + x, y = _promote_args_inexact("xlogy", x, y) return lax._safe_mul(x, lax.log(y)) @_wraps(osp_special.xlog1py, update_doc=False) def xlog1py(x, y): - x, y = _promote_args_like(osp_special.xlog1py, x, y) + x, y = _promote_args_inexact("xlog1py", x, y) return lax._safe_mul(x, lax.log1p(y)) @_wraps(osp_special.entr) def entr(x): - x, = _promote_args_like(osp_special.entr, x) + x, = _promote_args_inexact("entr", x) return lax.select(lax.lt(x, _constant_like(x, 0)), lax.full_like(x, -onp.inf), lax.neg(xlogy(x, x))) @@ -116,7 +116,7 @@ def entr(x): @_wraps(osp_special.multigammaln, update_doc=False) def multigammaln(a, d): - a, = _promote_args_like(lambda a: osp_special.multigammaln(a, 1), a) + a, = _promote_args_inexact("multigammaln", a) d = lax.convert_element_type(d, lax.dtype(a)) constant = lax.mul(lax.mul(lax.mul(_constant_like(a, 0.25), d), lax.sub(d, _constant_like(a, 1))), diff --git a/jax/scipy/stats/bernoulli.py b/jax/scipy/stats/bernoulli.py index 970531fa21d9..a2f1e54e2386 100644 --- a/jax/scipy/stats/bernoulli.py +++ b/jax/scipy/stats/bernoulli.py @@ -26,7 +26,7 @@ @np._wraps(osp_stats.bernoulli.logpmf, update_doc=False) def logpmf(k, p, loc=0): - k, p, loc = np._promote_args_like(osp_stats.bernoulli.logpmf, k, p, loc) + k, p, loc = np._promote_args_inexact("bernoulli.logpmf", k, p, loc) zero = np._constant_like(k, 0) one = np._constant_like(k, 1) x = lax.sub(k, loc) diff --git a/jax/scipy/stats/beta.py b/jax/scipy/stats/beta.py index 244bce67a9d3..d65331eb0b06 100644 --- a/jax/scipy/stats/beta.py +++ b/jax/scipy/stats/beta.py @@ -20,14 +20,14 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import (_promote_args_like, _constant_like, _wraps, +from ...numpy.lax_numpy import (_promote_args_inexact, _constant_like, _wraps, where, inf, logical_or) from ..special import betaln @_wraps(osp_stats.beta.logpdf, update_doc=False) def logpdf(x, a, b, loc=0, scale=1): - x, a, b, loc, scale = _promote_args_like(osp_stats.beta.logpdf, x, a, b, loc, scale) + x, a, b, loc, scale = _promote_args_inexact("beta.logpdf", x, a, b, loc, scale) one = _constant_like(x, 1) shape_term = lax.neg(betaln(a, b)) y = lax.div(lax.sub(x, loc), scale) diff --git a/jax/scipy/stats/cauchy.py b/jax/scipy/stats/cauchy.py index 3165584bc1d7..886c68ca89b5 100644 --- a/jax/scipy/stats/cauchy.py +++ b/jax/scipy/stats/cauchy.py @@ -20,12 +20,12 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps +from ...numpy.lax_numpy import _promote_args_inexact, _constant_like, _wraps @_wraps(osp_stats.cauchy.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.cauchy.logpdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("cauchy.logpdf", x, loc, scale) one = _constant_like(x, 1) pi = _constant_like(x, onp.pi) scaled_x = lax.div(lax.sub(x, loc), scale) diff --git a/jax/scipy/stats/expon.py b/jax/scipy/stats/expon.py index 9de50acfb458..fa3369f80b39 100644 --- a/jax/scipy/stats/expon.py +++ b/jax/scipy/stats/expon.py @@ -20,12 +20,12 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import _promote_args_like, _wraps, where, inf +from ...numpy.lax_numpy import _promote_args_inexact, _wraps, where, inf @_wraps(osp_stats.expon.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.expon.logpdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("expon.logpdf", x, loc, scale) log_scale = lax.log(scale) linear_term = lax.div(lax.sub(x, loc), scale) log_probs = lax.neg(lax.add(linear_term, log_scale)) diff --git a/jax/scipy/stats/gamma.py b/jax/scipy/stats/gamma.py index 8b96bae7b17c..896128fccd77 100644 --- a/jax/scipy/stats/gamma.py +++ b/jax/scipy/stats/gamma.py @@ -20,14 +20,14 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import (_promote_args_like, _constant_like, _wraps, +from ...numpy.lax_numpy import (_promote_args_inexact, _constant_like, _wraps, where, inf) from ..special import gammaln @_wraps(osp_stats.gamma.logpdf, update_doc=False) def logpdf(x, a, loc=0, scale=1): - x, a, loc, scale = _promote_args_like(osp_stats.gamma.logpdf, x, a, loc, scale) + x, a, loc, scale = _promote_args_inexact("gamma.logpdf", x, a, loc, scale) one = _constant_like(x, 1) y = lax.div(lax.sub(x, loc), scale) log_linear_term = lax.sub(lax.mul(lax.sub(a, one), lax.log(y)), y) diff --git a/jax/scipy/stats/laplace.py b/jax/scipy/stats/laplace.py index 40e24be8147f..bfb5a7c150de 100644 --- a/jax/scipy/stats/laplace.py +++ b/jax/scipy/stats/laplace.py @@ -20,12 +20,12 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps +from ...numpy.lax_numpy import _promote_args_inexact, _constant_like, _wraps @_wraps(osp_stats.laplace.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.laplace.logpdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("laplace.logpdf", x, loc, scale) two = _constant_like(x, 2) linear_term = lax.div(lax.abs(lax.sub(x, loc)), scale) return lax.neg(lax.add(linear_term, lax.log(lax.mul(two, scale)))) @@ -36,7 +36,7 @@ def pdf(x, loc=0, scale=1): @_wraps(osp_stats.laplace.cdf, update_doc=False) def cdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.laplace.cdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("laplace.cdf", x, loc, scale) half = _constant_like(x, 0.5) one = _constant_like(x, 1) zero = _constant_like(x, 0) diff --git a/jax/scipy/stats/multivariate_normal.py b/jax/scipy/stats/multivariate_normal.py index c6187cb58c32..20741aa0462d 100644 --- a/jax/scipy/stats/multivariate_normal.py +++ b/jax/scipy/stats/multivariate_normal.py @@ -20,19 +20,14 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps +from ...numpy.lax_numpy import _promote_dtypes_inexact, _constant_like, _wraps from ...numpy.lax_numpy import dot, subtract, einsum from ...numpy.linalg import det, inv @_wraps(osp_stats.multivariate_normal.logpdf, update_doc=False) def logpdf(x, mean, cov): - # TODO(mattjj): osp_stats.multivariate_normal.logpdf doesn't like being fed - # empty-shape arrays, so we can't use _promote_args_like as written; consider - # revising the dtype promotion logic here if it's an issue. - # x, mean, cov = _promote_args_like(osp_stats.multivariate_normal.logpdf, x, mean, cov) - x = x.astype(cov.dtype) - mean = mean.astype(cov.dtype) + x, mean, cov = _promote_dtypes_inexact(x, mean, cov) two = _constant_like(x, 2) dim = _constant_like(x, mean.shape[0]) det_sig = det(cov).astype(cov.dtype) diff --git a/jax/scipy/stats/norm.py b/jax/scipy/stats/norm.py index 21d0cc002862..ed2ca9bb660e 100644 --- a/jax/scipy/stats/norm.py +++ b/jax/scipy/stats/norm.py @@ -21,12 +21,12 @@ from ... import lax from ... import numpy as np -from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps +from ...numpy.lax_numpy import _promote_args_inexact, _constant_like, _wraps from .. import special @_wraps(osp_stats.norm.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.norm.logpdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("norm.logpdf", x, loc, scale) two = _constant_like(x, 2) scale_sqrd = lax.pow(scale, two) log_normalizer = lax.log(lax.mul(_constant_like(x, 2 * onp.pi), scale_sqrd)) @@ -41,13 +41,13 @@ def pdf(x, loc=0, scale=1): @_wraps(osp_stats.norm.cdf, update_doc=False) def cdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.norm.cdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("norm.cdf", x, loc, scale) return special.ndtr(lax.div(lax.sub(x, loc), scale)) @_wraps(osp_stats.norm.logcdf, update_doc=False) def logcdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.norm.logcdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("norm.logcdf", x, loc, scale) return special.log_ndtr(lax.div(lax.sub(x, loc), scale)) diff --git a/jax/scipy/stats/pareto.py b/jax/scipy/stats/pareto.py index bbb2a5c3d3a9..caafcecc8d1d 100644 --- a/jax/scipy/stats/pareto.py +++ b/jax/scipy/stats/pareto.py @@ -20,12 +20,12 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps, inf, where +from ...numpy.lax_numpy import _promote_args_inexact, _constant_like, _wraps, inf, where @_wraps(osp_stats.pareto.logpdf, update_doc=False) def logpdf(x, b, loc=0, scale=1): - x, b, loc, scale = _promote_args_like(osp_stats.pareto.logpdf, x, b, loc, scale) + x, b, loc, scale = _promote_args_inexact("pareto.logpdf", x, b, loc, scale) one = _constant_like(x, 1) scaled_x = lax.div(lax.sub(x, loc), scale) normalize_term = lax.log(lax.div(scale, b)) diff --git a/jax/scipy/stats/poisson.py b/jax/scipy/stats/poisson.py index a8de822d7d11..cc2b74e4e02e 100644 --- a/jax/scipy/stats/poisson.py +++ b/jax/scipy/stats/poisson.py @@ -25,7 +25,7 @@ @np._wraps(osp_stats.poisson.logpmf, update_doc=False) def logpmf(k, mu, loc=0): - k, mu, loc = np._promote_args_like(osp_stats.poisson.logpmf, k, mu, loc) + k, mu, loc = np._promote_args_inexact("poisson.logpmf", k, mu, loc) zero = np._constant_like(k, 0) x = lax.sub(k, loc) log_probs = xlogy(x, mu) - gammaln(x + 1) - mu diff --git a/jax/scipy/stats/t.py b/jax/scipy/stats/t.py index a2a1912749a4..f439f3a782ba 100644 --- a/jax/scipy/stats/t.py +++ b/jax/scipy/stats/t.py @@ -20,12 +20,12 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import _promote_args_like, _constant_like, _wraps +from ...numpy.lax_numpy import _promote_args_inexact, _constant_like, _wraps @_wraps(osp_stats.t.logpdf, update_doc=False) def logpdf(x, df, loc=0, scale=1): - x, df, loc, scale = _promote_args_like(osp_stats.t.logpdf, x, df, loc, scale) + x, df, loc, scale = _promote_args_inexact("t.logpdf", x, df, loc, scale) two = _constant_like(x, 2) scaled_x = lax.div(lax.sub(x, loc), scale) df_over_two = lax.div(df, two) diff --git a/jax/scipy/stats/uniform.py b/jax/scipy/stats/uniform.py index 3e27f5f7c575..1105f62261fe 100644 --- a/jax/scipy/stats/uniform.py +++ b/jax/scipy/stats/uniform.py @@ -19,15 +19,17 @@ import scipy.stats as osp_stats from ... import lax -from ...numpy.lax_numpy import _promote_args_like, _wraps, where, inf, logical_or +from ...numpy.lax_numpy import (_constant_like, _promote_args_inexact, _wraps, + where, inf, logical_or) @_wraps(osp_stats.uniform.logpdf, update_doc=False) def logpdf(x, loc=0, scale=1): - x, loc, scale = _promote_args_like(osp_stats.uniform.logpdf, x, loc, scale) + x, loc, scale = _promote_args_inexact("uniform.logpdf", x, loc, scale) log_probs = lax.neg(lax.log(scale)) return where(logical_or(lax.gt(x, lax.add(loc, scale)), - lax.lt(x, loc)), -inf, log_probs) + lax.lt(x, loc)), + -inf, log_probs) @_wraps(osp_stats.uniform.pdf, update_doc=False) def pdf(x, loc=0, scale=1): diff --git a/jax/test_util.py b/jax/test_util.py index f82e3fb8ffca..9d75c44249d3 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -371,9 +371,9 @@ def _rand_dtype(rand, shape, dtype, scale=1., post=lambda x: x): return _cast_to_shape(onp.asarray(post(vals), dtype), shape, dtype) -def rand_default(): +def rand_default(scale=3): randn = npr.RandomState(0).randn - return partial(_rand_dtype, randn, scale=3) + return partial(_rand_dtype, randn, scale=scale) def rand_nonzero(): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 69600ce40b76..b2602d6d7838 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -101,10 +101,11 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default, ["rev"]), - op_record("float_power", 2, inexact_dtypes, all_shapes, jtu.rand_default, ["rev"], + op_record("float_power", 2, inexact_dtypes, all_shapes, + partial(jtu.rand_default, scale=1), ["rev"], tolerance={lnp.bfloat16: 1e-2, onp.float32: 1e-3, onp.float64: 1e-12, onp.complex64: 2e-4, - onp.complex128: 1e-12}), + onp.complex128: 1e-12}, check_dtypes=False), op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("greater", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), @@ -1821,7 +1822,7 @@ def onp_fun(*args): # TODO(phawkins): we currently set dtype=False because we aren't as # aggressive about promoting to float64. It's not clear we want to mimic # Numpy here. - tol_spec = {onp.float32: 1e-4, onp.float64: 5e-6} + tol_spec = {onp.float32: 2e-4, onp.float64: 5e-6} tol = max(jtu.tolerance(a_dtype, tol_spec), jtu.tolerance(q_dtype, tol_spec)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, @@ -1851,7 +1852,9 @@ def onp_fun(condlist, choicelist, default): choicelist = [x if lnp.result_type(x) != lnp.bfloat16 else x.astype(onp.float32) for x in choicelist] dtype = lnp.result_type(default, *choicelist) - return onp.select(condlist, choicelist, default).astype(dtype) + return onp.select(condlist, + [onp.asarray(x, dtype=dtype) for x in choicelist], + onp.asarray(default, dtype=dtype)) self._CheckAgainstNumpy(onp_fun, lnp.select, args_maker, check_dtypes=False) self._CompileAndCheck(lnp.select, args_maker, check_dtypes=True) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 6c2b9ab5e9b4..1b375202f06a 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -54,8 +54,6 @@ def _skip_if_unsupported_type(dtype): raise unittest.SkipTest("--jax_enable_x64 is not set") -numpy_version = tuple(map(int, onp.version.version.split('.'))) - class NumpyLinalgTest(jtu.JaxTestCase): @parameterized.named_parameters(jtu.cases_from_list( @@ -387,11 +385,9 @@ def testNorm(self, shape, dtype, ord, axis, keepdims, rng_factory): args_maker = lambda: [rng(shape, dtype)] onp_fn = partial(onp.linalg.norm, ord=ord, axis=axis, keepdims=keepdims) np_fn = partial(np.linalg.norm, ord=ord, axis=axis, keepdims=keepdims) - # Older numpy versions promote to float64 unnecessarily.. - check_dtypes = numpy_version >= (1, 15) self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, - check_dtypes=check_dtypes, tol=1e-3) - self._CompileAndCheck(np_fn, args_maker, check_dtypes=check_dtypes) + check_dtypes=False, tol=1e-3) + self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_n={}_full_matrices={}_compute_uv={}".format( @@ -509,7 +505,7 @@ def compare_orthogonal(q1, q2): norm(onp.eye(k) -onp.matmul(onp.conj(T(lq)), lq)) < 5)) if not full_matrices and m >= n: - jtu.check_jvp(np.linalg.qr, partial(jvp, np.linalg.qr), (a,), atol=1e-3) + jtu.check_jvp(np.linalg.qr, partial(jvp, np.linalg.qr), (a,), atol=3e-3) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format( @@ -858,7 +854,7 @@ def testTriangularSolveGrad( f = partial(lax_linalg.triangular_solve, lower=lower, transpose_a=transpose_a, conjugate_a=conjugate_a, unit_diagonal=unit_diagonal, left_side=left_side) - jtu.check_grads(f, (A, B), 2, rtol=2e-2, eps=1e-3) + jtu.check_grads(f, (A, B), 2, rtol=4e-2, eps=1e-3) if __name__ == "__main__": diff --git a/tests/masking_test.py b/tests/masking_test.py index f8415fe88a26..d15431f61ff0 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -303,7 +303,7 @@ def rnn_reference(W, seqs, targets): self.assertAllClose( ans, expected, check_dtypes=False, - rtol={onp.float32:2e-2} if jtu.device_under_test() == "tpu" else None) + rtol=2e-2 if jtu.device_under_test() == "tpu" else 1e-5) def test_nesting(self): raise SkipTest("not yet implemented") diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 4be7503cff74..d3ca8b85c4cb 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -65,7 +65,7 @@ def args_maker(): loc = onp.floor(loc) return [k, mu, loc] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -82,7 +82,7 @@ def args_maker(): loc = onp.floor(loc) return [x, p, loc] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -96,7 +96,7 @@ def args_maker(): x, a, b, loc, scale = map(rng, shapes, dtypes) return [x, a, b, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True, rtol=1e-4) @@ -112,7 +112,7 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -129,7 +129,7 @@ def args_maker(): x = x / onp.sum(x, axis=-1, keepdims=True) return [x, alpha] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -143,7 +143,7 @@ def args_maker(): x, loc, scale = map(rng, shapes, dtypes) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -157,7 +157,7 @@ def args_maker(): x, a, loc, scale = map(rng, shapes, dtypes) return [x, a, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=5e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -173,7 +173,7 @@ def args_maker(): scale = onp.clip(scale, a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -189,7 +189,7 @@ def args_maker(): scale = onp.clip(scale, a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-6) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -207,7 +207,7 @@ def args_maker(): cov = random_correlation.rvs(onp.arange(1, 1+dim) * 2 / (dim + 1)) return [x, mean, cov] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -223,7 +223,7 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -240,7 +240,7 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -257,7 +257,7 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-6) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -291,7 +291,7 @@ def args_maker(): x, b, loc, scale = map(rng, shapes, dtypes) return [x, b, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -308,7 +308,7 @@ def args_maker(): scale = onp.clip(onp.abs(scale), a_min=0.1, a_max=None) return [x, df, loc, scale] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @@ -323,7 +323,7 @@ def args_maker(): x, loc, scale = map(rng, shapes, dtypes) return [x, loc, onp.abs(scale)] - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) From 6d7ef831b982fac5d772f1881e5dc59b78c87989 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 3 Dec 2019 10:08:55 -0500 Subject: [PATCH 0465/1053] Add copyright notice to xla_bridge_test.py --- tests/xla_bridge_test.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/xla_bridge_test.py b/tests/xla_bridge_test.py index 4d11f55d9048..ecad2f49488d 100644 --- a/tests/xla_bridge_test.py +++ b/tests/xla_bridge_test.py @@ -1,3 +1,17 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from __future__ import absolute_import from __future__ import division from __future__ import print_function From 1817f24c06256bdc4ad3e0890340ad8d3316fafb Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 3 Dec 2019 10:25:46 -0500 Subject: [PATCH 0466/1053] Relax test tolerance for core_test.py test_vjp to fix flakiness. --- tests/core_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core_test.py b/tests/core_test.py index 3d9de2dbeac5..7a469f36a223 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -194,7 +194,7 @@ def test_jvp_linearized(self, f, args): @parameterized.parameters(test_specs) def test_vjp(self, f, args): jtu.check_vjp(f, partial(vjp, f), args, - rtol={onp.float32: 7e-2, onp.float64: 1e-5}, + rtol={onp.float32: 3e-1, onp.float64: 1e-5}, atol={onp.float32: 1e-2, onp.float64: 1e-5}) def test_jvp_closure(self): From ea91c96a9dc5f7a2ccc990ecf9d6f3b04aeeb99c Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 3 Dec 2019 11:59:31 -0500 Subject: [PATCH 0467/1053] Specify a minimum Mac OS version in builds to avoid backward compatibility problems. (#1807) --- build/build.py | 1 + 1 file changed, 1 insertion(+) diff --git a/build/build.py b/build/build.py index 414135a6a825..64965ee21b47 100755 --- a/build/build.py +++ b/build/build.py @@ -176,6 +176,7 @@ def check_bazel_version(bazel_path, min_version, max_version): # Sets the default Apple platform to macOS. build --apple_platform_type=macos +build --macos_minimum_os=10.9 # Make Bazel print out all options from rc files. build --announce_rc From 2316a29ae91e64a6f2386c96e5fe1c767361f006 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Tue, 3 Dec 2019 11:15:39 -0800 Subject: [PATCH 0468/1053] Implement np.linalg.pinv (#1656) * starter code * Update scipy_stats_test.py * Update __init__.py * Update scipy_stats_test.py * starter code for pinv * fix transpose, add more test cases & complex dtype * update test to latest format * update default rcond * Update linalg.py * bigger test size * Update linalg.py * Update linalg_test.py * fix float issue * Update linalg.py * smaller test cases * Update linalg_test.py * try not forcing float * explicit cast * try a different casting * try another casting --- jax/numpy/linalg.py | 21 +++++++++++++++++++++ tests/linalg_test.py | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index eabecc00d698..1444cca00d22 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -136,6 +136,27 @@ def eigvalsh(a, UPLO='L'): return w +@_wraps(onp.linalg.pinv) +def pinv(a, rcond=None): + # ported from https://github.com/numpy/numpy/blob/v1.17.0/numpy/linalg/linalg.py#L1890-L1979 + a = np.conj(a) + if rcond is None: + max_rows_cols = max(a.shape[-2:]) + rcond = 10. * max_rows_cols * np.finfo(a.dtype).eps + rcond = np.asarray(rcond) + u, s, v = svd(a, full_matrices=False) + # Singular values less than or equal to ``rcond * largest_singular_value`` + # are set to zero. + cutoff = rcond[..., np.newaxis] * np.amax(s, axis=-1, keepdims=True) + large = s > cutoff + s = np.divide(1, s) + s = np.where(large, s, 0) + vT = np.swapaxes(v, -1, -2) + uT = np.swapaxes(u, -1, -2) + res = np.matmul(vT, np.multiply(s[..., np.newaxis], uT)) + return lax.convert_element_type(res, a.dtype) + + @_wraps(onp.linalg.inv) def inv(a): if np.ndim(a) < 2 or a.shape[-1] != a.shape[-2]: diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 1b375202f06a..7b6747c09c3e 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -574,6 +574,22 @@ def args_maker(): check_dtypes=True, tol=1e-3) self._CompileAndCheck(np.linalg.inv, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} + for shape in [(1, 1), (4, 4), (2, 70, 7), (2000, 7), (7, 10000), (70, 7, 2)] + for dtype in float_types + complex_types + for rng_factory in [jtu.rand_default])) + def testPinv(self, shape, dtype, rng_factory): + rng = rng_factory() + _skip_if_unsupported_type(dtype) + args_maker = lambda: [rng(shape, dtype)] + + self._CheckAgainstNumpy(onp.linalg.pinv, np.linalg.pinv, args_maker, + check_dtypes=True, tol=1e-3) + self._CompileAndCheck(np.linalg.pinv, args_maker, check_dtypes=True) + # Regression test for incorrect type for eigenvalues of a complex matrix. @jtu.skip_on_devices("tpu") # TODO(phawkins): No complex eigh implementation on TPU. def testIssue669(self): From 12a62c1f33ab3cf32c2e2157016f745f834c831c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 3 Dec 2019 12:29:34 -0800 Subject: [PATCH 0469/1053] Bump jaxlib version to 0.1.37 and update WORKSPACE. --- WORKSPACE | 4 ++-- jaxlib/version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71428af8a583..aff471022600 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -24,9 +24,9 @@ http_archive( http_archive( name = "org_tensorflow", sha256 = "412ef0824d5dcfe6e139e1fa25f72569e699b3ec06d374c0e19ba0bf60c32952", - strip_prefix = "tensorflow-883b5becaced22f7dd9e3c23d9d259f55e087cb5", + strip_prefix = "tensorflow-08266e2d237fc78511393ee52bec667a83891c53", urls = [ - "https://github.com/tensorflow/tensorflow/archive/883b5becaced22f7dd9e3c23d9d259f55e087cb5.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/08266e2d237fc78511393ee52bec667a83891c53.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index 1c408a9aee92..a222ca339d30 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.36" +__version__ = "0.1.37" From 5b6c9325ed47b29d9182b0480206ba15b5787500 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 3 Dec 2019 12:45:58 -0800 Subject: [PATCH 0470/1053] Fix WORKSPACE hash --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index aff471022600..a1d8b12549d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,7 +23,7 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "412ef0824d5dcfe6e139e1fa25f72569e699b3ec06d374c0e19ba0bf60c32952", + sha256 = "9211a40c95827b4cc0800475aa33356b128b56ab061c3f8da0142f6927e605e0", strip_prefix = "tensorflow-08266e2d237fc78511393ee52bec667a83891c53", urls = [ "https://github.com/tensorflow/tensorflow/archive/08266e2d237fc78511393ee52bec667a83891c53.tar.gz", From d6b18fbb51d78cc2eb3177736e9ed52f925fbc6a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 3 Dec 2019 22:17:22 -0500 Subject: [PATCH 0471/1053] Add some missing NumPy constants: euler_gamma, NZERO and PZERO. (#1809) I avoided adding the deprecated aliases for inf and nan. --- jax/numpy/lax_numpy.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 3f75a2b0aa78..0cacc3fcc1cf 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -82,11 +82,15 @@ def removechars(s, chars): _sum = builtins.sum _divmod = builtins.divmod -# We need some numpy scalars +# NumPy constants + pi = onp.pi e = onp.e +euler_gamma = onp.euler_gamma inf = onp.inf NINF = onp.NINF +PZERO = onp.PZERO +NZERO = onp.NZERO nan = onp.nan # And some numpy utility functions From 437e6db8a1c0373fefc045f9dfd3693b00024212 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 4 Dec 2019 15:28:01 +0100 Subject: [PATCH 0472/1053] Disable linalg_test.py::NumpyLinalgTest.testPinv on TPU and GPU This failed in google3 presubmits. --- tests/linalg_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 7b6747c09c3e..2ecf120b8c93 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -581,6 +581,7 @@ def args_maker(): for shape in [(1, 1), (4, 4), (2, 70, 7), (2000, 7), (7, 10000), (70, 7, 2)] for dtype in float_types + complex_types for rng_factory in [jtu.rand_default])) + @jtu.skip_on_devices("tpu", "gpu") # SVD is only implemented on the CPU backend def testPinv(self, shape, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) From 120270cb47e0276021afa93ceca9149aee9dca35 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 4 Dec 2019 15:38:17 +0100 Subject: [PATCH 0473/1053] Refined the test disabling for only TPU --- jax/lax_linalg.py | 2 +- tests/linalg_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 65dd7178ba5b..30c6e2701673 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -745,7 +745,7 @@ def svd_impl(operand, full_matrices, compute_uv): def svd_translation_rule(c, operand, full_matrices, compute_uv): raise NotImplementedError( - "Singular value decomposition is only implemented on the CPU backend") + "Singular value decomposition is only implemented on the CPU and GPU backends") def svd_abstract_eval(operand, full_matrices, compute_uv): if isinstance(operand, ShapedArray): diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 2ecf120b8c93..9d2cb8f5363c 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -581,7 +581,7 @@ def args_maker(): for shape in [(1, 1), (4, 4), (2, 70, 7), (2000, 7), (7, 10000), (70, 7, 2)] for dtype in float_types + complex_types for rng_factory in [jtu.rand_default])) - @jtu.skip_on_devices("tpu", "gpu") # SVD is only implemented on the CPU backend + @jtu.skip_on_devices("tpu") # SVD is not implemented on the TPU backend def testPinv(self, shape, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) From 17813eab20604f89cccdd45ba06431b276d73839 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 4 Dec 2019 10:02:14 -0500 Subject: [PATCH 0474/1053] Simplify np.cross. Add a jit decorator. (#1810) * Simplify np.cross. Add a jit decorator. --- jax/numpy/lax_numpy.py | 65 ++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 40 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0cacc3fcc1cf..ca319d51bb29 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2371,48 +2371,33 @@ def outer(a, b, out=None): raise NotImplementedError("The 'out' argument to outer is not supported.") return ravel(a)[:, None] * ravel(b) +@partial(jit, static_argnums=(2, 3, 4)) +def _cross(a, b, axisa, axisb, axisc): + a = moveaxis(a, axisa, -1) + b = moveaxis(b, axisb, -1) + + if a.shape[-1] not in (2, 3) or b.shape[-1] not in (2, 3): + raise ValueError("Dimension must be either 2 or 3 for cross product") + + if a.shape[-1] == 2 and b.shape[-1] == 2: + return a[..., 0] * b[..., 1] - a[..., 1] * b[..., 0] + + a0 = a[..., 0] + a1 = a[..., 1] + a2 = a[..., 2] if a.shape[-1] == 3 else zeros_like(a0) + b0 = b[..., 0] + b1 = b[..., 1] + b2 = b[..., 2] if b.shape[-1] == 3 else zeros_like(b0) + c = array([a1 * b2 - a2 * b1, a2 * b0 - a0 * b2, a0 * b1 - a1 * b0]) + return moveaxis(c, 0, axisc) + @_wraps(onp.cross) def cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None): - if axis is not None: - axisa = axis - axisb = axis - axisc = axis - - a_ndims = len(shape(a)) - b_ndims = len(shape(b)) - axisa = _canonicalize_axis(axisa, a_ndims) - axisb = _canonicalize_axis(axisb, b_ndims) - a = moveaxis(a, axisa, -1) - b = moveaxis(b, axisb, -1) - a_shape = shape(a) - b_shape = shape(b) - - if a_shape[-1] not in (2, 3) or b_shape[-1] not in (2, 3): - raise ValueError("Dimension must be either 2 or 3 for cross product") - - if a_shape[-1] == 2 and b_shape[-1] == 2: - return a[..., 0] * b[..., 1] - a[..., 1] * b[..., 0] - - if a_shape[-1] == 2: - a = concatenate((a, zeros(a_shape[:-1] + (1,), dtype=a.dtype)), axis=-1) - elif b_shape[-1] == 2: - b = concatenate((b, zeros(b_shape[:-1] + (1,), dtype=b.dtype)), axis=-1) - - a0 = a[..., 0] - a1 = a[..., 1] - a2 = a[..., 2] - b0 = b[..., 0] - b1 = b[..., 1] - b2 = b[..., 2] - - c = array([a1 * b2 - a2 * b1, - a2 * b0 - a0 * b2, - a0 * b1 - a1 * b0]) - - c_ndims = len(shape(c)) - axisc = _canonicalize_axis(axisc, c_ndims) - - return moveaxis(c, 0, axisc) + if axis is not None: + axisa = axis + axisb = axis + axisc = axis + return _cross(a, b, axisa, axisb, axisc) @_wraps(onp.kron) def kron(a, b): From eca0d98ffde30573a5b95a8e9c2d3d10387e2e43 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 4 Dec 2019 17:42:20 +0100 Subject: [PATCH 0475/1053] Increase test tolerance for float16 for LaxBackedNumpyTests.testCross Due to failure in google3 presubmit --- tests/lax_numpy_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index b2602d6d7838..997f9ac0b83e 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -585,7 +585,7 @@ def onp_fun(a, b): b = b.astype(onp.float32) if rhs_dtype == lnp.bfloat16 else b out = onp.cross(a, b, axisa, axisb, axisc, axis) return out.astype(lnp.promote_types(lhs_dtype, rhs_dtype)) - tol_spec = {dtypes.bfloat16: 3e-1, onp.float16: 1e-2} + tol_spec = {dtypes.bfloat16: 3e-1, onp.float16: 0.15} tol = max(jtu.tolerance(lhs_dtype, tol_spec), jtu.tolerance(rhs_dtype, tol_spec)) self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, From c1aeaf511cb38c9d7a3174446d0525877256e6c9 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 4 Dec 2019 09:50:29 -0800 Subject: [PATCH 0476/1053] xla_computation option to instantiate const output --- jax/api.py | 14 +++++++++++--- tests/api_test.py | 8 ++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index 1b2c92e6735e..53a61a0b4c22 100644 --- a/jax/api.py +++ b/jax/api.py @@ -198,7 +198,7 @@ def disable_jit(): def xla_computation(fun, static_argnums=(), axis_env=None, backend=None, - tuple_args=False): + tuple_args=False, instantiate_const_outputs=False): """Creates a function that produces its XLA computation given example args. Args: @@ -212,9 +212,16 @@ def xla_computation(fun, static_argnums=(), axis_env=None, backend=None, applications of ``jax.pmap``. See the examples below. backend: This is an experimental feature and the API is likely to change. Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. - tuple_args: Optional, defaults to False. If True, the resulting XLA + tuple_args: Optional bool, defaults to False. If True, the resulting XLA computation will have a single tuple argument that is unpacked into the specified function arguments. + instantiate_const_outputs: Optional bool, defaults to False. If False, then + ``xla_computation`` does not instantiate constant-valued outputs in the + XLA computation, and so the result is closer to the computation that + ``jax.jit`` produces and may be more useful for studying ``jit`` behavior. + If True, then constant-valued outputs are instantiated in the XLA + computation, which may be more useful for staging computations out of JAX + entirely. Returns: A wrapped version of ``fun`` that when applied to example arguments returns a @@ -294,7 +301,8 @@ def computation_maker(*args, **kwargs): jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) avals = map(xla.abstractify, jax_args) pvals = [pe.PartialVal((aval, core.unit)) for aval in avals] - jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) + jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals, + instantiate=instantiate_const_outputs) axis_env_ = make_axis_env(xla.jaxpr_replicas(jaxpr)) c = xb.make_computation_builder('xla_computation_{}'.format(fun_name)) xla_consts = map(c.Constant, consts) diff --git a/tests/api_test.py b/tests/api_test.py index 60d7761b244e..4744d28f0e6d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1016,6 +1016,14 @@ def f(x): xla_comp = api.xla_computation(f) xla_comp(np.arange(8)).GetHloText() # doesn't crash + def test_xla_computation_instantiate_constant_outputs(self): + def f(): + return np.zeros((3, 4)) + + xla_comp = api.xla_computation(f, instantiate_const_outputs=True)() + out_shape, = xla_comp.GetReturnValueShape().tuple_shapes() + self.assertEqual(out_shape.dimensions(), (3, 4)) + def test_jit_device(self): device = xb.devices()[-1] x = api.jit(lambda x: x, device=device)(3.) From 0899673363e4189dc670792bd3f0317795196b75 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 4 Dec 2019 09:55:05 -0800 Subject: [PATCH 0477/1053] switch xla_computation instantiate outputs default --- jax/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/api.py b/jax/api.py index 53a61a0b4c22..b3608cdc6d28 100644 --- a/jax/api.py +++ b/jax/api.py @@ -198,7 +198,7 @@ def disable_jit(): def xla_computation(fun, static_argnums=(), axis_env=None, backend=None, - tuple_args=False, instantiate_const_outputs=False): + tuple_args=False, instantiate_const_outputs=True): """Creates a function that produces its XLA computation given example args. Args: @@ -215,7 +215,7 @@ def xla_computation(fun, static_argnums=(), axis_env=None, backend=None, tuple_args: Optional bool, defaults to False. If True, the resulting XLA computation will have a single tuple argument that is unpacked into the specified function arguments. - instantiate_const_outputs: Optional bool, defaults to False. If False, then + instantiate_const_outputs: Optional bool, defaults to True. If False, then ``xla_computation`` does not instantiate constant-valued outputs in the XLA computation, and so the result is closer to the computation that ``jax.jit`` produces and may be more useful for studying ``jit`` behavior. From d113416844604c616bf11e8650c5018a15524ea6 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 4 Dec 2019 14:47:58 -0800 Subject: [PATCH 0478/1053] Update WORKSPACE. We haven't published jaxlib 0.1.27 yet so I'm leaving the version as-is. --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1d8b12549d9..b0de8907c683 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "9211a40c95827b4cc0800475aa33356b128b56ab061c3f8da0142f6927e605e0", - strip_prefix = "tensorflow-08266e2d237fc78511393ee52bec667a83891c53", + sha256 = "4aff7af41bd80abb3e2634ee414738b9358aaa3c69f7e481ad7e4e604fc3d39c", + strip_prefix = "tensorflow-23275fb35cf17482d147f88ce7d8f4ce9c2376f3", urls = [ - "https://github.com/tensorflow/tensorflow/archive/08266e2d237fc78511393ee52bec667a83891c53.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/23275fb35cf17482d147f88ce7d8f4ce9c2376f3.tar.gz", ], ) From 7f4c2fcb6bee990db88d1eed6e02e2e898b9af3e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 4 Dec 2019 19:48:59 -0800 Subject: [PATCH 0479/1053] bump version for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 9b239a2bc0bc..8de3870cb7a6 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.53" +__version__ = "0.1.54" From 1a82da37a31c49a94df15944eb7029f475936914 Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Wed, 4 Dec 2019 21:20:59 -0800 Subject: [PATCH 0480/1053] log compiles in pmap (#1817) --- jax/interpreters/pxla.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 4a142a3512ff..13132ba8176e 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -27,6 +27,7 @@ import six from six.moves import reduce +from ..config import flags from .. import core from .. import linear_util as lu from ..abstract_arrays import (ConcreteArray, ShapedArray, array_types, @@ -41,6 +42,8 @@ from . import xla from . import ad +FLAGS = flags.FLAGS + _map = safe_map @@ -436,6 +439,11 @@ def parallel_callable(fun, backend, axis_name, axis_size, devices, *avals): else: global_axis_size = axis_size + log_priority = logging.WARNING if FLAGS.jax_log_compiles else logging.DEBUG + logging.log(log_priority, + "Compiling {} for {} devices with args {}.".format( + fun.__name__, global_axis_size, avals)) + @lu.wrap_init def dynamic_fun(dummy, *args): with extend_dynamic_axis_env(axis_name, dummy.trace, global_axis_size): From d958f3007da36913d235e435c1df765d56ba1722 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 5 Dec 2019 10:57:23 -0500 Subject: [PATCH 0481/1053] Change JAX type promotion to prefer inexact types. (#1815) Change the JAX type promotion table to prefer inexact types during type promotion. NumPy's type promotion rules tend to promote aggressively to float64, which isn't a very accelerator-friendly behavior when not all accelerators (e.g., TPUs) support 64-bit floating point types. Even on accelerators that support 64-bit floating point types (e.g., GPUs), promotion to a 64-bit type comes with a significant performance cost. This change makes JAX type promotion between inexact and exact types closer to PyTorch's promotion semantics, which are a better fit for modern accelerators: e.g., ``` import numpy as onp from jax import numpy as np In [1]: onp.promote_types(onp.float32, onp.int32) Out[1]: dtype('float64') In [2]: onp.promote_types(onp.float16, onp.int64) Out[2]: dtype('float64') In [3]: np.promote_types(onp.float32, onp.int32) Out[3]: dtype('float32') In [4]: np.promote_types(onp.float16, onp.int64) Out[4]: dtype('float16') ``` This change is in preparation for enabling x64 mode by default on all platforms. --- docs/index.rst | 1 + docs/type_promotion.rst | 117 ++++++++++++++++++++++++++++++++++++++++ jax/dtypes.py | 90 +++++++++++++++++++++---------- jax/numpy/lax_numpy.py | 1 + tests/dtypes_test.py | 52 ++++++++++++++++++ tests/lax_numpy_test.py | 86 +++++++++++++++++++---------- 6 files changed, 290 insertions(+), 57 deletions(-) create mode 100644 docs/type_promotion.rst diff --git a/docs/index.rst b/docs/index.rst index 3ad3b0527483..bc61a3e64055 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -39,6 +39,7 @@ For an introduction to JAX, start at the gpu_memory_allocation profiling rank_promotion_warning + type_promotion .. toctree:: :maxdepth: 2 diff --git a/docs/type_promotion.rst b/docs/type_promotion.rst new file mode 100644 index 000000000000..6672ceace65a --- /dev/null +++ b/docs/type_promotion.rst @@ -0,0 +1,117 @@ +.. _type-promotion: + +Type promotion semantics +======================== + +JAX's type promotion rules (i.e., the result of +:func:`jax.numpy.promote_types` for each pair of types) are given by the +following table, where, for example + +* "b1" means :code:`np.bool_`, +* "s2" means :code:`np.int16`, +* "u4" means :code:`np.uint32`, +* "bf" means :code:`np.bfloat16`, +* "f2" means :code:`np.float16`, and +* "c8" means :code:`np.complex128`. + +.. raw:: html + + + + + + + + + + + + + + + + + + + + +
b1u1u2u4u8i1i2i4i8bff2f4f8c4c8
b1b1u1u2u4u8i1i2i4i8bff2f4f8c4c8
u1u1u1u2u4u8i2i2i4i8bff2f4f8c4c8
u2u2u2u2u4u8i4i4i4i8bff2f4f8c4c8
u4u4u4u4u4u8i8i8i8i8bff2f4f8c4c8
u8u8u8u8u8u8f8f8f8f8bff2f4f8c4c8
i1i1i2i4i8f8i1i2i4i8bff2f4f8c4c8
i2i2i2i4i8f8i2i2i4i8bff2f4f8c4c8
i4i4i4i4i8f8i4i4i4i8bff2f4f8c4c8
i8i8i8i8i8f8i8i8i8i8bff2f4f8c4c8
bfbfbfbfbfbfbfbfbfbfbff4f4f8c4c8
f2f2f2f2f2f2f2f2f2f2f4f2f4f8c4c8
f4f4f4f4f4f4f4f4f4f4f4f4f4f8c4c8
f8f8f8f8f8f8f8f8f8f8f8f8f8f8c8c8
c4c4c4c4c4c4c4c4c4c4c4c4c4c8c4c8
c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8

+ +.. The table above was generated by the following Python code. + import numpy as onp + from jax import numpy as np + + types = [onp.bool_, onp.uint8, onp.uint16, onp.uint32, onp.uint64, + onp.int8, onp.int16, onp.int32, onp.int64, + np.bfloat16, onp.float16, onp.float32, onp.float64, + onp.complex64, onp.complex128] + + def name(d): + d = onp.dtype(d) + if d == onp.dtype(np.bfloat16): + return "bf" + return "{}{}".format( + d.kind, + d.itemsize // 2 if onp.issubdtype(d, onp.complexfloating) else d.itemsize) + + out = "" + for t in types: + out += "{}".format(name(t)) + out += "\n" + + for t1 in types: + out += "{}".format(name(t1)) + for t2 in types: + t = np.promote_types(t1, t2) + different = np.bfloat16 in (t1, t2) or t != onp.promote_types(t1, t2) + out += "{}".format(" class=\"d\"" if different else "", name(t)) + out += "\n" + + print(out) + +Jax's type promotion rules differ from those of NumPy, as given by +:func:`numpy.promote_types`, in those cells highlighted with a green background +in the table above. There are two key differences: + +* when promoting an integer or boolean type against a floating-point or complex + type, JAX always prefers the type of the floating-point or complex type. + + Accelerator devices, such as GPUs and TPUs, either pay a significant + performance penalty to use 64-bit floating point types (GPUs) or do not + support 64-bit floating point types at all (TPUs). Classic NumPy's promotion + rules are too willing to overpromote to 64-bit types, which is problematic for + a system designed to run on accelerators. + + JAX uses floating point promotion rules that are more suited to modern + accelerator devices and are less aggressive about promoting floating point + types. The promotion rules used by JAX for floating-point types are similar to + those used by PyTorch. + +* JAX supports the + `bfloat16 `_ + non-standard 16-bit floating point type + (:code:`jax.numpy.bfloat16`), which is useful for neural network training. + The only notable promotion behavior is with respect to IEEE-754 + :code:`float16`, with which :code:`bfloat16` promotes to a :code:`float32`. diff --git a/jax/dtypes.py b/jax/dtypes.py index efd2547ed20f..6239ebde60bc 100644 --- a/jax/dtypes.py +++ b/jax/dtypes.py @@ -141,38 +141,72 @@ def issubdtype(a, b): can_cast = onp.can_cast issubsctype = onp.issubsctype -_bfloat16_type_promotions = { - onp.dtype('bool'): onp.dtype(bfloat16), - onp.dtype(bfloat16): onp.dtype(bfloat16), - onp.dtype('float16'): onp.dtype('float32'), - onp.dtype('float32'): onp.dtype('float32'), - onp.dtype('float64'): onp.dtype('float64'), - onp.dtype('complex64'): onp.dtype('complex64'), - onp.dtype('complex128'): onp.dtype('complex128'), - onp.dtype('int8'): onp.dtype(bfloat16), - onp.dtype('int16'): onp.dtype('float32'), - onp.dtype('int32'): onp.dtype('float64'), - onp.dtype('int64'): onp.dtype('float64'), - onp.dtype('uint8'): onp.dtype(bfloat16), - onp.dtype('uint16'): onp.dtype('float32'), - onp.dtype('uint32'): onp.dtype('float64'), - onp.dtype('uint64'): onp.dtype('float64'), -} + +# List of all valid JAX dtypes, in the order they appear in the type promotion +# table. +_jax_types = [ + onp.dtype('bool'), + onp.dtype('uint8'), + onp.dtype('uint16'), + onp.dtype('uint32'), + onp.dtype('uint64'), + onp.dtype('int8'), + onp.dtype('int16'), + onp.dtype('int32'), + onp.dtype('int64'), + onp.dtype(bfloat16), + onp.dtype('float16'), + onp.dtype('float32'), + onp.dtype('float64'), + onp.dtype('complex64'), + onp.dtype('complex128'), +] + +# Mapping from types to their type numbers. +_jax_type_nums = {t: i for i, t in enumerate(_jax_types)} + +def _make_type_promotion_table(): + b1, u1, u2, u4, u8, s1, s2, s4, s8, bf, f2, f4, f8, c4, c8 = _jax_types + # b1, u1, u2, u4, u8, s1, s2, s4, s8, bf, f2, f4, f8, c4, c8 + return onp.array([ + [b1, u1, u2, u4, u8, s1, s2, s4, s8, bf, f2, f4, f8, c4, c8], # b1 + [u1, u1, u2, u4, u8, s2, s2, s4, s8, bf, f2, f4, f8, c4, c8], # u1 + [u2, u2, u2, u4, u8, s4, s4, s4, s8, bf, f2, f4, f8, c4, c8], # u2 + [u4, u4, u4, u4, u8, s8, s8, s8, s8, bf, f2, f4, f8, c4, c8], # u4 + [u8, u8, u8, u8, u8, f8, f8, f8, f8, bf, f2, f4, f8, c4, c8], # u8 + [s1, s2, s4, s8, f8, s1, s2, s4, s8, bf, f2, f4, f8, c4, c8], # s1 + [s2, s2, s4, s8, f8, s2, s2, s4, s8, bf, f2, f4, f8, c4, c8], # s2 + [s4, s4, s4, s8, f8, s4, s4, s4, s8, bf, f2, f4, f8, c4, c8], # s4 + [s8, s8, s8, s8, f8, s8, s8, s8, s8, bf, f2, f4, f8, c4, c8], # s8 + [bf, bf, bf, bf, bf, bf, bf, bf, bf, bf, f4, f4, f8, c4, c8], # bf + [f2, f2, f2, f2, f2, f2, f2, f2, f2, f4, f2, f4, f8, c4, c8], # f2 + [f4, f4, f4, f4, f4, f4, f4, f4, f4, f4, f4, f4, f8, c4, c8], # f4 + [f8, f8, f8, f8, f8, f8, f8, f8, f8, f8, f8, f8, f8, c8, c8], # f8 + [c4, c4, c4, c4, c4, c4, c4, c4, c4, c4, c4, c4, c8, c4, c8], # c4 + [c8, c8, c8, c8, c8, c8, c8, c8, c8, c8, c8, c8, c8, c8, c8], # c8 + ]) + +_type_promotion_table = _make_type_promotion_table() def promote_types(a, b): - a = onp.dtype(a) - b = onp.dtype(b) - if b == _bfloat16_dtype: - a, b = b, a + """Returns the type to which a binary operation should cast its arguments. + + For details of JAX's type promotion semantics, see :ref:`type-promotion`. - if a == _bfloat16_dtype: - try: - return _bfloat16_type_promotions[b] - except: - raise TypeError("invalid type promotion of bfloat16 type and {}" - .format(b)) + Args: + a: a :class:`numpy.dtype` or a dtype specifier. + b: a :class:`numpy.dtype` or a dtype specifier. - return onp.promote_types(a, b) + Returns: + A :class:`numpy.dtype` object. + """ + a = onp.dtype(a) + b = onp.dtype(b) + try: + return _type_promotion_table[_jax_type_nums[a], _jax_type_nums[b]] + except KeyError: + pass + raise TypeError("Invalid type promotion of {} and {}".format(a, b)) def is_python_scalar(x): diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ca319d51bb29..ecd456eb5d1c 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2369,6 +2369,7 @@ def inner(a, b, precision=None): def outer(a, b, out=None): if out: raise NotImplementedError("The 'out' argument to outer is not supported.") + a, b = _promote_dtypes(a, b) return ravel(a)[:, None] * ravel(b) @partial(jit, static_argnums=(2, 3, 4)) diff --git a/tests/dtypes_test.py b/tests/dtypes_test.py index 83ffad3e9af0..f8061f960830 100644 --- a/tests/dtypes_test.py +++ b/tests/dtypes_test.py @@ -16,11 +16,14 @@ from __future__ import division from __future__ import print_function +import itertools import operator from absl.testing import absltest from absl.testing import parameterized +import numpy as onp + import jax from jax import dtypes from jax import numpy as np @@ -30,6 +33,25 @@ config.parse_flags_with_absl() FLAGS = config.FLAGS +bool_dtypes = [onp.dtype('bool')] + +signed_dtypes = [onp.dtype('int8'), onp.dtype('int16'), onp.dtype('int32'), + onp.dtype('int64')] + +unsigned_dtypes = [onp.dtype('uint8'), onp.dtype('uint16'), onp.dtype('uint32'), + onp.dtype('uint64')] + +onp_float_dtypes = [onp.dtype('float16'), onp.dtype('float32'), + onp.dtype('float64')] + +float_dtypes = [onp.dtype(dtypes.bfloat16)] + onp_float_dtypes + +complex_dtypes = [onp.dtype('complex64'), onp.dtype('complex128')] + + +all_dtypes = (bool_dtypes + signed_dtypes + unsigned_dtypes + float_dtypes + + complex_dtypes) + class DtypesTest(jtu.JaxTestCase): @@ -81,5 +103,35 @@ def testBinaryPromotion(self, swap, jit): self.assertTrue(isinstance(z, np.ndarray), msg=(x, y, z)) self.assertEqual(z.dtype, dtypes.canonicalize_dtype(dtype), msg=(x, y, z)) + def testPromoteDtypes(self): + for t1 in all_dtypes: + self.assertEqual(t1, dtypes.promote_types(t1, t1)) + + self.assertEqual(t1, dtypes.promote_types(t1, onp.bool_)) + self.assertEqual(onp.dtype(onp.complex128), + dtypes.promote_types(t1, onp.complex128)) + + for t2 in all_dtypes: + # Symmetry + self.assertEqual(dtypes.promote_types(t1, t2), + dtypes.promote_types(t2, t1)) + + self.assertEqual(onp.dtype(onp.float32), + dtypes.promote_types(onp.float16, dtypes.bfloat16)) + + # Promotions of non-inexact types against inexact types always prefer + # the inexact types. + for t in float_dtypes + complex_dtypes: + for i in bool_dtypes + signed_dtypes + unsigned_dtypes: + self.assertEqual(t, dtypes.promote_types(t, i)) + + # Promotions between exact types, or between inexact types, match NumPy. + for groups in [bool_dtypes + signed_dtypes + unsigned_dtypes, + onp_float_dtypes + complex_dtypes]: + for t1, t2 in itertools.combinations(groups, 2): + self.assertEqual(onp.promote_types(t1, t2), + dtypes.promote_types(t1, t2)) + + if __name__ == "__main__": absltest.main() diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 997f9ac0b83e..dc8083bfc3d4 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -39,6 +39,7 @@ from jax import numpy as lnp from jax import test_util as jtu from jax import dtypes +from jax import tree_util from jax.interpreters import partial_eval from jax.test_util import check_grads @@ -208,13 +209,12 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("sinc", 1, [t for t in number_dtypes if t != lnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], - tolerance={onp.complex64: 1e-5}), + tolerance={onp.complex64: 1e-5}, check_dtypes=False), op_record("square", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), op_record("transpose", 1, all_dtypes, all_shapes, jtu.rand_default, ["rev"], check_dtypes=False), op_record("true_divide", 2, all_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), - op_record("where", 3, (onp.float32, onp.int64), all_shapes, jtu.rand_some_zero, []), op_record("diff", 1, number_dtypes, nonzerodim_shapes, jtu.rand_default, ["rev"]), ] @@ -348,11 +348,27 @@ def _shapes_are_equal_length(shapes): return all(len(shape) == len(shapes[0]) for shape in shapes[1:]) +def _promote_like_lnp(fun): + """Decorator that promotes the arguments of `fun` to `lnp.result_type(*args)`. + + lnp and onp have different type promotion semantics; this decorator allows + tests make an onp reference implementation act more like an lnp + implementation. + """ + def wrapper(*args, **kw): + dtype = lnp.result_type(*tree_util.tree_leaves(args)) + args = tree_util.tree_map(lambda a: onp.asarray(a, dtype), args) + return fun(*args, **kw) + return wrapper + class LaxBackedNumpyTests(jtu.JaxTestCase): """Tests for LAX-backed Numpy implementation.""" - def _GetArgsMaker(self, rng, shapes, dtypes): - return lambda: [rng(shape, dtype) for shape, dtype in zip(shapes, dtypes)] + def _GetArgsMaker(self, rng, shapes, dtypes, onp_arrays=True): + def f(): + out = [rng(shape, dtype) for shape, dtype in zip(shapes, dtypes)] + return out if onp_arrays else [lnp.asarray(a) for a in out] + return f @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( @@ -371,21 +387,13 @@ def _GetArgsMaker(self, rng, shapes, dtypes): def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, tolerance): rng = rng_factory() - args_maker = self._GetArgsMaker(rng, shapes, dtypes) - python_scalar = jtu.PYTHON_SCALAR_SHAPE in shapes - scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or - jtu.NUMPY_SCALAR_SHAPE in shapes or - () in shapes) - empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) + args_maker = self._GetArgsMaker(rng, shapes, dtypes, onp_arrays=False) tol = max(jtu.tolerance(dtype, tolerance) for dtype in dtypes) tol = functools.reduce(jtu.join_tolerance, [tolerance, tol, jtu.default_tolerance()]) - self._CheckAgainstNumpy( - onp_op, lnp_op, args_maker, - check_dtypes=check_dtypes and not scalar_arg and not empty_shape, - tol=tol) - self._CompileAndCheck(lnp_op, args_maker, - check_dtypes=check_dtypes and not python_scalar, + self._CheckAgainstNumpy(_promote_like_lnp(onp_op), lnp_op, args_maker, + check_dtypes=check_dtypes, tol=tol) + self._CompileAndCheck(lnp_op, args_maker, check_dtypes=check_dtypes, atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( @@ -402,14 +410,16 @@ def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, for rec in JAX_OPERATOR_OVERLOADS)) def testOperatorOverload(self, name, rng_factory, shapes, dtypes, tol): rng = rng_factory() - args_maker = self._GetArgsMaker(rng, shapes, dtypes) + # onp and lnp arrays have different type promotion rules; force the use of + # lnp arrays. + args_maker = self._GetArgsMaker(rng, shapes, dtypes, onp_arrays=False) fun = lambda *xs: getattr(operator, name.strip('_'))(*xs) scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or jtu.NUMPY_SCALAR_SHAPE in shapes or () in shapes) empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) self._CompileAndCheck( - fun, args_maker, check_dtypes=not scalar_arg and not empty_shape, + fun, args_maker, check_dtypes=True, #not scalar_arg and not empty_shape, atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( @@ -429,7 +439,7 @@ def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, if shapes[1] is jtu.PYTHON_SCALAR_SHAPE: raise SkipTest() # TODO(mattjj): clean up rng = rng_factory() - args_maker = self._GetArgsMaker(rng, shapes, dtypes) + args_maker = self._GetArgsMaker(rng, shapes, dtypes, onp_arrays=False) fun = lambda fst, snd: getattr(snd, name)(fst) tol = max(jtu.tolerance(dtype, op_tolerance) for dtype in dtypes) scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or @@ -437,7 +447,7 @@ def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, () in shapes) empty_shape = any(isinstance(s, tuple) and 0 in s for s in shapes) self._CompileAndCheck( - fun, args_maker, check_dtypes=not scalar_arg and not empty_shape, + fun, args_maker, check_dtypes=True, # not scalar_arg and not empty_shape, atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( @@ -1082,7 +1092,7 @@ def onp_fun(arg): def testStack(self, shape, axis, dtypes, rng_factory): rng = rng_factory() args_maker = lambda: [[rng(shape, dtype) for dtype in dtypes]] - onp_fun = partial(onp.stack, axis=axis) + onp_fun = _promote_like_lnp(partial(onp.stack, axis=axis)) lnp_fun = partial(lnp.stack, axis=axis) self._CheckAgainstNumpy(lnp_fun, onp_fun, args_maker, check_dtypes=True) @@ -1104,7 +1114,7 @@ def testStack(self, shape, axis, dtypes, rng_factory): def testHVDStack(self, shape, op, dtypes, rng_factory): rng = rng_factory() args_maker = lambda: [[rng(shape, dtype) for dtype in dtypes]] - onp_fun = getattr(onp, op) + onp_fun = _promote_like_lnp(getattr(onp, op)) lnp_fun = getattr(lnp, op) self._CheckAgainstNumpy(lnp_fun, onp_fun, args_maker, check_dtypes=True) @@ -1829,8 +1839,31 @@ def onp_fun(*args): tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_{}".format("_".join( + jtu.format_shape_dtype_string(shape, dtype) + for shape, dtype in zip(shapes, dtypes))), + "rng_factory": jtu.rand_default, "shapes": shapes, "dtypes": dtypes} + for shapes in filter(_shapes_are_broadcast_compatible, + CombosWithReplacement(all_shapes, 3)) + for dtypes in CombosWithReplacement(all_dtypes, 3))) + def testWhere(self, rng_factory, shapes, dtypes): + rng = rng_factory() + args_maker = self._GetArgsMaker(rng_factory(), shapes, dtypes) + def onp_fun(cond, x, y): + return _promote_like_lnp(partial(onp.where, cond))(x, y) + self._CheckAgainstNumpy(onp_fun, lnp.where, args_maker, + check_dtypes=True) + self._CompileAndCheck(lnp.where, args_maker, check_dtypes=True) + + def testWhereScalarPromotion(self): + x = lnp.where(lnp.array([True, False]), 3, + lnp.ones((2,), dtype=lnp.float32)) + self.assertEqual(x.dtype, onp.dtype(onp.float32)) + @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": jtu.format_test_name_suffix("select", shapes, + {"testcase_name": jtu.format_test_name_suffix("", shapes, (onp.bool_,) * n + dtypes), "rng_factory": jtu.rand_default, "shapes": shapes, "dtypes": dtypes} for n in range(0, 3) @@ -1838,7 +1871,7 @@ def onp_fun(*args): _shapes_are_broadcast_compatible, CombosWithReplacement(all_shapes, 2 * n + 1)) for dtypes in CombosWithReplacement(all_dtypes, n + 1))) - def test(self, rng_factory, shapes, dtypes): + def testSelect(self, rng_factory, shapes, dtypes): rng = rng_factory() n = len(dtypes) - 1 def args_maker(): @@ -1869,11 +1902,6 @@ def testScalarDtypePromotion(self): jax_numpy_result = (1 + lnp.eye(1, dtype=lnp.float32)).dtype self.assertEqual(orig_numpy_result, jax_numpy_result) - def testWhereScalarPromotion(self): - x = lnp.where(lnp.array([True, False]), 3, - lnp.ones((2,), dtype=lnp.float32)) - self.assertEqual(x.dtype, onp.dtype(onp.float32)) - def testSymmetrizeDtypePromotion(self): x = onp.eye(3, dtype=onp.float32) orig_numpy_result = ((x + x.T) / 2).dtype From 0c0137d787830d8ebd584c4610f7932f3787cab6 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 4 Dec 2019 19:34:21 -0800 Subject: [PATCH 0482/1053] avoid compiling trivial programs from partial_eval also minor clean up in api_test.py --- jax/interpreters/xla.py | 39 +++++++++++--- tests/api_test.py | 110 ++++++++++++++++++++-------------------- 2 files changed, 89 insertions(+), 60 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 94cc770670f3..37a65012e376 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -37,7 +37,8 @@ make_shaped_array, array_types, raise_to_shaped, abstract_token, make_abstract_python_scalar) from ..core import valid_jaxtype, Literal -from ..util import partial, partialmethod, cache, safe_map, prod, unzip2 +from ..util import (partial, partialmethod, cache, safe_map, prod, unzip2, + memoize) from ..lib import xla_bridge as xb from ..lib import xla_client as xc from . import partial_eval as pe @@ -382,16 +383,24 @@ def _xla_call_impl(fun, *args, **params): @lu.cache def _xla_callable(fun, device, backend, *abstract_args): - log_priority = logging.WARNING if FLAGS.jax_log_compiles else logging.DEBUG - logging.log(log_priority, - "Compiling {} for args {}.".format(fun.__name__, abstract_args)) - pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] with core.new_master(pe.JaxprTrace, True) as master: jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) assert not env # no subtraces here del master, env _map(prefetch, it.chain(consts, jaxpr_literals(jaxpr))) + result_handlers = tuple(map(_pval_to_result_handler, pvals)) + + # Computations that only produce constants and/or only rearrange their inputs, + # which are often produced from partial evaluation, don't need compilation, + # and don't need to force their (potentially lazy) arguments. + if not jaxpr.eqns: + device = _get_device(device, backend) + return partial(_execute_trivial, jaxpr, device, consts, result_handlers) + + log_priority = logging.WARNING if FLAGS.jax_log_compiles else logging.DEBUG + logging.log(log_priority, + "Compiling {} for args {}.".format(fun.__name__, abstract_args)) nreps = jaxpr_replicas(jaxpr) if nreps > xb.device_count(backend): @@ -419,7 +428,6 @@ def _xla_callable(fun, device, backend, *abstract_args): num_replicas=nreps, device_assignment=(device.id,) if device else None) compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) - result_handlers = tuple(map(_pval_to_result_handler, pvals)) if nreps == 1: return partial(_execute_compiled, compiled, backend, result_handlers, tuple_args) else: @@ -466,9 +474,28 @@ def _execute_replicated(compiled, backend, handlers, tuple_args, *args): if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] +def _execute_trivial(jaxpr, device, consts, handlers, *args): + env = {core.unitvar : core.unit} + _map(env.setdefault, jaxpr.invars, args) + _map(env.setdefault, jaxpr.constvars, consts) + outs = [canonicalize_dtype(v.val) if type(v) is Literal else env[v] + for v in jaxpr.outvars] + return [x if type(x) is DeviceArray else handler(device_put(x, device)) + for handler, x in zip(handlers, outs)] + def make_tuple(bufs, device, backend): return xb.get_backend(backend).make_tuple(bufs, device) +@memoize +def _get_device(device, backend): + # TODO(mattjj): after jaxlib update, avoid compile here, just to get device + c = xb.make_computation_builder("get_device") + built = c.Build(c.Tuple()) + options = xb.get_compile_options( + num_replicas=1, device_assignment=(device.id,) if device else None) + compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) + out, = compiled.local_devices() + return out xla_call_p = core.Primitive('xla_call') xla_call_p.multiple_results = True diff --git a/tests/api_test.py b/tests/api_test.py index 4744d28f0e6d..527fc8433d8e 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -152,7 +152,6 @@ def f(x): assert g(2.0) == 4.0 assert len(side) == 1 - def test_bad_input(self): def f(x): return x @@ -165,15 +164,6 @@ def f(x): TypeError, ".* 'foo' of type <.*'str'> is not a valid JAX type", lambda: jit(f)("foo")) - # TODO(dougalm): enable when we remove 'None' from pytree nodes - # def test_bad_output(self): - # def f(x): - # pass - - # grad(f)(onp.zeros(3)) - # jit(f)(onp.zeros(3)) - # assert False - def test_grad_tuple_output(self): jtu.check_raises(lambda: grad(lambda x: (x,x))(1.0), TypeError, "Gradient only defined for scalar-output functions. ") @@ -506,7 +496,6 @@ def test_jvp_mismatched_arguments(self): "primal and tangent arguments to jax.jvp must have equal types", lambda: api.jvp(lambda x: -x, (onp.float16(2),), (onp.float32(4),))) - def test_jvp_non_tuple_arguments(self): def f(x, y): return x + y self.assertRaisesRegex( @@ -1310,49 +1299,6 @@ def f(x, y): return x + y "positional arguments.", lambda: partial(df, x=0.)(y=1.)) - -class JaxprTest(jtu.JaxTestCase): - - def test_scalar_literals(self): - jaxpr = api.make_jaxpr(lambda x: x + 2)(42) - self.assertLen(jaxpr.jaxpr.constvars, 0) - - def test_const(self): - def fun(x): - return (x, 1., np.zeros(1)) - - jaxpr = api.make_jaxpr(fun)(0.) - self.assertMultiLineStrippedEqual(str(jaxpr), """ - { lambda b ; ; a. - let - in [a, 1.0, b] } - """) - - def test_cond(self): - def f(x): - return lax.cond(x >= 0., - x + 1., - lambda xt: xt + x, - x + 2., - lambda xf: xf - x) - jaxpr = api.make_jaxpr(f)(3.) - self.assertMultiLineStrippedEqual(str(jaxpr), """ - { lambda ; ; a. - let b = ge a 0.0 - c = add a 1.0 - d = add a 2.0 - e = cond[ false_jaxpr={ lambda ; ; b a. - let c = sub a b - in [c] } - false_nconsts=1 - true_jaxpr={ lambda ; ; b a. - let c = add a b - in [c] } - true_nconsts=1 ] b a c a d - in [e] } - """) - - def test_grad_of_jit_compilation_caching(self): if not hasattr(self, "assertLogs"): raise unittest.SkipTest("test requires assertLogs (python 3)") @@ -1561,6 +1507,62 @@ def binom_checkpoint(funs): self.assertAllClose(f1(x), f2(x), check_dtypes=False) self.assertAllClose(api.grad(f1)(x), api.grad(f2)(x), check_dtypes=False) + def test_trivial_computations(self): + x = np.array([1, 2, 3]) + y = api.jit(lambda x: x)(x) + self.assertIs(x, y) + + z1, z2 = api.jit(lambda x: (x, x))(x) + self.assertIs(z1, z2) + + x1, x2 = np.array([1, 2]), np.array([2, 3]) + z1, z2, z3 = api.jit(lambda x, y: (y, 1, x))(x1, x2) + self.assertIs(z1, x2) + self.assertIs(z3, x1) + self.assertEqual(z2, 1) + + +class JaxprTest(jtu.JaxTestCase): + + def test_scalar_literals(self): + jaxpr = api.make_jaxpr(lambda x: x + 2)(42) + self.assertLen(jaxpr.jaxpr.constvars, 0) + + def test_const(self): + def fun(x): + return (x, 1., np.zeros(1)) + + jaxpr = api.make_jaxpr(fun)(0.) + self.assertMultiLineStrippedEqual(str(jaxpr), """ + { lambda b ; ; a. + let + in [a, 1.0, b] } + """) + + def test_cond(self): + def f(x): + return lax.cond(x >= 0., + x + 1., + lambda xt: xt + x, + x + 2., + lambda xf: xf - x) + jaxpr = api.make_jaxpr(f)(3.) + self.assertMultiLineStrippedEqual(str(jaxpr), """ + { lambda ; ; a. + let b = ge a 0.0 + c = add a 1.0 + d = add a 2.0 + e = cond[ false_jaxpr={ lambda ; ; b a. + let c = sub a b + in [c] } + false_nconsts=1 + true_jaxpr={ lambda ; ; b a. + let c = add a b + in [c] } + true_nconsts=1 ] b a c a d + in [e] } + """) + if __name__ == '__main__': absltest.main() From 7a154f71bc05268c3f7286f499666d49f886f999 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 5 Dec 2019 18:59:29 -0800 Subject: [PATCH 0483/1053] Fix jaxlib build by not exposing nvcc to pybind11. (#1819) --- jaxlib/BUILD | 26 ++++++++++++------- jaxlib/cublas.cc | 2 +- jaxlib/cuda_prng_kernels.cc | 7 +++-- jaxlib/cuda_prng_kernels.cu.cc | 5 ++-- jaxlib/cuda_prng_kernels.h | 4 +-- jaxlib/cusolver.cc | 2 +- jaxlib/kernel_helpers.h | 21 +++++---------- jaxlib/kernel_pybind11_helpers.h | 44 ++++++++++++++++++++++++++++++++ 8 files changed, 80 insertions(+), 31 deletions(-) create mode 100644 jaxlib/kernel_pybind11_helpers.h diff --git a/jaxlib/BUILD b/jaxlib/BUILD index 4db2b9fb4b5d..f716bebc9ccd 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -22,6 +22,20 @@ licenses(["notice"]) package(default_visibility = ["//visibility:public"]) +cc_library( + name = "kernel_pybind11_helpers", + hdrs = ["kernel_pybind11_helpers.h"], + copts = [ + "-fexceptions", + "-fno-strict-aliasing", + ], + features = ["-use_header_modules"], + deps = [ + ":kernel_helpers", + "@pybind11", + ], +) + cc_library( name = "kernel_helpers", hdrs = ["kernel_helpers.h"], @@ -32,7 +46,6 @@ cc_library( features = ["-use_header_modules"], deps = [ "@com_google_absl//absl/base", - "@pybind11", ], ) @@ -106,7 +119,7 @@ pybind_extension( module_name = "cublas_kernels", deps = [ ":gpu_kernel_helpers", - ":kernel_helpers", + ":kernel_pybind11_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", "@com_google_absl//absl/container:flat_hash_map", @@ -134,7 +147,7 @@ pybind_extension( module_name = "cusolver_kernels", deps = [ ":gpu_kernel_helpers", - ":kernel_helpers", + ":kernel_pybind11_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", "@com_google_absl//absl/container:flat_hash_map", @@ -154,15 +167,10 @@ cuda_library( name = "cuda_prng_kernels_lib", srcs = ["cuda_prng_kernels.cu.cc"], hdrs = ["cuda_prng_kernels.h"], - copts = [ - "-fexceptions", - "-fno-strict-aliasing", - ], deps = [ ":gpu_kernel_helpers", ":kernel_helpers", "@local_config_cuda//cuda:cuda_headers", - "@pybind11", ], ) @@ -177,7 +185,7 @@ pybind_extension( module_name = "cuda_prng_kernels", deps = [ ":cuda_prng_kernels_lib", - ":kernel_helpers", + ":kernel_pybind11_helpers", "@local_config_cuda//cuda:cuda_headers", "@local_config_cuda//cuda:cudart", "@pybind11", diff --git a/jaxlib/cublas.cc b/jaxlib/cublas.cc index f96f0498741a..48db7b8b6d18 100644 --- a/jaxlib/cublas.cc +++ b/jaxlib/cublas.cc @@ -29,7 +29,7 @@ limitations under the License. #include "include/pybind11/pybind11.h" #include "include/pybind11/stl.h" #include "jaxlib/gpu_kernel_helpers.h" -#include "jaxlib/kernel_helpers.h" +#include "jaxlib/kernel_pybind11_helpers.h" namespace jax { namespace { diff --git a/jaxlib/cuda_prng_kernels.cc b/jaxlib/cuda_prng_kernels.cc index 3f9eb9c97d1f..b1c57bdb1389 100644 --- a/jaxlib/cuda_prng_kernels.cc +++ b/jaxlib/cuda_prng_kernels.cc @@ -15,7 +15,7 @@ limitations under the License. #include "jaxlib/cuda_prng_kernels.h" -#include "jaxlib/kernel_helpers.h" +#include "jaxlib/kernel_pybind11_helpers.h" #include "include/pybind11/pybind11.h" namespace jax { @@ -29,7 +29,10 @@ pybind11::dict Registrations() { PYBIND11_MODULE(cuda_prng_kernels, m) { m.def("registrations", &Registrations); - m.def("cuda_threefry2x32_descriptor", &BuildCudaThreeFry2x32Descriptor); + m.def("cuda_threefry2x32_descriptor", [](std::int64_t n) { + std::string result = BuildCudaThreeFry2x32Descriptor(n); + return pybind11::bytes(result); + }); } } // namespace diff --git a/jaxlib/cuda_prng_kernels.cu.cc b/jaxlib/cuda_prng_kernels.cu.cc index f318c584e4f3..eeedc7d39c5a 100644 --- a/jaxlib/cuda_prng_kernels.cu.cc +++ b/jaxlib/cuda_prng_kernels.cu.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ +#include #include #include "jaxlib/cuda_prng_kernels.h" @@ -101,8 +102,8 @@ struct ThreeFry2x32Descriptor { std::int64_t n; }; -pybind11::bytes BuildCudaThreeFry2x32Descriptor(std::int64_t n) { - return PackDescriptor(ThreeFry2x32Descriptor{n}); +std::string BuildCudaThreeFry2x32Descriptor(std::int64_t n) { + return PackDescriptorAsString(ThreeFry2x32Descriptor{n}); } void CudaThreeFry2x32(cudaStream_t stream, void** buffers, const char* opaque, diff --git a/jaxlib/cuda_prng_kernels.h b/jaxlib/cuda_prng_kernels.h index 406eeed1dbbc..6512bee59e7b 100644 --- a/jaxlib/cuda_prng_kernels.h +++ b/jaxlib/cuda_prng_kernels.h @@ -17,13 +17,13 @@ limitations under the License. #define JAXLIB_PRNG_KERNELS_H_ #include +#include #include "third_party/gpus/cuda/include/cuda_runtime_api.h" -#include "include/pybind11/pybind11.h" namespace jax { -pybind11::bytes BuildCudaThreeFry2x32Descriptor(std::int64_t n); +std::string BuildCudaThreeFry2x32Descriptor(std::int64_t n); void CudaThreeFry2x32(cudaStream_t stream, void** buffers, const char* opaque, std::size_t opaque_len); diff --git a/jaxlib/cusolver.cc b/jaxlib/cusolver.cc index 161cadcbc574..8d1c49f26d12 100644 --- a/jaxlib/cusolver.cc +++ b/jaxlib/cusolver.cc @@ -30,7 +30,7 @@ limitations under the License. #include "include/pybind11/pybind11.h" #include "include/pybind11/stl.h" #include "jaxlib/gpu_kernel_helpers.h" -#include "jaxlib/kernel_helpers.h" +#include "jaxlib/kernel_pybind11_helpers.h" namespace jax { namespace { diff --git a/jaxlib/kernel_helpers.h b/jaxlib/kernel_helpers.h index ce818b4c01db..e2c7ba19c1e0 100644 --- a/jaxlib/kernel_helpers.h +++ b/jaxlib/kernel_helpers.h @@ -18,22 +18,20 @@ limitations under the License. #include #include +#include #include "absl/base/casts.h" -#include "include/pybind11/pybind11.h" namespace jax { -// Descriptor objects are opaque host-side objects used to pass data from JAX -// to the custom kernel launched by XLA. Currently simply treat host-side -// structures as byte-strings; this is not portable across architectures. If -// portability is needed, we could switch to using a representation such as -// protocol buffers or flatbuffers. +// See kernel_pybind11_helpers.h for info on descriptor objects. We separate out +// the functionality that doesn't require pybind11 for building CUDA libraries, +// since older versions nvcc don't seem to be able to compile pybind11. -// Packs a descriptor object into a pybind11::bytes structure. +// Packs a descriptor object into a byte string. template -pybind11::bytes PackDescriptor(const T& descriptor) { - return pybind11::bytes(absl::bit_cast(&descriptor), sizeof(T)); +std::string PackDescriptorAsString(const T& descriptor) { + return std::string(absl::bit_cast(&descriptor), sizeof(T)); } // Unpacks a descriptor object from a byte string. @@ -45,11 +43,6 @@ const T* UnpackDescriptor(const char* opaque, std::size_t opaque_len) { return absl::bit_cast(opaque); } -template -pybind11::capsule EncapsulateFunction(T* fn) { - return pybind11::capsule(absl::bit_cast(fn), "xla._CUSTOM_CALL_TARGET"); -} - } // namespace jax #endif // JAXLIB_KERNEL_HELPERS_H_ diff --git a/jaxlib/kernel_pybind11_helpers.h b/jaxlib/kernel_pybind11_helpers.h new file mode 100644 index 000000000000..8319610d65cb --- /dev/null +++ b/jaxlib/kernel_pybind11_helpers.h @@ -0,0 +1,44 @@ +/* Copyright 2019 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef JAXLIB_KERNEL_PYBIND11_HELPERS_H_ +#define JAXLIB_KERNEL_PYBIND11_HELPERS_H_ + +#include "include/pybind11/pybind11.h" +#include "jaxlib/kernel_helpers.h" + +namespace jax { + +// Descriptor objects are opaque host-side objects used to pass data from JAX +// to the custom kernel launched by XLA. Currently simply treat host-side +// structures as byte-strings; this is not portable across architectures. If +// portability is needed, we could switch to using a representation such as +// protocol buffers or flatbuffers. + +// Packs a descriptor object into a pybind11::bytes structure. +// UnpackDescriptor() is available in kernel_helpers.h. +template +pybind11::bytes PackDescriptor(const T& descriptor) { + return pybind11::bytes(PackDescriptorAsString(descriptor)); +} + +template +pybind11::capsule EncapsulateFunction(T* fn) { + return pybind11::capsule(absl::bit_cast(fn), "xla._CUSTOM_CALL_TARGET"); +} + +} // namespace jax + +#endif // JAXLIB_KERNEL_PYBIND11_HELPERS_H_ From 1da950d066d18291411c9549d9c4e2b9fbe9d859 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 5 Dec 2019 21:38:59 -0800 Subject: [PATCH 0484/1053] Update WORKSPACE --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0de8907c683..4dc255c2c6e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "4aff7af41bd80abb3e2634ee414738b9358aaa3c69f7e481ad7e4e604fc3d39c", - strip_prefix = "tensorflow-23275fb35cf17482d147f88ce7d8f4ce9c2376f3", + sha256 = "622a56b2b3ef9b4e6b079880af03ba4857503cd375de0a130bc7561955df3107", + strip_prefix = "tensorflow-6c66b3a1a43effa597fce76c39a4f9e5439e37ea", urls = [ - "https://github.com/tensorflow/tensorflow/archive/23275fb35cf17482d147f88ce7d8f4ce9c2376f3.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/6c66b3a1a43effa597fce76c39a4f9e5439e37ea.tar.gz", ], ) From d17e69ee2dc3e973deb1392215e8a9541b669827 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 6 Dec 2019 10:23:17 -0800 Subject: [PATCH 0485/1053] add whitelist for multi-host collectives --- jax/interpreters/pxla.py | 10 ++++++++++ jax/interpreters/xla.py | 24 ++++++++++++++++++++++++ jax/lax/lax_parallel.py | 1 + 3 files changed, 35 insertions(+) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 13132ba8176e..eede73d90289 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -460,6 +460,14 @@ def dynamic_fun(dummy, *args): del master out_pvs, out_consts = unzip2(out_pvals) + # TODO(skye,mattjj): allow more collectives on multi-host as we test them, but + # for now raise an error + if xb.host_count() > 1: + used_collectives = set(xla.jaxpr_collectives(jaxpr)) + if not used_collectives.issubset(multi_host_supported_collectives): + msg = "using collectives that aren't supported for multi-host: {}" + raise TypeError(msg.format(", ".join(map(str, used_collectives)))) + if all(pv is None for pv in out_pvs): # When the output doesn't depend on the input we don't need to compile an # XLA computation at all; we handle this as a special case so we can stage @@ -514,6 +522,8 @@ def dynamic_fun(dummy, *args): handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, out_pvals) return partial(execute_replicated, compiled, backend, num_local_replicas, handle_args, handle_outs) +multi_host_supported_collectives = set() + class ResultToPopulate(object): pass result_to_populate = ResultToPopulate() diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 37a65012e376..64ae8700784c 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -353,6 +353,9 @@ def eqn_replicas(eqn): else: return 1 +# TODO(mattjj,skyewm): the functions here are utilities for checking if +# not-yet-supported features are used with multi-host programming + def jaxpr_has_pmap(jaxpr): return any(eqn_has_pmap(eqn) for eqn in jaxpr.eqns) @@ -368,6 +371,27 @@ def eqn_has_pmap(eqn): return 'pmap' in eqn.primitive.name +def jaxpr_collectives(jaxpr): + return it.chain.from_iterable(eqn_collectives(eqn) for eqn in jaxpr.eqns) + +def eqn_collectives(eqn): + if eqn.bound_subjaxprs: + (subjaxpr, _, _), = eqn.bound_subjaxprs + for c in jaxpr_collectives(subjaxpr): + yield c + elif eqn.primitive in initial_style_translations: + for param in eqn.params.values(): + if type(param) is core.Jaxpr: + for c in jaxpr_collectives(param): + yield c + elif type(param) is core.TypedJaxpr: + for c in jaxpr_collectives(param.jaxpr): + yield c + else: + if eqn.primitive in parallel_translations: + yield eqn.primitive + + ### xla_call underlying jit def _xla_call_impl(fun, *args, **params): diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 991b98a22a3c..661a96ed49c2 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -210,6 +210,7 @@ def _psum_translation_rule(c, val, replica_groups, backend=None): xla.parallel_translations[psum_p] = _psum_translation_rule pxla.parallel_pure_rules[psum_p] = lambda x, shape: x * prod(shape) ad.deflinear(psum_p, lambda t, axis_name: [psum(t, axis_name)]) +pxla.multi_host_supported_collectives.add(psum_p) pmax_p = standard_pmap_primitive('pmax') From 5eafc7baba966e868fba1093e8a50c445130b873 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 6 Dec 2019 10:29:54 -0800 Subject: [PATCH 0486/1053] improve condition for multi-host pmap checking --- jax/interpreters/pxla.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index eede73d90289..5e385e80402c 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -462,7 +462,11 @@ def dynamic_fun(dummy, *args): # TODO(skye,mattjj): allow more collectives on multi-host as we test them, but # for now raise an error - if xb.host_count() > 1: + if devices is not None: + is_multi_host_pmap = any(d.host_id != xb.host_id() for d in devices) + else: + is_multi_host_pmap = xb.host_count() > 1 + if is_multi_host_pmap: used_collectives = set(xla.jaxpr_collectives(jaxpr)) if not used_collectives.issubset(multi_host_supported_collectives): msg = "using collectives that aren't supported for multi-host: {}" From fb79d56ace6bbb561fabd00185976d8e9401c2cd Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 6 Dec 2019 14:49:27 -0500 Subject: [PATCH 0487/1053] Fixes to type handling. (#1824) * Fixes to type handling. * Specify exactly which types to test in lax_test.py, rather than relying on non-x64 mode to squash unsupported types. * Fix some excessive promotions in jax.numpy. * Fix some buggy RNGs that returned the wrong type for complex inputs. --- jax/numpy/lax_numpy.py | 101 ++++++++++++++++++++--------------------- jax/test_util.py | 16 +++++-- tests/lax_test.py | 91 ++++++++++++++++++++----------------- 3 files changed, 111 insertions(+), 97 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ecd456eb5d1c..961e27f20d11 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -811,7 +811,7 @@ def angle(z): dtype = _dtype(re) if not issubdtype(dtype, inexact) or ( issubdtype(_dtype(z), floating) and ndim(z) == 0): - dtype = dtypes.canonicalize_dtype(float64) + dtype = dtypes.canonicalize_dtype(float_) re = lax.convert_element_type(re, dtype) im = lax.convert_element_type(im, dtype) return lax.atan2(im, re) @@ -1254,52 +1254,51 @@ def mean(a, axis=None, dtype=None, out=None, keepdims=False): @_wraps(onp.average) def average(a, axis=None, weights=None, returned=False): - a = asarray(a) + a = asarray(a) - if weights is None: # Treat all weights as 1 - avg = mean(a, axis=axis) - if axis is None: - weights_sum = full((), size(a), dtype=avg.dtype) - else: - weights_sum = full_like(avg, a.shape[axis], dtype=avg.dtype) + if weights is None: # Treat all weights as 1 + avg = mean(a, axis=axis) + if axis is None: + weights_sum = full((), size(a), dtype=avg.dtype) else: - weights = asarray(weights) + weights_sum = full_like(avg, a.shape[axis], dtype=avg.dtype) + else: + weights = asarray(weights) - if issubdtype(a.dtype, integer) or issubdtype(a.dtype, bool_): - out_dtype = dtypes.canonicalize_dtype(result_type(a.dtype, - weights.dtype, - floating)) - else: - out_dtype = dtypes.canonicalize_dtype(result_type(a.dtype, weights.dtype)) - - a_shape = shape(a) - a_ndim = len(a_shape) - weights_shape = shape(weights) - axis = None if axis is None else _canonicalize_axis(axis, a_ndim) - - if a_shape != weights_shape: - # Make sure the dimensions work out - if axis is None: - raise ValueError("Axis must be specified when shapes of a and " - "weights differ.") - if len(weights_shape) != 1: - raise ValueError("1D weights expected when shapes of a and " - "weights differ.") - if weights_shape[0] != a_shape[axis]: - raise ValueError("Length of weights not " - "compatible with specified axis.") - - weights = broadcast_to(weights, (a_ndim - 1) * (1,) + weights_shape) - weights = moveaxis(weights, -1, axis) - - weights_sum = sum(weights, axis=axis, dtype=out_dtype) - avg = sum(multiply(a, weights), axis=axis, dtype=out_dtype) / weights_sum - - if returned: - if avg.shape != weights_sum.shape: - weights_sum = broadcast_to(weights_sum, avg.shape) - return avg, weights_sum - return avg + if issubdtype(a.dtype, inexact): + out_dtype = result_type(a.dtype, weights.dtype) + else: + out_dtype = result_type(a.dtype, weights.dtype, float_) + out_dtype = dtypes.canonicalize_dtype(out_dtype) + + a_shape = shape(a) + a_ndim = len(a_shape) + weights_shape = shape(weights) + axis = None if axis is None else _canonicalize_axis(axis, a_ndim) + + if a_shape != weights_shape: + # Make sure the dimensions work out + if axis is None: + raise ValueError("Axis must be specified when shapes of a and " + "weights differ.") + if len(weights_shape) != 1: + raise ValueError("1D weights expected when shapes of a and " + "weights differ.") + if weights_shape[0] != a_shape[axis]: + raise ValueError("Length of weights not " + "compatible with specified axis.") + + weights = broadcast_to(weights, (a_ndim - 1) * (1,) + weights_shape) + weights = moveaxis(weights, -1, axis) + + weights_sum = sum(weights, axis=axis, dtype=out_dtype) + avg = sum(multiply(a, weights), axis=axis, dtype=out_dtype) / weights_sum + + if returned: + if avg.shape != weights_sum.shape: + weights_sum = broadcast_to(weights_sum, avg.shape) + return avg, weights_sum + return avg @_wraps(onp.var) @@ -1661,7 +1660,7 @@ def array(object, dtype=None, copy=True, order="K", ndmin=0): if object: out = stack([array(elt, dtype=dtype) for elt in object]) else: - out = onp.array([], dtype) + out = onp.array([], dtype or float_) else: try: view = memoryview(object) @@ -1798,7 +1797,8 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, lax._check_user_dtype_supported(dtype, "linspace") if num < 0: raise ValueError("Number of samples, %s, must be non-negative." % num) - dtype = dtype or result_type(start, stop, float(num)) + dt = result_type(start, stop, float(num)) + dtype = dtype or dt bounds_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) broadcast_start = broadcast_to(start, bounds_shape) axis = len(bounds_shape) + axis + 1 if axis < 0 else axis @@ -1807,9 +1807,9 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, iota_shape[axis] = num div = (num - 1) if endpoint else num if num > 1: - delta = (stop - start) / div + delta = lax.convert_element_type(stop - start, dt) / div out = (reshape(broadcast_start, bounds_shape) + - reshape(lax.iota(dtype, num), iota_shape) * + reshape(lax.iota(dt, num), iota_shape) * reshape(delta, bounds_shape)) elif num == 1: delta = nan @@ -1818,7 +1818,7 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, empty_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) empty_shape.insert(axis, 0) delta = nan - out = reshape(array([]), empty_shape).astype(dtype) + out = reshape(array([], dtype=dt), empty_shape) if retstep: return lax.convert_element_type(out, dtype), delta else: @@ -3050,8 +3050,7 @@ def cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, if m.ndim > 2: raise ValueError("m has more than 2 dimensions") # same as numpy error - X = array(m, ndmin=2, dtype=dtypes.canonicalize_dtype( - result_type(m, onp.float64)), copy=False) + X = array(m, ndmin=2, dtype=dtypes.canonicalize_dtype(result_type(m, float_))) if not rowvar and X.shape[0] != 1: X = X.T if X.shape[0] == 0: diff --git a/jax/test_util.py b/jax/test_util.py index 9d75c44249d3..34389249f9e1 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -250,8 +250,8 @@ def device_under_test(): def supported_dtypes(): if device_under_test() == "tpu": - return {onp.bool_, onp.int32, onp.int64, onp.uint32, onp.uint64, - dtypes.bfloat16, onp.float32, onp.complex64} + return {onp.bool_, onp.int32, onp.uint32, dtypes.bfloat16, onp.float32, + onp.complex64} else: return {onp.bool_, onp.int8, onp.int16, onp.int32, onp.int64, onp.uint8, onp.uint16, onp.uint32, onp.uint64, @@ -441,7 +441,9 @@ def rand(shape, dtype): if dtypes.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype - return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) + out = (rand(shape, base_dtype) + + onp.array(1j, dtype) * rand(shape, base_dtype)) + return _cast_to_shape(out, shape, dtype) dims = _dims_of_shape(shape) posinf_flips = rng.rand(*dims) < 0.1 @@ -464,7 +466,9 @@ def rand(shape, dtype): """The random sampler function.""" if dtypes.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype - return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) + out = (rand(shape, base_dtype) + + onp.array(1j, dtype) * rand(shape, base_dtype)) + return _cast_to_shape(out, shape, dtype) if not dtypes.issubdtype(dtype, onp.floating): # only float types have inf @@ -497,7 +501,9 @@ def rand(shape, dtype): if dtypes.issubdtype(dtype, onp.complexfloating): base_dtype = onp.real(onp.array(0, dtype=dtype)).dtype - return rand(shape, base_dtype) + 1j * rand(shape, base_dtype) + out = (rand(shape, base_dtype) + + onp.array(1j, dtype) * rand(shape, base_dtype)) + return _cast_to_shape(out, shape, dtype) dims = _dims_of_shape(shape) posinf_flips = rng.rand(*dims) < 0.1 diff --git a/tests/lax_test.py b/tests/lax_test.py index f828c54504a2..afe20548f55a 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -56,9 +56,12 @@ def num_float_bits(dtype): float_dtypes = list(jtu.supported_dtypes().intersection( {dtypes.bfloat16, onp.float16, onp.float32, onp.float64})) -complex_dtypes = [onp.complex64, onp.complex128] +complex_elem_dtypes = list(jtu.supported_dtypes().intersection( + {onp.float32, onp.float64})) +complex_dtypes = list(jtu.supported_dtypes().intersection( + {onp.complex64, onp.complex128})) inexact_dtypes = float_dtypes + complex_dtypes -int_dtypes = [onp.int32, onp.int64] +int_dtypes = list(jtu.supported_dtypes().intersection({onp.int32, onp.int64})) bool_dtypes = [onp.bool_] default_dtypes = float_dtypes + int_dtypes all_dtypes = float_dtypes + complex_dtypes + int_dtypes + bool_dtypes @@ -124,8 +127,8 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("real", 1, complex_dtypes, jtu.rand_default), op_record("imag", 1, complex_dtypes, jtu.rand_default), - op_record("complex", 2, [onp.float32, onp.float64], jtu.rand_default), - op_record("conj", 1, [onp.float32, onp.float64] + complex_dtypes, + op_record("complex", 2, complex_elem_dtypes, jtu.rand_default), + op_record("conj", 1, complex_elem_dtypes + complex_dtypes, jtu.rand_default), op_record("abs", 1, default_dtypes + complex_dtypes, jtu.rand_default), op_record("pow", 2, float_dtypes + complex_dtypes, jtu.rand_positive), @@ -1599,93 +1602,99 @@ def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): return GradTestSpec( op, nargs, order, rng_factory, dtypes, name or op.__name__, tol) +grad_float_dtypes = list(jtu.supported_dtypes().intersection( + {onp.float32, onp.float64})) +grad_complex_dtypes = list(jtu.supported_dtypes().intersection( + {onp.complex64, onp.complex128})) +grad_inexact_dtypes = grad_float_dtypes + grad_complex_dtypes + LAX_GRAD_OPS = [ grad_test_spec(lax.neg, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.floor, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.ceil, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.round, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.exp, nargs=1, order=2, rng_factory=jtu.rand_small, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.expm1, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.log, nargs=1, order=2, rng_factory=jtu.rand_positive, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.log1p, nargs=1, order=2, rng_factory=jtu.rand_positive, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.sinh, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64], tol=1e-5), + dtypes=grad_float_dtypes + [onp.complex64], tol=1e-5), grad_test_spec(lax.cosh, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64], tol=1e-5), + dtypes=grad_inexact_dtypes, tol=1e-5), grad_test_spec(lax.tanh, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64], tol=1e-5), + dtypes=grad_inexact_dtypes, tol=1e-5), grad_test_spec(lax.sin, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.cos, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.tan, nargs=1, order=2, rng_factory=partial(jtu.rand_uniform, -1.3, 1.3), - dtypes=[onp.float64, onp.complex64], tol=1e-3), + dtypes=grad_inexact_dtypes, tol=1e-3), grad_test_spec(lax.asin, nargs=1, order=2, rng_factory=partial(jtu.rand_uniform, -1.3, 1.3), - dtypes=[onp.float64], tol=1e-3), + dtypes=grad_float_dtypes, tol=1e-3), grad_test_spec(lax.acos, nargs=1, order=2, rng_factory=partial(jtu.rand_uniform, -1.3, 1.3), - dtypes=[onp.float64], tol=1e-3), + dtypes=grad_float_dtypes, tol=1e-3), # TODO(proteneer): atan2 input is already a representation of a # complex number. Need to think harder about what this even means # if each input itself is a complex number. grad_test_spec(lax.atan2, nargs=2, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.erf, nargs=1, order=2, rng_factory=jtu.rand_small, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.erfc, nargs=1, order=2, rng_factory=jtu.rand_small, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.erf_inv, nargs=1, order=2, rng_factory=jtu.rand_small, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), # grad_test_spec(lax.lgamma, nargs=1, order=2, rng_factory=jtu.rand_small, - # dtypes=[onp.float64]), # TODO(mattjj): enable + # dtypes=grad_float_dtypes), # TODO(mattjj): enable grad_test_spec(lax.bessel_i0e, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.bessel_i1e, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.real, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.complex64]), + dtypes=grad_complex_dtypes), grad_test_spec(lax.imag, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.complex64]), + dtypes=grad_complex_dtypes), grad_test_spec(lax.complex, nargs=2, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float32]), + dtypes=grad_float_dtypes), grad_test_spec(lax.conj, nargs=1, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float32, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.abs, nargs=1, order=2, rng_factory=jtu.rand_positive, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.pow, nargs=2, order=2, rng_factory=jtu.rand_positive, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.add, nargs=2, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.sub, nargs=2, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.mul, nargs=2, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.div, nargs=2, order=1, rng_factory=jtu.rand_not_small, - dtypes=[onp.float64, onp.complex64]), + dtypes=grad_inexact_dtypes), grad_test_spec(lax.max, nargs=2, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), grad_test_spec(lax.min, nargs=2, order=2, rng_factory=jtu.rand_default, - dtypes=[onp.float64]), + dtypes=grad_float_dtypes), # TODO(mattjj): make some-equal checks more robust, enable second-order # grad_test_spec(lax.max, nargs=2, order=1, rng_factory=jtu.rand_some_equal, - # dtypes=[onp.float64], name="MaxSomeEqual"), + # dtypes=grad_float_dtypes, name="MaxSomeEqual"), # grad_test_spec(lax.min, nargs=2, order=1, rng_factory=jtu.rand_some_equal, - # dtypes=[onp.float64], name="MinSomeEqual"), + # dtypes=grad_float_dtypes, name="MinSomeEqual"), ] GradSpecialValuesTestSpec = collections.namedtuple( From 7bf2d77bd9f7802bdfe03425cf5a0a122659a60b Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 6 Dec 2019 12:03:22 -0800 Subject: [PATCH 0488/1053] Clarify SPMD requirement for pmap (#1826) --- jax/api.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index b3608cdc6d28..1619447aceb2 100644 --- a/jax/api.py +++ b/jax/api.py @@ -749,7 +749,10 @@ def pmap(fun, axis_name=None, devices=None, backend=None): *all* participating devices, including those on other hosts, via device-to-device communication. Conceptually, this can be thought of as running a pmap over a single array sharded across hosts, where each host - "sees" only its local shard of the input and output. + "sees" only its local shard of the input and output. The SPMD model requires + that the same multi-host pmaps must be run in the same order on all devices, + but they can be interspersed with arbitrary operations running on a single + host. Args: fun: Function to be mapped over argument axes. Its arguments and return From eabe77e20192e6abea810e23d28b9096117a05fc Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 6 Dec 2019 19:24:05 -0500 Subject: [PATCH 0489/1053] Update JAX version. (#1828) --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 8de3870cb7a6..8315d6e33cf7 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.54" +__version__ = "0.1.55" From 80f455d3f0688734efc384c304e68f8c0d060501 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 6 Dec 2019 20:32:46 -0800 Subject: [PATCH 0490/1053] make eval_jaxpr get jit cache hits --- jax/core.py | 27 +++++++++++++++++++-------- tests/api_test.py | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/jax/core.py b/jax/core.py index d9e039f70016..fa6f9210764d 100644 --- a/jax/core.py +++ b/jax/core.py @@ -27,7 +27,8 @@ import six from . import linear_util as lu -from .util import safe_zip, safe_map, partial, curry +from .linear_util import transformation, transformation_with_aux, wrap_init +from .util import safe_zip, safe_map, partial, curry, WrapHashably from .pprint_util import pp, vcat, hcat, pp_kv_pairs # TODO(dougalm): the trace cache breaks the leak detector. Consisder solving. @@ -197,18 +198,28 @@ def write(v, val): map(write, jaxpr.freevars, freevar_vals) for eqn in jaxpr.eqns: in_vals = map(read, eqn.invars) - subfuns = [partial(eval_jaxpr, subjaxpr, map(read, const_bindings), - map(read, freevar_bindings)) - for subjaxpr, const_bindings, freevar_bindings - in eqn.bound_subjaxprs] - subfuns = map(lu.wrap_init, subfuns) - ans = eqn.primitive.bind(*(subfuns + in_vals), **eqn.params) + if not eqn.bound_subjaxprs: + ans = eqn.primitive.bind(*in_vals, **eqn.params) + else: + (subjaxpr, const_bindings, freevar_bindings), = eqn.bound_subjaxprs + sub_consts = tuple(WrapHashably(read(v)) for v in const_bindings) + sub_freevar_vals = tuple(WrapHashably(read(v)) for v in freevar_bindings) + fun = hashable_partial(wrap_init(eval_jaxpr), subjaxpr, + sub_consts, sub_freevar_vals) + ans = eqn.primitive.bind(fun, *in_vals, **eqn.params) if eqn.primitive.multiple_results: map(write, eqn.outvars, ans) else: write(eqn.outvars[0], ans) return map(read, jaxpr.outvars) +@transformation +def hashable_partial(jaxpr, consts_hashable, freevar_vals_hashable, *args): + consts = [x.val for x in consts_hashable] + freevar_vals = [x.val for x in freevar_vals_hashable] + ans = yield (jaxpr, consts, freevar_vals) + args, {} + yield ans + def full_lower(val): if isinstance(val, Tracer): @@ -565,7 +576,7 @@ def apply_todos(todos, outs): outs = map(full_lower, todos.pop()(outs)) return outs -@lu.transformation_with_aux +@transformation_with_aux def process_env_traces(primitive, level, params_tuple, *args): outs = yield args, {} params = dict(params_tuple) diff --git a/tests/api_test.py b/tests/api_test.py index 527fc8433d8e..6f15f0ed3712 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -34,9 +34,9 @@ import jax.numpy as np from jax import jit, grad, device_put, jacfwd, jacrev, hessian from jax import api, lax -from jax.core import Primitive +from jax import core from jax.interpreters import ad -from jax.interpreters.xla import DeviceArray +from jax.interpreters import xla from jax.abstract_arrays import concretization_err_msg from jax.lib import xla_bridge as xb from jax import test_util as jtu @@ -241,7 +241,7 @@ def test_casts(self): "|Abstract value passed to .*)", lambda: jit(f)(0)) def test_unimplemented_interpreter_rules(self): - foo_p = Primitive('foo') + foo_p = core.Primitive('foo') def foo(x): return foo_p.bind(x) @@ -268,7 +268,7 @@ def foo(x): def test_device_put_and_get(self): x = onp.arange(12.).reshape((3, 4)).astype("float32") dx = api.device_put(x) - self.assertIsInstance(dx, DeviceArray) + self.assertIsInstance(dx, xla.DeviceArray) x2 = api.device_get(dx) self.assertIsInstance(x2, onp.ndarray) assert onp.all(x == x2) @@ -593,7 +593,7 @@ def test_complex_input_jacfwd_raises_error(self): self.assertRaises(TypeError, lambda: jacfwd(lambda x: np.sin(x))(1 + 2j)) def test_defvjp_all(self): - foo_p = Primitive('foo') + foo_p = core.Primitive('foo') def foo(x): return 2. * foo_p.bind(x) ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (4 * g * np.sin(x),))) @@ -602,7 +602,7 @@ def foo(x): return 2. * foo_p.bind(x) self.assertAllClose(grad_ans, 4 * 2 * onp.sin(3.), check_dtypes=False) def test_defvjp_all_const(self): - foo_p = Primitive('foo') + foo_p = core.Primitive('foo') def foo(x): return foo_p.bind(x) ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (12.,))) @@ -611,7 +611,7 @@ def foo(x): return foo_p.bind(x) self.assertAllClose(grad_ans, 12., check_dtypes=True) def test_defvjp_all_higher_order_revmode(self): - foo_p = Primitive('foo') + foo_p = core.Primitive('foo') def foo(x): return 2. * foo_p.bind(x) ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (g * x ** 2,))) @@ -622,7 +622,7 @@ def test_defvjp_all_multiple_arguments(self): # also tests passing in symbolic zero tangents b/c we differentiate wrt only # the first argument in one case - foo_p = Primitive('foo') + foo_p = core.Primitive('foo') def foo(x, y): return foo_p.bind(x, y) def vjpfun(x, y): @@ -791,11 +791,11 @@ def test_legacy_devicearray_repr(self): def test_devicearray_repr(self): x = device_put(np.zeros(3)) - self.assertIsInstance(x, DeviceArray) + self.assertIsInstance(x, xla.DeviceArray) repr(x) # doesn't crash x = device_put(np.ones(3) + 1j * np.ones(3)) - self.assertIsInstance(x, DeviceArray) + self.assertIsInstance(x, xla.DeviceArray) repr(x) # doesn't crash def test_devicearray_delete(self): @@ -1016,7 +1016,7 @@ def f(): def test_jit_device(self): device = xb.devices()[-1] x = api.jit(lambda x: x, device=device)(3.) - self.assertIsInstance(x, DeviceArray) + self.assertIsInstance(x, xla.DeviceArray) self.assertEqual(x.device_buffer.device(), device) def test_jit_of_noncallable(self): @@ -1563,6 +1563,26 @@ def f(x): in [e] } """) + def test_eval_jaxpr_caching(self): + eval_jaxpr = core.eval_jaxpr + + count = [0] + def eval_jaxpr_and_count(*args): + count[0] += 1 + return eval_jaxpr(*args) + + f = jit(lambda x: 2 * x) + jaxpr = api.make_jaxpr(f)(3) + + try: + core.eval_jaxpr = eval_jaxpr_and_count + core.jaxpr_as_fun(jaxpr)(3) # once outer and once inner + core.jaxpr_as_fun(jaxpr)(4) # once outer but inner is cached + finally: + core.eval_jaxpr = eval_jaxpr + + self.assertEqual(count[0], 3) + if __name__ == '__main__': absltest.main() From 7083b0a78edd8f2e88abe3f395ee0f51ac915082 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 6 Dec 2019 22:28:41 -0800 Subject: [PATCH 0491/1053] roll back previous commit #1829 There was a mysterious failure on an internal test, and that mysteriousness means I didn't fully understand the attempted fix, so best to roll back for now. --- jax/core.py | 27 ++++++++------------------- tests/api_test.py | 42 +++++++++++------------------------------- 2 files changed, 19 insertions(+), 50 deletions(-) diff --git a/jax/core.py b/jax/core.py index fa6f9210764d..d9e039f70016 100644 --- a/jax/core.py +++ b/jax/core.py @@ -27,8 +27,7 @@ import six from . import linear_util as lu -from .linear_util import transformation, transformation_with_aux, wrap_init -from .util import safe_zip, safe_map, partial, curry, WrapHashably +from .util import safe_zip, safe_map, partial, curry from .pprint_util import pp, vcat, hcat, pp_kv_pairs # TODO(dougalm): the trace cache breaks the leak detector. Consisder solving. @@ -198,28 +197,18 @@ def write(v, val): map(write, jaxpr.freevars, freevar_vals) for eqn in jaxpr.eqns: in_vals = map(read, eqn.invars) - if not eqn.bound_subjaxprs: - ans = eqn.primitive.bind(*in_vals, **eqn.params) - else: - (subjaxpr, const_bindings, freevar_bindings), = eqn.bound_subjaxprs - sub_consts = tuple(WrapHashably(read(v)) for v in const_bindings) - sub_freevar_vals = tuple(WrapHashably(read(v)) for v in freevar_bindings) - fun = hashable_partial(wrap_init(eval_jaxpr), subjaxpr, - sub_consts, sub_freevar_vals) - ans = eqn.primitive.bind(fun, *in_vals, **eqn.params) + subfuns = [partial(eval_jaxpr, subjaxpr, map(read, const_bindings), + map(read, freevar_bindings)) + for subjaxpr, const_bindings, freevar_bindings + in eqn.bound_subjaxprs] + subfuns = map(lu.wrap_init, subfuns) + ans = eqn.primitive.bind(*(subfuns + in_vals), **eqn.params) if eqn.primitive.multiple_results: map(write, eqn.outvars, ans) else: write(eqn.outvars[0], ans) return map(read, jaxpr.outvars) -@transformation -def hashable_partial(jaxpr, consts_hashable, freevar_vals_hashable, *args): - consts = [x.val for x in consts_hashable] - freevar_vals = [x.val for x in freevar_vals_hashable] - ans = yield (jaxpr, consts, freevar_vals) + args, {} - yield ans - def full_lower(val): if isinstance(val, Tracer): @@ -576,7 +565,7 @@ def apply_todos(todos, outs): outs = map(full_lower, todos.pop()(outs)) return outs -@transformation_with_aux +@lu.transformation_with_aux def process_env_traces(primitive, level, params_tuple, *args): outs = yield args, {} params = dict(params_tuple) diff --git a/tests/api_test.py b/tests/api_test.py index 6f15f0ed3712..527fc8433d8e 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -34,9 +34,9 @@ import jax.numpy as np from jax import jit, grad, device_put, jacfwd, jacrev, hessian from jax import api, lax -from jax import core +from jax.core import Primitive from jax.interpreters import ad -from jax.interpreters import xla +from jax.interpreters.xla import DeviceArray from jax.abstract_arrays import concretization_err_msg from jax.lib import xla_bridge as xb from jax import test_util as jtu @@ -241,7 +241,7 @@ def test_casts(self): "|Abstract value passed to .*)", lambda: jit(f)(0)) def test_unimplemented_interpreter_rules(self): - foo_p = core.Primitive('foo') + foo_p = Primitive('foo') def foo(x): return foo_p.bind(x) @@ -268,7 +268,7 @@ def foo(x): def test_device_put_and_get(self): x = onp.arange(12.).reshape((3, 4)).astype("float32") dx = api.device_put(x) - self.assertIsInstance(dx, xla.DeviceArray) + self.assertIsInstance(dx, DeviceArray) x2 = api.device_get(dx) self.assertIsInstance(x2, onp.ndarray) assert onp.all(x == x2) @@ -593,7 +593,7 @@ def test_complex_input_jacfwd_raises_error(self): self.assertRaises(TypeError, lambda: jacfwd(lambda x: np.sin(x))(1 + 2j)) def test_defvjp_all(self): - foo_p = core.Primitive('foo') + foo_p = Primitive('foo') def foo(x): return 2. * foo_p.bind(x) ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (4 * g * np.sin(x),))) @@ -602,7 +602,7 @@ def foo(x): return 2. * foo_p.bind(x) self.assertAllClose(grad_ans, 4 * 2 * onp.sin(3.), check_dtypes=False) def test_defvjp_all_const(self): - foo_p = core.Primitive('foo') + foo_p = Primitive('foo') def foo(x): return foo_p.bind(x) ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (12.,))) @@ -611,7 +611,7 @@ def foo(x): return foo_p.bind(x) self.assertAllClose(grad_ans, 12., check_dtypes=True) def test_defvjp_all_higher_order_revmode(self): - foo_p = core.Primitive('foo') + foo_p = Primitive('foo') def foo(x): return 2. * foo_p.bind(x) ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (g * x ** 2,))) @@ -622,7 +622,7 @@ def test_defvjp_all_multiple_arguments(self): # also tests passing in symbolic zero tangents b/c we differentiate wrt only # the first argument in one case - foo_p = core.Primitive('foo') + foo_p = Primitive('foo') def foo(x, y): return foo_p.bind(x, y) def vjpfun(x, y): @@ -791,11 +791,11 @@ def test_legacy_devicearray_repr(self): def test_devicearray_repr(self): x = device_put(np.zeros(3)) - self.assertIsInstance(x, xla.DeviceArray) + self.assertIsInstance(x, DeviceArray) repr(x) # doesn't crash x = device_put(np.ones(3) + 1j * np.ones(3)) - self.assertIsInstance(x, xla.DeviceArray) + self.assertIsInstance(x, DeviceArray) repr(x) # doesn't crash def test_devicearray_delete(self): @@ -1016,7 +1016,7 @@ def f(): def test_jit_device(self): device = xb.devices()[-1] x = api.jit(lambda x: x, device=device)(3.) - self.assertIsInstance(x, xla.DeviceArray) + self.assertIsInstance(x, DeviceArray) self.assertEqual(x.device_buffer.device(), device) def test_jit_of_noncallable(self): @@ -1563,26 +1563,6 @@ def f(x): in [e] } """) - def test_eval_jaxpr_caching(self): - eval_jaxpr = core.eval_jaxpr - - count = [0] - def eval_jaxpr_and_count(*args): - count[0] += 1 - return eval_jaxpr(*args) - - f = jit(lambda x: 2 * x) - jaxpr = api.make_jaxpr(f)(3) - - try: - core.eval_jaxpr = eval_jaxpr_and_count - core.jaxpr_as_fun(jaxpr)(3) # once outer and once inner - core.jaxpr_as_fun(jaxpr)(4) # once outer but inner is cached - finally: - core.eval_jaxpr = eval_jaxpr - - self.assertEqual(count[0], 3) - if __name__ == '__main__': absltest.main() From 26e863923af0b1fbbbae5ef9396e33eb376ad22a Mon Sep 17 00:00:00 2001 From: tamaranorman Date: Mon, 9 Dec 2019 16:06:59 +0000 Subject: [PATCH 0492/1053] Support atrous conv in same padded convolution and add warning if use transposed convolution with same or valid padding. (#1806) PiperOrigin-RevId: 283517237 --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 14 +++++++------- jax/lax/lax.py | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index ff1d3dcd564a..9104331c9a64 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -1865,13 +1865,13 @@ } ], "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'SAME', # padding mode\n", - " (2,2), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " ((0, 0), (0, 0)), # padding mode\n", + " (2,2), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", "print(\"out shape: \", out.shape, \"<-- larger than original!\")\n", "plt.figure(figsize=(10,10))\n", "print(\"First output channel:\")\n", diff --git a/jax/lax/lax.py b/jax/lax/lax.py index d2d4a8bc839b..89735145b899 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -484,15 +484,22 @@ def conv_general_dilated(lhs, rhs, window_strides, padding, lhs_dilation=None, if type(dimension_numbers) is not ConvDimensionNumbers: dimension_numbers = conv_dimension_numbers( lhs.shape, rhs.shape, dimension_numbers) - if isinstance(padding, str): - lhs_perm, rhs_perm, _ = dimension_numbers - padding = padtype_to_pads( - onp.take(lhs.shape, lhs_perm)[2:], onp.take(rhs.shape, rhs_perm)[2:], - window_strides, padding) if lhs_dilation is None: lhs_dilation = (1,) * (lhs.ndim - 2) + elif isinstance(padding, str) and not len(lhs_dilation) == lhs_dilation.count(1): + raise ValueError( + "String padding is not implemented for transposed convolution " + "using this op. Please either exactly specify the required padding or " + "use conv_transpose.") if rhs_dilation is None: rhs_dilation = (1,) * (rhs.ndim - 2) + if isinstance(padding, str): + lhs_perm, rhs_perm, _ = dimension_numbers + rhs_shape = onp.take(rhs.shape, rhs_perm)[2:] + effective_rhs_shape = [(k-1) * r + 1 for k, r in zip(rhs_shape, rhs_dilation)] + padding = padtype_to_pads( + onp.take(lhs.shape, lhs_perm)[2:], effective_rhs_shape, + window_strides, padding) return conv_general_dilated_p.bind( lhs, rhs, window_strides=tuple(window_strides), padding=tuple(padding), lhs_dilation=tuple(lhs_dilation), rhs_dilation=tuple(rhs_dilation), From 7f4b641c6d38f3f944d97cbc3d1a337fe35a34f4 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Mon, 9 Dec 2019 09:56:26 -0800 Subject: [PATCH 0493/1053] Additional doc for np.linalg.pinv (#1820) * starter code * Update scipy_stats_test.py * Update __init__.py * Update scipy_stats_test.py * starter code for pinv * fix transpose, add more test cases & complex dtype * update test to latest format * update default rcond * Update linalg.py * bigger test size * Update linalg.py * Update linalg_test.py * fix float issue * Update linalg.py * smaller test cases * Update linalg_test.py * try not forcing float * explicit cast * try a different casting * try another casting * Update doc for pinv * Update linalg.py --- jax/numpy/linalg.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 1444cca00d22..f4fc5070df9a 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -20,6 +20,7 @@ import numpy as onp import warnings +import textwrap from jax import jit from .. import lax @@ -136,10 +137,15 @@ def eigvalsh(a, UPLO='L'): return w -@_wraps(onp.linalg.pinv) +@_wraps(onp.linalg.pinv, lax_description=textwrap.dedent("""\ + It differs only in default value of `rcond`. In `numpy.linalg.pinv`, the + default `rcond` is `1e-15`. Here the default is + `10. * max(num_rows, num_cols) * np.finfo(dtype).eps`. + """)) def pinv(a, rcond=None): # ported from https://github.com/numpy/numpy/blob/v1.17.0/numpy/linalg/linalg.py#L1890-L1979 a = np.conj(a) + # copied from https://github.com/tensorflow/probability/blob/master/tensorflow_probability/python/math/linalg.py#L442 if rcond is None: max_rows_cols = max(a.shape[-2:]) rcond = 10. * max_rows_cols * np.finfo(a.dtype).eps From 687b9050df3bbba86e2e1e8ed9b3d211d3c78c28 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 9 Dec 2019 21:18:39 -0500 Subject: [PATCH 0494/1053] Prepare to switch default dtypes in JAX to be 32-bit types. (#1827) This change prepares for switching the default types in JAX's NumPy to be 32-bit types. In particular, it makes the JAX tests pass in the event that jax.numpy.int_, jax.numpy.float_, and jax.numpy.complex_ are defined to be 32-bit types instead of 64-bit types, but does not yet change the defaults. --- jax/lax/lax.py | 5 + jax/numpy/lax_numpy.py | 5 +- jax/test_util.py | 6 +- tests/api_test.py | 2 +- tests/lax_numpy_test.py | 197 ++++++++++++++++++++++------------------ tests/loops_test.py | 14 +-- 6 files changed, 129 insertions(+), 100 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 89735145b899..07130f10cee9 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -350,6 +350,11 @@ def convert_element_type(operand, new_dtype): An array with the same shape as `operand`, cast elementwise to `new_dtype`. """ new_dtype = dtypes.canonicalize_dtype(new_dtype) + # Avoids dropping precision by casting Python scalars to the default Jax + # type. If we passed a Python scalar directly to the bind call below, it is + # cast to the default type as part of the calling convention. + if type(operand) in dtypes.python_scalar_dtypes: + operand = onp.asarray(operand, new_dtype) old_dtype = dtypes.canonicalize_dtype(_dtype(operand)) if old_dtype == new_dtype: return operand diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 961e27f20d11..db8afc6d3aee 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -988,8 +988,9 @@ def select(condlist, choicelist, default=0): raise ValueError(msg.format(len(condlist), len(choicelist))) if len(condlist) == 0: raise ValueError("condlist must be non-empty") - - output = default + choices = _promote_dtypes(default, *choicelist) + choicelist = choices[1:] + output = choices[0] for cond, choice in zip(condlist[::-1], choicelist[::-1]): output = where(cond, choice, output) return output diff --git a/jax/test_util.py b/jax/test_util.py index 34389249f9e1..fbb0218fbf84 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -602,7 +602,7 @@ def assertArraysAllClose(self, x, y, check_dtypes, atol=None, rtol=None): def assertDtypesMatch(self, x, y): if FLAGS.jax_enable_x64: - self.assertEqual(onp.asarray(x).dtype, onp.asarray(y).dtype) + self.assertEqual(_dtype(x), _dtype(y)) def assertAllClose(self, x, y, check_dtypes, atol=None, rtol=None): """Assert that x and y, either arrays or nested tuples/lists, are close.""" @@ -618,9 +618,11 @@ def assertAllClose(self, x, y, check_dtypes, atol=None, rtol=None): self.assertAllClose(x_elt, y_elt, check_dtypes, atol=atol, rtol=rtol) elif hasattr(x, '__array__') or onp.isscalar(x): self.assertTrue(hasattr(y, '__array__') or onp.isscalar(y)) + if check_dtypes: + self.assertDtypesMatch(x, y) x = onp.asarray(x) y = onp.asarray(y) - self.assertArraysAllClose(x, y, check_dtypes, atol=atol, rtol=rtol) + self.assertArraysAllClose(x, y, check_dtypes=False, atol=atol, rtol=rtol) elif x == y: return else: diff --git a/tests/api_test.py b/tests/api_test.py index 527fc8433d8e..b0a9086f7053 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -447,7 +447,7 @@ def test_large_device_constant(self): def test_grad_and_aux_basic(self): g, aux = grad(lambda x: (x**3, [x**2]), has_aux=True)(3.) self.assertAllClose(g, grad(lambda x: x**3)(3.), check_dtypes=True) - self.assertAllClose(aux, [9.], check_dtypes=True) + self.assertAllClose(aux, [9.], check_dtypes=False) def test_grad_and_aux_nested(self): def f(x): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index dc8083bfc3d4..3bbd17875573 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -86,13 +86,13 @@ def _shape_and_dtypes(shapes, dtypes): OpRecord = collections.namedtuple( "OpRecord", ["name", "nargs", "dtypes", "shapes", "rng_factory", "diff_modes", - "test_name", "check_dtypes", "tolerance"]) + "test_name", "check_dtypes", "tolerance", "inexact"]) def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, - test_name=None, check_dtypes=True, tolerance=None): + test_name=None, check_dtypes=True, tolerance=None, inexact=False): test_name = test_name or name return OpRecord(name, nargs, dtypes, shapes, rng_factory, diff_modes, - test_name, check_dtypes, tolerance) + test_name, check_dtypes, tolerance, inexact) JAX_ONE_TO_ONE_OP_RECORDS = [ op_record("abs", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), @@ -100,7 +100,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("ceil", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("conj", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), - op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("exp", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], + inexact=True), op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("float_power", 2, inexact_dtypes, all_shapes, partial(jtu.rand_default, scale=1), ["rev"], @@ -112,7 +113,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), op_record("less", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), op_record("less_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), - op_record("log", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("log", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], + inexact=True), op_record("logical_and", 2, all_dtypes, all_shapes, jtu.rand_bool, []), op_record("logical_not", 1, all_dtypes, all_shapes, jtu.rand_bool, []), op_record("logical_or", 2, all_dtypes, all_shapes, jtu.rand_bool, []), @@ -127,51 +129,68 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("subtract", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("signbit", 1, default_dtypes + bool_dtypes, all_shapes, jtu.rand_some_inf_and_nan, ["rev"]), - op_record("sin", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), - op_record("cos", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("sin", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], + inexact=True), + op_record("cos", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], + inexact=True), op_record("tan", 1, number_dtypes, all_shapes, - partial(jtu.rand_uniform, -1.5, 1.5), ["rev"]), - op_record("sinh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), - op_record("cosh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + partial(jtu.rand_uniform, -1.5, 1.5), ["rev"], inexact=True), + op_record("sinh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], + inexact=True), + op_record("cosh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], + inexact=True), # TODO(b/142975473): on CPU, tanh for complex128 is only accurate to # ~float32 precision. # TODO(b/143135720): on GPU, tanh has only ~float32 precision. op_record("tanh", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], - tolerance={onp.float64: 1e-7, onp.complex128: 1e-7}), - op_record("arcsin", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), - op_record("arccos", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), - op_record("arctan", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), - op_record("arctan2", 2, float_dtypes, all_shapes, jtu.rand_small, ["rev"]), - op_record("arcsinh", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), - op_record("arccosh", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), - op_record("arctanh", 1, number_dtypes, all_shapes, jtu.rand_small, ["rev"]), + tolerance={onp.float64: 1e-7, onp.complex128: 1e-7}, + inexact=True), + op_record("arcsin", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"], + inexact=True), + op_record("arccos", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"], + inexact=True), + op_record("arctan", 1, float_dtypes, all_shapes, jtu.rand_small, ["rev"], + inexact=True), + op_record("arctan2", 2, float_dtypes, all_shapes, jtu.rand_small, ["rev"], + inexact=True), + op_record("arcsinh", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], + inexact=True), + op_record("arccosh", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], + inexact=True), + op_record("arctanh", 1, number_dtypes, all_shapes, jtu.rand_small, ["rev"], + inexact=True), ] JAX_COMPOUND_OP_RECORDS = [ # angle has inconsistent 32/64-bit return types across numpy versions. op_record("angle", 1, number_dtypes, all_shapes, jtu.rand_default, [], - check_dtypes=False), + check_dtypes=False, inexact=True), op_record("atleast_1d", 1, default_dtypes, all_shapes, jtu.rand_default, []), op_record("atleast_2d", 1, default_dtypes, all_shapes, jtu.rand_default, []), op_record("atleast_3d", 1, default_dtypes, all_shapes, jtu.rand_default, []), - op_record("cbrt", 1, default_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("cbrt", 1, default_dtypes, all_shapes, jtu.rand_default, ["rev"], + inexact=True), op_record("conjugate", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("deg2rad", 1, float_dtypes, all_shapes, jtu.rand_default, []), - op_record("divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), + op_record("divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, ["rev"], + inexact=six.PY3), op_record("divmod", 2, int_dtypes + float_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], - tolerance={lnp.bfloat16: 2e-2, onp.float16: 1e-2}), + tolerance={lnp.bfloat16: 2e-2, onp.float16: 1e-2}, inexact=True), # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 # precision. op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_positive, [], - test_name="expm1_large", tolerance={onp.float64: 1e-8}), + test_name="expm1_large", tolerance={onp.float64: 1e-8}, inexact=True), op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_small_positive, - [], tolerance={onp.float64: 1e-8}), + [], tolerance={onp.float64: 1e-8}, inexact=True), op_record("fix", 1, float_dtypes, all_shapes, jtu.rand_default, []), - op_record("floor_divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), - op_record("heaviside", 2, default_dtypes, all_shapes, jtu.rand_default, []), - op_record("hypot", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("floor_divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, + ["rev"]), + op_record("heaviside", 2, default_dtypes, all_shapes, jtu.rand_default, [], + inexact=True), + op_record("hypot", 2, default_dtypes, all_shapes, jtu.rand_default, [], + inexact=True), op_record("kron", 2, number_dtypes, nonempty_shapes, jtu.rand_default, []), op_record("outer", 2, number_dtypes, all_shapes, jtu.rand_default, []), op_record("imag", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), @@ -183,18 +202,21 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("isposinf", 1, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), op_record("isreal", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), op_record("isrealobj", 1, number_dtypes, all_shapes, jtu.rand_some_inf, []), - op_record("log2", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), - op_record("log10", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("log2", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], + inexact=True), + op_record("log10", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], + inexact=True), op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_positive, [], - test_name="log1p_large", tolerance={onp.float64: 1e-12}), + test_name="log1p_large", tolerance={onp.float64: 1e-12}, + inexact=True), op_record("log1p", 1, number_dtypes, all_shapes, jtu.rand_small_positive, [], - tolerance={onp.float64: 1e-12}), + tolerance={onp.float64: 1e-12}, inexact=True), op_record("logaddexp", 2, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan, ["rev"], - tolerance={onp.float64: 1e-12}), + tolerance={onp.float64: 1e-12}, inexact=True), op_record("logaddexp2", 2, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan, ["rev"], - tolerance={onp.float16: 1e-2}), + tolerance={onp.float16: 1e-2}, inexact=True), op_record("polyval", 2, number_dtypes, nonempty_nonscalar_array_shapes, jtu.rand_default, [], check_dtypes=False, tolerance={onp.float16: 1e-2, onp.float64: 1e-12}), @@ -209,12 +231,15 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("sinc", 1, [t for t in number_dtypes if t != lnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], - tolerance={onp.complex64: 1e-5}, check_dtypes=False), + tolerance={onp.complex64: 1e-5}, inexact=True, + check_dtypes=False), op_record("square", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), - op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"]), + op_record("sqrt", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], + inexact=True), op_record("transpose", 1, all_dtypes, all_shapes, jtu.rand_default, ["rev"], check_dtypes=False), - op_record("true_divide", 2, all_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), + op_record("true_divide", 2, all_dtypes, all_shapes, jtu.rand_nonzero, + ["rev"], inexact=True), op_record("diff", 1, number_dtypes, nonzerodim_shapes, jtu.rand_default, ["rev"]), ] @@ -230,10 +255,12 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, ] JAX_REDUCER_RECORDS = [ - op_record("mean", 1, number_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("mean", 1, number_dtypes, nonempty_shapes, jtu.rand_default, [], + inexact=True), op_record("prod", 1, all_dtypes, all_shapes, jtu.rand_small_positive, []), op_record("sum", 1, all_dtypes, all_shapes, jtu.rand_default, []), - op_record("nanmean", 1, inexact_dtypes, nonempty_shapes, jtu.rand_some_nan, []), + op_record("nanmean", 1, inexact_dtypes, nonempty_shapes, jtu.rand_some_nan, + [], inexact=True), op_record("nanprod", 1, inexact_dtypes, all_shapes, jtu.rand_some_nan, []), op_record("nansum", 1, number_dtypes, all_shapes, jtu.rand_some_nan, []), ] @@ -243,8 +270,10 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("any", 1, all_dtypes, all_shapes, jtu.rand_some_zero, []), op_record("max", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), op_record("min", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), - op_record("var", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), - op_record("std", 1, all_dtypes, nonempty_shapes, jtu.rand_default, []), + op_record("var", 1, all_dtypes, nonempty_shapes, jtu.rand_default, [], + inexact=True), + op_record("std", 1, all_dtypes, nonempty_shapes, jtu.rand_default, [], + inexact=True), ] JAX_ARGMINMAX_RECORDS = [ @@ -268,7 +297,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("__mod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), op_record("__floordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), - op_record("__truediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("__truediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, [], + inexact=True), op_record("__abs__", 1, number_dtypes, all_shapes, jtu.rand_default, []), # TODO(mattjj): __invert__ fails on bool dtypes because ~True == -2 op_record("__invert__", 1, int_dtypes, all_shapes, jtu.rand_default, []), @@ -289,7 +319,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("__rmod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), op_record("__rfloordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), - op_record("__rtruediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("__rtruediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, [], + inexact=True), # op_record("__ror__", 2, number_dtypes, all_shapes, jtu.rand_bool, []), # op_record("__rand__", 2, number_dtypes, all_shapes, jtu.rand_default, []), # op_record("__rxor__", 2, number_dtypes, all_shapes, jtu.rand_bool, []), @@ -348,7 +379,7 @@ def _shapes_are_equal_length(shapes): return all(len(shape) == len(shapes[0]) for shape in shapes[1:]) -def _promote_like_lnp(fun): +def _promote_like_lnp(fun, inexact=False): """Decorator that promotes the arguments of `fun` to `lnp.result_type(*args)`. lnp and onp have different type promotion semantics; this decorator allows @@ -356,17 +387,24 @@ def _promote_like_lnp(fun): implementation. """ def wrapper(*args, **kw): - dtype = lnp.result_type(*tree_util.tree_leaves(args)) + flat_args = tree_util.tree_leaves(args) + if inexact and not any(lnp.issubdtype(lnp.result_type(x), lnp.inexact) + for x in flat_args): + dtype = lnp.result_type(lnp.float_, *flat_args) + else: + dtype = lnp.result_type(*flat_args) args = tree_util.tree_map(lambda a: onp.asarray(a, dtype), args) return fun(*args, **kw) return wrapper + class LaxBackedNumpyTests(jtu.JaxTestCase): """Tests for LAX-backed Numpy implementation.""" def _GetArgsMaker(self, rng, shapes, dtypes, onp_arrays=True): def f(): - out = [rng(shape, dtype) for shape, dtype in zip(shapes, dtypes)] + out = [rng(shape, dtype or lnp.float_) + for shape, dtype in zip(shapes, dtypes)] return out if onp_arrays else [lnp.asarray(a) for a in out] return f @@ -376,7 +414,8 @@ def f(): dtypes), "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), - "check_dtypes": rec.check_dtypes, "tolerance": rec.tolerance} + "check_dtypes": rec.check_dtypes, "tolerance": rec.tolerance, + "inexact": rec.inexact} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) @@ -385,14 +424,14 @@ def f(): for rec in itertools.chain(JAX_ONE_TO_ONE_OP_RECORDS, JAX_COMPOUND_OP_RECORDS))) def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, - tolerance): + tolerance, inexact): rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes, onp_arrays=False) tol = max(jtu.tolerance(dtype, tolerance) for dtype in dtypes) tol = functools.reduce(jtu.join_tolerance, [tolerance, tol, jtu.default_tolerance()]) - self._CheckAgainstNumpy(_promote_like_lnp(onp_op), lnp_op, args_maker, - check_dtypes=check_dtypes, tol=tol) + self._CheckAgainstNumpy(_promote_like_lnp(onp_op, inexact), lnp_op, + args_maker, check_dtypes=check_dtypes, tol=tol) self._CompileAndCheck(lnp_op, args_maker, check_dtypes=check_dtypes, atol=tol, rtol=tol) @@ -481,18 +520,20 @@ def testBitwiseOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes): "None" if out_dtype is None else onp.dtype(out_dtype).name, keepdims), "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), - "axis": axis, "keepdims": keepdims} + "axis": axis, "keepdims": keepdims, "inexact": rec.inexact} for shape in rec.shapes for dtype in rec.dtypes for out_dtype in [None] + rec.dtypes for axis in set(range(-len(shape), len(shape))) | set([None]) for keepdims in [False, True]) for rec in JAX_REDUCER_RECORDS)) - def testReducer(self, onp_op, lnp_op, rng_factory, shape, dtype, out_dtype, axis, keepdims): + def testReducer(self, onp_op, lnp_op, rng_factory, shape, dtype, out_dtype, + axis, keepdims, inexact): rng = rng_factory() def onp_fun(x): x_cast = x if dtype != lnp.bfloat16 else x.astype(onp.float32) t = out_dtype if out_dtype != lnp.bfloat16 else onp.float32 return onp_op(x_cast, axis, dtype=t, keepdims=keepdims) + onp_fun = _promote_like_lnp(onp_fun, inexact) lnp_fun = lambda x: lnp_op(x, axis, dtype=out_dtype, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.complex64: 1e-3, @@ -511,14 +552,16 @@ def onp_fun(x): jtu.format_shape_dtype_string(shape, dtype), axis, keepdims), "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), - "axis": axis, "keepdims": keepdims} + "axis": axis, "keepdims": keepdims, "inexact": rec.inexact} for rec in JAX_REDUCER_NO_DTYPE_RECORDS for shape in rec.shapes for dtype in rec.dtypes for axis in set(range(-len(shape), len(shape))) | set([None]) for keepdims in [False, True])) - def testReducerNoDtype(self, onp_op, lnp_op, rng_factory, shape, dtype, axis, keepdims): + def testReducerNoDtype(self, onp_op, lnp_op, rng_factory, shape, dtype, axis, + keepdims, inexact): rng = rng_factory() onp_fun = lambda x: onp_op(x, axis, keepdims=keepdims) + onp_fun = _promote_like_lnp(onp_fun, inexact) lnp_fun = lambda x: lnp_op(x, axis, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) @@ -535,7 +578,7 @@ def testCountNonzero(self, shape, dtype, axis): onp_fun = lambda x: onp.count_nonzero(x, axis) lnp_fun = lambda x: lnp.count_nonzero(x, axis) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -911,6 +954,7 @@ def args_maker(): def testRepeat(self, axis, shape, dtype, repeats, rng_factory): rng = rng_factory() onp_fun = lambda arg: onp.repeat(arg, repeats=repeats, axis=axis) + onp_fun = _promote_like_lnp(onp_fun) lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=axis) args_maker = lambda: [rng(shape, dtype)] @@ -1322,7 +1366,7 @@ def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): onp_fun = lambda x, weights: onp.average(x, axis, weights, returned) lnp_fun = lambda x, weights: lnp.average(x, axis, weights, returned) args_maker = lambda: [rng(shape, dtype), rng(weights_shape, dtype)] - + onp_fun = _promote_like_lnp(onp_fun, inexact=True) tol = {lnp.bfloat16: 1e-1, onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-10, onp.complex64: 1e-3, onp.complex128: 1e-10} check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE @@ -1343,9 +1387,10 @@ def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): ([1, 2, 3], lnp.int_), ([1., 2., 3.], lnp.float_), ([[1, 2], [3, 4], [5, 6]], lnp.int_), - ([[1, 2.], [3, 4], [5, 6]], lnp.float64), + ([[1, 2.], [3, 4], [5, 6]], lnp.float_), ([[1., 2j], [3., 4.], [5., 6.]], lnp.complex_), - ([[3, onp.array(2), 1], onp.arange(3.)], onp.float_), + ([[3, onp.array(2, dtype=lnp.float_), 1], + onp.arange(3., dtype=lnp.float_)], lnp.float_), ]) for ndmin in [None, onp.ndim(arg), onp.ndim(arg) + 1, onp.ndim(arg) + 2])) def testArray(self, arg, ndmin, dtype): @@ -1890,7 +1935,8 @@ def onp_fun(condlist, choicelist, default): onp.asarray(default, dtype=dtype)) self._CheckAgainstNumpy(onp_fun, lnp.select, args_maker, check_dtypes=False) - self._CompileAndCheck(lnp.select, args_maker, check_dtypes=True) + self._CompileAndCheck(lnp.select, args_maker, check_dtypes=True, + rtol={onp.float64: 1e-7, onp.complex128: 1e-7}) def testIssue330(self): @@ -1966,7 +2012,8 @@ def testArange(self): # self.assertAllClose(lnp.arange(2, 13, dtype=int), # onp.arange(2, 13, dtype=int), check_dtypes=True) self.assertAllClose(lnp.arange(0, 1, -0.5), - onp.arange(0, 1, -0.5), check_dtypes=True) + onp.arange(0, 1, -0.5, dtype=lnp.float_), + check_dtypes=True) self.assertRaises(TypeError, lambda: lnp.arange()) @@ -2115,7 +2162,7 @@ def testCov(self, shape, dtype, rowvar, ddof, bias, rng_factory): tol = 7e-2 if jtu.device_under_test() == "tpu" else tol tol = jtu.join_tolerance(tol, jtu.tolerance(dtype)) self._CheckAgainstNumpy( - onp_fun, lnp_fun, args_maker, check_dtypes=True, tol=tol) + onp_fun, lnp_fun, args_maker, check_dtypes=False, tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, rtol=tol) @@ -2142,7 +2189,7 @@ def testCorrCoef(self, shape, dtype, rowvar, ddof, bias, rng_factory): lnp_fun = partial(lnp.corrcoef, rowvar=rowvar, ddof=ddof, bias=bias) if not onp.any(onp.isclose(onp.std(mat), 0.0)): self._CheckAgainstNumpy( - onp_fun, lnp_fun, args_maker, check_dtypes=True, + onp_fun, lnp_fun, args_maker, check_dtypes=False, tol=1e-2 if jtu.device_under_test() == "tpu" else None) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) @@ -2165,21 +2212,6 @@ def testMeshGrid(self, shapes, dtype, indexing, sparse, rng_factory): lnp_fun = partial(lnp.meshgrid, indexing=indexing, sparse=sparse) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) - def assertDowncastDtypeEqual(self, x, y): - """Heuristic for comparing numpy and jax downcast dtypes.""" - x_dt = jtu._dtype(x) - y_dt = jtu._dtype(y) - testing_tpu = jtu.device_under_test().startswith("tpu") - testing_x32 = not jax.config.read('jax_enable_x64') - to32dtype = {onp.int64: onp.int32, onp.uint64: onp.uint32, - onp.float64: onp.float32, onp.float128: onp.float32, - onp.complex128: onp.complex64, onp.complex256: onp.complex64} - to32dtype = {onp.dtype(k): onp.dtype(v) for k,v in to32dtype.items()} - if testing_tpu or testing_x32: - x_dt = to32dtype.get(x_dt, x_dt) - y_dt = to32dtype.get(y_dt, y_dt) - assert x_dt == y_dt, "truncated dtypes %s != %s" % (x_dt, y_dt) - @parameterized.named_parameters( jtu.cases_from_list( {"testcase_name": ("_start_shape={}_stop_shape={}_num={}_endpoint={}" @@ -2214,13 +2246,6 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, endpoint=endpoint, retstep=retstep, dtype=dtype, axis=axis) self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=False, tol=tol) - # Check dtype equivalence within expected 32bit downcasting. - a, b = lnp_op(start, stop), onp_op(start, stop) - if retstep: - self.assertDowncastDtypeEqual(a[0], b[0]) - self.assertDowncastDtypeEqual(a[1], b[1]) - else: - self.assertDowncastDtypeEqual(a, b) # floating-point compute between jitted platforms and non-jit + rounding # cause unavoidable variation in integer truncation for some inputs. if dtype in (inexact_dtypes + [None,]): @@ -2267,9 +2292,6 @@ def testLogspace(self, start_shape, stop_shape, num, start, stop, num, endpoint=endpoint, base=base, dtype=dtype, axis=axis) self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=False, tol=tol) - # Check dtype equivalence within expected 32bit downcasting. - a, b = lnp_op(start, stop), onp_op(start, stop) - self.assertDowncastDtypeEqual(a, b) if dtype in (inexact_dtypes + [None,]): # Why do compiled and op-by-op float16 np.power numbers differ # slightly more than expected? @@ -2327,9 +2349,6 @@ def onp_op(start, stop): axis=axis).astype(dtype) self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=False, tol=tol) - # Check dtype equivalence within expected 32bit downcasting. - a, b = lnp_op(start, stop), onp_op(start, stop) - self.assertDowncastDtypeEqual(a, b) if dtype in (inexact_dtypes + [None,]): self._CompileAndCheck(lnp_op, args_maker, check_dtypes=False, atol=tol, rtol=tol) diff --git a/tests/loops_test.py b/tests/loops_test.py index e9302477c612..e3a2deac0a9a 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -63,8 +63,9 @@ def f_expected(inc): self.assertAllClose(f_expected(2.), api.jit(f_op)(2.), check_dtypes=True) self.assertAllClose(5., api.grad(f_op)(2.), check_dtypes=True) self.assertAllClose(5., api.grad(f_op)(2.), check_dtypes=True) - inc_batch = onp.arange(5, dtype=onp.float32) - self.assertAllClose(np.array([f_expected(inc) for inc in inc_batch]), + inc_batch = onp.arange(5, dtype=np.float_) + self.assertAllClose(np.array([f_expected(inc) for inc in inc_batch], + dtype=np.float_), api.vmap(f_op)(inc_batch), check_dtypes=True) @@ -143,7 +144,7 @@ def f_op(inc): def test_example_doc(self): "The example from the module docstring." def f_expected(): - arr = onp.zeros(5) + arr = onp.zeros(5, dtype=np.float_) for i in range(arr.shape[0]): arr[i] += 2. if i % 2 == 0: @@ -151,7 +152,7 @@ def f_expected(): return arr def f_op_jax(): - arr = onp.zeros(5) + arr = np.zeros(5) def loop_body(i, acc_arr): arr1 = ops.index_update(acc_arr, i, acc_arr[i] + 2.) return lax.cond(i % 2 == 0, @@ -380,8 +381,9 @@ def f_expected(init): self.assertAllClose(f_expected(2.), f_op(2.), check_dtypes=True) self.assertAllClose(f_expected(2.), api.jit(f_op)(2.), check_dtypes=True) self.assertAllClose(f_expected(1.), f_op(1.), check_dtypes=True) - init_batch = np.array([1., 2., 3.]) - self.assertAllClose(np.array([f_expected(init) for init in init_batch]), + init_batch = onp.array([1., 2., 3.], dtype=onp.float32) + self.assertAllClose(onp.array([f_expected(init) for init in init_batch], + dtype=onp.float32), api.vmap(f_op)(init_batch), check_dtypes=True) def test_error_while_cond_mutation(self): From 6ac1c569e889e6dc843c383c996c22993fc96278 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 10 Dec 2019 00:38:18 -0800 Subject: [PATCH 0495/1053] Use HIGHEST precision for dot_general in linalg JVP rules (#1835) --- jax/lax/lax.py | 5 +++-- jax/lax_linalg.py | 9 ++++++--- jax/test_util.py | 18 ++++++++++++++++++ tests/lax_numpy_test.py | 35 +++++++++++------------------------ tests/linalg_test.py | 23 +++++++++++++++++++++++ 5 files changed, 61 insertions(+), 29 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 07130f10cee9..2affa45e5734 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1367,7 +1367,7 @@ def dynamic_update_index_in_dim(operand, update, index, axis): return dynamic_update_slice_in_dim(operand, update, index, axis) -def batch_matmul(lhs, rhs): +def batch_matmul(lhs, rhs, precision=None): """Batch matrix multiplication.""" if _min(lhs.ndim, rhs.ndim) < 2: raise ValueError('Arguments to batch_matmul must be at least 2D, got {}, {}' @@ -1378,7 +1378,8 @@ def batch_matmul(lhs, rhs): lhs_contract = (lhs.ndim - 1,) rhs_contract = (rhs.ndim - 2,) batch = tuple(range(lhs.ndim - 2)) - return dot_general(lhs, rhs, [(lhs_contract, rhs_contract), (batch, batch)]) + return dot_general(lhs, rhs, [(lhs_contract, rhs_contract), (batch, batch)], + precision=precision) # These functions also exist in the XLA client library, but we treat them diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 30c6e2701673..ea24ec28fa04 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -111,7 +111,8 @@ def phi(X): tmp = triangular_solve(L, sigma_dot, left_side=False, transpose_a=True, conjugate_a=True, lower=True) L_dot = lax.batch_matmul(L, phi(triangular_solve( - L, tmp, left_side=True, transpose_a=False, lower=True))) + L, tmp, left_side=True, transpose_a=False, lower=True)), + precision=lax.Precision.HIGHEST) return L, L_dot def cholesky_batching_rule(batched_args, batch_dims): @@ -265,7 +266,8 @@ def eigh_jvp_rule(primals, tangents, lower): # carefully build reciprocal delta-eigenvalue matrix, avoiding NaNs. Fmat = np.reciprocal(eye_n + w[..., np.newaxis, :] - w[..., np.newaxis]) - eye_n # eigh impl doesn't support batch dims, but future-proof the grad. - dot = lax.dot if a.ndim == 2 else lax.batch_matmul + dot = partial(lax.dot if a.ndim == 2 else lax.batch_matmul, + precision=lax.Precision.HIGHEST) vdag_adot_v = dot(dot(_H(v), a_dot), v) dv = dot(v, np.multiply(Fmat, vdag_adot_v)) dw = np.diagonal(vdag_adot_v, axis1=-2, axis2=-1) @@ -326,7 +328,8 @@ def triangular_solve_jvp_rule_a( g_a = lax.neg(g_a) g_a = np.swapaxes(g_a, -1, -2) if transpose_a else g_a g_a = np.conj(g_a) if conjugate_a else g_a - dot = lax.dot if g_a.ndim == 2 else lax.batch_matmul + dot = partial(lax.dot if g_a.ndim == 2 else lax.batch_matmul, + precision=lax.Precision.HIGHEST) def a_inverse(rhs): return triangular_solve(a, rhs, left_side, lower, transpose_a, conjugate_a, diff --git a/jax/test_util.py b/jax/test_util.py index fbb0218fbf84..0137cd3c09a5 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -32,6 +32,7 @@ from . import api from . import dtypes +from . import lax from .config import flags from .util import partial from .tree_util import tree_multimap, tree_all, tree_map, tree_reduce @@ -564,6 +565,23 @@ def check_raises_regexp(thunk, err_type, pattern): except err_type as e: assert re.match(pattern, str(e)), "{}\n\n{}\n".format(e, pattern) + +def _iter_eqns(jaxpr): + for eqn in jaxpr.eqns: + yield eqn + for subjaxpr, _, _ in eqn.bound_subjaxprs: + for sub_eqn in _iter_eqns(subjaxpr): + yield sub_eqn + +def assert_dot_precision(expected_precision, fun, *args): + jaxpr = api.make_jaxpr(fun)(*args) + precisions = [eqn.params['precision'] for eqn in _iter_eqns(jaxpr.jaxpr) + if eqn.primitive == lax.dot_general_p] + for precision in precisions: + msg = "Unexpected precision: {} != {}".format(expected_precision, precision) + assert precision == expected_precision, msg + + _CACHED_INDICES = {} def cases_from_list(xs): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 3bbd17875573..c1f40eaf4c6e 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2450,62 +2450,49 @@ def testBroadcastToOnScalar(self): def testPrecision(self): - def iter_eqns(jaxpr): - for eqn in jaxpr.eqns: - yield eqn - for subjaxpr, _, _ in eqn.bound_subjaxprs: - for sub_eqn in iter_eqns(subjaxpr): - yield sub_eqn - - def assert_precision(expected, fun, *args): - jaxpr = jax.make_jaxpr(fun)(*args) - precision, = [eqn.params['precision'] for eqn in iter_eqns(jaxpr.jaxpr) - if eqn.primitive == lax.dot_general_p] - self.assertEqual(precision, expected) - ones_1d = onp.ones((2,)) ones_2d = onp.ones((2, 2)) ones_3d = onp.ones((2, 2, 2)) HIGHEST = lax.Precision.HIGHEST - assert_precision(None, lnp.dot, ones_1d, ones_1d) - assert_precision( + jtu.assert_dot_precision(None, lnp.dot, ones_1d, ones_1d) + jtu.assert_dot_precision( HIGHEST, partial(lnp.dot, precision=HIGHEST), ones_1d, ones_1d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.dot, precision=HIGHEST), ones_3d, ones_3d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.matmul, precision=HIGHEST), ones_2d, ones_2d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.vdot, precision=HIGHEST), ones_1d, ones_1d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.tensordot, axes=2, precision=HIGHEST), ones_2d, ones_2d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.tensordot, axes=(0, 0), precision=HIGHEST), ones_1d, ones_1d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.tensordot, axes=((0,), (0,)), precision=HIGHEST), ones_1d, ones_1d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.einsum, 'i,i', precision=HIGHEST), ones_1d, ones_1d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.einsum, 'ij,ij', precision=HIGHEST), ones_2d, ones_2d) - assert_precision( + jtu.assert_dot_precision( HIGHEST, partial(lnp.inner, precision=HIGHEST), ones_1d, ones_1d) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 9d2cb8f5363c..a70addb132bf 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -30,6 +30,7 @@ import jax import jax.lib from jax import jit, grad, jvp, vmap +from jax import lax from jax import lax_linalg from jax import numpy as np from jax import scipy as jsp @@ -82,6 +83,13 @@ def args_maker(): if np.finfo(dtype).bits == 64: jtu.check_grads(np.linalg.cholesky, args_maker(), order=2) + def testCholeskyGradPrecision(self): + rng = jtu.rand_default() + a = rng((3, 3), onp.float32) + a = onp.dot(a, a.T) + jtu.assert_dot_precision( + lax.Precision.HIGHEST, partial(jvp, np.linalg.cholesky), (a,), (a,)) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_n={}".format(jtu.format_shape_dtype_string((n,n), dtype)), @@ -334,6 +342,12 @@ def testEighGradVectorComplex(self, shape, dtype, rng_factory, lower, eps): onp.linalg.norm(onp.abs(new_w*(v+dv)), axis=0) ) < RTOL + def testEighGradPrecision(self): + rng = jtu.rand_default() + a = rng((3, 3), onp.float32) + jtu.assert_dot_precision( + lax.Precision.HIGHEST, partial(jvp, np.linalg.eigh), (a,), (a,)) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), @@ -873,6 +887,15 @@ def testTriangularSolveGrad( unit_diagonal=unit_diagonal, left_side=left_side) jtu.check_grads(f, (A, B), 2, rtol=4e-2, eps=1e-3) + def testTriangularSolveGradPrecision(self): + rng = jtu.rand_default() + a = np.tril(rng((3, 3), onp.float32)) + b = rng((1, 3), onp.float32) + jtu.assert_dot_precision( + lax.Precision.HIGHEST, + partial(jvp, lax_linalg.triangular_solve), + (a, b), + (a, b)) if __name__ == "__main__": absltest.main() From 94203bf0222a716fd7ff7df5ca89806c9ac1c5cd Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 10 Dec 2019 11:25:09 -0500 Subject: [PATCH 0496/1053] Update XLA. (#1837) Update jaxlib BUILD for https://github.com/tensorflow/tensorflow/commit/ead06270dc8bd7a61622f4c687396ce1791f29b5 --- WORKSPACE | 6 +++--- jaxlib/BUILD | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4dc255c2c6e0..0e0a3256a7e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "622a56b2b3ef9b4e6b079880af03ba4857503cd375de0a130bc7561955df3107", - strip_prefix = "tensorflow-6c66b3a1a43effa597fce76c39a4f9e5439e37ea", + sha256 = "d01c8cafd20c842b7e1af0eb15c45699c12aceb159e002a5cab56af187906d58", + strip_prefix = "tensorflow-84add98ff286a5b805d6b45d016f484b7c4f42ba", urls = [ - "https://github.com/tensorflow/tensorflow/archive/6c66b3a1a43effa597fce76c39a4f9e5439e37ea.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/84add98ff286a5b805d6b45d016f484b7c4f42ba.tar.gz", ], ) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index f716bebc9ccd..3d5cc27dad4f 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -14,7 +14,7 @@ # JAX is Autograd and XLA -load("@org_tensorflow//tensorflow/core/platform:default/build_config.bzl", "pyx_library") +load("@org_tensorflow//tensorflow/core/platform/default:build_config.bzl", "pyx_library") load("@org_tensorflow//tensorflow:tensorflow.bzl", "pybind_extension") load("@local_config_cuda//cuda:build_defs.bzl", "cuda_library") From 3167b3ddcdfb92f9636935ba004d29979c471d3e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 10 Dec 2019 14:10:57 -0800 Subject: [PATCH 0497/1053] test tupling of args --- tests/api_test.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/tests/api_test.py b/tests/api_test.py index b0a9086f7053..cd2847f73a07 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -36,7 +36,7 @@ from jax import api, lax from jax.core import Primitive from jax.interpreters import ad -from jax.interpreters.xla import DeviceArray +from jax.interpreters import xla from jax.abstract_arrays import concretization_err_msg from jax.lib import xla_bridge as xb from jax import test_util as jtu @@ -118,12 +118,27 @@ def f(x, y, z): f(1, 2, z=onp.zeros(3)) # doesn't crash - def test_jit_many_args(self): + def test_jit_many_args_tuples(self): @jit def f(args_list): return sum(args_list) - self.assertEqual(f(list(range(500))), sum(range(500))) + make_tuple = xla.make_tuple + + counts = [0] + def make_tuple_and_count(*args, **kwargs): + counts[0] += 1 + return make_tuple(*args, **kwargs) + + try: + xla.make_tuple = make_tuple_and_count + ans = f(list(range(500))) + finally: + xla.make_tuple = make_tuple + + expected = sum(range(500)) + self.assertEqual(counts[0], 1) # formed a tuple on dispatch + self.assertEqual(ans, expected) # computed the correct result def test_grad_of_jit(self): side = [] @@ -268,7 +283,7 @@ def foo(x): def test_device_put_and_get(self): x = onp.arange(12.).reshape((3, 4)).astype("float32") dx = api.device_put(x) - self.assertIsInstance(dx, DeviceArray) + self.assertIsInstance(dx, xla.DeviceArray) x2 = api.device_get(dx) self.assertIsInstance(x2, onp.ndarray) assert onp.all(x == x2) @@ -791,11 +806,11 @@ def test_legacy_devicearray_repr(self): def test_devicearray_repr(self): x = device_put(np.zeros(3)) - self.assertIsInstance(x, DeviceArray) + self.assertIsInstance(x, xla.DeviceArray) repr(x) # doesn't crash x = device_put(np.ones(3) + 1j * np.ones(3)) - self.assertIsInstance(x, DeviceArray) + self.assertIsInstance(x, xla.DeviceArray) repr(x) # doesn't crash def test_devicearray_delete(self): @@ -1016,7 +1031,7 @@ def f(): def test_jit_device(self): device = xb.devices()[-1] x = api.jit(lambda x: x, device=device)(3.) - self.assertIsInstance(x, DeviceArray) + self.assertIsInstance(x, xla.DeviceArray) self.assertEqual(x.device_buffer.device(), device) def test_jit_of_noncallable(self): From a73106b37cf2f0a6a0148e0f9ed1d27c7821449a Mon Sep 17 00:00:00 2001 From: George van den Driessche Date: Wed, 11 Dec 2019 02:48:51 +0000 Subject: [PATCH 0498/1053] Avoid stack overflow when JITting a function that uses copy.copy or copy.deepcopy. (#1834) --- jax/core.py | 6 ++++++ tests/api_test.py | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/jax/core.py b/jax/core.py index d9e039f70016..4bd51a7b6573 100644 --- a/jax/core.py +++ b/jax/core.py @@ -372,6 +372,12 @@ def __getattr__(self, name): def __repr__(self): return 'Traced<{}>with<{}>'.format(self.aval, self.trace) + def __copy__(self): + return self + + def __deepcopy__(self, unused_memo): + return self + # these can be used to set up forwarding of properties and instance methods from # Tracer instances to the underlying avals diff --git a/tests/api_test.py b/tests/api_test.py index cd2847f73a07..3855be4e386f 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -17,6 +17,7 @@ from __future__ import print_function import collections +import copy from functools import partial import unittest import warnings @@ -1282,6 +1283,16 @@ def f(x): python_should_be_executing = False api.jit(f)(3) + def test_jit_shallow_copy(self): + def f(x): + return copy.copy(x) + api.jit(f)(1) + + def test_jit_deep_copy(self): + def f(x): + return copy.deepcopy(x) + api.jit(f)(1) + def test_pmap_global_cache(self): def f(x): assert python_should_be_executing From bf098e615ed2118925541758865c816fdcc2202f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 11 Dec 2019 11:59:24 -0500 Subject: [PATCH 0499/1053] Update jax_to_hlo .bzl file to use exec_tools instead of tools. (#1842) Fixes a Python 3 compatibility problem. --- jax/tools/build_defs.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/tools/build_defs.bzl b/jax/tools/build_defs.bzl index 6b282e1ade24..1abdf3b9a3ee 100644 --- a/jax/tools/build_defs.bzl +++ b/jax/tools/build_defs.bzl @@ -153,7 +153,7 @@ EOF native.genrule( name = name + "_jax_to_hlo_genrule", outs = [name + ".pb", name + ".txt"], - tools = [runner], + exec_tools = [runner], cmd = """ JAX_PLATFORM_NAME=cpu \ '$(location {runner})' \ From e87d9718c3ed8fdff73a8492c9553b8fd146095e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 11 Dec 2019 12:27:11 -0500 Subject: [PATCH 0500/1053] Support IntEnum values as arguments to JAX functions. (#1840) * Support IntEnum values as arguments to JAX functions. When abstractifying a Python value, search the method-resolution order (MRO) of the type rather than only looking at the value's own type. IntEnum instances are subclasses of int, so this allows us to correctly handle them as integers, much as NumPy itself does. --- .travis.yml | 2 +- docs/developer.rst | 3 ++- jax/abstract_arrays.py | 4 ---- jax/interpreters/xla.py | 39 +++++++++++++++++++++------------ tests/benchmarks/xla.py | 48 +++++++++++++++++++++++++++++++++++++++++ tests/dtypes_test.py | 16 ++++++++++++++ 6 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 tests/benchmarks/xla.py diff --git a/.travis.yml b/.travis.yml index d23acaa237bb..63816bb3f722 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ before_install: - conda config --add channels conda-forge - conda update -q conda install: - - conda install --yes python=$TRAVIS_PYTHON_VERSION pip six protobuf>=3.6.0 absl-py opt_einsum numpy scipy pytest-xdist fastcache + - conda install --yes python=$TRAVIS_PYTHON_VERSION pip six protobuf>=3.6.0 absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark fastcache # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. diff --git a/docs/developer.rst b/docs/developer.rst index 0a3a35d156cd..7a5bc7ade836 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -73,7 +73,8 @@ Running the tests ================= To run all the JAX tests, we recommend using ``pytest-xdist``, which can run tests in -parallel. First, install ``pytest-xdist`` by running ``pip install pytest-xdist``. +parallel. First, install ``pytest-xdist`` and ``pytest-benchmark`` by running +``pip install pytest-xdist pytest-benchmark``. Then, from the repository root directory run .. code-block:: shell diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 1c0353c2cf5f..0419979398b6 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -240,10 +240,6 @@ def raise_to_shaped(aval): core.literalable_types.update(array_types) -def make_abstract_python_scalar(x): - return ShapedArray((), dtypes.python_scalar_dtypes[type(x)], - weak_type=True) - def _zeros_like_python_scalar(x): return onp.array(0, dtypes.python_scalar_dtypes[type(x)]) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 64ae8700784c..73a5a7502013 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -35,7 +35,7 @@ from .. import linear_util as lu from ..abstract_arrays import (ConcreteArray, ShapedArray, AbstractToken, make_shaped_array, array_types, raise_to_shaped, - abstract_token, make_abstract_python_scalar) + abstract_token) from ..core import valid_jaxtype, Literal from ..util import (partial, partialmethod, cache, safe_map, prod, unzip2, memoize) @@ -105,34 +105,45 @@ def _device_put_scalar(x, device): # TODO(mattjj): try to remove this canonicalize_dtype stuff def canonicalize_dtype(x): - try: - return canonicalize_dtype_handlers[type(x)](x) - except KeyError: - raise TypeError("No canonicalize_dtype handler for type: {}".format(type(x))) + typ = type(x) + handler = canonicalize_dtype_handlers.get(typ) + if handler: return handler(x) + for typ in typ.mro(): + handler = canonicalize_dtype_handlers.get(typ) + if handler: return handler(x) + raise TypeError("No canonicalize_dtype handler for type: {}".format(type(x))) + canonicalize_dtype_handlers = {} canonicalize_dtype_handlers[core.Unit] = identity def _canonicalize_ndarray_dtype(x): return onp.asarray(x, dtypes.canonicalize_dtype(dtypes.result_type(x))) for _t in array_types: canonicalize_dtype_handlers[_t] = _canonicalize_ndarray_dtype -def _canonicalize_python_scalar_dtype(x): +def _canonicalize_python_scalar_dtype(typ, x): return onp.asarray( - x, dtypes.canonicalize_dtype(dtypes.python_scalar_dtypes[type(x)])) + x, dtypes.canonicalize_dtype(dtypes.python_scalar_dtypes[typ])) for _t in dtypes.python_scalar_dtypes.keys(): - canonicalize_dtype_handlers[_t] = _canonicalize_python_scalar_dtype + canonicalize_dtype_handlers[_t] = partial(_canonicalize_python_scalar_dtype, _t) def abstractify(x): - try: - return pytype_aval_mappings[type(x)](x) - except KeyError: - raise TypeError("No abstraction handler for type: {}".format(type(x))) + typ = type(x) + aval_fn = pytype_aval_mappings.get(typ) + if aval_fn: return aval_fn(x) + for typ in typ.mro(): + aval_fn = pytype_aval_mappings.get(typ) + if aval_fn: return aval_fn(x) + raise TypeError("No abstraction handler for type: {}".format(type(x))) + pytype_aval_mappings = {} pytype_aval_mappings[core.Unit] = lambda _: core.abstract_unit for _t in array_types: pytype_aval_mappings[_t] = make_shaped_array -for _t in dtypes.python_scalar_dtypes.keys(): - pytype_aval_mappings[_t] = make_abstract_python_scalar +def _make_abstract_python_scalar(aval, _): return aval + +for _t, _v in dtypes.python_scalar_dtypes.items(): + pytype_aval_mappings[_t] = partial( + _make_abstract_python_scalar, ShapedArray((), _v, weak_type=True)) ### op-by-op execution diff --git a/tests/benchmarks/xla.py b/tests/benchmarks/xla.py new file mode 100644 index 000000000000..2abdfddccd00 --- /dev/null +++ b/tests/benchmarks/xla.py @@ -0,0 +1,48 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import pytest +import numpy as np +import six + +import jax +from jax import numpy as jnp +from jax.interpreters import xla + + +_abstractify_args = [ + 3, + 3.5, + np.int32(3), + np.uint32(7), + np.random.randn(3, 4, 5, 6), + np.arange(100, dtype=np.float32), + jnp.int64(-3), + jnp.array([1, 2, 3]) +] + +if six.PY3: + import enum + class AnEnum(enum.IntEnum): + A = 123 + B = 456 + _abstractify_args.append(AnEnum.B) + +@pytest.mark.parametrize("arg", _abstractify_args) +def test_abstractify(benchmark, arg): + benchmark(xla.abstractify, arg) \ No newline at end of file diff --git a/tests/dtypes_test.py b/tests/dtypes_test.py index f8061f960830..f7286b016acb 100644 --- a/tests/dtypes_test.py +++ b/tests/dtypes_test.py @@ -18,6 +18,12 @@ import itertools import operator +import unittest + +import six + +if six.PY3: + import enum from absl.testing import absltest from absl.testing import parameterized @@ -133,5 +139,15 @@ def testPromoteDtypes(self): dtypes.promote_types(t1, t2)) + @unittest.skipIf(six.PY2, "Test requires Python 3") + def testEnumPromotion(self): + class AnEnum(enum.IntEnum): + A = 42 + B = 101 + onp.testing.assert_equal(onp.array(42), onp.array(AnEnum.A)) + onp.testing.assert_equal(np.array(42), np.array(AnEnum.A)) + onp.testing.assert_equal(onp.int32(101), onp.int32(AnEnum.B)) + onp.testing.assert_equal(np.int32(101), np.int32(AnEnum.B)) + if __name__ == "__main__": absltest.main() From c63bfca2001dd9d0f9496ba6061cceb79af65724 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 11 Dec 2019 14:27:16 -0500 Subject: [PATCH 0501/1053] Fix breakage due to optimization in https://github.com/google/jax/pull/1840 (#1843) Precomputing a ShapedArray can cause problems depending on when --jax_enable_x64 is parsed. --- jax/interpreters/xla.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 73a5a7502013..92b525dcfa83 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -139,11 +139,11 @@ def abstractify(x): for _t in array_types: pytype_aval_mappings[_t] = make_shaped_array -def _make_abstract_python_scalar(aval, _): return aval +def _make_abstract_python_scalar(typ, _): + return ShapedArray((), dtypes.python_scalar_dtypes[typ], weak_type=True) -for _t, _v in dtypes.python_scalar_dtypes.items(): - pytype_aval_mappings[_t] = partial( - _make_abstract_python_scalar, ShapedArray((), _v, weak_type=True)) +for _t in dtypes.python_scalar_dtypes.keys(): + pytype_aval_mappings[_t] = partial(_make_abstract_python_scalar, _t) ### op-by-op execution From 3a07c69d0cf2a733dff0ef91a5f4381bee70f3f3 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 11 Dec 2019 16:41:24 -0500 Subject: [PATCH 0502/1053] Implement jax.numpy.nextafter. (#1845) --- docs/jax.lax.rst | 1 + docs/jax.numpy.rst | 1 + jax/lax/lax.py | 12 ++++++++++-- jax/lax_reference.py | 1 + jax/numpy/lax_numpy.py | 1 + tests/lax_numpy_test.py | 2 ++ tests/lax_test.py | 2 ++ 7 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index 6d3122725109..30a715290fb6 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -90,6 +90,7 @@ Operators mul ne neg + nextafter pad pow real diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index a302e0ff5126..e19d3888756b 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -178,6 +178,7 @@ Not every function in NumPy is implemented; contributions are welcome! nanprod nansum negative + nextafter not_equal ones ones_like diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2affa45e5734..1338e6284257 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -118,6 +118,10 @@ def sign(x): """ return sign_p.bind(x) +def nextafter(x1, x2): + r"""Returns the next representable value after `x1` in the direction of `x2`.""" + return nextafter_p.bind(_brcast(x1, x2), _brcast(x2, x1)) + def floor(x): r"""Elementwise floor: :math:`\left\lfloor x \right\rfloor`.""" return floor_p.bind(x) @@ -184,13 +188,13 @@ def digamma(x): def bessel_i0e(x): r"""Exponentially scaled modified Bessel function of order 0: - :math:`\mathrm{i0e}(x) = e^{-\mathrm{abs}(x)} \mathrm{i0}(x)` + :math:`\mathrm{i0e}(x) = e^{-|x|} \mathrm{i0}(x)` """ return bessel_i0e_p.bind(x) def bessel_i1e(x): r"""Exponentially scaled modified Bessel function of order 1: - :math:`\mathrm{i1e}(x) = e^{-\mathrm{abs}(x)} \mathrm{i1}(x)` + :math:`\mathrm{i1e}(x) = e^{-|x|} \mathrm{i1}(x)` """ return bessel_i1e_p.bind(x) @@ -1622,6 +1626,10 @@ def _brcast_to(x, shape): sign_p = standard_unop(_num, 'sign') ad.defjvp_zero(sign_p) +nextafter_p = standard_binop( + [_float, _float], 'nextafter', + translation_rule=lambda c, x1, x2: c.NextAfter(x1, x2)) + floor_p = standard_unop(_float, 'floor') ad.defjvp_zero(floor_p) diff --git a/jax/lax_reference.py b/jax/lax_reference.py index 6fda3d5365f9..0e7686ca3d5f 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -37,6 +37,7 @@ floor = onp.floor ceil = onp.ceil round = onp.round +nextafter = onp.nextafter is_finite = onp.isfinite diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index db8afc6d3aee..2a01b71cc7a9 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -427,6 +427,7 @@ def _one_to_one_binop(numpy_fn, lax_fn, promote_to_inexact=False): minimum = _one_to_one_binop(onp.minimum, lax.min) maximum = _one_to_one_binop(onp.maximum, lax.max) float_power = _one_to_one_binop(onp.float_power, lax.pow, True) +nextafter = _one_to_one_binop(onp.nextafter, lax.nextafter, True) def _comparison_op(numpy_fn, lax_fn): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index c1f40eaf4c6e..48d3fa7fccb6 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -123,6 +123,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("minimum", 2, number_dtypes, all_shapes, jtu.rand_some_inf, []), op_record("multiply", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("negative", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("nextafter", 2, [f for f in float_dtypes if f != lnp.bfloat16], + all_shapes, jtu.rand_default, ["rev"], inexact=True, tolerance=0), op_record("not_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), op_record("array_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), op_record("reciprocal", 1, inexact_dtypes, all_shapes, jtu.rand_default, []), diff --git a/tests/lax_test.py b/tests/lax_test.py index afe20548f55a..8eb9a4dca943 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -81,6 +81,8 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("floor", 1, float_dtypes, jtu.rand_small), op_record("ceil", 1, float_dtypes, jtu.rand_small), op_record("round", 1, float_dtypes, jtu.rand_default), + op_record("nextafter", 2, [f for f in float_dtypes if f != dtypes.bfloat16], + jtu.rand_default, tol=0), op_record("is_finite", 1, float_dtypes, jtu.rand_small), From ac3cb59ce5ae605a4f4c2b10ea32e4c935c2effb Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 11 Dec 2019 18:39:16 -0800 Subject: [PATCH 0503/1053] make nested jit stage out full inner jit bodies Before this change, inner jitted functions wouldn't necessarily be fully staged out into an outer-jit trace; instead, as much as possible would be hoisted out of the inner jit. That led to extra constants getting materialized in #1640. For example: ```python @jit def f(x, y): z = 2 * x return y + z @jit def g(x): return f(2, x) g(3) ``` would lead to these XLA computations being compiled and executed: ``` HloModule jit_f.7 ENTRY jit_f.7 { parameter.2 = () parameter(1) tuple.3 = () tuple() parameter.1 = s32[] parameter(0) constant.4 = s32[] constant(2) multiply.5 = s32[] multiply(parameter.1, constant.4) ROOT tuple.6 = ((), s32[]) tuple(tuple.3, multiply.5) } HloModule jit_g.14 jaxpr_subcomputation.4 { parameter.6 = () parameter(1) tuple.8 = () tuple() parameter.7 = s32[] parameter(2) parameter.5 = s32[] parameter(0) add.9 = s32[] add(parameter.7, parameter.5) ROOT tuple.10 = (s32[]) tuple(add.9) } ENTRY jit_g.14 { constant.1 = s32[] constant(4) tuple.3 = () tuple() parameter.2 = s32[] parameter(0) call.11 = (s32[]) call(constant.1, tuple.3, parameter.2), to_apply=jaxpr_subcomputation.4 get-tuple-element.12 = s32[] get-tuple-element(call.11), index=0 ROOT tuple.13 = (s32[]) tuple(get-tuple-element.12) } ``` Notice that the `multiply` is separated out from the `add`, and in particular the XLA computation underlying `g` only has the `add` in it. This behavior was desirable when using partial evaluation for reverse-mode autodiff, since in that case we want to partially evaluate all the primal values underneath a call while staging out a jaxpr for the tangent values. But it was undesirable for the other use of partial evaluation, namely forming jaxprs under `jit` (and `pmap`). The solution was just to tag jaxpr traces differently in the two cases. --- jax/interpreters/partial_eval.py | 27 +++++++++++++++++++----- jax/interpreters/pxla.py | 11 +++++----- jax/interpreters/xla.py | 2 +- tests/api_test.py | 35 ++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 12 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 6e7430f74e9d..b8002d015dc2 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -84,6 +84,16 @@ def instantiate_const(self, tracer): else: raise TypeError(pv) + def instantiate_const_abstracted(self, tracer): + pv, const = tracer.pval + if isinstance(pv, AbstractValue): + return tracer + elif pv is None: + aval = raise_to_shaped(get_aval(const)) + return JaxprTracer(self, PartialVal((aval, unit)), ConstVar(const)) + else: + raise TypeError(pv) + def process_primitive(self, primitive, tracers, params): if primitive in custom_partial_eval_rules: return custom_partial_eval_rules[primitive](self, *tracers, **params) @@ -106,6 +116,8 @@ def process_primitive(self, primitive, tracers, params): return out_tracer def process_call(self, call_primitive, f, tracers, params): + if self.master.trace_type is StagingJaxprTrace: + tracers = map(self.instantiate_const_abstracted, tracers) if call_primitive in call_partial_eval_rules: return call_partial_eval_rules[call_primitive](self, f, tracers, params) if call_primitive in map_primitives: @@ -192,6 +204,12 @@ def todo(x): return out_tracers return out, todo +# This subclass is used just for its type tag, which switches the behavior of +# process_call to stage out into the jaxpr any call primitives encountered +# (rather than doing partial evaluation into the call). +class StagingJaxprTrace(JaxprTrace): + pass + def _mapped_aval(aval): if aval is core.abstract_unit: return aval @@ -482,11 +500,10 @@ def _remat_partial_eval(trace, f, tracers, params): # both in the `bind` call below and the `core.jaxpr_as_fun` call). We use the # `concrete` parameter to switch this behavior, and if `concrete` is False # then we raise the avals to the Shaped level. - instantiated_tracers = map(trace.instantiate_const, tracers) - if not concrete: - instantiated_tracers = [ - JaxprTracer(trace, PartialVal((raise_to_shaped(t.pval[0]), unit)), t.recipe) - if type(t.pval[0]) is ConcreteArray else t for t in instantiated_tracers] + if concrete: + instantiated_tracers = map(trace.instantiate_const, tracers) + else: + instantiated_tracers = map(trace.instantiate_const_abstracted, tracers) # Using the instantiated tracers, run call_bind like JaxprTrace.process_call. in_pvs, in_consts = unzip2(t.pval for t in instantiated_tracers) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 5e385e80402c..81be8bc7c96b 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -35,7 +35,6 @@ from ..util import partial, unzip2, concatenate, prod, safe_map from ..lib import xla_bridge as xb from .xla import aval_to_xla_shape, xla_destructure -from .partial_eval import trace_to_subjaxpr, merge_pvals, JaxprTrace, PartialVal from .batching import broadcast, not_mapped from . import batching from . import partial_eval as pe @@ -450,11 +449,11 @@ def dynamic_fun(dummy, *args): return fun.call_wrapped(*args) avals = tuple(map(partial(shard_aval, axis_size), avals)) - pvals = [PartialVal((aval, core.unit)) for aval in avals] - pval = PartialVal([core.abstract_unit, core.unit]) # dummy value for axis env - with core.new_master(JaxprTrace, True) as master: - jaxpr, (out_pvals, consts, env) = \ - trace_to_subjaxpr(dynamic_fun, master, False).call_wrapped([pval] + pvals) + pvals = [pe.PartialVal((aval, core.unit)) for aval in avals] + pval = pe.PartialVal([core.abstract_unit, core.unit]) # dummy value for axis env + with core.new_master(pe.StagingJaxprTrace, True) as master: + jaxpr, (out_pvals, consts, env) = pe.trace_to_subjaxpr( + dynamic_fun, master, False).call_wrapped([pval] + pvals) jaxpr.invars = jaxpr.invars[1:] # ignore dummy assert not env del master diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 92b525dcfa83..fdb7ef5e8e53 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -419,7 +419,7 @@ def _xla_call_impl(fun, *args, **params): @lu.cache def _xla_callable(fun, device, backend, *abstract_args): pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] - with core.new_master(pe.JaxprTrace, True) as master: + with core.new_master(pe.StagingJaxprTrace, True) as master: jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) assert not env # no subtraces here del master, env diff --git a/tests/api_test.py b/tests/api_test.py index 3855be4e386f..30800a14af9b 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1547,6 +1547,41 @@ def test_trivial_computations(self): self.assertIs(z3, x1) self.assertEqual(z2, 1) + def test_nested_jit_hoisting(self): + @api.jit + def f(x, y): + z = 2 * x + return y + z, 3 + + @api.jit + def g(x): + return f(2, x) + + jaxpr_subcomp = xla.jaxpr_subcomp + + jaxprs = [] + def jaxpr_subcomp_and_collect(c, jaxpr, *args, **kwargs): + jaxprs.append(jaxpr) + return jaxpr_subcomp(c, jaxpr, *args, **kwargs) + + try: + xla.jaxpr_subcomp = jaxpr_subcomp_and_collect + ans = g(3) + finally: + xla.jaxpr_subcomp = jaxpr_subcomp + + self.assertEqual(ans, (7, 3)) + self.assertLen(jaxprs, 2) + outer_jaxpr, inner_jaxpr = jaxprs + + self.assertLen(outer_jaxpr.eqns, 1) + self.assertEqual(outer_jaxpr.eqns[0].primitive.name, 'xla_call') + (subjaxpr_1, _, _), = outer_jaxpr.eqns[0].bound_subjaxprs + self.assertEqual(str(subjaxpr_1), str(inner_jaxpr)) + self.assertLen(inner_jaxpr.eqns, 2) + self.assertEqual(inner_jaxpr.eqns[0].primitive.name, 'mul') + self.assertEqual(inner_jaxpr.eqns[1].primitive.name, 'add') + class JaxprTest(jtu.JaxTestCase): From 876c9c0ede328b76e71d2ada114cb6bd9e976103 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 11 Dec 2019 20:46:05 -0800 Subject: [PATCH 0504/1053] fix x64 issue --- jax/abstract_arrays.py | 4 ++-- jax/interpreters/partial_eval.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 0419979398b6..f169964d9ad3 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -228,9 +228,9 @@ def zeros_like_shaped_array(aval): ad_util.aval_zeros_likers[ShapedArray] = zeros_like_shaped_array -def raise_to_shaped(aval): +def raise_to_shaped(aval, weak_type=False): if isinstance(aval, ShapedArray): - return ShapedArray(aval.shape, aval.dtype) + return ShapedArray(aval.shape, aval.dtype, weak_type=weak_type) elif aval is core.abstract_unit: return core.abstract_unit elif aval is abstract_token: diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index b8002d015dc2..aa35777f3239 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -89,7 +89,7 @@ def instantiate_const_abstracted(self, tracer): if isinstance(pv, AbstractValue): return tracer elif pv is None: - aval = raise_to_shaped(get_aval(const)) + aval = raise_to_shaped(get_aval(const), onp.isscalar(const)) return JaxprTracer(self, PartialVal((aval, unit)), ConstVar(const)) else: raise TypeError(pv) From fbde09f5677351431b91b66debc5f6d37a03f915 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 12 Dec 2019 05:14:57 -0800 Subject: [PATCH 0505/1053] add tuple_args logic to xla primitive application --- jax/interpreters/xla.py | 18 +++++++++++++----- jax/lax/lax.py | 16 ++++++++-------- jax/lax/lax_control_flow.py | 2 +- jax/lax/lax_parallel.py | 2 +- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index fdb7ef5e8e53..1a6cb742d792 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -162,18 +162,20 @@ def xla_primitive_callable(prim, *abstract_args, **params): handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) else: handle_result = aval_to_result_handler(aval_out) - built_c = primitive_computation(prim, *abstract_args, **params) + tuple_args = len(abstract_args) > 100 + built_c = primitive_computation(prim, tuple_args, *abstract_args, **params) compiled = built_c.Compile(compile_options=xb.get_compile_options(), backend=xb.get_backend(backend)) - return partial(_execute_compiled_primitive, prim, compiled, backend, handle_result) + return partial(_execute_compiled_primitive, prim, compiled, backend, + tuple_args, handle_result) @cache() -def primitive_computation(prim, *avals, **params): +def primitive_computation(prim, tuple_args, *avals, **params): c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) c.SetOpMetadata(xc.OpMetadata(op_type=prim.name, op_name=str(params))) backend = params.pop("backend", None) platform = xb.get_backend(backend).platform - xla_args = _xla_callable_args(c, avals, False) + xla_args = _xla_callable_args(c, avals, tuple_args) if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] rule(c, *xla_args, **params) # return val set as a side-effect on c @@ -197,9 +199,15 @@ def primitive_computation(prim, *avals, **params): "https://github.com/google/jax/issues\n") raise RuntimeError(msg) -def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): +def primitive_subcomputation(prim, *avals, **params): + return primitive_computation(prim, False, *avals, **params) + +def _execute_compiled_primitive(prim, compiled, backend, tuple_args, + result_handler, *args): device, = compiled.local_devices() input_bufs = [device_put(x, device) for x in args if x is not token] + if tuple_args: + input_bufs = [make_tuple(input_bufs, device, backend)] out_buf = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 1338e6284257..ccb88b378db6 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3393,7 +3393,7 @@ def _reduce_sum_translation_rule(c, operand, axes, input_shape): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(0, dtype)), - xla.primitive_computation(add_p, scalar, scalar), + xla.primitive_subcomputation(add_p, scalar, scalar), axes) def _reduce_sum_transpose_rule(cotangent, input_shape, axes): @@ -3417,7 +3417,7 @@ def _reduce_prod_translation_rule(c, operand, axes): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(1, dtype)), - xla.primitive_computation(mul_p, scalar, scalar), + xla.primitive_subcomputation(mul_p, scalar, scalar), axes) def _reduce_prod_jvp_rule(tangent, operand, axes): @@ -3463,7 +3463,7 @@ def _reduce_chooser_translation_rule(prim, identity, c, operand, axes): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(identity(dtype)), - xla.primitive_computation(prim, scalar, scalar), axes) + xla.primitive_subcomputation(prim, scalar, scalar), axes) def _reduce_chooser_jvp_rule(g, ans, operand, axes): # TODO(mattjj): an alternative is to use variadic reduce to compute the chosen @@ -3500,7 +3500,7 @@ def _reduce_logical_shape_rule(operand, axes): def _reduce_logical_translation_rule(prim, identity, c, operand, axes): scalar = ShapedArray((), onp.bool_) return c.Reduce(operand, c.Constant(identity(onp.bool_)), - xla.primitive_computation(prim, scalar, scalar), axes) + xla.primitive_subcomputation(prim, scalar, scalar), axes) _reduce_or_translation_rule = partial(_reduce_logical_translation_rule, or_p, _get_max_identity) @@ -3563,7 +3563,7 @@ def _reduce_window_sum_translation_rule(c, operand, window_dimensions, dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.ReduceWindow(operand, c.Constant(onp.array(0, dtype)), - xla.primitive_computation(add_p, scalar, scalar), + xla.primitive_subcomputation(add_p, scalar, scalar), window_dimensions, window_strides, padding) def _reduce_window_sum_transpose_rule(cotangent, window_dimensions, @@ -3610,7 +3610,7 @@ def _reduce_window_chooser_translation_rule( dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.ReduceWindow(operand, c.Constant(identity(dtype)), - xla.primitive_computation(prim, scalar, scalar), + xla.primitive_subcomputation(prim, scalar, scalar), window_dimensions, window_strides, padding) def _reduce_window_chooser_jvp_rule(prim, g, operand, window_dimensions, @@ -3700,8 +3700,8 @@ def _select_and_scatter_add_translation( padding): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) - select = xla.primitive_computation(select_prim, scalar, scalar) - scatter = xla.primitive_computation(add_p, scalar, scalar) + select = xla.primitive_subcomputation(select_prim, scalar, scalar) + scatter = xla.primitive_subcomputation(add_p, scalar, scalar) zero = c.Constant(onp.array(0, dtype)) return c.SelectAndScatter(operand, select, window_dimensions, window_strides, padding, source, zero, scatter) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index c44938307098..c29a86e886df 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -235,7 +235,7 @@ def _while_loop_translation_rule(c, axis_env, *args, **kwargs): _map(cond_c.Constant, cond_jaxpr.literals), (), *(x + z)) if batched: scalar = ShapedArray((), onp.bool_) - or_ = xla.primitive_computation(lax.or_p, scalar, scalar) + or_ = xla.primitive_subcomputation(lax.or_p, scalar, scalar) pred = cond_c.Reduce(pred, cond_c.Constant(onp.array(False)), or_, list(range(cond_jaxpr.out_avals[0].ndim))) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 661a96ed49c2..cd6d4ef1b6c6 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -191,7 +191,7 @@ def _allreduce_split_axis_rule(prim, reducer, vals, which_mapped, axis_name): def _allreduce_translation_rule(prim, c, val, replica_groups, backend=None): dtype = c.GetShape(val).numpy_dtype() scalar = ShapedArray((), dtype) - computation = xla.primitive_computation(prim, scalar, scalar, backend=backend) + computation = xla.primitive_subcomputation(prim, scalar, scalar, backend=backend) return c.AllReduce(val, computation, replica_groups=replica_groups) # psum translation rule has special handling for complex dtypes From 3d7f884ccfe15da1b218903b37b255769223b4cf Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 12 Dec 2019 09:14:45 -0500 Subject: [PATCH 0506/1053] Implement __round__ on JAX arrays. (#1846) * Implement __round__ on JAX arrays. Avoids breakage from https://github.com/google/jax/pull/1836 --- jax/numpy/lax_numpy.py | 6 ++++++ tests/lax_numpy_test.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 2a01b71cc7a9..d4b42401a8b3 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3235,6 +3235,11 @@ def _unimplemented_setitem(self, i, x): "jax.ops.index_add instead?") raise TypeError(msg.format(type(self))) +def _operator_round(number, ndigits=None): + out = round(number, decimals=ndigits or 0) + # If `ndigits` is None, for a builtin float round(7.5) returns an integer. + return out.astype(int_) if ndigits is None else out + _operators = { "getitem": _rewriting_take, "setitem": _unimplemented_setitem, @@ -3276,6 +3281,7 @@ def _unimplemented_setitem(self, i, x): "invert": bitwise_not, "lshift": left_shift, "rshift": right_shift, + "round": _operator_round, } # These numpy.ndarray methods are just refs to an equivalent numpy function diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 48d3fa7fccb6..f16249e2263e 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -828,6 +828,21 @@ def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=check_dtypes, atol=tol, rtol=tol) + def testOperatorRound(self): + self.assertAllClose(round(onp.float32(7.532), 1), + round(lnp.float32(7.5), 1), check_dtypes=True) + self.assertAllClose(round(onp.float32(1.234), 2), + round(lnp.float32(1.234), 2), check_dtypes=True) + self.assertAllClose(round(onp.float32(1.234)), + round(lnp.float32(1.234)), check_dtypes=False) + self.assertAllClose(round(onp.float32(7.532), 1), + round(lnp.array(7.5, lnp.float32), 1), check_dtypes=True) + self.assertAllClose(round(onp.float32(1.234), 2), + round(lnp.array(1.234, lnp.float32), 2), check_dtypes=True) + self.assertAllClose(round(onp.float32(1.234)), + round(lnp.array(1.234, lnp.float32)), + check_dtypes=False) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_mode={}_rpadwidth={}_rconstantvalues={}".format( jtu.format_shape_dtype_string(shape, dtype), mode, pad_width_rank, From 9d12a24b63ac10943006d588f601718c135c12ef Mon Sep 17 00:00:00 2001 From: Julius Kunze Date: Fri, 13 Dec 2019 11:46:08 +0000 Subject: [PATCH 0507/1053] Add categorical sampler --- jax/random.py | 18 ++++++++++++++++++ tests/random_test.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index 92806f1c7308..a0e91ab782de 100644 --- a/jax/random.py +++ b/jax/random.py @@ -946,6 +946,24 @@ def _gumbel(key, shape, dtype): return -np.log(-np.log( uniform(key, shape, dtype, minval=np.finfo(dtype).eps, maxval=1.))) +def categorical(key, logits, axis=-1, shape=()): + """Sample random values from categorical distributions. + + Args: + key: a PRNGKey used as the random key. + logits: Unnormalized log probabilities of the categorical distribution(s) to sample from. + axis: Specifies the axis along which logits belong to the same categorical distribution. + shape: Specifies how many samples to take per categorical distribution and in what shape to arrange them. + + Returns: + Samples of shape `shape + tuple(onp.delete(logits.shape, axis))`. + The first len(shape) dimensions specify which sample, + while the last len(logits.shape) - 1 dimensions make up the shape per sample. + """ + if axis >= 0: + axis += len(shape) + + return np.argmax(gumbel(key, shape + logits.shape, logits.dtype) + logits, axis=axis) def laplace(key, shape=(), dtype=onp.float64): """Sample Laplace random values with given shape and float dtype. diff --git a/tests/random_test.py b/tests/random_test.py index f025626e5a32..c5462e1e2a24 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -26,7 +26,7 @@ import scipy.special import scipy.stats -from jax import api +from jax import api, safe_zip, safe_map from jax import lax from jax import numpy as np from jax import random @@ -37,6 +37,8 @@ config.parse_flags_with_absl() FLAGS = config.FLAGS +zip = safe_zip +map = safe_map class LaxRandomTest(jtu.JaxTestCase): @@ -187,6 +189,34 @@ def testBernoulli(self, p, dtype): for samples in [uncompiled_samples, compiled_samples]: self._CheckChiSquared(samples, scipy.stats.bernoulli(p).pmf) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_p={}_{}".format(p, dtype), + "p": p, "axis": axis, "dtype": onp.dtype(dtype).name} + for (p, axis) in [([.25] * 4, -1), ([[.25, .25], [.1, .9]], 1), ([[.25, .1], [.25, .9]], 0)] + for dtype in [onp.float32, onp.float64])) + def testCategorical(self, p, axis, dtype): + key = random.PRNGKey(0) + p = onp.array(p, dtype=dtype) + logits = onp.log(p) - 42 # test unnormalized + shape = (10000,) + rand = lambda key, p: random.categorical(key, logits, shape=shape, axis=axis) + crand = api.jit(rand) + + uncompiled_samples = rand(key, p) + compiled_samples = crand(key, p) + + for samples in [uncompiled_samples, compiled_samples]: + if axis < 0: + axis += len(logits.shape) + + assert samples.shape == shape + tuple(onp.delete(p.shape, axis)) + + if len(p.shape[:-1]) > 0: + for cat_index, p_ in enumerate(p): + self._CheckChiSquared(samples[:, cat_index], pmf=lambda x: p_[x]) + else: + self._CheckChiSquared(samples, pmf=lambda x: p[x]) + def testBernoulliShape(self): key = random.PRNGKey(0) x = random.bernoulli(key, onp.array([0.2, 0.3]), shape=(3, 2)) From cc92bb64115b817f18a3ebf016170d9158845688 Mon Sep 17 00:00:00 2001 From: Pavel Sountsov <43966695+SiegeLordEx@users.noreply.github.com> Date: Fri, 13 Dec 2019 05:41:51 -0800 Subject: [PATCH 0508/1053] Improve the VJP structure mismatch errors. (#1854) --- jax/api.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/jax/api.py b/jax/api.py index 1619447aceb2..5a59b288211b 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1703,11 +1703,27 @@ def custom_transforms_vjp(*consts_and_args, **params): args = tree_unflatten(params['in_tree'], args_flat) out, vjp = custom_vjp(*args) out_flat, out_tree = tree_flatten(out) - assert out_tree == params['out_tree'] # TODO(mattjj): better error message + if out_tree != params['out_tree']: + msg = ( + "First output of `custom_vjp`: {} doesn't match the structure of " + "the output of `fun`: {}\n" + "{}\n" + "vs\n" + "{}\n".format(custom_vjp, fun, out_tree, params['out_tree']) + ) + raise TypeError(msg) def vjp_flat(*cts_flat): cts = tree_unflatten(out_tree, cts_flat) args_cts_flat, in_tree2 = tree_flatten(vjp(cts)) - assert in_tree == in_tree2 # TODO(mattjj): better error message + if in_tree != in_tree2: + msg = ( + "Output of the `vjp`: {} doesn't match the structure of args of " + "`fun`: {}\n" + "{}\n" + "vs\n" + "{}\n".format(vjp, fun, in_tree2, in_tree) + ) + raise TypeError(msg) return [core.unit] * num_consts + list(args_cts_flat) return out_flat, vjp_flat ad.defvjp_all(fun.prim, custom_transforms_vjp) From 6178755281cd2ff7c48d26c584ac4e1e1f474d1c Mon Sep 17 00:00:00 2001 From: Julius Kunze Date: Fri, 13 Dec 2019 15:00:32 +0000 Subject: [PATCH 0509/1053] Remove safe zip/map --- tests/random_test.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/random_test.py b/tests/random_test.py index c5462e1e2a24..ce5eb623bfda 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -26,7 +26,7 @@ import scipy.special import scipy.stats -from jax import api, safe_zip, safe_map +from jax import api from jax import lax from jax import numpy as np from jax import random @@ -37,8 +37,6 @@ config.parse_flags_with_absl() FLAGS = config.FLAGS -zip = safe_zip -map = safe_map class LaxRandomTest(jtu.JaxTestCase): From 1f88c831bbe08aea106abfed2c1553a362100b7e Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 13 Dec 2019 15:48:32 -0800 Subject: [PATCH 0510/1053] Add Cloud TPU Colabs landing page. --- cloud_tpu_colabs/Lorentz_ODE_Solver.ipynb | 484 +++++++++++++++++ cloud_tpu_colabs/Pmap_Cookbook.ipynb | 630 ++++++++++++++++++++++ cloud_tpu_colabs/README.md | 127 +++++ cloud_tpu_colabs/Wave_Equation.ipynb | 529 ++++++++++++++++++ cloud_tpu_colabs/images/lorentz.png | Bin 0 -> 574004 bytes cloud_tpu_colabs/images/wave_movie.gif | Bin 0 -> 5913790 bytes 6 files changed, 1770 insertions(+) create mode 100644 cloud_tpu_colabs/Lorentz_ODE_Solver.ipynb create mode 100644 cloud_tpu_colabs/Pmap_Cookbook.ipynb create mode 100644 cloud_tpu_colabs/README.md create mode 100644 cloud_tpu_colabs/Wave_Equation.ipynb create mode 100644 cloud_tpu_colabs/images/lorentz.png create mode 100644 cloud_tpu_colabs/images/wave_movie.gif diff --git a/cloud_tpu_colabs/Lorentz_ODE_Solver.ipynb b/cloud_tpu_colabs/Lorentz_ODE_Solver.ipynb new file mode 100644 index 000000000000..bec4eba596c7 --- /dev/null +++ b/cloud_tpu_colabs/Lorentz_ODE_Solver.ipynb @@ -0,0 +1,484 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Lorentz ODE Solver", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "TPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "ntE40GybB_cn", + "colab_type": "text" + }, + "source": [ + "# Lorentz ODE Solver in JAX\n", + "Alex Alemi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "j-n2r719AKee", + "colab_type": "text" + }, + "source": [ + "# Cloud TPU Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ReFcuyaKAxh4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Grab newest JAX version.\n", + "!pip install --upgrade -q jax==0.1.54 jaxlib==0.1.37\n", + "\n", + "# Make sure the Colab Runtime is set to Accelerator: TPU.\n", + "import requests\n", + "import os\n", + "if 'TPU_DRIVER_MODE' not in globals():\n", + " url = 'http://' + os.environ['COLAB_TPU_ADDR'].split(':')[0] + ':8475/requestversion/tpu_driver0.1-dev20191206'\n", + " resp = requests.post(url)\n", + " TPU_DRIVER_MODE = 1\n", + "\n", + "# The following is required to use TPU Driver as JAX's backend.\n", + "from jax.config import config\n", + "config.FLAGS.jax_xla_backend = \"tpu_driver\"\n", + "config.FLAGS.jax_backend_target = \"grpc://\" + os.environ['COLAB_TPU_ADDR']\n", + "print(config.FLAGS.jax_backend_target)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fyoHa_blbI71", + "colab_type": "text" + }, + "source": [ + "# Imports" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "GAFiL4V_kPE8", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import io\n", + "from functools import partial\n", + "import numpy as onp\n", + "import jax\n", + "import jax.numpy as np\n", + "from jax import vmap, jit, grad, ops, lax, config\n", + "from jax import random as jr\n", + "\n", + "# The following is required to use TPU Driver as JAX's backend.\n", + "config.FLAGS.jax_xla_backend = \"tpu_driver\"\n", + "config.FLAGS.jax_backend_target = \"grpc://\" + os.environ['COLAB_TPU_ADDR']\n", + "\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.cm as cm\n", + "from IPython.display import display_png\n", + "\n", + "mpl.rcParams['savefig.pad_inches'] = 0\n", + "plt.style.use('seaborn-dark')\n", + "%matplotlib inline" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vruUCSlrU_L7", + "colab_type": "text" + }, + "source": [ + "# Plotting Utilities\n", + "\n", + "These just provide fast, better antialiased line plotting than typical matplotlib plotting routines." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aTVqxdEQLZwM", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@jit\n", + "def drawline(im, x0, y0, x1, y1):\n", + " \"\"\"An implementation of Wu's antialiased line algorithm.\n", + " \n", + " This functional version was adapted from here:\n", + " https://en.wikipedia.org/wiki/Xiaolin_Wu's_line_algorithm\n", + " \"\"\"\n", + "\n", + " ipart = lambda x: np.floor(x).astype('int32')\n", + " round_ = lambda x: ipart(x + 0.5).astype('int32')\n", + " fpart = lambda x: x - np.floor(x)\n", + " rfpart = lambda x: 1 - fpart(x)\n", + "\n", + " def plot(im, x, y, c):\n", + " return ops.index_add(im, ops.index[x, y], c)\n", + "\n", + " steep = np.abs(y1 - y0) > np.abs(x1 - x0)\n", + " cond_swap = lambda cond, x: lax.cond(cond, x, lambda x: (x[1], x[0]), x, lambda x: x)\n", + " \n", + " (x0, y0) = cond_swap(steep, (x0, y0))\n", + " (x1, y1) = cond_swap(steep, (x1, y1))\n", + " \n", + " (y0, y1) = cond_swap(x0 > x1, (y0, y1))\n", + " (x0, x1) = cond_swap(x0 > x1, (x0, x1))\n", + "\n", + " dx = x1 - x0\n", + " dy = y1 - y0\n", + " gradient = np.where(dx == 0.0, 1.0, dy/dx)\n", + "\n", + " # handle first endpoint\n", + " xend = round_(x0)\n", + " yend = y0 + gradient * (xend - x0)\n", + " xgap = rfpart(x0 + 0.5)\n", + " xpxl1 = xend # this will be used in main loop\n", + " ypxl1 = ipart(yend)\n", + "\n", + " def true_fun(im):\n", + " im = plot(im, ypxl1, xpxl1, rfpart(yend) * xgap)\n", + " im = plot(im, ypxl1+1, xpxl1, fpart(yend) * xgap)\n", + " return im\n", + " def false_fun(im):\n", + " im = plot(im, xpxl1, ypxl1 , rfpart(yend) * xgap)\n", + " im = plot(im, xpxl1, ypxl1+1, fpart(yend) * xgap)\n", + " return im\n", + " im = lax.cond(steep, im, true_fun, im, false_fun)\n", + " \n", + " intery = yend + gradient\n", + "\n", + " # handle second endpoint\n", + " xend = round_(x1)\n", + " yend = y1 + gradient * (xend - x1)\n", + " xgap = fpart(x1 + 0.5)\n", + " xpxl2 = xend # this will be used in the main loop\n", + " ypxl2 = ipart(yend)\n", + " def true_fun(im):\n", + " im = plot(im, ypxl2 , xpxl2, rfpart(yend) * xgap)\n", + " im = plot(im, ypxl2+1, xpxl2, fpart(yend) * xgap)\n", + " return im\n", + " def false_fun(im):\n", + " im = plot(im, xpxl2, ypxl2, rfpart(yend) * xgap)\n", + " im = plot(im, xpxl2, ypxl2+1, fpart(yend) * xgap)\n", + " return im\n", + " im = lax.cond(steep, im, true_fun, im, false_fun)\n", + " \n", + " def true_fun(arg):\n", + " im, intery = arg\n", + " def body_fun(x, arg):\n", + " im, intery = arg\n", + " im = plot(im, ipart(intery), x, rfpart(intery))\n", + " im = plot(im, ipart(intery)+1, x, fpart(intery))\n", + " intery = intery + gradient\n", + " return (im, intery)\n", + " im, intery = lax.fori_loop(xpxl1+1, xpxl2, body_fun, (im, intery))\n", + " return (im, intery)\n", + " def false_fun(arg):\n", + " im, intery = arg\n", + " def body_fun(x, arg):\n", + " im, intery = arg\n", + " im = plot(im, x, ipart(intery), rfpart(intery))\n", + " im = plot(im, x, ipart(intery)+1, fpart(intery))\n", + " intery = intery + gradient\n", + " return (im, intery)\n", + " im, intery = lax.fori_loop(xpxl1+1, xpxl2, body_fun, (im, intery))\n", + " return (im, intery)\n", + " im, intery = lax.cond(steep, (im, intery), true_fun, (im, intery), false_fun)\n", + " \n", + " return im\n", + "\n", + "def img_adjust(data):\n", + " oim = onp.array(data)\n", + " hist, bin_edges = onp.histogram(oim.flat, bins=256*256)\n", + " bin_centers = (bin_edges[:-1] + bin_edges[1:]) / 2\n", + " cdf = hist.cumsum()\n", + " cdf = cdf / float(cdf[-1])\n", + " return onp.interp(oim.flat, bin_centers, cdf).reshape(oim.shape)\n", + "\n", + "def imify(arr, vmin=None, vmax=None, cmap=None, origin=None):\n", + " arr = img_adjust(arr)\n", + " sm = cm.ScalarMappable(cmap=cmap)\n", + " sm.set_clim(vmin, vmax)\n", + " if origin is None:\n", + " origin = mpl.rcParams[\"image.origin\"]\n", + " if origin == \"lower\":\n", + " arr = arr[::-1]\n", + " rgba = sm.to_rgba(arr, bytes=True)\n", + " return rgba\n", + "\n", + "def plot_image(array, **kwargs):\n", + " f = io.BytesIO()\n", + " imarray = imify(array, **kwargs)\n", + " plt.imsave(f, imarray, format=\"png\")\n", + " f.seek(0)\n", + " dat = f.read()\n", + " f.close()\n", + " display_png(dat, raw=True)\n", + "\n", + "def pack_images(images, rows, cols):\n", + " shape = onp.shape(images)\n", + " width, height, depth = shape[-3:]\n", + " images = onp.reshape(images, (-1, width, height, depth))\n", + " batch = onp.shape(images)[0]\n", + " rows = onp.minimum(rows, batch)\n", + " cols = onp.minimum(batch // rows, cols)\n", + " images = images[:rows * cols]\n", + " images = onp.reshape(images, (rows, cols, width, height, depth))\n", + " images = onp.transpose(images, [0, 2, 1, 3, 4])\n", + " images = onp.reshape(images, [rows * width, cols * height, depth])\n", + " return images" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FFkdRUDR9cWD", + "colab_type": "text" + }, + "source": [ + "# Lorentz Dynamics\n", + "\n", + "Implement Lorentz' attractor" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aoSvqedskd0W", + "colab_type": "code", + "colab": {} + }, + "source": [ + "sigma = 10.\n", + "beta = 8./3\n", + "rho = 28.\n", + "\n", + "@jit\n", + "def f(state, t):\n", + " x, y, z = state\n", + " return np.array([sigma * (y - x), x * (rho - z) - y, x * y - beta * z])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tanYn8Cx9hUb", + "colab_type": "text" + }, + "source": [ + "# Runge Kutta Integrator" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ejuN_R7Km28v", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@jit\n", + "def rk4(ys, dt, N):\n", + " @jit\n", + " def step(i, ys):\n", + " h = dt\n", + " t = dt * i\n", + " k1 = h * f(ys[i-1], t)\n", + " k2 = h * f(ys[i-1] + k1/2., dt * i + h/2.)\n", + " k3 = h * f(ys[i-1] + k2/2., t + h/2.)\n", + " k4 = h * f(ys[i-1] + k3, t + h)\n", + " \n", + " ysi = ys[i-1] + 1./6 * (k1 + 2 * k2 + 2 * k3 + k4)\n", + " return ops.index_update(ys, ops.index[i], ysi)\n", + " return lax.fori_loop(1, N, step, ys)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "i2UIxo3Z9PZ2", + "colab_type": "text" + }, + "source": [ + "# Solve and plot a single ODE Solution using jitted solver and plotter" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "XvROzDrukzH_", + "colab_type": "code", + "colab": {} + }, + "source": [ + "N = 40000\n", + "\n", + "# set initial condition\n", + "state0 = np.array([1., 1., 1.])\n", + "ys = np.zeros((N,) + state0.shape)\n", + "ys = ops.index_update(ys, ops.index[0], state0)\n", + "\n", + "# solve for N steps\n", + "ys = rk4(ys, 0.004, N).block_until_ready()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "t4k3UrtbM4jy", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# plotting size and region:\n", + "xlim, zlim = (-20, 20), (0, 50)\n", + "xN, zN = 800, 600\n", + "\n", + "# fast, jitted plotting function\n", + "@partial(jax.jit, static_argnums=(2,3,4,5))\n", + "def jplotter(xs, zs, xlim, zlim, xN, zN):\n", + " im = np.zeros((xN, zN))\n", + " xpixels = (xs - xlim[0])/(1.0 * (xlim[1] - xlim[0])) * xN\n", + " zpixels = (zs - zlim[0])/(1.0 * (zlim[1] - zlim[0])) * zN\n", + " def body_fun(i, im):\n", + " return drawline(im, xpixels[i-1], zpixels[i-1], xpixels[i], zpixels[i])\n", + " return lax.fori_loop(1, xpixels.shape[0], body_fun, im)\n", + "\n", + "im = jplotter(ys[...,0], ys[...,2], xlim, zlim, xN, zN)\n", + "plot_image(im[:,::-1].T, cmap='magma')" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JWkKc-mh7m9x", + "colab_type": "text" + }, + "source": [ + "# Parallel ODE Solutions with Pmap" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "tlc8Y_pfOERv", + "colab_type": "code", + "colab": {} + }, + "source": [ + "N_dev = jax.device_count()\n", + "N = 4000\n", + "\n", + "# set some initial conditions for each replicate\n", + "ys = np.zeros((N_dev, N, 3))\n", + "state0 = jr.uniform(jr.PRNGKey(1), \n", + " minval=-1., maxval=1.,\n", + " shape=(N_dev, 3))\n", + "state0 = state0 * np.array([18,18,1]) + np.array((0.,0.,10.))\n", + "ys = ops.index_update(ys, ops.index[:, 0], state0)\n", + "\n", + "# solve each replicate in parallel using `pmap` of rk4 solver:\n", + "ys = jax.pmap(rk4)(ys, \n", + " 0.004 * np.ones(N_dev), \n", + " N * np.ones(N_dev, dtype=onp.int32)\n", + " ).block_until_ready()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "_NdalA1qy1Fp", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# parallel plotter using lexical closure and pmap'd core plotting function\n", + "def pplotter(_xs, _zs, xlim, zlim, xN, zN):\n", + " N_dev = _xs.shape[0]\n", + " im = np.zeros((N_dev, xN, zN))\n", + " @jax.pmap\n", + " def plotfn(im, xs, zs):\n", + " xpixels = (xs - xlim[0])/(1.0 * (xlim[1] - xlim[0])) * xN\n", + " zpixels = (zs - zlim[0])/(1.0 * (zlim[1] - zlim[0])) * zN\n", + " def body_fun(i, im):\n", + " return drawline(im, xpixels[i-1], zpixels[i-1], xpixels[i], zpixels[i])\n", + " return lax.fori_loop(1, xpixels.shape[0], body_fun, im)\n", + " return plotfn(im, _xs, _zs)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "vhZyGqHUYkKK", + "colab_type": "code", + "colab": {} + }, + "source": [ + "xlim, zlim = (-20, 20), (0, 50)\n", + "xN, zN = 200, 150\n", + "# above, plot ODE traces separately\n", + "ims = pplotter(ys[...,0], ys[...,2], xlim, zlim, xN, zN)\n", + "im = pack_images(ims[..., None], 4, 2)[..., 0]\n", + "plot_image(im[:,::-1].T, cmap='magma')\n", + "# below, plot combined ODE traces\n", + "ims = pplotter(ys[...,0], ys[...,2], xlim, zlim, xN*4, zN*4)\n", + "plot_image(np.sum(ims, axis=0)[:,::-1].T, cmap='magma')" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "S6c5GWHBbkEX", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] + } + ] +} diff --git a/cloud_tpu_colabs/Pmap_Cookbook.ipynb b/cloud_tpu_colabs/Pmap_Cookbook.ipynb new file mode 100644 index 000000000000..07b10b773eab --- /dev/null +++ b/cloud_tpu_colabs/Pmap_Cookbook.ipynb @@ -0,0 +1,630 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Pmap Cookbook", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "TPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LpPtl0n4rg6L", + "colab_type": "text" + }, + "source": [ + "# Colab JAX TPU Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4DYY4Yyhq8vG", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Grab newest JAX version.\n", + "!pip install --upgrade -q jax==0.1.54 jaxlib==0.1.37\n", + "\n", + "# Make sure the Colab Runtime is set to Accelerator: TPU.\n", + "import requests\n", + "import os\n", + "if 'TPU_DRIVER_MODE' not in globals():\n", + " url = 'http://' + os.environ['COLAB_TPU_ADDR'].split(':')[0] + ':8475/requestversion/tpu_driver0.1-dev20191206'\n", + " resp = requests.post(url)\n", + " TPU_DRIVER_MODE = 1\n", + "\n", + "# The following is required to use TPU Driver as JAX's backend.\n", + "from jax.config import config\n", + "config.FLAGS.jax_xla_backend = \"tpu_driver\"\n", + "config.FLAGS.jax_backend_target = \"grpc://\" + os.environ['COLAB_TPU_ADDR']\n", + "print(config.FLAGS.jax_backend_target)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_4ware9HrjIk", + "colab_type": "text" + }, + "source": [ + "# Pmap CookBook" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sk-3cPGIBTq8", + "colab_type": "text" + }, + "source": [ + "This notebook is an introduction to writing single-program multiple-data (SPMD) programs in JAX, and executing them synchronously in parallel on multiple devices, such as multiple GPUs or multiple TPU cores. The SPMD model is useful for computations like training neural networks with synchronous gradient descent algorithms, and can be used for data-parallel as well as model-parallel computations.\n", + "\n", + "To run this notebook with any parallelism, you'll need multiple XLA devices available, e.g. with a multi-GPU machine or a Cloud TPU.\n", + "\n", + "The code in this notebook is simple. For an example of how to use these tools to do data-parallel neural network training, check out [the SPMD MNIST example](https://github.com/google/jax/blob/master/examples/spmd_mnist_classifier_fromscratch.py) or the much more capable [Trax library](https://github.com/tensorflow/trax/)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Srs8W9F6Jo15", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import jax.numpy as np" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hBasY8p1JFId", + "colab_type": "text" + }, + "source": [ + "## Basics" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "caPiPIWgM7-W", + "colab_type": "text" + }, + "source": [ + "### Pure maps, with no communication" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2e_06-OAJNyi", + "colab_type": "text" + }, + "source": [ + "A basic starting point is expressing parallel maps with [`pmap`](https://jax.readthedocs.io/en/latest/jax.html#jax.pmap):" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6gGT77cIImcE", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import pmap" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "-yY3lOFpJIUS", + "colab_type": "code", + "colab": {} + }, + "source": [ + "result = pmap(lambda x: x ** 2)(np.arange(7))\n", + "print(result)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PgKNzxKPNEYA", + "colab_type": "text" + }, + "source": [ + "In terms of what values are computed, `pmap` is similar to `vmap` in that it transforms a function to map over an array axis:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mmCMQ64QbAbz", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import vmap\n", + "\n", + "x = np.array([1., 2., 3.])\n", + "y = np.array([2., 4., 6.])\n", + "\n", + "print(vmap(np.add)(x, y))\n", + "print(pmap(np.add)(x, y))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iZgTmx5pFd6z", + "colab_type": "text" + }, + "source": [ + "But `pmap` and `vmap` differ in in how those values are computed: where `vmap` vectorizes a function by adding a batch dimension to every primitive operation in the function (e.g. turning matrix-vector multiplies into matrix-matrix multiplies), `pmap` instead replicates the function and executes each replica on its own XLA device in parallel." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4N1--GgGFe9d", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import make_jaxpr\n", + "\n", + "def f(x, y):\n", + " a = np.dot(x, y)\n", + " b = np.tanh(a)\n", + " return b\n", + "\n", + "xs = np.ones((8, 2, 3))\n", + "ys = np.ones((8, 3, 4))\n", + "\n", + "print(\"f jaxpr\")\n", + "print(make_jaxpr(f)(xs[0], ys[0]))\n", + "\n", + "print(\"vmap(f) jaxpr\")\n", + "print(make_jaxpr(vmap(f))(xs, ys))\n", + "\n", + "print(\"pmap(f) jaxpr\")\n", + "print(make_jaxpr(pmap(f))(xs, ys))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BjDnQkzSa_vZ", + "colab_type": "text" + }, + "source": [ + "Notice that applying `vmap(f)` to these arguments leads to a `dot_general` to express the batch matrix multiplication in a single primitive, while applying `pmap(f)` instead leads to a primitive that calls replicas of the original `f` in parallel.\n", + "\n", + "There are also important constraints with using `pmap`:\n", + "1. `pmap` always maps over the leading axis of all of its arguments (while with `vmap` you can use `in_axes` to specify which axes get mapped),\n", + "2. with `pmap` the mapped axis size must be less than or equal to the number of XLA devices available (and for nested `pmap` functions, the product of the mapped axis sizes must be less than or equal to the number of XLA devices).\n", + "\n", + "You can use the output of a `pmap` function just like any other value:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "H4DXQWobOf7V", + "colab_type": "code", + "colab": {} + }, + "source": [ + "y = pmap(lambda x: x ** 2)(np.arange(8))\n", + "z = y / 2\n", + "print(z)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "fM1Une9Rfqld", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.plot(y)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "644UB23YfbW4", + "colab_type": "text" + }, + "source": [ + "But while the output here acts just like a NumPy ndarray, if you look closely it has a different type:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "59hnyVOtfavX", + "colab_type": "code", + "colab": {} + }, + "source": [ + "y" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4brdSdeyf2MP", + "colab_type": "text" + }, + "source": [ + "A `ShardedDeviceArray` is effectively an `ndarray` subclass, but it's stored in pieces spread across the memory of multiple devices. Results from `pmap` functions are left sharded in device memory so that they can be operated on by subsequent `pmap` functions without moving data around, at least in some cases. But these results logically appear just like a single array.\n", + "\n", + "When you call a non-`pmap` function on a `ShardedDeviceArray`, like a standard `jax.numpy` function, communication happens behind the scenes to bring the values to one device (or back to the host in the case of the matplotlib function above):" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "BSSllkblg9Rn", + "colab_type": "code", + "colab": {} + }, + "source": [ + "y / 2" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "efyMSNGahq6f", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import numpy as onp\n", + "onp.sin(y)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ba4jwfkbOwXW", + "colab_type": "text" + }, + "source": [ + "Thinking about device memory is important to maximize performance by avoiding data transfers, but you can always fall back to treating arraylike values as (read-only) NumPy ndarrays and your code will still work.\n", + "\n", + "Here's another example of a pure map which makes better use of our multiple-accelerator resources. We can generate several large random matrices in parallel, then perform parallel batch matrix multiplication without any cross-device movement of the large matrix data:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rWl68coLJSi7", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import random\n", + "\n", + "# create 8 random keys\n", + "keys = random.split(random.PRNGKey(0), 8)\n", + "# create a 5000 x 6000 matrix on each device by mapping over keys\n", + "mats = pmap(lambda key: random.normal(key, (5000, 6000)))(keys)\n", + "# the stack of matrices is represented logically as a single array\n", + "mats.shape" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "nH2gGNgfNOJD", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# run a local matmul on each device in parallel (no data transfer)\n", + "result = pmap(lambda x: np.dot(x, x.T))(mats)\n", + "result.shape" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "MKTZ59iPNPi5", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# compute the mean on each device in parallel and print the results\n", + "print(pmap(np.mean)(result))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "26iH7sHFiz2l", + "colab_type": "text" + }, + "source": [ + "In this example, the large matrices never had to be moved between devices or back to the host; only one scalar per device was pulled back to the host." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MdRscR5MONuN", + "colab_type": "text" + }, + "source": [ + "### Collective communication operations" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bFtajUwp5WYx", + "colab_type": "text" + }, + "source": [ + "In addition to expressing pure maps, where no communication happens between the replicated functions, with `pmap` you can also use special collective communication operations.\n", + "\n", + "One canonical example of a collective, implemented on both GPU and TPU, is an all-reduce sum like `lax.psum`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "d5s8rJVUORQ3", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import lax\n", + "\n", + "normalize = lambda x: x / lax.psum(x, axis_name='i')\n", + "result = pmap(normalize, axis_name='i')(np.arange(4.))\n", + "print(result)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6jd9DVBQPD-Z", + "colab_type": "text" + }, + "source": [ + "To use a collective operation like `lax.psum`, you need to supply an `axis_name` argument to `pmap`. The `axis_name` argument associates a name to the mapped axis so that collective operations can refer to it.\n", + "\n", + "Another way to write this same code is to use `pmap` as a decorator:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "c48qVvlkPF5p", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from functools import partial\n", + "\n", + "@partial(pmap, axis_name='i')\n", + "def normalize(x):\n", + " return x / lax.psum(x, 'i')\n", + "\n", + "print(normalize(np.arange(4.)))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3Pr6n8KkOpmz", + "colab_type": "text" + }, + "source": [ + "Axis names are also important for nested use of `pmap`, where collectives can be applied to distinct mapped axes:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IwoeEd16OrD3", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@partial(pmap, axis_name='rows')\n", + "@partial(pmap, axis_name='cols')\n", + "def f(x):\n", + " row_normed = x / lax.psum(x, 'rows')\n", + " col_normed = x / lax.psum(x, 'cols')\n", + " doubly_normed = x / lax.psum(x, ('rows', 'cols'))\n", + " return row_normed, col_normed, doubly_normed\n", + "\n", + "x = np.arange(8.).reshape((4, 2))\n", + "a, b, c = f(x)\n", + "\n", + "print(a)\n", + "print(a.sum(0))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bnc-vlKA6hvI", + "colab_type": "text" + }, + "source": [ + "When writing nested `pmap` functions in the decorator style, axis names are resolved according to lexical scoping.\n", + "\n", + "Check [the JAX reference documentation](https://jax.readthedocs.io/en/latest/jax.lax.html#parallel-operators) for a complete list of the parallel operators. More are being added!\n", + "\n", + "Here's how to use `lax.ppermute` to implement a simple halo exchange for a [Rule 30](https://en.wikipedia.org/wiki/Rule_30) simulation:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "uazGbMwmf5zO", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax.lib import xla_bridge\n", + "device_count = xla_bridge.device_count()\n", + "\n", + "def send_right(x, axis_name):\n", + " left_perm = [(i, (i + 1) % device_count) for i in range(device_count)]\n", + " return lax.ppermute(x, perm=left_perm, axis_name=axis_name)\n", + "\n", + "def send_left(x, axis_name):\n", + " left_perm = [((i + 1) % device_count, i) for i in range(device_count)]\n", + " return lax.ppermute(x, perm=left_perm, axis_name=axis_name)\n", + "\n", + "def update_board(board):\n", + " left = board[:-2]\n", + " right = board[2:]\n", + " center = board[1:-1]\n", + " return lax.bitwise_xor(left, lax.bitwise_or(center, right))\n", + "\n", + "@partial(pmap, axis_name='i')\n", + "def step(board_slice):\n", + " left, right = board_slice[:1], board_slice[-1:]\n", + " right, left = send_left(left, 'i'), send_right(right, 'i')\n", + " enlarged_board_slice = np.concatenate([left, board_slice, right])\n", + " return update_board(enlarged_board_slice)\n", + "\n", + "def print_board(board):\n", + " print(''.join('*' if x else ' ' for x in board.ravel()))\n", + "\n", + "\n", + "board = onp.zeros(40, dtype=bool)\n", + "board[board.shape[0] // 2] = True\n", + "reshaped_board = board.reshape((device_count, -1))\n", + "\n", + "print_board(reshaped_board)\n", + "for _ in range(20):\n", + " reshaped_board = step(reshaped_board)\n", + " print_board(reshaped_board)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KrkEuY3yO7_M", + "colab_type": "text" + }, + "source": [ + "## Composing with differentiation" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dGHE7dfypqqU", + "colab_type": "text" + }, + "source": [ + "As with all things in JAX, you should expect `pmap` to compose with other transformations, including differentiation." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "VkS7_RcTO_48", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import grad\n", + "\n", + "@pmap\n", + "def f(x):\n", + " y = np.sin(x)\n", + " @pmap\n", + " def g(z):\n", + " return np.cos(z) * np.tan(y.sum()) * np.tanh(x).sum()\n", + " return grad(lambda w: np.sum(g(w)))(x)\n", + " \n", + "f(x)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "4gAJ3QF6PBvi", + "colab_type": "code", + "colab": {} + }, + "source": [ + "grad(lambda x: np.sum(f(x)))(x)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8mAz9bEfPl2F", + "colab_type": "text" + }, + "source": [ + "When reverse-mode differentiating a `pmap` function (e.g. with `grad`), the backward pass of the computation is parallelized just like the forward-pass." + ] + } + ] +} diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md new file mode 100644 index 000000000000..425d630af660 --- /dev/null +++ b/cloud_tpu_colabs/README.md @@ -0,0 +1,127 @@ +# Example Cloud TPU notebooks + +JAX now runs on Cloud TPUs! + +The following notebooks showcase how to use and what you can do with Cloud TPUs on Colab: + +### [Pmap Cookbook](https://colab.research.google.com/github/google/jax/blob/master/cloud_tpu_colabs/Pmap_Cookbook.ipynb) +A guide to getting started with `pmap`, a transform for easily distributing SPMD +computations across devices. + +### [Lorentz ODE Solver](https://colab.research.google.com/github/google/jax/blob/master/cloud_tpu_colabs/Lorentz_ODE_Solver.ipynb) +Contributed by Alex Alemi (alexalemi@) + +Solve and plot parallel ODE solutions with `pmap`. + + + +### [Wave Equation](https://colab.research.google.com/github/google/jax/blob/master/cloud_tpu_colabs/Wave_Equation.ipynb) +Contributed by Stephan Hoyer (shoyer@) + +Solve the wave equation with `pmap`, and make cool movies! The spatial domain is partitioned across the 8 cores of a Cloud TPU. + +![](https://raw.githubusercontent.com/google/jax/master/cloud_tpu_colabs/images/wave_movie.gif) + +## Performance notes + +The [guidance on running TensorFlow on TPUs](https://cloud.google.com/tpu/docs/performance-guide) applies to JAX as well, with the exception of TensorFlow-specific details. Here we highlight a few important details that are particularly relevant to using TPUs in JAX. + +### Padding + +One of the most common culprits for surprisingly slow code on TPUs is inadvertent padding: +- Arrays in the Cloud TPU are tiled. This entails padding one of the dimensions to a multiple of 8, and a different dimension to a multiple of 128. +- The matrix multiplication unit performs best with pairs of large matrices that minimize the need for padding. + +### bfloat16 dtype + +By default\*, matrix multiplication in JAX on TPUs [uses bfloat16](https://cloud.google.com/blog/products/ai-machine-learning/bfloat16-the-secret-to-high-performance-on-cloud-tpus) with float32 accumulation. This can be controlled with the `precision` keyword argument on relevant `jax.numpy` functions (`matmul`, `dot`, `einsum`, etc). In particular: +- `precision=jax.lax.Precision.DEFAULT`: uses mixed bfloat16 precision (fastest) +- `precision=jax.lax.Precision.HIGH`: uses multiple MXU passes to achieve higher precision +- `precision=jax.lax.Precision.HIGHEST`: uses even more MXU passes to achieve full float32 precision + +JAX also adds the `bfloat16` dtype, which you can use to explicitly cast arrays to bfloat16, e.g., `jax.numpy.array(x, dtype=jax.numpy.bfloat16)`. + +\* We might change the default precision in the future, since it is arguably surprising. Please comment/vote on [this issue](https://github.com/google/jax/issues/1856) if it affects you! + +## Running JAX on a Cloud TPU from a GCE VM + +Creating a [Cloud TPU](https://cloud.google.com/tpu/docs/quickstart) involves creating the user GCE VM and the TPU node. + +To create a user GCE VM, run the following command from your GCP console or your computer terminal where you have [gcloud installed](https://cloud.google.com/sdk/install). + +``` +export ZONE=us-central1-c +gcloud compute instances create $USER-user-vm-0001 \ + --machine-type=n1-standard-1 \ + --image-project=ml-images \ + --image-family=tf-1-14 \ + --boot-disk-size=200GB \ + --scopes=cloud-platform \ + --zone=$ZONE +``` + +To create a larger GCE VM, choose a different [machine type](https://cloud.google.com/compute/docs/machine-types). + +Next, create the TPU node, following these [guidelines](https://cloud.google.com/tpu/docs/internal-ip-blocks) to choose a . + +``` +export TPU_IP_ADDRESS= +gcloud compute tpus create $USER-tpu-0001 \ + --zone=$ZONE \ + --network=default \ + --accelerator-type=v2-8 \ + --range=$TPU_IP_ADDRESS \ + --version=tpu_driver_nightly +``` + +Now that you have created both the user GCE VM and the TPU node, ssh to the GCE VM by executing the following command: + +``` +gcloud compute ssh $USER-user-vm-0001 +``` + +Once you are in the VM, from your ssh terminal session, follow the example below to run a simple JAX program. + +**Install jax and jaxlib wheels:** + + +``` +pip install --user jax==0.1.54 jaxlib==0.1.37 +``` + + +**Create a program, simple_jax.py:** + +**IMPORTANT**: Replace below with the TPU node’s IP address. You can get the IP address from the GCP console: Compute Engine > TPUs. + +``` +from jax.config import config +from jax import random + +# The following is required to use TPU Driver as JAX's backend. +config.FLAGS.jax_xla_backend = "tpu_driver" +config.FLAGS.jax_backend_target = "grpc://:8470" + +key = random.PRNGKey(0) +x = random.normal(key, (10,)) +print(x) +``` + +**Run the program:** + +``` +python simple_jax.py +``` + +## Reporting issues + +If you believe you’re experiencing a problem specific to using Cloud TPUs, +please create an issue in the [Cloud TPU issue +tracker](https://issuetracker.google.com/issues/new?component=507145). If you’re +unsure whether it’s problem with Cloud TPUs, JAX, Colab, or anything else, feel +free to create an issue in the [JAX issue +tracker](https://github.com/google/jax/issues) and we'll triage it +appropriately. + +If you have any other questions or comments regarding JAX on Cloud TPUs, please +email jax-tpu@google.com. We’d like to hear from you! diff --git a/cloud_tpu_colabs/Wave_Equation.ipynb b/cloud_tpu_colabs/Wave_Equation.ipynb new file mode 100644 index 000000000000..c70aa06839ab --- /dev/null +++ b/cloud_tpu_colabs/Wave_Equation.ipynb @@ -0,0 +1,529 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "JAX TPU wave equation", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "TPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "l7Sh70ascFNs", + "colab_type": "text" + }, + "source": [ + "# Solving the wave equation on cloud TPUs\n", + "\n", + "[_Stephan Hoyer_](https://twitter.com/shoyer)\n", + "\n", + "In this notebook, we solve the 2D [wave equation](https://en.wikipedia.org/wiki/Wave_equation):\n", + "$$\n", + "\\frac{\\partial^2 u}{\\partial t^2} = c^2 \\nabla^2 u\n", + "$$\n", + "\n", + "We use a simple [finite difference](https://en.wikipedia.org/wiki/Finite_difference_method) formulation with [Leapfrog time integration](https://en.wikipedia.org/wiki/Leapfrog_integration).\n", + "\n", + "Note: It is natural to express finite difference methods as convolutions, but here we intentionally avoid convolutions in favor of array indexing/arithmetic. This is because \"batch\" and \"feature\" dimensions in TPU convolutions are padded to multiples of either 8 and 128, but in our case both these dimensions are effectively of size 1.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xAd8PvW6ceyk", + "colab_type": "text" + }, + "source": [ + "## Setup required environment" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "n6L8zIaAIrqj", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Grab newest JAX version.\n", + "!pip install --upgrade -q jax==0.1.54 jaxlib==0.1.37\n", + "\n", + "# Grab other packages for this demo.\n", + "!pip install -U -q Pillow moviepy proglog\n", + "\n", + "# Make sure the Colab Runtime is set to Accelerator: TPU.\n", + "import requests\n", + "import os\n", + "if 'TPU_DRIVER_MODE' not in globals():\n", + " url = 'http://' + os.environ['COLAB_TPU_ADDR'].split(':')[0] + ':8475/requestversion/tpu_driver0.1-dev20191206'\n", + " resp = requests.post(url)\n", + " TPU_DRIVER_MODE = 1\n", + "\n", + "# The following is required to use TPU Driver as JAX's backend.\n", + "from jax.config import config\n", + "config.FLAGS.jax_xla_backend = \"tpu_driver\"\n", + "config.FLAGS.jax_backend_target = \"grpc://\" + os.environ['COLAB_TPU_ADDR']\n", + "print(config.FLAGS.jax_backend_target)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UHkzcAMhcpm_", + "colab_type": "text" + }, + "source": [ + "## Simulation code" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4NJQ8Q5M99wy", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from functools import partial\n", + "import jax\n", + "from jax import jit, pmap\n", + "from jax import lax\n", + "from jax import tree_util\n", + "import jax.numpy as np\n", + "import numpy as onp\n", + "import matplotlib.pyplot as plt\n", + "import skimage.filters\n", + "import proglog\n", + "from moviepy.editor import ImageSequenceClip\n", + "\n", + "device_count = jax.device_count()\n", + "\n", + "# Spatial partitioning via halo exchange\n", + "\n", + "def send_right(x, axis_name):\n", + " # Note: if some devices are omitted from the permutation, lax.ppermute\n", + " # provides zeros instead. This gives us an easy way to apply Dirichlet\n", + " # boundary conditions.\n", + " left_perm = [(i, (i + 1) % device_count) for i in range(device_count - 1)]\n", + " return lax.ppermute(x, perm=left_perm, axis_name=axis_name)\n", + "\n", + "def send_left(x, axis_name):\n", + " left_perm = [((i + 1) % device_count, i) for i in range(device_count - 1)]\n", + " return lax.ppermute(x, perm=left_perm, axis_name=axis_name)\n", + "\n", + "def axis_slice(ndim, index, axis):\n", + " slices = [slice(None)] * ndim\n", + " slices[axis] = index\n", + " return tuple(slices)\n", + "\n", + "def slice_along_axis(array, index, axis):\n", + " return array[axis_slice(array.ndim, index, axis)]\n", + "\n", + "def tree_vectorize(func):\n", + " def wrapper(x, *args, **kwargs):\n", + " return tree_util.tree_map(lambda x: func(x, *args, **kwargs), x)\n", + " return wrapper\n", + "\n", + "@tree_vectorize\n", + "def halo_exchange_padding(array, padding=1, axis=0, axis_name='x'):\n", + " if not padding > 0:\n", + " raise ValueError(f'invalid padding: {padding}')\n", + " array = np.array(array)\n", + " if array.ndim == 0:\n", + " return array\n", + " left = slice_along_axis(array, slice(None, padding), axis)\n", + " right = slice_along_axis(array, slice(-padding, None), axis)\n", + " right, left = send_left(left, axis_name), send_right(right, axis_name)\n", + " return np.concatenate([left, array, right], axis)\n", + "\n", + "@tree_vectorize\n", + "def halo_exchange_inplace(array, padding=1, axis=0, axis_name='x'):\n", + " left = slice_along_axis(array, slice(padding, 2*padding), axis)\n", + " right = slice_along_axis(array, slice(-2*padding, -padding), axis)\n", + " right, left = send_left(left, axis_name), send_right(right, axis_name)\n", + " array = jax.ops.index_update(\n", + " array, axis_slice(array.ndim, slice(None, padding), axis), left)\n", + " array = jax.ops.index_update(\n", + " array, axis_slice(array.ndim, slice(-padding, None), axis), right)\n", + " return array\n", + "\n", + "# Reshaping inputs/outputs for pmap\n", + "\n", + "def split_with_reshape(array, num_splits, *, split_axis=0, tile_id_axis=None):\n", + " if tile_id_axis is None:\n", + " tile_id_axis = split_axis\n", + " tile_size, remainder = divmod(array.shape[split_axis], num_splits)\n", + " if remainder:\n", + " raise ValueError('num_splits must equally divide the dimension size')\n", + " new_shape = list(array.shape)\n", + " new_shape[split_axis] = tile_size\n", + " new_shape.insert(split_axis, num_splits)\n", + " return np.moveaxis(np.reshape(array, new_shape), split_axis, tile_id_axis)\n", + "\n", + "def stack_with_reshape(array, *, split_axis=0, tile_id_axis=None):\n", + " if tile_id_axis is None:\n", + " tile_id_axis = split_axis\n", + " array = np.moveaxis(array, tile_id_axis, split_axis)\n", + " new_shape = array.shape[:split_axis] + (-1,) + array.shape[split_axis+2:]\n", + " return np.reshape(array, new_shape)\n", + "\n", + "def shard(func):\n", + " def wrapper(state):\n", + " sharded_state = tree_util.tree_map(\n", + " lambda x: split_with_reshape(x, device_count), state)\n", + " sharded_result = func(sharded_state)\n", + " result = tree_util.tree_map(stack_with_reshape, sharded_result)\n", + " return result\n", + " return wrapper\n", + "\n", + "# Physics\n", + "\n", + "def shift(array, offset, axis):\n", + " index = slice(offset, None) if offset >= 0 else slice(None, offset)\n", + " sliced = slice_along_axis(array, index, axis)\n", + " padding = [(0, 0)] * array.ndim\n", + " padding[axis] = (-min(offset, 0), max(offset, 0))\n", + " return np.pad(sliced, padding, mode='constant', constant_values=0)\n", + "\n", + "def laplacian(array, step=1):\n", + " left = shift(array, +1, axis=0)\n", + " right = shift(array, -1, axis=0)\n", + " up = shift(array, +1, axis=1)\n", + " down = shift(array, -1, axis=1)\n", + " convolved = (left + right + up + down - 4 * array)\n", + " if step != 1:\n", + " convolved *= (1 / step ** 2)\n", + " return convolved\n", + "\n", + "def scalar_wave_equation(u, c=1, dx=1):\n", + " return c ** 2 * laplacian(u, dx)\n", + "\n", + "@jax.jit\n", + "def leapfrog_step(state, dt=0.5, c=1):\n", + " # https://en.wikipedia.org/wiki/Leapfrog_integration\n", + " u, u_t = state\n", + " u_tt = scalar_wave_equation(u, c)\n", + " u_t = u_t + u_tt * dt\n", + " u = u + u_t * dt\n", + " return (u, u_t)\n", + "\n", + "# Time stepping\n", + "\n", + "def multi_step(state, count, dt=1/np.sqrt(2), c=1):\n", + " return lax.fori_loop(0, count, lambda i, s: leapfrog_step(s, dt, c), state)\n", + "\n", + "def multi_step_pmap(state, count, dt=1/np.sqrt(2), c=1, exchange_interval=1,\n", + " save_interval=1):\n", + "\n", + " def exchange_and_multi_step(state_padded):\n", + " c_padded = halo_exchange_padding(c, exchange_interval)\n", + " evolved = multi_step(state_padded, exchange_interval, dt, c_padded)\n", + " return halo_exchange_inplace(evolved, exchange_interval)\n", + "\n", + " @shard\n", + " @partial(jax.pmap, axis_name='x')\n", + " def simulate_until_output(state):\n", + " stop = save_interval // exchange_interval\n", + " state_padded = halo_exchange_padding(state, exchange_interval)\n", + " advanced = lax.fori_loop(\n", + " 0, stop, lambda i, s: exchange_and_multi_step(s), state_padded)\n", + " xi = exchange_interval\n", + " return tree_util.tree_map(lambda array: array[xi:-xi, ...], advanced)\n", + "\n", + " results = [state]\n", + " for _ in range(count // save_interval):\n", + " state = simulate_until_output(state)\n", + " tree_util.tree_map(lambda x: x.copy_to_host_async(), state)\n", + " results.append(state)\n", + " results = jax.device_get(results)\n", + " return tree_util.tree_multimap(lambda *xs: onp.stack([onp.array(x) for x in xs]), *results)\n", + "\n", + "multi_step_jit = jax.jit(multi_step)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_kMyXbkEeCu3", + "colab_type": "text" + }, + "source": [ + "## Initial conditions" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "usWkf2UgAYc5", + "colab_type": "code", + "colab": {} + }, + "source": [ + "x = np.linspace(0, 8, num=8*1024, endpoint=False)\n", + "y = np.linspace(0, 1, num=1*1024, endpoint=False)\n", + "x_mesh, y_mesh = np.meshgrid(x, y, indexing='ij')\n", + "\n", + "# NOTE: smooth initial conditions are important, so we aren't exciting\n", + "# arbitrarily high frequencies (that cannot be resolved)\n", + "u = skimage.filters.gaussian(\n", + " ((x_mesh - 1/3) ** 2 + (y_mesh - 1/4) ** 2) < 0.1 ** 2,\n", + " sigma=1)\n", + "\n", + "# u = np.exp(-((x_mesh - 1/3) ** 2 + (y_mesh - 1/4) ** 2) / 0.1 ** 2)\n", + "\n", + "# u = skimage.filters.gaussian(\n", + "# (x_mesh > 1/3) & (x_mesh < 1/2) & (y_mesh > 1/3) & (y_mesh < 1/2),\n", + "# sigma=5)\n", + "\n", + "v = np.zeros_like(u)\n", + "c = 1 # could also use a 2D array matching the mesh shape" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "jWtIvDTfCx12", + "colab_type": "code", + "colab": {} + }, + "source": [ + "u.shape" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RVdPIRKmeNX3", + "colab_type": "text" + }, + "source": [ + "## Test scaling from 1 to 8 chips" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SPG6jvYSCaKQ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%%time\n", + "# single TPU chip\n", + "u_final, _ = multi_step_jit((u, v), count=2**13, c=c, dt=0.5)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "MpsDzNyC6OI0", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%%time\n", + "# 8x TPU chips, 4x more steps in roughly half the time!\n", + "u_final, _ = multi_step_pmap(\n", + " (u, v), count=2**15, c=c, dt=0.5, exchange_interval=4, save_interval=2**15)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "fPCwJ51FeBLR", + "colab_type": "code", + "colab": {} + }, + "source": [ + "18.3 / (10.3 / 4) # near linear scaling (8x would be perfect)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jYMn69z8eQ7O", + "colab_type": "text" + }, + "source": [ + "## Save a bunch of outputs for a movie" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Uns4X34EPYgF", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%%time\n", + "# save more outputs for a movie -- this is slow!\n", + "u_final, _ = multi_step_pmap(\n", + " (u, v), count=2**15, c=c, dt=0.2, exchange_interval=4, save_interval=2**10)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Hsjuk22Nbe9Z", + "colab_type": "code", + "colab": {} + }, + "source": [ + "u_final.shape" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "LXqmz-CCdQjt", + "colab_type": "code", + "colab": {} + }, + "source": [ + "u_final.nbytes / 1e9" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "cPvXrPUCPPtt", + "colab_type": "code", + "colab": {} + }, + "source": [ + "plt.figure(figsize=(18, 6))\n", + "plt.axis('off')\n", + "plt.imshow(u_final[-1].T, cmap='RdBu');" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "uqxGmttmgSsN", + "colab_type": "code", + "colab": {} + }, + "source": [ + "fig, axes = plt.subplots(9, 1, figsize=(14, 14))\n", + "[ax.axis('off') for ax in axes]\n", + "axes[0].imshow(u_final[0].T, cmap='RdBu', aspect='equal', vmin=-1, vmax=1)\n", + "for i in range(8):\n", + " axes[i+1].imshow(u_final[4*i+1].T / abs(u_final[4*i+1]).max(), cmap='RdBu', aspect='equal', vmin=-1, vmax=1)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "hNZrt590p6zr", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import matplotlib.cm\n", + "import matplotlib.colors\n", + "from PIL import Image\n", + "\n", + "def make_images(data, cmap='RdBu', vmax=None):\n", + " images = []\n", + " for frame in data:\n", + " if vmax is None:\n", + " this_vmax = onp.max(abs(frame))\n", + " else:\n", + " this_vmax = vmax\n", + " norm = matplotlib.colors.Normalize(vmin=-this_vmax, vmax=this_vmax)\n", + " mappable = matplotlib.cm.ScalarMappable(norm=norm, cmap=cmap)\n", + " rgba = mappable.to_rgba(frame, bytes=True)\n", + " image = Image.fromarray(rgba, mode='RGBA')\n", + " images.append(image)\n", + " return images\n", + "\n", + "def save_movie(images, path, duration=100, loop=0, **kwargs):\n", + " images[0].save(path, save_all=True, append_images=images[1:],\n", + " duration=duration, loop=loop, **kwargs)\n", + "\n", + "images = make_images(u_final[::, ::8, ::8].transpose(0, 2, 1))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ZWEZWehFjboa", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Show Movie\n", + "proglog.default_bar_logger = partial(proglog.default_bar_logger, None)\n", + "ImageSequenceClip([onp.array(im) for im in images], fps=25).ipython_display()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "whG0OOepezuX", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Save GIF.\n", + "save_movie(images,'wave_movie.gif', duration=[2000]+[200]*(len(images)-2)+[2000])\n", + "# The movie sometimes takes a second before showing up in the file system.\n", + "import time; time.sleep(1)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "E1V7aS63vRAT", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Download animation.\n", + "from google.colab import files\n", + "files.download('wave_movie.gif')" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/cloud_tpu_colabs/images/lorentz.png b/cloud_tpu_colabs/images/lorentz.png new file mode 100644 index 0000000000000000000000000000000000000000..66059c0b5deab231948c70d61d4a82575cfa7079 GIT binary patch literal 574004 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%0A0b>$e$|`9}Dg@4a(Fv0virj z=S-gy)_nO@eM{7^VNMLGW^k3}HE!Cqk(adz44kfnTQ2Z$dTP^pSN6H=Ql?>NLQGWG zSHOi#y1GVoJYt;fr|H!4C%+Tf9k}8qBB=xr;sd=ATJQu~>PUz^=^pUb9Db6S=nZko zc)n5kw(yJ%*;=F}k1mqwPP@D1`UWVOTYb^%FOUxDT?vC1*%pM)J@q~AVM&|I)gQN_ z2L75t^~e-`zM~B1-WnhH@UdF4)-j9?9%!qTfMmK|ThMQLr(jiJ>U8xzkp zVAaMJasSUhn`xabGL&lGy@_-UWm(*(&>o?=4*WVdN47%nqWiBX7&w!Zcs4H_Ah_Q^ z>S-urQwhNPL?!!G<{G9u*gM`-HtV;1+7B}Xv-*G7xF!d8hOt%#JawgBzia!MYlo_C zF9b(AL(jAFzg5yMZ0V>3r)|rTeSTeHgCpRrJw#b>DqSi;G9n7FB-?Xn10-bwhRg zC^6S9Gc23!U#dgOh`w9#vxRH_w2z{n*lY=T`#~r_FWp@lMs5W1v zzmc3LpOL5E3N?RWwo--Jzux5v`Y{veHxs)&ZW+0if(dnPo2#_vOp!%;Mh-YzsSV0) zP%0)9ADJ#*TDE8_}o+KTUHGPuc**yvu}k zOAH0MV2OYSO5Im!=iqw>t9p<`$U@y+s{;Ck0X@HMeu3@~gNC}8vQT;5X^Ab-X*gPe z(FyXhMh!hnw}eoFfThzC=W8{VSm!p%$?0qdKfZhaiJtjdW^LGuUrS5eU1vcCUTnIw z-qK8=jDv9bfB(q8_lnE8@&s)6&PS=ERaJ!?ten2PVA`kR#$kmJ6&1zR)((#^frw(3 z&xc7-L#{3Se)~Z7YyWk+uPR&{W3J79C<(2?w><35INr^dsjJMi%>bN8b1ze1yybjR zo<6u z7%0+X{e$I0w;WnnrxAQKuzVzA{{%`=9h$l(c3gDBnvxb8#qqbJKx z;jkVPCbO~eAQC{((3l&Y#41wKkqk=6t|XcV?a0tH3I&$W)@Ip~LFs*k*IEIiJTZZU zGfVV{G35{p%=k)aT7fHvQtbvt6qa-7U)b zUF)rw!Fx&JVClU1U@HbtU#$m9$((u|cx+PC#l_;*b5bBsswOI84?~XYaWInPN{Hc9 z(_$0NRcrx`qEzj_4&n?e)UJ0S3&3bRPVUhz#)fAz;_zzkTY67ynaKVSSJK_qZD~O{ ziQyNlA-S3GM|O#X+U5^rQIS|gtl&&i+5KDE~k^@T|ZnM&$%2w?8B?Kt{e zHN?HsVTvnxZTK4j5HNSl)mb~T2uiKH7kbg3HH>9b;roVyh)+#Y8629o_i~;d?zJcWFdur_}i`Q2j%={vl`g}IULp&pe!;{S#amGt2 z=VRk4;$}9+cqu9c7nr}tqp2u|maB|3iQx7+?i=2S=cJw-$UcZ`+d$H11y61R6&NaYnhda^nqIx&f zaMYXY;R@1|cMVniYD=3;7|X74F_F!S8?Hr0&oifb8Rzc_gD>2T8p2&R@(rw)z)@(S zd>9(@zoztX8`z74nIGVzN8G`|WubTXYkU(gjHqCBuln5P&d;_MoxZZj7%$~ocO7yv z$<}liD16Ur|o%x$kcdatntGfhrtmoSH0vsNi4+s8)X z959c7A7c`VE&o4v{I6*)?ihzc<4`Xn;zbk)s~+sZRq|jX+(>>bE)4ev1p_prhwYJI z7!1{+@HDVN87cnGQ_lG}kuq@B60t7|UQ1o!UKmplUso7(B-8js>a&54pp@BF9ZUt)bCQT*Q}e7=HfRN^Xq2zOza?@u>^~tqsLL4)_k$ zLCU21txe$bDNIQsDtmP`=u)1hv#;Ym(y=Q7>O#D*a({IKNavWM)MagE8qa3fJ%(eq zVHfIQRr28G>UO=;6W_KNXx1nCM1bpyftAkD=l0)yhB=)`?R_EMiDT>BT6svJYvPiQ z1kEgv*V_%fY{Xg@Bn9A`sS!`lBr4>|MgTh@udb9tM!y{?qn% zDI*u=IdaKi!d1~9)t8Bj)fGyhnw`AzI~(*ykxdz8Wj)oCNGhp_%V1&osV+jl>_D8% zK{U^+6jrUo?3z!s|CaPA=axHQ5eQRYP%no8U^ma4H>6X&psIQi@hKvn75{HTUBW@K z1U1yi#bR9O6?ekL7b21(1dZyF{Y;9E_O${#c_MZVg&Z0pb?Ufg%>dO*4NM*@@&q08 z!1a*?QVCM&$Ht?)Ya+)?Q^&4LE|XT-AqvPWx*ysPL&>_)y@rFHPIM)qUG=p+099B5 zGLc2`tx5g}Ohr0g8IFtYaAxGkN%T2tS#K1h>af-FH5n{yM7JJ%pfJ6%B zvGt*N3C~njr~xw?anGcQp9`Zx2}TmI6Ew3cCLVga84(!rj1CB51{dX6ZA393hTxH# z0h!)1ornQ{MbB5tl2jfFEev?HAxN~LR2aTblZD{3c#wroY z&`4iT3ZAP@`^K$bCglIR=dkwKb2s%5%4_S5b*_c5^w#7Cq%zNZUM$~*t4qGBZEv}{ zvX57u8<`(i-&j0EJ3$gRJz=;qX-WD`fJ-M@=8lJ3t)?T7m~P;3tlEE>8Y3{}re{ZO zL)RUerzg0_(%3I6GuBE_=CW1qXQwe%35O3lP{T3fNiS0Wc9o38*i{iORydXoeQ~GX z`^72=8e@?jbPpvPGG%CaZQ(;XxnCMmeaGdVlV-&R=UkcB|F`9QYu*S^2+wOMTM(L? z7Ix6-1K}f^e9d_h|7=#eM(s*pMwU5{d!n3Syhx2Qj8f&^`yp^`qBkLbj3&DN1W>2mO*y6E7Zjc? zLtKS$Z{WPf7F))wJQw{E^&kF&nDN(Y@yU|X1K_>c>IMfN4CBUxXw-0VpPQggOOF>h z)7f*)Wty}`A1=sZO5Ap>Rr+PE!UEN!n+ttTHh^_efi`KZSsZ&P|5 z1J%w=>GFa{)tJ7i2`uysNIx&R_Qsu~@;^8U)Ku*_yx7#x^ijhG+a8~!q8i6`m7oM+ zQIT%}NL~4K#$SBEfc0ksrjUFrc$4E*6ei>}9}7MYKbVtGdi~^h`pn%8xt1Na-^G^j zE@?B*vp!87`YwF$o@pmNK@ehW>zl7B;~9$`FW4MWd-^A>ZCXar#e!s~n`mI`Fec-* zpd)HPg=Gv9UMVfP5o3jE+}y#SoxtICm3=plIh;~E8kT&Gxl~!$ zn|i_1IaSxNUU1s8L;CU^QMSf78 za#4%o?FY_^md9P;JriL~t*~fT zKCrSRK~o6NzXI-XrA)rFvUfa!-f(J|{(9Z++Gvq@@(Z=a`=T#86e7R-k{V!NX(3K! zI!D}#(WtaA9C)$JviF@pGz{Rtmm&1S*_E))iU~YxuDZ#Isaj$*tY(A7-4=9lA*0uX z&CVbiCd+F;o^3mir=>x3;yf%p!x>%FXUeB^@FO>ng@Z3<*QR}HqX>w*NDnj$1jj@; zK)!8d$TPS6UEsH;Psc~HG4Ki`onz3~u4)VTC>hHI;NBY{)o0Ekw&25EGkwenb6~x>#@Q4V;fW>c{-f4hZR2Gr3>S+5SU0iMw)2;;nO{ZXa!~Nxb z{4>^X`6%v@yBADN+4p6+P}}@!wD4t1HkwHET%{!*V`- z>V)rK)dR0zF=s9d8(la9+04seUDrm99F~}ZOum=a*uV2CrSry%dKDJ3UShyz4dgN1 z!6P`HY-G1^0_)?-1ZkJhnG{;?kG%@u1+8HPOUX_dX-=0IvbBPbQ?|pcxPoM(*Hr3o z2^Y~9x=>=+uKMfeqaiqP_o12O-fz#59?+i_Y2T+=65K=rlXOCGF4bOK18+s8ef+Bw z1B=&SC(dwfTe|87-6pM$s9$czgZH&T5IZ#BO6xumgOiuT==F%;F9Qgmoa%7|_Thei zgqk3|4dPY)MFlh{kM2(RYfH&hl90C8px-V>gUO4t3u9S|x(*dVH^dI3vs-zwE7Y>& zZ@V>Dquz!zxLZm8s63+x1lyEAmzp(RIZ_GoisW;J!>V(TlsLCldqR*gL6{rbvne5n zT-23HQtj)5km~(@8FLjx(3q8NTtSo$%VZCCrdt*?XJmEEV(|+(HL7J2}NRet(r!>Go~~dbS_&I z5PfVwQ+FKLb|fvuJ0sj0l4Zt&Pu)jT!mW}t)KMo{vg2~}K_UhMoB^qXCg0-d_#>8 zom>QLljFQ2|T8{XM?!jLjzlXV-(50F1{Dd(QcZSSk!L7j8>0{%zA z%pMT?U+T}pEXU%NZ%zMN{LiS*^J5@{^#~1K^>GY-P^Epz1K;t2jZ~@c8d(|VOB3`% zxlh-*13y+a!#qELlGJWxyr`c?KyC*FS=OgnVSGyC7<6N5L8F05QgMV}G6y<_-WFZy z4W_&Q(na!w3Pn|N*~l2ZT21u|7{=e4>#*Sd<4dD58_ITFkT!*NqAK1lR40-h|KzCAeqnCrIo;;m{T5>JLI&)i8{e|J5( zh8ZRp^!=hnIAKz0f3|Nx!;2rG-xs^dei<~rE({3V9TiPqM~bf@r%A_9pNfT?im$eQ z{llC=*jT~t(uc1Ai?0VaMD6xlL#3HSMXafH3dxjE8@ABKUhS!-T;EE( zNLb(XWsc%lUdWl-3iXhF8MH!YbzPZlq{~F6*UCOCTuO75=Xpe7aPR4eo+8r??Pq2Z zAo&WE|85ursWDsQYcgXdVagr1{D|>(UW+o&fJ65W3CV%(}9i}p7htaMf0^aNpCHB3ZNPqPY z!l{Qbl1T_ZzX&fc5s(`fu>C9O6hW^!hIF!{&$C5$jBh2S{>`x(I!@z1=!EXknd+a6 zsxfmVj&fjsS{Zy!<$`i~s4Yevv~RGPvErxbe^%~pYs6CXW_zs$KW_fFFgU>h;LNdL z(=Nzvpv=svY-8d773hC}{<#+oVM9wbu+ag<$s$Ctr0}h1WbuU*v`^$i#UmUFo1ylv{Sc}Pr2@9+I>);`f8UZ(zC4 z^ryPlQ7-&v4+H=$`3zZaiSk-!Mv$o3ac^ZKgzhP?nA}xOhUkz3r?H>B=>IX++IOF= z_ujggqPK99;)=_ia3Pdpw8VQWz}rESUyNSMNuFtRQ>$zEuOZog@*D;FUS&U>>VV}( zFajXBViQm1)QzYjg9$@~`~fRcG9^rw3p&D1P5@|)#tRbEAIX%`j^k`Kc8y?aP!Js* z6I&WYl>#Te0TDdERDS?JoyCCxvuhfWq(pFD!xcz~v$is`Itx)IX5v`=^t18Sk9?Fu z0m#}Fi~XaoBF|p_;7*+q&@F!h^V0*2B~+1u6f{OI2ZF<(-TS4?RP)Sg@J@yMHngFm6<`ogOu!x6N!kS3_l0MYjk9Pb_Wzj2T2iJqSV zggKcL121q_U(VU$E0TlJ@!e>SbxScft@#qfbEl=9EJs0BG5hAT>3@^6s2j?G{mIs^}({GB0@y#BuyU|Y*-TvK$mjNEJl1ff+g z*vSwxLj)ZWm62(CY*#vl-=>*#gDdsVp*&AU@G&BS{NRkODWNVPL+Zmiot--wp4W9K zO=)Ox=!ki~Kj*kM6b+bS`v(YsrDj%Tc5U6*zs1k=VaG$>;!dam5lDqyB<$13ioZlstwu2q|NagvdW4g-~ z$Q$_E5E5lm5sk{#u{$&q`kg-3@goO) z@5-^xF8KV!!y-cXGj`DN=F5Wf8!09(dn#!;+^bcrZxs_u)Z1pzL0U=~57}*kH$ZP6 z3wez`bJ2iS39Or+i4#KD|LX?j-a7#rf0DA##6#=2Rf^z#OL;LeWWICH@cQ38)9P9( zsd+dGUwZiEWtiIuP-yquy^Jye7y1#Q&n)~}AJE>ARD@}kp>hw3^3-OY%x?=$N!hMTULZPsM_Oxka^<_uzys%z>2EyGaeBQfb_u*%ffYDOm}SBMYEGsBtPcg*LVZSpoDz)j;@ zYlUT#7#|slq1eRRSd9%65y2}95i0V+Y_yAK5yJ>5c^)JNE)QXh(`q^X-=3i$VegqV z+oDn@@i3oZN-eseC|!fXp@%>2RSC2mU(Twam?p$jzO`Y{gaY6M-)k=*oe%G%*s6|a z!GhsvF5;^nSZrut`=a9Ye_9D#W8VYCkQpry@5#RQQtwG%LhYRM!SlBxjiB>cBaj+A zw=$b2!B2uZOwy*~e#t-c@+=Z!yQ?z`xx5%Sz91wRd&IJ)L!+CaH#EpYaxTMFlz?Rs zAsR;@H!4n;l@j}faWR{!nfSJTMc+00Im~H;ML##5AGN=p>ZY+WKlrg^*<*No8M~w9 zIb-oTl1}ggk;^=NV)2$c@m<#pH8|4IB8%|D2MQ=p-%xs@Zwmq+gj)Bxf5y6ieq}N_ z&SDCKRI|Y1>fQu2y|*X$rPnyu)}~k+*gW7^JaS}lTu$HXOQgy28hID)2v-4q?20qp zIFy9Y)@>PqxzzErwDsnN`BY+kpLAoN31^b};k4kkph&!8BAteLW_z${fpzPEeF+=p zh>eZ>#U}2vBUv;XG4h(@Nnq^+W216Ry<3RIf#N4%n2*s^Ac=@$8`ulDOwQ+-K=kFw z!a;*40C#4LE!FF}5d>m3V|_E!q4JWu6N5=tc$vZhmpnn`XAVcT&RR@_sc5%_p-)}( z2AzU$J~%v77RACulU)Nz=R8)m%vu zTL8@6gxjWLCg3eXZlodCJ&h*8x_?#l8wF)K%}!BMp+N0#{wxt8F;pIc5s60smZXf2 z46J}l9AU}aln$BZJ1wG z^$OzxHJ;6Ck>z7+2uoud*R=6WIhR@O$|K|8FhH;U-w_w77ZO>Vu`H|F)Ds`A zX?!TL(gG9iK5e>HN1u&RRyIZcvH6Ik}G0=7Z4N6GWNHBMaVC zhTpNjc>&{jm%6(XLweo~eI0IEbk!NSNmEqYazL0*Yk0D0;Pnr(NT3JA%K_qzC~+uA zV&*GDcH#7HQ8fwcc=GzzTvk&=K^Pap` z`o(V)#mZUH7(e3>1kW;!FUn@%kP*rq@T@b zys3GP4(;%NdkFiB0#-a`eMMJ5i<@JH=lc#(j7BhCFShrBy=T3;yc$lg|jh%px%F?W?yPVeei6y}ic=QYPPosYot5 z&g2YH_0J&Z-CM9xN%fB~08%%ym|{*a-XyHs!c1L~0|=1mYZGY9GaT^^E%5J+ z{?&{%x!t8OdmKt}D$Q$r{=XTf$e5(6(_YEhJj0bNj? z(3HB925dzSLW7O=Lpc1Y^Hb3%^Z3ywv~njL)u;|Jghh;1hV}^TTH$3}HqSB}ESaI44XKg{Xul zt&8n!U)Vi_i|aWj#wHU!0BO@2Cl{6(GdBh6LgojE$)2@N;N_LT)m&SLyDgwvCiJcK zK*4|s%Xy0KGzpeFk<8ZM$YCQQ#%*m$=zbPFPm(v-z*u}=JLcA<1OBI+$HN+TBdD7RJ8;fn>3U22>Uc2QxkjLGJR63SWQ z0f>kIx=W8#9Og75gt7-pgI@mt+#xiDqGqe&B4Zj_sxZ7T=Df|qN<@wBgkx4^DUoHy z3d7_D4NPM9!t7_Krgi_q7MXQwmUT{BY@|d`c=UDJ_zz8H%|uP_u?AdEAfDcJ=m*$7bY}Rb4A6Cp=tu zUW&rM*i%T+3!Ri4zl+Ehj=N>SU-#qDJGh#|roPHqAt8c6XG?iVNte|-1}ZHa(S;Fy zNr)1!3AwWjw`tSKQ4rNQ!3(;;3AShiGTN4sdJIrou;~u{Jp5(FhvH{Vi`&vcpqXrK zt5hLIslNjRw|-8dkY&1N)Nx3NTwR+rVyos(Yg7DjRZ2p8Z zg9p}NPsjGz(vUUu-?wMVfz846U2Gjh&1U0Qz=)7;TWZbS63jLo`s@{ow_=>>Z>AMsh#zQarVULhYC9IA2C zN4IO2(|SYY1vJax%_O^*kQEjxo2R=|eNj{ymd#Q2Sg{}R_;+;`#(t^2R=MS2h28qc zugVD?zP*#C6SqyO^+e0*9E7UUo*?dQAXI9)1L|&R_vg~eO3#cR+05ORCjKQ8CXca1 z8d-Q#rk%iluDYYr;s$rMveVJ4^n(^k0d;ox6PZvOyYwJ>Xj<8)4L(V7coWjJEjC=v z6-3^J`L`8~KzSLpqU6K!?4u%%iYVwEgUw==xG;>1$XTiW$RG+@?Oonyrx?msu3+83 zpFw@gKhqmACjrtC_6ZP2$dKFK32wce-IZ3-JlXAH=M%uf3BTh6?+ zV#c#Sug^p$(s{Wv1ZA84cK^=#ZOcykS8dzDrQ2gTG0eQyoW^A8#^+ z;151RKObuV3TNzWTj`vOE^;(;V3G4Q*Mw%*5eE8m67Oo!m3aFR?sYMUA+#7~Bi|l|JvGjmLZhJ}QdSV6PS|U0|X~tgNSCL0+L=0aXY$GQ= zu{9QUWACBdLYirvMf>Iu1cLQiaPJd#lYzcBh5XSi~!6Kf=J-o;@#Z zmEavr%*{!7%@z8sg*ETK<*2cPDK+8QK!JHx&0rNbT7=P?P%U_KyV5bDLeCdFnHDE` zz6w(ZCYWBhxYjrxV;Hl*APK?;4O+4L1Dv+NP25Fwcmb?Agf{8oNNEmGno1=W(TdWP zyAL>7VA~Ywju{`byp9c(WVe@kQdCBiIIO9ZWuNo@u1Lx)0&Rn>m-MfJtgvXzJH4q& zK^?~GdMPp{w@5b0P^J7|KlGai{E?y0Amf3WH<%WSF_UjtTpj7*Dfat-9^(oIp6kgU zObTo_n^D`}Yt8*wF%_G38>#_E1;3Ur*o$s!#kM$P8uGb>i;<2Y&yiLMC>_Z(24m;X zMzU68)0L&2J~S3~W1dxb5;7!?Iqf^LpM!svGmjbaFbnENts&JTWaPVOgP?$aN|ts9it z^3SF7@m3>vcSoRYW}oqCedMszoSHpRoH3D%;~*bWe%wnwtF+0wV7;^7>F0<;D}nrJ z2aL;;X*FPNKW}}#{as`s*&j)|Nk7=PHz0>~3JPd3EepXbrNH{b))+SCa%_5cYf0Vm zz76=t5g`*_Eu4SVtvJ}O*!PZS1|Ygl_RQ_>uub(;DiOPM0lkEP8=`_1;YLjr7E+|b<$SdRR#E^Gaz!m& zshQtk$^VL5k@)UGIRh(Z3gWcySC5LppR!Wv3w56WaKl6cgmnlgQbJd%Lws(+b6Ft< zL0dTt$peL@W)thjB(MtwS!M-BEeX?CRHvSbLypntWmUDnbJJENt1i2N{Q~ap#Gt%Z z9f?;`A^k%R_z&urpK=gt@bY9Wk37CU&K-$ov4H4NUCR0N>{6(Dk0%iFN|!eLgl=!< zct+Z#KmV9aOqAIvm?Y4Kl!=;z$Dve*re6=X1RRli9vE7&?++q&$!}mpYiMEI z?aHc7XmaL~&X0PwrI=;Sk8?e208;<1NNoN+0rwyObO?(-`(YPT!IH_Lm_F0F6=pLQ zv!|kn2FB{OvBup4)_`mRqESvk--c!P>q~- zC}571gFZlL6|BL*Ot{B#;ypGcML|&W!@(pI=Rtl4a|Q}Ne?LNLXZp9HMHq8gEF*ft zN^MDBXlR=?8AAkX9dmu&g|Jfo<)2nv;CV*TT5?M?Qg=W(5p<|02g7q`YWvBx4n9Um zj|u&?TaDuMPr@8{-5Bm7oM=-gCB#l80Xe+HqR~Gt70mhOy}6oRFCIz$u-Z>7i3d_}qXE zNILt3LMk(`^I~Lx9qty_7k zXPb!yvtyHgV}c?2I$<0gPja-aQfii<-i7C&H`#cR5o;GSIJyIQ@5&j=1`U&>;1n#! zfM#1iflpuUepP9bp(M2`sM&;A-iU`6vib+7uCmR&`6A1=awI7mm%3kD_8i=^LU;g%NUgPV@^Mc6%^seR(QZ z?ZE~?=c=MRUTDIS6k;Ly(nBS${lz#T21K{*T~LoPQZ3J+bDC!5h|i=jFSMrO3h_A? z#2@~0qx!&&U3`OPfuO}c=JGPoa^4PxenQgIM*ekgWz76K;XWv~&vkk%F1p`p8u&3U zuHRRhJ~y^Uv>W<`3^wVYOTkKI>b${e*7mo5>*DmBM(+KM!k`8N zf$RAvc&1j{k|zo(ON;(cgL&rw1|kJ`J={N#RyS|@6SG?sUEM!TLMgZiOJy=VtuyigQu1+ObzH^hSpv zWCy2<`=UStoNvikgN!-&%slZ{+=*oZ==5+X!Vb*dkgGHJnz=3`UVG4~B?J^{sZ+!w zxtl~m0i+l2{vdgE?A`H$C1!q$=-dUSLtA2oY*TpUR-BQP|KXxL#ugixU|G==!2(Yq z!Xx-$w9v{9)Bs^4az&Hz+n6_9dNfC6jKoXQS?>&7f4=#-dhYQhygjuHePq0;0<2Yl zg68(}h#3r(>Y-GO5SxO^7FePwlnQu-KGH_YePB|Jbe(&A41 zsKkZ=1VhYa<@w5Y9MRIAtei>vw=}EkkM4i?1G`3^2>>H^@T1!t`5ZB;I|nTp{oTk& zP=bEnunJKZqT zigb$MlC7g7pXCW5rxBI9NF04Op-nyL53Hrr zXZ-WT)vOWo^2X5d6PQZ622cfIZYRKgJ*Q#+jDn)fNmCv^2*rG6+NAXg7OTore(BJX zh`p~YytIS*W)>r+{TsPs*C#MDX`=0b#Yzbn)^86KGT1RMVQE&cFYUiMQ=W)(S5mVX zj+=zCXc!z?;u{Ba9&thni*GYp;2fS`v2I81Ufjf`n?|4dm)+(r%IZ5`KOO2$^oicX z+XmQ+-Z$MZJK7cj0zzRV0ulsEK!hX+LV)-5WLW=2GG2F&IVI6bzkKUc2#1cFm^J2} zXj*^wrhLt4o#>3eNS$QcuX~I8yzL-<;XBHI;Ix-1FyWc{OHy{_JS!kn+dNeZE$w(IX|DkQ$_t~zcP7X z#w^D+x3}$qK2`b;(d3!BxIPxYb;saSc&}?hJhWbz?4&?N->%NF?NfvlC#~6%1nK1s zfK#`EyZ1kx>Va=O?O%%z({Lcjbk1ZaGi~pxD*lRQ)GkovrAouuo8aZ&V3jQq&a)|| zDqo_o@Dwyk&zt%#*BY~8JqW^Mb`Zj2WVGArx*3dBZ?Qmq|FiAMh_aIr{%u5aV6M?r z8Y|N+Z!1tC;LQ=zjN#qmdo_}Kx^a1fC+=Xu$ClSD(0jo*k-#l+$re$dSmwF1oS+Dw z+20uixf9Fbx+X3XW!FAk7qOHN*I1M!X{H{Sh(fyT&N|rs#6yXW`f6`Ewugx6k-HV+ zV!;-vc(u007wR}m?YX>)Ich39XXi5_pB8wEog7-Dj>>kGea2Uxot9BluGJW~ZLQix z!_rtRN0>|g!no+nv+5UEIXS-;T_L-Yh~72hw5Qj@DxB*Nn+}6DY*vu$@0=4&p}q8X zrm%{N#C?up0!FHp6tY@UD>lg1cHtwo_@n9ICg{T zr3AxST)&bBb~ozo*Y42#F0(@~|Md-_Ub`qv3%0ft(V!|1?;Da7h6otU>W{B;;VxXb z*rAXUx|BzuT*kf9AOR=n?{{h9^58~`xzxF8$lHk=g;GD>&5Eo~ErFMGt4oFF0IyF( z(jju%=x7HzT+{iIp&+=gKvl@m1{a$YPO@lpNE1L}w18g@3f#X8w$B`5*#Raw%T!5& zI!PTJ;?QlUKkB(A0_Npp*K>2nMOL{q!jY_v{SO|WoAX8{(&T!*!9kY}G?0zo{;vL@ zf>(;)*;cRTWr6}SDRBOyo>#zR6!xt;&^>&6!B=d^6VsgfkrTDLY`!plq*PIPB3SI@ zv%zv#HT=k=6WBYbJg1)h#>eW)@Y>>_AJIo-ElB;FA;NiuA^y~6w#G=-ht=&9z!Up( zO9ot_XPb>PDUitc^E3|gI8U(aGi}rx$DkJ{ws4y9VhP8&5eCUll)oTSuV#M<+*j*} zRh{}|aNSQ}QiHcH7_zX4MH0YBw+9I^6G%X`bStDrr2uC$RItPZjp~vZNTdr;>?h9U?<-pTwk*JA=f1VbI$1IJ~j_XM-)<`Hrll zn!WSF#ff?^1x4PM9PGVPr+T`I0s*R`BG5<|OVG{KBz4k5>N*+Qq#Ddw3Kr_p6nz4= zmln-c<>>HK23P`pas@}4mG+OBlsQ_kHK(4z28!r>YP6qkgI&Yks#SP&Stl!X6+Lmw zsz>bd`6N#rnT!MU0dgF;P1R0F`SYOX);X~lSJ<6URmn_^R<3Q=|FHl~Hj{qC7^?_) zEcgOinxxBhIDM-lk>zm89!i5L1S+M=U(J|bkS#(M3ncuYL3o%_(jl@m681LP$5deN7 zK6V=5B_pPmZI{KR!AXXOgCsx|^;L$>c4RLFVlJmDU5vbZI;`OztT<{!^Yx)GDraDn z=Z~977Y9ncy7AYBg)w!XX}c|J$^^S%w>+oaS(dT8JR+1|xnmSGf<)PiFLb!034cMI zGN}bh@wRqXDe}A#gcI$Ku#{$rQ*tBMgnR6Xn(A<>#wjsepoK=MV`hbt%+b;$)?NQ{ z>|QU!8T*J7XnO**rwgyZ4tsp$#utrrE|h>{XZp5-%I5w3?z(|@gqK-CW46iNs zi4XIR{WWKITwK2s(Yb(6)?G7SMG9rwLfSPfpjt*pPDzvVdq*`Q|&-3M2M zduR+b>P-FTzG{1(@9IfU=T!`>yF*asyLri6;vRjb(;pCdq_8Un+Gq#(0o_%Gq>nf@z=f~I)iB;xXK;L z1qat-N|$DA|E>?+vwe?d`_3ykRu_z~jmNu&;j*W##D(gbczh0rQ)n=*^hMWNY_lya zlsuALy{5Dv62G6c^-MaPc%~C)kyD8wQ!#eGAw#sJdi-aW(R+UBeMVRTF8ZzAj4PwW zo063{t~O(JT{2$7T)?eU?)@Zf_`vU*?4fLH^yfx-sWt30Ph*k|ixd>Z46cxlukuuC z-E79sq|Eu>XrV>C%BO*H&?BJ za|(=*6M20;VwyQR+8N%!-VY_uCK(Y~R+3NRA`=Pfjy2phY2(>)^ZHZJ2sqd>h%BEG%lJyC=DUh|F$C003BXsc92 zIg_!h6P2^@Q#Kvvh&bz_hpJETcMqq>Mw(NF$K;1Mcdr@PXq4O6H6~4U$zJyJY>NnO zZPIAS{x0(R59(C%jElqSt(^0-{Pc%?zdrC7zraWz{QS<6y8L0-rA2A`GO)qJrW2A> z3gnL5E2qnkfm|6b-J{-P*3t&!v>aN<#n?O_$wdJsGZr~fx5p?=-tJi0OY`pDu}UD$ zQ*17=v&X$7Q)3J)oNe_S`b0GB1S!)lBDOQ{YHVk{i5{FW+gm=Qi@>e>sPc9uaNZiB z`hyt70s;5mIbq(o*_|9<$N617rf`8bu;rK4#q5;!szFePx74RhYYm zeggzV7AzBIXE)a6Bs|N>4Y^XiS^V9=yCq}gBN6rC9z0Bz-lPC89fUF|`T&x}Wj7l1 zs1;#TQr<3@X2& zfW;MLk+oZ6Y?2`7RErIa%nAk`;t=exKygkv41?KTa3v~grUysmCHVv4RUxDyDd5>O zQxuF8^(nTpT06Z&W17OAqF6w>yfHj%nZ*#|9R5T5=)Em}RYYqC4qg*pKI3MCQX96) zSRw9_Zh8NP(IM_K5qp6>9HcUn`yme!wIO;vk!$hr4DEf2oL8!BSuusHej9F$(G?vH zGPi4FCh_Lum#8AS+T-R21wniahSk$NagpCANnG$oQo$^ByZ)K2YB9*(#3Ad|lWf?L z&~3>zrLUo=sQ*{CVP(d{S|)`gu}Ud~VU(Y$|oD5Dk3UwpN5o-BhUW;Kth zLf3@QtX2Fw2%&b%d?m#|$xH5^!#5R(SWoeY4FsHhy?AF6$Wtq}NYA~&c&}MCtV~hQOXALEQ$d@!W-Suky?L z+Ng+-JY^d}iOTE%fI)%R1F$umN&0n%E=6x!t0=e5*LYH7u*M#3?$MiweM|qCgzB#R z(8kBSC}vp?L>syBMr-pmx3Q|~K8SmKNAp)Oarms{ z1_{@F+Ded`ie5ST@ImAGmD$0cus$-K$G*M0Wx^z9<#*oJ(%sVy;`et(`qnVoRfu zc#wCqrJdG?&2ek-`RIkkE(PSyc4Tdf{)6tjShVA&fc|i>9awQ17U!2DxZ0q#vw;wy zm}arF0T-RDNwHEy6vXx`SuG_*=8iam3E(MMoRBU4IAAS)!4q#|qYU5UBY-Tnn>sXY zh2|$2`%LZt0ra?)PHx2d9wK)cG_70kr9X@I76qC8p?#gdxU4X+Tr)YQ5#PD#isPE- zzw-PZdcV8h{ZV6v-?wJiS|GhDwVla!(w^}E+Y@_-mV17`EN)k9x1mf;r8`ZSFs!Ya zQGlVQmfN~0P$P7Rg!z21CaTN;l?gbxFx9a>m!Gf-jLnqB{5|@3u5!klY0e=Z_)6QF zaVQB9#c*osl=xdqFz$u2*s18qfi%Cl_hmj6*CKNNBuqgo=y9Lv%E;E7TlY&I{Z~yY zt>(Oo%c=s=5kL_H0n}~`gcag0$v<0Df#t2kFGG*)iP;D%jP0P`Ny$8R>!5_}abU8E zbGRNc%LBE5dwgMfP6sZp?c*n7B*3_Ed|c*QC?nJ8cijc2>Qds$RKY^KsGuatTZb~= z&9+~UL)de!%9OM$XL8$m5r@8TIv-SwUjoX((zOcZ$~cV~zV$et;uIDQe}yG&eY;?* z(tk)+M<{)L1pJh|QUkq_zn0vhE&6Op&SmE}i4y|Uz_mpi10_$$)^-NZ)&6V$tM|r@ z0K#rovZ|V?Gy80=Kp0Cs6i=P<&#Z)?MkgT1A|z$t^}@eapdfyy>bCiD zoTztbX_u?U>-Xx!Gth0tE>mV(q-d(_LePjWGiP4j@Q^xn#5|6OE%u1YO^J@(J?1*7 z_(SJ5B+(`udDE^0UJJ$m481=~idd+~Ff;ESQ$Xv=kjrIwR*FPS6nzDQlnLyqs7^wz zqa(V;!D_A@+_y*GTgZr&I9tffVbN)f$thLGvJag4Bs>%0H3)VlO2cUgtJ(zB$}(%= z{9q6c@kin3D`_z~f9a8dFZULh@0{v!9^RvPKrV zEV=47<%xR_IqCjh&ll=py=1WsuQ;Qfx{L{T?(>Xg7(eCQS-2u_F5$bvLr9t9224mz zsly!YPY{`nm?GZ|Ko`jg`0tbAQJ*X1QaX7%A;w_wjd*Dp!(@>ws3invTtE)Ba}*bJ zBOV~#>TSkXsuoGC=m@Z$VhF4EzbHScY-J3FpL+bq_#J^B+l)t+4wM^2rr|f`W@I$> zwIsd1)zdG;p~rXgayU(=IEsVL>5Z9w7AjrZQfVA*9=nHq?B9C~tw?LWXo3e>6*JlC z6L5=>G*a47b_^r7<8MwrpKtGc_ulSYF3=x2A`FRq~$VTMd8O2UHefF==G!<&NyCO0^RF>C8OjAGT7d zIpl&dk{J!T@)cD%^z%#Gif*`nD>`7d=PfPkf#U^$v_lhLZnVOyB>YOwwrU6JRy6aH zO;Uaf*|*)YfBPNwfXu1u6}lx@gn{ghSEC`ZH##jT;b3+-3%um2H21kP@IHx;U(nhuN+7+1O@_*@YWoupBR3{rZ0VRw@>^iNHsIN8WBl zL~2UZ=5O?WT5U23!D~6HsLUOBTbsmqcM(^m)rYq*IP4ATSVl&)r5;lmyW7xs_ZLmt zlab2cFTZga(++uSFJAu0yJw?fGFQW0Pbs6A$4#}Etik4TH8(a-9}3j!x|i^VoE;)9 zsPs5Hq2*d{mE*w04Y=2kuPNa#%18SZ;-RjRSs>i!W1?Oe`H?PTgbVUhi+?&2@k!um zD@3GqG0EoCXKq!f*5^Eh+D|HIe9Fp`^U-ID)D&54DBfvMQ{>G?X zf70f6gbxemo7379nh&i?MSlLsBu3ILjyDoB5xjE=TT+@&#sbYPZX-I+hYL{>{%r@U zKO;}NKR#qo{-BVQLbh!HFbQnKlO4o`#1?JAHme^ zc-PlIudJQz@MCH>3ry~*ykFi^{%46f>ln2!woBaK3a)Rf9!d`F=KBToNBRz61Iot( zEHVEqC>xruxAzv_Zq+0p;w&QH^~WvvQN?AyRWnDwl(CpQu$!N6z7JI8ZR@PDb*TXC z4z+Mt5dJZT>v^5SZEo`NN+XRE_xc;A#w>0*Lsc?L-M;mL$8Q8{Rle@a1 z@>0XG!f*sU0VzP(s|}m7I-} zG!rfT?a?w<)cBjV+r4ZBN1{RS7atVe$%h3!)Rs{<hHR*wvqQm<4`@A>Be;060Q&K%M-apAEd>YAd4Omp706b;1P3b59AY}nJKNcx{iR1B#E6q4GlV@z<5I+3BS7o=4D~Y^a zw5dCbh|R+iIogQNCFtJ5+6U{;kbz~$Zn!z+8ZIa_5QgrDI$?e?x`PMsDC2armPeXQ}1a3C;6hoIUbPP%$aE=ua+r zhUjFgj{PNurKn6UXJtxh$F6y0p^N)oRz5qj9PQ>wScV6|#K@hhJ@`It+x|r@4aW;> zbS~;ISJN_7(>+#RP|@t7beFKozZWvK6%kUB;0w)M-m7h-H2RC_J$86&DnxL$r?fN& z*V&gJ21<>bR(#tK{U(-e|8J(WWmTrE*lxq2>Zzs63AYgoV0`Szs9_)IuiR_Wr!WRG zv8#*Yqt8t%o#at;v`&Z;!kX@=h}I9CD<}VvNW!{34Bz?8&-{BiKv>cG{00;+E1mUk ze7Up#{g@9XOQo9nnMbGiCdV06t_tM|C?RE*!PMMkJ9 z=ox?see>qTq%6F#hc*Vi42l~0uO1pPmq_Bf0%V4Zth z*4h!=N;lA00M`Zf_1RSMURCNw zM*R66z*onWiC?ArlKweBUZ~evL)A2e?{so&^_rQgwO8PvV7$-`s|1Z>OdVgNvkP;c zep10;wKzx}=tgJ3R+r-?hhCAD7F*B9sw#zsftMT}nEK;R4>l{mW_(3i@NP&DHHg2s z$(=X8+I`!~cre*EIq%OHxNie(gXWsQ|M7Q7zje>85WNYB*i)}Lh;Sy#19261d;j3n z>DNfkgQ5026yKe$n7ut_5e;hR^mxdIPAuq<7+=!@@91HQ<^bplLg5WJ3I}7&PZ7W(M5fZgMwlTJq(_9oo znxupcHV922pR6%JI=9ApkDGi3xSPDQ)@^T*0hhe_uY<-m;@$+P)~ZBMCDp!kHKcXA zJy+RKnIq2%dfe>byls~({3hbq3R@SIgMi$W$&fmdP)cr{8dpPsC!EHa8kd&_Py?>ZCH`KxPipS}R1>BlaN2%)_v(NS;p_R-Oya$Mk+*Pb zC@h);w*9>YU%rYS8~2oXd1sJb|2PAm8f6phGkHuZ=aj`pr#&{Ko6^;fsWU4r{348O zuWi|x9jEpa63bu>6{k#Jb>4dghDQ*c(t1}+v>WNlwO_j*5NY1HC4dZz8?12upaQt7 zW0LF9uKF@T)|O*tX5o^O`3g>L>j-uz_JU*6rhbd=W8lBfRGB>f=Bq@wRA&f9H8oNi z{H_S_*(?U`=}=~pQe@-Iiy|^lJ!(9WBFKA|6hNtY4Y+WXlH$p1YL^GP5SK!i+v|T~8;BzcAmuFWOV|MXbH;cTQ^;=WBu?JQdQ!c&6)y zbWkkzb7TwX0vuE^Z=_r}G$?V3tKJi4#RwLBF)^L zI8gC}0yGRwMFEN3k|3Ln`HODHxsF-9O8gjL}ZN33b*3 z#N6TMxjAAY@PLD(Z0j-G<6iXx%d7C@bFj7FsHPHC?ISf6H~UHkWLBPM`mA(7E7fB5 zJKcC;(WHm`D$E8ZnPPQd@*k_{G-|m5QnF;mU%MgmU`JbW0s%k)qw+@4hHLz%jW)|c zrvYv=5FsxzB~5Vb-%pK;-Q0ZOSp=HtdaGlRn4=nvK^%kl;Pd+~l7Onm$Xx4O>#TYX=(qHS)9GZQ_lgk)@qIH)AEFu#vK1Oe#@8g>| zF{RNuk6pCV7kPw*L-VUOg#K;YeeUcZU#jgL;jsk;@ZZITW~Tg%ga}k2xnc zHMAWd9Kh5;*C95EE52a(paBvK`7KXJ+}n<9`oFu6+4mQKCn&1&vG-rQbEEWQ&$K9< zjsBm>j7R?bIVrm?yBrPBP3aHU?+_ENK)TC$cP;wZYJ3kP^FsO7Lv1eV(`F6s%tCeF zeHv+wEb83zKWFSdy2hA)#d?j0==ia?R2-=ILqPrAZ&^odLP8BsQ*#eb2L&?0%+tGm zQ5978We2F^R4`0zb!g*OSPHkYM+oQ_8VIbCbk4RCzI&>}!AlRG^*Kgwk{k2ZFaoo_ z+#8p(+g*t!6Vi>5a`og9-%`{i9yYcP&xC-h^gsATT3Ym8sl&@JI>1Ul^rpe=dI z!N)1B409M2snnC&f`#6UAp47lT!gw=^tKBQG1Es!^<>QxC z?T}bqq>@AR8{C*HVR2%KS1mA@V@8I!QG4L@$#DAtZ5r#n&Fj})POPHL9m7Bnwbt@D zG&C>$XOjsG&FsEKLw&ls-VB(FABOm&b)Fz%+KF(S1Q8=l*ams##sY4PIH(&qzA(;1 zt6F&`8VODG|G{@`WB^1Q+t&()fLD*-2T zp%wmHlH%&uFK56$1w<*SczyCF-UnQ?gG{2;TX7jFB2}5=j*(cy*n@-=C>Z;ea`AVf zn_jWre=Ibaow`IDVW>D-DRCYrzd=LI6P)G3mKuKxX<;FHqPG9a@Zm4M z*B?I-3?Q4O@;gv;IgKAl=+0$fzL{L5=fS*Lih;d>O21ryDxzt;zVTsuFE71)vVOX` z{sDUWwIcH4{4~HnAn=5-BBK2Xu>Sts&Cssp=DyuPe4`)ySF;=%UcJ#)W`y-qCcAx5 zf#JHxR(1wQI}^7zw>5s?uT&bV#e2yElVJIMe>PSX*e!4NMYfEUTFzylB99LY6lq~^#a3mm zUefaX3dZvesABLu?^>P~2$4&D)&%mETci>Vg3D1j?EnLG{opbe&Y2=kl1?asuj=qi zw=5>oU?_9**Gj^t6thue%34+g3?xH~;Siq4@E+Gm8VeacVuKS;c>@snAj( zsCtz~Od&XxRsVEbiBper#~SfU79c4Yl-CrD7{DR}3eoRGOWA62cckpjWl2}6)VJ2v zJs^P&axtqjOH90$pg?fE2zB)a5KaVQ56Ktq#uWidOIXtyPB4vb@#099&4gFjKKXU3 z3K)G;&@rX&&>YFEaO?=pZEHrgo|`!ccR8zYc@Vuqo>0LSNCQ&rVgdf>{5$&Ol=o=QhSsVH7#am>aAd6;sFc42*z)XpTL{FJkn!o zn8R1q8k$yg0KNLmalRHyNABddned!+$)lfR_Unvsg`X$+aLO@G?ZI$IHV9TF&Y2xM zVjQyf=}DfXJUr@EO=!{O3-9bp=Yr}N<`sVJK@$Ngv%acBdBoUEHb!gQVxh&qsJk*s z5wtIv(-To1UBX-8#MEVOAI47xtVw%#BQxt_mkBRt#?% zwreoIf*w*cR?sjmv$-$6eyt9e)d~dwFJ{os3Or`;iDBeUt1A+1Me}@bzwBKhXw-1} z1{T8k#3tviZ^q7dK^xwPX1?=J%xZb%j>!gV7z2=O>7iVpWrs()B4LZ75b3wgRu05y zF5~;cas86Fr_7JgLr790L|U@~C^r0VH}#+FIKP94#=2I*_RzODJ;=jXiEU1A+T+7E zY5=-cUhQYTeT{u!WFZgMP&(sc9a42oT_;07(8Y*NYWRj-kfB9K6M&_J^GR-fv z_E5}~9eD7Ad<%h8{4Mh>BMNvpR+EwxqObm3UPc2}Q71_{y4WW~i^6ITz5A);#)vYY z*JJGBG~K?bG}%cxO?hzmA^(I>`e@PqS!ZrUz_ERGO27>QtgURW9B?lu)%QCZNSAM6 zXh()V?=3EA${nm=0|?>uybsio?L|+=snoe`+3{T0s7XaXkM)#=?>j^&X`*#qb4Go= z2jRAR5Y-Z>%^*et{syFm+4BP2V2fA$% zR{cdkz?4KMbADz5w<@}YA#ZfC6802!dr(iL>RE54e#fgZp_GIe@cMKzh0b>nJc!gt zXt7}hLcOxon4TU_W~xZux+#W!X5+OKqREey1%65sJAEwuiAi8jq}(h~yGAd!Py^Zr z0;WwhprMZmBL$9a54qn!P#EC}svLu+_q!D{tQf zQeaLV3_{YNXcpFk&|(6y(F6@QWKRWjHM$mY8=UZ(BE0p5#C=tF%M-(Zg+UNSQ$fqF z=u-p0TD-kZGNeDiaLN*tErNSy<0s>eK03PNcZt$6RT=#c3qdgV(}Uxs*-`$Z)Y>R| z6A}JM1oQypLgp^dnNMG%D*j>EKenC@@>m9PoS^aagrD`M7uFw)z#mAG>c}Axn-y2A zo|Zb5((Vc9l}wDRRwO`U8&ux)0{*yp$58&Jr1woGd*04i(H1syL48QC{y1sncQ0{~ zKJ`v?k}ao`3==NI5h5cq7+_DWtFtpq2~!b>vuE~2a7{?=rg)BK14EeNt{3rpIimH) zzSV9pp>mCk$)gc%V;H%uYSY=%J!xY}h-B^z0kKH0=%ZWT26~UhM{2{M4D_F+O2*=o zzzj@Roayi=2a)n}f!2nCqAEa?*F-Rt9HRTQ1hMyu8okFVn5g-0IUekyOM{m^XMHwB z13YuD=vrp(S*Mt*r9G)?NGAAAWRVrV;@JxWZtec zxJ*d{NzySe5S2EuL)kH0@w*giqyUAr$BFir;K;;4)*|L}`fsRC@1rCwm#FI=&8_h! zqO~qqM9o?ZFi_f@sEGNE!d50ngZn631uE6CMiZ(wzyzMz;hAi|Hg_FPV^ki}>0H>8 zu`~sxe16>lh?sw+(RkJo;J<87-$GdD$If=35Xm{)EXreZF@BFh48SFF=Mb=V zV)Fkck$>fU{qE_?tLfLh9f>i6hjadWhOiWf9)SMRKpmvU$PRNJl*g5>lBl<_6Dz_)LX6luGz zA}$%-3ghhzHmHlX=k7<2yUp7CP;U@_FdE+7vj^bc05W@^&wQ6*el$c7F=flfc=9~@ z1V@j6a7~jCH&Zt7_?Mq_Qb)Ja=ytYKDZTq(yFHoPCcNQNRProe_)-HYY$~TitDgT- z>t3^OeeUF}?>Np5#tGgi;tiizYlGo&3C+yH~pVC5bBpD@{|E{sW8%#^g>j=$T5TdtX*DGUX_!6ae z4<>17`eKTfD0*bC39sBcus~-vaZ)D&&=iGA>0*EcYQ|EJ_?|cN;+*;^v(`u<#E(LS zSo5X&GgSkdfv79t+=3hh;-~G8HbQ@*>d45RIX%3vl_V{?%k*#gw;fhPKfkXYC0+1dVX+A+|3$zpFFXS8?dHwt!45S(ZM`L=Cld`HPHowv7hZ$=a&=VQ{$~@Gh+GWuaSU}(>M7#Dr-Dk} zz)3(JlB$kSMnj}Hqb(wlo?uDtGcw6J_ivi?>`0E{7|Pdn$GFd@`QX*5{=!mTAy;^* zmr>(m!vM{+ObRQ18NjWsLql)^JIO1zJn$HQ!AVJZ|_=J!bqD z3KGY?E41EIy&I7hoa`jzbM`-(QcgCs-jV`(OP|^6H|eu;|35oBOzxF3 z`&7KRUl9u`dsdnOfNX!z*ESwdE+DUaiRxZ|11VpS8rCxGuT7&d(gA~XYb3nF#;7K} zUc0g$FG&~Ziz_dis3v1BK^2p%jNOd^9s4DR#%Bv^g@V>5LNr&#VB7_E?US>75hA=T zfui(08<@qam=PQe*X`h=qK3=s)$eye(xyD z%?U|J4@~Tax|1LigYPtU)*87&RGKKus6@k7(gRwh1c@7PC-Xe##94Dda!CIo z^Xxnbf#SY9FssM(P`w0s>jPk+6Q=B4?#dr>NN0?Zag{WFQ4I(Sd;Xw0eUEQ|C_DO( z$3S1p_(`YC1@4;1DXKCD23#MY-h%yBtOo_gt?aSB{t|R2-@GYURu(m(0>+3D#gTF> zBO8V&<3nbwI+)E3u~e=9nw4BfbMeME0)16u1ZZ?flGg|bmE-M#{C#QXhsmx7 zsB2J#@*!R-@d(??8TcefO1&9IS$7E!Pl(CVmvCzBt4W$p;RaG5V6v2D&OxmYWni7c zf9h_2kE4XjmzsXa0M0fX3a+SUwT22I zqH&pTlDw92YJ{v{gtw}~C61HQVsu^cv9W(uu@NwLlLun0#BW^0NuRQq|FUf>L|hsU zWY$f88CY$T^o@OU;0NNqKdj^GUs_`{FuIpW*vC$gB{vN-K0Z0@I{;R^(LgxpCW+#T zOCv>HDXjmxs`-JK{>)GW2nl10# z!Jh#^udeW8i$>~gdnyfd`+v5MsIs_A)wTKo8!|?+&9rdGW|wEl)AthQ&0e758`hX^ z%A&H|+~Dt!(UCER<`VAvQ83vP@`RON7^PjDQ2;_rAKXV|@oyH!HPRHrNr#I^d+M`Y zE6x9Cx~AYr8!fo8xiL1jZQHhO+qP}n_C_1qwr%^)|8QSZQU^hhy1mcEJv&H} zf+*!75sMh=+4_@4TL;cCJtA_q39${QB+fVjG8n4P&QHf;g^BXqne$V>egSYIY2%gs zun69+LjVtzB{q3gVmZB}^s~0)msVCq(Y(Tj!Wd{ANw^SO<3p7OscRwQq8ONVsUsu7;M#`J_eUQR>Kf{gWfyXn`que+kL6+48ku&}%;BvNCo_5cp4s;nRy~`*?+P`C| zYZ{Vsi(X}U*|*L*Jy-CNpf@4uR5QTT?>+F^v1c8R=Ne@EjWn0hTCyJQeUCi*eo2^` zLOOvPaKHV7G?O{2!xQ%{*K06sDVH7E@o<>SHEfeauT>w`mk*rk>?0(dknk08t!<0K z|0UItoUBPt$eeNm|DNT1q_uRiFQN60`;h-=3Ph!bnpE6krle1XRY~SkZwugy!fcD> z%8Xf`9;3I ztf|?%eJ|8)R>m}FCXZ!PQr6Vcr`=fBq_M@iJN?XxQYFCC4{&njY_DLn$(is@$pVm1 zzwlIe^n))9k3CrWFBa*Ht!}>d*rlB0a@%so0EpOk>^mNPzvh}>yKL|Cbvbd*R|Rm$ z6c#NkSvU9S<&mgZ5RM%Kq4YJ*3tTRD9(F@@itl|>?ik~1$lR7cKG4k?vi82b++hGQWn%2NN?sEaPAJiMrUk zOq=NmFPP(&yeX>`{;Di#i+2CiKOBIPgrB3+w`7OfyoxP)cxuKyp|&th1~ZfN5nrqb zaH8g)#R(+W^oXc*0QW8+9h&1I1CCBAj?i%AY7G6Z)!5gUjs$~%0G{}>Zt+pQ*9UpZ z#YI36L)D(ZJ!3q~wGBk@!Hq6<^F|NA$?EtA#Nl~pQH&li!s0S*4QKr0l^!KWh zvBu1)<+L)^9>BYs?BqqH+cl7Dn*rG{77jgHg@U9NY|#Fa+A?R^%33b?d}lgF?exv} zyv@m7*`>3=yOJ3(VZ2W(j8721E9>wAECPcZWWZ^&-02&7AfG{S_ zO=Q*WCyn>sxF(mk)&1gyRGT zEijwE!-1ZXg7K#`UZqy3{5VXR1#)lIB=877b-44s+6242dUu@e4G)gdL|hk@<1F4IYvUw zDDm9f$!j}Lzq&p8bh0-~OJCjL{5%khqxoFC#HNftrn~a}yrwJU0(23Vlf8F)oN+F7 zV{vOUydB?0Jc2)raYoT*h#NnIG`RYL;h149W#9K6KMRk5lV>tXioe1-E(`!djoR;; zpY3DLKjEh6YxR-%R~f-}UNrxuy5+>0gdYlqmeUR6HkE(aI$i=*^k4Eu(em?c@JZDPTt360YS-c+DUc;5{#diTOtG;StQ!`y*_f=~ zv3E)^e)?~gdpK7oEeG1Ike3u-6hJ+UAw4fa?_;yQ9@H7Q)T#J}Z$54UJd z<54xtsrC^#kbHKm^LJQcN^|R}fc73#XfT;m0dZ=s?(-lTo{>I3Z`s16dG+OB3AIx) zaI?e0LpghzXRNEXq}$N8H0k6r3dU{eDvp~8dCI$>wjWy=HVGyYkd+gL36oHd z#n)Fbmlew)(f5we$31%zQFiLDwlF55L{wE%My{KLlc{VUtD`K#?$rXJm~ClOzd zZ2L%Emx{PuQ-W`nobTQ5Y%`wy#ZPTv(Di80vq@)5?Tvo}Bf6(*c|xu(1s8wpRMjkk z(uAZ!d346V%kg!eZcE3TjSqRy`}Fl)m5Ez&sLy(*^6p18jcqsro1i^T=

@p?ynz z76qtLkxz_3$U98dH5wsXPA;DB$idRLS%a$N{+%7MCtYPkS?t*|!bUE97_EAw=;u@y5dG;BDelgaU{@-YQbb%1G4IUDH6+pO=pr1u2OBeNxKPQI# zJdNSP`n9We(!kx|eSq0759xC{cw^L`He-Hqf#u-U6h~N6V*_vOd%3dJ(0tssc*$Vx zXpE%QDz$SS^1w_7-)dWhW{@-TeaF?x9$f-Cf7I}zD!n9q_a*uu1Yyjw0|D@yZz|l0 z68G8XAxdbC5R#aip!Z!W8m`mpQ#;&u_l=Xa1+Oa6MZqohw3#Z1yJOj(xYFXLOHul* zzi`euBmo_X5ZK1eB&v^H`;#eZEgFmOxO$5+gFc?*^Gzs&x>X#CUZhbA*GfC%aUf7G z47EHVvy8wlS>2cAswvw=J4DXb{+HMAU9yTuD&m%nSR*~Q0AKVV_1x~VT8zF)?5YQc zPqwMUwF>cY%!&MuecD5Ujs;gKXovF1Bp&zKjUIo9fW$4EWhTOc(|I*+V;$K+773C$ zgl2c&+^2A1^G3XH&cvDsqYXUh?~f&=LKtP{r_q6zOWVHDkME#cT{MBSbFNcKRQH^A zQ3nm~3Z344*I1&BB$n)z>cNeI7K*p4?aUvDi;EvUOMR~Jt%%Z78$TB^Uy0}9sJ79! z#w_L*-0>(u2b3Sy^li{?W`&h?e20%wL9*lwq=OPKQy-qbvAY>hngSnPW@Du@(q>y)97xO1hXUGvP%+=D=Em*`@*K zV*tyCn=*a?)d0DMZ_o^GD1ny7UE%DXHy11)RdOU)@X{I8rVbfOQ(sk#9aO``2y!kF zd}Y=8PdCw7V?DjcUa==VN}kExJ{)NA6O#lu-DMZ@^5#Br7}8iwecR)4Gg?h#m>F;9 zE1Jnoi+%0KG{aGvDV~ZCbc-{6L&7uSJ0XY@zou_M(r!rVU;47%1GVh=OG8f=rSFIB zz@$Z0HNx&G!_c4LxLCZ0PcM`$OTW=wxfN}a#U5DfiC@EZaQc_=%FJE+9$#;Gi1mT{ z>V`X2b9}4`b1yjzF|ZkK@JBk$k(gh|tB>O#3h^3FbdVc&E*5XM^pU0o;&cn@h|D>| zZaey$}_&@h9|%7DaSs-$~%pS3(ZaN=L}1U}S#ft6n3`nXo&k-LN)3TTWMPvSRGTAg zderRT5Hs3~rV+95?STHGzMW2h|2;_ithRyB*bRk-K_wyd1hR)76ir&CeT$uc33)yOYXUPu>qK(4;3~?c>$iT_JszPmyo@6GZz_#qLvW;{$C3A` zsW7cR{fj%d3>Y&2qxRkn>q<#1P=V%%CuXEs&E&bMZeUTGT|h7Gjv_d2f}a%k7W0o` z@yV&2+npx(!+IrG{TYqRLDxR#4juN8>R5vxR_QA0N}{=IT47`Z2cue?#i_C5xqM)( z%h}V4Cf#{4d?l)9ukM7Q;6KTj!AS|h$st|#*3EK>a4~#7>6AUyY-X&_(X*_|J&!`q zqyJ~CNEOl0s&7D3Kk$Y-dFRrwzg;=hYtrC&L*x?XrC@nVYtvjlroisn>8+e<_>{Of zNog+mFF(%(yx57!fuX6$7eRt$#mh)`B8ym^hlkVXqnv*#4m>^Q;SeLnJ( z?ceoS6S}MS53X#J+QO;QQ^F<$jr6Yv#Z)OWG|YW@y@Xyeb$eb%6St*R#V&r+ZQ2iV-(4A)cWTWn?uDmyHzgabHU)%0DTVc3fH2^Z%KuPNF?-~nKUrGI)dR1KRp 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

rXvhTH#*1bVh)J67@< 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 z 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 QaS3?To@m2L9+?IG51V3VQ2+n{ literal 0 HcmV?d00001 diff --git a/cloud_tpu_colabs/images/wave_movie.gif b/cloud_tpu_colabs/images/wave_movie.gif new file mode 100644 index 0000000000000000000000000000000000000000..f866c53fdb9406f81d60be44599a385c32b636de GIT binary patch literal 5913790 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 z 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

vZ4XKu!meN(wVY&bd3p(}1_1`w>Feg0N!H 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�rE1UrS+ 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 Kbv2E@MSwx-PRDO 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

6-vG7pKo|T65>FMn>`QX3m36EzZ`b-e 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 z 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 t(6p8b0ex6jYsU#>33=DoAo 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 z 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

O15tq5gZ3J4znHA=g@oA{3+4t63@XG*GbEI``IK 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 Js9@T30n^Sc?jG4a+-K#Kl6=d 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%0AR6?AhH{d^9x8y`YUxqZ*r|+;Gm;kXQ|Xc$(k`z$ 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

R3Q5f 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

i-D;C-4ef82CR2f8MtG=2m_2P5-Tb zXk|3VF}h0lKfPuZ*jH;qnif=?q2E=i*UWz+T}FwzUQ%|t95!XH$yZ&Ug#VKVSx&qu zD8QAqoZ>J#mH5{fSq1RI#(1JMtrVWim(Np0;P~G+O4BAXM}Rpn2fxmqo^iNdOz2;} zK8>rA`Gk%fzrd~o|1k>sutTIc0D%xl7-i73dllZ)?vL2IBmX?a_pO0>rTTAO^~H0| z&_SBJ_mxK2koMdOaZ6W+0Bd|3Kj?iq41x@^`$euObp#D#f z6+n@H?*FPS?M+V1GY|dTqePDs{O8!QFtL9E{z7kYcJ>$d8#+>Jt;`N1GOHVTG%X0s zvZQ>LaathLx&3}mEwYAX>+{ipIIx%`m+Tq597eKgE?dt|{fpdT|6DqjrUj@@blAS3 ztEgMp5v|4sf4Kadhnp~YG>xcjf5W{i1JegDm?ubeLuV@HzI25-I^$&%p#i=ub`Q0njRVKX*Bl&V@ z5j)Um;$ME#?#C|ln|4q5CbS^KZ`!>NqrmMva-DI)EVAK>-~!r%3*FzZR`;|z`<{PF zseibr^Oa4KGrI2ic=?%aOYE6bkkaO5<;Rmi&#OkhJ?9bD_iL2dmgjGpc7Ssdj&v$3 zWga1`ybnvZJFpxoyco`3zA!Q;<{lF-Q&Y@FR`X+M!tU|EQCMEs9yv!VDk0|3w4mM! zlK)j8duT@6h`0Rqt!yeH(E1#+Y3HKaN?rdWOe(Un}|VcL!9pSkNCVM$gqeG6D*8wL(v{shR2Frv6LG zTz$iyFK7GkhUuGwvOof`u?i}A-n~V7CL$mbt#6w4+YW)u*g2XuJuEalC097+se@!U z1a;=pv>*>jOu8G8?Gh<1T6G(IKCBBIiAJsCPBM8av~+NeghrC3x{mfZ>w&9_z(73B zxAyLM@8z~4(iS4bJFsyon)5P}_xopwnSnMcgPciu5BD^u0+A+O3f&TGhX)E@(h&q) z3S01Kv45Ii9axb(EO9%@8>G-oT=6GqfoQ{jR>`x&1qoZGV~Ul*j0-vpTfokZ|Aw%a ze2cGHM23Ce$zr86`pSxyP`>Bw+t}_BC#Dsj$+U_8`uyk5;r~ee=ei#^=Qw?pK1TiL z?^`9;ga26B#TCFRMjAL96tc6;Kyh{?{%LE;|C;b2(xv2OU^~THoqlP$`_*SZU9hBM zUVifOmq!Pd4-{>{ zyvtu1^Jy-;%dGcM5(GWeK<=L=xdYCw)c_ z+bj$0+l81Lt}Ck$ISE*&1hDpWeU-6GN;R4WmALV&LKsqD1{?&WL1$ zeJLiEO8vQSo4Wd)bm9M8A?5JIzoKd7PLM5s5#`V^d4fq||J3coG_o2*lKRi0_Km>O zMnv~*!k=gbCn@VwkGig$?TKtt;V71x$~s8uwtu30`)4|jT+~@eX$mEX4XhlR7Q8k& z$4(s+E4{2jkPkC0w}Xy7+RsNmK$;2TL7a)Z@XSTF9Z&Ra2DfQljVH9M@=DRWSWQ#* zvv)ifGVY9vc}4q%vBLkU%oQ^XE>|JBxoTy=3iFwn#J|iSXo7ONRVimzQ@3H$ZIMPy zz3xV*0)#8768~@g=RKjCo0`5bT=KuZZDD(AgWyPx`knfRVXHn-$b7J4E_-cOv&rfs znpPetRIgA9^ZdoYj5m(`0(3DkT(tDdX)L#+lf;!(D*|p=J9E^rqsVPkdw}$z(h~d8 z{#$^AnZ$|v=^cjsgMQwH~&j(Wxh}S!*vdCppIfr-*p5CO^L7YC!%j^ z2`7B6TqxDCQ{X@UE6I&TlD(>Vc*L_tp&!h2kULBgPXG@;;e(RX5+Fge{o})7VS;ys zRCT^511rn2mA94rM}K5mts4G%C|XV6$p{t`a`8216NgeH-Y^M=M_AzzrgSt)IsGgG zx!~>2i~eDo9_wckDesU0YJ^D30|i248WHF2=HA#Z(P3C1-hMP`rmJlZ4ecMXsjJKY z(-F4}23oGL3|JrxXGh${V2fT;w!0hpfen(AE*=4AMCn!|Ps}3!{ga&PRvt~8PUe5j z4dt{RG@Yml@h=7c=P_d6fy^xcOq-3OzH>8Sa4~07l}ppg2l-*a>3N8N-?VZ}SAObq zv)MTAR?d4YE8QLs@&W$=ZqHJ;-4|AH)zueP%WjMSd2HW=tsDJGsQlR`Ea!x8vm^Gj z3EG(Y8yOD1{R97bkoNS(TXXWtpDU$)Ax;$hpGnlv=$x_TxfzpbvTD$@yZIEFc3*`2 zD;|hVy`bg8>Q_OW(NoYq2|h;xmTvm2+hpq~IoaMA-VKB^Emu^|*iSAk_G+~Be zkdpX9AI`{uZ#jlO{~0@1?4RRe|CGiZW1eun{deUs3tL}(&K<$n==_?7`iDK*Gyon( z1OM4yq3SeSQ~yV7k_WE)L}W6n7s`YDcWx$qy73fhO)_7r45P-ZeS-qod`8rD2f3)9 zkmxG>=kJC8yh`(JD_XO7;`eWzBuh*E=kUq7n**8<&ohn1BsTcdN%KWgsn6x|bM={o zn&5{|^Kg^2BJUD(lM`K5IDis*Zq!j}O44))H8q!jdGoPUSq;j<( zsjxM*R}q8BZjI{V7-Psl(N4bjaODRyEqEH^4zGeK08gTGXliFULLKM$sX2zzQ+)XQY@Y?5N))>Ih^N9 zq~?36i>4448~aC`D7M!(E603px*4{k)D1tq+cMsRw;O8zw=JlD$jW548McP_*X?;G56w1M_J~>1 zwCTNjK|Wk%?DcnC1|;@I?YD0p_CEyoP?^|2+|$R8NvHEW-%_mOwxy z<=U9DByFNi4C7z?C-81axlJ7X3IlAoBPIoC+SG%0rUBuBT*Fhhq7!OTbub7p@);rT z&diKOH+Tl@MuOL#C*$$4Jna9BHjb`!`_H46l)woZ$6St$s|bULlbS01LrzqIqgVx^ z`U?^pI1m)CxHrYP{3Bnj936_L*HBbk`GdxNFy=*CmQ7iZFp^@FaxHrtK2`9){O5%Q z>eO?Ie@#7fV#L?W*A1*N}zqAs0*9~4qzpg_^yE^el%>_-) z9NUdI7)#Oqf~w>;(pE-PNnKM zD-_zB$2j`3(nk*Gi2cJo=mP}IOqF89Dh2*Cbdax%q;`^$gHU`vF1CFwe^Et zt5)Wk(})o`j6+#UBSNx6P&)Y!3FKujUj2?39!#EJnGx)tgFnG)ls{4E)lf^ix0DU% z>(g7J=rCrtqn}Sc$96!beB;7JaKa>uX^jem)#b`B$e5dc_<&b6HxPQi1&)oU)qYr( zK7m0ZHZl9=hVgLfv|%Cc)lr5aJ`Z@7BL7QZo5$%t!E%7#S5cI8=^!aa5GE3fmpK~F zt3-Z0W|JK&iKn<$v43Dc0j`J9E!B1Q*;S!>p&YW(Oe3V!Su70rkK`)QwA;5v8LS_K z)aq>1f2N&`7Ci-Q=aQ*~O|TK)Cw zH*NJu=fpo|*8cB1SJSlexcN^2!hti_3}v;6CVg&ZQUAM+#MC=?Jzz<4%21Bi94YM=DvGRBhhNw_bJ7J)gLeK zJ1;xSmW3YtcnC4kU$Teg_Lb;Mc!ZNY!!H;y{E+e~-vUGAtqY1(~F=eVN| zE45DQ{{T3vkBKR{y^rxNsehifA{`Y8CZ=h<~y|cqTqR z_dwf=Lh)w)uDb6o?D?_`NbTDC`U7nlE32R!{^!#rwto8LZ{%cxqSdxzVz{*A_Ihxf zL;3MU5@oV_0)>i`4#up{4nr3Fo5dG$UmLm1Pwx4K-v}?(m3KG+4xL80{IZhde<^Fz zqK>@FkcQsa=D&R>m13~XP0W^VoHjA>LHz52)%YI9A9T&=!3^=6eJ&W2Z$Dz$8jbzaqI~(VB=*muVC8quz3$BY zWJPd6QA<{wrja@~b2C~EE-S72F>rtT%LXT3Kga@+|CO9c z8NHXU%TdWU55vP-P~WO^AFU56^1oK}Ve~v`aSj{pZxoi<&DcLEUJrVU5$Z6k9F-0z zNTpS#aTj@8#WC+k78=Jh{#mgZIGvoe87?#Qy)hO>_&>Y8>dKS*-6GE^;Wx^1+j&1< zVi-@D$#h#$w#CHUXzZvO{zM-b@E_bEf@R(}mbr`g*R~0$(nDs-kAGDKlr4DSrrS|0 zwcF3|ADA3A!=wKf9ITkv)u zX8ZlW!0wbtGXD#}Y#KZL4d*v%>$7Ca`FD(urBq3E1*}@b;q*j1pk4Y?FBvuK-)13e zWr6Z|4$gn-4Cf?(ncAh~j0l>nmz;rqu~ScCLE{==ILk|;r==^WDwtu#s1B~S!sK*F zAJFrIuvgK@YP(@!HKoK@k~~$FqIyPJx>K!o9+(@^o+Y?``I!o?y*U5PR!DW0$;uW$4>ooPnjUjJ)d< z^xi{<(rkb0#DE#YNJ8Ci>}4aQ)c?WPxPGX4Wq8V;;+~n;ytk-jqC5RB)b`hI%s{wa zpUk=@noj(V1AgewV;nJ3Ve+$;eBCJMT3=K*onINDA%u6F(I3&LL4pj%r<|79?4=C; z*~_qP&{IUQThxq4$zuOBd(^D)&%NKw4{0+`CmDS zK8jat4@c{Y)`=6EO1-6TEJ(!z2dPG7%q+2!b*xcq-Y&bagGh3gnShuz%j1 zDfugW28)JoAvo5W#!~-8!~aQNLr(1oH7me<=4qEZ90U;i$FE9|)ZDM>tp^Z7yJi~%fM z)GZI3l^N}#h<|bAr4-yuaVY$lYC4f0E@5rIM9er66@aqjG18^#*XUrEXND{1fWD(T%( z>OZ5F{t2D93I6jYEZ^#3NB=;i%WfO&{EhwdY@Rnqdw=~JSSz~S0bTrPMQ0d?GoiOo z7INeq^1pul9z51NL8mKrQ+5RnT9Cw7qG`7vF|8@yt6V>vaZgLXf?6@z-JxW$Jk$fqd}5FvOYJ@A2xkGl&NCrAc1=oZBncte;6v< z+D(c~z8MknD@xupn{?Ph?0tSPx62@5wa*I)o4jH4v;fkchgxD&I|4v*#IS`#t4SD6 ziy{Re5J-mjI);2S>5%`9(<2N@7>n+Lq*x-2NO=|~6_inu+@=2WN8$MT<={WR?cBV$ zv+$n}2X<{+zoM_I7yff$c}>dm`+w2@^z2)W)&uV%D5dZ8`9F;u>Oc2QFX-8Y1*ZOU z#p{GI78}-?3VY{^bekq!>}mnw zW48CRXIlDl8~EYRj8Edc<{dEEV5sOIC{|h^p_?KbyhlNW1 zyHfP`5g*LI=VQsKJbBWdY%IJg!{cN*Ns4)}Pqg8ff!sYtrR?NP@`*x~ZQbOX_ygI| zdI6iXVSR>5PafCAzt;D4Tu(7*_SfdwaM5tNyndLu4f*f48ETN!e?CWKG8K{hcNCs| z`AegOIR9LJt;D}#d4lIUN}a5Ks8l~ALep-31OHjdB+$GpH0Zy*w5Oi4Udgs=A7r1U z07-nREKuY*A3Gb$;s0DVaW0-0Xx{d^tKOE0`Rnp;K7wU-L)|KGk5U7K zWyXO(+pF3){#53Rgd)e|fl5@S)DuzK&^SiPi+VZxP+jpr!Htxa>|-PLU%lMIbzSsA z1FxLkU|=Ec_kFN`FqV=R^%eO)l)=FI@)o&lQt(`$aaT%tvv6*c{D=VWDzh~*DNbQ) z{CN1E)Nm?xR>o23K`JOqwUc=!V3Ev1C#_qFx4P?Jr&TNw#~8rrobevI70TWLHZjtermBe1CD*i3fJf zVC|p0q-k~P4UPRX@uJjl>>oo_ccyNTLSAaZ%BEzUSm0QAC;kcibr9CHi*Tkj=~iAX zLko4Aa)er^w@Xok2E7}CZ_{X0`F)66Y{nm>l+ph3Rhf0U&LHd`z?H6^=FwvIP&nc2 zKxS;_p^_@&g2iCas@)LqD53p3L!ZC$)lfm*gQC(i7oL{*>*Rr|Tg2A`dwqK1h_`0I z*{GYQ)P}iY|FGo7o#3B|Ovf3;AsJGXI68?>Q*6<%f4DrbFq8oQLA|{)_18C~uu*eF zT1^B0ncUV7bs#VKJ?4P_>_QhOvK?p2&pe0zUykzQU$QN~|F~JeMRfbVZSZ}yoHfCJ zY-pOt4x_hW9vJX{%F1gTY;$m%$Qf7D+PD41n5CM@n^w7PKcQ8zu>@=9G#L-_k|*mj zR*GwSK7T>N^GrS)^WR_RXequR&_kHyEI|RD2i*`*LxXN36e$h@@lN_h)O&a+`#9ka z{AYx;BrfqUAP0;j!aD*1@~2%=QG$pinWD>Dlu1b*ZA1{WB(}8mTpF`rtX9xQwgnw; z+{QTq5t{We3w%&eN_WKl$@AorI)Ph=^Bn2pc??=0eN{F0&jJA_xdp9&nZM@V`gKeQ z5)}ob%uu5ar7;H%SFmX(STf>bghInC^1tB!^qymp|FxOJvTVRZ_j>~ubqKGW-;DY{ z52Wi-MuT+_-{jsBfdj%#66+?tix`}iaB*GP-c#^4Etx3RhUEn(=NvQ59SPO z6LVhP&7^0AT3&GoB{XP7_m&RvuV({m=VUqbzwlMD&Ep!N7~%hf3eQ`<3~~J^9MyfW zf6UNxtqPQLmc|~#SSoUmX-Sn%Awei&;Bf+kf&Dp>|IQ-*6F?|DJ=e(2E?>z#ud=y~ zmE&mSMw}jmyr?%=uj@-ivM|alkSXF{lfi$C31v&XZA7;YLpo*ADlvk zhL&TZ%PdeGF;}Z;;?F~tC_5^aI6nYt5JzZW>jWgx$-P<2@A+N_KvXpc!{Cpomh~O_62;hAgRd`iIh@?FI?{ z!`GAPNC!g7t^o8on(PIzKw02GZMGyW(6)}c;jzm&hDG@WwRhUgnfMo`xC{t1T#POV z8N(KE*AN%!uy9SvLFY4Pfl|hN{$${Zp>Hj{@%k^7yLnOXhr4UF`i30I|C;#y`heB6 zQz7=x=KESmBG_d5Uz{hD%p3P@gTGw!2>hS#NladmbY>h(v!1wYeIJYzv48run#1ht z_6Vba{6}^(;>0{X&&X{zs5JQ~9YR`XFQNbYId|aMZ{PCbsa5ydISY!>UFSbQ-NIq- zy+jcXb@lrTLCWAi2liUt%TEb|p6BE%WHMw`^h*BB504Fea3DfK{|iaN*4vEG#v<@A zx;LrMSTviJ!jZu4kXE*#z2CmsL!{lmKJ?B8lcqsjMgPl_yIdFYUVmACBJZ-3Q-0>9 zD~I-W+0<}kOA+dpiJ6x2-X#9DJ`f2z%hrf!myqrCI_l}M9t8NRB>(IB%~E{==>Y$^ zXx-YQ2RRZI1j2}kaqCe3@HmynxUrKrOZsEae-{4FYqT*Ki;$=M{_m)5+a|m@lOH7iOZvZ`XrUzk9a%_`-@gTsTsiLbKN|X< z#!~Edfc*FIOVuy*|GMnuHYpkgnlFWGpTw3vu;Yzs2M@GF7E&AMi8)FC_xB$NR~}e< zRI{9!D}4hI`^V3yMB56(*(x=M)ko9Bl;|!n4C?=EoR73~uOj3k zz&;CvjjBUmv#aGHTc1w~PbpiN=f8^;CPcFWZTH^1sdxbPLuUqQurE zPq!g)$`4G_O$s29`p=6R`z1-lB=PJ2Oa@2Fu!%X`6i{`?woODTB29}DN5sXD{=YFs zNa_?QeF`On<}39__W1etW+$$Y{I5&fM(cX{mGd#kT44Xk#QX#KHnnG}9cL07tjK?N z_@5aIVZGCEV8gwVvaKY3~$G#_BcKV8zC@iJ@*+Fi1fcuKz602NZBo!X_69C zg-s6KX8IXCkowPqY)lzR8O0F#FQb>vVveHz4PRohM~m<0g`+qp>N7 z+*8N4v16n)?p8_Ue&hVKX5E|y2<+(-RSLYitLBT9UgElPfBaAV=MMs<)PMe4|Gf3- z@S1yilc`Go3-aFq$aZ~@QF$Nt4|j9$E}{QlNynGOJ%TGVlPF8S}uSZalK6h@uvr2ezyzvBR& z0|rq&WDIo{ET8`j|L0O7KhPEaZ*+_q1g#tEYN+8<9*+sE`{DGrPLSL?rN^ z6S!`kyYZHQaxys^c;D3j;fMEGGOv&yKE{di9Y=vT=zqcXK2Ml5dX}Ro$`J7GK8yT! z|1&3L+v($obIORK!~dT0%jX;x<-7^lv-aku0)!gD4||kUuao%Kx9hJP*`T-S|4#ht z1d>QO0iI0Bca=;$x{>ENWQ2Lte{L^oTV@d|bhW#yTpDwL-~7boWqOz*S}*NBu}yt6 z+10;|EoDzB`Sh^?EJu>1G6t`}5+VNev>(iOuSb&C&872a2j4RndqYkQa^|iwtf`HV z6IRNclSRnU--qr5b1SawYeiN@KLqrpip8GzVw|I1;E#x5p`2rWg`+|L;efqW-@b=PUi zc9HEM`XTPv3jWW1Z7zMI8~o=$^4te|JvjE#XP9d3GiN%NDfrKg&sx+$tLr{Vr~dQv zUt1G*!Yty-wSslKzj#Wv@a*(;2z?XHRzzjJg2Ro+sAwgi~bk?DHZ-R^$#2RUl^)I#N`|_8L}h z`|kLLR74@S(Z5+#m+P__m%^l3P;}waDI~Cnk)MSBvns#{6@Qbvm;d$m_;Orc!v8_b z6EX+E2$jQ^m;IK4_5AHOBebBtt@9lx94D;7az+AypH7H!-V0Gt;$Il5@fsT~0O6|^ zb#18Pfy8?qWi;#BM)K;2r{w0_U)lYXlwu&?7O0979;vqR7lTv!h~Xhi*Fa#V2?@R+ z!!QlsCuKfCyK-gHFz2T?8!)N@yW=ZBWZ{A#G*R55D$bY|Rg*V$c@_R;cawPSit)p1iKL0r_ zJvzuv+0;L5+GSV)dPU{J$*KJP>UUIgBe8!A8EVx5v%15WN#uVSp__P(8Bbm7w+XzxbabJt7p2!zzmXlt4HJGlc3ASiE~-xQS?=db z6xBbLx%=}MCXN*HhlTmo%EtZy|B>747Q^Z`1?P6a?dWaxhm+N!=cHm}8)Uz{xeF3W z{?}y^mLIJiLb#*we?DFZbyIIc-ZiExPsMC$U%e^0Z9WXT<@u3Qa-;s0q1IjHJa zxs?flYNLvBJ46IjXJ0y853MctnjZ`0hk|;^Os3_CpdvPF_Au#D;<|w_FlQ}GRlxxg z{*RfvwNs+SVffEX437yB@~6Q95w6AjnpqW2OCQn{1QMr#A;R-QI16k^PWNlpfsW4& zW#x4lwK8sOoEtWeG%Zna-e8eUigiIvT98Obv39{+wI(83K+-$-zZ@`|A|=MWK#0+} zu3})E5wrNpgz>fz_V@7s7`+%yp99fXBPI4v4sBb4ow{bYi{lrH>!+b>H0RqOpI1mTsoJK}*jZFZd6CqW-h$2-Rh)xV6RJ#w14+0H=rX9XeGNIn$N#&fTs0o^(aa zZYvrNgI+zyJ5b=%qmHOn`~)9K`hPJEY@~u{-#!$=B_GFi`r=kG4AJsu)QghlJwQ z{?X!3l~^g@pXnX2Py30IFXZ%k%s3ibaFd9lI*?wHoYw!Ab;a$5EU9re5}YE)>yKFs zAxC6FD6U*60)cQQOEu|@Kwfw&NufV|NY0dTSnR>Tb(e{%VV(GNfc@` zq(tI0Ij5Yvu=KtkHX+)hwywFMo(2@HI8r_DhauJWB9s1K^ndR>JiEH*VmJJs z>jono(P%GS`JczF>NX^T$pR<)OBh4?UyOdWxnKX86BS!TfynEq$xQtp)+H6HKC6dE z|5LyIvtR$`guGPo0Z!UQgtx!KSAF*RC&p z{O2ve?AWsD>c`C(9yMi3?U99MJZfJcGO90!PI0|ka_A)g>nY&H*~Gtyo5ohmF^{pn zG zFd->?jw!zrn@`w#kQJ;@`SLQ24iR3Un|!&-ND4NiwZJ}NQ#hy$RJuxb*J@30?{~w+ z=pr7+eWdk|SRxFSchx=~j>JXA&GgEP;$kM?kJqDb84oQj;v$NED_#~sTRBj@W&@IE!z0?wgl2qV;SHkh|Y8pTQ-oMol1dgq?guKe=3?P|;y^ho{k*DD+H-&c<} z>3@1M|Gg@BEGxb}0soo)7loeWzXz!QJmU`q|A(&eGg#lifP32vU)qgjjXWojWwrgq zYx9z`5!)TFr)8!-I?J1==zrQ4{?Bx!-g}T}8T_9;#uGHj`1Wt9I5;k+_S>7Zv6Cob z{JVdS9u$MQ_PgW9{t_BDJI|w$uG+qevnjP>SiJeTqAFE)%BI`QHt8kRj-oglkz6c@ zEiAA_6Tss47q+`ZdglmIj3#%xs*jhcsiD1Tsp}Xt4~(YvDsv#cmQvl=RfB!O{-OUx zAn_B_AjNAVCD&7W)iS?qQki;9e%Srl^Vj#lzMN^){kl)^pDN0b4l7l9(;a!?$}(4$ zqs>KaTwPW5p^u=a4(=foS}h?U>K{t~ua2lU*`Jl;iGP98*B$66Qi0|pk&FdG3sr&< zD6yyza!>CML=t^dkD%4yuyY@K8k8zfkeZ{bj)--^g@3{qVDKMS3gFO1I8Y*38JeH0 z&=7=@2M0>U+8M>W$`=(slynRuSkWX}m&>4)w5w1ILrpg&&@OVD-?3eiUkDnfh<`ye z#FA$VWO=!v!1=P;BvSFKOd4Sn=O@1LKg=RBLevAikc7!a(SMO#q7H19I+a zPEEL|u%uKz%>{=?>@Xmv9I0#08o=Bl>PE^@dL))eY@q&0qt?D7A^BfDMi$Zk^yg25 z692ks>aX9tKJD;{mTM2IAE~l=a}m9l_if8a(Emb_|DHkri+U<3s6&UruC*fmMNPC* zHgd8`rP1J~+u=VK>ob0o{udL9Rqn2;0Qp~qdXl3bq}I`_G|7KA)b_Pwx(fe!8mfYc zJv!jdCRw`M>AomU@8$D>9NB95yi{Cj18~(AHx}EuFkOT zXa!`yGJ^1qHY&e@AJ)-z=fcO{oGKa-l)}+BZY)*Z$D;?>7K}``6JYibJo#`Y?-j#9EOhCHeG)zIt zu<-oVT-%n<^sh4WN)sz>?6Wkg;K6@ZylOv5Dk8S&nW`+thfx%`z3wSzb2JJT6f^?f z$SR^#uB#{@xHx zr0PmOv>((8^$!Ox6Pk>n1}p;qx%Pwm0;*Pst)DEXu1oJ;yuf!r1;ZmER^40w#RGBV zdHZi7(mC|MP{!u_T6OkeLh|1i_jzQdjH^M~0TJehV|}oH#8OpKg3}0XYUSt?;2n5? zF8giNE7mHObWw7FXob*zZp#Um7s_%X+kR0UK25aM)B5~?burCflczB`<1E$jbp{I$$#K8NlqrY zI@NanvxAX58o@|Ohqon8>6IeDj1>rkZ^<$CFc4LegP72mMxp4+p#-Btat*;;WT7l& zl~>yggFCArn|D~mn39RAxmA18TaVkTg*yc#sl2z|Jp5bgt#Ez8MMdO)?G3Dy{C5uR z4<9VgnzIL^iW!6u0OJ_&?W5T+pzd$SsI}LB@mi$^;q^wdbbX zbPqN)&moT1Q2*z8^2n|PAjAIoMWE-AUR8Za;a`#eF7SlwU9+Vc`Hy*B4C)_Zq=ZmTx`d^SkLb4Yk z^wrBaR5npkz9^TuSUXYo`{i#LM;hq*3K2LY<%jxu{AiVw+T_3UnaaHhwF!|H5YCbM z&yysEqm??BKpaPG;pydZ6_1;5Ow>};!lpd*G?vWm=yRfsDWSXrD)k$-H7M5)V|RSD$?9~Q~N7#AQb!d4hPvC6ObT`U}!>f4m5|giE$Arj!Nv22~ zjATxMn9;9-fW6dt<=w1;_$)r%GnoMIdn?kZBDNDlFF;Q^l_UZvJ)}x*qpZ@Rn z8AJG?>uB(wDF-^JDU$zwZxh>=_*X#I^EG5*Ot_{c>-w!ZU8IBjcPMc=wwf{NCz)80 zat`e^EbO1*@PE{rX@^nZM^s?T;vN(GINI3v)#_>WfY2npZ*3b>^#5X0N>w#_n+Q@V znFYkZ;6HOOQ~!|qKMU@=TG9V>YQF071Qn#zlCs-#uhkEBxJ(*Q@751>!v#c%4SvL$ znOmS1a{8@1phj~&|Mvnc=%|hBWrQkPIyPxv!@|~)bX)2l2A1@0;pi(~HQ+zT>HoFE zniAap)}1|MU4h&HT$GwG$Hu!f*3ANJmFv*M;^d@KalHS|Lc;1M062SEjHvH%A!zBORDC|2m)0NIPzWdE03S4P(B8XUu1be?g zV`3Z%5kMD5s$1|GA5+2R3qtUb)QMoEx$U13))&2vO)}LAN2BZk;b#V`{FQ>|j^ii= z1pUOED&qv8cwrJ_-SWlWKN>}S3gwEyjw+2MKUF5Bw_Qhb*RXcUL6ZMY{?{{^_TMsd>1##0HZex$Bf0?LuIjc3p5#1F*{dE8n8jI2kGbTj!IHEI z{=-FrC9kjF#)bvE%}=tx zT2;RraV|$~Ti4q|$U>sI;Qtu4Iq~%)dRG}%il#ouLIWd5PN?7i^d$e8PdobU+syRx ze5VooXVa_{FO|vr3`}0iVXL_O|B&_O@ljMw-0$h0HTwV|3=l$#0U|~m5HLW122rB2 zjEWL{5F15}h!Pex0>TLbMg@&K;=-Ulii#RnqJnmC<8h5EhysJ6L`4V)hzR6|*ZK7uiIh0lckAdlM#R_Zn4i1V8Q?U%gAMsq*d2 z!fd(3o##UtGWB9*L>h5&u*k>U|8Ro(ucd9m$?v~CWrtGaKVx@X_0`j3+Bkz8R!NXD zx%2n9a7j7EWaY451pi_1|Cc7G|EckUThoDG@fl!n^1=Wt@9=|CJWa2s4K$m*m_hS_6MV3 zTO~O@m}x@qhD;&@(;U=dP+7ysA&EpWU_`AEad#~4Y^Ya&0eBYA2s32jd1R+Ywn4Jo zDmR~>*-D-LV881Q<C)ASVK5_Zx;MNn_iasuaElK<6k%Y zUp?26QLLT)m)PdE({QtwmNo4MCH4>d&sP8QdHg@8Twy-ce?~!b`1JdJXMkq_pwm^x&p`6#&@sJz{r_X zMg4nbYz(rEk>ka1SQaV2(JsY12XmTpDphqgGu0<5%L3doC%k7O6Ws&6T`?W`5~XTA zNg0J_-(M^V$RW55#c-JaAm!#9jOgZ4xP8*de=>(-t>71-=P;-o7ZLY86I8k{{6Fv? z3i6>}#LSgrwfa?wmlFTN-c`SDT08qxSMZ+$S*XBd1Bo|9anZm+T^6@q0{=O2%;;KM zLufH@_R-7%a(bP`3C$fj)iDYNigZl=?yZaYuzAf5A;LgadYhO3b2x<{vho8ocyJ-j zAiSYgg%}3EQvQ-5EcE`Jo&v9ig!)&CF&yw8an(yiPnwygy_5rBkuQHR1xrW}CZo+R zH2j^?#MSrgpKMjzn)sJTr6aS+os}grrRHEV%A-WImF=GUqy(2DZTYH&Kr&yE<%3Arp%d6@xU>~@fQm#D$F8qSXodZQ&T#1eE^x4iST6|yu2`~iD$_y1aI_Gp*vPh)OPavf8CH1 znIPreA1@yUDy8j{wRmY4fYQ@%te5Su_eA2 zNfzY8nWcYaRo53N#fypD;eLSs8<>#_I%*vqysBMHC5i-)TO&q!+Mu6lAVTM2% zu^=uz{r239aATDE_Yrq?9=a&^+g?iD(>?G6660!hvQO3azlZ+s^gk8;pE1jYLeo=A zBcMAGyyYqSzpGeZUc*q6NF1}rnU~~9#KuJg*x_PxuAYh&h-Gy#p_c6d;XhRKaJWh> zSG^v#OE+eF>^7ccw3-(>_85eyKJXJcvN40^I-?}Pj~wfSO11~L;<5Fnfn&bHAxu>XO<7)B09vb ze_%)gdgFsWwehpJJ^n*89FH;irddoj$u|0*cFL1^J>7u7lh7DR#S%4UV+;TDs#Mp# zUcSu4nfJJg_U1eDkp&T8kq$WhkYp#_y-KY_k`oB|M_uY*peHv zH4+zp_uB7L?ULOHgu*$U*)C$WXl_l1O4e01;mIaOGaoxCjx4EE4L77xMI84=6yB;+ zZP}vutL@^KCqX}FvGZcijC&7aArlPOp>2k59uzwUjX^h*D-ZdP$ zo|{Q;CzHlgc>kyW`vdKAl85{6gR;!4f7eji`kHnffgs87*Ph%tS$YU7?d7Rk2UGvG zcL(`DLtN_L|7g>+yR&8R0`$KigKS|&+k(m}ZNFRNE4m;*qK;QfJpLc*zZm_!eQxZn z)qN*kD0#I~|8*6C4a@%YVPBP`^a%fRT5i{v`h|d_^pR)GK$B6s@@qP5`|786ZEj0= z=duriv8(g!i(b9@+h?+x51gco8CVdN?OxEzJa}L~`OoOxykZFrtM^p&)Ryb9i?^dW z$17_`u%0s!c(&yT&l=Ol-&t^Poqp;HRr&%&n)Ww1S5U@cKF|~k(m>}OX zt)u!rP4pzF4yGS?R@0G5m2|Xz=djq6ZK(%ZT*E)JRg9gfs@I|g=tvt&dJkhC(f=Y) zBARCV|9Bb$y_hftD(97{JH)r0{1LS0yIzMHmIS_fIANd0(2{6o2gWTY~noK3c0$51H^k_mKSO(D?V3 zo&Vbf&yoLg%VhHvMVP7!LXg@JoeKJ#?s(-gzj(YW9lH35r zQR_00)#^o_Vdkp$5J~^~l;AM;EYF#$oA`3x@_1gRs$PaBZV|_b37v~xa+(_12v#65 z_GyWK<-vbASsFFKiznF<6W*RXD(=bKrz!qtrM8$+OMpW}AQEv-=01o?vDClwRcen2 z&cQy?A5#AgCEN`1p9zrQhX@O>*LPQcBV*<@en*)l-ybEa3qLRBO&v3ZEv#l7vpA6r z>@hOO6!bQ4g%k{K;6IG3rF_5g7!e@xkd<84KHOX0Xj zOKtcMz4+IF>&y)=&`0Bufz`&=hFjW=(WQU+cH~6j^YkDjG5JAf>I}8|(~$c2dGr3M ze@`^r?DvJs*Vl>fMgP;HUN-x%_vFl20wrVwYx2*0X}gFt7QkNCCnh0B5ovMA-5Gj} zNPBd^OnuJdC>R!#{AaKJy{`r!Q~r%Tn0$l$XM$y`uzx=3R{oy^SuH3A@}GNd<{GL0 zQd+_P6SWC@y>m-iX8Fj(9&KR%6tJ^@lEXOcl4AFnF$@ekF;gayTnmeT1)ig50Ie1j zxl<%kt8nMRi7Kts-QC-{Yv}ITnBnC-NxdH)Wa7;mcEhy-|6zjqucj}bJ+-r=|K?WV zrDNtXL!N%(f3=KB9%L$_BfxiPOx~569VL_x*&+X0v{6* zb3ftDuzy^#v;Gxn&uehtKTJ7MEI5(+pEkASU!G-kgn@I?Xl%gaG41JKK(35ja}(~^4v!Tc=W|Lv}dXPaW%j z`e)BAYi9lVbCyb;oP3)am!9KGG*74h*UtKB+S_Z+x72?b{c@TBo7f0v+}X{UrK-Pb z35Dyf9hGFpGcy|p+nh0|>*igb%vO~+aXBI9aLHZ@$oz^4MyH$ccFrK~Z1^j8@1lU) z{2?P;bje^F3;}+e-4kpcM*ef>pu}~n8h`N;WZQoeG=V%$o zTTD%2f+dKORK|V2axy$TajOWb%0I3US=i@qZeuIsv|C$`imR&xmB60D`^WMf`|9Mr zWHqw9&4=1fDSvSSw1piVkN?MH<GWihDHAM(m!A2{mrrFN zfv9q$K18xmDcTKkeHqw(F+Q7t>)Gk(ZFxE`)SQEykpCwXiV^P*$Gy{1>Gv>qia`~3ruraP^rF3KYd<^ zglgC2)Zm(!3@~*bX+$!2Jb!6XG!@DxR>HG_{zF|PS6g#SKey!8rdg8hz*tOp9*v$< zH;bi+QTB@0|7-9P_@BRC;j7P617FkXm8*UAOFG^F{xe(hpX-~G{@Zd&Mq95>H+{V80cYL z?EX;D4%-veqRdb!2~zIx+uEj$&#%2p`doohC~)iq}K zWVgW0_RtN=@ZBW-yzu|1%#h?iYqf-ka>T~|k!v2l5&Op|rS@U~_aO>tcT&Rt>|e9! z5ex@^U`ls_-+%st;lY0>V5w*Se9RV$+~n^2MXkDoNwCdbQvZdSpjiVBYGr%!;wiI3 z@yb&rcc}GGfUM|>eW>0fHp;Y*v(=>_Dy87;}BDRh?TZU899~l!H z=@|Ya7D&qexr4)8jL1;f?izD`9c%iYZ!I>`2Kb-3hWAmjEHMWY+EDJ26FIcrxDI=R zKk<#fxJZHj07M<1mq2h0RWO9w_UWtvmEVdcfMWNDv%t9nts&a3Q|5xS9KY1R_rp0= z%r9GnvNjbSY^gmECs^GRF8D$#{*tt-=ZB>kLxS)mmW{wHwglY8pz>af2)+xf9A?)! z@_s(tJMy20-W+PxZESs=gZ*O+C;$1<({D9mSA12|%ENyK1<8MYV!hG*oW~05rrRGG ze&IjVg8y9Ay7BdUTw}SEQ^aN#8ISvFyPe*F_}7!_Sp66I&u0)3qyMSlrbh|9v|#I-h|zx12bzjsIp z1p;HS9EPePUaD!3_607jgHjT6#Xgl0i&n7`Q&HsXRq~$|VJ20ckNpGw(-HRp`-f}? z1X%C*%pa^7Y%g#W%h3i|^_4pXw(3KO0}17)pT6Oa9O9pErN^=hUP$sgA>cxJQ}P zfAy5dfBxSwxEAjI-;7tlG9>=x3oq^-bIGy$Ln0|D1mxJkUJZ(7o8WRq z74$?*#lNtiYg%D~M3P<3FggH?S;^zc-tbfZ_0lBCEUlZw=|yk3E5FE8$!?<+_D^QA zjcQDI)0%|m1{kWMgQKYb^59c22>)x>_D$aBQvYSvdSQ%LnAnPrN+DGLVrSm_xJ9VqM!X#_e?am0CIJW{X#6pCKl2N%J&UspHSQzt2_YYE8LSu(G|@1|20L(aJVEI9aOp z5-POg>NH<&7UR;02^-3hR1F4?I`H^^L~Ol3MVcLgcSi6P`q)3OUPpdaWjoLQQQ+TVelZcYjyZ)G?O)cPkZ%SiDfZ6@V2Om* zU&{nx|Lpwsm5JzN>jr|=#=)amrFgjltLaj7*T)aGsT%AsnW1nwDXN->2CG0_Sxf|` zB!|Ouzc+WRs$zY`7Uml8D2y9Kz*IH?LbV9Jt+9xPE2B8wUE1q1v4x=Kxj1I5lUmr?jmmsqO5=fac;(>u!H#y>y(#`5 z0)&1)2myZ*9_pC=+D?Wcr2)1!)_PRe4Bc3ay==SF4S@2fZ6A`K!~fig(hHv`SxW;{ z7l=(kTH^22rd#%0HkA7QgB+V*GiA9F6rJzw2qsgMbVW0+K`^VJxV+Yqji9ibZT?0w zndi$HL`qUrA{@#sgzqpaur6$Ei%91JT{s#&&T*uZ^0ViI-s#0U2@5<5Je`PirNvMg zqOxx2x%rLjca#4^m&Ui|22?QLRuc^)8{WdIUO%cke3{b!Vv>13a!dcOYD4&+PwGJa zGhRd4sHD338?aWd|Aq0|)UDZx*`#~EHP4sRb56;gAKt(7_)t%${~tep>{B&8ZyK<_ z$#^~|oERke&u`D}&d&O4FFzO8c(%A9CDw9vlNsFgF*X&+n4 zyZzC+d$E7~34B_@aV8BEz4~l#rV(k@r4cVmU&DuFHs#RvX2ahM^NpiWlLR)zn0-e@ zLeaVs`oG_Sa*mPzYy@KTzxzx2>tJQXmI*(yVs!Zi@c;pz=0JylS=E*E*PMOimtd!IK!&q9 zNKB(9zz7q2ZU(NGHU_rFEcGk!pK9sH5yAdpRdZ7}XY|Fv8hz8OWYxrdm9-NbsM3`hP8_|CgKU|Ml71V2FPDe^t3j!%Tyj zkt|rlY}J))pU;1IkJExZ>K-rrKX(*f_{H`!?>*uC`$5Ra|LIBI@`Yd0F36aLTq z7(@O~wuJ)6=DU}sxJfp6C_J(&y8ZlBH*VYm{?m!97WXB}^7>2#t#_}a{})Hy0M^L}uF59=`L_-J zNfJcYGB1dm;0wgRE(le0VyMS# z38{a_Y!Z<+)-600vqf`9#FcN5(kC-8ig~k5uVyr5TVz2|&w!Tp@RGWzCntvzB*wG? zmVlh$z#oKwxDn`A%5lWn$B0z(DL=4kDCP$9&5hP1Z6iPdI^ialf%)MlU=4YEg~^a@ z^@t#=yr3+dhj#KlOZ#2kK~4T@CG=OX&XW8e_z#;8^>sb|pT4v6uDQ^>`rFne@E;nl z&)Ctrq!MMYc2>yae|8$6E$lbvpZw?R4{xmGj)MQFm(?c^^$#^?s+kp^KTa0*d`x7RoD%|rFb3ckox5d-&n@%)qf$Ay!{>%>-uCh z=nx|C%GA!bE&Wfs7s-?z5nC%KaxDIZue=U|fRZ_!^OFA@tgo78qhFXZ)w;0SD8yR8 zR$}F`3nevzfMsTVd-&v7Ob%?xtQ*en2Ot9fMUXLM*s4sKR~^L?`mxWEvPt-9nh&p< zo8D+!o67(HHLpxgQ5YV>2Q#A7zw>4#+<|@(4b<+B$K(n)}K5)u$^>4n{Pgm z5iYq{R$g7Snq9}cl1fuAX&jgmyfpTY@vadrxnsQ2Kbgx2%UiP;&oj`BJp%p{jFK5= zmHN!>2!oz0EAN458vdW(zQYaCw0Gd0qhwT&|6G6%W-II;)Pbdtj+98MJIvB_gp5~Z zrX-Q!L!Pd5`}4Z-ELK45cV!m#i9}xE1(h5Pwylg&h8#ogS5LR#q2R!}-=KK$TNw}i z-+4sBrjblKe0HZw#BygIPoK&bJuI3x^{}Xhazkb2kFQIr28t;%hgT+CR595SxZiF? zAU(p|D=vO6pmdg{s>S|6H+vHVu4Tb~LjC)Q38n6IJoM5W_kw_V9@1N6G*BeRF3|?hft$CC7#TN2?=r>E%8Rz%5-yuB<$c{$HJkEnXT^ zr>ne^FU^eD9Iu^#ZLnbV-QC9ApP3;4S@|Z=wu@eO%lci@x@G-?Gt_6Or)Zef`TQ{{ z3`*oyS3iki$BE79b-{Dy`e&{?aUA^5qLXd?(iOgNnIL77|GebH4c7<`n{3OnVE?q3 z*~L|rSgKi}NTO<*rq2JgJMzhYCc7AlYO#M1ByxoIc{5ewIDO@$WTCmCdd-&v$#?lx zYI&!LN|sYY@}I@CRvLLD{^bzCF_h-R9A*6cS@%fdE%i4c=3F>ZI7ChCpG#!r1@1?S z$UYL}jz{Di=b3W|h2TFgwz%|8E9iqIZ~xD;H(qbeMV@rc_?h2}x#GBr7ox!0;*Mg~ z@`3yx6X`-xJ$pggq^_0vS>uIZWWnY1M&$Tt%#K#--;o#f?tKFvxOVd!lK&Hd|Hr#C zleldi8kilyjlKJ55JXez-}~Dl$*5Z`XBG28{OdQ7ZIQccjI4CvJyemU&#!`r zlD?51?;QDY{RZW98Iw-t#v1cLT6G+j&^!1I(*c@Hhx z>FbU>Lh^qKM%LGDd#9#N8wtJB{{l3@e*LA(g<@;t$FGy#n*h%uR;-PczLn%}@~U;0 zebi0jU*E|o=>Dy$x4NA7_QNIUW-sW>HI2Tq2eRq^_1nf5LmR19(Yuok87)zCvND>! z%)mrjJ6rOf+tnuKn#MsCgZj7sDH`u)Lluwb_&TkI_ehj~ekuJ=u_8IKRjoxh@J#Kp z@?)RL7i?##1i4a*iaApvcr3WpK{1Jv3oJs8&WI$=a+pL}XSo=7BhwnlhgZlWYTNkD zbDBlXO`MGmA`HFrB+37ITOi{&=lVa#Aqh@~KQZz`$$u6~p4X*=M8UBtL(G;dHqW}w zld^F9y93vJr)KWXmdKXTK+JA5{lE77=)YI=3O5uFM_FuPNYOMO#ZZH6yD>7 z|M`s@e#=h&eS9S&fO8@tLJJTfp=d@b|8)bseez132_z$%*J^SZb z?f*|;rYPWl?Vn9AV{Tl>hNAz)FTpw@V%nhpY1f#FiQbLGrd07>Y>gJ?iu`BU+1{-m zVr#*+h)jy%VevC*2irVL5<|S@wXX$`%0YXSP#j1@*16+Z4cJa7LiMDyPm!et!d_QD z1L=?vt`AWgcEqcH#}uYtQK~>lGUy8do$8R66#l~+u(Jfu(zmh^kRaFl=HM|4dMRkn z<-FKMuNA6$G%3KD8~bRR;rM5XC+f!W3Z zMA5uDWkawkEhnYX^SfS4ItGLEEq5Szm`aR{`I{y-i7~X zkh@Q`qx@-0j}q?Ic>tOJ?A`)O#1C5 zJ^D_T>P_f`ZCJgO;)ZJU&k_>u_Kk$gM0_R3P zr0j+Lo=&x$znKoC!wLxOPNEHc|H=P(>Vj(q5PN)K;+ql(yXL#qSL0S`_@6-#BRxxn{~12u zw;m?M{26hy(R#pskgE@G%$uLtipPx~6^8-+%5QCrDnpg*m7H zm&RypEqEAtH}L<=DJQ&hdplBq!GAuu(>m?8d^|1qpUrUj>%H~aDs~yM0ZWg12ziSN z|MR2%`6wZt%De!admn=SrRj;uAo{)va#i&P79%s7N^cRwE{US4l(w2OQ&qmqjRP${ zu(t&E)Yw1aGPfQn4RmQo7btP4@laCvKOC#0X3ZqWD8M&wyn3~ylHtOMh1a2}XDy}; zixKWTdW{f7rUZwu87yn4!2Q1=9Z~lYeZy|@NLxx=6lXA;TNI=J1y}?&0BpVaOJU#LE=tfJA@@+=%1 z#ji{?G8oeh+6dV+$}ZaFgh;GUm8d+L&{M{hdF1SPj_ z9b&W9DbH)R)-ge`DNW5Q-chZ)p9}YUmopao`(-zkkb+)oQQLA%C{UOhne2UKmw&~i z>060^!T%hHB#ZPD#{Io7?~#03BbxE&ChzZY!82*Eb&Dj=XA*_~kpAzRUYWe%ezJXj z|4zaGBPZMz3glEcd8(_`e97of#^B};XI6|%{=Y;rWvVqPb%qB|r0T!8`Z~Rl-Lmo~ zgyDOi*}N-@Ls1C&xAT)W^@pKGT!Hh5ALBk5tCr}>!$90 z^d_(auamW1eb_wEy=gi2kBCyNDl%~x7IdHdl&au8kQcHiN+1ZZTy+ZL5@^B8dgF~lE3ci)X{>kgqLD^p@M7olCX0}R@O7^}m>|W&at7ggnx$JF1QLf1E zM%kgZVtM>^XM3~2(a_uutHrZHRWFgL+?FcD%*)TMn{pvH=0r)^?O@?C!up!h4LUYl zWbecR_=e{3}najBI-+n4Vtj#2tna$jvPwXl)+? ztM$i{@*Y@SB{8Oq-L@~J(4kD3BvFdY`S%2#(|5yAA{-2{H-RUp>JJRr19U4pg>pbQ~_l5uGB3~6nm&GjVhsy@t ze!srR^zxriZRz>FZ{{x^!@JBqbOPuQ$QH@}*UX~NEFnSsrR~&zh3fN_{u!C{A3S`a zt}qPhzoh^B*Q?IyUS?U>@8s<_zO`iF>Rsgj{JpD_(v@iW=#T<-_)i}{KvE3&53-O6 z|MTqYP2U@xOEB8RrU3kPkXsIQIeqkB$O|7_R)ZBI{zdRhr6w z&S&ouK`Oi3qnpJwhE{mZ6#AdCa8n?TI)#gc|B(D2_@9>)bX|sO7aA6R^$hW^H2-+^ z5B)DLev^y(acARW)9z@W1Q-!s({E|#2RnFa9|?Ex^d;||IA zm?_jGHYkb_hh!LZ|^X#p)L^&Ol^>8g(y0_nYS3{i@N@& z6lKEO^M(Hh`{%P%{_|^s|8%spCjKQw3$PM{|F9*LHogvb;Pt=o&nIDJO$ibA>`3{ihZ$<)iq4=}cw8G# zD6(CI9igac$*~7R4lVI7fa%!`X#MgbmoP%pY|61x{6F}D6s{~t%T0HREatUU*U?`8 zuf^Cui?MP(5DAk0U(D-R_!5v8cFo5RpXs=t2#A&nJoy)NuspQKTLi^@Wa-!}eBd~2 zyw26KKAsUNk$($G^z0}PfJ7*;qc*(2HS~Wk7Ma5D1h9qz5Wcj;_zN)*rFUk8{2%H6 zp2zVlglFNRMw$_N+C-jZyq*zGe$tVrH!KV(CGx)=p=2?YYWjRdPGWQtNRfBuG-l4E zZJs0gE?si3G_tto9|O^+cJA=(A382_BPINYNVQxeP8jwNo}4`b+Gxetz@01zBIQ&z*5PPs1VsyX1}SFI`GI~ZaE1G?*;-blqggtt@*w{ zt~4#MT!rQn3S^fZK|399+xP_JRJPj(t1CTsBSU__iXG%($=o zCC+fK{_C5??Ug-R8C3^J5NF|ynqb81e{uF*-70%1vR5HEJ{JFa{rdff@Zw**RI0rW zOyLcwfA6T^CNY|bmK@Fud_EXP$&7-CW2?`_ zAOn7yEQ^`4h(s+_cBKD1CO|~$-%aY@WjdzAmIzRnlF6~{DhJ8C`e*)mbo1=_esg`h z*va0Mc_Bxh1*93Ngb9eZ-$(y6)wK1PW5-VL@b{8cj@dQyo zK)gs*f1ZGWC^)LvKR1dnD7^w43AUeKxX-cyS*opM+_nza&%!`t$<@IQ;6FT+Eykiy z|1R;;7F*N*6ff0cvw0Cd$JPzX#6+|7r5>?$ZGzTFSq0Lo;AI9jz{mNaE7*s*sh8#u z7Q!1Dvxtd&U}IZWRkJ67SX4TglSflVM(8)6kq9cUlb&BrHtf5BP%AoGCtd0eX+sH8 z;PQKjig^URD|0PXk(BLc`c-Y5{mh19#wE2)jemFP|JDD?|Zs}yg>;b-$R<6#_nrk-!a5E_W)lX$khh7?(X zcC!1h_ScXob##tl?93qkH4phEmB+G%k}}f4+nCjhvI6$vqF$GpMhf1*trxsJ;uPw; zMR|yn@eRnwDY8)b|G3{*Dq}GCh&6L%BTt3%(SbHCy+~H$*Rcfl{*T~+F0!2^Q-odf z-D}s7lXGG_TZZAOx2;MY1qF~bq!6Dp4o?x0h-Wm zHSX<4*B(+Z-f+rO-Az1h!}1}F0{$P^-7NZlgX0-I%~iYZVWak*=9KdpExEDr{F7WU|S5 zCLJ+Aim89E+$^Q!T#N*5>}WAPUM8EZw_!dpp48LJvaQ5RT+=%Q|DnrC$wPTKo@8!G z`E#NlB;P$D-}tBRD2TC*C7narYwF?u5j&R`@Dp|Zu?3b~JRHucf`k#i*es#-u(ig2=rS_i`^+t{)iE|jGUJMPU3TU-6A zfF^~5ATqq3`V+`(unssNnJBSg30QizNsO72WeRg18I2y5ETiBoC;qi*|JCq6fA-|X z#J{}!=T8P83GhGX#K*U|)3*PQt)Qg;d!uh;D83di)n`u0A&jWiw$S444E07R+3*Ow z{AcW+c#Ad;|JB}emThRPBg4UVs*Q93^T_|HY2AHrrqfEDp^Sdhw-+TJ*Q!f^{O7%e zXWf%_L3)LkV&~O={n71H_z$W7LK`K9!rMH#kFC^M5A?`Vmimg#k0G=lf+XK-lE$Yt zdUj!@tMJ|#Jl8OrETT$Y%fG2}T9zkNRO&GGgcb^t8>cDJpe&fWLii7rvY2}Kf3lqp z{G~-IJc+R_2)xv;w8(jr#EyU;{%5pEGR+@p7f+I7$7+ZO?ej!PoFA4>tbJ9*nI}rf zM)ar%5WzVpFT}gf^&QHxn(kByN;kU1IRvZGskxR@=_un?&jJy_K^B@19_xSVi3#s2 zc?ULss`%!K6KuJ&IKohdQvXE*YHzb}hBx19k9``9DCV$d)qfb6w^gx0sUUHA7}LQ< zfT0@WEv|NxM4D2 z$QuIV;(wPGRd!~CV$zGj?A5<}{olR%_g;^^duuj_h3@tE8Qw+!|5<-m;Rq>mcQq4K zpYQP>;v<0n0FaS6g1Xj?#&FC^$9no);M|g%e$8d`VI$RdKuo0n`;j;LGSW%p2;JUK zaUb{(@qeGk{`qaw+W(wdJ;9jsm*hs&B^&X%MZhSau7s`0p z2uO#(8anM1t(KvTQnG2N!(N`G@ARygeVg5IZlKk}v*P6MjPsgC*ypK^4i2%nbU-2ap@WHnEM?d=P(8w$HowXIcCKP_S|Be{K-&q;RCCrPYs^z>@9!$IpUrVSpIshAhA$ zPwreYqAj^I0bN_ee;6dp!(P)EktB#<1%m$s!l0$LK@C%(RBT}02BrQ>>)Sc7J*7(g zYi=ex^MC%Lu4Ajjq)DSYL^*BjF}$bemB%dxS}$6^OcKOFVH_mU5J_O5|3#zm2P#5LgUeIMjFre-Qx`I^b@cJ`Tq-jk~<_$fcu3 zUOejMKg%P;2NRpk(&}Rlwp8xEGV;br&qv|a<*L_l`C|G@NjVouKY_*Q!~9eR|$!dX|fSCP6v@W ziOQqxWfGa_RTr(E+?Jh1N@n4tBIh;NCjwYo=U{Pqijz0?cRXXUn%J-|NLPj;Qre75 zaWux)@ILYyYGuBNHhnR%R~61Xd$tw@9BK*V^(nVj*gh64lWrAW{?8w~e*gQ_=46Wh zhxpfr)VA+B{Q4j23nTu*wMS-2|98$sixCR`bMm7K{O8M@3XkV+Z>z=^F1f^*dsr&J zE0raxPYwbl_)otnQPoA=Y7|{SRL53EM~tngZI|739Bm?QY<)QfVtIPyFTGieQ?B~v zl^fe!Ir@=-Hy+scSDP!9qW_oRKU$Ih96%RpbzVvUQDODh|9+N&VeYd3wT^lH--&-! z5^H8=P!N^kq@w0TS~coGP)4Q$-w<0!m-Z=i7b0#PFac~0vr+c{17GW!1naN z4w}E_)&GZ-=CmxF7Mo4tV}{Ut;5Mj0mQLbdl+DExK#>`FrDYUqRHtR67Z@)4Kqcs_M#6E9m|3VA-L5RW;bf%E)G;F&kn6c;;YraC_Hc{EP;| zRU`;1um9<9-@Se3khhN>IsEtEOkR@uclw_$jZa*svO1;f=s8{9MSunWxlG-GBuoB} z68`7HGwq+e{_lk>FHYfaFgh@(t@RJ!of)pph5wNJA0$ZfpN&-$*7mTU)#~Cm z(^W_5|9)wkheuiVbDMa^nuQ(5?Hd2ab-!q{4+9Hd1d5F z)s4Fy`zMDYFTy*Ikh|T9LN2jAL2~+XjjWH|Pt*TG!oDsgmg2*4M46$*onxHg-X4*R zLqcQb_|CQHAnM;U%H&|$3jt3pJ+*vkk!~Yb)(%|<%$VcFf5utEfv*m7QhLawDNBL+(&qtF{eAB)af`b??wFSDk?>1Q!Tr z79}DLr-iWC{K~Qnb-RS&A`LC38Kf&oOr9V<9K|UO^C5FBt*Yg#hfba5_5T{Pd`NY$ z?SOmf|8*Lk3H4uJ{+Cs)rT^*IivC|;6N3T&d9yY3?<5NP8y_3wxXN6e9(nh2R}Hiy!8QAdqi!Zb6 z_1X47mxEyXZ=a4z+_2lrg|s~@5RX`_K+pt48wH%6&JN)Wo=;@CxCO7nLj_l!Oy;~V zOcE5s;Ap@mVbj`%<{PndMLd{A`Oxb4AR^SjbkNL%Gxz4eaqapP)w$cva0Z)ACH2Bq z#e;{}H8+^(!e~)UC*iZsj?Ju0I!pup8ReHeBfU#`!f_<_EeF2fVhFI6F?1bo=9g!= z$NGP5*!6Gy`_|XlHP-lzmD?!&Jo$?6%csGvtVTYXPyLqx|KZQ89+dj8&|)g$_gy7G zvml73|Hbw(I}Tz?IylTi|MdSFO#PQ;M->B1ga1fPOMDQS2;aU)PZ!Dm+0tflyZBpk zSiApE{?8Gy6q7k@O*}rl=A<=@`;dXtybb;z3gn!-P$H69n*99n>RJ&lM@}!%CZ6rs z8(ruK2<^L`>L`cVB^wK-7-;NBtPsCO;*(4R#}G0tibib=a;#R7C4Ny_#G14+c|A>m zT3dE)JRyTPu=n?lA}^vTyhq#y4~CWOwcWfsqffc>`cT9~mQeIAeQG5i3I11H0y}}8 zO3&^xz8+F>EJQ@n9?Ih}7>ceH{-5{duu1}tz|}=lTw7WdT+M+mZ|0eU*gv4rAb)5h zp1$&uA-2eycwO+RWW2Yza>FedyA> zJ_08w_3VYKub28S`d@4~#{W#mpXQELl}QT8fCaICK6=m>ZZ1_`{a0t1;NQP{HPk#< z%{gfJ*FVsGh#EA@{Owz~=TR^8fB$L(+mRSdg#KS*|M-K^OdX;AE3+f*&6OU0tI^}4 zHAU9rTIKgoKN#)}{&PI(2DRl_H)shPP`1^%ja6(j2QxyL;9s_HsOdl>C+b>m_wbHZ2B(rJ5}GT!Laj+uMdM z%JR;6xwA;JeY}X|9N;im&bpo*v~NAvRt9uC)W27&Wr4g>&}0Ay?_yMsarzQ55M5fc z6JK-@P1PddO%J6(N`aF-^=Mfbe+mmPw-%*XZ5rv{-$cR}%xQUcQ6!1^f*Rq>1h+v- zWwRM#(#X-Gm`w(6&(xv99>qnm<9rJO&mC7>AudK*+io_NjII26@kCS7U3W`HtC$sI zs8}GmCHmTGjz{oV!34DdKv0+96cyY=ab}?%)7kvaI`dGLoGi+ndo;!WY)LBGzx7}J zkRbKmZFwi3i_cE|S3&5n@Ms6Q5gDj-;Xh=4YYIeO4CdE6hEPvpdh$&$F`~02TU_`L1p*04ogJg#Tm;+E z35kCd&S?~53DTi*Rt0E>HpJFrEyEUOwkZ@xLinH02_moFGX&DnyrO?Q9WL!L%LjL) zMvSFXBP4-=XFMfA+SvI>X?E`Ldg&__2)jKZC+4LTr}RJl?$y-09(!reGm+R!Y-wy8 zb5}UJSd;%ODH^c{UqWudfASUM@!7X{P~w+p2>jIsG;z>hJIG?iR#Wkow1-Yb>QoW_ zFG2x=Xz3e`9pcE=sbM#>zoU+v{5}SW1+5TCDruQ1k-2EVU*! z_&k3m)wd$An4`C0QC`u2;q}c8!xn_oscqCrOeD;e8oOEniWexsn2b=X{PAooupQ4_ zcx5QYY#t4~hMGdr%j1>)+N=Ni@Kx%+oOf>PboOh-8&pMLCH>#8(W@2pUuUnrR=?@n z8{9ZBF?Flb28CORShZ1;R&+sW;>F9b=gRuoa0X$nSDfLt$3{vFJ;hd^>=c(!+*E~mdtkc+F9T~FJHYC{0IJ@cW!U# zJm#%6f9*2VN-y8+PZ*Mxj#)mJA?_6m5&j?OLCD}&#sb2%_{hj)u&{%KD7eOy<5cls z_^}KEfqI$gvzK!6WAE~g;oO*{(u|QcRPnLy=Z|y3ITx{XfpfarwaOT_h*cih=nj1c z7hB?jHu9prdOk}j9>Eikc8%1V;bcdfB%kU)t~K6vCrZYZYAkWpdcuK-yJ3C|>>p29 z=Atl}b=EbqiNl$zCJbVMl$!L}lO#y-s-m9UKjn@e@rP1HFupn7L0vvN0u*HzTN)Q(`C5ADOLb36}cFD@3!L+ZbN14KhF(I!jy z3fbX)ePfT5P?i2oCpROX3#J|RNbrkKb{=Uk{*`$w>eUdbfqlHLIYinfl!z+e0rMI^rDo9{6a&&X5+fxt| zIn{XtKqi42yHd`oF>(5TiA_=2)8a44KZOk%w>Q&je%{8~X+^SW<)c8)=^Kyd@ko$o z1#a_)d|IncSsRfs1pR46C z*Pp@>cd(DT*VZdesNx-vW zaqI?(xR=yums!9TR-%Ce*|!a}ScB@HGC794iH;Q5OY1C*0uw_MDLuF+)&J`s{=*@2 zl|lXc>dqDpwyGvUgFGt;+Ns+q^Q|SHdtL&c) z-%0IbvB)Vui&^P~t*HOHX)nnDP2~S9DLAQz{WSc~6k&Jhiv`_s{&Q0Q)$onqTr)Qd zy-)lL{^y4-`28X;|EJ@rgqE-S4Yub~r)pT=j~)?Fah(Vi`d_`jq$3=2+TG6RVFdb1 zj$E9%NCz9N6gg3rOLjiiC@wmJ7tVA?5flxJS&3i9QMZ^IT zN)i1FE4>w$#DPG!tYf}lDrZ9^k^E;I66yct*_GVcxC2eD)t6q%m37@SU$L5u!m_>i zSKvPh%{EqvwuuXPk83vvYX3+Uw@~Wk<1}HLUV%F;<=^V5ZnVdw!6uC5{#-4(NE!a^U%fu#O0ARz{~24M9v^WhdPVpTeTg#` zo~0*$ZGiuDvh|5fH4U3@XB!2>jii#L&SyIIQ2)-U;RRuo)PIpZqTv5A3(0@h!v8b; zj$#e}k3`%({O92|3r1U-^jYO%N`>!iRcdK zqCe1^YWmXjMfvD0$$3Rz;F>Qn36Dd~Sf;UIM@t^!u11$v#st=ZRcF3vozWaKK~ zu$#>c2~H)DrQ-sb@ydy(rA0axm)BH+9fZ;+oy%)9jPgsUPc%7zRNS^XPlWSD$<{f35{vY~(brb$WW#r~a{|jTi zKREKq(g&%37d{pM?<@V8!%wl}oBEi(r*l^IYuvQ|H&M>vIQEa^|6s?F|Ks{HyARH9 zv6;?$X$7<9b@HG8JLahgoo1Ok%~!6@Y3zjkv+cb*z51_xzkKc0fBi+eG|;YlR8q)x z?)YqoazQZ=s-(59DBT^Mb` zC@_R-6UuSLE<~vTvvAG#C9X_;w8Z5w4${d87rVN;5sb%ilEVLtr&Tcse@1LYv0Fq4 zr2iNH7>htlwUXvUd?WoYzW8s(%4?4t+V9^aDO1UTRmyxnLpew1XcDCS(c~8Cu_ryU zlWz%#z@7&Tgg6itSgCLyB1F9savH-CWU0%@g((?aZb?&8cBZ_vGES6}-*Wks{Z%1b zv>M%*+1%c-nL~Q5S}W$0lisIxWnBW=kv4SGM5?~=8^NMVr@>#7O-!jKp{vbTxm5N6 z``Q%4fmI1+f^^ve%0Z2#v|D5?izneN-NB`6F zLX{^e@Sm4_(*KM6=Qn4BnvZm>YToLrX?N;i`d=6yJ$Op@=KKLHCN!_tK7wbG8JYR# zr>=d__oF1|xc035_$txn!S)>W$1fXJQkv#|K!8czbx!iJ!}BZciGFqQ(7+m%_CuzC2@!Iam*;vwxw9u!W3 zG7<=g*56?b#5a8dKToqP+i|>jA@9gk9Db}kYE8DNs4i8;W)W$(iGQg@DY#Mip96(% zkxl=LPJ`0b3Ce{8L!M>hS)3%9i`wNJ0_1f0H6oCS55^--zr6#)XSGglHm``3%4zHm6pme)sD9^%^o;y5x;cperxApY zunPmN`rX@vUC4gQjbRRIJYlML#QyP%wc>CtlAmRj@WBM{Vb3d@46uS?ZFy!-I(V*4 z{A=^tc_EMg=ciAWk61oo4po=mzkN&ROW>K>?^BZhd^FYnD~>f9^ktTL{6Fbw_Tnn` z90KTkyx#fo4E8?xF3xs5x6zN5I?hiY%F5UD7v16YKW#7ek1^NGI&_{o$1v_FXq%Y% z^cU1yN&e5|`Ol>Jo%cG>|MdC)fBn~G0e4A91^zQrHm$RpGvcV3J(ATl7kMOl>PKI& zpmWsfuYUTF@+QL16m+8b!lRr%GMjiN;6JE+m$)eQkKs>_jw4DmSIn)luwX$YN{bR} zBzLxheTy}bM2L(6uy9ZFy*00$HCVHlWFjx0px{i}D&ZZM*N|9_Vn-Y`Iz%c^vLbhE zLuKAVn;(d$kP2qOs+-orcNAo%Hi_6_VqiXiHbQ%FBl3j5dRlz1A@jhuZTpk;OSAJBvC3ZSz9StsO@z-c^N0qpl^( zGPfLX(f9yi_wrM4Q6}Xn*%9P?TMk11<&z;gC^|OW+d^QtVi^52N*+$Cp@6PXy-QS6 zsSjuuk#tVG1#*AX#D!R6<+=O!(}f%_TKH8zKUE|>fgze@!Kyw@xOZtS!ej4wTgx4e|nFr;eY=1 z-7^zAs+R}n|3B=#X?Rps*7v zUn#22u!ptRy#A{-53c#-30`*TI?tT{bR=5w@bt8)c{byv`CeBO{Ga7ZK9lhqsI^R8 zBUaV6@PdBB;26__(Jddm@;vZ1fsS!!MHOq+RP%pc0RQLMvmQBG|23?I_v-Z`DW&l{R@v?H*mU5e0B*bdQgq*~kj{hyrIHFvhpwY|?? z3T#CGS9#-iuByy z2dfUMg*k(*>?}@=vK3sce(*zQf&XVA{vX_?3A_FX>@5UXgs%b+buO!XY)&+d_Co57^4l`pDl)l7B4gSJprBTKS$Smfa?uOQ( zIdkS^$1fU40PCb0cwzmLtNxY${N2wT>mRXh$tjy~pzKpQ(@I{m=fH6r>6I2+r1kI5 zTH&gFdv1`Lx=5_{gpn<*&zAvOKK}bn_&6sQ#1~zCKku5JN389BPo<5NO+3`FO{7Kl z{Pdv{$GjKlkQ;SBd(o_aus8mni?5$kpB<|0(iV<`|7X}sllJ}I6aUY+4NI@_@qdER z-Cy=&t?@$GWCCT)cESVKn&d0@k7+->nfVtO~xFtI0 zfb1?1h%yM0c)}LBIgsd3R%`oCTiR;+BC~w*L|?3u9lAbh zB~Q7ToZFnWyTxp^)64xgX$un=H{DZ^SyDG4~xCg`JuiAtC&zRIYrvXk#b zD%5#+x-g-!C-oK|~iCty?Yy}o(#|~*cN?OOj3{VxW*cHp~> z&yIZa&H*cb+4o^qbz`yme|BJ3snCLyR!kcTU%*wMj%GfDqlY3DX^1?c6-PdmVZg>u z^nbdfl)K(#?jgx`N;&+2nA1wUGg*$;p@FARQd;0RNx?*@f>Y;8z1E`*$D&1=+7$%v z2o^Lds7URF&*Bfz+6#x}yz+yv)6dyA;$?`+XJ)ED*{<`vQddF{?+l5TEd)Z!=WpyU zqB?d-2N1mnfWdBCTC=iw1O@&Ayq6(9M_-p{l;M4VqIeYI*@uHav8*yby3I(g=- zsS(WC&s8;qhLOr~)MaQ&Yhn3IVSm?Je?FKxbt$qh*k|fe88cqsiUnMwET`PQTY|(R zaL5`toxz(zExO4n=rBHAIr#1D=0)8qs_Pv&TY5#}jnE_(O3Plux1^obR!)Aj5*t_M zssjfihbDtjik1yR8F24%k8OblrQ-OML$XARAuK0}6lCL;iQAR<7x;&w{oijXI9B6d zJKnuD=(MnJ?6zy&--2!!{6qSm_KrkP7;(US3jPnZmNyt{>E&;Bupd%>nMjXy-Crk# zqqC1iX*&crA&+_~y!o4t9_=^Cepn7#n~=e&S^a+9|0S}i>p%l_1ye)2x&sd5`Uu7C zn+DSVv{`zn?Kb`?f0E8pUW)_N?|%XQGyT6#yQlmGSEOavoca|f;{Uv>WB@Y3j4`U- zRw`K4{lVy(B8PPe^e!OwVVsZg(ueYr^kfW%YH0_evR4T&srf(Lh1761FNGG-k#Gl$ zBaLEZFKqp+^t-d_HQK9a+z3&kZY>Jq$puw-R^u%**>6I6~Ezbbaxd4o3juta3Sfm>i@4r=I8Va_EdRI20k*pM&8cVyJ486am5lb+=gRcTw}% zw#)|2fBx{bo_nNjRB*xBE0^!1|LOP3+ooO-i?dpC&Lxi7p}mcYQ#Y~*Pn>msvEm;F zU%YyAacbqSy5Eh7p^x;h`FVFiV)(VDW=61KM|Y-!$#W>LXbYaQn~cJhI9_VCFIwvB zwpsH-rMLjScHkfOoU}gS?Kr)*B$nS-X7Ha+yfUYvvU`mz?8B1RZ}`^7 ze{Mfw z;K142Htx}L8^^A?p4q2>;Q#sY3f4@GDEvPQvP#pPwf`@r1WpT!`_mZwKNr1N zicSs*WaJ|*zY-qCc^zgB# zwKOhc|T6f3&rp zOh16#+TTz=g&J2nW>Mv+!L*C>T~w?mVP{ZEz<&3{0j_~t1CP|x3RV&+mlqnE>pf?12xh~Fl#Cns8IKW|pe%qrzb;Hg7< z!)&O5#bctoHt2QO&&s)KK18#F^I=+KwZ>7g?UbDSV@|rjG^CV*B)+1p?aT5q&kVN0 z2w{wF=A~9gbusfonikO%9fn7()a&_6#sDj1B!nLDytQw|7j0K z5qO*iq^CYu_#IMg;lTD)PA6+|BZ0Jc&UB7f{d8vA_*4h{XIV)6>l&?pU*0@E%#qh_ z2u8h!h5;>+>3`}3-kO(HbXt*fBJr=b|55+G@Zz5p|M28|QsE)fv+vKZ9f5d%@zXcf!iY~(^nX8}%B2~2RV+aC9PposttrCM?`XBECckk6 z2Y%;jwb@bQWMSnoC*P9Y%=SI;%5fZ;#f&yqixb#+_gHp5KM_3+e@=*;B~}`onJ!ic z|BsSeINi9O6_UWfn~I~;b%cm9-xost7tHy>#bz-b6xS}k@M@GTsKUqpxgsm2X!Il5 zaa?XZ=r#3xxKIGT{j#LJMPPkmpH^ghLIgIVEaOUFWTyHMul2P++tIOxD(W5i9$ias zCxfOCZO)a|I#@ECI3$60OZuD2V?x*G6?Jlk*DH4fk5t1UnAm{GlM53fd#=2aw^O9f z2<<^ol!Y`k4+@GIaaWj{hc-wpNLeFJ z!5Z$u*g(Mg5aQ#B^M~_~DIdS3fV?QAu#Z8{6JuqSDj>;%vI+8Xc+n1Ur!m4~Pyyl$ z0}Kxcm?g&*0|7VVrCB)uZ(tFJ3vyy-nn0 z35wCEh#&tN9?U$-&t4ptF7ce`|+C|8LPh)^htVO_HL6<|-8+sw zbjU?7FPpEcXtfB8-`#M`DeSjyI9sRvzr>abX$Sry#3|D0LVQAwtY3gmP5l=IH5mU& zT=P=Rdpudb`mwigS`oL(fl8s5O3ibrS%M1S1F+FJiwL(tZ<&BM4Vt3=X+Rc@>@7y7 zXTZ3PcXWix(YXutBPWLvSZMs4^$!NCzUj=sEb@O^Jgn3~{|oj1;J$@L#NB>kw!TJs zWcqM#+%{3DjCpBu3e>W)`X&SHduq>MLs5a6ZL$50VrV zK&dA*F&DN^suyAvgS@aVI(VK&vMyMJe@&Yrk~m<)UxGyDQXZCQxGYIp2|}VDWQ+f& z5;+1TLS-bT;Z}B8Al_A%Bg`ku9-D|?Krpx!Ay)vz__<#C;%_jfn*RKnbVla%No$rRC{%gI+1k@~@yiCtwclCpW1fuv9uY`iUv0)cHL;izf$ZjE7 zLY7miL#H!C%|amB8eSHk(>OOwqGE`g0@j}VpY{Ua478mnpQ)TYoG7dG;7`z!3Qyj# z&?jlMQ0vSB;u&VoKhdhIXX(%oey(YwQe6)H`3IyVYq;39U;Sy<`_0sQMU+(iKV2?0 zQxSgj|AOUMJE2?0UPabKBAL;aC}82#5Z=M^6WsLviQqgvCX`!I|J9@&#}Tew3jw2! zQM2Yc2A~1T>KqhBh>VM$TCe5{a=vJz7!Z@~4erfm{>W}|YQwUlYI-SKEt@;nxj3B!QI$!?o!p|lP z`p@;@_=p4JQ8^Z#HURt|D|E@5Q)i`(1^yvvR?aJvvR2J%d@7BXKa2hsgYI^DC{O3V)V#iG`eV_gpj}Q6mT=XBpO?PB>2Xb2N z-?h(l?^yFlC|ndh(-_Wb+&*=Jr_3x<|D}_rqKpT^Ir-$sXS}T_k-86;0a}XK%6kx* zYaeTt@#d?SEmzFMrwp z_1kxK9VFoY>?fBoV~Jl#jbA966NM~qaUs}S2M&oW~M6|Pf(W` z=ch?ryHv11LD|_pX&ZkvqnZwtmETT%*dFeuES1d z^@~4m`Uid{+rgf`HL>Ppm&x3Wk?uswnolD6hImUK<2c>nZSHBQ;6?H}BA6K5Vv0D?)q z3I0#0b$OEgnJ0nHW6EqJ^P99kZHTS(;^RMma>eP^F^H%$x-moCVd}<3OBmCX-XY(B zf5@?^e`y?(4V032=@DX<&g3>j3)2t7* zb4WmFN#wJ6w+j|D5Yo~Rx9|U_bSXhMsnr;ng$b4OJSG5nvxFQ>aoeKGGG`j9x?-ru z&y5pS;SyhRH!64-H7RIjzW#GlvG@By2`p3m=aq;!CU*HFGlle)C6^EN{^0oS{P^jQ zy@3JxUwl8T{?ULF2}GK9P8>65?!26q-7ZMSty98Hn^cbRNRAAKdSQg6k6l|EJne6> zWO}CrIt^P~lDVBv&EXazc9UFoJpOe_&*26eszfta(R>sZt#%xg@nCKO2 zsN$|>9h=sb8%EKlRl;t#Tk)UO|0(Su3eBT%6#wvw78N?wqxJ7)Vx7!603hj8>ny4u zT!`%%?9RHrwx_H)Bn=0zX2(NR=&1k4=Z;V-EIle!xP4aP6eJkQDDW~Sle{U`qFs4o zWlF#KI|MiO7sa6_b!{#hoS%`(_Z9;ibM(5QvhN z?#HAkBM`yWiw^4xd~pLb}HT{`FP@R<+xzv?IYp9V*~HsuWaDcUD?K$Psdw~B8#?P#r=A`%f@voOB%z18PR`nlydO9N7|KfH({`JLcvvPYk zF4g$g=c{i2bqW3->k#R^JV-M$$TNm{Xb4DZ#-O<>bOO>V7_IIAJ1~$bGu8Ek(;$8v zJ>h^B^<$~6>Ax1cX{p&3xvd#T)J)c0C2bnb7v!@QZ=~kjvaflEA>{l~xkN`i%`Eb_ zMHAuRj=DXU>#IoZpO4T|e+gT+?IaY${_v&8jY#LquoJI<0JXt^?hn$`t#aDyZ83vW zgKH*|JLvcWi%RPr?1$Us+0F!!#tVZQz~yRvYgL+A1lK>3$2TM7nlEz9 z@oZ*Td8xR5|5J`n%5zceF~4m?k*{h8x@3eW6Rx*9E0!p|k*t^|%dvLCDw<+`fTr;F@IWh81dIhdEFkN1ak*)Vk-9ArqR`aV zp)joftpCailm8?1|7sJSpK#?JU;im5|0hs9s5p9~NBvhUo*MGZc{O0rT=v$yzqlRd zJ{X>~y>U$H`ln%~v)e^mUtpb^6}_|FsVVok^RuFlbW7R?Gj&d%(v*hGEJ8S&wzw5tR zzhpjDuXbws4Q7)SCjZBHz7K64D6B>2a3KBBTLBMvn^>*%gVyNcW> z)<+61jv^KMs$~99m!+5egn-b00)JW^{KT2O=G~m(b#>0$+U&xIUSh@LSkH}6SM;c0 z1f0Z9)^Wyk(QEtsy~Ej7Z`JlqN1n)uARZ%6zz%%Z9TveUZIkzU>^w3Lma|zd&zje~ zU$2S2r%da=MuPwRV)NuMk(KZz+-gdt(k$MeA*$}F4}^>HuFj4IGZp9CWvW4$N8%f+ zsf|#9Z^t%m8m-Ws*RzHYf5i$WaP7OUz*_^+$}XByiA_l&n?;I6G4)%nFfhSM<1xN) z{wbA)i_tRHV017W@}w9umww$~iv!<2y{|e5@Y3rmG(LpXhG5ocAYR(Ti~yyYj13`e(jQ|S?;rI1!~q5shTE59gJHOiXbBr<$`^$UjlpVJlpaMuS5 zx?gdQ*QdsOoEj8KhJTxQgS7sO9)GZ<)vQKmEGthl*K^c6 zZUXUc7t|-MIe_y}6zhMJ6Y?HAykZ+F75qQ#^29q%taG0T zq(&%Dw!#y?RPQS)THNmELV#Co0PW4YM%Xj_NSi6C^`#g6zdQ|OcV=GNBtX5dgv?8U z-q8N1epLns(^tBn7ugudSrX1vwBY|ixtHB^R!X-YbhduFGz2stW|36 zu#`Lc9IGjuPhef0Xi)}xTfd;&72!qy%Kur?C*86B(Gd90F8M!Co)#qk=brD(qVt|^ zO8yTgbi^x@_f0U?oVw9XNNr2+tyva{)m`)bFV8_i-*j4ZR?VC_ufu- z^M7t@*?nwh>fcenqKhW})(!tpR_X4o7t8MYK%h44{@#QB@Bf$lpJ~B(dZfd;+)_aH z2FtmQnosgV{JLngV&3t&W;@T~n&7(>u%t;Z6Z&6#JWvhtZzAG;JzKX<=j`f-cyfHb zr-Ua}2^L(Nzf!>a*1Vinn)#k`)?%xd#;aa5hW*Y&_^{YE_R#5sa;jT5TxC3Nlfs_U z3%^71EPklx|A&0Ds!MehR&=BqRXxQ#S!9;6zHeTXNV5nk;*g@;t;|g7J*H@7P9ZuInX-mq zs9VE^l&sv=sWk0q40qVctpv1pq`tL_t*?{++@|SS=Z9N#- z5cQli@5IUCIdL1?^pchNw)9#uoZQSr`R%{#t$F$CycIn?X{_1$st?ozxvrX7kT~># z)TCF>ZIvjWsDr(uRY5iV-@!jTeptRCdO`nFHOmbB-_LqzATXH|tR*8~$(J^U{_j_R z@$dc@4WB!!eje0rV&)ruta?6P7Hf6LY+G|C(1iWRYlwUe=Hnnu8_xop7B;u}}*L7}o;>_vfl$5ZkF;tcBw|6cU`WqGNdo>@w|yY|1>!eImd@D~}mJp9!g zR~mQ!CE@UXyp(QNijM!xk9Mw3ZlnKuNtpf@M)jYmo#}t7`cI2m_xb?+-)H38t-*@$ z`+rUE`TeG)m%n}I2|oVewL3ogV}xAGV8O|8;qsc6;u=CYA3e(Yx~zCG;J!D|rv?9H z@lD_()pqEAAz!_Xc$YtP88TUk;84fQNhk4LRq*DM$$SSOgTVCdq#JK6vm1@}zffDn z5vwEaZI|xBK2WQN;*C-w^{@VY+|Wn+Yt;k`{DiKsDnOb=UfY*-kzwHd{?gQltHtF${^xx z)mVT^Dp&Q@2ZoeNoPGR?5Qn6BIc&w0gP+(eTDi2yDBO-_J8-e3WGl`zG*^la(hfIK z5aVk*nquKHQ^-Ocvq%=|zclc}Z9ymzSw)%+^yca}n&cy?qy4|m(ER7Je&OM-PBtIh z4}^j^FFp0)L%oB$W64y)qfOGD>gD zYm?e*UK;;Nc=*Z|2K?u*IjgCqU#_hF`Kz$fNy?FcMXFXahTq7@zEAZO-TsGFI zHV+D~ENZDanOOzJWSXbm_yaX5V=cprwamoGJQ74~WFILf#1)YmJg5i#zdm{5U6E5V zmX;iMK26?LYMppRICXI|y@tK3@9v2Ip)ynd&Xc|G&L{qL&Ob(I5vnB<+dA6+-CC1z z>C^v|&G1e@vgxMSt1m^*4Ka2esMJw8oQZ+|b6ICw6#qxLh|VWA(a%8?+yR7-y{ni# zIol)PCS>SALLTGcM`486iwQDm8p|zt-(ofe>OFS_P15ki?75ugT48vUnipf9q?53D6- z4sjduhbsK^##wh{y&WCDBC;{Y2l=40ZhS^AA6i*eo^WUN+b8T2;ZFH5T}X zOQJUa&TQS73ME%Y#>)Gkz2yHq;Nu^5A1ea>52x4T(IhZb6*_ts-X8LQbQ(vquS4`d z^=Al*qefm{hI6swleVs)j-LD<4?Bm{lO*dx#G4)&hpPPNG>WZn#o-MJcp#qXg!lr8 zmzY#dM*!#-D6>XhvNncUJ7cXxH$qveLUiNhWfeGMYRu_#0;2J+sr&r+SKHTrksa^f z6{#woHQo3Bd_B-H*3S_PYLEJ_-vG;%S{2MW0pec{^_W7ZAV{$G5@G^UEye=$>k zsLCHQ{-0fbP3>2>U60lV&!e|HoW{JPE3LGYx!)G^A#p2A8vQriRh>L)z*gt=TaNy7 zB{_?1g7rGuaonyJSre4I9$(wx&;eH z{{jD*K@S@Ar@EnpG76Nxpg4F}gq_#gMy>zin%Z+&AfBA?-P)=$;?+~B5fV=55Wvn+ zTbg<2D9aEmPu4|^1o1xohfnp&4jMx!6gIvJleJmYV03> zW)49R6vKO$=?wFy0!Sy-!=Y4|MyD|PtDYS4InXs8FFTIV7?E6zq%{6mp9`7 zIT%ELVPwq5_rcM2;w0^VVQ!NySdgx652+r{ zAZup(@30kG)W?6mrZpEW)^*{Rf7gFqOoEgzS`7LI{okie+R8gZxEy}?3fPMbk^`*c z*mEY9i+T4>)$LgqUDnJIQ~c+Bef)Q+JB$NmT^7v5f-FfF>ypbGj7N8cC)=kN>o-ct z4D2Agq7UQ?9asUk|MU&}bIflc&18{d8gtJ%^@8(H9$a~9w=T&bS4(I954jq-^}vAx z4g0>|^liiMJ2xNsV(rVDzWwdJrH4OVx#p|Azr1|^foE>Ld(D?mezarX{nHM;@%X}Z z>1oS0esjx&xvzgVe(}d=EqG_k*z-OaRx$GN55Af_@~717KDWHSZN{h%&O9kOefe8` z`z~qO>D7+i($$y0J9yw5C-xfjSMQG8Qs=JKr4yD`XC3oUyyFBZDH;8=j^+RT@Bgj9 z{~s$rwI3}zDzpM5+N{(6s`g8CpRo1c-EK45?)i%|-oE4&>lU7IzDv*V>$j5|;P4+F zk-k{km;)-D;gOb9JbdQMc>9Jw7Z$I%fv3|c18FaUwu>uHtNr{_ZN9XsgS-Ek3ybAc z=N9*eP2g0M;jfo-F}wvS;K39)-bWc23@9~4M6=!VY$1`1Y_9<>*9Io5lkb%uzV>Pe zY^ADyL`P8l*Zj&9X=uiagZiM|uFP+Kx3`bqSatZw!QTx8kkgwt34hJldJ5_12b}0tNo~B ziMza9!syZEXuEf-hVOOLYe*2yutq=I>#B{FPXfQOnMrSu2OB3l7X%nGEb_-=pw?JT zJBAkxZ{irdeN~v)vX+t6mbT({u`UXXCntpHAdXGndWBwgf7V?z+9_o@w!=k%n4}9G zv&fRl=4gvYqn$TgEi(F@a9O{M3+It9Z z-(5jj6mw-Px@lFuq%&wwVJCe6Y42xywRUu-n7aLhObgaN{lzq`_EX!LsWM~LO%LqW zJxmJnNr&jzVj6r!!1wm)UG#D|BzXI9dvFcPhDK))Pc3>>$B$X9ZdC*x3nXQrUx{-X z`>Y*{*+9KM7@-ioiBDcVQ=yhu~~q6AkrfoLU5&70G0}tJiaNxqg_! zhl=}qo!~g)54u5p(PTtsPOlX@;Da0Mnk9=}e)`~nf~x)fJswSK-C|b&=2;PJ$k);O zr&nf8N5@E1q&>BlWMhQa|9OPl8wzml>2pxp1#LG1Gda;1US>OJI7XzecDpUrK`-dv zO4lwJSiv_>nFo4|L$}S$=g^VtjpKx9XX`xwo8W^OogTEH`l8?MR=b^OwciVut72qy zsQi_djgxrC9v0Ys{;O5feWgis8k$!j=AAp*^lRbkd4zO`I&s@VJ#6COwLc3^!(XTa z@0eqF&V-KZ{`{vdcYPUBL?a4YTbV<0j6;}uQlLcqI-Jb+y;Xo*eYc6^7mbNat9GO^x zA;?%m;Ui&mI1JK&I7&hCp)S36Q@9F?&{=5(zT}&dfnK$>i+ujtfsXJl?e+%HTu}R- zI7B-SH=){(`VG(y>`*Gn197qmWtw8O&@sEmz9+?l)Po@J11`xngLZ(aD)S*FsAE#o zM!)xrFIv>w_xNddskiUA^B+G-lbqG1TD^tge;ENW((5y5mu=|whPInO|16)(B>myD zy>X=T=xBey+pSw7#6tW967=Yc8U1~l@apnG7ttpHCT}xm(Jei4M%s8T0021v& zGcyUs%603BXg&%v;u`FdE8avU{&hbL24DLTG7+2dCYDvL8m;!@fxcgqyNDA~Q6j1} zbD~^cA$EX(Lpz>BZr-`8%<@a;VjJwl5&s`Jtj6_}N}u9ulWei7Fft51$0lTkUqs z?W}!^3P)uCVhSE^S?3zUj>?BvGLozC%~sD0|Xm46)5YynUF}sTm+1 z1?hGoE@7W+RpPknR|&0cS;^H%I3-S^ox}_{nFu7_ihb{~97=fJ_EW7^yo7P^b{Jme zd7KeTmW=uA(_LpRIPuDlp1gR&H)k*GbHo0fpJl53_Q%BAeeM(1J!m`2t}@oSxII(_ zu&iZ)^yl|p%`^gcv_0ONXf3;HL%VqWrhQ*5M-xenY{`-Z4(uUD`UA~h!m$qh{cb1W z&X*Oj8*+F1f|QT;4Zlp*fA+I3Yup}Sd*4~lSaf@9?a7uGAX4#qK|xcRssHZU^qW~B zy9@dccv#SX()-PySgMQTi1k^PI;RI)*0!M7CAK;sh|<*0_6~FL`lq|vUo8vTcBV6MhfUzR@FLH~hamD$^BxQJDN2zXf_QK|1pE9F!=?CQE; zlK%EO!lxo4{De}V!bXf0Zdz6WgQ>x;Mk=Rg)g00fcufosRL{I^m=|DnLLA?Z7U_VR zb;m#fP+61wLUeZ{}gE;HV~|LJxzzFxH2Z$b~D+V5WVDNMM4+b?L(Ig;n} zs5dm9xJ4fnuj<7tuHM|vFFAYl`rK&U?W%U5wj4a33#_@>lry>CtRy2NUIIlZF1_W;l>|i^9&#F>c3pBfgB9*k;^;Is zJTsI)9Us1UrJ!M;E%GA-jE1+0<)GS+U;JEzV-Lh8@7AH!MLx^JPJ zIC_l)I;nTsfOZK06A_q-yF=jxrEtkJ6`KZ4M9_bZqJ87-+r-+BXKJj1a3V4p@y%HU zwy?~+Z0Pp(3jSW(z)${VO=(d?(#8J64H_cbT@2#=P;;vN3=e{+n0z4E8f8`|W`$%$ zOb=-}kgWi()opJbjd+G&^T0*hBpCXzD0uuI(x+vr zGsCTKwzPGI%KvLi9QhOKAOe#z63A~iq?&XJ@Y$Rq`$PtBiMu}G9?MSy=MQxneNe8!m$^FeLb(zC!)c#z&r!L!c`e^UNZDVk#W6-`8x%6>tA zirYMgC0F&dCe);`6p71EjJ1sC_{T5`+7sUdaqlL55|UWu88(F2)pv2`AAv)b+CwR^SO$?990)9qvlfJg4^qI-)1$_}>{}P)FU&8yO+d*DepMtO1C=ZdN~_4fL*JU0<3`B+VZpKH9+` z&j^NB{Y{3S$aZI9DVMJ#BwpPyd=8E^MPzA1Wb0q_#O7B$~3h4 zhf*z+f~doCXc%})TORneN0|ir%XK@T0T={qK~EozURb+W>3r7+-QGkR^<GIaskn<=NYEj2qx|fLAxsDA=rm3hU4_=i5x}C5IapiMNtn0Opyskt63WR@GerZL$ z$2G{_Ot!lMJHs!7SQD9MU?@h$IJ)?QT6gEK-%HXqQT^;_wrS z6sc3yRomX8Q+-v@U@HuG5OUF(63+Dxt@F!XOQsYE-A-hObx+q48SuOEr>dc8PL>v7 zRt+L+AUhUsC}25&?M(D2x3?LebwNtLo_o~t3s=X4ljWZp)2+R+I_qYr?WCy=SV|v3 zWz5-eY97l9B{b%%*M_P)=}_5&6|IGSqL-|kj1<$ya5O-B8nH}IgqLny9SCQ|RVT@4 zW`}ZZ6yIP@n}L@s@W)Z!LFL)M6?n3}X8alJyNqnF0TD5MZ!kPmWtGQ=311-Tjgi3g zU%SZ6!4?@yi9xgb>uVp(wNU$|{Et zo(|E@yyBSFJO=Wbm7+ayd-E*u=AY;QPQm4$+bC{wu4Y!PlZ^T$G|Ylanxnv;kH`s_m8uQc8)kWVbjAwqMiLXG%sHr5u%+ORyji5t|!|e z3g^!L9vZatzx7X6YLDv6_;!9_fo4V;+t$cWJL!aF92j^s=k=T3bOvfCo@7}i>+>gL z1YHlbONJpS;6Q}|CG2zCK^L8#dmE)FgYukGu}Fr=ty&o}sgNcix(yDG1B3%%GgUw?2}^2>sZcUa&)O{H&Qtb7fK|%QSu^{PYr3M!~nsl%@6aa z>RXYb-V}}{Jka^%ab?8~&>OvHxWr6g92oy9VA-*Gc?L}4a1>XH?ikMi2%ey-cdt>2^*MAGz_x%GOo_@pkn_n2W`HhDUA3!$U+OlLI@N(aN^0X>j_{@T9 z?kX@~SqB?Pkk{dnUFN}2F(fERA54-uUGU1h z^B5xWrkDz?hk8Q-k{b811n1x*O6}GZTHNH&)YC(=@xa`>cn%!|Nfu6Lh)a8H)mTEM zXO&koC!DjrHRs5q+likqqN3sGhqtY8*=6ewnVR?RQs)fs`d~pWN=nL@k2xcxp-nLx zScTyqPQO8{x>1n@dBVU}KzDYEnr;t&J7`bj&Hk?(LMATuMSaC!%x&r=rQRO_HYh$Qyj?iy!WvP zARMo~krS`*xskE@fG(WWkzvENrMAx~TS2{aj1|(POH8tiq(wv_cP^?C*9ig1biAK&*#|VN2HJ2_;jpA1ubo{d7_~z zRfM+Gjnc%l^xn^8!awuJe{mlYVRAMl6o`i4^tOrJS36c3Gd$h_0m-tqz}00lbhP7S ztv6UDZn?7U-K=Wo{8uMgJLJoW7Bo z(5KJx-5dA>!5d4@;L(%~c6A)F_H2IXbUVF@!peAb(d8~DKbOpHTWo}9b~ss`WD|mk zUK1<)k(FtI4dkY=6Jn(mcmJ!~iBDw>O(6<3Y!K$>Jj~8(!Dr=TgUPe58j=z*TDanh_e{!j5lZnvV1RoEsZ zfT{9mgHjKeMuXCl5=AtwW;1pO)-DVWo3gI0>+n+m{l~`3AIPC7Rr&;WsrXUFSv9jd zKd_PAdSXS|84Ngq+|$y4VFcTc3Ju`oH}KqW9t?(VNk5Y+qs%pd17{ReCFOi*XRJbH zD~uj>1^1jI=I;MM`~L54Zy!j1&;_y!9rGCO*sQqyodNB;ylp1iU52m9VL6_&UYm+9 z!wl!}M$5I@Z&?(`MB_C2ay99K_Vm>%cGY33Y3PluvklA8x_7>``pLXc7vc`MEa1dP z5z&I#u?16Wao2=$T9+X^&0hF^OiUZkmtG1viZlDRHb`fK5Pp!dKY!=L!{5B~%f2<% z)>oV1Y2qiAjQE!^2lsA1woEQJN1!P}TO~K~_TLE!L)?L^+#E-jK}S!w+wG@V(ax83 zh89j!<;_n+_Pf13(9I`-*XL#b-IE7H6QQy+o8mJy=il+Kt3DN3$mv4?34r#bW{h{y zQVGm#9=~YGaD+~@tj@sz)Sc(2t*@%|I=a0v!R5@zRAe$B`KuK&MY{7Lb*;M427Fgl z*I*>`R^ULnSmGmbYeP|RH4klaX2*FzB80Vy*1z=tJtrc>6HTkLZ+C>c6s=j5kd zh@l3^KCmzM=ugn5r+KCz;>(cQV@^WEsAbJJR(`HC4;9Z?WP90h7u6;MrR1T-1!5K1 z4&C0Y5b-Y_{h&1o`yZxi*s@U6I7Z}X{L9bw^1I!V?LPX$#Wx(k`3a~qdVCAL=%dH8 z;_eA_yA8(X_oGj6Ah_Rm!hQY5>^}f=Ir_kgB1d+-duQ8Y3pTmiAO@h>!p zq`7+YQj}R<2IQ{BAylfv%+_SG-KYKd&An}OUC81WpYU#tD3xEgL+(;j8T0@-8?Z9d(0G5({D)CHYadTmeyMxFH%Zs=*`(AhWS>87UPj?4FZIdIe-|5O zo0*VFm?(sS1R}B0a>o!sRr=);!~SO#k|b{iTi{b*UFz)tB(497P{^@;af*2N(u70g zyzuaBUJo2PN~nD@Kow2#ZKhcd+`+1)!zM{-@CAO5XdrcNygo|%(A4+vf3-uzeD=~< z7J-vRNqJBfPuZknv@HaGxNq~@LFP{9U!<9=%A(|wHhv3jPY5-y!F!n|iTNZ`qwsK34!BU;2p z|B=8Q_(7Lk9J&e!43DwGiPx+DXDc7}o?7WWe|ZQM28_&xQ4j@amn*Jg&VeEMN$;mC z*WZ^NOAqmW)|a9bxE?<#+EXU~=cRn{rV1AywN}x`Iu=W#15*vr?QQ0b`m(~>B$XgM zdE&QU4S>2-SF0T8(Z>}3v@b=iog_IxW=fMbN1fj!R#EE=o(ssgCix0Kp*D#thL=Tm zLxRT2D@>rbK&>bz%K1dPu|IAzKzPC0aVixcF*g*?lXMxUhI5?;?LafZhWjW1BUB{t zJpar)9;ilObZ8WW^DH6X7PMla1}uEu36)hqcU&DEQ&FpDCGwJneuD-8(LAt+~-HP_)J}grM!R6QD-rxb--}`$> zi9a+n#q?!z1hmTyx89Y4I7k=3x8v5RbFs7SIEwb&E_0xowd(Iya*fp{C=I($6cMW; zKY5kvg?@z3DCeWv4>>|?R-v72NGiLqw8|$gGQcpxJ7Kw@_Ea@L{vudlc|`-z+`%gf zP-M~`OfkCbntrVOQ9m8ke(EE|v5;ncH6(T2_BEFDXe2DedIZXbJ#|S6@q->TTu($O zK>p9At!w0;&*m;W&6ee?!uSZ)ey^~ua^RPJ{hX?8`oyH%_|s0>&vk5=$yz%@a_MP&-J@Ka#yXP{{OKZ~83AjMAVtrQeZ zojhdAmgE0#fp3Kx{A$_O$O2_aNQ6Oi5OB*SlCX-LLfSjQ)IdL{ujPv(_Z(MJS?>Tp zf`aI~pV;8SvbgO4X-x1#+A!###zI}jp4Svks>jcQ&DpH4B@e>!Z2f>Y&L

24*jJ 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 (!RWHV~e`3A=I(=6u277_(-~Oa$4|U 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%0DEJi)SA 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 s-1~a7|(ge-Y*iB7Dfv0G<=`iL%nv?J%Rbz%Nw> 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

5C6HiRYCGtJ(1 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�L5>C-rf37jZ#OI*E^FoMp3F3;Tp~E+^ zw*<)x0=#*Nb0TEfBpbA9eId&$*I6M`Q#FL3(c%h zEI{b(SwcF`;KU+{MVvykNn z@Ug@2%GPZNq~>%iTUzZBwOSZ`LD~K?J@CG#x0wd zuzjkhG(GnRHR6MNj_+^EzA|Gv-@O89o$73?Ay z52vh{RKKRL`8Ts!eFyf>871~lgd@pH2o_30?|!od4%UCP-~ZyN`I2Iw{+&nYnkV3Y zE_$fzZ_v1aAh0>=048l+k;t^N8YfZj{;J@xG2iGQ;tNVvE@)w}g8vaCPW*bQEcW@I zQ5o36@%jPx<3CT3{;34vaA(Rra_872(0g!4fYhv++{i5DdXIumdSoCbTB%C|a-50< zoYfE@ga1c~Rg1Mf$g64v19<+>sVAL*gJuP>c363|Eb5vKQ*jg_cNSgu z5%uquU;oa14#5B1AN-HtpMCsKFx0r1u%3P(Ew5i2`w1Rob#6`A<{aL+f&WLVc1CRQ zt9P}f|NH3mgPWrn;QtBM*Cc{}Uf4IFNbIR^4CAr1;^(@1nxmJ5>%@-i?{G>@Z>_Fo z!LX5rQ+p9kiA{`qYQ%d`-{sg>->yG2RQ$`=Cv_RU+BkdG@6WT|NXyHN`TZ|I4Pn~< z_POeOJ^e4b?fGh9e`+*YJKo3VIfGirRI_tNDEOaQF@)<5d4_}~(5Z61qTje!R*WD& zMUI$yTC==555gJ>fjbXdS^naBA;O}#+{P&kWyE{>A|T~xVsUb@U ze@8HS^3V>2qSRr+VIa*sH(pMBdAn)WNgPV#H4=#wF&v8qE`_{>@u?rq_1`dAaw8*u*vW<(jN`E^`<)7fdBcy zD_nj259{rl^1S<0<>BD^bLwqpVG&y7+m^y-disR5D}8={TmN%f9sT2%uk##4hyJG} z)l38sKll$d{D(x$ZEx3wbF!L@A8dR7cH*~ zuH-hNavVXRv8v*_T`A#q;awpA#k|@vMTj=Zk@ewzn_tUu@Kr)hI~IZG7?hA4ib%*z zU`V)t#09kMaa1WER8Yl8fBRxWRiAeghqE8y#pmae)DVk?a5^^I!=z+Qr zV*zi0suuiBuluSp0d#sEJ zN9?8l=_`JigcrlMDQ_D8{#GsuR<$L!%K(4KjKrm#hx(m@(-X@z65b{fznV+fBjO{^ zp!hhSI5iHR)S$xOHZ#-={40`$MEGN6Q?G$ z%sfE<(~u?o-+wZ0+m1{+;GfBVz1xyQ=Ogn>kWN?RzYOXBCHy~+fLrD~t2CY#FY{TC z{_lOKw~Jic-Te0DMiEEwKgJuQLNF(L|KmTLbchwh{>gUKE=Y{wKV&w+|4hntBqO~n z-Roz2e;MF^LPMO@Cyn2vq|5WBSk|_+?OlQhr$X6<(W*SdXsG{k?Ey;opNW3y2T}tL z!7nAiEvts}`P0Y5XX$WPn@ixl14=yf24?)a^>aE%|BD`X{8XRqXpv;e7Q0JX1XC5i z*8OHisIsIKm#a+|*c=PRacXmGF8-<=SV$Z-1c&-}HA+-hv^=)q0s2jkTpC+vjzRPJ zSwQ-TK@-SXRVjC_NpaO4dR}G}E1Tmz5F{?9JuTk5!h$f&G#Uq$lbBAHrkp&BA6Xf* zBb3sn=MO8VJH!RRFa{2u?;|mH_|AvYM}G%>!KP!VJN)P|SrEVeYpq6(+vWQeks;b@ zR!1cMgF1+QgKiFmvubDK|6cq!2NGInw+bcaa~bm zKm-uuP7kzyHf^|(Z8_m;YhRrC0G>4+B;t%Gi5_fG{TFx)jxlUUri@dafr+=;=IS*I z1po8m#naO?_@6Cr-L&PpzU04lgl0ACzi{f`N37acu3p>kAL_rhhpPH70{^4x_H0?y z->Ikm-3RJw@IQh4Y)|UnF|FnoKhe7K5u*KDYo73!g@F%eU-G2BWNvuqYa=fK|7=9B z56k$|dH7`7Z5?NJ2l`axcxfX{e%_$`Q1OLx;QwzaAE3-J$f&Yh^p<6RK!}ok0yCAvP z>0PP6lL(3@_D}WoUo5iXg;3=hcsO7g30Esjl1NRIA=^p1PqEFZ8TpsCLmLv^N<5Q+{mP=OpwHt*#d)qLP+ z;9=fw{4@w}YM=C2Rdz(lpPD0==t#MClp0_l9n!<6Nx#J>J(1+>uEq1cRu@1wg^w%7 zk{UxaMDRai)}p))j*z$u1Ec03@TF z_ijD1Ze~L3)Rg>Q{8;j(Hf9{}dLt20nHTUs2R`d2_@4(Gr`mDBKhF)8?av^1HS`ra zvmU=iUbXxn4(!%yH?gYIWv=>Z#VuQww59*)$d!TLze;tRN&oi~hf?E{RGhjb8h5#( zTZ7Tt2glDFR}+x>uV=efLP=TPF5cWIV-%76zGAc0zjjrq>|k$BM(W@Ht^c|iOXhUX zx?kAF*gq8%$SEQ@@c-aQm!wCj|2ptfBE78QrzNyn)zgU=P2od!+2J)Gap;7p|LU)% zol$@NkN-I#7%hu9>V7jTSiZN!!T#wme9nCJU-f7UiODqdzX1Q-xNQyRvrl*_zSHIm z)S^h)v11*SQzBH4SR%6L#Y|8gH=_i2qjw#As}>m=7F5GmH03=UG({#L{THPqJrlHo zXBdIZj3NQlVf2V!BzJzKq5l`>J1bA9z|n!{8~GVnkQv1-B`pJV9Yl4E9U%|nh+&zV zv>SKQYqcSimRC5g%BGn~BE3N)b!S*$e?Ua({fo%~@eQ0*qUVqx3DhAtWJ-K1L-JpO zb>(D9O2ckI1^ULQa`=X{x+4}*b|?#aOW+T1c<&{wfQ`W{xQypnG%|h!R~50`|8_5 zCsP~pU+E$3<9`U0tG*u|qyKx8m4bgZwyk0x_FH{Y1wMbi=MY=)&mr*7(^ci)$0!4( z|JT3xA1CfmkC|pyMJf#|HL++=9AG*DCNJ5R2maswm)mX^4=j+$0?i9jwN+ld4ra!cfJgvgQr z>9B}?7Hi**Nv@js4?jmJ!e?9C5_nl3$j+}uZm5wgkkVj8iT8`fCjZHu`z1G^)Rsu{ zkJ0~NC@&NI59f%Lp*;>8aYN)0cgj?eCL+hh8%FHD{90M=5JVdE9g%O!whZIegU$d&mURXWx zbp!m*lnbLj(Es$NuUj)u14dX@e0@%I-tD7SS#`g+)w;`Q;y+f}U=0b`gN@Ds4(0r+ zlzs6tMS_2xciv5(WHWnTFB&jCP3Z|Ye}@B1{tNt%%tFL@E>wU zaJ8sp+ou1Qv@ns=o%eF`y;1svWv&m^E5~=jzD*Yq!nRTDRi2O2fG?+sM~VN;aZ1WP zBirx%CMSYlKNb)_L~D5%VUBAWD=k5F?3NppI?o8luDOyEBb9~(64hppKxsRSY321@ zsKmMW-*ZR|XUV}6(%;BF5H-NX1lLg+h_u5#GFC%lfk=Cmfy`XGz3ilnEvI7<-@GL| zOLA>pD~)HNp0EAjZeC;1>WVx1*ZuuLxh!9V|p*JuGiDt_dg8Yalf@8vrBsScs) z@%x@^E5`?^zIeMzqqo#>#}RclWd5aoxG^Jo!xR=HU@d`<#RmVZ-n;AI{^RFvQDZ+w zK-gR4RI4$T=>Lv;xAfK%op)GMnuPcM+*4^Jrb*}VCw=@gfn8?N&#Ag#6E-~?P4}Y z)4lY9;usC0%m-6iM=2#yH=^FeWpWr;9}H*z48H)7K1xx+|J+WZ8kND6tZ?{c8rxl8}1??$$UufUQjPa4mu;^@5A3&rwMTT zcw_>C{9fKil?G7P*htJvafy1LZzN^HQ)KStRpntR zP|g%Hl#vhKm}jx@<*w>~mMA?<49nNeNTw}AHMR`}mEf~nPgOo7R$$cD7qJg4rMfOA z|8;Q?{PWA7Kc%kyaB5;V@Xy_EPFnd;w^zP;p=aPEKL66%7Y99JhINMi_GRNaSn1Dy zZSzv=HFyE+TZe~2AKr77%3OAT!njWPg^&Dopz_^Yb5>4t!9NEA6aM%Xb`HJcqp5&q z9h>4@E11!> z4p2e3wVl3K`hSt4X6`F@@~RhWBoKfUDF&zV*gk=;Il6mvMc zi=Skw!kXnZEps)*QI0mwH{gG^y|2uK){s|oL|{~wM5?-XP)iI_)zxuwfAuY)T*7kT z+z;9~+XG=#%<#byTHPkfl;uE(GQ4w<1w#0 zk*jtFJ`l+(jyX?MZkR=j0(X9d4zHN>+bGCHUa)_N0(i{y9D=3JWWWVhQ8V#dvE;iK z^J1p4UD_6K@zLFcH(Wl@|AJ}tc=sey7Ot2^Y!OiP+DL7hX%8zWxCp1t$Wr@=>`QY``C4(QvAQe|8*Y^h@Aj!<2rBwU?zswgLZfS|G_-$F-E` z5Q^kzai#y4DP$g+`3z^3Yfp_LN+>!E#7TOtB>%9NTfpSzFjk+{Of!ildqgoH-O&Gi zijV*KZ)f_yQ?RYP$2#><2Y)he|MjakT22CrMx(B@B6a7kz+>rlY=KDR!V4ZhyUmyw z3NG(cGtFH^gehD1x2LVHNcjEhMWfvTki{KpR?2n;|8p!gezD{BpKeP3(};H0F>>(F zRbwuAFum19Pf?^xfGm3B<}ABj$rR1X=ylgP@IU`~F1s3fKe34H=v+@>wM+bm(f4m8 z)56&msA|j>MR^QqCa7ysb6it>zO!Yy@*Zf~=NXjHO-z17zoFhY&5gjhZO}W!dmxqxQr7`me`ZwNJx<5w9+zwm^4df*gcGPk`PyEgy6ka)*+x>Z=T` z-WMz-mC`AVApeRkpoWOh1Lr-{>Wj2DkVXIylg3=J@Pb(tG}H^wwxv*2=XzYDP)7b5 z;8>S9{Hk72>JZ0bKJ~DUjZdxH=GZ#5@*J4FvZSgU>O$T{$@u>p|%hGCMkk z0JD&`b0C>vqyy#bFhzn09p>m))JsIFu}L@)%I^2XIN_Ynx@@>yBf=Rw$g7g?cjoa_ z0v2MrO6_R42U|>WMd`}&b?Z^rL{MVRh6j?;bEPVq_|GD?2D8L|8Y70 zBF*_r0VkU}DJ{PgM|viJj4ZcU`%I5ln=x%{eB$|mA;7zG+Ig%! zH*P$qGrWkyPtKO5_XmZ9&ct? zWF@O&j4KgRoRSzZBX$-_o{KTS3E0U8sZA8A7yQ4={}Fnr$D!j|I)*&FYcs*omDY;_ zH$SuTn~;Rz@svc$Hm3inpZ{`HL;v>{_Z-+_lx=zMz7dY#fBsCXYkBex8EbS}HesJH z=B1aPUEoaE_YG>YJm=nfLZOwDP8=FF;ACB>X71JHx%W*uzCV4%q{Hk-%i6o8eN@$J zbs7py^rTm5CATP=9er`&3~osO)3JzlLh0(+-;C9ds@_wi|2y`NkRRDEf36CMj;OoE zmJM%ReRGpa7!;rqyoA97*u|xK7%m`H!#3W_W;HCJRz7?_{ok(%R2)yD|0#xZIIM@$ z|D6wle_lRvW#ay%mG|~^l$v__)IZ>#IMFL*sGmQ*}jx7rxW zXwz>h9X_ORq|G3Wx@C_D&y8~vA&jX(07VkZu$1#$cLx)|3YW3-tzbPN2QIqRFh;Ek zs$~CtM1+0qN<;>oJkw`p5gUmEpCmjZOQ5fEH74|o(4$=n^a0NxUZ{lsu-orE)#8=l ziXcF&JvET0j$C`sD2M#l3eHN1d65D9XiQCGm*`}S3&Z#_ps34nvo0gt;j($w~ zzjx@WE}{SXOM_qSD*aDKub1Lmn1Fh_pW`F z@%?MCwAJ8^1wz3!;Ge<&Si!GeI$vuA{yF5O+E*Xa>K?<#|NH{}`KS_#Ez(3#D`}kgCxdcreeMpXiyzA88N0H>>H>dSIeJpWDGNtirm*yQGflXk6~tjNpLdg}!4f8=ZR{^r1~bPC zimzR-nljS}l^{*3-Pnu%`GI*bmIwqHdv-4mAuilp#7hmOV`uD!%S4OJzlMCanRr(c z=K3q-zle22V?+>@nNe1S;T$9;kK{TykZ3ICm$_H7kq%>qAEF{mD5iN$Tkt6?c($ba z2Hc;J*?m|k#w=TtQyJ5fNeudD1gHn$fBpde!`KBO`hWTS&w~FszK{N2U!*DefBj7V z_pM*vdqNBU^TjUxzkW?i%OAaFBybS$KmFsLp2##uwtn@|X?@sQ|44n_Wt(Zfo@z`d_HQ>`70}L6Yfzfh0Hd z|Jr?tiTyLkq5s!B$jn4cF30xFE_W5yC|C$WLq7gFH??+i2Zf>w$KXd*#x?KWNVV1< zS67eusGWVTcR&cTm)-F54+lrAyz{rOULLXKc8RqLhFxRoyDrfDGQcnQ6^(i%Q&hJw_zjRR~Pr4Fz4v z{lp-G?VS7toqE#S zNr1UU+rgeg120TY(P9q5LAeRJ^U5F}@XxfSy#vqS1J&5n@F~#FDCgpMckJavtK{Vt z@s2W6k-bT5EoDin5AOr)NMT`IG`LUI&Yz&L$*!o~Il%9ljnBecpk=Xk?$qSJLW+m$ zP0!)c#(QDNBwAIS?f439HR%5smrMUgcZ8!U@AA7^X|VoILkN_zweq|BDjyf<{@A8kAqEV#oQkVW0*MIhK+w#nV*I2jy*tq<3W@oHhb8}AlBp!P2-+vt!{Li|3 z0~wjp|9zvOr2py3I~A&r{_lwNmqrl&=MTCW-vo;15tI;noBm(_wBSA=Y;yYTVv0jf zF6Qk{DK;q2o_yDDU(5}aV+_#$Jz*F<@9$N{&mTa6O#k;IziwzB?V|dg0{;X4`Ty#_ z^46ZgL_?$_th_iRxag?gmc1twqxM-qKgH1s)fL z<9=q%!#@LaQHTm;7ObqQa)!?xRpdXr1_?cfLk9LvJ9s)n{zKL1ZI@?Qo4 zJMwy(MU*Y(dbP~B<@9!;S3r=XaS=)IKWSN7Yff6~5Xz|vO-e49u#!|CZGSWINwp_I z2jx+&!nr8@FC_m(rCw$gwHNgN>iyFs|D37N2Kb*m$LTHB&dByvqxzWU_7MEf;Gd5u z`d=)%?w={g(U&@JG>K*MU*Mmo)7_JKrG8!;K{EfcF&{|Ff#Jw)O(kL@sxEposra>FY-IX>J-WX;Sg=IP z{jvpDH`IUKQ}CnIe|2i#VoN3?NiylvG6rm^7eJSH!C-ZQ8=N_B-BKsJTHYa(o!g z1iu-phjlK`Xpkk-EO}`>bdGLKpp;ke@+8n9{eGz3*d{d;v}n zZbL_(d$kobXSGH1JpdwZagIQvSp;JI+SzVQqFZ#7N#x7|$u_^vWje@h6|(ssPi~VB z|Bq;U>3_;K3YDvLcOK9Dda+8iMZ{i-02<}#0tY`#cYa8kklP3;#| z_Ddf>k`*f3R&%GSr2p6d!`{0GST*jC|Ib?cIx~A_cFi19a%r1dT!{u_%miec?4}z8Lh=0la(`C#*)f;Pm-i>O6+Jg51 z?W=k(vPR~=U#pF}lg{oKOS~|N*kM&icm0c(zZV{S5>a_=rlpmvIzN%r;)9DU?hi7l zb=M!*{cgV*3P}_KWcpfEwc<;swqe zdYt%%kn`X+t!S$u1lu%W;3{bW4i%dcwjpdo#a9*!|3{^%iYHInCJCIyZEU6QS7yCG z*^-08Sgt}wC~k(Hlb0*;pn%)pzqnFT<$ZL1g47{8sar=-`UnS>(DR}e6R?Eo-A*mb z5#-`2=6@kglikE9CH}RuT1)?*j99Y!*W2z5MORIE$VLC@bN#o&lRc?!3f6VZPae5K zN&laV^OL_^CG#&H&red?z5$@AWS{D!acgFwBlEv}W~?yz`Dq?ES~Vbf><06*P&JKx z>3_J_E5cTi|6^5+O7^cc4)6Og)60K8_EU)Z_XMh03f>|m`Oj^7qq}~oZu6O=BQYiV zPxqFVRz(K-PlwnQAJ}iR!^-L>)wg2XN=u*1)iPCcV*bUD1yV!@$jIfngX0=;$kCAjP@k0ZhF#l^GQJ_( z(}Ey<@N|>{rJxpRAEzM};nE0v8CO?TQ*X?kpMFx;sxn8;Ii+QVtE$O}%j+?8adgn& zU}}U(UNXj>{?DeD8i7==IbJMyYx;|DM}S=Esq60NW&#tIIKMoLAp7X2dJwY^C5W!I z6l_!y;nQ@1q=-kmNOwwGyv2j;bc9yGg<0kl2sOzLIXkT(gjwl%afFx0PLzh$#qA>? z7b&RL-7ywHfLrcpWQE>u%4lrhO8;k)_J9=g-+g{~x2zRuDo+WQhI-c@R?P(kH^EF; z5h?&QOZE~dEqVtU1-bU2)Y5YCbI+mJOGr#p-eg8p1>l?$NG||Fw({a%`>Wldx3@ZV zWKrEYU!7t4%4Z*`kocEx`0~;=HvJFPcx>bIzI{ijDZ97Q|7YaGhV*~7-T0%%9c=@3 zqp$ctjqpXh{AblP=IIQ#uXcAB%)hXr54z+(`(iIM$z)2}~# z@!EnyZ~oU08-@CWgQ}9haXV4ne#osbEPNRt7uarTM^0C2IpDHJ$9CCn+?h0wfenP1 zElEiTCYwsZ+xfnX>=I5}z+?6=NBG z>B6KHos02Bf})Zmp~bV5SB6TW{-I)oXB7F**qgX(?p>+HUGJcoolXAq*5P#t-Q52f zzObFOg5(0%GszdGk0*oy@CDKa4BP|obIPTgrF<3NGrFfe4izQ0?rBFn%_I>@**hJ} zAV|lSO?zd(_;1>u`C#NUoBW?HnGLTzbp7Sz|19_`kNB5T@lbrzk{b@7QhNOle~|u% zJJO~9p`p{F1-eEV|GEc9o5c$y|G7ZpPV?1Y{>feaZH9f(|8QVIx$(2FAryaZw*80U zPcr}FmcLkGBRY|V`s3w4TM0+cRW0GJ(*H1n{)gCt`X4^C>Z7uR%s=hdGWWJbQSE)c zb4d;2z!$~R%gPdo$s^KIuPeYt(Ay2093iRydhB#x@t9Q5#Or_9cZ~k{X|%VfyO#N1 z7iBFRVI`(~s;Ug;f4%ffv;K4T%g=tX&XZnlEOb`eLMV zVPOuEe_oLEIVakF@Io1ZLMDQZA&`e(0Bj|NQPe>WOhQ{QY2+(;-2?KC+5o=B+ zU*Kodzq2mI zHJeoYR7vA=h^5l{65j5r<9wWz@fiIN{m~@(KPjPDgv3JPUxgW~a+4k2yrXR|bN~LI z9{ZQ-U=aU0T=e$+ozDtZefNUb|A#IB$;o;t@h?`S$ba@lTRHT9ehgYe0XgNPRp6|1gjIXLWn4 z%&LP&yHEU=zvHMgv<9wAdS%&8vS*bqbVirrXWTh+KBE2|#sJYubN*G{{EL^QS(hB< z7FI_8XZ`itWCtXVGykF?D?Z9f9{WXoW;D;gX#DbD_c8yX{HC8p)G9OxnAY5;IKEB?!pIBP<{TAIK4BWk124W20EdFHl`IL0)E$V?heU`Kq5BBLHJE zuYw3FJdv1GWkT3D#&X=cthsACLZ>;yN%uGzQWZd3w)_w$y^{At*uDHPg$z&8|3r$R z+_?Hlj}yE4{Ab8MqIU*M^@4vk2-V~(eelyYmxtEnJDU9GnFlgd z-cjnm7G#x;boAkGd}di@jQ)qvW@Ta2qW?2eg9CpB4*qtC(9g~K7wLZ}^Dlls@>SNl zTMBDu6RSAt^*{6n>HnNex`PAhrxxp)q_B=~#1)X;CH+Ws?3V!<(i`^LGH)Kc8 zdt3`M^7fz@{{c%rb;ubIdg}c8F zS~a5`hYG&Xc6sRi#nS($71}!SFH-0Y`v07E??jEh@%ZT5daw+`3FgM`oBS^R7HpmS zE?1BEbTECGE=DxLsp{`P^EAf`v5}l<1n0HtXG#8ZXyurV5B{L&f7ro_ zEppXHTp+f?0Emzbxv18SMqmNmO&kCYk`F~PDPri|FW)icG#dZ`1tJ3KLnHn~PW_U# zTA8B%jGJ!m!tL2`s%2lJ=zrLHz|!XV7u0{<*rz!+nNoXT(HR1&I~NB^I+p^jb4FPIQ=$Of+HlXeou8;**GXCvSu5#nFA##e;F zCuk!1e6}O~f6y|jxx$(wVpO7mWR$P-RK0j%v4t}a3_|}ALoFDf%Pc;OdEqughm(Fp z|3l^9769G!Mi{t=58h*jx>`7qQx~?Ws2pC4>msj5ytqM|bN`*48~+a`v%)2=fk`Tv zoP*|*_EuhL@7mHFhH!V0N(qUHpIVacROJ9qwUPfO{sr2X#KC&(kqqX)^Lf5X92%Si zUCr>~QI}w5V&0((4>EMXpIU+bqtT9wB=%?+EsWvPbyQL-C`eGQQqun?h4^P1QY%OP^FrzWbFOd7H=jN5w5pfOJr=A@1L=bI-!3Yz#FVA-&vGp{2Yj~KI;owGnBLDg8ZN7*z(p`VO z|NWHVXL8D@plj%V_{ASHel&u26ngp3`$DS=Cb1GmmPI{sFAfis*EXW$y1~bpv#uBa`JO`&QoZL}K ztTImq8%l19C0!ORKa`9AC&a1nFupt~D8^IJl!>Z`nxS_--vX|fBu5sGxESZqx&17V0|e^*T`U9I2>nO1TWnm4GVjKTB7Q3twO{**Qy zNzoWIhqZSYn!vt-6^rK^3_`aNy9kFLt@tZF`Akb^kFr!4PYNDUwJcDRQ=!y;j5!F? zapkEz$zFw?f)U9<#P0&yA&?-7~*_44dZ8`KZG*3bCuuY8Gr`R>oO6!|{~J`7cNQ!r=K{HS$xA-!q;_?-q+ z==)^RriOKFg`S`0EAw-_UjIY!jp{q|`b~|f9-O=}jN>K$$0!;1LPTYe|5JL^2NB)# za&45S96fRyw@~+&TXwtkwVwLO@IQ6orkie{!bZX&>Q_#gngx+!7ox}$ z-C_O-x?0e`4sW!l|4<}`);Q0Xn`2q}OTs8+vk&4Kko@Ooms;1G#?sRu8*7c^KR-O+ z&c18Wf5vS*AGL?7&6eSH=`0%k=Z_$gR>T-<2D#+uY6={s*sB;M@RvX?4J8ubPj;%; znMJFEpOOQnxkI!AUC8-}{)6iSzAJ@OoEWuGjP&J)B3m<-4F{O zyOLrJ+KcIrQj(J_5mst1BX%Oe zZ;|t+xt1o2NCZMrv$|17;8usyGNcbF+j(~xUayOeP5Ukd4FWe9$)c~^(yh+c+Wf{d zkldTtGZ8wx%6`^*BFT+K^Z4dD!Au%Ny2MLyVdpx^IGywf$vEFE#h}G;q2@qZNo6eN zd?T=PPt?Erl1=a2cAnb4e84Scdgo~}|Mcz-BW^FH^`5zW@cgz;=P^%F|J5q$oS6UK zRw;>p-J716PX3Rv`_+Ioqw7T*(52~r*lmxXS-51Uhl+*Mg+?$JEz7#G$DFtQ^#3V$ zex3~EbBSK4?>@-L%d2?CSv$w~Y(AEf79^j#CzzPohfV`9D65?QhsIr$-CFABZ_VXH zq$Bh%-|u+tvQdeP6yp6=U%1HG|_yR)2 z&fy5TLODazU~F|OhB7dSn}~VXmVGvM75FAxjVpqa#5{1$i>SkFVENkRX&mpsUK#Ud0Z7q9$O$HakzM*)}PuU+B#Za(;feWWDrlD9&CoV?n{t9}{{5 zs!4qzOhv07cc&Ghci3~lmz9MM`Z6;+aN9`8oasJg^?Sg?CY56;qU1P^qj=M=>Jm*gOK`n>HqVux|2@IupfFs z=D%M?$(+6%05Sh`!!)hTbDx$g2R<<_rLC)%|8s3uqVnPrP_Nxb^!A21EPinnmSe$%QX z|7V_&-5FxD)k3o^x51={`1`_LvPQHzc5iNHJbeA5575jara5@t(5%d zrJa3|WQr~Q4^c#<{~;-0RPFm`T_h1=Zr zK0Bk$&}!Fi4*roN1f=opdtGWV^-IfXbvTFGH7DYnsbiC##31wWR0+>!kd z!vx@vPk;)yxC8GXvJ4Ls-lbkjEl&2T)%5{C{-5*Vjzrd?$sJcqnK*L9Lh?hZ)PL~} zA{@mBwbEM+6`OjH>=ybzL;dU-F;v}A03>|MVp9hEKjO6_oXgHC%NmolNJEl5iGLB3 zs12Ry|8u9W>X7(M{AhO?`9JS}CH;R|#%}ze$n5`9{y0~*$<40Js=RJA;4Gtfm-C(dWRZWrn zpJ1#VNUDsTbPeilk6&-@-|kN$_(UiyYN|NVIGbravZ@03mj z)orwTcZm^EGXL~_Wm=vg3=Tl6j&M$xqBvdz&7zI{1`%&+Nu^xEHn~(<=)m#hPa^8D zv`{cnytzV-Do-72w!PE$8+Az+mI=i-(Qs=VDcir}L zchF*j>0_elc@xx=kOnEqs~WAQsh_8jf!P3mn(v#{syG${Cx!gPuqP*hRAi{`Ytqpr z*$4(ft_CV6HGGswmEFwJOyffFx_Sjd-uy??cxC2qBO4N^8Iu1Ww{DypG?)1By54jI z8ySzEf^T~rUS>mC-uw$ua+r?}mj0!G$3rJtI#|m5uL>7MC?h-1u0ohoo0X?49J#sV z;;jq2yJy^$7n&vWzo>sdJ7_{tEnX%L;s(PUJR-(_QA>*CIzJb5A)wsK2O!{XzxdA((X;|lzZ{3 zH~&fG-;Nnu=BGsLrHcW0kooVCHXz^wnd8s*@_$0*UDPJ~2-$=gOV3!=cWrZsIyzGp zJ!Q|EGXHe_^UEh^ZfV2-@MzL|MTk) z@8VIl*w-%yd>G5jfB%!hI2*iE;^qd+wBaw1+yu>)uIS66K1EZt{~>D-w|MQD)Y)j@ z2z5)15Y(3Xmwm7f{uXs`Z=7*w%Zg!+(p1Pv^IsP%jW}Z{PLwQgQLQ#}YqQF@i&qvo zRv$FQ7DW}Vy+U0QCUJ(ZLIpCShJ|57iPuSU3EF`1Q{)>cjxmsfq{!?ZiT4^O{IVb- zw# zbjkeUu|8rb>dQwh$Ji(4SF9dGzI)La)0b#T{d;Gy6u$zbLC6Kaf-N)x2UYdn{I6ZX zx_%d&nEyrA-6gNxk`jr^{EN*-wA1;kbM4EBe+|iq-S~p%|9NStz8<2p7v$t`u&?;= zpH!39FX?r_|J;O5(HQf;b}|3-)qLIO8soLvPQ@|ifBDV2PE34IYTtIY7?b`#AE!+0 zr1eGwiklT3#dduA^7EK~vB~)DP<}H{{o~ids&(<&ruo!=7ve%;P}baVi@xlczROWS zY(FpgKfbEZ#r(LNH;3&P0FcZ-wdnt|C^n(v;?vI4Qr@I?(*JP#Blg_p{)dlM+?SJ% zUyQSS^o#(g`0>+~FPem+Hp3V(4m>5Y%18Y>0_kNQ$0o(^Uh`AxPHD?waKe($A^1W_ z3T#lS18A=_e*hUVZ1na=DA<-gi$5w>pESgOxotoqL5P_wKC!Gdd^e1v8PbqM6O4C% zBs;faTXcme7c|0Bi9e+6NM4h0HGF!(Xyqst#5W?Q)ptpE_*-b!16#){X}*|p=DUDOeyjJi`X^n^jE<`shN zbWo76Z$pjktr@V&pCIh0`=U}SP7h)30);0TZ85^5S-kh6$Q$ch;5)$i<@GqB{#UwJ zn2PxqzhA%q{eO;nq`<{`_;l?x`|$t#ruM#Zck4{4fB){okhA?_nSb$3r^F-382|6T zbSiGxGtk9h*AksxQUBhmV}+IU>c7riy*Q!X^zwgj2UpaYXRx7`YM3(4e>RW#7w;@W z1F;cxbCx1YOOro8u^qolv_Aoo+LhQvRo{=6SVighRn9Np&ri#Isq6mlKb`|vkqpA{ z*3fR*n}4dV`^H?=F3A)I(`@{qOR`(?HDRTW)W6@B70XE;eI680@&7sho&29ihfoe@ zfn@amftMzG9o+eX(Tq8t!xh8HhpBzrVnFHToQmO(Eg;?siK9n3{ap>;hlM8p00UKB zCPjtRzti;>^H~l-SSiOs0|yL&Bve|b|-8n(g$vACMkYForS zER{)IcEYvfX%jc@UQNXj5hTX}@6N^$=X7}v@vw)OD7F2&Awv$Ol z${T1Px{=Mk%p+3&Wup{G_A2Pg%{5{<8qIUp(SK;Z?wL#y&n~M5U(kqD^Zbj_t3G?> zwx0UEW#u!!&r_uYb9`oQ|JzHS{9vV8()Z@nUY$PzK$V-Q|N5BOTs40l>s4F%eBkXR z{m1pL)oZ7G(y>_eX_`7`z4`rTo384EWSaHI;SqHSP5oC2VR07p#vScKx$3kYwQq$x zXRRx@dLjlQHGdsU>itq}Tj2^l9dmyJjc$)*kwzZRz-R4P-J0yk4c^ zd&UD}wC{|kE(q!VdOGL|J1BTX|Md00@O;?V><4$fJWA0x{P!c|G3kM?{q?8J z{|ehlyE*^oME$!ArW9;P;5#ScU#O?p2*XoR0XWS680M%OC-TM2)Z^K8Hu!S-KQioL z0%(}4PHn}(lmG99qF|VQ)LY@eUQEi85idcd&qj=9q=gy9rFb>%7nNklq6;g#-2RFD zA5>K-t;gG0fgM70RVsy8A!kTCuxf`R@Pjx>?M@-2+svoPLWw(3Jfa}EQ>Q0vxvqtD zth9KqOc2H6;7<2_A>B*S|H)?^-9Q=hTxpzHlMw7cdvfm{$m#=a6%wD53o^G(p+fs{ z-qt&NYve?ATM+##>e?SGKpv!D}4arlOhv)<&3^jFkQ+8aN^UVQS;pY5jLsH$%dA_aAC)LxRl};iO@ru=l#TfzSlY?A(qGT~uLlihi$9iS zE9QR%8`hs^k9uSP-kHAlSDo`1S;`d_^S?xD)b)Mf$}vx0@ciVDH$33Y|GIT;TV0|d zY#arE{N-!*z8PpnPJx}!yns;90}zS71Rx^Ri(_N$Nf5So@_@BDp$JTbcVH~ziGe5M zBjRRS;KY>6Jv!4O@Tr-9nj1r!$|vQVT!n=)jd3gRR8g`e*G}z2N2`BT`+sZEA=`-> zL%cb)4VfBMP3phI-|l()%VMIj!h4kBV|dO>7h1;aB#adeO~l&In|EJs$BEKcRqA+EttSbSRv@6jj%=F!`|0#^%ad=S^55#n)zQ-{mu37r{8s) zye{HjV;&ve@WLeKUrgFECH~?dV<~auB<6>a7&Jd4{j&snV4x~HbkAFL&OgsckFV{l zR*&^fNsqZ*jCz0cj?*2NhH7}9Y}-AxxvNwBlP%^eH~usrx$C#hrkhhzVvXN9$7KE& zXzO-IF)E@-q1!{f^H9%FGUC3tPp!aZY@L|@b#Xomlld2qFLPhgeskIZTxPD!|H|xi z@#hl%dh3C1m!tpuMAH|Lh`YhSDd<1_0Nz%yNx1@hgx%Zx`Z}cIdk850&dkk*fy#x! z;Wb6z8wC6X6Fn(#7j!X9gb^1(ARP!PQvBLVT_B zQ(6=|JjLT#GEbnre5!ZI0yQa+hUDv$N9JZUwdy*)CQk7WoJ!&lT7QlpK=^5$1pkX2 zCd{k14e2ONl!};%RP~vG9EtoSXX-}v=6xY?W1&=s`G~?C`_{Lr5Ct)qZe>IB3HFLX zQC;W4w=o=1jfR?8DH0tOXexgr8eIjXaX(s{>|Uy=A#LTWVpai=Qob5t;NDhYvNn{8 zhfB6Wv{y;~^Ht|RBl9ngwVI-yzch5encCk*;Elv!F;(b^D`u{vo zGEVycF#ikvXK5QtK;|)5S1 zRxm0O9*Nk8x1L0%AjP>Jljq0~y%}YU`@za1t^DX+!fyE+=w^VW9fwu{dJ+wbV&wmT zx7i)yYMYwF{EIXqu#%_3*b4@y3|f%ds%uqE-TQ0|ubi^%iELg{;S^sFjNdRtJfdvX zZ+pj`5vD>J{N;GTar+c*HkEGM%GPF6fHn&tuqlgX&#To76Vtpa|K+91cMzwFQ25P% zX26!fJjtj)+y7Fij;DI?*=C{TEr@SS7L1kUHa+~Vti&UJZ)!7e% zm*;lJEPx+p`I6cvd8Juhyq(c9h zynT7P<;eW6J)}ll@T}f29STnn|Dyig%qU_07xnKajr0=4fso)CAfx~D>KlLlw)w<( zwFffWaW(paT6pR>QqB#Fgi@!E9FO=vIZd8IhT8%}fw=Z=#&l%<*B9sswj~VWy_2j& zfq*reL9;ML-t5Pf?$*M*3#flobodQ{CYDwU%+y#ST1#md_BhP7$>xoz5D9j;uTzNf zT92`i{*%-;@o%XvL{TNdHtyQ(P2Xct;_8xkKwe<1%2M<{L{mf#;kTD24~@ye3({Nl z6@_XL>yVhWhm-)J{sOjv5=yMi-s?A15le$X;03OX{jRBN~CY~6j#Q)Q_RKNe2B#66fPB~A-S9tT^v6|a*%98&a zu@<)4h3oFcsw`0fH1jXM3`XsjyM95NtM9+~cORRz`9ispoPc0M)+C<)%9q-q8(`f$ z=igXUJKq^wdwH7lsj-hqrC4|sbB*)?1mnM#_fJf}+VovV{EPlS3fQ%u5O^V@Hc_*alz8mLRq zmGF+>i^-MuA3a@i+lrNYlKjP=8*iz&Nzm1jGi){%ycZVNDR)!?$06BNvN3cF-iPB* zEDLU3&1sY+lbj{s8&f$Bnm=}ztXg2ei}V_yb>w{Zv+U~ z7djO2Axpz~X6;G99nozpCn>Ir?2^QDVl0Rw6fMO?C(nqeq@w^rtOONcD38Y@qQffH zI~Yy=^q3Y1d9G{7xIWKwBKRi1SH$Y&DRi~uzEPwo`ju141>?aW>1rMnM4^%&FJ<7{ zbU|QrSSNY#Q{oYksxI zo5y~n{(XO*P5M1^o`cRY5~P|8fBocT_<#I?$sa!3f1@!qyrEt8{vUSDz`(jStJ}rp zG+^6i#I7O!HSJqIkE^#Y?QKXZs84PTK=XCouG#$x&fgt{)lRZMxDjk9j3#Gm^tbDi+IY0PU7=1oOZq=g8umb!vHzKW zF*c~055cSd0t!BreQH|)IBs$z3-G0EeeF%XI380?6ZK!?T}0Q)vH2+2DvWbIm;?~T zp!kmsCO95-6<86DG*u6G_=Uodt5i=mh^fz6YL7#Bl3(FwkE-7OV2fNYD5TWJz!6e_ zISsEqPh>c1b8cfE#DhnPs!3Ks^NYrj(gG(PV4&zxeqMx(kgXm){(DcQS3p~Y z#;!P54G)yHQr1(WsjMlA>M?Q;a8c|FY?Y^6Emv~!|B%}~jedh^)^ie-5m32``R`%^ zayRq8NY1o1B?7?A+jG>*&oX?5TKsqZ5A)xrA5hFc4Kn|o{O4<>|8tEtn19--z`9YX zcOLF{OU9-f75$$(t($$3{`H5?H(o!=vR*mbnDX|+{J43Jd2m;!s2cdHrqB4!mkX`e zAVX7F4*nly=H=DJ+r!gH|Jje|rrlscb=~{!n|F$zE_#?NMCk0Z9Cz4*T_iD8>c4zb zGQxFP?#SiFtPIuHqW)`$k=LI>uyY?Dv8?L|%i2u*Ys@n;%nziwB<8Aj zKIV9GSZHhi89JX;H`6^NDu5^6;S_nHnCnW=npDc0(SKk)_$_VGyD4}=88v18DQtzJ zZfrVa9<%=NtUB7|6G7r%PLfhWQu-6LdkzK)Qsw41ZZ}h%5=)`~n8f%~W&osIajF3(~isZ~7^S{`b z=iW%Pv!(wbx`3;$_51Gf?)mxK_a5n&Y2DoShVPa5e{Syg+o4^|Cb0g_|5-ju|LWWQ z`rQL9`XB!K<5y2)(*Ka9(kl{|rl0s(MSa{JLUq$nf2_Mr{&QgBJBt&jBE%FDq-rq)deAnm`iZ-mjuM^sOBrn?cBWwkzFuq}$tJSC#XFQOqJAbV3 z|GbgP{P$-u@1k9LvyIE&e>}bZe0$u>DM=JWJ@pGU!;t=m*AV|Qy!r1Fn)@I2k^VjH z&%~_asYTsU*YwYT%$%1&|3jsoIEQ>zTL8`J#Adp9l&%d483RQwfp?l8NJ`rlZGC76 z-Nrb;TEq1JQ6{q~=}$IGvh1VPf;jLO&s66}OO7&ur9=KR;wRzA-(Vhc6HGognz$5| zGh79B@dY^zu!3(O@M$!x7sUh)Fx7{}T}l3rtj8}aqyI^^M0N1i3o8cgl^?QIqW@5D zeyhy?0=cAn1@qrQ`{FW3d)qkSJCG$Z|4Yjo!k08KiQXY7{^$X${-gB9Sa)j66RD zk1BuhsXICqTCO_cQ>!m8bZib&g%jPZT6LV~h16~NScN73rjp~(EHY8`Y)8X-dQXic zvFGd1J&RAVG{`0Eu@nzsBXc{;n4Zcde#x=G%P_Ge9O7*QZHK??SbgEk*QJB)l_*_x z`3~9_xk{?4ol>9U{e6#Q>8`uskB9m3<0S<2qFtvfuGd@Tz?0N}@r}5U82V2ypR$tI zQwekCeYh}eMg6-laQ?PaP5zKcVoK(JK{lHBmqP#fd;Zs#zTA$J&{# zueo?rl}|PPAtna%-#v)a0~Y!h|Bo_@<&r)5T@JI6{4zP0`+MJvvs7di=j6&Ui)V_z zY$PryC$^VMu>qDXHsbKL=EOH%oChS1<`Y zT=4X5xU1(N<4^Se!GzR2Rzv?orI~+vZ??r#yf9LeLjE(~+DZKDiT9Mc=@_17dExCr zrAtpaSJ0jpUP(IMiT;OA^PY5-L;mwbMsocl=W2pOAyt!RwNrXMcq;4!6gmc{sZ$F+7QL}^^0}wo`pV(N?A_Om8~5nH_s+VsTg}?{E6+;ST=MT>gNv?wc1z#B_T8JG z&N*e^o$i~12CVPY{t!TQxeam6D=3l&`V8Y`mWmjhmnRU6s=>32H z`+pGl{|N%&CJem1iu#1K(D}~@iIavct?*K4dS3ZCE|fD-9T*|e($-3y`xFgxz7fi1 zgoJJ5NQRJ4q|h9rjS{Jci0ph@yF%*~5445opEmqe3}Iu0mJwW-A5E0V%jVt=XA?`pODTSZSONiHsD+3GZbg+q|G9zucC~FeWt=|< z@e{r1LkKAtZk>@RQ!In`FuMe~arPr4FS<#K$Bru-XUKb+LNQ_TDAS(jgcgEo@jxUB zJ{=S~Ng>9+q2h2TQ6VPote(K1io6l(8YVVHd=9iwKK(9#8;5&N83PlNAKfMQ%AJf@ zHWe+D_iblkk&`c+R;6T#Y~DqMAQpRJFWKQ5i7oS#u@%|R#_%+(PH&dR__~yPNT$@G z06DHa9>FK7)YjV!KLv!gyl?p9<3Bx23*}zdeEa#Qlu$83{l6n57@>aPZTZ$kyLxNh zb8vS)k8`MDYh-zod#wi{wm}Nb3c^F1ZlX-!MLbIGA2S+_t)xo;AYty#K#Pz4^p%up zy^1IxVUw|zwpZ(n#{>Dn#*#6m7ov%;#=bg35NH4X?tB!UF8((mg=x*08QSJ zQco(vqd>Qo)=^#vNm7XaM+=?*sY2{zJx6{?bG#JdtYCGntqe&azBo@^$6AYh^?9nN zdY7gCXN0Jvx-0%v`68vS0PRH*cLYl@RwU?QOCNaZ4_rJbUdD^ld@LRvu^`b@Z4JmH zs(LoB0Swg$H;9(XG!KX@2z=ufw79aG7%#+n!MiA0BpQ*jE_;)z2LdA&PNKjtGDNrq z&o>rEaSPxrDvNn9=FOtt za^RT6aS8qf3V2>FNY`l(1u&kVqpvFfbYgfLTb(TwDmQCcAt}W2i_-uJK$G->QpAr9 zx2K#!I54%iQHvOZ3>ar-n#G?a#GN?*RF>);CTk@diY01V2!aC47vdfkZ8<+(s*Hk6 zI(0x|5CW&7^n1%eck3o^OsT)(RHqj^ycl+CvFa4R+LjLr$R{jo7C!`)E!*abK!G#x zo6ibM?k5+t$8rcEJ#wZ;P|!w&<@_}Z!Ia#dX-gL-6@)^iW;9$h95*gIR6`@Nd&Gec zBGbv7R~!C$($Si2WJGD9yjiJk6W){&S|c9rbM3dyBeVwA23vV4G-uw^am^ zn*_UftkD;#PO=SuhQw8PH9Kk+l}1VmZ6MwDvLNWE1%IKTuYICa^uHt2|5pjsX*V4D z`qK}ecpJZT#>p3!y632~9_X0g@X?bWs&kCt|Loh#{rG8C7H#My+4Uq0OC|7{D?WY{ zpMgt^?Q1k5(SL6IC75jIxKgD^01N50Rf31gMZ35MvO$DT^7~6exsKbDNIPQ03o#(Z_qivs@{YUM=lI36L8NjM@ zdVQ$|$*6cms3u(x^r9Lyz}@MZr)*?TFqR&ZGX&7|(z&wvc;HjYxHJpAPnKxq+YwZ< zW)a2B!6{nkNcZ+6*F+4dFG)P}_FT)?(SKN=LRfg&C{PxtWO1R%r|NSQU*&J%Ri{F< zOyz=|@i$`&DH)*a;jcX@XfsFNe0-F|V!7F`_GdUQtcyB9@}7ZjG+H$1LGmMYMcxY;`78D{{g zs{7@anH$jPg&>Za(Cyt()LI#`omwwC<)i zfgU0=HMlLp?^3QoYgRcF7Xz|gJ9$1Afxv&}3Igw}jcT|9Nqg;g7anXPNcM9>m zTv{m8Lh$0Pi)kTvS3ca85-K!kwRGrh*AYSz07b9oqrI-)9kDDHX!wu&+uCl!iohM{ zKVAsQ7p8?E_YgvYA3C7GMaHbaAHCd4ARDpj9^`LVr&wSPCr_#&l3xLi;~kp&KFg^> zw3@G$7kGq({!<`A_&vx^<+l}F;0$9DU^IfS%ucs^b8|QkNmEOMgatFAZHHRtsKXxc7G@|_RI3^SN5BIbzt!n_w{tC2I!zoLWd2_S?p~g6X z5wozkg$q&yt+)f?_*xU~t={VzzK$u0X^s%DpCm*GRTyIcjG93)iYIXqGV9A@Mz{9b*hYfM^ zljLTUlb-v`<&xj%9I0ZEYoy|tB`)_UG@^0p2Wdh;oU{+!449;Znki`plF3i5D@?%B zE*K;w%J7%kL#V)t5RxWmk7OAR2zS5D-h)H$ z8meT74ygss1=909%0! zc{5rzo&sBQ%=p5Wm(#XryDy&UDD|7!wuF8H3^RbyR0!UQ{*%4Xu7%}*IhAF!?h_r0 zYGchA<`z5d`?R>Gcn&7N8BE65aPOVOS}%Q@F?C9Fy3Ljeh(k!g*6)-0%Q|dEsH|3uPnF zqcwWei@Xwi@pib1xjKTAV3~Lmgy^o@HbP&gUL($1J(PrywnXAt0EkQYOZJUQ3`&dSf99?NK=-E>H>`P58OBO8aUpqpG+&+i zO z6bR+gw2NpR7itB)GrdO`2MjvxE&KO@vr2qDorN?IsS^Fm1f9U;+^q?#5*TAf7u zlpA}v>H#pQ`gbtsp`KT~jS68SPijmyxC&ZB|G8<6O@r-%?CS5=Y@TbL7Z{CawTpV@ zLc&AGJXG3tZ#o=Z8&`coFMSQaWM2|2<^W}?3Arc6+|Wr32yrzIrAU*o*;++&h>j%m zc_vq5#9=?+LQGAy>GhI`?i~b|?HjaF zNw&#hTJ%7e?@I-v6Po&Y%ITyf1b&X2$ab*y^B&P(ELW@Hpps>=iP2A|!aMX1=vyL| zniw0qNQxYhN+a88;%=Cj@G|)kKAN@;g-oyv{f8H*vLMJc5vEw#k~&lKO)4{O5A@6uP1rEU)ZCbC19nRT zpd{!9u}O6nXDAe2hNuJ2JYrGG8zK6C>p!#*Y%U=mv3%&K5YmIEjt%M*``dR|^XFS1 z>d7$h{x=^+)VU0QGvU_gKO6@7Pp>QIm`y4E@vZ6-?v7{D+mzS znYNk-{ouc)BsE*jZ@_2|wPw)m2?{TRe&nREHxo3bh8ipl0x(M2=z&4FZ!SUpCeQ;je3L!)A4$q z!xD?eY?#J6py#^2V+hk;0EjG0F1UD7^^~zMrubKm8Ks#0QLQLim(225y zCm)D=Hl<_#thS>vic)|+7HW7l-=0CACro3&Yo?Nv3$4*tHCxO))C6f~2gCA_Ld*#D zI%*wKGE==?R9eg_1d=@$W6C=x-YBY-?HwI+FR3d88l)3iDDY|5Ov{=`` z&lhRi)ow^6-9VsCI=++^?wN44vUMDk$L%3r_iXid3!P^FkLW-1@&C|5XXRNBbUnGP zqJ+v&p8scz8oSoSQhNFV)3^0@d>HOn{6A*6VF#HJhNRGZ()9~!V2j|O?jEx?t+Ymj z#nynogv^=e)wX*A{siHjN$(iJDc=rv+{*#R9a!k#f;SW*=^E*IvC$fa1uOMN)c1iL zy&j=Wt`_aTTGU%nR1u7QVN@m+Lh?LtRq+BXKXS`BJGyy9iq{F>4(D~YxdQOaKs-@D zVeUNIMvH2+7x_$Hm91O_g`+`OfF2DX>h!4PHN23c;}VPtrl>iV#_T$(qR0p>uZuEH z97Z*qioGp!g6Fm_72QS%-1DgjpPJ^n$<=e#L^5LQs)ZBN2Cv$a+%m*A*&2rB+1g1` zXoOF3;B(A-)55DtEcGp)7X=S?%LFd8NmkPYX$cF|pcg81viBjAlUJ5y%MzveFySGC zFq2^E{`bXK3tWuP2;vAh)R&}_L_w+}-?c6miojmo7gEliSM_mWc*#OXd0#~eVpH;F z_9F@vD4n$51h@0zELj*=ES9pD7HIz98rZ^QufIVxc*kMXn9)YWn55A3x+(h#QfMCP zeZ#TrD@mbw^8EjlPz^{YD}?wL+JcGy!e%y4W< z8IY%?Pt)}A>IL=Iy$pCDF&9@%S?k8}HX}sQD`Pib*gQfsqp`0Ge9$6cRICZBu(3LY)+#PU{# z-s|yp?Ki?rkd(^!h+1bj*009rK6NzXubJBT+K7}5)G!#IAdD?HNvtkGUp%VU6r)%u zq2e2LJa44SVcK5~1rEr0_6)Yq@{0y>FWep&vgSxGPuC6!grlXllSo27;o$KivB#yJ z8THcTF;yM_K$MWH)fd0v#lQYPDa7bMug*U}U_;_xd{stBu*N))z?h$wg&N8aXjA8n zJ^ZyS$n|D^dWP_YN2)$Z8J=b@>pO@MTC{SDj+=fE1j=@oZPaSFX)0AvE?Y(aSw8+W zK^zE5aYeekIrhdN%5^Lb`uqGy4dfz!5)zF{jy1j=8%(7Q-A|@GoMoiVvo(d|0U1cIT$F>m5ha8${p1)a<4TaRVT7fxS}&e?U*R(7>7F zDy6*YW8qkm112!jfi4y>GgB+XAjXT3T0%3Nd4bd{nuI1^mRlqTOu2dsJ$4=uj z-woNBRz9ELIJb2b(F@v(lCJ>^@U_?kCFHoL2go{-q(It0O5wVYh*l^QxabvVthDn& zn|$MT6}uDyApXS&t$EqaWJ4?`MWg><6ylR~4e2u#cWh)|DA#UiSTXnTyy+{y@J)Q!m;$4pCa%Zd&n7{2!t_0BF8hmm_ilLXJax#%WI(n$NGB5sR{d=Y~l#Tt&mCGu4pO2HYM@! zAjBbsl-U(^;1s98&4Nt94DqYh&Pj`wqUR2(1$I&LlEfZ~;&BkPSMGlp);2cnvB^wI zx2?nm;_S#^w?FIvp41dexac-QKkjVSs{GsNR0+Qh98MD*i>1Mh;O=T38L5yy_p~^f z{GV%ChomcL`568d;&>YP2v7Fpi2t2z<#yzf|6n$l$1PBAyp(&vZNC5AdCFKB%oXIK zGP&4kcmURxicyt>3BSN_jE zKECx?sa8)Kt0yA~7@;m9F(^W84b`ygH+)}mU~bd8YmK+C*%}a4w9pwc%5sn0Uq9qKRG!-MW3wxJpkvyr^=(OS3wUjY9_d3-Az9xeUt*?bw~!ebZ2d(-*H`gnGLfGD7{gU(;F8-q)oIx4Q8#U-MUIC_3c%R-K0z><@TP z5dEjWq>H_EH%U-7Jr)I(6w=Gw|H;dv2G*)S|41vUQ1#lbmEnOpru2L|7SB2wLu1Xx zFRagz7RrX7t-7QTpUI4SS)qh3*(;^2q(<>l!fCXhUWAF*1d&Wkd5qN# zzSR`PBWjgu!EpgTt}g$&u4?9HTA!uTLK)a8PK-Zky;pj#(m=H_?Ye^g?x4 zo}8C}!yjB)WGfT~BC(=qqMHaIh~Ax&dc4FEa3DM3yKuJ=MtQT5ivN?f^1M>7FhcA6 zDN0Rx*UR=%FNv{$$%T(qx_|NftF!nRaOGynm$7YWp%c+k@v2~7x%lS-2>jSO4ud-p znQLEVGiy5KbQ;kr)uMReCd+2&x#pq$^x!?rqk}wZ#j11+* ztyU(uknQvWh47_V#ZI-QI9=>ZkK0QZGq8kF!&Fh@HImL26y0zMh02e1&5yf6mb`h= z+y021bT>;*OZIs2qk>a8;MAZwT7g^?vYYb*BAF61U#3d~XdQP%$-!~bAi8j--ws(f zZLeQ@~`iWsXhBZ(TqF|htAUHEgBL?&{`7({ z{vWW5jEDv)p_2Ecw*x+gY6x1|<29y)Rcys-!wp@?|A8_>BjI6tC66MGOt?(&udbwx zJqhM4VImvY5fOkvT>->xJSfPVXyi$e8zJj4jC zMFW=6LhzI4FaPA#Wiw~|xMwpXw3g4h@#lT-Kk-O`vSJ3JPH4#&pA=xpNRG#nl{wFA(+mQ1BE?kw*b5Y9WzjsF=oU z#2V1PG6+|BoLuxm)~dKWva?*f+!W1gKurjzx6UTZkSof(G_5AqelQqNFf`$;_zjNJ z5|+UVsjy~SqEHbdmJo9-YQLz!TKqquCNFsMv-!c(t+C$cMzVWMq?yN%TccSWCN2~S zsd4)wnGo}si69l@D_dFiDpy+B()$b33l&)6JdV4P7@HWC0*>wgs1CdhNWVgu2qjc( zRh;v%rILIbUId^biDA8LEr2R+SSyrCy3M$k+_CIKIqj6Y>tzp!KnQ3a%(p>cF0e85 zA8sj`4918VpPd+fnh;CrRWjlXa12e8&5OYIhgmx+$;2$%;a(p%U{*mIZA+&m)u5)$ z*9PBeKR)iNEkFBGyN<6u0ckj=#v2B{;_z^3A^7ogm+#sAr?e2<{=_AF{<``2@4x)G zZ_geyAzBEQR5e<(5NzFn{Gaw)7ZA5vUD4g;1--A6#xM-I0C-pQU}ft37pA0eEQ^)d z;8(WITBoB6Bs(!eYe8^CJXw6MG0YbWBuA@{R>iZzt2(nG<3dttzK09dPayw!TyOOm z`9IA?<#;R6N_pWce>fjPQ|{TiFwnMSab4};HzQdchSw20q(>aufz3z7 zV^`Mr0r;O^=0Nj!c>ARzK2TDKBhXaAwa-PLB&EmW6sstXTnmR`8dzS4Zelj$ao-=w0H)^8MkaaAU64>OO-J>H;AV?~QF-c0=qX>e#Y+ zFIKIUs``WqdcLu-U3ue0{P3F#vqF}-aSn-eeg(dP+g_B`p6;hTLgQWb=0G5yCNgfq zyfp)^K%56{l3A+&7fF+fI8@czrp8k^1>b^!V-f4Ew`F&^@RfyL3!Q#99S`?dxs4L4 zCFNcVo%TLj2xd(t|CtdIsM2~_Iigo()BkqpZNaj(N`LTA;$KR&vKgVpM&MkGQ1{pT znc91GWqnHO;{N04{l`w3_h2XIqN1S28#0R8sDpTqih_vb{nU=mIcI+F z^FF_Sw4czu_qx=oRrRfJRn;SrY;OPomdQiCEuDnw(ZT%vhfY#^vs7=Cd(p>#B#h@| zF`s((tL9$Bk|#wUKh5*`KO`>x^?2B)ID9T8zm6QgNn-! zcmjj3OFVoD_(+rrSb}j-DpH>y(hhoS3iJ?;C=u??EW!aP82kq_6yvj-HN?8GV9i3y z5@^&rTTykQK@{ife+~KiR&C|{F~rAbtH%P!zeDCVPh?X(*>L`%{GC?@Lx>b|iG}8x zrLa5G@TCl|cRC+Pm?X07@EbH|$`x}X2>t^G5eW1d;~E7bQ`El%2+uRjZ19v$Ph78x zVu5rFie3d)!+s9jOc@bO2TQX!DdP2E+`(!8Gzq=(O}IslUHLeWb1>4T2UDXGsQ1G}~8w z^2+USX+#}#Pu}qi3xvk$o>)*x3OSwJ~GBs<+Y>keo(^`Hpk2)oU;@$|JV62h_Bw!xffF?A`5)`2Rw&SIRdcz~`h3sS)u zGmJ+E8{gmZGbu`BeB(rYNCoFRrq12b`^E)P3nu z4}i=Ei}-+l6>q~tvu$-vf4tp)upXl4u+@4Do0KK#IGopWSbbZ2*85;>o=-jWFgqx> zKU;Gi5>9#ces1+JjuwWqxFHmFbTKr!=Y#Gz?|WHafCg`#yi`8yfoVl-N;zE~gAG@o zGnrKg26=Q`d6$a9<4Zs7q0fYHP_TbKkq!^+0qhMyuP~tzQsF0h*b8XqoNHS0tkmpH zX>H~88dl%ho~;8!6CLJH>{vS~sK$*9(qXMwOTYZIoZgahH@(unswf|ElbeMe0U7ES zFO3xScgj;a|ICYZp^RbBei)7qTOamIDF1f}odtWo?QS7T3-zu2kmQa3iNI`6C@SFC zu~k!VQ9Cg`W6@k+MG58K1fniirC&m)D0iCrVw)B0c<_Q-=h^Uo1|@UvUS?bCIW5RC zEkt`o8{e;m|BRHbk`!{t5f>Hb`m3f+v|3V9>t#8+&5U1Kh#GpyCGlRI05?lXE!qIH z9VaZM>S!S`2s0F!`Xhd0I)iMXuj9T?7-X!OzVdCJ+}_uCMg>94vROM)R8g~hm0VhW zjZa^cC^JGy&-F{A7&P2aT7DEwovz3OI6qV+7i0i0v%AwcoWI>CwmB@FD2Pl#e<%dx zuKEtgzB1NpLIWYkB`qOgOSEN;q7@993SG*+C(>C{_XV1>JmaZRL80@}*#j(vn_mV^ z^g%)Fx6k_g?Ou+{e0(63dmi&??{~#2t!Y7x zR+1K4LAwlrQD!3Nr-1_i{)4!QQLyR1m>K5jA?7CRmRKC4Al74mNEveufrWRVn>q6d zY5}rjfSeBA6aaAo0$Pp(&ZVAar0}-H{}pSp{}^{w&gyE(E3TlWZw`gPQQ~6ct?Oj+ z=v$?(={I(9Z1lsD|8@GBYeqk^^W_y|FFz0)MS2yP<8`%=?m>&Rs*Ch31=&Ld%c3?!ZFxJrld4 zxN?MyjRT-aK@Aao`PJ-!H2uqvLtL<(&vxdqkB ze9CqCVus|%pFDFXm{~W?#l;Ai$l?>5lNjwr2TY=4m07CydGtf+S>_K+V{|z6>*WET}c~C z$PnZrDk)$_p~S@<9!UO|Z%uyk>TLz}V)he&nstwJkZ+Hb#HVW`vw(Nw4;2Cq>Hwui zBBJk%b*Y1rH5z7Ikm$94d~iesMKi}-Z7EtvIE-0xes0kW(MR<}&xx4mIh@0q9`S8` z6_gzAZUF^<3)m_nL%sPSItCrIA3j?$bBuCPP$~JqH3Ixf!JEK`&y(uIbBKRo$#9@T zrS;2o!+Kb1rM2BC4R%zK?#p*DNz$I2`H0hcswdNkl&l(`&9N8xGtc+T$|YCj_aB^D zg^UqyW$AG-z<+$l#C*q{3*hkVQ{R97e=8voZr7b3oI~r|E%A8XZa+;Y+vteWx@Y>voGo( z>*s%!Xr+#`5LZV@2_52SM|x;ATjk1RGg(B3t6M#4zX>S92V6-CsdJ7(7^B3+nHea6 zgu@MW)-cu3YJvQ!;n^)Y)+bstd!*)99hSOg;IuLH!V(A6Q%8s5hoq@By5#6k5kHqG z_}9Tu%jt<3>$>bK!#xMoCOf8j-y!5Aws{Mzyh7oj=IX4@!U}?_<3%OE5kaYGKmT1k z0?d9tK52WgUKRCi9a$;><_U(ut%KDiPT@K$g2hL?RZcu8fCO5w0TYd%Ua!Pn7Cs-6 z#N>DNb(P7A=hvnc{SIh z6IKg@&Oir=pOY4A|E1p8VVINQd?4_S=A*C7Cxo=C163CDQ=mN6yc>NG)pEwvPU(1} z{(teGmr>DZ_qHP#*}=zMAItRA$KNF4)_IADTjSPPrk9?4+t~T2TTu{#Ysb~O$~xgs z5DgXlAG_z2-kIL#Q&+yMq?20QEN74s%0Cdr5dEzbC3G$!!|nW0yy9~4UmeB1_$UkZ z4{D$b>w;lZi|}!5XVXn8U=;=YN@o>%E`|}BmC0i}IELSgm?XHYuqF~hvt)T;wWnRf zN42Ve5;~VF_3jhBQk}PXp;*=NQpWnqXmRh<6v&KHLJ*F0Tb8oG{l?F3P@T<^dV#sE ziGL}fNfJbl^r)(CYT`FO()sxd&OU_%g9<$WQuM(=<&>;$O zL#9LmYX+sHg%-ga#q!z z=oJm#OboID_&*PSEORDA_ubjA+{O(1>$&{FriIqN-LkAf)8F+d{HeCDIh>8Qo~8Uc zpm>I}#+8XFU6>!6iXSaDH3VdCN;IK=_c3SRB0?YwVFbCEob0MBtHT>aRp6R?sL4b| zH4_RtbYj-bxYIrc!mUFf>@OxP4FcU68~#w-t2A59_B1PXh8<12JGX>@VY}MmGwvbZ z@E6OBCpz3r>UXpdg;B@1LnRNM20F473$Y5?kKm_gv(}1j2=`7vPVju80?$&-RIPPV zTv0-$jK}L|dnmW=o<<(L^pIPs9Br)INku%|!8=4eIM}q1U>ZoEmihRAhmw3|PPn@G zL(I5tqf5HFIg1ux?e}#1WXJJk!KpQ0l0}GTE3~q|0trgFR4-YgX}Bw z)(jkD*9Ez%B^8M{t&@Ev$m0xSaP%-0t=d@yCEB6p85XVoHJhC0Fz+;*L zHR7<+w5Eef+o%Sr2(NF6NT2j{c8EFW4@+PF*}b_1G^((3s|#Dnp9d`6I7 z!6cYGjycO>-$^=Lw=zOK`Bx?_MYY{erNi#I+CyqCYay{5TI2od@9gW!M z^)9VXi<$)m&L;gY<0dM{{}DchV)4*aE;UIui-DLu)H~a@Mi+dseKeJ_3rfTf*Sg#O zQ7$7B@+(>9+$<%HCevI;izRX940{m7K25I+M2iKJ?zVpjtE)P83@lK5TP7BU|E#?; z)qfpw(!cS4{#F0yu7Gl>|3d<>+H&`}u|UXA&WQkAco*f?aC2xB_hDiQU9ksoZI)<=Sp;slLH|u9C*#P zcB!=5Ye2fS)0yD=zxBdTjy%35kiDDxf7z4sH>C?p4QhiHaEPKxp1n2LwP2hm}Y z|BkrYB|+ut^>Pu2)1v-B{?}cI;PVJ2qNu7ENIg(GG9AV;<2pp#3iIE5^w6wPx7mn$ z+&3=NuNr50QGzrab#FK5s^u{f1<||@y*LN0vF{S$?N-)fi zo(aFi=}KvFwjrL8`vXwTm5agfD0goO;ID{Tq@fabXrAI^$PWF&|M|IJQ)b78KlB;3 zxP1O4|MXj^?{8AwE!2Nrz#vMS6E^40jjeh44Uf|GTUw|u_&DL8wd09@y*`WLeGvP6^+pQ`s&UgoE3n`P zV(|2s5B?{Wk~GVqf;IFKmFROmgcp&iuyh1tRS|knxtuvIAodUVC;9K(1fUTTGjWov zGyQN{dc=@Lo`b4s+Fzs0i%`8Ys2Re?6Ym1o4MvO0g=*kf3X;FkumRAVWYvq-UoV~Yw-FkYU46AM+`3;|a zUx7-pWa0(6Z5p{rCP5u&{1ck9EL@_056kLZNZk0Oy0J zhoN?LgHU7MBiI`Rps;p(n8{c7w(wewfHC24*MtP zsj%ftTAooGmI>|1xmcV3>}|PQR$Y9sQ5D=M&Ly*yHSnZ6C(VD@n45=8D{Vb=c(d{2 zUyt^6SPiC13-!hhdXk0f%j6!iZl6G{7SE_tBb+){z0K(rz`OeQ5369dP&w*!aDn=^ zv@2{Ksx)NWhd8rLmAwpx!bSab%00q7&j|6uyN@68f&!_#fYJh0$M&KPE` z(dhrGiMdj12?VtAM0rZo$cLfQ5lMJwt%ZZCXD#p4>j@V4R#Tkq%fp|Hx(IpTfeeA`frhYnW zuWWXsq(-~)7h$9L<_h;&yi9AuYlUE_L~hw1c@lr=@LOn2Bi{7O9nO;DW@1*3XgeK0 z`ssOcj~MFKN&q)zQZx8aMa12I1#h1}%m^;bb*hzhM_r#L@Iv%1GR2iC1|s&Q$H8P_ zAT$1QR6ADU%|sGaN9DkpBKgFMJY1c^*btgT{>*no05L{G#6`e(*aJ2S{*MDxw&$Bq z-d=mh6~h1df7Czh0ScD=%L~_96T}0hg@hGeHFdP{Xdw~UbYouj?w4<^v4Y?~io=4~ z>ql47LZVl+;ib9fF0s=qQD#|*e?1W1R!03p;$OJ$%$YR{HuUp<6%H;RdzpDpHIcm* zcgg?apAv-gb}-iDskrfcIVfr$W`(4H_?MQ%rZPDj;&6#JSwVydJjvNY?E;x;k9&#d z9p&TPa*T}2OT{SG<7l{!;f%^L&0mL0=60)X=0B|ZMCF<6# z51W3~>7-9N#3=EZCQA4=Nw$}7`z%0T@Wkah?ncE$hr4JH&g$ju&Cgxkr!qN_=qTxz z#YnQir+59jnFP;}M8<0WK9WF?KoTL>OWhq*h|jh5s3K=?;jDSnkTP_t_w@%tctP$I z^$&XwJzL5Qsz4Q0LimeyOQ@D2>0}?TEZ|+)I_pg+neO4#|Jn9;@tKrIUJlN`T+i5u zu|Du0kT=K;^=WVZ(g+;h28Rq$$WwB~Xw)oyyj_n&8^NyRh%J-Gi8bjvzVp z3o*+{h67@j>oft{tK%#%i%@vv0PYxNtN{^~JonqGmu?*V9}my|loq1Phn@5K{pWr+ z@Rb!~F8lV2Cx>aJCR|li=)RdWcftQDOyv%3UKO}|a-rMXFQGiMFo(OUtmmmm;mG>> z@vjT$vAXm1!yQT}KeON)p=~N7EhNM)H5;wc;nb|-h@tu_-1#B`0+Z*y`viR#OpfEO zBmW(c=*u!z!DfLFa7jw}`{P)I&^ zC;$Ox3}84#p&LwKUZ&77q6`?tvZAtDlk*7m;Z_mqa}~b}j%Wh34HlG4XxQein?OP( zO}ib3N8{?W&+qlg%W7;ds$D2(>fI*;38iZHvgGnBkI_S! zWqqY?X4I#ykkVKJ{}~s%rx4Y7GNlpAn;ID+D?Sx*gE?N_8Rp}|@HbZO zdQc+(e_`Svo0!sb!F-!-auWqp^w^wmkn%V8y?O7Hznvy6M7KUL_2~t||DlBP=0A_S z`qc9n&pS^o>gU@(b3eDE<}&K`2lo~2EvRAiEnriVYP#_sHV-(?8eFj2kAE%iRh3j_ zb8YLc6K)+pZ46(&|MaIX>`&f{vd#;v?(aMSf+zr+LvVCsAW`X8BiM3_gtRm!+I>qaW&3MjQ%mgZf*1JkAA#+yOyPmQO``1nZ#=@HH z&ILL4S};5=9r!<39ZpuQKfdQ7HLiho3zLb2jv_BS~2Yvc5|-X?aT+@UIdb7ojf_h676|$h- z3lI@D9*b#5HP<^B2GbB!dLQ#43L*i|pqS8nnZaYE@MRgiNGp%#WV*^+>;IFeWTunM zo~$<8_8IwVKE+(2zXFWkV2`Bp28%+WT z0eKj9HB(l30(hfW5~9Fu2LInJwC-;@;-lxUtvveL>iNU|`4TNei^^$d`O57915Iqi zr>|LIP#gEiX6wP}_@B~3^bzhKCeJkFW^vTT*7MgLeA0vE^Ox)l-QK5Oj@V~gA39Td zhBF^!iicA6pCYn>Xm&h*`HDzk+&!@0`T++t<+Ah#tfF|0oJX`$y2c#D2L}gDk^jXO z0t9uPi7@#UYxHrnkcc6Hm>GT|0m3Rqs9*VsH7044V=UaB^m$5rQW60*Ewrp)dl?Fb z+2ioV3tZXnB0<4Wm*wE)1eVDW<3IwubFG%m%IZ4%%EHp>TG3dxY#r0lXKlV&>LT$- zx$ylMq;=0p5{!}2`*eF!_YNMpu<_y#H!LeIO=51l-K<_;ci_b!FB(7;B!!K~?v_Z2 zNKoJth<>iCe?pdGZIy<2h6RE`o8BwPf0QC`EGH`twSv9BiUYa4z6Wnj4ChAS_51jjOb>R-pW|z_`H7K zDW_x1hC((!QV`fM+p+(VsYnrn5L}?O(2tfL%8*g7)std zt(m2lIWu@(y6gRypMK)&54@!Xm6M-Y{mn;y3$16K{O*&EznoB9flw&*@cD1c2Y%Js zRjJqP=TEN_{~EuD4~l6x%z1BMSFt1UFI(#Ww7GT**^ZMs(h_N*g=q2!?-*V-`{Qk| zee^sZu8E}|t}^OSOtZLmma&eY_9QN#S}}S~I5*l=R#xyr#X`#>styb{R!YHtW?e)8 z9f!gNqByn0k;Ps0Gy{YuMr!o|L3Ip z9@i>(K#@X z;wYF-+rDN{F^>!u4{M-p#fG1X`;CMtQb%%nXm>%bQZXW7^O+o%P9Fv@K`xzlWAHD5E+I*XGD83fFuwaZ6cN_YqopIUElzl@hO0z4qB}4uUhgd?4mkHa z#ni%4XbSiS$>Ln?zTKa_{m4aM9~egqiBH~m=%TLi-SMxBDw%YkyZ(<-)c=Wf#;JeU zGcZLwzUQreqoua9EJyv#BhDSB8KW(S#Hd@W#&A5->m1@=a|X((u~z1__UxS@|NSoi zJ4#we+WoqC}|=3?nuw5Ie_As%RJ&=L=rmtC}u62;qU=r zmlhIQSvLrzufFr83*Bz4*YbxXB@na(|H$!40sM-)#^FIKynCRFT_{=&FoRW$N|~vg zvOh%yMl*}#FQ~xG%0Np|)nG7{9imIAg{(B1Lb&6wuR%ly);Ed$6ShSa|1u!1OtXZ;8W(i;{Oz9!jK7Ns4yJ zpoEgAhrIwg!mXTgs(mG0(~oyOrdVk5U#NGfKEtu1@Fm3>sKi78oSySJ$|P3U!z8PpWAM-yr`T zN7&&j@@=%eWqrIk;yWbLGZ3y1U|j4onAM16q^L-%CS2O$-h(;baC5|Tb>cmQ;l~{; zR}~SLa)R?4z!0dEM|7y!I^24urSI={{@>$Y2PA}l^4*gHwM2J5d-GoG|Cl$%c~3ze|-I(5O35}SPF3Tsx+%$TYv07swmFUdg-Ra zrxQWtF2?M~UERIQvL@YH(Y8RVt>O`2oXmcQcX6Ud$&IidD|t2RaZNxM$fa^_LM{pQN=|B}HV}qkFj${&wBd)CgO_Svg1T0& zCtGGnZ!(5L@!1nkCjwh=;i%c|gx13O2UAW4I&JeB(e0x4X&Yae!3yMM7_*`j14VJ} zSFSq2B_#5H?(3G#I25noL+j!Fc<1AsRgFo{pjk3m7nWRQYkwJrcz!{K2+pVYw)|Wx zuzBRJ9aKA9SV1Tik;F026{A&*4cA*CCp?FjDtQ>36D;^>3Bwnw#N~!3kVv)wJdr8suQRY zj-Sf?d;a@>x6t}2tlF1f{E@m2z3|EoV!{QyEkrKzPTxp<>Ji&i(LtN5-yA)OJRn|4co5Bsz?8>9r4e=;gV5AF>)V$yiNaF-a;<=k+ z&ZN^p#UYV^gb%*zuk;eh#WlaR1K0OVxgLs!C3kf1baz#Ux-6ZsH6E2a2qd2 zSn&y1VX`eISeU%#rU@xlElV}|(1#L*t} zmEtCpVkm$0;j_2t8HAhqCTBHp;V)7CbBvi|hwmJ2ve_|WmX?#(&$u|3T{}i|sS}n%coQaN<#{#KfmUE0KqPG!6)rRq?(kG)14h?a^`i7lU zntTKagcPGV&o+aO36i7kVrFg`^?!H{urfcV|3!Z8G=~MZ_-;R~`JnEH$qAfgeauDj zHZe$e`)L=E6g{^(tMTRuha-vNv%q}R9yGXH`m-w<(Tu|>&Uzd+(mV*yF!(S_mVWn# z3${Ob>DN2odw0*jw^09TER!exRgC>(ARt{-oFe}9bufHQWhL=1MgAAj3l9^T2g&_R z3oWwd$^Rm}6HPXD66nkere-hC&7i6)j(uBJh>9aGfq*OzJoftPb1#{tlyr!~;WNvJ z0noW~_@}_UuVT45YzOww;bU%8CrjW+USU?*b~@yKKX@yrSM4feSK3i5;=Pb+VYgi^F)yS{jmBSzo|vl2tI3o?9~ zyN0ZAVTj05iCSutBE(WKp)KoCkf^G@sa;e5NAhRfMQ~l;dE%T(os$zT%fWxyv1sGa ztlDoEBwO0u57xKBNuJ%_W;u|HlM|P>vt_Il`bELJLGoO+!w&p0PQ`i37-1byP!W@! z1H}Uom`Th-%ne2TXU4;vJ9rDA2e6=V=yw+IzWc4)RvoU_{nLwxrw~G8P zN#>T)a57jw{&mITpMUys&z|DAfgM^cfSJN&c5b zVPiAwke9gY2pQgBwpb$~!PS50Mf{8WFS5ZJ&B~)g!J2#o=dY7MW*rCo=XWp&%#nv} zwWmHkFsUBr7|z;^o|2WC{q9qX3Y;!8mC1{|c}6WH5SQ}l`Mkq4Y4e<1-D*Bdb>m^h zj=2TZr^X21a;`x+OAAr{!YZ;Go|5Op4Y0QCAvQF>ilnA=crXaKBcQGr>G}tzA|B+I zdBndCjN?0SEnErVFtP4RRQS={RgO8pK`vLDIN_phYgFAqzK}a{J%EZp1GunPYQf+p zkr%;PD<&BVsiLDc{Dt^%Y9JjM5DO0)o@9Y4on&C$fHf%N04S#D%Yv>F@M&LjmJFD* zJl?#dB_fWjJje=eFM=dNidrIpI>~uw;Pc1THB33gfz;)+P=Agyg>ZVaUb-njm3{OR zUTTda!CBB1m1rAtB>7*#XOlIpGtJBTND&Rj?jzUPEEE=) zU(xyWzkt6666yZ)c*&l=~Ia3g=$#=YD;Lk{0UwM=4sUhn&gP zjylu2wpX;Zdj2KQ#DeZCWL-ADa{IVJ^^WWJH{^bGkNkY=gZ}|K=&MO=o4C8@D}hoX z@%CmlJSb7j}H;MP+cKcoXPA6 z7FW&Qi$fhQC>byj3_Hk;Jz!RwGefvAJ$<%6>P@gsF~g)5lt81HVS;mrY!U)uU62kA zRGZd@k3qS)`HPzM_U(&|SZLzJpmk-*+867ee&9Rt)b#Ezi}%q?{b$T!tVo0XGjNiZ zp$`~re*(eAT%8yiroP^pF97Mcl22E~qk2Xg4i!oE4-!98HFNmR4WAfJnAGI-A1xr9 z5|dG`Wq#zl*ja#U?vvG7nNPm&bQ>a4;Z5AP82L?or`F^QE_Qw*dMf@R9vh@3HuIww z+73S9_DN4Z{LjtHhoA4~f4!PL`s#`k|2!88@$W!yvzLOLocThL4>YgN+g0J+dKvW( zt*GEXoeKQtH$$>d3T-I5eDbqnzV~r=hyGuvHHR56TAwWmb`R4Lk@x zqGPyHSsei~Fg&h|ss?JMxB(cqaqYb&^e*~eNM?cUs~#Lz;+(GGf!&OAUV&l|i&c3l zI@RmgvBZw%N6X!g<@iOoJPB%OP=`#MaqLYqvjTK z&%)ESP?NM!#|g7V2=S;rh3P<@OIOwLvLMsQ^46Y%j^|3yN|lWwLn!yrZ@BM$mIC=--A9ZspUpj# zyW6awcS6$1-NP`JQDs3+X5N5$2o>md`|g2p_pQM^@$pOkS;p%zjW|$RTh@7Rh2;%6 z??JWd^ijNPffd_zzCrALjs$y&*$?vJq4a|Tdr?#2VY{$*jm8&zg#2Gj;9L$#>=ITl zrvwWT4<}=wB2aRkSFHz$EYbx3JoB--dAPJt-@WVgdw%D)5XJtP^YvHK|LeoQM3R+~ z|Nd#9UAnF|?+u1K9;(bO=5N%0UR%kZ0^m;!dVPzP$ft$qhZ{r!Qf89 zRT<+CD@$aZYw zI+PTB_8D!$p+%0V0g_)14?@*}6bnA5owK({s=b3H=Vj)RxA7j|I(2 zc`JPHofA1uWXi8kkN7J!6~6)Lcn51zb7>JGt8H2ZD3Xy(A#e@?r!SMwkFP;_8$VrF zZa5%X{9ob!P(ezMYo_FAjVt*G;dsgRb3Dm4;M+h{x;a)_4cjdzc2otg`t3~K9v3X* zBL>EJoReoMHL$Qo0$Kd38w)YWOSCKAp^3&+!oBjA5FsoXI4gmn*>ZO;#KUpVqhN?*<(P1QP+#jgwX5ti^Vnh%FMk}5;Wx5%KC{EgN}6b(Gm1taVjlFzU@ayxOIS& z>nF8o#n;7uc0|a14@a3BP%sTI4pYMa5u|}o2bFwwrRyj~7%OoSx`h0%;(=5Xz_hw2 zjZL9@YdHw$FvH2_jDReee>`$_gtVlsB0^y?5E&t|0QF?URiN6@yD3L~<%ZVb)eVl+ zQN(_uh59gqTH#klvdj|+B$>?=vYVEz>#kYNgM3kvx5>rGa_|A0T0lKs5nnzYS%3p6 z0GHYGHEL4oKhr%8Z&|?XrQG=VX9&?x_P3u8CBhdlp`c&u>ya?`FC9tA2;7LoJJyR@;6%Zmw~OQ2H1MBaVUnWH?_ z@jWsbF1qGOSA;VfkGUu0giH(Mi){|{w!1?3CCa1H-@jU@|F8OoJBXRg-no6WcMdyu z&A=1K@UDALdFYJ(KL6*e%|+>_N2=}JlE?yKLJvA)dsodj0%k*U{&CJH=>KGg5YPTW z`8nx-(aD1bO@F`kM_(2YOl0BXSBtxaVs~-w)uR+PQMhM$y{kfth`R{Tgq!3QzR;@Y|xO|0pAKDm1i5RWXlIlj#LOcAX`#xf* zJ|8Lf`P;I-QPL<*Q`S~u7P-T>Qy{715Sa9sG$o0&SqZ!i`zUSL`HhxcE3I8f%&CwR zaOR9{5srK7C?ZVBJKw&9{|x_!YYcl(s7|VRJHA&!q5q|p)HZkfk}C^K1~#;FKZgoR zlj#P@h5aG~x4FWRRYYAI4k<(LOH0c*N>RH4cLi2 z2x1-UV}nfIF|OXk$;3=x&eH!>sEbSC4!&94=Act;dv}SGHEJcqq(-i1`3qJHU;ZU( zpykut?>{?*7V3V*J$1Mt5T-Jp&(rcQ2WmriEC`4R`KMZ&W($P_8SBc-_BiI<)d=`9 z)&;sylp@!1W}nwwAbHiCF`h_(rNe@~S`^zou=8CeD1KGuU;O9t1#>@r=|cD>IcxHCsRZh}-L*ekM=;`-Cg4vM{By zWa%Z%5me<}QMlr?WggDR)+_;TvL&+ZO-JdsN)vL5n7oH+>X7W*W zDPzVQTs?;VUutTk>F0e%nr+ssyyb_aoCn_FI_8QT)penHQhoN$vwpxw^dvpfkOgA0 zhMPb>G{qdQ_Ztr-*^PA(Juco0VGQi$toASAU{bUIda4S_xn6=T9wBnqBpf|v=&(O* zeN)lTKdK;4kxLkW%$d3xlQsZvU)5Z(2CiyfvG?hJNnY$2%MB9=4o9KU~?^h2aAmo1`LSn8UCsW1qlBfp+DI9V|%C|4Bj*^K< z%nx3zq$vAE2wq_s;_=fSCBv;$Ds~&gn0Y`yhQT&_nDgrWXF~f+e+ksUqjUHdroqG% zY5^%@sb^hX&Ds75!VYn^9B6pF7UCR`>Ga63XyvxAtr#t1#!kK#GQFz z|M1rFOJav!QuX5X!hgQ^l0!D%JY@R%YYv?=@Wh*eNxHWDVYucySJ>b8b(2ONYdI&D zxu2T5Pt4x0uJ8p9quo)_Enz*r?z zG*w(AVK4YU;IN7Xy8URVWa@isYaXmb!#{CEIX!&X`Es#j#57x9^+=@2O2q|CfX5=h zEUPalEQr*Ikc^|^O1q6clz$RlVwYlqd{SoCasCA>FblQ!x&sOPIO)iV;#<*Vyl#T6 za93gPS^PW;Bj{3n3dYhb=x_da;114XViaY->);ee!y7}XQF=+VwDV+o1RPDaBPb(0 z$JWA|Jx{|EF)4u zwHznTT#cF)XM2h5^lHVwga53;tExmh0*AqH5_7VTWMt+zNsJ6~Ch;#yAh?VN3H0G7 zs!o82ro7%rvV?9}6)8)z>JT^k0RJasXpET_2z*OG*rETa2^3UJTHU^5Lu)VU|E&J| zulUcmJJj;w5#>EO+^8&o<%v)2-o@et8w#_Jeg1a46t>yjdIUJat2@Etco^a<-1`Yh8Xc{wLCssJu0wr$En7si*e(9V^;0{tiQ&C zjDovxm-}vrl=|Y=0(d)F-4Y?ui1a=j3XYFJ*z)B22j)D0_+WTTg@0Jk6bL(41d1G$ z(IrYgtdx^mXXkUh6VIN|67M^3QbVelo4>SL@M&b?QwXvh;~5ZlME0T_?e*?D zRVQmi{(aVvQWIMdoK;b+Wmz)#q@2tF5s2Z#*n4zpH{3GJ>gX<+ZO!|tB%S-@)rb@@ zcSlHaBG-Fv_qmpJvP_-_Biy)oj9O$9`^T6^&$HUe#I1vX7VHSgaaPt3Jsmbq3?Xg& z98`2+#?|YZkwo4;TE1k*YI6TTsY(_ny958nw@*FP|HCK`_f{hIkepc^2fyOOV^#4k@UE@hk`Qf`ruF_H9KSi-jT(4IJ zv=U9I0TV6h|5blP-SdFrb9X1RdQ-T#^v0k-1c>2e5w%IjYz{ocT=Y1zhilWM?VPJDyS^)934H znB=>`pym8=t{sJ1;dbvz$T}b>w6xB0GQ%ZWcGY@~bh?z!Ri%te6WK_T=N)Zdbh=XS zA)Ex#SWU5Q7T5B>q9LRO8T10?I`^tam#%VvYM1ZWB;jS&)LGx>aaAhEGsM4u0}zUU zkQ@{X3{FC9jFSKchb_!^*dGuSz7**(Vb*dzg9MhI6v868swLESLPI-cZz;4bMvi05 zZA^9Vk8{|}NMbH00ukWu!)7yY%E?*{>~kvP02wOPXi)jUDzK@srm;%+KgcAyw2q|` zAeFbSTT0P7(}3oaIyarZ)rHzmYqOJ;itde-DexbOvGHXd#d0|FW}|PV+Ep`^ltYrV zTn8H*rQtZN^p;!tH7$m{O(h;5$zNJfRFvGi7<1cFFCkv87B`VqFlOP8_~Tq32A?OI zP>nh(xh-^i(L2N{t(};1We>%zk}(H?9+;21{t)_q-E#6jkH7iwX>0x`|L2|;)i_Mg zvJs7n>Ne%$j%UBA|5LjtUrYb@QyzfissE-Pw4PbeJANwo&#Yc6dbgeW00zwVkqz<7 zgy;T6zIPZaP1fguP&t|A>*XNE^*1x050pntt;-B=I=omQw`S|MaeUAad9YxKe|ew1 zh4D%Mi^q+6%-a6^ZT&RQvG<27T(46FuBrTu_@q0d;o3ok!mNbqJI!_p1;7c*1mfH%VAZeQW#=P` zGjN9_=gpb1gj$VN6IKtRbc(17$ahN((4M))P?zK%Vo zvSWkZ3rqNr&z^B8_4HZAy%gt1+u4N}=JB}#$5IT6E^ zy47#YV+JvP(=&cNr-$nm=agwcBbj)XPwb1d&pc9YeDn&?Ebp|%T<5j_xBeHx|G8$A zQX8)7(XXhzM*3eIg#6FfXW4(si*-CRU(?84wUmy7|0A2hSRXU$p+K~4+^zF2csDOo z(DCf)OrF$>_z>Ej(*Lxon2B}Qe;zVU$_cQS?YI5(gY`k6r80H=%?@H zG^WgA#Xo*bN`YVhS&}ugS)@FGNM~oTWZzI0b}nag#`fq0buUm!3|T$yhW#*<9m^H`9F&wCjq5rhJI z7FSe$(XLZ+d`^YnS1HlAh!$wF$Y)PC@{Kj5y)?0tlPj)ndrYHN=N-et9fAPBby6ICr9}l?WFT z?b>_s$1mPA^qlv%|2RkT-|so&y?vK{@sGz&7q-u3ojabpuGp{t10m_0wd1{?M3%Bg z5qkg0+8xOKTK_rb$`tKVpIX6(fhXVJ_{~hqDjRj)B=i$){Kz-|Fj{46h|D~svU1881aitpC?dPxW9jE{MqvySS zcVX^_!>2wWo}att!D+xP6piq(3vsB0P-?jEhM(=1{jmlXXCw`Q+P!3VpvR!79FBZ5D<(A}n&DN!h|Y<>NqGZ zmZIW{$-|vRI9cCtXGAORLuze<2w?{ank-JPh+7IJuT;N)z@B6WmJF${3tx=u6bNLU74AQRQ-qjBV?&a=6y?@1Ib#}2Mt$=kku@a`L|jq0 zETa!U8NHYq(Xd*`REmJ>rgEC)minP74z@!6Q8ePckCC;f{$bS#*T&4SzrJ)+_32M7 z%zNYza|`+J&-`KdJ@9`n-zWG_$I6Kpg_Rj`F9h*F+f8Ns?A|H&gjf54(_ir)n7ZVD z{V-ej&#NyzO!6NUDXh<4J<6D87yguwhG=)!$$^wQ387+&kg3tl=0)3X2pg$?xZDp& z@GDkGl)QQCZ;{osK%Zxs^W}b z;7JR_hvi1-F6kh(bRbjhSZ7;DouRyJ$Y=z%40pke^HWZ_ zpn(%KFS9{Q+x#8#J!-v#w{Wq!9xH_a0X_uaO!xstj0#Yal)glUDjnoJ+Kg6ItHP(~ zWJL0FlY_-dF!LEfdo1g*!1i#P2o7sUU5{ov@ElhAcs*L}w7HK{dY_R8sW!SdS?}R8 z#aTpzT-MH8z&Y}*Yo)%&zHHOpV(Kxfg`J4>5&}o{4emi3f_BAtD$X-iR+H(d-^eMB z`s#MzN%>NP01M)b(nfR;(+TFfHumM}#F0q4P6^pwWjOYVUIhglSwILbb*8%Mc(u+v zC}^is%GOc;+4tcdzc7!4kDPc7gyym|9RRfAMsQO;{!`H{$=KV@{7a1Fe^q4X&oQsu zKDIb|_<|9izJB*f#nJ2nF6{dQ-nEBcKJo&ps(w_I75wLa)ITKuYef_5a{JNO4Ouki z`_EqGp5{P-qERc@8Sj~IcfNXSadz=I^TSskY`Cn_rT_bPOejnLcaAFc58K?jrE)8` z>-F|k+)!;vGvGPZ$C~x#>i-h{5B3HZk&=~W$;}~~t)Y=%+h}w4%PNrBS*2b5Dn>z& z-b0PAi6p0=nnDq>lU9x|O!d~M{Ehyn9R%Si5a1QX$KHH@0~X$0i1-Dk2aCu6g8&(t#^lK7te-|BM8qjcpihWFJ$UZ2@wd*HijNqZC7Kf$v!meg2pl zK{8Z2!T<;GrFb&^ide^RYBEAJXUAl7SusURBH4LmbsUVnz(g&iOq=oYZyYhugow|7 zmah$uq_Jr5vQ_93>a_6 z(XFTxX67ApO(H=4*Abp-JLs5et43c>{yY4iS@SRPPN4t$D|a0_+&ggv8=m{eBZE}- zfA&8;>zy}0{oS2%SEYM}x8-wDJdOvpsCh z$tc-|Nl)bjbs;#3ZwvE8hNNGa7_&7IbtW#E_2LZ&7q>6$J7?#XV9jMe?7wBW z{o0**H+J{`S`~S8-Z-&a9y#}oqD;R%M$!N4{X+Hc^?!itx!%>3C(anhO1=B!WqYXq z)1*Fn@lT^J8m||8|2f;~sKxYu-&N2)6thtH&uaiWqmax|Pc&)$p0*%!)y{R*N)Bcm+Pd0-11gD6 zt`FT|kaO0_wet zo|}B_&SS3|@GJj$fUuq4x^GIreYs4jw;!Ae7hX|7q*t zmt#Rc9>_tI*T!12h~ld*-ox`kIyLa0gWd5j^4}l8A92TCW?5^2H(b}}@Ds>go(T4WmWZ0s)r2k!IA*r6!(hO0_#NP#B z2sX8GEz51(KzMVBeN<&V1QFt#1*IkFcQ6XefsHW48S*C23zeojSFdI)QN* zp}YcVmtE1*#A@pJ+n@Aw@F@OKd18vo5o70s!~#oS*?%gOw4`-V(8WK)W(!e(Jn5KA zKL<}LiKi~7HowfYGs~l4oSftsrl#5s79tP?aX+%4*{O$wP40rqJ8nRfhN9M2I=9Hi%Ld)RqfIBiCH@j+Ml?5`4%Y`+}{j>AFv{ujgeCvr>$$xJ?I5D~0YW@h*evnt*JjW*g{i^ZwKmB}LB)E-e z8}Y9|YgeD*>@z=pw@d0juX*;TJzvoOU9VmIvow03n+owSMI<2Ik;6uYOS~}eynYW3X}jed*9IDtg1K*8S$T++3?&o-Xm5Aq+XRCqY(Tl6mLPw*af7_0fWHy ztI6Ve5fKx}po^U^mV!6ld^S`11U-ug^r)&usfzrULPd6P-98mFfs;u$hMH7*I`%e= z1TapBf5GS$Ylqudj5p0&mH3;v4@K5hG$;HY5ELQ{NC%?mCw3y7(nMkBi2+MhH6rbl z_o$i(5qj5aDilmzP^Q%snQ3Du3A8*9OFs8E9xMld1p*61I~sYi>IlViLzHNNMD8+W zI8w2cyPR{)oF%L>OIZU0tEyQ{WsfYV$J}OJ%Br(^Wu2AR1;e``os%-Ye!`S8+n;2O zFg#$y*@Vres&9jU>WxFNmO?!#8|@rKzAQ`T!+Y#TEQ!id_GfhI;(zqH8a&0Qx}(ts zbi2zCB@YDpcW0L2VvoR59I#Owa+UdJrmTxkA0j?kUj_)=Y~3V&602!(y|bJeD4k13 zkjQj*|MwBv@Be;EzSMvI-Mz;aQvZ3Y3ap;@{k}_;_4hMh9FRKyX8ONJw>^I8=9~3Y z>RrD1*yVdJRL@@i<7c7HJ{eSSUZ0T*6BpxyVgJnAzxrbJA_HoVsX4HUYvxpR-lBI| ze>v{DqD&c-YUzLa>=^xpQjKpEIcgO6PtzX1P^;8G>~lN)Pwmb9YBOupzHZ%~p&2^$ ze=ggzW*o9$DM}}+aSN2S?UBmP#o+aUU2or0=^_ik23cUG=PI(%jx`CmA& z=7_(rQN*^Q!#;k&7kd%Fn*yhaA$0Z@6*#XaP}QL3+r~!rRw*LO;=6FHQEnnRN}DP7 zA{01$rrDZ`MWeCKVLFw=;`YpAOc|n8mj0_m3`brCkdL`A5FP&y6!i=n6`4 z!l9T#a&Tp|qHa3`YXU@Wg6ON5GqGv;AYwusxtU(6wsQ0gW(JxNKVl{bIwu@g@>ssJ zP+IKCmqjlqUZI|eX~u>4$Gt!JBV=TL{ueNb{&SWov#j;NmMwW*RN8KmYuRrtAg(CZ z8#j~VA)G!l&r?rv{&<<#So`S<#pQ=ZRMOhkRJRo2tewm(cs+~H#Kc6S9GId-W!c~< z9tYt{zw-lN6Dl3bRNGIebe_z`(!{UApgpzx{$=iY1|1OUBQ!kEx9v6SE3p5HLE4d5 zkm{4xYruc382wMX79aRo3KhhafVS{TQfdQj<;DKFbE7I9I&(|o|FC~vY>Q5Y|MP8C zGyI>P39)}H>%tGaHs-m5V2&-esedT;&mXw6UGl$94Cp^%_K^Q&1viaxQ7?ftOG5py ze;_U1dE(znFEEc=%7e9N%v1Be{_y2n!BN*N{&`>&j>it_!r-O4-v|m;MYh+&hW&A0 zxqtp}qi$y&%EkT(*xAW{1piSFVz(TAy4XLEj7CAu$n9?993x#h;{uC%Q?G-@Q!fCm2dx0|0nIL z7F7~^yPBk-oTk zCn-GnXd3&+IxbLMm=gQvB&0q477c`gj}8D_5qj^&YY#bWq*0Ha`&!s7@V-2KH4`BE z_SJhTup6~c{lm4~5f0YQjE#Y4^+1*kb|ju#dOn(hqYFayi0V)iiK!azQ-W^F9p@S; zgtBG4>$247GT$E&aie%$mn8fN_Ta4d(SD@eupg9Y0Rn7+V-a-He)V2IOU00NRs_rl z9L$4!nv9kzFe2Ojrc!U#G`BKBOnTW@(9Yb&s#{#$Z>tPnqQsW3=kQX~&bp zgj+^ly07HCDSx$A+3gE@pMUBDrv~6ZUkd-{%olGy(zk!ke|tdY^R1fHo9LU5oxt0l zy*#q}`=8#v$Z)VCshGNW=5tr~9o04OiyEeJLtsic1OB6Kjm-UFf8X6k{UxAM(*OMp zi|=zAQ{Jz!pncI;iGMZi`QhcU&Gdi2YETmX^S2ZpA!zqZo%Jb1^>%PE1^@Xn%$`~n ze-osq1GVsEyDee#>4J!bMN)j(#ENX|yVz;r7aD8A4CtF#9lX6jpSFgY=DD0u9Wo)_sEOHi>g2VXwFwvt?B zu2o@*poEMVWKhjz^h}ZU^@Utr%PYl1)026C9aw=g=TeFZaU)0mY4z26PX?6V|Gm5Z z^Rs)^m+!5;s929T*gxA}xTEq4b>QcSDt9tDO^H%x(yGis8#B?Q67y61E8TTP(c)%{I-YaLUC{n+o zNt@@djc6azc?qL<(~8la#J_qaoCPD!eT~D9$#|rco+tj*4^Z;)i{6!5qZ0qxQ{*h% zE4$)U#>s!*`Ep*YwcccqB^ zA*l4%kU;EqrP)ioTL+yCUPI$)PimoY*cko)A?xkqtQx=n|7-7k=A1M4rBNeGp4FzS)XVgJwp68YsnpV@YlXzP7SaDAe~4I|id&Z!>7)l7 z?3^Qqr;K9?jo`i7W$B%JLPFdk-FPT_m;eQ`Syv3yr~{HiaQ}?p-Sfh)Ce+9q(;|bS z8-)}g-ZYeuf{;pdRBL^K9~zV8LMhKKO~bU9~DxbFz#w)Xw{Cl9+4U>S8wUJU<_reTe zD?fgi_}8>AuopQs@c(Q=zlnWicyR!ttn*gMDQ_zGw7LTfz#c&t0_3>{X;8OiAsvXD z_ZpIN?sEr<|%&(Uz$H$8;$?p+G zs0bY0RC|s#t@60z?sqy-cnvc%5J>iM6j#d-1&3h>xSHjyGlH=qe?VagQOJ~cmdd1X zFP6i=k2EAS{2wXiVJjq=*Ws)}-HTb2=P*O9{AYi!3bJAtrtD{VuQ$!GJIm4QiA0Hz z0{$>k(ch4{vTSj>iv1f2+74))v})?^K%&hA&NYkL&n_925Mx(L$+l|rmM0~EC8Nic z2lr4uk=vEY45j3j^sGnh7pJ^^Zyz?2)=E7_zY8WIg~a-sFmh`de5uQC=43{)8g5G9 zSECA8({RUA&|6p^M z|I*au{cdGIFABXK{`2^kn7f9#guPy!d&q45Gau|)8_MfH?{Kwx;}%2wKZmac|8yUd zRo(vg%Zvw70?mJ2=uCP4ku&ejx>(IzWK#cmdh=0n5KQ^79sD0fvGzj;;r}$Vc!B7G zq9eZ=?^tEoQ8j1AUaW?O1z+Ol_~NB&*heg(fXb+v&zYsx&u-Z@Um3sukRGlct|b2T zQ#NYNiw7tcO8(cD8&gxu=aus-E3bP_fxgy3L6`yJ_zrJIcpp(h0OgiSWI+X#&b>nM zDS)AckcUXIS2kZ%KF|)g<&WUplFB+-px4r#q37`ecihmnd$E?{gBZ}_$?w6iu9m9P zgbKBzH>)(O03SAjC@#zkc~M@>b~XRa%5cgZWb%E!DW6~HXP}VkKusvw2(4$#rn%j~ zeiX4sY{8C-(HE80On2orstR1_e+VDWIwon%QfpoIi1>E=(W@V=upZ7Uf}>Pj5~qj= zd3}?IcN}w5AeL&2gA7O?OlwzKL9{C#xHAV}*PNh}DSctZNeMxGYEaeZdKdx{V$d4Z za~sSRdDht}WlYCN{6BdomsQozq$DTWnJ*A3J@d`K41H zsUq8#Ocn?{T5K=kg6+8@Q={rHd|?kipI0pAhq5YHQym!aNa1N_rxj6+jTE4-;w zWFqB_1HqmDS-9F;fF!6gyNO2!vWiD(Hsq2(@vtJhuR84(tM`PAL|^JZ7Y_}}vQ` z_w=$F*WJJbnZp*fi(u%f$HqL;zoSeL^`8s;`p=-Z#G3}z>6{Udkp56Stfm$loU~6YJVt_n7EKQziKC8^~K@b5=x^)sk{N$ z5uPFvi17tPa{T=y!8X1ThPQ{9WnlvHRL!b#j7UsMg0$eLbCpq_Rgm;FG`czlcUL#{0z_XPLzn zRncLmE(zzRl|>qc@%UflumKcHu#De$iu#9`W%8y*N=aqHi$OL5?Fby?(4i;$#%n!1 zO4R?SMRy3}KU(z`zReJ=Ud#Cd^-HKv@BQw{;pZREEK0Cc0;e*+99jut%vExlCawla z2rf)a)l9UidS}+t!vAS(Tki;l$bv*y8TB-l$e}R8a4f_6{<(Aq}l(_zT zBXO!YX`o!J{paJw-pk~F1%i#MhH5Np23&|7)1mznkXTiJb)XNd2FQiDTl)-}}|X#0bfM?~hBzC8TBb zgf|WUC!58K^<_Gl0O~V+`yZw%!*1{GCQJ4_0$AR6qgV8X(t~P0d!^_e$^R17XZ!Il z6Z}&sE2h?*^JtHL|GUrC8vL`g<7k#;y%k<}@nEkPJAF4qJlDH;lcn}a^8;uIQZ`jz$ z15XfbH3DnXTy=gR)SEO+S3{ErhPk3i75VRWavH?PlP4!g2ZHBbI+?C9zmO4DJc@!^ zBja1C#~4hOtI6VB47)cVulM((B7|%@99$HZ1KPBtcO50omg1(gHB`xi>@navtt+Xz z8-*G=g2P7&6==~55&6b3W>HJ6Xz%nSMwlcjMUz9|{}2ns)Ype43(g(Rt8#kD$>x6$ zkTdc|xyE*sx>*Irl2GZKetU<3vkn|?Gr8i96VJS-tozB5|7EQQ_6YvDEa>;YFb3bS zzl8cfv4^Do&sEEv57t=WvM!?Lh<_nS>ZG`F(Mz*BI%;ZFgVlIvW_7z>I`{W>63YR|g!6khC7f@z!cc8F$5z*=x9&8?ZkYGdbqYdXpcyI# z$gJYtVjluOWvwr6E}XTGgYBaY^Iw_88U`cHGzeB-i=6Np^#8gy6lpFRbbw7i_FoHL zouhsRXCK-%-x2o4@&OZ9G1#9%k?LhKYG1dj;pq0mhdK#zh@%Z zcmm_XG>|1kTJ2VS$KcV0EgUFpXB6)UB`bz$A>xZI=`vI^$TzMAIY|Fg3BSF|U%6V& z@UtGc#~z_s-f^$^#s(zxNVS`UUr5Bh6=rNj^NC9TZW}$d)WztzkDjtNF73$iP9X~4 zZz*Nc%9nW>7X~{^%NAp6Z0rL7r!-1WRX`_e>Mj(m#P5jHs@;$&k_DHVEqUkMnI0p= z&NZX9DkZYuQHapolow0j|H(zPar;PjPa>#T7V5N6(P^6FEEwrAahgPRs8TfyGU^-XHf!5<=u|Vwv^$(2+VrKHr&tFd8uBX~D z<>sy}^E>bj@vl!Z6ZuRBr!iI86y$`g6Hl*n`^Jr>$0_h{BU6o2wff#zHQWk!9K;rT zEH!aDfe}R9sfmK-?)qO1(QL(5@QV z8{}6&N*e;xw%&+L3N&)5|0A0>qK^vNm*|6{93I#BAV0U=DBL#mKjnmC3E5&yE1m-* zklCX8I$9cuQR=#&s!lWnQQ8&dcaTUUt$3439be`%TPki`z?2)q`JnKd2|Mfy}M~}o)8vb)#$I%<0yBHs&fq$my zf2nWYesJ&rWTEEwA3yHkQnpaEqeHC#)5^)M+O`o1sy{Jz#gO*sO;Sd8Y&zn5U+ZSM zjKW--no%VPTH;?zI*K~jcrEU@#O!MfzyF04$ZqUVdclN*^uKr@eZ{b$dM5s#tN&A+ zKnE#P>K`unOZd-gv%Ll2AH0++#w=9vKds+>%8n+68(K6N{2xvP)rx;uy2>@>eYLu+ zecxa*?0tI%KK$ES%N|2uyN3H*jB@_) z@xYp_#5fv$BTL~VVR`buQk0!;GcY5tE>pRJO<>R~ueatZkd*jsQUdu^RAP{#>y@w) zH&a!Klt$&9tSN$<9c^mA`HFz0ZsYKh1#ZpL(A*FJ&Vpgq34@YrQ*%V>v41(k3jl2# z?;$wi*eW>rZSwQv007vj7|0oK+`9Z&GOiA%>`qVgQ4Y%t_(P5zzYq$jiP|Q4Mc{uA zd%X+3V_6Nef0}S1#ewNZvd)rSqmnt?P_}qPGakzRyIvBJ8ks3j0tq@xM3`5l3RvEh zNPNqZ>`o*dj;xwFsg@FTnqo(xOQ)dPLfo{fYh$F3IiY&QmDodk`un zOH^|lH>KeJLB7;mcXc04Xqi=gz?yMzUwcQrZ&lotRXxa4q&G?Z=Yv<9 zFN8kY(9w0Ko3FG1|IGDx)w=uvS^WIFckcfG;UClhI`y#eEkCa=9y-VTDYPC7L&g>S zsGH+S{@3AL^52mhLlvN6Jbj}TE-zATF3~rW7RS8kH=!i>xxM-hK(UY%#Ejs8)8Z5X zCbYNl8?t>U3E?ezD5rBpopZtuizSc+qVfM!<(ukqBH$*JbL4Gd4fPT?-^LW%k@|<~ zM~oJtIf}yq!DD%GA=)l@n~Zp{u*Wt)FZc#u$PZVEkc<6XpU_tse$fgdr~&h;PlI}{ z-p^hm@`($aJimyO@Q|);5VDI!aLE6{#VYYH-vg<*5AUUrpg;B*d~o?c2QJ!rGx1Wt z{}(&cP(?$;>Fc+Bp*J1vZHG-wL~8w#k)!GXv-I{Q*P#C7F6tgRgO!c6ve)paGUvXl z%ki23RAkmn+EN>W=^>G2`oAM+vW-#uG(3@7I>JKL3C|lBz{rh?kt}rum|tZ<&MbxD z;kmxsM-IqV^V`PsQ$0iM5pLuI#BnqBGMl`Y^T$<;Ls0T8Wxg09@AjfY(|5f(zeW5% z&AW`-I)v)SANg%JgzTG&FP?KieVh{TR&^Bo^XfH{gL?Q^V_UkjY?ueAHUhen>-}{E zt>mqqIGj}psuEi~nt@b%6jMii$xfZ4_O;-j+%}QM3T2#u*kpv;yOWg?{&Rb@(mkls zy6)Fsjx56e*>+z-y|;=0?v$9jw<&OXx_$QjWpV2NupxW=7q8 zJJjW&#Mw{vXM(4Hl~Xs^h5u}YlczcEFDS8NXug{0B&NYWXC+aOHgrGAe2u#Oah7HzPj}oyde^Jamz!ejOI!OXC0W_n~;hWfFNGv?T2#f&H;{JB(Um8AX1SK3QHc5NWvY zdgDDp)TNB)O5<@zr#4Uj)KJtvlt&4JteOo4C7IGdzHF;NthawIl0oIyzv|Gls$fL? z6{@MWBb+CZWl9Fb`fwjkcU3=pxMGAs)zpbiM~G0K!EOtsbGF!tNm{AStt4C%yb)7S z8bU(p6oNRS)LJ8sPX#e1h1`kjig(-~sEKGy)Jg1RM}z}agIr!GCWe5#v-v#46nU5& ze(Vvx`Jij5?f;2+Rjw!69yb*6ujBq7>i@*8(h2Jd{QA$QW;riiC-JXKvsB`R@84U6 zC7hY?<6nWQckk~AXnyUwQaYt6<~e0nR7#J_*9W5oc* zWtuxuGj?o$P|yA)Ed9U6xcZ1;eDKtm?8N*(Rr9y$E5@t_2~q!WOugfn_{iX*Z-ih?TFk5k@#J`G~PWIjb|7`b9uayHK`80jVn88tw zXp=P+Y=kEAzt)~>g~2~psdZ}o^zWV&N06})wpE$7GImnk zMm2TNTx;U6PPCBTkzPz~tiL1>Tmt{ids+MO)~2DJh%0dbSzfs#YbfhnV564ibWSMv3s9Y^>L-m1r`_KxR`8s-eKK+Ov$}r%7Yif#U(a6_QvT1(SvZ2w zlVXicX-;Up+r+U|tUSF}GPbEAen!P&ngc&)lG%K;ZOv^Ut$K{@z; zkh|sqPLf5hn=@7v&Xn~1@@)*fBxJ5 zy<~K-Kwrm9S>s-wdZxWc-*-xz$i{*8_u%(Aoe!UBmkOi_D4oYdSEgpzYGy0{Sv1Zk zPg7wYd67j;D=B}#q5l`!3CpHs`glcFxXq%#B<2L*A}PX=KP4tFc3T%eggW^xvxk&a zm&eOGqk&0y700=we78@sl@TZTUvat9VIn`}iWqSL?hStBy9sTLLkYMY1&94C71S`6 z!T+N96xb$PDhRspk*J-4`qvBK|NI#$cQqN2WloI#@ASXO@QWhL4hP#fa5Ig-yh_#p zv=6061m_;ak`FS9skoCJs&^!a3_{+Ci)?;-YY= zrbns+CN^Xtznj#qO{pjmn&W;W^<~f|zbUm+cAxBsb?Krgc`?rL)e?r_1JCk~a&LBo zb4#hqsrp|7{zq2lzv7}SxI|GX#JnvGBP^Yk+lsDF4;JL!M% z7BxW5M>?i|wPl)kRLxnr$+q3<=x*2PF(+DS6G0C*s1PHghutznC@ zhO#w2cnn3Am@|{flNSU32v%!+a4`NK^4|}2RPdi+c~(3#{sz6rP|mX69p|tJ&s>@v zb?N0`y|ySc#{EnG2ByIABK+q_LESRcl6er01iE=4GJtomS{aK1!IH{WyVpK_xzK|} z1WFs86a3$aA9iOkjc#M$nIR`;A4}DDPiXak3heGF0A@9=NIIPHs%NB!V?AW$DWrma z!gm`k68~pA1((G_&nM@x_$T3UdgeB?F&0H=n&Ed>Q~^Oko-++lH1dWC{r*euj{A+{Awv_ zxhMC=kk)z`eK85+ae3*v1U*Cx$gQ1R2F4k&gK}+rQw#D7(eP^{a0y7T({w?N*@SoxE#u{vcHc&ms zS4jLT5UgBNb*-arD+o>9U2c2-S*FPU8hElN^$*ugPW2vrN12ni=W+JF`v7Vwd7t;V zN=WW#%v<|D;mw|qc|E~D#L+$m|6KTjcqzRL8YWt|b&P$o@3ZHP;JVAcxM!O7)h%9) zi^cm>(Dbisl&1nx{~4LSx$Q|=P37`}T{y52$!+)br4=XZ-1N|C1PDDQ=!x^PIjNaB zV2h)*H%&Zuh!Wpfi_^Qs=Cw!y8H>q)sQvRJ_(KzuZt*o2%IZot^L(xM<5G^YRY8y zak2XXP;ZujMr`gze;Yrom!Nv6I&;epTPQSF-FX_@6KtqH<8(%`3X9^?_1B7A9WNQZD=bruE84cBAFE8Q$EgVqfJM#|>MghbT@ z7T}!&&@;>f)uj~W(?8tCjpwSMjenBggcB9D-sux ztx8-0)Fijz8(XGa@lcr$USn-nh<$PO^tfEQ;3P(HR^Wx|pqNeJAhx>0NVI5;e;qNy zt@&S2n|=O|@SiWw0RJ=^rT=UP|M~KF4atB1>=gC>BSs)Pe;oba4cxa9|N7LJ0{*$^ zIREG8!A|wp5-3vYhU*wxM)fhj{_}$&RZS#L_|KnaQUCeZZ~q;Nc2dsK1ICVj<%54X z-r-0u?DV=0{F(0ef2Ue!3iq)ef*_^J=ix9X|Eo*Z#=2`A%?o9a|Fx!Z8LF%N=HDjE zVX<-E4>|n7x+*KIPf^;h|09O|L!-!_pOdFQc(n3v$v1g&>=V|LpeFjivlulU9h=%D zR(Qo}WE@kxT8K%u^#7Vc_)XudCz#gJgE$qLSLy$bX@Lj@^5}o@9P)y<2SuUZrCyb- z3PE~uEF%JZP#fE+!4yc!Ie8Ss0pVEZgb#PL`4g*JzEo|F)BF;UW6uGrNh+;9mnBTA z$;a;G*QO|S&DwvCm(g`tTy_>AEhugHQ>SQ+{3F|d3$YSuOu(I~d{b6MAZ$@e$9y7d zthb>mR}~$%kwtE#)*{N)mA?$dF%WT;dYG`dpZpNal#a{DFZzESIKz1g;6eVR<6%Eo zY9;C2%)M+I<=}f34U9*Mr?#u8i`3w1YJYmH4zCj~TEEU2{lD&F+X!yiZp!N@Z;B+g z5tiY6(irm=@eVPpa`Y*kMMBgGJzmSdyLvU1D zfOOGej4-gTlQ+ipj`>F%jylB%+2INB4#(ggClP*bbD~?XVMyf7l5tV&uBHvNWKd|{ObSXKU?sh>Hn_ZydB|^`ab}&OSiAXINiR=&{@3- z9j(lBK#`R1`ox%!Uf0W}{{{7bHasZKyw?`Oo1a(y>o;30^1p^0(GaAZPBtc~^ndS` zm`^XyU8(ecUq$^Na>GK@|M~Oaez?*0!q@&nPf!8E8{77l6?_hHYXea7w?GxAvl&(fQlKWHX%CB%p zMK1)d`207=xk8za6&b3_;_7iMYpie4{}e(IiatJQPWcG`#M#1f>5Lb^|}NROxu&HGku%i@5qU zRRG_n@!D^-QX?^3pJ!Q0)1ek6E(@mRl5Pkb6xUKuFcPD87Nv=pE8gSyiNFWH5Xw^* zq_8DiwlQhhB$3J^gc{+$MqbgzWKw^bF2;g58n7C|xByAmlU8S%O#|gnig9no`IRwc zn8P<#U}T4K=YEed`+-yDkowONXD~+8#ttQ=-YcHSf0$!P|B9>2C!=d&A1NRI?08{f zw)g5Qv-g{R{A*Y%{<)w}g8X;EKVx1;gbx4y(|dhd`@d6mQF-Kw<_6szO<$k7M3tO{ zxk~+?R{zhpXDI6bWVE-HT27h3$)9}y|EDj$oeMwQ^R60bspMxL5 z-Ww(l_{Ugtj^w|e2g71|X46dXQ)O*k+7Tdhq40k?QvZi?*1NYqI@;w`Z}>y<-=AfR zQ7fj1iQam1ir9HR{y8Hn#?F#6FFC~f{fedp_V3yEdslw+#JML%nUyJA0KMaX_WHBrI)XQRm+gpvWuXAOG%AC`exoOu>Eq_aNa=gF)%xpIb z{9ZJ2YCwQU<|^K z%R93^QU#CgD1C$piLvsbaK_p~?m~obRDxc6R%&iLu?6XWVVVt>-KyCdFfj#6P&*If zn=_(TMhKCoSsoU}7vaPk&8}mDZhOXKsOtSFT2YF=mInWu=L3(E{q}vzJ6CWu*amM= zvpWJtQRhlJut1)ITFSAZ4iI}RIUa=HaD8^fQHRkqC8d(I8A|yiU1+RqY$$q3(e@k& z7-23)ZAYmTfUP1W9gu0m%57uYBHOnYwxyb?96IDapyUx-Hf=SU0<#Kck;|T!{5q^d zPpMN$>Vu@IjL{Ykogw*b&_Qf>i;m)@Sksh|6`Sfnu{Fu!-sOxs<{XESsSm%>wPdUv6|8xs(6kN$d)nr8NHPk;mBd7f4le?S+ z4%%3zHF9EHC02vpPW_*p0{VaHhlryMy+!K(px$Z*F?czHr^IX~NY-2RU$=u;kf;Oh z3~ZS>*lls>f1$z~=N^)Tsm>J`o@kNOKtVfY_oe(O%}kQ$9$1a7MOcB^Fd}U77~l&7 z{xp(2?v>tHhf@u8RrbdD9Tc~QM~VPjW=MMKiYlgGmg9)#`{;@My800q3prgWA0!IO z9~#Sx;U}D85=XL-e*rLm;~GNC^Q#n$R8+=DHbP0H9?`kQP~$V|`zp267?NY7zp4Lh zgq@pD_WeJ+tHTm<`gq;h&Z#gurCBODKkf4BIhbVdL+1BzdJzAjKzyYBJjj_O2Ei8E zQVUN8=%JWH!Q>tT;`qVFc9rp3Fzc`Ll4xn}%r-)R#bY6$ByQc^vB0~{W2<7TL|w{& zS&wEGMe9G8Zz#4nO*7@bli%n6NNFr*W3!oAQr7xVzXuPm@gqB`HLJSeb%n0vzl#9d zB5$u{F*4+q`iFROe%5Nbl_C6RzS;lHtME3-e{VV1#fFAxEXfpq7E8CZ)2T~~_|@C@ z^n#Oo!ztfWYf0NTGc9|P7_*D`w<6{}X_ z!r1;`sIIsp`Cp$rdr@`*6GQD{*8l-XI!;TBL31f%znlmYB@(ML8lPS5X~i=rC*Y_> z$arjpBS|52D~(Y3<5qb0?BW*QM>LkJ1ZB&~ue%s1jv&`VOh^IWC@xJ=53Ty&KS#u;l3qA!1+Emi4VYRtBMUwv^6+iiod^w} z=cL6d);CXQun3@*31U^np~{c^sV95@Yht!GUeEN)TQWbYBws?^-N)wV4 zRLL!oc7D|VNl$An(j%%J@;5i;&ZP|#d7T!O8!n*14&_&JNZn@h^G9$3I+?I9C5OE@ z+eLi7N&S|U^^YFJGdvj=$m|q^A}ro3j{%Zt>bNd{kz}@dRx2}HtODdv>xGC}f!2hBD#jT-=*8Zn=SyOgxYwzd3 z-z528`a}AkPUx6;5&ut$_;Y8m^8fY!ykw~Y`k(&#E#V>Zzi!~Y9;R><^?!b(-p7vZ zuZo!b&;PUceG30c{h#J9U+)cN zl}#7_5A_d6Kq~NdpSip%Y&VqiXw#bfHe~6`l^Qs6|L#=T2qSJx%e1|{7}ln8KmX{; z4-tk+NOz7}R~4H2C5)g88YZRQMh7{me@M`-X+tkU1K^f)9PqpNJh9#2C=O;Re| z@Xc?-$W0$xDHR6@QTHruJ{JnR@P9B3-X>dsN^XAt3!ne|_`C3*{~Q0Z@_MBy^1nvk z$I0(V{OgJHUz{`ZD)VV`#waKqGrEHARu{8#%KlxYYqFLqQv&aA2q)k)8p%DP7y z=0D)6FR6cc@Jl{W|0nlHY^ zs8a-yCjX207m(Eqq_+b+#p5?-q-N9<*q3O7{I8AWHm6ssZ_=;-d}oHv@ka>murFuD z@y+NLd`6saamA!f9O{iFl&}h7&q1Q-|K-Y}no6OR#e+C%N`pI6I6@^A#J`?Vh>lI# z3@8Qb5^NLIn<>Rv?rPQ<8U`2X$)Kfx(gW!wv@)gUphTS+*$O(!DA-+D<>*Zjdz={v z1!7P9OUc8evP6>$1I@f&!e{=k7#Oc?L9ydt0_|WFlEMv{D;N<&Kxw*!30PCS;n5JN z%K`sz0KiZ(mT(asT5psxd(v^r@gPX~l^7=Tu2Q_k@!lqXWz>|I^O&ZN3W@A5h%W^H zJuk0}(>NgUN`LSu7webZ&4IL*_6#v5e^Z;X)U9f>5xlG)Qzw{>N|k@$QQ&H-UBN$}hIk-6K{PNqZL0Vpb>*V$bw z8{zXU@*5}CkH6tJ^{z$!7yU2D|C;!p2}6bdV`Y&4zNyBP{P*F`-*XQB{BbB8b&kzD zV(beYum2=eE+mm*`t0{w3#+7N*%Js;fO*{0SU z^dWN6!9U~8S)t^+Pv!TCzc#;(>dNeWy~Tk4ga7B-H*c}%|9&C$pAAL*AF)!^uu!XBr z&*yCXB^vkgJjC~S+umS`>Cp*n0S6m)8mbxQmMU~)BOsDUke>8^HUdR0OB>u4>Kxz< zgiE|escvw;5=pw(WJv*&T<2^y((X~Hr7?!^pOs##D5xDqm)0VTffCFQdpa z2K9e10vihHfBNjj*(@b0-m1<;l{&v5h>SVmTnh_I3dcHz@!o1ma&i?ppQJO36YZ&&WdK2>ZU zp1Junt9|y=AxZep)(NL|wqw^(|G8T#{O1q8d*`0ORHD%Kw7T$xtmGgOib-$W(j_*_BmMj%p2ggu_c&iYiLwed_pTxT z%gVJYT~F}ONx`Nazh2r{Z&d~(-t!_KQ^nz-lmZJhIkn`ApcEsH_mgQ(e$Ou)PPr-8 zvUNwO0^(oJ|Jf4M;hl0kVFc;&=4x(KPz^Y_fgbaO--^At(%Vj2G$GxRx2u$ci#4cR zV4s;%g7NMkiV99LwuQb8Ar~ki^1J)dTI#BCn_J`n%-`B zDbo>el!gz@HW|UGf$IJHUSexxo}TZUGuS`pTWk_w6TXxhl=I@$yjf$2UUShFBa$6W zZjA2^6--&HNt_C|l@{vk2=r9O-lZ-}r{26P6m=O-i0lRNQU-p@jI6z8wFh=ABEk*- zCnc>nhXs3`qX8;0MLZx(_nn*qM=1Ar{`-;K z((U+vGNN-N|9x~QP<=G-NA<)%tg$K7KRo~Gi=GWOAN}|wMg5;(^y>4ee|Yt0T{*c& zjDIOb_|N&*!~=8L{PhXP-CWy&v;&hW({}XYCetS_uE=S6pu~oOrk=xm@WR@&9lc)0)>k3;g3~qiFD~ z5_O%fxWl(8dDz{^0wA4(HW1vAp{f7#;Q#zTryBTw@-VC`?+exxDkd6r8`k}_e%fr6 z4k#>Ski_h1hB1|ttccU1wVGk<=z@92A#t>jkO?jiKW2iMakTWD(hS3c;+#DJ70C8V zt0s$!X<#blz0jUNai z30@EycX=OvgV{{pEuc8Xq{lbEI);{wQ2z(vqK50<1S15Y;aowh+#+pDIheH3(U=!t z!D_((f}rvL^bFxRclPi;Q?mrpBU55-a{2@%Q>ZDqnNYsOrm&igmQ?n96Q7=eNR*Pk z0h!FCmOjGC@7Pc=XL>wD*@(IZZQj`CgszfouYDR?PsxBdVR5BTBjjZ_U!$&p;;YpfxCUaQVaf03-_#& z$;&!%SdsfHi%@*(Qq(o;j-$+VPq`wnYG{XWug@{7e55#TbNmzE;q5Qe^lZt0$BD2Y z*Ae~y%^Q{t$Qk(ip6#ne8l?V@<>n{m&t+?w7?;$4{tawiG2B*vDr=YYQB{8*J(!y8 zlz{z1Xp?iqbw;qkP~@zIgiyoLYn?Z42}E-WsQ+`RT2^c<&Kr2=Wbls>h&_?R=ovtL zd&hbAexo|58gdZ|sZWn~w2U+E;HLV@e~Q-#cuW6NpjAObKkn^oVDxPYGy`S|w+}XD z1^Hj<6?RK?HDD)2&Q6h1);S;uI?hKrtG0fF{??~lL2TD&ma-#2Iks{X{l5t7V{S^X zc=#0fnsAD%=n($oyDgLP#Thw;SV4NwAK0(RA2JGlj|#I$Vg!^1LdYoED=}}y)A6h} zbYi`wL{dT6)gu^CMpcEpx=*LNmRpO>g9>FDB@gGJ-4K#Guf2_77Q zQr;N2lPd0~1OdW|bm~yp(1+TUR_)+~gC-f6(pDvKv9{7isgaUVHnuq#w{F4&n*p{E z`40znq$i%8$jBn76-J+xb5bnnuQI!_)tG}CgmQvAEt6W3D9I5{^ed`YL--FqshD|}Qn9FmkZM z!DXXU`*s0iZQk=P8B6=dH?fTqDTNvHo88Uthq4QM_7dH*_S{F$%2d)H@WRm4?_R!} zJu>Ny&Mb3J>ObQ$LS@i&BV*g6qrKjybwl>P^P2tzuUltk!2eO^R-X}6o`6*~04u#WftdTHh_UH$kM=LpkE{L9}PO%P>G zYYhe#L__nl7qXMvhkA#8QCpXFqk5#Y{uEhY7V-ZiCIS$RBPl-KaPaMjBMJS)B8s}* zT9*?lh`GWDwWK1Js~SZ)WB>B2loIxl3qh3%Je<#Qy%N~Nt9rOb@+6?_u~0lK$~Pea z&LDZ>U9Hce{}-N2b_Cbpy+theuxEQ_gsmZITU3_t#3T)rW^m~ETf_cZwnnk24o7dZ z`VXeF2AU&_YMpGPxYd$Ht#%%2n9sNIb9?tQR$h$rC%HvD-zfRrZ-pXLhVcxvJFk&E zI#bH&iD^-rlKbZ9#`;NHg;Cwmr&&-FvjEwMK+n-b=@qte$yK8UYjtx%-I$hMR^@Eo z61=%xDMm*!u5K3#srgz~-pW`$gnt&N*`t;>d-26LWrff$OoyWX>2Dbf1D#Y?7?l|D zqtqUCvz7lLGp(ZSZ3#=Pu!K2tf)&Oj=4-K%G#jLOPFAlyc z{2xq$0mQ$4r3!G_>|>j#tAy`iMRmuyi&MXNX-s4D{E>&7sYX-ZK>g>`pYqo)Yye6G zQ}zxhtp@-6m3jD39|h+Yb2U&Nrv5WiUtZ+c-*9U57`Lg;e&o&DX;M+fn>OA-tFfs5 zfVg1Ki=H2%av!U`uk4EAYS->2v0eOyd8P1wZY>--h*L~eKG2`WQu?DO#sVUR|Fh0` zdCuR1?0twN{l6}{M}KZi{VWHq(n2v1nA%97cpybRx(F5Z54-9Wo_^z2t9(|5{rv8? zmY)>bScC|@%UBN=InoI!uwqy*TPYMwnC!lhi)rASr*sD%ziIBD#jbP$Le3ABqn`_@)0TONZ4=Wpn3C7vOAJQ0_!ofP!65YPIGVVH zlotB@uqW6E4)V4G)Fb`hpZ=We%9lGb8Cbmnwva9{jge?isT&cKddD%|OewCAx*C(; zrdNSj4Yj~I!M)Ckg$sjPw%?A4=;hX645Wk7TU@Vo_-C{ktG70tyXBQ7Jv=%Bne zuR}pmUWY@X*wVzm*1&(pO+wq!8}UJV%%%)=dYaTfq(g|gKnP<>Kdek!`d|EWje`Hv zgZhVSjb|=-b&&LbH(oQtC(Y^!|Ct>5(QYr(n*LQ`buy{Gd^wbn?580Bzh)gfCe$GO zKUpW9v#tvM4BDG+*s-W_^;gD1D+vB^bwXU&C6gPfA2M&kmm#p_v|A13_y4-|3|L5Z;0}TMFnOCc4 zCm4&{4!(y1*;l;ZYTl`9=vz8?03CB?|BM$v_aWc|H3$z3Hgcrf`I~TXrJ%0sZ*vu! zE*Js5IqE$G5Em`ZBB@Oq#Z7`I6Pe=pfHf_7S6k4;;Xo)lM4>72a26@Wio^fmnwdX+ z3_Ac*k{hx$1WFs&zc`)b5mf6GJ0h6XJQ$hM@E;UAhXF}xiOQ-fq?8*8IStsvj)Ko& zf}=9*@}!5`Qwm#P^C*bNjaVJrQS#rhLzKd>Cq|~ko)PZ|=vO>N?pTJ!=d0SxHa#6=%yu8?VX7?xg;+nR#IUw3zqHL=SL{Ht{AQ zLOn0vRPMolPL=$x-;{Y@o2h#?-RE6_^cC0_f6ig?#Cgx2Gv9lW`iGaD1kgN)MVdt+ zLqg2v=1{<%P}Iu*!LR4h|CGI&nDFHs-faCf-@i6g`k%soi^6|Cus3yGr>5728i8M> zXf>t<(PEBVMgI#xXwQmzHPW=&_0C8F5bJWf{bOB0@|)9`MdUVlsWLiau|*u}A9iOs zTG4)hb~p*}k1@;Kn~HEIMlQ;V%K9*^5y_+1YvECZ-L}j#eds|=BM5bO#z`aY36o9Y zY7YF?Qv=Ossb)OaoEqVvD(#7EZdIn5vag(TVxIG7K^AL?es7 zFNrk2z@jMJxH9@jb4n^3+)0bbP$;hO&G@I)Mn7k>mYogb+Nxk{kH*H?hqiYV{tx}Xh7WU& z`t^TWijVzC{lib6?W7hS`^!2UYNpGzLoO9fU!`eeh9UfCN8#H1M`cX#Pf>bVje0&_ zaYxEo_e>QNBUSpJc0ZwZ+kGc@>ACTxWPCfF8xBuxPU1?;ZdY)zxN{#(4V2GMYkQSa zW1m6-UGl#I;GbL2-_HdiD^6oNOlxY#f|~SC$^RDoFLgd9q|E!1o|Wa%+RcmG_=j=) zjXy%VrU|1LTCrf0vTBlx+VVciEz9m zG;o(vUH>(@Gr&5VrT!u2h%Nc=V=d*~@*;o?8lLYzHPp5=tPZ7QmqZidhn2t{ufbO+ z=g3Cn79wkjBqz{#F*mGQ@ulcw zmw9=kwU}$%dKcmV3@5GBx^%BMzA7`lu(H0Miq5&c `%Sir;xY{~|=aBp)b)p5K9 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%0D~)Njk#Ovte4uKdR3M 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%0Al~CFEi9 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%0D-GE*(VWtwRvm9jRgr}I_u=5qIJHr0> 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%0D4DVS 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

6uTS_VDrdzE=VMdF%@l^BqI{YdnTylK9sW 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 _u7ZF+2FI>CtX+@dEF8JqzipAp8ulrOc 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 z%0D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 z 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®!m0I2{Q?1%MGsEEhY+@q)@8D1E#E>r*K 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
    _5)*7j8aw!4CQGDQssme&5;Y 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
  1. 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%0DO;pWoOltHf7HJl4*gafQ}JUQPsVyl9J_H= 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

    (-hfZw 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

    HZ9_wyl^w~w>r;b;bSnUNhacK|~$(a_#p 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

    (^uRxe#+GI>f(WE_hYrkVD40Ha%cATq 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

    ^C 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πxU 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 +jgtwf9*at0Q9NGzH`4Tw-sMO=Jnkm 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℞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%0DszsgIg(xufkO*q@! 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 N$0J*ERGtB@1 literal 0 HcmV?d00001 From 1efe648d35a8531600ea3e902b203f48adabff18 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 13 Dec 2019 16:17:58 -0800 Subject: [PATCH 0511/1053] Add demo colab. --- cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb | 943 +++++++++++++++++++ cloud_tpu_colabs/README.md | 3 + 2 files changed, 946 insertions(+) create mode 100644 cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb diff --git a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb new file mode 100644 index 000000000000..a13866a08a52 --- /dev/null +++ b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb @@ -0,0 +1,943 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "NeurIPS 2019 JAX demo.ipynb", + "provenance": [], + "collapsed_sections": [ + "AvXl1WDPKjmV" + ] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "TPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "hLEyhfMqmnrt", + "colab_type": "text" + }, + "source": [ + "## Colab JAX TPU Setup" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "5CTEVmyKmkfp", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Grab newest JAX version.\n", + "!pip install --upgrade -q jax==0.1.54 jaxlib==0.1.37\n", + "\n", + "# Make sure the Colab Runtime is set to Accelerator: TPU.\n", + "import requests\n", + "import os\n", + "if 'TPU_DRIVER_MODE' not in globals():\n", + " url = 'http://' + os.environ['COLAB_TPU_ADDR'].split(':')[0] + ':8475/requestversion/tpu_driver_nightly'\n", + " resp = requests.post(url)\n", + " TPU_DRIVER_MODE = 1\n", + "\n", + "# The following is required to use TPU Driver as JAX's backend.\n", + "from jax.config import config\n", + "config.FLAGS.jax_xla_backend = \"tpu_driver\"\n", + "config.FLAGS.jax_backend_target = \"grpc://\" + os.environ['COLAB_TPU_ADDR']\n", + "print(config.FLAGS.jax_backend_target)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ebUMqK9mGIDm", + "colab_type": "text" + }, + "source": [ + "## The basics: interactive NumPy on GPU and TPU\n", + "\n", + "---\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "27TqNtiQF97X", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import jax\n", + "import jax.numpy as np\n", + "from jax import random\n", + "\n", + "key = random.PRNGKey(0)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "cRWoxSCNGU4o", + "colab_type": "code", + "colab": {} + }, + "source": [ + "key, subkey = random.split(key)\n", + "x = random.normal(key, (5000, 5000))\n", + "\n", + "print(x.shape)\n", + "print(x.dtype)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "diPllsvgGfSA", + "colab_type": "code", + "colab": {} + }, + "source": [ + "y = np.dot(x, x)\n", + "print(y[0, 0])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "8-psauxnGiRk", + "colab_type": "code", + "colab": {} + }, + "source": [ + "x" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "-2FMQ8UeoTJ8", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.plot(x[0])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "DRnwCKFuGk8P", + "colab_type": "code", + "colab": {} + }, + "source": [ + "np.dot(x, x.T)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "z4VX5PkMHJIu", + "colab_type": "code", + "colab": {} + }, + "source": [ + "print(np.dot(x, 2 * x)[[0, 2, 1, 0], ..., None, ::-1])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ORZ9Odu85BCJ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import numpy as onp\n", + "\n", + "x_cpu = onp.array(x)\n", + "%timeit -n 1 -r 1 onp.dot(x_cpu, x_cpu)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5BKh0eeAGvO5", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%timeit np.dot(x, x).block_until_ready()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fm4Q2zpFHUAu", + "colab_type": "text" + }, + "source": [ + "## Automatic differentiation" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "MCIQbyUYHWn1", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import grad" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "kfqZpKYsHo4j", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def f(x):\n", + " if x > 0:\n", + " return 2 * x ** 3\n", + " else:\n", + " return 3 * x" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "K_26_odPHqLJ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "key = random.PRNGKey(0)\n", + "x = random.normal(key, ())\n", + "\n", + "print(grad(f)(x))\n", + "print(grad(f)(-x))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "q5V3A6loHrhS", + "colab_type": "code", + "colab": {} + }, + "source": [ + "print(grad(grad(f))(-x))\n", + "print(grad(grad(grad(f)))(-x))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ba4WY4ArHv8I", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def predict(params, inputs):\n", + " for W, b in params:\n", + " outputs = np.dot(inputs, W) + b\n", + " inputs = np.tanh(outputs)\n", + " return outputs\n", + "\n", + "def loss(params, batch):\n", + " inputs, targets = batch\n", + " predictions = predict(params, inputs)\n", + " return np.sum((predictions - targets)**2)\n", + "\n", + "\n", + "\n", + "def init_layer(key, n_in, n_out):\n", + " k1, k2 = random.split(key)\n", + " W = random.normal(k1, (n_in, n_out))\n", + " b = random.normal(k2, (n_out,))\n", + " return W, b\n", + "\n", + "layer_sizes = [5, 2, 3]\n", + "\n", + "key = random.PRNGKey(0)\n", + "key, *keys = random.split(key, len(layer_sizes))\n", + "params = list(map(init_layer, keys, layer_sizes[:-1], layer_sizes[1:]))\n", + "\n", + "key, *keys = random.split(key, 3)\n", + "inputs = random.normal(keys[0], (10, 5))\n", + "targets = random.normal(keys[1], (10, 3))\n", + "batch = (inputs, targets)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "LiTBibJdHz4K", + "colab_type": "code", + "colab": {} + }, + "source": [ + "print(loss(params, batch))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "a3KFpwH3H4Cl", + "colab_type": "code", + "colab": {} + }, + "source": [ + "step_size = 1e-2\n", + "\n", + "for _ in range(20):\n", + " grads = grad(loss)(params, batch)\n", + " params = [(W - step_size * dW, b - step_size * db)\n", + " for (W, b), (dW, db) in zip(params, grads)]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "YLltDr0GH7LX", + "colab_type": "code", + "colab": {} + }, + "source": [ + "print(loss(params, batch))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bmxAPFC0I8b0", + "colab_type": "text" + }, + "source": [ + "Other JAX autodiff highlights:\n", + "\n", + "* Forward- and reverse-mode, totally composable\n", + "* Fast Jacobians and Hessians\n", + "* Complex number support (holomorphic and non-holomorphic)\n", + "* Jacobian pre-accumulation for elementwise operations (like `gelu`)\n", + "\n", + "\n", + "For much more, see the [JAX Autodiff Cookbook (Part 1)](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TRkxaVLJKNre", + "colab_type": "text" + }, + "source": [ + "## End-to-end compilation with XLA using `jit`" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "bKo4rX9-KSW7", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import jit" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "94iIgZSfKWh8", + "colab_type": "code", + "colab": {} + }, + "source": [ + "key = random.PRNGKey(0)\n", + "x = random.normal(key, (5000, 5000))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ybuz8Ag9KXMd", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def f(x):\n", + " y = x\n", + " for _ in range(10):\n", + " y = y - 0.1 * y + 3.\n", + " return y[:100, :100]\n", + "\n", + "f(x)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Y9dx5ifSKaGJ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "g = jit(f)\n", + "g(x)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "UtsS67BvKYkC", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%timeit f(x).block_until_ready()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "-vfcaSo9KbvR", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%timeit g(x).block_until_ready()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "E3BQF1_AKeLn", + "colab_type": "code", + "colab": {} + }, + "source": [ + "grad(jit(grad(jit(grad(np.tanh)))))(1.0)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AvXl1WDPKjmV", + "colab_type": "text" + }, + "source": [ + "### Constraints that come with using `jit`" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mCtwRF18KnsE", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def f(x):\n", + " if x > 0:\n", + " return 2 * x ** 2\n", + " else:\n", + " return 3 * x\n", + "\n", + "g = jit(f)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "_82tY-ZSKqv4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "f(2)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "TjSAFc-iKrcB", + "colab_type": "code", + "colab": {} + }, + "source": [ + "g(2)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "RhizP9pjKsug", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def f(x, n):\n", + " i = 0\n", + " while i < n:\n", + " x = x * x\n", + " i += 1\n", + " return x\n", + "\n", + "g = jit(f)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Wn6haTmUK-Q8", + "colab_type": "code", + "colab": {} + }, + "source": [ + "f(np.array([1., 2., 3.]), 5)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "HwBy1I04K-81", + "colab_type": "code", + "colab": {} + }, + "source": [ + "g(np.array([1., 2., 3.]), 5)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "XmaTryZaK_3M", + "colab_type": "code", + "colab": {} + }, + "source": [ + "g = jit(f, static_argnums=(1,))\n", + "\n", + "g(np.array([1., 2., 3.]), 5)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0M_-pJe7LOcO", + "colab_type": "text" + }, + "source": [ + "## Vectorization with `vmap`" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8XIot_ndLRH1", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import vmap" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "tRvCZn2wBkXP", + "colab_type": "code", + "colab": {} + }, + "source": [ + "print(vmap(lambda x: x**2)(np.arange(8)))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "icfsXizI_rkD", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import make_jaxpr\n", + "\n", + "make_jaxpr(np.dot)(np.ones(8), np.ones(8))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "uQm4cvAbA6M3", + "colab_type": "code", + "colab": {} + }, + "source": [ + "make_jaxpr(vmap(np.dot))(np.ones((10, 8)), np.ones((10, 8)))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "NeiFfCHEBLsU", + "colab_type": "code", + "colab": {} + }, + "source": [ + "make_jaxpr(vmap(vmap(np.dot)))(np.ones((10, 10, 8)), np.ones((10, 10, 8)))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "csX71fkSCZrp", + "colab_type": "code", + "colab": {} + }, + "source": [ + "perex_grads = vmap(grad(loss), in_axes=(None, 0))\n", + "make_jaxpr(perex_grads)(params, batch)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Tmf1NT2Wqv5p", + "colab_type": "text" + }, + "source": [ + "## Parallel accelerators with pmap" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "t6RRAFn1CEln", + "colab_type": "code", + "colab": {} + }, + "source": [ + "jax.devices()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "tEK1I6Duqunw", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import pmap" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "S-iCNfeGqzkY", + "colab_type": "code", + "colab": {} + }, + "source": [ + "y = pmap(lambda x: x ** 2)(np.arange(8))\n", + "print(y)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "xgutf5JPP3wi", + "colab_type": "code", + "colab": {} + }, + "source": [ + "y" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "xxShG3Tdq4Gj", + "colab_type": "code", + "colab": {} + }, + "source": [ + "z = y / 2\n", + "print(z)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "uvDL2_bCq7kq", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.plot(y)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CejmguoAZQlZ", + "colab_type": "text" + }, + "source": [ + "### Device transfer details" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Xg76CmLYq_Q6", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# create 8 random keys\n", + "keys = random.split(random.PRNGKey(0), 8)\n", + "\n", + "# create a 5000 x 6000 matrix on each device by mapping over keys\n", + "mats = pmap(lambda key: random.normal(key, (5000, 6000)))(keys)\n", + "\n", + "# the stack of matrices is represented logically as a single array\n", + "mats.shape" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "jbw_hRx7rDzX", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# run a local matmul on each device in parallel (no data transfer)\n", + "result = pmap(lambda x: np.dot(x, x.T))(mats)\n", + "result.shape" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "2os_Qio6rFKv", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# compute the mean on each device in parallel and print the results\n", + "print(pmap(np.mean)(result))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xf5N9ZRirJhL", + "colab_type": "text" + }, + "source": [ + "### Collective communication operations" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9i1PfxUvrThh", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from functools import partial\n", + "from jax.lax import psum\n", + "\n", + "@partial(pmap, axis_name='i')\n", + "def normalize(x):\n", + " return x / psum(x, 'i')\n", + "\n", + "print(normalize(np.arange(8.)))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "lnvwnlOFrVa-", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@partial(pmap, axis_name='rows')\n", + "@partial(pmap, axis_name='cols')\n", + "def f(x):\n", + " row_sum = psum(x, 'rows')\n", + " col_sum = psum(x, 'cols')\n", + " total_sum = psum(x, ('rows', 'cols'))\n", + " return row_sum, col_sum, total_sum\n", + "\n", + "x = np.arange(8.).reshape((4, 2))\n", + "a, b, c = f(x)\n", + "\n", + "print(\"input:\\n\", x)\n", + "print(\"row sum:\\n\", a)\n", + "print(\"col sum:\\n\", b)\n", + "print(\"total sum:\\n\", c)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-A-oVDo6rdWA", + "colab_type": "text" + }, + "source": [ + "### Compose pmap with other transforms!" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WC_dMIN2rgTZ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@pmap\n", + "def f(x):\n", + " y = np.sin(x)\n", + " @pmap\n", + " def g(z):\n", + " return np.cos(z) * np.tan(y.sum()) * np.tanh(x).sum()\n", + " return grad(lambda w: np.sum(g(w)))(x)\n", + " \n", + "f(x)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "apuACjPWrixV", + "colab_type": "code", + "colab": {} + }, + "source": [ + "grad(lambda x: np.sum(f(x)))(x)" + ], + "execution_count": 0, + "outputs": [] + } + ] +} diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md index 425d630af660..b3cf8a3c98d2 100644 --- a/cloud_tpu_colabs/README.md +++ b/cloud_tpu_colabs/README.md @@ -22,6 +22,9 @@ Solve the wave equation with `pmap`, and make cool movies! The spatial domain is ![](https://raw.githubusercontent.com/google/jax/master/cloud_tpu_colabs/images/wave_movie.gif) +### [JAX Demo](https://colab.research.google.com/github/google/jax/blob/master/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb) +An overview of JAX presented at the Program Transformations for ML workshop at NeurIPS 2019. Covers basic numpy usage, grad, jit, vmap, and pmap. + ## Performance notes The [guidance on running TensorFlow on TPUs](https://cloud.google.com/tpu/docs/performance-guide) applies to JAX as well, with the exception of TensorFlow-specific details. Here we highlight a few important details that are particularly relevant to using TPUs in JAX. From 8927200316a6a4e64b81c71c08199ba8c02b1c44 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 10 Dec 2019 13:50:36 -0800 Subject: [PATCH 0512/1053] wip --- README.md | 554 +++++++----------------------------------------------- 1 file changed, 66 insertions(+), 488 deletions(-) diff --git a/README.md b/README.md index 5b2ab1b2c1f0..2b7b0184fee9 100644 --- a/README.md +++ b/README.md @@ -60,261 +60,13 @@ grad_fun = jit(grad(logprob_fun)) # compiled gradient evaluation function perex_grads = jit(vmap(grad_fun, in_axes=(None, 0, 0))) # fast per-example grads ``` -JAX started as a research project by [Matt Johnson](https://github.com/mattjj), -[Roy Frostig](https://github.com/froystig), [Dougal -Maclaurin](https://github.com/dougalm), and [Chris -Leary](https://github.com/learyg), and is now developed [in the -open](https://github.com/google/jax) by a growing number of -[contributors](#contributors). - ### Contents +* [Transformations](#transformations) * [Quickstart: Colab in the Cloud](#quickstart-colab-in-the-cloud) * [Installation](#installation) -* [Reference documentation](#reference-documentation) -* [A brief tour](#a-brief-tour) -* [What's supported](#whats-supported) -* [Transformations](#transformations) -* [Random numbers are different](#random-numbers-are-different) -* [Mini-libraries](#mini-libraries) -* [How it works](#how-it-works) -* [Current gotchas](#current-gotchas) * [Citing JAX](#citing-jax) +* [Reference documentation](#reference-documentation) -## Quickstart: Colab in the Cloud -Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: -- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html) -- [Training a Simple Neural Network, with PyTorch Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Neural_Network_and_Data_Loading.ipynb) -- [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/neural_network_with_tfds_data.ipynb) - -And for a deeper dive into JAX: -- [Common gotchas and sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) -- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html) -- [Directly using XLA in Python](https://jax.readthedocs.io/en/latest/notebooks/XLA_in_Python.html) -- [How JAX primitives work](https://jax.readthedocs.io/en/latest/notebooks/How_JAX_primitives_work.html) -- [MAML Tutorial with JAX](https://jax.readthedocs.io/en/latest/notebooks/maml.html) -- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://jax.readthedocs.io/en/latest/notebooks/score_matching.html). - - -## Installation -JAX is written in pure Python, but it depends on XLA, which needs to be compiled -and installed as the `jaxlib` package. Use the following instructions to -install a binary package with `pip`, or to build JAX from source. - -We support installing or building `jaxlib` on Linux (Ubuntu 16.04 or later) and -macOS (10.12 or later) platforms, but not yet Windows. We're not currently -working on Windows support, but contributions are welcome -(see [#438](https://github.com/google/jax/issues/438)). Some users have reported -success with building a CPU-only `jaxlib` from source using the Windows Subsytem -for Linux. - -### pip installation - -To install a CPU-only version, which might be useful for doing local -development on a laptop, you can run - -```bash -pip install --upgrade pip -pip install --upgrade jax jaxlib # CPU-only version -``` - -On Linux, it is often necessary to first update `pip` to a version that supports -`manylinux2010` wheels. - -If you want to install JAX with both CPU and GPU support, using existing CUDA -and CUDNN7 installations on your machine (for example, preinstalled on your -cloud VM), you can run - -```bash -# install jaxlib -PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 -CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 -PLATFORM=linux_x86_64 # alternatives: linux_x86_64 -BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.36-$PYTHON_VERSION-none-$PLATFORM.whl - -pip install --upgrade jax # install jax -``` - -The library package name must correspond to the version of the existing CUDA -installation you want to use, with `cuda101` for CUDA 10.1, `cuda100` for CUDA -10.0, `cuda92` for CUDA 9.2, and `cuda90` for CUDA 9.0. To find your CUDA and -CUDNN versions, you can run commands like these, depending on your CUDNN install -path: - -```bash -nvcc --version -grep CUDNN_MAJOR -A 2 /usr/local/cuda/include/cudnn.h # might need different path -``` - -The Python version must match your Python interpreter. There are prebuilt wheels -for Python 2.7, 3.5, 3.6, and 3.7; for anything else, you must build from -source. - -Please let us know on [the issue tracker](https://github.com/google/jax/issues) -if you run into any errors or problems with the prebuilt wheels. - -### Building JAX from source -See [Building JAX from source](https://jax.readthedocs.io/en/latest/developer.html#building-from-source). - - -## Reference documentation - -For details about the JAX API, see the -[reference documentation](https://jax.readthedocs.io/). - -## Developer documentation - -For getting started as a JAX developer, see the -[developer documentation](https://jax.readthedocs.io/en/latest/developer.html). - -## A brief tour - -```python -In [1]: import jax.numpy as np - -In [2]: from jax import random - -In [3]: key = random.PRNGKey(0) - -In [4]: x = random.normal(key, (5000, 5000)) - -In [5]: print(np.dot(x, x.T) / 2) # fast! -[[ 2.52727051e+03 8.15895557e+00 -8.53276134e-01 ..., # ... - -In [6]: print(np.dot(x, x.T) / 2) # even faster! -# JIT-compiled code is cached and reused in the 2nd call -[[ 2.52727051e+03 8.15895557e+00 -8.53276134e-01 ..., # ... -``` - -What’s happening behind-the-scenes is that JAX is using XLA to just-in-time -(JIT) compile and execute these individual operations on the GPU. First the -`random.normal` call is compiled and the array referred to by `x` is generated -on the GPU. Next, each function called on `x` (namely `transpose`, `dot`, and -`divide`) is individually JIT-compiled and executed, each keeping its results on -the device. -It’s only when a value needs to be printed, plotted, saved, or passed into a raw -NumPy function that a read-only copy of the value is brought back to the host as -an ndarray and cached. The second call to `dot` is faster because the -JIT-compiled code is cached and reused, saving the compilation time. - -The fun really starts when you use `grad` for automatic differentiation and -`jit` to compile your own functions end-to-end. Here’s a more complete toy -example: - -```python -from jax import grad, jit -import jax.numpy as np - -def sigmoid(x): - return 0.5 * (np.tanh(x / 2.) + 1) - -# Outputs probability of a label being true according to logistic model. -def logistic_predictions(weights, inputs): - return sigmoid(np.dot(inputs, weights)) - -# Training loss is the negative log-likelihood of the training labels. -def loss(weights, inputs, targets): - preds = logistic_predictions(weights, inputs) - label_logprobs = np.log(preds) * targets + np.log(1 - preds) * (1 - targets) - return -np.sum(label_logprobs) - -# Build a toy dataset. -inputs = np.array([[0.52, 1.12, 0.77], - [0.88, -1.08, 0.15], - [0.52, 0.06, -1.30], - [0.74, -2.49, 1.39]]) -targets = np.array([True, True, False, True]) - -# Define a compiled function that returns gradients of the training loss -training_gradient_fun = jit(grad(loss)) - -# Optimize weights using gradient descent. -weights = np.array([0.0, 0.0, 0.0]) -print("Initial loss: {:0.2f}".format(loss(weights, inputs, targets))) -for i in range(100): - weights -= 0.1 * training_gradient_fun(weights, inputs, targets) - -print("Trained loss: {:0.2f}".format(loss(weights, inputs, targets))) -``` - -To see more, check out the [quickstart -notebook](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html), -a [simple MNIST classifier -example](https://github.com/google/jax/blob/master/examples/mnist_classifier.py) -and the rest of the [JAX -examples](https://github.com/google/jax/blob/master/examples/). - -## What's supported - -If you’re using JAX just as an accelerator-backed NumPy, without using `grad` or -`jit` in your code, then in principle there are no constraints, though some -NumPy functions haven’t been implemented yet. A list of supported functions can -be found in the [reference documentation](https://jax.readthedocs.io/). - -Generally using `np.dot(A, B)` is -better than `A.dot(B)` because the former gives us more opportunities to run the -computation on the device. NumPy also does a lot of work to cast any array-like -function arguments to arrays, as in `np.sum([x, y])`, while `jax.numpy` -typically requires explicit casting of array arguments, like -`np.sum(np.array([x, y]))`. - -For automatic differentiation with `grad`, JAX has the same restrictions -as [Autograd](https://github.com/hips/autograd). Specifically, differentiation -works with indexing (`x = A[i, j, :]`) but not indexed assignment (`A[i, j] = -x`) or indexed in-place updating (`A[i] += b`) (use -[`jax.ops.index_update`](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_update.html#jax.ops.index_update) -or -[`jax.ops.index_add`](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_add.html#jax.ops.index_add) -instead). You can use lists, tuples, and -dicts freely: JAX doesn't even see them. Using `np.dot(A, B)` rather than -`A.dot(B)` is required for automatic differentiation when `A` is a raw ndarray. - -For compiling your own functions with `jit` there are a few more requirements. -Because `jit` aims to specialize Python functions only on shapes and dtypes -during tracing, rather than on concrete values, Python control flow that depends -on concrete values won’t be able to execute and will instead raise an error. If -you want compiled control flow, use structured control flow primitives like -`lax.cond` and `lax.while_loop`. Some indexing features, like slice-based -indexing, e.g. `A[i:i+5]` for argument-dependent `i`, or boolean-based indexing, -e.g. `A[bool_ind]` for argument-dependent `bool_ind`, produce abstract values of -unknown shape and are thus unsupported in `jit` functions. - -In general, JAX is intended to be used with a functional style of Python -programming. Functions passed to transformations like `grad` and `jit` are -expected to be free of side-effects. You can write print statements for -debugging but they may only be executed once if they're under a `jit` decorator. - -> TLDR **Do use** -> -> * Functional programming -> * [Many](https://jax.readthedocs.io/en/latest/jax.numpy.html) of NumPy’s -> functions (help us add more!) -> * [Some](https://jax.readthedocs.io/en/latest/jax.scipy.html) SciPy functions -> * Indexing and slicing of arrays like `x = A[[5, 1, 7], :, 2:4]` -> * Explicit array creation from lists like `A = np.array([x, y])` -> -> **Don’t use** -> -> * Assignment into arrays like `A[0, 0] = x` (use -> [`jax.ops.index_update`](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_update.html#jax.ops.index_update) -> instead) -> * Implicit casting to arrays like `np.sum([x, y])` (use `np.sum(np.array([x, -> y])` instead) -> * `A.dot(B)` method syntax for functions of more than one argument (use -> `np.dot(A, B)` instead) -> * Side-effects like mutation of arguments or mutation of global variables -> * The `out` argument of NumPy functions -> * Dtype casting like `np.float64(x)` (use `x.astype('float64')` or -> `x.astype(np.float64)` instead). -> -> **For jit functions, also don’t use** -> -> * Control flow based on dynamic values `if x > 0: ...`. Control flow based -> on shapes is fine: `if x.shape[0] > 2: ...` and `for subarr in array`. -> * Slicing `A[i:i+5]` for dynamic index `i` (use `lax.dynamic_slice` instead) -> or boolean indexing `A[bool_ind]` for traced values `bool_ind`. - -You should get loud errors if your code violates any of these. ## Transformations @@ -452,247 +204,82 @@ differentiation for fast Jacobian and Hessian matrix calculations in `jax.jacfwd`, `jax.jacrev`, and `jax.hessian`. -## Random numbers are different - -JAX needs a [functional pseudo-random number generator (PRNG) system](design_notes/prng.md) to provide -reproducible results invariant to compilation boundaries and backends, while -also maximizing performance by enabling vectorized generation and -parallelization across random calls. The `numpy.random` library doesn’t have -those properties. The `jax.random` library meets those needs: it’s functionally -pure, but it doesn’t require you to pass stateful random objects back out of -every function. - -The `jax.random` library uses -[count-based PRNGs](http://www.thesalmons.org/john/random123/papers/random123sc11.pdf) -and a functional array-oriented -[splitting model](http://publications.lib.chalmers.se/records/fulltext/183348/local_183348.pdf). -To generate random values, you call a function like `jax.random.normal` and give -it a PRNG key: - -```python -import jax.random as random +## Quickstart: Colab in the Cloud +Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: +- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html) +- [Training a Simple Neural Network, with PyTorch Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Neural_Network_and_Data_Loading.ipynb) +- [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/neural_network_with_tfds_data.ipynb) -key = random.PRNGKey(0) -print(random.normal(key, shape=(3,))) # [ 1.81608593 -0.48262325 0.33988902] -``` +And for a deeper dive into JAX: +- [Common gotchas and sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) +- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html) +- [Directly using XLA in Python](https://jax.readthedocs.io/en/latest/notebooks/XLA_in_Python.html) +- [How JAX primitives work](https://jax.readthedocs.io/en/latest/notebooks/How_JAX_primitives_work.html) +- [MAML Tutorial with JAX](https://jax.readthedocs.io/en/latest/notebooks/maml.html) +- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://jax.readthedocs.io/en/latest/notebooks/score_matching.html). -If we make the same call again with the same key, we get the same values: -```python -print(random.normal(key, shape=(3,))) # [ 1.81608593 -0.48262325 0.33988902] -``` +## Installation +JAX is written in pure Python, but it depends on XLA, which needs to be compiled +and installed as the `jaxlib` package. Use the following instructions to +install a binary package with `pip`, or to build JAX from source. -The key never gets updated. So how do we get fresh random values? We use -`jax.random.split` to create new keys from existing ones. A common pattern is to -split off a new key for every function call that needs random values: +We support installing or building `jaxlib` on Linux (Ubuntu 16.04 or later) and +macOS (10.12 or later) platforms, but not yet Windows. We're not currently +working on Windows support, but contributions are welcome +(see [#438](https://github.com/google/jax/issues/438)). Some users have reported +success with building a CPU-only `jaxlib` from source using the Windows Subsytem +for Linux. -```python -key = random.PRNGKey(0) +### pip installation -key, subkey = random.split(key) -print(random.normal(subkey, shape=(3,))) # [ 1.1378783 -1.22095478 -0.59153646] +To install a CPU-only version, which might be useful for doing local +development on a laptop, you can run -key, subkey = random.split(key) -print(random.normal(subkey, shape=(3,))) # [-0.06607265 0.16676566 1.17800343] +```bash +pip install --upgrade pip +pip install --upgrade jax jaxlib # CPU-only version ``` -By splitting the PRNG key, not only do we avoid having to thread random states -back out of every function call, but also we can generate multiple random arrays -in parallel because we can avoid unnecessary sequential dependencies. - -There's a gotcha here, which is that it's easy to unintentionally reuse a key -without splitting. We intend to add a check for this (a sort of dynamic linear -typing) but for now it's something to be careful about. - -For more detailed information on the design and the reasoning behind it, see the -[PRNG design doc](design_notes/prng.md). - - -## Mini-libraries +On Linux, it is often necessary to first update `pip` to a version that supports +`manylinux2010` wheels. -JAX provides some small, experimental libraries for machine learning. These -libraries are in part about providing tools and in part about serving as -examples for how to build such libraries using JAX. Each one is only a few -hundred lines of code, so take a look inside and adapt them as you need! +If you want to install JAX with both CPU and GPU support, using existing CUDA +and CUDNN7 installations on your machine (for example, preinstalled on your +cloud VM), you can run -### Neural-net building with Stax +```bash +# install jaxlib +PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 +CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 +PLATFORM=linux_x86_64 # alternatives: linux_x86_64 +BASE_URL='https://storage.googleapis.com/jax-releases' +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.36-$PYTHON_VERSION-none-$PLATFORM.whl -**Stax** is a functional neural network building library. The basic idea is that -a single layer or an entire network can be modeled as an `(init_fun, apply_fun)` -pair. The `init_fun` is used to initialize network parameters and the -`apply_fun` takes parameters and inputs to produce outputs. There are -constructor functions for common basic pairs, like `Conv` and `Relu`, and these -pairs can be composed in series using `stax.serial` or in parallel using -`stax.parallel`. +pip install --upgrade jax # install jax +``` -Here’s an example: +The library package name must correspond to the version of the existing CUDA +installation you want to use, with `cuda101` for CUDA 10.1, `cuda100` for CUDA +10.0, `cuda92` for CUDA 9.2, and `cuda90` for CUDA 9.0. To find your CUDA and +CUDNN versions, you can run commands like these, depending on your CUDNN install +path: -```python -import jax.numpy as np -from jax import random -from jax.experimental import stax -from jax.experimental.stax import Conv, Dense, MaxPool, Relu, Flatten, LogSoftmax - -# Use stax to set up network initialization and evaluation functions -net_init, net_apply = stax.serial( - Conv(32, (3, 3), padding='SAME'), Relu, - Conv(64, (3, 3), padding='SAME'), Relu, - MaxPool((2, 2)), Flatten, - Dense(128), Relu, - Dense(10), LogSoftmax, -) - -# Initialize parameters, not committing to a batch shape -rng = random.PRNGKey(0) -in_shape = (-1, 28, 28, 1) -out_shape, net_params = net_init(rng, in_shape) - -# Apply network to dummy inputs -inputs = np.zeros((128, 28, 28, 1)) -predictions = net_apply(net_params, inputs) +```bash +nvcc --version +grep CUDNN_MAJOR -A 2 /usr/local/cuda/include/cudnn.h # might need different path ``` -### First-order optimization - -JAX has a minimal optimization library focused on stochastic first-order -optimizers. Every optimizer is modeled as an `(init_fun, update_fun, -get_params)` triple of functions. The `init_fun` is used to initialize the -optimizer state, which could include things like momentum variables, and the -`update_fun` accepts a gradient and an optimizer state to produce a new -optimizer state. The `get_params` function extracts the current iterate (i.e. -the current parameters) from the optimizer state. The parameters being optimized -can be ndarrays or arbitrarily-nested list/tuple/dict structures, so you can -store your parameters however you’d like. +The Python version must match your Python interpreter. There are prebuilt wheels +for Python 2.7, 3.5, 3.6, and 3.7; for anything else, you must build from +source. -Here’s an example, using `jit` to compile the whole update end-to-end: +Please let us know on [the issue tracker](https://github.com/google/jax/issues) +if you run into any errors or problems with the prebuilt wheels. -```python -from jax.experimental import optimizers -from jax import jit, grad - -# Define a simple squared-error loss -def loss(params, batch): - inputs, targets = batch - predictions = net_apply(params, inputs) - return np.sum((predictions - targets)**2) - -# Use optimizers to set optimizer initialization and update functions -opt_init, opt_update, get_params = optimizers.momentum(step_size=1e-3, mass=0.9) - -# Define a compiled update step -@jit -def step(i, opt_state, batch): - params = get_params(opt_state) - g = grad(loss)(params, batch) - return opt_update(i, g, opt_state) - -# Dummy input data stream -data_generator = ((np.zeros((128, 28, 28, 1)), np.zeros((128, 10))) - for _ in range(10)) - -# Optimize parameters in a loop -opt_state = opt_init(net_params) -for i in range(10): - opt_state = step(i, opt_state, next(data_generator)) -net_params = get_params(opt_state) -``` +### Building JAX from source +See [Building JAX from source](https://jax.readthedocs.io/en/latest/developer.html#building-from-source). -## How it works - -Programming in machine learning is about expressing and transforming functions. -Transformations include automatic differentiation, compilation for accelerators, -and automatic batching. High-level languages like Python are great for -expressing functions, but usually all we can do with them is apply them. We lose -access to their internal structure which would let us perform transformations. - -JAX is a tool for specializing and translating high-level Python+NumPy functions -into a representation that can be transformed and then lifted back into a Python -function. - -![simplified-lifecycle](https://raw.githubusercontent.com/google/jax/master/images/lifecycle.png) - -JAX specializes Python functions by tracing. Tracing a function means monitoring -all the basic operations that are applied to its input to produce its output, -and recording these operations and the data-flow between them in a directed -acyclic graph (DAG). To perform tracing, JAX wraps primitive operations, like -basic numerical kernels, so that when they’re called they add themselves to a -list of operations performed along with their inputs and outputs. To keep track -of how data flows between these primitives, values being tracked are wrapped in -instances of the `Tracer` class. - -When a Python function is provided to `grad` or `jit`, it’s wrapped for tracing -and returned. When the wrapped function is called, we abstract the concrete -arguments provided into instances of the `AbstractValue` class, box them for -tracing in instances of the `Tracer` class, and call the function on them. -Abstract arguments represent sets of possible values rather than specific -values: for example, `jit` abstracts ndarray arguments to abstract values that -represent all ndarrays with the same shape and dtype. In contrast, `grad` -abstracts ndarray arguments to represent an infinitesimal neighborhood of the -underlying -value. By tracing the Python function on these abstract values, we ensure that -it’s specialized enough so that it’s tractable to transform, and that it’s still -general enough so that the transformed result is useful, and possibly reusable. -These transformed functions are then lifted back into Python callables in a way -that allows them to be traced and transformed again as needed. - -The primitive functions that JAX traces are mostly in 1:1 correspondence with -[XLA HLO](https://www.tensorflow.org/xla/operation_semantics) and are defined -in [lax.py](https://github.com/google/jax/blob/master/jax/lax/lax.py). This 1:1 -correspondence makes most of the translations to XLA essentially trivial, and -ensures we only have a small set of primitives to cover for other -transformations like automatic differentiation. The [`jax.numpy` -layer](https://github.com/google/jax/blob/master/jax/numpy/) is written in pure -Python simply by expressing NumPy functions in terms of the LAX functions (and -other NumPy functions we’ve already written). That makes `jax.numpy` easy to -extend. - -When you use `jax.numpy`, the underlying LAX primitives are `jit`-compiled -behind the scenes, allowing you to write unrestricted Python+Numpy code while -still executing each primitive operation on an accelerator. - -But JAX can do more: instead of just compiling and dispatching to a fixed set of -individual primitives, you can use `jit` on larger and larger functions to be -end-to-end compiled and optimized. For example, instead of just compiling and -dispatching a convolution op, you can compile a whole network, or a whole -gradient evaluation and optimizer update step. - -The tradeoff is that `jit` functions have to satisfy some additional -specialization requirements: since we want to compile traces that are -specialized on shapes and dtypes, but not specialized all the way to concrete -values, the Python code under a `jit` decorator must be applicable to abstract -values. If we try to evaluate `x > 0` on an abstract `x`, the result is an -abstract value representing the set `{True, False}`, and so a Python branch like -`if x > 0` will raise an error: it doesn’t know which way to go! -See [What’s supported](#whats-supported) for more -information about `jit` requirements. - -The good news about this tradeoff is that `jit` is opt-in: JAX libraries use -`jit` on individual operations and functions behind the scenes, allowing you to -write unrestricted Python+Numpy and still make use of a hardware accelerator. -But when you want to maximize performance, you can often use `jit` in your own -code to compile and end-to-end optimize much bigger functions. - -## Current gotchas - -For a survey of current gotchas, with examples and explanations, we highly -recommend reading the [Gotchas Notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html). - -Some stand-out gotchas that might surprise NumPy users: -1. JAX enforces single-precision (32-bit, e.g. `float32`) values by default, and - to enable double-precision (64-bit, e.g. `float64`) one needs to set the - `jax_enable_x64` variable **at startup** (or set the environment variable - `JAX_ENABLE_X64=True`, see [the Gotchas Notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#scrollTo=Double-(64bit)-precision)) -2. Some of NumPy's dtype promotion semantics involving a mix of Python scalars - and NumPy types aren't preserved, namely `np.add(1, np.array([2], - np.float32)).dtype` is `float64` rather than `float32`. -3. In-place mutation of arrays isn't supported, though [there is an - alternative](https://jax.readthedocs.io/en/latest/jax.ops.html). Generally - JAX requires functional code. -4. PRNGs are different and can be awkward, though for [good - reasons](https://github.com/google/jax/blob/master/design_notes/prng.md), and - non-reuse (linearity) is not yet checked. - -See [the notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) for much more information. ## Citing JAX @@ -718,19 +305,10 @@ compilation to XLA, was described in a [paper that appeared at SysML covering JAX's ideas and capabilities in a more comprehensive and up-to-date paper. -## Contributors - -So far, JAX includes lots of help and [contributions](https://github.com/google/jax/graphs/contributors). In addition to the code contributions reflected on GitHub, JAX has benefitted substantially from the advice of -[Jamie Townsend](https://github.com/j-towns), -[Peter Hawkins](https://github.com/hawkinsp), -[Jonathan Ragan-Kelley](https://people.eecs.berkeley.edu/~jrk/), -[Alex Wiltschko](http://github.com/alexbw), -George Dahl, -[Stephan Hoyer](http://stephanhoyer.com/), -Sam Schoenholz, -[Eli Bendersky](https://github.com/eliben), -Zak Stone, -[Alexey Radul](https://github.com/axch), -Michael Isard, -Skye Wanderman-Milne, -and many others. +## Reference documentation + +For details about the JAX API, see the +[reference documentation](https://jax.readthedocs.io/). + +For getting started as a JAX developer, see the +[developer documentation](https://jax.readthedocs.io/en/latest/developer.html). From 8dad859e04a4440b1a7c2f429396c2562b526bf4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 14 Dec 2019 07:00:39 -0800 Subject: [PATCH 0513/1053] streamline readme, add pmap --- README.md | 205 +++++++++++++++++---- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 6 +- 2 files changed, 172 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 2b7b0184fee9..8554a8ce63d7 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,10 @@ # JAX: Autograd and XLA [![Test status](https://travis-ci.org/google/jax.svg?branch=master)](https://travis-ci.org/google/jax) -[**Reference docs**](https://jax.readthedocs.io/en/latest/) +[**Quickstart**](#quickstart-colab-in-the-cloud) +| [**Transformations**](#transformations) | [**Install guide**](#installation) -| [**Quickstart**](#quickstart-colab-in-the-cloud) +| [**Reference docs**](https://jax.readthedocs.io/en/latest/) JAX is [Autograd](https://github.com/hips/autograd) and [XLA](https://www.tensorflow.org/xla), @@ -33,8 +34,10 @@ maximal performance without leaving Python. Dig a little deeper, and you'll see that JAX is really an extensible system for [composable function transformations](#transformations). Both [`grad`](#automatic-differentiation-with-grad) and [`jit`](#compilation-with-jit) -are instances of such transformations. Another is [`vmap`](#auto-vectorization-with-vmap) -for automatic vectorization, with more to come. +are instances of such transformations. Others are +[`vmap`](#auto-vectorization-with-vmap) for automatic vectorization and +[`pmap`](#spmd-programming-with-pmap) for single-program multiple-data (SPMD) +parallel programming, with more to come. This is a research project, not an official Google product. Expect bugs and [sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html). @@ -61,22 +64,35 @@ perex_grads = jit(vmap(grad_fun, in_axes=(None, 0, 0))) # fast per-example grad ``` ### Contents -* [Transformations](#transformations) * [Quickstart: Colab in the Cloud](#quickstart-colab-in-the-cloud) +* [Transformations](#transformations) +* [Current gotchas](#current-gotchas) * [Installation](#installation) * [Citing JAX](#citing-jax) * [Reference documentation](#reference-documentation) +## Quickstart: Colab in the Cloud +Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: +- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html) +- [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/neural_network_with_tfds_data.ipynb) + +And for a deeper dive into JAX: +- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html) +- [Common gotchas and sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) +- See the [full list of +notebooks](https://github.com/google/jax/tree/master/docs/notebooks). ## Transformations At its core, JAX is an extensible system for transforming numerical functions. -We currently expose three important transformations: `grad`, `jit`, and `vmap`. +Here are four of primary interest: `grad`, `jit`, `vmap`, and `pmap`. -### Automatic differentiation with grad +### Automatic differentiation with `grad` JAX has roughly the same API as [Autograd](https://github.com/hips/autograd). -The most popular function is `grad` for reverse-mode gradients: +The most popular function is +[`grad`](https://jax.readthedocs.io/en/latest/jax.html#jax.grad) +for reverse-mode gradients: ```python from jax import grad @@ -88,25 +104,34 @@ def tanh(x): # Define a function grad_tanh = grad(tanh) # Obtain its gradient function print(grad_tanh(1.0)) # Evaluate it at x = 1.0 -# prints 0.41997434161402603 +# prints 0.4199743 ``` You can differentiate to any order with `grad`. -For more advanced autodiff, you can use `jax.vjp` for reverse-mode -vector-Jacobian products and `jax.jvp` for forward-mode Jacobian-vector -products. The two can be composed arbitrarily with one another, and with other -JAX transformations. Here's one way to compose -those to make a function that efficiently computes full Hessian matrices: +```python +print(grad(grad(grad(tanh)))(1.0)) +# prints 0.62162673 +``` + +For more advanced autodiff, you can use +[`jax.vjp`](https://jax.readthedocs.io/en/latest/jax.html#jax.vjp) for +reverse-mode vector-Jacobian products and +[`jax.jvp`](https://jax.readthedocs.io/en/latest/jax.html#jax.defjvp) for +forward-mode Jacobian-vector products. The two can be composed arbitrarily with +one another, and with other JAX transformations. Here's one way to compose those +to make a function that efficiently computes [full Hessian +matrices](https://jax.readthedocs.io/en/latest/jax.html#jax.hessian): ```python from jax import jit, jacfwd, jacrev + def hessian(fun): return jit(jacfwd(jacrev(fun))) ``` -As with Autograd, you're free to use differentiation with Python control -structures: +As with [Autograd](https://github.com/hips/autograd), you're free to use +differentiation with Python control structures: ```python def abs_val(x): @@ -120,10 +145,17 @@ print(abs_val_grad(1.0)) # prints 1.0 print(abs_val_grad(-1.0)) # prints -1.0 (abs_val is re-evaluated) ``` -### Compilation with jit +See the [reference docs on automatic +differentiation](https://jax.readthedocs.io/en/latest/jax.html#automatic-differentiation) +and the [JAX Autodiff +Cookbook](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html) +for more. -You can use XLA to compile your functions end-to-end with `jit`, used either as -an `@jit` decorator or as a higher-order function. +### Compilation with `jit` + +You can use XLA to compile your functions end-to-end with +[`jit`](https://jax.readthedocs.io/en/latest/jax.html#just-in-time-compilation-jit), +used either as an `@jit` decorator or as a higher-order function. ```python import jax.numpy as np @@ -141,9 +173,16 @@ fast_f = jit(slow_f) You can mix `jit` and `grad` and any other JAX transformation however you like. -### Auto-vectorization with vmap +Using `jit` puts constraints on the kind of Python control flow +the function can use; see +the [Gotchas +Notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#python-control-flow-+-JIT) +for more. + +### Auto-vectorization with `vmap` -`vmap` is the vectorizing map. +[`vmap`](https://jax.readthedocs.io/en/latest/jax.html#vectorization-vmap) is +the vectorizing map. It has the familiar semantics of mapping a function along array axes, but instead of keeping the loop on the outside, it pushes the loop down into a function’s primitive operations for better performance. @@ -203,23 +242,118 @@ JAX transformation! We use `vmap` with both forward- and reverse-mode automatic differentiation for fast Jacobian and Hessian matrix calculations in `jax.jacfwd`, `jax.jacrev`, and `jax.hessian`. +### SPMD programming with `pmap` -## Quickstart: Colab in the Cloud -Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: -- [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html) -- [Training a Simple Neural Network, with PyTorch Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/Neural_Network_and_Data_Loading.ipynb) -- [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/neural_network_with_tfds_data.ipynb) +For parallel programming of multiple accelerators, like multiple GPUs, use +[`pmap`](https://jax.readthedocs.io/en/latest/jax.html#parallelization-pmap). +With `pmap` you write single-program multiple-data (SPMD) programs, including +fast parallel collective communication operations. -And for a deeper dive into JAX: -- [Common gotchas and sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) -- [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html) -- [Directly using XLA in Python](https://jax.readthedocs.io/en/latest/notebooks/XLA_in_Python.html) -- [How JAX primitives work](https://jax.readthedocs.io/en/latest/notebooks/How_JAX_primitives_work.html) -- [MAML Tutorial with JAX](https://jax.readthedocs.io/en/latest/notebooks/maml.html) -- [Generative Modeling by Estimating Gradients of Data Distribution in JAX](https://jax.readthedocs.io/en/latest/notebooks/score_matching.html). +Here's an example on an 8-GPU machine: + +```python +from jax import random + +# Create 8 random 5000 x 6000 matrices, one per GPU +keys = random.split(random.PRNGKey(0), 8) +mats = pmap(lambda key: random.normal(key, (5000, 6000)))(keys) + +# Run a local matmul on each device in parallel (no data transfer) +result = pmap(lambda x: np.dot(x, x.T))(mats) # result.shape is (8, 5000, 5000) + +# Compute the mean on each device in parallel and print the result +print(pmap(np.mean)(result)) +# prints [1.1566595 1.1805978 ... 1.2321935 1.2015157] +``` + +In addition to expressing pure maps, you can fast use [collective communication +operations](https://jax.readthedocs.io/en/latest/jax.lax.html#parallel-operators) +between devices: + +```python +from functools import partial +from jax import lax +@partial(pmap, axis_name='i') +def normalize(x): + return x / lax.psum(x, 'i') + +print(normalize(np.arange(4.))) +# prints [0. 0.16666667 0.33333334 0.5 ] +``` + +You can even [nest `pmap` functions](https://github.com/google/jax) for more +sophisticated communication patterns. + +It all composes, so you're free to differentiate through parallel computations: + +```python +from jax import grad + +@pmap +def f(x): + y = np.sin(x) + @pmap + def g(z): + return np.cos(z) * np.tan(y.sum()) * np.tanh(x).sum() + return grad(lambda w: np.sum(g(w)))(x) + +print(f(x)) +# [[ 0. , -0.7170853 ], +# [-3.1085174 , -0.4824318 ], +# [10.366636 , 13.135289 ], +# [ 0.22163185, -0.52112055]] + +print(grad(lambda x: np.sum(f(x)))(x)) +# [[ -3.2369726, -1.6356447], +# [ 4.7572474, 11.606951 ], +# [-98.524414 , 42.76499 ], +# [ -1.6007166, -1.2568436]] +``` + +When reverse-mode differentiating a `pmap` function (e.g. with `grad`), the +backward pass of the computation is parallelized just like the forward pass. + +See the [SPMD Cookbook](https://github.com/google/jax) and the [SPMD MNIST +classifier from scratch +example](https://github.com/google/jax/blob/master/examples/spmd_mnist_classifier_fromscratch.py) +for more. + +## Current gotchas + +For a more thorough survey of current gotchas, with examples and explanations, +we highly recommend reading the [Gotchas +Notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html). +Some standouts: + +1. [In-place mutating updates of + arrays](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-In-Place-Updates), like `x[i] += y`, aren't supported, but [there are functional alternatives](https://jax.readthedocs.io/en/latest/jax.ops.html). Under a `jit`, those functional alternatives will reuse buffers in-place automatically. +2. [Random numbers are + different](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-Random-Numbers), but for [good reasons](https://github.com/google/jax/blob/master/design_notes/prng.md). +3. If you're looking for [convolution + operators](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-Convolutions), + they're in the `jax.lax` package. +4. JAX enforces single-precision (32-bit, e.g. `float32`) values by default, and + [to enable + double-precision](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#Double-(64bit)-precision) + (64-bit, e.g. `float64`) one needs to set the `jax_enable_x64` variable at + startup (or set the environment variable `JAX_ENABLE_X64=True`). +5. Some of NumPy's dtype promotion semantics involving a mix of Python scalars + and NumPy types aren't preserved, namely `np.add(1, np.array([2], + np.float32)).dtype` is `float64` rather than `float32`. +6. Some transformations, like `jit`, [constrain how you can use Python control + flow](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-Control-Flow). + You'll always get loud errors if something goes wrong. You might have to use + [`jit`'s `static_argnums` + parameter](https://jax.readthedocs.io/en/latest/jax.html#just-in-time-compilation-jit), + [structured control flow + primitives](https://jax.readthedocs.io/en/latest/jax.lax.html#control-flow-operators) + like + [`lax.scan`](https://jax.readthedocs.io/en/latest/_autosummary/jax.lax.scan.html#jax.lax.scan), + or just use `jit` on smaller subfunctions. ## Installation + JAX is written in pure Python, but it depends on XLA, which needs to be compiled and installed as the `jaxlib` package. Use the following instructions to install a binary package with `pip`, or to build JAX from source. @@ -278,7 +412,8 @@ Please let us know on [the issue tracker](https://github.com/google/jax/issues) if you run into any errors or problems with the prebuilt wheels. ### Building JAX from source -See [Building JAX from source](https://jax.readthedocs.io/en/latest/developer.html#building-from-source). +See [Building JAX from +source](https://jax.readthedocs.io/en/latest/developer.html#building-from-source). ## Citing JAX @@ -290,7 +425,7 @@ To cite this repository: author = {James Bradbury and Roy Frostig and Peter Hawkins and Matthew James Johnson and Chris Leary and Dougal Maclaurin and Skye Wanderman-Milne}, title = {{JAX}: composable transformations of {P}ython+{N}um{P}y programs}, url = {http://github.com/google/jax}, - version = {0.1.46}, + version = {0.1.55}, year = {2018}, } ``` diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 9104331c9a64..e5378504722d 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -167,9 +167,7 @@ "\n", "Allowing mutation of variables in-place makes program analysis and transformation very difficult. JAX requires a pure functional expression of a numerical program. \n", "\n", - "Instead, JAX offers the _functional_ update functions: __index_update__, __index_add__, __index_min__, __index_max__, and the __index__ helper.\n", - "\n", - "__NB__: _Fancy Indexing_ is __not__ yet supported, but will likely be added to JAX soon.\n", + "Instead, JAX offers the _functional_ update functions: [__index_update__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_update.html#jax.ops.index_update), [__index_add__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_add.html#jax.ops.index_add), [__index_min__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_min.html#jax.ops.index_min), [__index_max__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_max.html#jax.ops.index_max), and the [__index__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index.html#jax.ops.index) helper.\n", "\n", "️⚠️ inside `jit`'d code and `lax.while_loop` or `lax.fori_loop` the __size__ of slices can't be functions of argument _values_ but only functions of argument _shapes_ -- the slice start indices have no such restriction. See the below __Control Flow__ Section for more information on this limitation." ] @@ -1101,7 +1099,7 @@ "source": [ "### Structured control flow primitives\n", "\n", - "There are more options for control flow in JAX. Say you want to avoid re-compilations but still want to use control flow that's traceable, and that avoids un-rolling large loops. then you can use these 4 structured control flow primitives:\n", + "There are more options for control flow in JAX. Say you want to avoid re-compilations but still want to use control flow that's traceable, and that avoids un-rolling large loops. Then you can use these 4 structured control flow primitives:\n", "\n", " - `lax.cond` _will be differentiable soon_\n", " - `lax.while_loop` __non-differentiable__*\n", From 0ad8837f2fc69fd944c9106342675ae24ac5d1d3 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 14 Dec 2019 08:16:01 -0800 Subject: [PATCH 0514/1053] tweak wording around installing jaxlib --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8554a8ce63d7..8f2b7d52b92b 100644 --- a/README.md +++ b/README.md @@ -354,9 +354,9 @@ Some standouts: ## Installation -JAX is written in pure Python, but it depends on XLA, which needs to be compiled -and installed as the `jaxlib` package. Use the following instructions to -install a binary package with `pip`, or to build JAX from source. +JAX is written in pure Python, but it depends on XLA, which needs to be +installed as the `jaxlib` package. Use the following instructions to install a +binary package with `pip`, or to build JAX from source. We support installing or building `jaxlib` on Linux (Ubuntu 16.04 or later) and macOS (10.12 or later) platforms, but not yet Windows. We're not currently From 764f007f9a921d0c774d789176f4d62b0c0a6cef Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 14 Dec 2019 08:23:27 -0800 Subject: [PATCH 0515/1053] point pmap links to cloud tpu colabs --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8f2b7d52b92b..9ded3063624c 100644 --- a/README.md +++ b/README.md @@ -282,7 +282,7 @@ print(normalize(np.arange(4.))) # prints [0. 0.16666667 0.33333334 0.5 ] ``` -You can even [nest `pmap` functions](https://github.com/google/jax) for more +You can even [nest `pmap` functions](https://colab.sandbox.google.com/github/google/jax/blob/master/cloud_tpu_colabs/Pmap_Cookbook.ipynb#scrollTo=MdRscR5MONuN) for more sophisticated communication patterns. It all composes, so you're free to differentiate through parallel computations: @@ -314,8 +314,9 @@ print(grad(lambda x: np.sum(f(x)))(x)) When reverse-mode differentiating a `pmap` function (e.g. with `grad`), the backward pass of the computation is parallelized just like the forward pass. -See the [SPMD Cookbook](https://github.com/google/jax) and the [SPMD MNIST -classifier from scratch +See the [SPMD +Cookbook](https://colab.sandbox.google.com/github/google/jax/blob/master/cloud_tpu_colabs/Pmap_Cookbook.ipynb) +and the [SPMD MNIST classifier from scratch example](https://github.com/google/jax/blob/master/examples/spmd_mnist_classifier_fromscratch.py) for more. From 5c800367d11be981857caff29a81fe3053b87f51 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 14 Dec 2019 08:34:01 -0800 Subject: [PATCH 0516/1053] mention cloud tpus in readme --- README.md | 14 ++++++++++---- cloud_tpu_colabs/README.md | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9ded3063624c..61c7b6ebe22b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,9 @@ executed. But JAX also lets you just-in-time compile your own Python functions into XLA-optimized kernels using a one-function API, [`jit`](#compilation-with-jit). Compilation and automatic differentiation can be composed arbitrarily, so you can express sophisticated algorithms and get -maximal performance without leaving Python. +maximal performance without leaving Python. You can even program multiple GPUs +or TPU cores at once using [`pmap`](#spmd-programming-with-pmap), and +differentiate through the whole thing. Dig a little deeper, and you'll see that JAX is really an extensible system for [composable function transformations](#transformations). Both @@ -37,7 +39,7 @@ Dig a little deeper, and you'll see that JAX is really an extensible system for are instances of such transformations. Others are [`vmap`](#auto-vectorization-with-vmap) for automatic vectorization and [`pmap`](#spmd-programming-with-pmap) for single-program multiple-data (SPMD) -parallel programming, with more to come. +parallel programming of multiple accelerators, with more to come. This is a research project, not an official Google product. Expect bugs and [sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html). @@ -72,11 +74,15 @@ perex_grads = jit(vmap(grad_fun, in_axes=(None, 0, 0))) # fast per-example grad * [Reference documentation](#reference-documentation) ## Quickstart: Colab in the Cloud -Jump right in using a notebook in your browser, connected to a Google Cloud GPU. Here are some starter notebooks: +Jump right in using a notebook in your browser, connected to a Google Cloud GPU. +Here are some starter notebooks: - [The basics: NumPy on accelerators, `grad` for differentiation, `jit` for compilation, and `vmap` for vectorization](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html) - [Training a Simple Neural Network, with TensorFlow Dataset Data Loading](https://colab.research.google.com/github/google/jax/blob/master/docs/notebooks/neural_network_with_tfds_data.ipynb) -And for a deeper dive into JAX: +**JAX now runs on Cloud TPUs.** To try out the preview, see the [Cloud TPU +Colabs](https://github.com/google/jax/tree/master/cloud_tpu_colabs). + +For a deeper dive into JAX: - [The Autodiff Cookbook, Part 1: easy and powerful automatic differentiation in JAX](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html) - [Common gotchas and sharp edges](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html) - See the [full list of diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md index b3cf8a3c98d2..11c31be72994 100644 --- a/cloud_tpu_colabs/README.md +++ b/cloud_tpu_colabs/README.md @@ -23,7 +23,7 @@ Solve the wave equation with `pmap`, and make cool movies! The spatial domain is ![](https://raw.githubusercontent.com/google/jax/master/cloud_tpu_colabs/images/wave_movie.gif) ### [JAX Demo](https://colab.research.google.com/github/google/jax/blob/master/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb) -An overview of JAX presented at the Program Transformations for ML workshop at NeurIPS 2019. Covers basic numpy usage, grad, jit, vmap, and pmap. +An overview of JAX presented at the [Program Transformations for ML workshop at NeurIPS 2019](https://program-transformations.github.io/). Covers basic numpy usage, `grad`, `jit`, `vmap`, and `pmap`. ## Performance notes From 6ba39f763d6326f73536b2ef2b41fffb98582086 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 14 Dec 2019 10:33:37 -0800 Subject: [PATCH 0517/1053] tweak demo --- cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb | 141 +++++++++++++------ 1 file changed, 101 insertions(+), 40 deletions(-) diff --git a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb index a13866a08a52..403b0bb25b26 100644 --- a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb +++ b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb @@ -193,7 +193,7 @@ "colab": {} }, "source": [ - "%timeit np.dot(x, x).block_until_ready()" + "%timeit -n 5 -r 5 np.dot(x, x).block_until_ready()" ], "execution_count": 0, "outputs": [] @@ -303,8 +303,8 @@ "params = list(map(init_layer, keys, layer_sizes[:-1], layer_sizes[1:]))\n", "\n", "key, *keys = random.split(key, 3)\n", - "inputs = random.normal(keys[0], (10, 5))\n", - "targets = random.normal(keys[1], (10, 3))\n", + "inputs = random.normal(keys[0], (8, 5))\n", + "targets = random.normal(keys[1], (8, 3))\n", "batch = (inputs, targets)" ], "execution_count": 0, @@ -590,8 +590,19 @@ "colab": {} }, "source": [ - "g = jit(f, static_argnums=(1,))\n", - "\n", + "g = jit(f, static_argnums=(1,))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "HcWjxVktV4fa", + "colab_type": "code", + "colab": {} + }, + "source": [ "g(np.array([1., 2., 3.]), 5)" ], "execution_count": 0, @@ -779,16 +790,6 @@ "execution_count": 0, "outputs": [] }, - { - "cell_type": "markdown", - "metadata": { - "id": "CejmguoAZQlZ", - "colab_type": "text" - }, - "source": [ - "### Device transfer details" - ] - }, { "cell_type": "code", "metadata": { @@ -797,14 +798,10 @@ "colab": {} }, "source": [ - "# create 8 random keys\n", "keys = random.split(random.PRNGKey(0), 8)\n", - "\n", - "# create a 5000 x 6000 matrix on each device by mapping over keys\n", - "mats = pmap(lambda key: random.normal(key, (5000, 6000)))(keys)\n", - "\n", - "# the stack of matrices is represented logically as a single array\n", - "mats.shape" + "mats = pmap(lambda key: random.normal(key, (5000, 5000)))(keys)\n", + "result = pmap(np.dot)(mats, mats)\n", + "print(pmap(np.mean)(result))" ], "execution_count": 0, "outputs": [] @@ -817,23 +814,7 @@ "colab": {} }, "source": [ - "# run a local matmul on each device in parallel (no data transfer)\n", - "result = pmap(lambda x: np.dot(x, x.T))(mats)\n", - "result.shape" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "2os_Qio6rFKv", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# compute the mean on each device in parallel and print the results\n", - "print(pmap(np.mean)(result))" + "timeit -n 5 -r 5 pmap(np.dot)(mats, mats).block_until_ready()" ], "execution_count": 0, "outputs": [] @@ -895,6 +876,16 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "metadata": { + "id": "jC-KIMQ1q-lK", + "colab_type": "text" + }, + "source": [ + "For more, see the [`pmap` cookbook](https://colab.sandbox.google.com/github/google/jax/blob/master/cloud_tpu_colabs/Pmap_Cookbook.ipynb)." + ] + }, { "cell_type": "markdown", "metadata": { @@ -938,6 +929,76 @@ ], "execution_count": 0, "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WD9xtROsYX4i", + "colab_type": "text" + }, + "source": [ + "### Compose everything" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "h65c9AQCWAyn", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import jvp, vjp # forward and reverse-mode\n", + "\n", + "curry = lambda f: partial(partial, f)\n", + "\n", + "@curry\n", + "def jacfwd(fun, x):\n", + " pushfwd = partial(jvp, fun, (x,)) # jvp!\n", + " std_basis = np.eye(onp.size(x)).reshape((-1,) + np.shape(x)),\n", + " y, jac_flat = vmap(pushfwd, out_axes=(None, -1))(std_basis) # vmap!\n", + " return jac_flat.reshape(np.shape(y) + np.shape(x))\n", + "\n", + "@curry\n", + "def jacrev(fun, x):\n", + " y, pullback = vjp(fun, x) # vjp!\n", + " std_basis = np.eye(onp.size(y)).reshape((-1,) + np.shape(y))\n", + " jac_flat, = vmap(pullback)(std_basis) # vmap!\n", + " return jac_flat.reshape(np.shape(y) + np.shape(x))\n", + "\n", + "def hessian(fun):\n", + " return jit(jacfwd(jacrev(fun))) # jit!" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "G9qDX84RWhW7", + "colab_type": "code", + "colab": {} + }, + "source": [ + "input_hess = hessian(lambda inputs: loss(params, (inputs, targets)))\n", + "per_example_hess = pmap(input_hess) # pmap!\n", + "per_example_hess(inputs)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "u3ggM_WYZ8QC", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] } ] -} +} \ No newline at end of file From 698327080be9fd4658291fc918d764b8f214f0d2 Mon Sep 17 00:00:00 2001 From: Julius Kunze Date: Sun, 15 Dec 2019 15:43:39 +0000 Subject: [PATCH 0518/1053] Clarify documentation --- jax/random.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index a0e91ab782de..dead56231acd 100644 --- a/jax/random.py +++ b/jax/random.py @@ -951,7 +951,8 @@ def categorical(key, logits, axis=-1, shape=()): Args: key: a PRNGKey used as the random key. - logits: Unnormalized log probabilities of the categorical distribution(s) to sample from. + logits: Unnormalized log probabilities of the categorical distribution(s) to sample from, so that + `softmax(logits, axis)` gives the corresponding probabilities. axis: Specifies the axis along which logits belong to the same categorical distribution. shape: Specifies how many samples to take per categorical distribution and in what shape to arrange them. From c952ed4f5fb7c8df00fba4eefea060962fc277ad Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Dec 2019 09:32:55 -0800 Subject: [PATCH 0519/1053] update readme to clarify Cloud TPU preview status --- cloud_tpu_colabs/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md index 11c31be72994..6fbf9b114b6c 100644 --- a/cloud_tpu_colabs/README.md +++ b/cloud_tpu_colabs/README.md @@ -1,6 +1,8 @@ -# Example Cloud TPU notebooks +# JAX Cloud TPU Preview -JAX now runs on Cloud TPUs! +JAX now runs on Cloud TPUs! **This is a preview**, and we're still working on it. Help us out by kicking the tires, and letting us know on [the issue tracker](https://github.com/google/jax/issues) if you run into any problems. + +## Example Cloud TPU notebooks The following notebooks showcase how to use and what you can do with Cloud TPUs on Colab: From a6da7e8bf90b4d1be5acce8bb9fe89e11035941c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 16 Dec 2019 09:58:30 -0800 Subject: [PATCH 0520/1053] Link to "Reporting issues" at top of Cloud TPU README. --- cloud_tpu_colabs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md index 6fbf9b114b6c..dad523ff4fff 100644 --- a/cloud_tpu_colabs/README.md +++ b/cloud_tpu_colabs/README.md @@ -1,6 +1,6 @@ # JAX Cloud TPU Preview -JAX now runs on Cloud TPUs! **This is a preview**, and we're still working on it. Help us out by kicking the tires, and letting us know on [the issue tracker](https://github.com/google/jax/issues) if you run into any problems. +JAX now runs on Cloud TPUs! **This is a preview**, and we're still working on it. Help us out by kicking the tires, and letting us know if you run into any problems (see the [Reporting issues](#reporting-issues) section below). ## Example Cloud TPU notebooks From b26a12a3585bfae318b5585198238b5354751657 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 16 Dec 2019 20:48:19 -0500 Subject: [PATCH 0521/1053] =?UTF-8?q?Implement=20bool=5F=20support=20for?= =?UTF-8?q?=20jnp.add,=20jnp.multiply,=20jnp.einsum,=20lax.do=E2=80=A6=20(?= =?UTF-8?q?#1872)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Implement bool_ support for jnp.add, jnp.multiply, jnp.einsum, lax.dot and lax.dot_general. Fix dtype rules for `lax._reduce_sum` and `lax._reduce_prod` to check for number inputs. Improve error messages for type mismatches to correctly describe scalar type categories (e.g. 'floating') rather than what `onp.dtype(...).name` returns (e.g., 'float64'). Remove redundant `bfloat16` type in `lax._float`, which has been redundant since `dtypes.issubdtype` was taught about `bfloat16` support. --- jax/lax/lax.py | 53 +++++++++++++++++----------------- jax/numpy/lax_numpy.py | 14 +++++++-- tests/lax_numpy_einsum_test.py | 12 ++++---- tests/lax_numpy_test.py | 18 ++++++------ tests/lax_test.py | 14 +++++---- 5 files changed, 61 insertions(+), 50 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index ccb88b378db6..e33877859dcb 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -535,18 +535,6 @@ def dot(lhs, rhs, precision=None): Returns: An array containing the product. """ - # TODO(b/134526360): XLA doesn't support integer dots, so we emit a sum of - # products instead. - if dtypes.issubdtype(lhs.dtype, onp.integer): - lhs_shape = onp.shape(lhs) - lhs_ndim = len(lhs_shape) - rhs_ndim = onp.ndim(rhs) - if rhs_ndim > 1: - lhs = broadcast_in_dim(lhs, lhs_shape + (1,), tuple(range(len(lhs_shape)))) - if lhs_ndim > 1: - rhs = broadcast(rhs, (1,)) - return reduce(mul(lhs, rhs), _zero(lhs), add, (len(lhs_shape) - 1,)) - if 1 <= lhs.ndim <= 2 and 1 <= rhs.ndim <= 2 and lhs.shape[-1] == rhs.shape[0]: return dot_general(lhs, rhs, (((lhs.ndim - 1,), (0,)), ((), ())), precision=precision) @@ -576,9 +564,9 @@ def dot_general(lhs, rhs, dimension_numbers, precision=None): contract_dims, batch_dims = dimension_numbers contract_dims = tuple(map(tuple, contract_dims)) batch_dims = tuple(map(tuple, batch_dims)) - if dtypes.issubdtype(lhs.dtype, onp.integer): - # TODO(b/134526360): XLA doesn't support integer dots, so we emit a sum of - # products instead. + if not dtypes.issubdtype(lhs.dtype, onp.inexact): + # TODO(b/134526360): XLA doesn't support bool or integer dots, so we emit a + # sum of products instead. lhs_contract_dims, rhs_contract_dims = contract_dims lhs_batch_dims, rhs_batch_dims = batch_dims lhs_noncontract_dims = tuple(sorted( @@ -589,16 +577,19 @@ def dot_general(lhs, rhs, dimension_numbers, precision=None): lhs_batch_dims + lhs_noncontract_dims + lhs_contract_dims) rhs = transpose(rhs, rhs_batch_dims + rhs_noncontract_dims + rhs_contract_dims) - new_lhs_shape = onp.insert( - onp.shape(lhs), len(lhs_batch_dims) + len(lhs_noncontract_dims), - (1,) * len(rhs_noncontract_dims)) - new_rhs_shape = onp.insert(onp.shape(rhs), len(lhs_batch_dims), + new_lhs_shape = onp.insert(onp.array(onp.shape(lhs), dtype=onp.int64), + len(lhs_batch_dims) + len(lhs_noncontract_dims), + (1,) * len(rhs_noncontract_dims)) + new_rhs_shape = onp.insert(onp.array(onp.shape(rhs), dtype=onp.int64), + len(lhs_batch_dims), (1,) * len(lhs_noncontract_dims)) lhs = reshape(lhs, new_lhs_shape) rhs = reshape(rhs, new_rhs_shape) out_ndim = (len(lhs_batch_dims) + len(lhs_noncontract_dims) + len(rhs_noncontract_dims)) - return reduce(mul(lhs, rhs), _zero(lhs), add, + op_product = bitwise_and if lhs.dtype == onp.bool_ else mul + op_sum = bitwise_or if lhs.dtype == onp.bool_ else add + return reduce(op_product(lhs, rhs), _zero(lhs), op_sum, tuple(range(out_ndim, out_ndim + len(lhs_contract_dims)))) return dot_general_p.bind(lhs, rhs, @@ -1526,7 +1517,7 @@ def unop_dtype_rule(result_dtype, accepted_dtypes, name, aval, **kwargs): if not any(dtypes.issubdtype(aval.dtype, t) for t in accepted_dtypes): msg = '{} does not accept dtype {}. Accepted dtypes are subtypes of {}.' typename = str(onp.dtype(aval.dtype).name) - accepted_typenames = (str(onp.dtype(t).name) for t in accepted_dtypes) + accepted_typenames = (t.__name__ for t in accepted_dtypes) raise TypeError(msg.format(name, typename, ', '.join(accepted_typenames))) return result_dtype(aval.dtype) @@ -1548,7 +1539,7 @@ def binop_dtype_rule(result_dtype, accepted_dtypes, name, *avals, **kwargs): msg = ('{} does not accept dtype {} at position {}. ' 'Accepted dtypes at position {} are subtypes of {}.') typename = str(onp.dtype(aval_dtype).name) - typenames = ', '.join(str(onp.dtype(t).name) for t in types) + typenames = ', '.join(t.__name__ for t in types) raise TypeError(msg.format(name, typename, i, i, typenames)) _check_same_dtypes(name, False, *aval_dtypes) return result_dtype(*avals) @@ -1611,7 +1602,7 @@ def _brcast_to(x, shape): return broadcast(x, shape) -_float = {onp.floating, dtypes.bfloat16} +_float = {onp.floating} _complex = {onp.complexfloating} _complex_elem_types = {onp.float32, onp.float64} _int = {onp.integer} @@ -3384,6 +3375,12 @@ def _reducer_masking_rule(prim, identity, padded_vals, logical_shapes, batching.primitive_batchers[reduce_p] = _reduce_batch_rule +def _reduce_number_dtype_rule(name, operand, *args, **kw): + if not dtypes.issubdtype(operand.dtype, onp.number): + raise TypeError("{} does not accept dtype {}. Accepted dtypes are subtypes " + "of number.".format(name, onp.dtype(operand.dtype).name)) + return dtypes.canonicalize_dtype(operand.dtype) + def _reduce_sum_shape_rule(operand, axes, input_shape): assert operand.shape == input_shape, ('{} != {}' .format(operand.shape, input_shape)) @@ -3402,8 +3399,9 @@ def _reduce_sum_transpose_rule(cotangent, input_shape, axes): assert result.shape == input_shape return [result] -reduce_sum_p = standard_primitive(_reduce_sum_shape_rule, _input_dtype, - 'reduce_sum', _reduce_sum_translation_rule) +reduce_sum_p = standard_primitive( + _reduce_sum_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_sum'), + 'reduce_sum', _reduce_sum_translation_rule) ad.deflinear(reduce_sum_p, _reduce_sum_transpose_rule) batching.defreducer(reduce_sum_p) _masking_defreducer(reduce_sum_p, @@ -3450,8 +3448,9 @@ def _reduce_prod_jvp_rule(tangent, operand, axes): # Multiply partial products with the tangents and sum. return _reduce_sum(mul(tangent, mul(left_products, right_products)), (0,)) -reduce_prod_p = standard_primitive(_reduce_prod_shape_rule, _input_dtype, - 'reduce_prod', _reduce_prod_translation_rule) +reduce_prod_p = standard_primitive( + _reduce_prod_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_prod'), + 'reduce_prod', _reduce_prod_translation_rule) ad.defjvp(reduce_prod_p, _reduce_prod_jvp_rule) batching.defreducer(reduce_prod_p) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index d4b42401a8b3..80b5b81454a0 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -388,6 +388,12 @@ def _one_to_one_binop(numpy_fn, lax_fn, promote_to_inexact=False): fn = lambda x1, x2: lax_fn(*_promote_args(numpy_fn.__name__, x1, x2)) return _wraps(numpy_fn)(fn) +def _maybe_bool_binop(numpy_fn, lax_fn, bool_lax_fn): + def fn(x1, x2): + x1, x2 = _promote_args(numpy_fn.__name__, x1, x2) + return lax_fn(x1, x2) if x1.dtype != bool_ else bool_lax_fn(x1, x2) + return _wraps(numpy_fn)(fn) + absolute = abs = _one_to_one_unop(onp.absolute, lax.abs) fabs = _one_to_one_unop(onp.fabs, lax.abs, True) bitwise_not = _one_to_one_unop(onp.bitwise_not, lax.bitwise_not) @@ -413,14 +419,14 @@ def _one_to_one_binop(numpy_fn, lax_fn, promote_to_inexact=False): sqrt = _one_to_one_unop(onp.sqrt, lax.sqrt, True) -add = _one_to_one_binop(onp.add, lax.add) +add = _maybe_bool_binop(onp.add, lax.add, lax.bitwise_or) bitwise_and = _one_to_one_binop(onp.bitwise_and, lax.bitwise_and) bitwise_or = _one_to_one_binop(onp.bitwise_or, lax.bitwise_or) bitwise_xor = _one_to_one_binop(onp.bitwise_xor, lax.bitwise_xor) right_shift = _one_to_one_binop(onp.right_shift, lax.shift_right_arithmetic) left_shift = _one_to_one_binop(onp.left_shift, lax.shift_left) equal = _one_to_one_binop(onp.equal, lax.eq) -multiply = _one_to_one_binop(onp.multiply, lax.mul) +multiply = _maybe_bool_binop(onp.multiply, lax.mul, lax.bitwise_and) not_equal = _one_to_one_binop(onp.not_equal, lax.ne) subtract = _one_to_one_binop(onp.subtract, lax.sub) arctan2 = _one_to_one_binop(onp.arctan2, lax.atan2, True) @@ -2244,7 +2250,9 @@ def einsum_path(subscripts, *operands, **kwargs): @partial(jit, static_argnums=(1, 2)) def _einsum(operands, contractions, precision): operands = list(_promote_dtypes(*operands)) - sum = lambda x, axes: lax.reduce(x, onp.array(0, x.dtype), lax.add, axes) + def sum(x, axes): + return lax.reduce(x, onp.array(0, x.dtype), + lax.add if x.dtype != bool_ else lax.bitwise_or, axes) def sum_uniques(operand, names, uniques): if uniques: diff --git a/tests/lax_numpy_einsum_test.py b/tests/lax_numpy_einsum_test.py index 7014e91032e9..b1d4fcbc282c 100644 --- a/tests/lax_numpy_einsum_test.py +++ b/tests/lax_numpy_einsum_test.py @@ -225,7 +225,8 @@ def test_tf_unsupported_3(self): # these tests are based on https://github.com/dask/dask/pull/3412/files @parameterized.named_parameters( - {"testcase_name": "_{}".format(einstr), "einstr": einstr} + {"testcase_name": "_{}_dtype={}".format(einstr, dtype.__name__), + "einstr": einstr, "dtype": dtype} for einstr in [ 'abc,bad->abcd', 'abcdef,bcdfg->abcdeg', @@ -256,9 +257,10 @@ def test_tf_unsupported_3(self): 'aab,bcc->ac', 'fdf,cdd,ccd,afe->ae', 'fff,fae,bef,def->abd', - ]) - def test_from_dask(self, einstr): - r = rng() + ] + for dtype in [np.float32, np.int32, np.complex64, np.bool_]) + def test_from_dask(self, einstr, dtype): + r = jtu.rand_default() if '->' in einstr: input_str, result_names = einstr.split('->') else: @@ -269,7 +271,7 @@ def test_from_dask(self, einstr): shapes = defaultdict(lambda: next(dims)) input_shapes = [tuple(shapes[c] for c in names.replace('...', '01')) for names in input_names] - operands = [r.randn(*shape) for shape in input_shapes] + operands = [r(shape, dtype) for shape in input_shapes] self._check(einstr, *operands) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index f16249e2263e..86a178cc82c3 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -96,7 +96,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, JAX_ONE_TO_ONE_OP_RECORDS = [ op_record("abs", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), - op_record("add", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("add", 2, all_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("ceil", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("conj", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), @@ -109,23 +109,23 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, onp.float64: 1e-12, onp.complex64: 2e-4, onp.complex128: 1e-12}, check_dtypes=False), op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default, []), - op_record("greater", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), - op_record("greater_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), - op_record("less", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), - op_record("less_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("greater", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("greater_equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("less", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), + op_record("less_equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, []), op_record("log", 1, number_dtypes, all_shapes, jtu.rand_positive, ["rev"], inexact=True), op_record("logical_and", 2, all_dtypes, all_shapes, jtu.rand_bool, []), op_record("logical_not", 1, all_dtypes, all_shapes, jtu.rand_bool, []), op_record("logical_or", 2, all_dtypes, all_shapes, jtu.rand_bool, []), op_record("logical_xor", 2, all_dtypes, all_shapes, jtu.rand_bool, []), - op_record("maximum", 2, number_dtypes, all_shapes, jtu.rand_some_inf, []), - op_record("minimum", 2, number_dtypes, all_shapes, jtu.rand_some_inf, []), - op_record("multiply", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), + op_record("maximum", 2, all_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("minimum", 2, all_dtypes, all_shapes, jtu.rand_some_inf, []), + op_record("multiply", 2, all_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("negative", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("nextafter", 2, [f for f in float_dtypes if f != lnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], inexact=True, tolerance=0), - op_record("not_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), + op_record("not_equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), op_record("array_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), op_record("reciprocal", 1, inexact_dtypes, all_shapes, jtu.rand_default, []), op_record("subtract", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), diff --git a/tests/lax_test.py b/tests/lax_test.py index 8eb9a4dca943..be0820f030fa 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -634,7 +634,7 @@ def fun_via_grad(lhs, rhs): "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "precision": precision, "rng_factory": rng_factory} for lhs_shape in [(3,), (4, 3)] for rhs_shape in [(3,), (3, 6)] - for dtype in default_dtypes + for dtype in all_dtypes for precision in [None, lax.Precision.DEFAULT, lax.Precision.HIGH, lax.Precision.HIGHEST] for rng_factory in [jtu.rand_default])) @@ -651,14 +651,16 @@ def testDot(self, lhs_shape, rhs_shape, dtype, precision, rng_factory): "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, "rng_factory": rng_factory} for lhs_shape in [(3,), (4, 3)] for rhs_shape in [(3,), (3, 6)] - for dtype in default_dtypes + for dtype in all_dtypes for rng_factory in [jtu.rand_default])) def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] tol = { onp.float16: 1e-2, - onp.float64: max(jtu.default_tolerance()[onp.dtype(onp.float64)], 1e-14) + onp.float64: max(jtu.default_tolerance()[onp.dtype(onp.float64)], 1e-14), + onp.complex128: max(jtu.default_tolerance()[onp.dtype(onp.complex128)], + 1e-14) } lax_op = partial(lax.dot, precision=lax.Precision.HIGHEST) self._CheckAgainstNumpy(lax_op, lax_reference.dot, args_maker, tol=tol) @@ -680,7 +682,7 @@ def testDotAgainstNumpy(self, lhs_shape, rhs_shape, dtype, rng_factory): [(1, 2, 2, 3), (1, 2, 3, 1), [1], [1]], [(3, 2), (2, 4), [1], [0]], ] - for dtype in default_dtypes + for dtype in all_dtypes for rng_factory in [jtu.rand_small])) def testDotGeneralContractOnly(self, lhs_shape, rhs_shape, dtype, lhs_contracting, rhs_contracting, rng_factory): @@ -705,7 +707,7 @@ def fun(lhs, rhs): ((3, 3, 2), (3, 2, 4), (([2], [1]), ([0], [0]))), ((3, 4, 2, 4), (3, 4, 3, 2), (([2], [3]), ([0, 1], [0, 1]))), ] - for dtype in default_dtypes + for dtype in all_dtypes for rng_factory in [jtu.rand_small])) def testDotGeneralContractAndBatch(self, lhs_shape, rhs_shape, dtype, dimension_numbers, rng_factory): @@ -729,7 +731,7 @@ def fun(lhs, rhs): ((3, 3, 2), (3, 2, 4), (([2], [1]), ([0], [0]))), ((3, 4, 2, 4), (3, 4, 3, 2), (([2], [3]), ([0, 1], [0, 1]))), ] - for dtype in default_dtypes + for dtype in all_dtypes for rng_factory in [jtu.rand_small])) def testDotGeneralAgainstNumpy(self, lhs_shape, rhs_shape, dtype, dimension_numbers, rng_factory): From 4af04cefa98dac7fc99ec6b5162580aa6750f5f2 Mon Sep 17 00:00:00 2001 From: tamaranorman Date: Tue, 17 Dec 2019 02:03:17 +0000 Subject: [PATCH 0522/1053] Support dilated transposed convolutions in the conv_transpose op. (#1823) PiperOrigin-RevId: 284155973 --- jax/experimental/stax.py | 4 ++-- jax/lax/lax.py | 14 +++++++++---- tests/lax_test.py | 44 ++++++++++++++++++++++++++-------------- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/jax/experimental/stax.py b/jax/experimental/stax.py index 8c745fb728ab..a59dc6e74e8e 100644 --- a/jax/experimental/stax.py +++ b/jax/experimental/stax.py @@ -87,7 +87,7 @@ def init_fun(rng, input_shape): def apply_fun(params, inputs, **kwargs): W, b = params return lax.conv_general_dilated(inputs, W, strides, padding, one, one, - dimension_numbers) + b + dimension_numbers=dimension_numbers) + b return init_fun, apply_fun Conv = functools.partial(GeneralConv, ('NHWC', 'HWIO', 'NHWC')) @@ -115,7 +115,7 @@ def init_fun(rng, input_shape): def apply_fun(params, inputs, **kwargs): W, b = params return lax.conv_transpose(inputs, W, strides, padding, - dimension_numbers) + b + dimension_numbers=dimension_numbers) + b return init_fun, apply_fun Conv1DTranspose = functools.partial(GeneralConvTranspose, ('NHC', 'HIO', 'NHC')) ConvTranspose = functools.partial(GeneralConvTranspose, diff --git a/jax/lax/lax.py b/jax/lax/lax.py index e33877859dcb..4a5e128b22fc 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1214,8 +1214,8 @@ def _flip_axes(x, axes): return x -def conv_transpose(lhs, rhs, strides, padding, dimension_numbers=None, - transpose_kernel=False, precision=None): +def conv_transpose(lhs, rhs, strides, padding, rhs_dilation=None, + dimension_numbers=None, transpose_kernel=False, precision=None): """Convenience wrapper for calculating the N-d convolution "transpose". This function directly calculates a fractionally strided conv rather than @@ -1228,6 +1228,9 @@ def conv_transpose(lhs, rhs, strides, padding, dimension_numbers=None, padding: 'SAME', 'VALID' will set as transpose of corresponding forward conv, or a sequence of `n` integer 2-tuples describing before-and-after padding for each `n` spatial dimension. + rhs_dilation: `None`, or a sequence of `n` integers, giving the + dilation factor to apply in each spatial dimension of `rhs`. RHS dilation + is also known as atrous convolution. dimension_numbers: tuple of dimension descriptors as in lax.conv_general_dilated. Defaults to tensorflow convention. transpose_kernel: if True flips spatial axes and swaps the input/output @@ -1260,15 +1263,18 @@ def conv_transpose(lhs, rhs, strides, padding, dimension_numbers=None, k_sdims = k_shape[2:] # Calculate correct output shape given padding and strides. if padding in {'SAME', 'VALID'}: + if rhs_dilation is None: + rhs_dilation = (1,) * (rhs.ndim - 2) + effective_k_size = map(lambda k, r: (k-1) * r + 1, k_sdims, rhs_dilation) pads = [_conv_transpose_padding(k, s, padding) - for k,s in zip(k_sdims.tolist(), strides)] + for k,s in zip(effective_k_size, strides)] else: pads = padding if transpose_kernel: # flip spatial dims and swap input / output channel axes rhs = _flip_axes(rhs, onp.array(dn.rhs_spec)[2:]) rhs = onp.swapaxes(rhs, dn.rhs_spec[0], dn.rhs_spec[1]) - return conv_general_dilated(lhs, rhs, one, pads, strides, one, dn, + return conv_general_dilated(lhs, rhs, one, pads, strides, rhs_dilation, dn, precision=precision) diff --git a/tests/lax_test.py b/tests/lax_test.py index be0820f030fa..36341fbb35e7 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -490,19 +490,21 @@ def fun(lhs, rhs): @staticmethod def _conv_transpose_via_grad(data, kernel, strides, padding, - dimension_numbers=None): + rhs_dilation=None, dimension_numbers=None): """Helper method: calculates conv transpose via grad for testing.""" assert len(data.shape) == len(kernel.shape) nspatial = len(data.shape) - 2 one = (1,) * nspatial + rhs_dilation = rhs_dilation or one dn = lax.conv_dimension_numbers(data.shape, kernel.shape, dimension_numbers) in_shape = onp.take(data.shape, dn.lhs_spec) in_sdims = in_shape[2:] k_shape = onp.take(kernel.shape, dn.rhs_spec) k_sdims = k_shape[2:] + e_k_sdims = [(k-1) * r + 1 for k, r in zip(k_sdims, rhs_dilation)] if padding == 'VALID': - o_sdims = [in_sdims[i]*strides[i] + max(k_sdims[i]-strides[i],0) + o_sdims = [in_sdims[i]*strides[i] + max(e_k_sdims[i]-strides[i],0) for i in range(nspatial)] elif padding == 'SAME': o_sdims = [in_sdims[i]*strides[i] for i in range(nspatial)] @@ -512,7 +514,7 @@ def _conv_transpose_via_grad(data, kernel, strides, padding, o_layout = onp.take(onp.array(o_shape), out_spec_inv) placeholder = onp.ones(o_layout, data.dtype) conv = lambda x: lax.conv_general_dilated(x, kernel, strides, padding, - one, one, dn) + one, rhs_dilation, dn) _, g = api.vjp(conv, placeholder) return g(data)[0] @@ -528,11 +530,12 @@ def _transpose_conv_kernel(data, kernel, dimension_numbers): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": - "_lhs_shape={}_rhs_shape={}_strides={}_padding={}".format( + "_lhs_shape={}_rhs_shape={}_strides={}_padding={}_rhs_dilation={}".format( jtu.format_shape_dtype_string(lhs_shape, dtype), - jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), + jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding, rhs_dilation), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng_factory": rng_factory, 'dspec': dspec} + "strides": strides, "padding": padding, "rhs_dilation": rhs_dilation, + "rng_factory": rng_factory, 'dspec': dspec} for lhs_shape, rhs_shape in [ ((b, 9, 10, i), (k, k, j, i)) # NB: i,j flipped in RHS for transpose for b, i, j, k in itertools.product([2,3],[2,3],[2,3],[3,4,5])] @@ -540,9 +543,10 @@ def _transpose_conv_kernel(data, kernel, dimension_numbers): for strides in [(1, 1), (1, 2), (2, 1), (2, 2), (3, 3)] for padding in ["VALID", "SAME"] for dspec in [('NHWC', 'HWIO', 'NHWC'),] + for rhs_dilation in [None, (2, 2)] for rng_factory in [jtu.rand_small])) def testConvTranspose2DT(self, lhs_shape, rhs_shape, dtype, strides, - padding, dspec, rng_factory): + padding, dspec, rhs_dilation, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] @@ -550,11 +554,13 @@ def testConvTranspose2DT(self, lhs_shape, rhs_shape, dtype, strides, # lhs-grad of conv. def fun(lhs, rhs): return lax.conv_transpose(lhs, rhs, strides, padding, + rhs_dilation=rhs_dilation, dimension_numbers=dspec, transpose_kernel=True) def fun_via_grad(lhs, rhs): return self._conv_transpose_via_grad(lhs, rhs, strides, padding, + rhs_dilation=rhs_dilation, dimension_numbers=dspec) # NB: below just checks for agreement, we're not calling numpy. @@ -562,11 +568,12 @@ def fun_via_grad(lhs, rhs): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": - "_lhs_shape={}_rhs_shape={}_strides={}_padding={}".format( + "_lhs_shape={}_rhs_shape={}_strides={}_padding={}_rhs_dilation={}".format( jtu.format_shape_dtype_string(lhs_shape, dtype), - jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), + jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding, rhs_dilation), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng_factory": rng_factory, 'dspec': dspec} + "strides": strides, "padding": padding, "rhs_dilation": rhs_dilation, + "rng_factory": rng_factory, 'dspec': dspec} for lhs_shape, rhs_shape in [ ((b, 9, 10, i), (k, k, i, j)) for b, i, j, k in itertools.product([2,3],[2,3],[2,3],[3,4,5])] @@ -574,20 +581,23 @@ def fun_via_grad(lhs, rhs): for strides in [(1, 1), (1, 2), (2, 1), (2, 2), (3, 3)] for padding in ["VALID", "SAME"] for dspec in [('NHWC', 'HWIO', 'NHWC'),] + for rhs_dilation in [None, (2, 2)] for rng_factory in [jtu.rand_small])) def testConvTranspose2D(self, lhs_shape, rhs_shape, dtype, strides, - padding, dspec, rng_factory): + padding, dspec, rhs_dilation, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): return lax.conv_transpose(lhs, rhs, strides, padding, + rhs_dilation=rhs_dilation, dimension_numbers=dspec, transpose_kernel=False) def fun_via_grad(lhs, rhs): rhs_t = self._transpose_conv_kernel(lhs, rhs, dimension_numbers=dspec) return self._conv_transpose_via_grad(lhs, rhs_t, strides, padding, + rhs_dilation=rhs_dilation, dimension_numbers=dspec) # NB: below just checks for agreement, we're not calling numpy. @@ -595,11 +605,12 @@ def fun_via_grad(lhs, rhs): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": - "_lhs_shape={}_rhs_shape={}_strides={}_padding={}".format( + "_lhs_shape={}_rhs_shape={}_strides={}_padding={}_rhs_dilation={}".format( jtu.format_shape_dtype_string(lhs_shape, dtype), - jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding), + jtu.format_shape_dtype_string(rhs_shape, dtype), strides, padding, rhs_dilation), "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, - "strides": strides, "padding": padding, "rng_factory": rng_factory, 'dspec': dspec} + "strides": strides, "padding": padding, "rhs_dilation": rhs_dilation, + "rng_factory": rng_factory, 'dspec': dspec} for lhs_shape, rhs_shape in [ ((b, 10, i), (k, i, j)) for b, i, j, k in itertools.product([2,3],[2,3],[2,3],[3,4,5])] @@ -607,20 +618,23 @@ def fun_via_grad(lhs, rhs): for strides in [(1,), (2,), (3,)] for padding in ["VALID", "SAME"] for dspec in [('NHC', 'HIO', 'NHC'),] + for rhs_dilation in [None, (2,)] for rng_factory in [jtu.rand_small])) def testConvTranspose1D(self, lhs_shape, rhs_shape, dtype, strides, - padding, dspec, rng_factory): + padding, dspec, rhs_dilation, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): return lax.conv_transpose(lhs, rhs, strides, padding, dimension_numbers=dspec, + rhs_dilation=rhs_dilation, transpose_kernel=False) def fun_via_grad(lhs, rhs): rhs_t = self._transpose_conv_kernel(lhs, rhs, dimension_numbers=dspec) return self._conv_transpose_via_grad(lhs, rhs_t, strides, padding, + rhs_dilation=rhs_dilation, dimension_numbers=dspec) # NB: below just checks for agreement, we're not calling numpy. From 3f5a9a21e3bc149dfa5e9a8d9b5a6cf9c9e3b54f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Dec 2019 09:15:47 -0500 Subject: [PATCH 0523/1053] Update version of genrule binary to Python 3 in Bazel rules. (#1873) --- jax/tools/build_defs.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/tools/build_defs.bzl b/jax/tools/build_defs.bzl index 1abdf3b9a3ee..d59c6df4c5b1 100644 --- a/jax/tools/build_defs.bzl +++ b/jax/tools/build_defs.bzl @@ -139,7 +139,7 @@ EOF srcs = [ runner + ".py", ], - python_version = "PY2", + python_version = "PY3", deps = deps + [ "//third_party/py/jax/jaxlib", "//third_party/py/jax/tools:jax_to_hlo", From 96677d9c6f549b643fd0cdf5664da2f22f45fbaf Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Dec 2019 11:45:39 -0500 Subject: [PATCH 0524/1053] Use highest precision for einsum test. (#1876) Fixes test failures on TPU which uses lower precision by default. --- tests/lax_numpy_einsum_test.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/lax_numpy_einsum_test.py b/tests/lax_numpy_einsum_test.py index b1d4fcbc282c..42de963c6555 100644 --- a/tests/lax_numpy_einsum_test.py +++ b/tests/lax_numpy_einsum_test.py @@ -23,6 +23,7 @@ from absl.testing import absltest from absl.testing import parameterized +from jax import lax import jax.numpy as np import jax.test_util as jtu @@ -38,10 +39,8 @@ class EinsumTest(jtu.JaxTestCase): def _check(self, s, *ops): a = onp.einsum(s, *ops) - b = np.einsum(s, *ops) - - atol = 2e-1 if jtu.device_under_test() == "tpu" else 1e-4 - self.assertAllClose(a, b, atol=atol, rtol=1e-4, check_dtypes=True) + b = np.einsum(s, *ops, precision=lax.Precision.HIGHEST) + self.assertAllClose(a, b, atol=1e-4, rtol=1e-4, check_dtypes=True) def test_three_operands_1(self): r = rng() From d8d3a7bc87a1f9140f6d587389aceef313f354b2 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Dec 2019 17:20:51 -0500 Subject: [PATCH 0525/1053] Allow scalar numpy arrays as shapes in np.{zeros,ones,full}. (#1881) --- jax/numpy/lax_numpy.py | 5 +++-- jax/test_util.py | 2 ++ tests/lax_numpy_test.py | 19 ++++++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 80b5b81454a0..236e46365674 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1704,6 +1704,7 @@ def ones_like(x, dtype=None): @_wraps(onp.full) def full(shape, fill_value, dtype=None): lax._check_user_dtype_supported(dtype, "full") + shape = (shape,) if ndim(shape) == 0 else shape return lax.full(shape, fill_value, dtype) @@ -1719,7 +1720,7 @@ def zeros(shape, dtype=None): raise TypeError("expected sequence object with len >= 0 or a single integer") lax._check_user_dtype_supported(dtype, "zeros") dtype = float_ if dtype is None else dtype - shape = (shape,) if isscalar(shape) else shape + shape = (shape,) if ndim(shape) == 0 else shape return lax.full(shape, 0, dtype) @_wraps(onp.ones) @@ -1728,7 +1729,7 @@ def ones(shape, dtype=None): raise TypeError("expected sequence object with len >= 0 or a single integer") lax._check_user_dtype_supported(dtype, "ones") dtype = float_ if dtype is None else dtype - shape = (shape,) if isscalar(shape) else shape + shape = (shape,) if ndim(shape) == 0 else shape return lax.full(shape, 1, dtype) diff --git a/jax/test_util.py b/jax/test_util.py index 0137cd3c09a5..de014de8ea8a 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -344,6 +344,8 @@ def format_shape_dtype_string(shape, dtype): return '{}[{}]'.format(dtype_str(dtype), shapestr) elif type(shape) is int: return '{}[{},]'.format(dtype_str(dtype), shape) + elif isinstance(shape, onp.ndarray): + return '{}[{}]'.format(dtype_str(dtype), shape) else: raise TypeError(type(shape)) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 86a178cc82c3..d4d27b76b165 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1185,7 +1185,7 @@ def testHVDStack(self, shape, op, dtypes, rng_factory): onp.dtype(out_dtype).name if out_dtype else "None"), "shape": shape, "fill_value_dtype": fill_value_dtype, "out_dtype": out_dtype, "rng_factory": jtu.rand_default} - for shape in array_shapes + for shape in array_shapes + [3, onp.array(7, dtype=onp.int32)] for fill_value_dtype in default_dtypes for out_dtype in [None] + default_dtypes)) def testFull(self, shape, fill_value_dtype, out_dtype, rng_factory): @@ -1196,6 +1196,23 @@ def testFull(self, shape, fill_value_dtype, out_dtype, rng_factory): self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + @parameterized.named_parameters( + jtu.cases_from_list( + {"testcase_name": ("_op={}_shape={}_dtype={}").format(op, shape, dtype), + "onp_op": getattr(onp, op), "lnp_op": getattr(lnp, op), + "shape": shape, "dtype": dtype} + for op in ["zeros", "ones"] + for shape in [2, (), (2,), (3, 0), onp.array((4, 5, 6), dtype=onp.int32), + onp.array(4, dtype=onp.int32)] + for dtype in all_dtypes)) + def testZerosOnes(self, onp_op, lnp_op, shape, dtype): + rng = jtu.rand_default() + def args_maker(): return [] + onp_op = partial(onp_op, shape, dtype) + lnp_op = partial(lnp_op, shape, dtype) + self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_filldtype={}_outdtype={}".format( jtu.format_shape_dtype_string(shape, in_dtype), From b24ab59de25c4cc9d57a17367ee64226535e252f Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 17 Dec 2019 14:44:03 -0800 Subject: [PATCH 0526/1053] Run pmap_test.py with 8 CPU devices. (#1844) This lets us test many aspects of our parallel computing infrastructure without the need for multiple accelerators (it's still important to test actual multi-accelerator platforms to get full end-to-end coverage). Using the --xla_force_host_platform_device_count can also be used to quickly test out or prototype pmap code. --- tests/pmap_test.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 6bba86d88e41..727fe0c8c32d 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -17,6 +17,7 @@ from __future__ import print_function from functools import partial +import os from unittest import SkipTest import numpy as onp @@ -39,9 +40,30 @@ from jax.config import config config.parse_flags_with_absl() +prev_xla_flags = None + +# Run all tests with 8 CPU devices. +def setUpModule(): + global prev_xla_flags + prev_xla_flags = os.getenv("XLA_FLAGS") + flags_str = prev_xla_flags or "" + # Don't override user-specified device count, or other XLA flags. + if "xla_force_host_platform_device_count" not in flags_str: + os.environ["XLA_FLAGS"] = (flags_str + + " --xla_force_host_platform_device_count=8") + # Clear any cached backends so new CPU backend will pick up the env var. + xla_bridge.get_backend.cache_clear() + +# Reset to previous configuration in case other test modules will be run. +def tearDownModule(): + if prev_xla_flags is None: + del os.environ["XLA_FLAGS"] + else: + os.environ["XLA_FLAGS"] = prev_xla_flags + xla_bridge.get_backend.cache_clear() -class PmapTest(jtu.JaxTestCase): +class PmapTest(jtu.JaxTestCase): def _getMeshShape(self, device_mesh_shape): device_count = xla_bridge.device_count() if any(size == -1 for size in device_mesh_shape): @@ -223,7 +245,7 @@ def g(z): ans = grad(lambda x: np.sum(test_fun(x)))(x) expected = grad(lambda x: np.sum(baseline_fun(x)))(x) - self.assertAllClose(ans, expected, check_dtypes=True) + self.assertAllClose(ans, expected, check_dtypes=True, atol=1e-3) def testShardedDeviceArrays(self): f = lambda x: 2 * x @@ -554,6 +576,9 @@ def testVmapOfPmapTuple(self): @jtu.skip_on_devices("gpu") def testPswapaxes(self): device_count = xla_bridge.device_count() + # TODO: AllToAll not yet implemented on XLA:CPU + if jtu.device_under_test() == "cpu": + device_count = 1 shape = (device_count, 3, device_count, 5) x = onp.arange(prod(shape)).reshape(shape) @@ -783,8 +808,8 @@ def testOneDevice(self): r0 = f0(x) r1 = f1(x) expected = onp.expand_dims(onp.dot(x.squeeze(), x.squeeze().T), 0) - self.assertAllClose(r0, expected, check_dtypes=True) - self.assertAllClose(r1, expected, check_dtypes=True) + self.assertAllClose(r0, expected, check_dtypes=True, atol=1e-13, rtol=1e-14) + self.assertAllClose(r1, expected, check_dtypes=True, atol=1e-12, rtol=1e-14) def testNoDevicesError(self): f = pmap(lambda x: x - lax.psum(x, 'i'), axis_name='i', devices=[]) From 594edf417f1a811b1772011204ce79375dd41b5e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Dec 2019 18:02:22 -0500 Subject: [PATCH 0527/1053] Fix bug in handling for degenerate indexing. (#1882) --- jax/numpy/lax_numpy.py | 10 +++++++--- tests/lax_numpy_indexing_test.py | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 236e46365674..5bf75844cf81 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2657,9 +2657,13 @@ def _gather(arr, treedef, static_idx, dynamic_idx): indexer = _index_to_gather(shape(arr), idx) # shared with _scatter_update y = arr - # We avoid generating a gather when indexer.gather_indices.size is empty - # unless indexer.slice_shape also corresponds to an empty array. - if indexer.gather_indices.size or not _prod(indexer.slice_shape): + # Avoid calling gather if the slice shape is empty, both as a fast path and to + # handle cases like zeros(0)[array([], int32)]. + if _prod(indexer.slice_shape) == 0: + return zeros(indexer.slice_shape, dtype=y.dtype) + + # We avoid generating a gather when indexer.gather_indices.size is empty. + if indexer.gather_indices.size: y = lax.gather(y, indexer.gather_indices, indexer.dnums, indexer.gather_slice_shape) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index e0579abcf84a..bf4580852cde 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -223,6 +223,7 @@ def check_grads(f, args, order, atol=None, rtol=None, eps=None): IndexSpec(shape=(3, 4, 5), indexer=onp.array([0, 2, 0, 1])), IndexSpec(shape=(3,), indexer=onp.array([-1, 1])), IndexSpec(shape=(3,), indexer=onp.array([-2, -1])), + IndexSpec(shape=(0,), indexer=onp.array([], dtype=onp.int32)), ]), ("One2DIntArrayIndex", [IndexSpec(shape=(3,), indexer=onp.array([[0, 0]])), @@ -274,6 +275,7 @@ def check_grads(f, args, order, atol=None, rtol=None, eps=None): IndexSpec(shape=(3, 4, 5), indexer=onp.array([0, 2, 1])), IndexSpec(shape=(3,), indexer=onp.array([-1, 1])), IndexSpec(shape=(3,), indexer=onp.array([-2, -1])), + IndexSpec(shape=(0,), indexer=onp.array([], dtype=onp.int32)), ]), ("One2DIntArrayIndex", [IndexSpec(shape=(3,), indexer=onp.array([[0, 1]])), From 7175c1dfe1617ccdf26f408eb01cc0d9fa9dc298 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 17 Dec 2019 13:14:10 -0800 Subject: [PATCH 0528/1053] fix transpose bug in multivariate normal, add test fixes #1869 --- jax/random.py | 2 +- tests/random_test.py | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index 92806f1c7308..84b1562ac5ad 100644 --- a/jax/random.py +++ b/jax/random.py @@ -39,8 +39,8 @@ from jax.lib import cuda_prng from jax import core from jax import abstract_arrays +from jax.numpy.linalg import cholesky from jax.scipy.special import logit -from jax.scipy.linalg import cholesky from jax.interpreters import batching from jax.interpreters import xla diff --git a/tests/random_test.py b/tests/random_test.py index f025626e5a32..2715ffdc0fa6 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -409,6 +409,30 @@ def testMultivariateNormal(self, dim, dtype): # eigenvectors follow a standard normal distribution. self._CheckKolmogorovSmirnovCDF(whitened.ravel(), scipy.stats.norm().cdf) + def testMultivariateNormalCovariance(self): + # test code based on https://github.com/google/jax/issues/1869 + N = 100000 + cov = np.array([[ 0.19, 0.00, -0.13, 0.00], + [ 0.00, 0.29, 0.00, -0.23], + [ -0.13, 0.00, 0.39, 0.00], + [ 0.00, -0.23, 0.00, 0.49]]) + mean = np.zeros(4) + + out_onp = onp.random.RandomState(0).multivariate_normal(mean, cov, N) + + key = random.PRNGKey(0) + out_jnp = random.multivariate_normal(key, mean=mean, cov=cov, shape=(N,)) + + var_onp = out_onp.var(axis=0) + var_jnp = out_jnp.var(axis=0) + self.assertAllClose(var_onp, var_jnp, rtol=1e-2, atol=1e-2, + check_dtypes=False) + + var_onp = onp.cov(out_onp, rowvar=False) + var_jnp = onp.cov(out_jnp, rowvar=False) + self.assertAllClose(var_onp, var_jnp, rtol=1e-2, atol=1e-2, + check_dtypes=False) + def testIssue222(self): x = random.randint(random.PRNGKey(10003), (), 0, 0) assert x == 0 From b459b6098a99fccedb715259750b8278bf34b04b Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 17 Dec 2019 16:22:55 -0800 Subject: [PATCH 0529/1053] Make pmap properly replicate closed-over constants. (#1847) With this change, a value `x` can be replicated `nrep` times as follows: ```python pmap(lambda _: x)(np.arange(nrep)) ``` This will broadcast `x` into a ShardedDeviceArray suitable for passing into another pmap with the same input shape. If `x` will be passed into a pmap with `devices` or a nested pmap, the replication pmap(s) should follow that structure. For example: ```python x = pmap(pmap(lambda _: x))(np.ones(2, 4)) pmap(pmap(lambda i: i**2 + x))(np.ones(2, 4)) ``` --- .travis.yml | 2 +- jax/interpreters/pxla.py | 80 +++++++++++++++++++++++++++++----- jax/lib/__init__.py | 2 +- tests/pmap_test.py | 93 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 165 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 63816bb3f722..dcf1cd21ade9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,7 @@ install: # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. - - pip install jaxlib==0.1.36 + - pip install jaxlib==0.1.37 - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - if [[ "$JAX_ONLY_DOCUMENTATION" != "" ]]; then diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 81be8bc7c96b..3a87280146f9 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -443,6 +443,12 @@ def parallel_callable(fun, backend, axis_name, axis_size, devices, *avals): "Compiling {} for {} devices with args {}.".format( fun.__name__, global_axis_size, avals)) + if devices: + local_devices = [d for d in devices if d.host_id == xb.host_id()] + assert len(local_devices) > 0 + else: + local_devices = None + @lu.wrap_init def dynamic_fun(dummy, *args): with extend_dynamic_axis_env(axis_name, dummy.trace, global_axis_size): @@ -476,7 +482,9 @@ def dynamic_fun(dummy, *args): # XLA computation at all; we handle this as a special case so we can stage # out multi-replica XLA computations regardless of the hardware available. # The 'None' values here are just dummies we know will be ignored. - handlers = [_pval_to_result_handler(axis_size, None, pval) for pval in out_pvals] + handlers = [_pval_to_result_handler(axis_size, None, pval, local_devices, + backend) + for pval in out_pvals] results = [handler(None) for handler in handlers] return lambda *_: results @@ -500,9 +508,6 @@ def dynamic_fun(dummy, *args): raise ValueError(msg.format(num_global_replicas, xb.device_count(backend))) device_assignment = None else: - assert any(d.host_id == xb.host_id() for d in devices) - local_devices = [d for d in devices if d.host_id == xb.host_id()] - assert len(local_devices) > 0 if num_local_replicas != len(local_devices): local_devices_str = ", ".join(map(str, local_devices)) raise ValueError( @@ -522,7 +527,9 @@ def dynamic_fun(dummy, *args): handle_args = partial(shard_args, backend, compiled.local_devices(), assign_shards_to_replicas(num_local_replicas, axis_size), axis_size, tuple_args) - handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, out_pvals) + handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, + out_pvals, compiled.local_devices(), + backend) return partial(execute_replicated, compiled, backend, num_local_replicas, handle_args, handle_outs) multi_host_supported_collectives = set() @@ -530,9 +537,10 @@ def dynamic_fun(dummy, *args): class ResultToPopulate(object): pass result_to_populate = ResultToPopulate() -def _pvals_to_results_handler(size, nrep, out_pvals): +def _pvals_to_results_handler(size, nrep, out_pvals, devices, backend): nouts = len(out_pvals) - handlers = [_pval_to_result_handler(size, nrep, pval) for pval in out_pvals] + handlers = [_pval_to_result_handler(size, nrep, pval, devices, backend) + for pval in out_pvals] def handler(out_bufs): buffers = [[result_to_populate] * nrep for _ in range(nouts)] for r, tuple_buf in enumerate(out_bufs): @@ -543,13 +551,65 @@ def handler(out_bufs): return [h(bufs) for h, bufs in zip(handlers, buffers)] return handler -def _pval_to_result_handler(size, nrep, pval): +def replicate(val, axis_size, nrep, devices=None, backend=None): + """Replicates ``val`` across multiple devices. + + Args: + val: the value to be replicated. + axis_size: the length of the output, i.e. the logical number of replicas to + create. Usually equal to `nrep`, but in the case of nested pmaps, `nrep` may + be a multiple of `axis_size`. + nrep: the number of replicas to create. If ``devices`` is set, must be equal + to ``len(devices)``. + devices: the devices to replicate across. If None, ``nrep`` will be used to + generate a default device assignment. + backend: string specifying which backend to use. + + Returns: + A ShardedDeviceArray of length `axis_size` where each shard is equal to + ``val``. + """ + device_count = (len(devices) if devices else xb.local_device_count()) + if nrep > device_count: + msg = ("Cannot replicate across %d replicas because only %d local devices " + "are available." % (nrep, device_count)) + if devices: + msg += (" (local devices = %s)" + % ", ".join(map(str, devices)) if devices else str(None)) + raise ValueError(msg) + + if devices is None: + assert nrep is not None + devices = xb.get_backend(backend).get_default_device_assignment(nrep) + assert nrep == len(devices) + + aval = xla.abstractify(val) + aval = ShapedArray((axis_size,) + aval.shape, aval.dtype) + device_buffers = [xla.device_put(val, d) for d in devices] + return ShardedDeviceArray(aval, device_buffers) + +def _pval_to_result_handler(axis_size, nrep, pval, devices, backend): + if devices: + assert all(d.host_id == xb.host_id(backend) for d in devices) pv, const = pval if pv is None: - bcast_const = core.unit if const is core.unit else broadcast(const, size, 0) + if nrep is None: + nrep = axis_size + # If 'const' is a ShardedDeviceArray, it must have come from a pmap nested + # inside the one we're currently evaluating, and we should replicate + # 'const' across the total number of devices needed. We don't necessarily + # know the nested pmap's axis_size (e.g. the jaxpr for + # pmap(pmap(lambda x: 3)) is trivial, with no pmaps), but we can use the + # axis size of the output 'const'. + # TODO: we might be doing unnecessary device transfers in the inner pmap. + if isinstance(const, ShardedDeviceArray): + nrep *= len(const) + + bcast_const = (core.unit if const is core.unit + else replicate(const, axis_size, nrep, devices, backend)) return lambda _: bcast_const else: - return aval_to_result_handler(size, nrep, pv) + return aval_to_result_handler(axis_size, nrep, pv) def execute_replicated(compiled, backend, nrep, in_handler, out_handler, *args): if nrep > xb.device_count(backend): diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index f02c7e3690b1..55f97888aa55 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 36) +_minimum_jaxlib_version = (0, 1, 37) try: from jaxlib import version as jaxlib_version except: diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 727fe0c8c32d..ed94c198c145 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -18,6 +18,7 @@ from functools import partial import os +from random import shuffle from unittest import SkipTest import numpy as onp @@ -479,6 +480,98 @@ def testPmapConstant(self): expected = onp.repeat(3, device_count) self.assertAllClose(ans, expected, check_dtypes=False) + f = pmap(lambda x: (x, 3)) + _, ans = f(x) + self.assertAllClose(ans, expected, check_dtypes=False) + + def testPmapConstantDevices(self): + if xla_bridge.device_count() == 1: + raise SkipTest("this test requires multiple devices") + + devices = xla_bridge.devices()[:-1] + shuffle(devices) + f = pmap(lambda x: 3, devices=devices) + x = np.arange(len(devices)) + ans = f(x) + expected = onp.repeat(3, len(devices)) + self.assertAllClose(ans, expected, check_dtypes=False) + + # Test that 'ans' was properly replicated across devices. + self.assertEqual([b.device() for b in ans.device_buffers], devices) + + def testPmapConstantError(self): + device_count = xla_bridge.device_count() + f = pmap(lambda x: 3) + x = np.arange(device_count + 1) + self.assertRaisesRegex( + ValueError, r"Cannot replicate across \d+ replicas because only \d+ " + r"local devices are available.", lambda: f(x)) + + f = pmap(lambda x: 3, devices=[xla_bridge.devices()[0]]) + x = np.arange(2) + self.assertRaisesRegex( + ValueError, "Cannot replicate across 2 replicas because only 1 " + "local devices are available.", lambda: f(x)) + + def testNestedPmapConstant(self): + if xla_bridge.device_count() == 1: + raise SkipTest("this test requires multiple devices") + + f = pmap(pmap(lambda x: 3)) + shape = (2, xla_bridge.device_count() // 2, 3) + x = np.arange(prod(shape)).reshape(shape) + ans = f(x) + expected = 3 * onp.ones(shape[:2]) + self.assertAllClose(ans, expected, check_dtypes=False) + + # Test that 'ans' was properly replicated across devices. + expected_sharded = pmap(pmap(lambda x: x))(expected) + self.assertEqual([b.device() for b in ans.device_buffers], + [b.device() for b in expected_sharded.device_buffers]) + + f = pmap(pmap(lambda x: (x, 3))) + x_sharded, ans = f(x) + self.assertAllClose(ans, expected, check_dtypes=False) + self.assertEqual([b.device() for b in ans.device_buffers], + [b.device() for b in x_sharded.device_buffers]) + + + def testNestedPmapConstantDevices(self): + raise SkipTest("Nested pmaps with devices not yet implemented") + + if xla_bridge.device_count() < 6: + raise SkipTest("this test requires >= 6 devices") + + devices = xla_bridge.devices()[:-2] + shuffle(devices) + f = pmap(pmap(lambda x: 3), devices=devices) + shape = (2, len(devices) // 2, 3) + x = np.arange(prod(shape)).reshape(shape) + ans = f(x) + expected = 3 * onp.ones(shape[:2]) + self.assertAllClose(ans, expected, check_dtypes=False) + + # Test that 'ans' was properly replicated across devices. + expected_sharded = pmap(pmap(lambda x: x), devices=devices)(expected) + self.assertEqual([b.device() for b in ans.device_buffers], + [b.device() for b in expected_sharded.device_buffers]) + + def testNestedPmapConstantError(self): + f = pmap(pmap(lambda x: 3)) + shape = (2, xla_bridge.device_count() // 2 + 1, 3) + x = np.arange(prod(shape)).reshape(shape) + self.assertRaisesRegex( + ValueError, r"Cannot replicate across \d+ replicas because only \d+ " + r"local devices are available.", lambda: f(x)) + + if xla_bridge.device_count() > 1: + f = pmap(pmap(lambda x: 3), devices=xla_bridge.devices()[:-1]) + shape = (2, xla_bridge.device_count() // 2, 3) + x = np.arange(prod(shape)).reshape(shape) + self.assertRaisesRegex( + ValueError, r"Cannot replicate across \d+ replicas because only \d+ " + r"local devices are available.", lambda: f(x)) + def testCollectiveConstant(self): device_count = xla_bridge.device_count() f = pmap(lambda x: lax.psum(1, 'i'), 'i') From 9a0ed06647731abf8178df2c0cf1a040ef763b92 Mon Sep 17 00:00:00 2001 From: Lechao Xiao Date: Tue, 17 Dec 2019 19:38:32 -0500 Subject: [PATCH 0530/1053] Add Delta orthogonal initialization (#1838) --- jax/nn/initializers.py | 31 ++++++++++++++++++++++++++++++- tests/nn_test.py | 3 ++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/jax/nn/initializers.py b/jax/nn/initializers.py index 4d1bb5b90818..a577385b2b10 100644 --- a/jax/nn/initializers.py +++ b/jax/nn/initializers.py @@ -24,9 +24,10 @@ import numpy as onp +import jax.numpy as np from jax import lax +from jax import ops from jax import random -import jax.numpy as np def zeros(key, shape, dtype=np.float32): return np.zeros(shape, dtype) def ones(key, shape, dtype=np.float32): return np.ones(shape, dtype) @@ -96,3 +97,31 @@ def init(key, shape, dtype=np.float32): Q = np.moveaxis(Q, -1, column_axis) return scale * Q return init + + +def delta_orthogonal(scale=1.0, column_axis=-1): + """ + Construct an initializer for delta orthogonal kernels; see arXiv:1806.05393. + + The shape must be 3D, 4D or 5D. + """ + def init(key, shape, dtype=np.float32): + if len(shape) not in [3, 4, 5]: + raise ValueError("Delta orthogonal initializer requires a 3D, 4D or 5D " + "shape.") + if shape[-1] < shape[-2]: + raise ValueError("`fan_in` must be less or equal than `fan_out`. ") + ortho_init = orthogonal(scale=scale, column_axis=column_axis) + ortho_matrix = ortho_init(key, shape[-2:]) + W = np.zeros(shape) + if len(shape) == 3: + k = shape[0] + return ops.index_update(W, ops.index[(k-1)//2, ...], ortho_matrix) + elif len(shape) == 4: + k1, k2 = shape[:2] + return ops.index_update(W, ops.index[(k1-1)//2, (k2-1)//2, ...], ortho_matrix) + else: + k1, k2, k3 = shape[:3] + return ops.index_update(W, ops.index[(k1-1)//2, (k2-1)//2, (k3-1)//2, ...], + ortho_matrix) + return init diff --git a/tests/nn_test.py b/tests/nn_test.py index 59b1906e88e0..ad609a0dfb28 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -71,7 +71,8 @@ def initializer_record(name, initializer, min_dims=2, max_dims=4): initializer_record("glorot_uniform", nn.initializers.glorot_uniform()), initializer_record("lecun_normal", nn.initializers.lecun_normal()), initializer_record("lecun_uniform", nn.initializers.lecun_uniform()), - initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2) + initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2), + initializer_record("orthogonal", nn.initializers.delta_orthogonal(), 4, 4) ] class NNInitializersTest(jtu.JaxTestCase): From e3d5edd223e97d7ccb4942a339b02a81198e1800 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Dec 2019 21:22:32 -0500 Subject: [PATCH 0531/1053] Relax test tolerances in pmap_test. (#1886) --- tests/pmap_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index ed94c198c145..5aede6dff14b 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -901,8 +901,8 @@ def testOneDevice(self): r0 = f0(x) r1 = f1(x) expected = onp.expand_dims(onp.dot(x.squeeze(), x.squeeze().T), 0) - self.assertAllClose(r0, expected, check_dtypes=True, atol=1e-13, rtol=1e-14) - self.assertAllClose(r1, expected, check_dtypes=True, atol=1e-12, rtol=1e-14) + self.assertAllClose(r0, expected, check_dtypes=True, atol=1e-6, rtol=1e-3) + self.assertAllClose(r1, expected, check_dtypes=True, atol=1e-6, rtol=1e-3) def testNoDevicesError(self): f = pmap(lambda x: x - lax.psum(x, 'i'), axis_name='i', devices=[]) From d692965f881e9519f298ece9384cea90eccc2348 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Dec 2019 21:42:37 -0500 Subject: [PATCH 0532/1053] Implement missing case in scatter batching rule. (#1885) Add systematic batching tests for gather and scatter-add. --- jax/lax/lax.py | 42 +++++++++---------- tests/lax_test.py | 102 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 98 insertions(+), 46 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 4a5e128b22fc..05be695164d6 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3170,12 +3170,9 @@ def _scatter_batching_rule( operand = batching.bdim_at_front(operand, operand_bdim, size) operand_bdim = 0 - if scatter_indices_bdim is not None and updates_bdim is None: - updates = broadcast(updates, (size,)) - updates_bdim = 0 + updates = batching.bdim_at_front(updates, updates_bdim, size) - if scatter_indices_bdim is None and updates_bdim is not None: - updates = batching.moveaxis(updates, updates_bdim, 0) + if scatter_indices_bdim is None: inserted_window_dims = tuple(onp.add(1, dimension_numbers.inserted_window_dims)) update_window_dims = (0,) + tuple(onp.add(1, dimension_numbers.update_window_dims)) scatter_dims_to_operand_dims = tuple(onp.add(1, dimension_numbers.scatter_dims_to_operand_dims)) @@ -3184,26 +3181,27 @@ def _scatter_batching_rule( inserted_window_dims=inserted_window_dims, scatter_dims_to_operand_dims=scatter_dims_to_operand_dims) return scatter_op(operand, scatter_indices, updates, dnums), 0 - else: - # see the third case in _gather_batching_rule for comparison and comments - scatter_indices = batching.moveaxis(scatter_indices, scatter_indices_bdim, 0) - updates = batching.moveaxis(updates, updates_bdim, 0) - count_shape = list(scatter_indices.shape) - count_shape[-1] = 1 - counts = broadcasted_iota(scatter_indices.dtype, tuple(count_shape), 0) - scatter_indices = concatenate([counts, scatter_indices], - len(count_shape) - 1) - update_window_dims = tuple(onp.add(1, dimension_numbers.update_window_dims)) - inserted_window_dims = (0,) + tuple(onp.add(1, dimension_numbers.inserted_window_dims)) - scatter_dims_to_operand_dims = (0,) + tuple(onp.add(1, dimension_numbers.scatter_dims_to_operand_dims)) + # see the third case in _gather_batching_rule for comparison and comments + scatter_indices = batching.bdim_at_front( + scatter_indices, scatter_indices_bdim, size) - dnums = ScatterDimensionNumbers( - update_window_dims=update_window_dims, - inserted_window_dims=inserted_window_dims, - scatter_dims_to_operand_dims=scatter_dims_to_operand_dims) - return scatter_op(operand, scatter_indices, updates, dnums), 0 + count_shape = list(scatter_indices.shape) + count_shape[-1] = 1 + counts = broadcasted_iota(scatter_indices.dtype, tuple(count_shape), 0) + scatter_indices = concatenate([counts, scatter_indices], + len(count_shape) - 1) + + update_window_dims = tuple(onp.add(1, dimension_numbers.update_window_dims)) + inserted_window_dims = (0,) + tuple(onp.add(1, dimension_numbers.inserted_window_dims)) + scatter_dims_to_operand_dims = (0,) + tuple(onp.add(1, dimension_numbers.scatter_dims_to_operand_dims)) + + dnums = ScatterDimensionNumbers( + update_window_dims=update_window_dims, + inserted_window_dims=inserted_window_dims, + scatter_dims_to_operand_dims=scatter_dims_to_operand_dims) + return scatter_op(operand, scatter_indices, updates, dnums), 0 scatter_add_p = standard_reduction_primitive( _scatter_shape_rule, _scatter_dtype_rule, 'scatter-add', diff --git a/tests/lax_test.py b/tests/lax_test.py index 36341fbb35e7..47cb7ee972d2 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -39,6 +39,7 @@ from jax.test_util import check_grads from jax.interpreters import xla from jax.lib import xla_client +import jax.util from jax.config import config config.parse_flags_with_absl() @@ -2516,10 +2517,11 @@ def args_slicer(args, bdims): class LaxVmapTest(jtu.JaxTestCase): - def _CheckBatching(self, op, bdim_size, bdims, shapes, dtype, rng, + def _CheckBatching(self, op, bdim_size, bdims, shapes, dtypes, rng, rtol=None, atol=None): - batched_shapes = map(partial(add_bdim, bdim_size), bdims, shapes) - args = [rng(shape, dtype) for shape in batched_shapes] + batched_shapes = list(map(partial(add_bdim, bdim_size), bdims, shapes)) + args = [rng(shape, dtype) + for shape, dtype in jax.util.safe_zip(batched_shapes, dtypes)] args_slice = args_slicer(args, bdims) ans = api.vmap(op, bdims)(*args) expected = onp.stack([op(*args_slice(i)) for i in range(bdim_size)]) @@ -2540,7 +2542,7 @@ def _CheckBatching(self, op, bdim_size, bdims, shapes, dtype, rng, def testOp(self, op_name, rng_factory, shapes, dtype, bdims): rng = rng_factory() op = getattr(lax, op_name) - self._CheckBatching(op, 10, bdims, shapes, dtype, rng) + self._CheckBatching(op, 10, bdims, shapes, [dtype] * len(shapes), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2600,7 +2602,7 @@ def testConvGeneralDilatedBatching( feature_group_count=feature_group_count, precision=lax.Precision.HIGHEST) self._CheckBatching(conv, 5, (lhs_bdim, rhs_bdim), (lhs_shape, rhs_shape), - dtype, rng, rtol=tol, atol=tol) + (dtype, dtype), rng, rtol=tol, atol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_from_dtype={}_to_dtype={}_bdims={}".format( @@ -2615,7 +2617,7 @@ def testConvGeneralDilatedBatching( def testConvertElementType(self, shape, from_dtype, to_dtype, bdims, rng_factory): rng = rng_factory() op = lambda x: lax.convert_element_type(x, to_dtype) - self._CheckBatching(op, 10, bdims, (shape,), from_dtype, rng) + self._CheckBatching(op, 10, bdims, (shape,), (from_dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_from_dtype={}_to_dtype={}_bdims={}".format( @@ -2630,7 +2632,7 @@ def testConvertElementType(self, shape, from_dtype, to_dtype, bdims, rng_factory def testBitcastElementType(self, shape, from_dtype, to_dtype, bdims, rng_factory): rng = rng_factory() op = lambda x: lax.bitcast_convert_type(x, to_dtype) - self._CheckBatching(op, 10, bdims, (shape,), from_dtype, rng) + self._CheckBatching(op, 10, bdims, (shape,), (from_dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_min_shape={}_operand_shape={}_max_shape={}_bdims={}" @@ -2653,7 +2655,7 @@ def testClamp(self, min_shape, operand_shape, max_shape, dtype, bdims, rng_facto rng = rng_factory() raise SkipTest("batching rule for clamp not implemented") # TODO(mattj) shapes = [min_shape, operand_shape, max_shape] - self._CheckBatching(lax.clamp, 10, bdims, shapes, dtype, rng) + self._CheckBatching(lax.clamp, 10, bdims, shapes, [dtype] * 3, rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_lhs_shape={}_rhs_shape={}_bdims={}".format( @@ -2669,8 +2671,8 @@ def testClamp(self, min_shape, operand_shape, max_shape, dtype, bdims, rng_facto def testDot(self, lhs_shape, rhs_shape, dtype, bdims, rng_factory): rng = rng_factory() op = partial(lax.dot, precision=lax.Precision.HIGHEST) - self._CheckBatching(op, 5, bdims, (lhs_shape, rhs_shape), dtype, rng, - rtol={onp.float16: 5e-2}) + self._CheckBatching(op, 5, bdims, (lhs_shape, rhs_shape), (dtype, dtype), + rng, rtol={onp.float16: 5e-2}) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2697,7 +2699,8 @@ def testDotGeneralContractOnly(self, lhs_shape, rhs_shape, dtype, rng = rng_factory() dimension_numbers = ((lhs_contracting, rhs_contracting), ([], [])) dot = partial(lax.dot_general, dimension_numbers=dimension_numbers) - self._CheckBatching(dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng) + self._CheckBatching(dot, 5, bdims, (lhs_shape, rhs_shape), (dtype, dtype), + rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2718,7 +2721,8 @@ def testDotGeneralContractAndBatch(self, lhs_shape, rhs_shape, dtype, dimension_numbers, bdims, rng_factory): rng = rng_factory() dot = partial(lax.dot_general, dimension_numbers=dimension_numbers) - self._CheckBatching(dot, 5, bdims, (lhs_shape, rhs_shape), dtype, rng) + self._CheckBatching(dot, 5, bdims, (lhs_shape, rhs_shape), (dtype, dtype), + rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_dtype={}_broadcast_sizes={}_bdims={}".format( @@ -2733,7 +2737,7 @@ def testDotGeneralContractAndBatch(self, lhs_shape, rhs_shape, dtype, def testBroadcast(self, shape, dtype, broadcast_sizes, bdims, rng_factory): rng = rng_factory() op = lambda x: lax.broadcast(x, broadcast_sizes) - self._CheckBatching(op, 5, bdims, (shape,), dtype, rng) + self._CheckBatching(op, 5, bdims, (shape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_bcdims={}_bdims={}".format( @@ -2755,7 +2759,7 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, bdims, rng_fa rng = rng_factory() raise SkipTest("this test has failures in some cases") # TODO(mattjj) op = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) - self._CheckBatching(op, 5, bdims, (inshape,), dtype, rng) + self._CheckBatching(op, 5, bdims, (inshape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_dims={}_bdims={}".format( @@ -2778,7 +2782,7 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, bdims, rng_fa def testReshape(self, arg_shape, out_shape, dtype, dimensions, bdims, rng_factory): rng = rng_factory() op = lambda x: lax.reshape(x, out_shape, dimensions=dimensions) - self._CheckBatching(op, 10, bdims, (arg_shape,), dtype, rng) + self._CheckBatching(op, 10, bdims, (arg_shape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_pads={}_bdims={}" @@ -2792,7 +2796,7 @@ def testReshape(self, arg_shape, out_shape, dtype, dimensions, bdims, rng_factor def testPad(self, shape, dtype, pads, bdims, rng_factory): rng = rng_factory() fun = lambda operand: lax.pad(operand, onp.array(0, dtype), pads) - self._CheckBatching(fun, 5, bdims, (shape,), dtype, rng) + self._CheckBatching(fun, 5, bdims, (shape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_predshape={}_argshapes={}_bdims={}".format( @@ -2810,7 +2814,7 @@ def testSelect(self, pred_shape, arg_shape, arg_dtype, bdims, rng_factory): rng = rng_factory() op = lambda c, x, y: lax.select(c < 0, x, y) self._CheckBatching(op, 5, bdims, (pred_shape, arg_shape, arg_shape,), - arg_dtype, rng) + (onp.bool_, arg_dtype, arg_dtype), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2836,7 +2840,7 @@ def testSelect(self, pred_shape, arg_shape, arg_dtype, bdims, rng_factory): def testSlice(self, shape, dtype, starts, limits, strides, bdims, rng_factory): rng = rng_factory() op = lambda x: lax.slice(x, starts, limits, strides) - self._CheckBatching(op, 5, bdims, (shape,), dtype, rng) + self._CheckBatching(op, 5, bdims, (shape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_perm={}_bdims={}".format( @@ -2854,7 +2858,7 @@ def testSlice(self, shape, dtype, starts, limits, strides, bdims, rng_factory): def testTranspose(self, shape, dtype, perm, bdims, rng_factory): rng = rng_factory() op = lambda x: lax.transpose(x, perm) - self._CheckBatching(op, 5, bdims, (shape,), dtype, rng) + self._CheckBatching(op, 5, bdims, (shape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_inshape={}_reducedims={}_initval={}_bdims={}" @@ -2888,7 +2892,7 @@ def testReduce(self, op, init_val, shape, dtype, dims, bdims, rng_factory): rng = rng_factory() init_val = onp.asarray(init_val, dtype=dtype) fun = lambda operand: lax.reduce(operand, init_val, op, dims) - self._CheckBatching(fun, 5, bdims, (shape,), dtype, rng) + self._CheckBatching(fun, 5, bdims, (shape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_dtype={}_padding={}" @@ -2921,7 +2925,7 @@ def fun(operand): for shape, dims, strides in all_configs: for bdims in all_bdims(shape): - self._CheckBatching(fun, 3, bdims, (shape,), dtype, rng) + self._CheckBatching(fun, 3, bdims, (shape,), (dtype,), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_dtype={}_padding={}".format(onp.dtype(dtype).name, @@ -2949,7 +2953,7 @@ def fun(operand, tangents): for shape, dims, strides in all_configs: for bdims in all_bdims(shape, shape): - self._CheckBatching(fun, 3, bdims, (shape, shape), dtype, rng) + self._CheckBatching(fun, 3, bdims, (shape, shape), (dtype, dtype), rng) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_bdims={}_fft_ndims={}" @@ -2966,7 +2970,58 @@ def testFft(self, fft_ndims, shape, bdims, rng_factory): axes = range(ndims - fft_ndims, ndims) fft_lengths = [shape[axis] for axis in axes] op = lambda x: lax.fft(x, xla_client.FftType.FFT, fft_lengths) - self._CheckBatching(op, 5, bdims, [shape], onp.complex64, rng) + self._CheckBatching(op, 5, bdims, [shape], [onp.complex64], rng) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}_idxs={}_dnums={}_slice_sizes={}_bdims={}" + .format(jtu.format_shape_dtype_string(shape, dtype), idxs, dnums, + slice_sizes, bdims), + "shape": shape, "dtype": dtype, "idxs": idxs, "dnums": dnums, + "slice_sizes": slice_sizes, "bdims": bdims} + for dtype in all_dtypes + for shape, idxs, dnums, slice_sizes in [ + ((5,), onp.array([[0], [2]]), lax.GatherDimensionNumbers( + offset_dims=(), collapsed_slice_dims=(0,), start_index_map=(0,)), + (1,)), + ((10,), onp.array([[0], [0], [0]]), lax.GatherDimensionNumbers( + offset_dims=(1,), collapsed_slice_dims=(), start_index_map=(0,)), + (2,)), + ((10, 5,), onp.array([[0], [2], [1]]), lax.GatherDimensionNumbers( + offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0,)), + (1, 3)), + ((10, 5), onp.array([[0, 2], [1, 0]]), lax.GatherDimensionNumbers( + offset_dims=(1,), collapsed_slice_dims=(0,), start_index_map=(0, 1)), + (1, 3)), + ] + for bdims in all_bdims(shape, idxs.shape))) + def testGather(self, shape, dtype, idxs, dnums, slice_sizes, bdims): + fun = partial(lax.gather, dimension_numbers=dnums, slice_sizes=slice_sizes) + self._CheckBatching(fun, 5, bdims, [shape, idxs.shape], [dtype, idxs.dtype], + jtu.rand_default()) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}_idxs={}_update={}_dnums={}_bdims={}".format( + jtu.format_shape_dtype_string(arg_shape, dtype), + idxs, update_shape, dnums, bdims), + "arg_shape": arg_shape, "dtype": dtype, "idxs": idxs, + "update_shape": update_shape, "dnums": dnums, "bdims": bdims} + for dtype in float_dtypes + for arg_shape, idxs, update_shape, dnums in [ + ((5,), onp.array([[0], [2]]), (2,), lax.ScatterDimensionNumbers( + update_window_dims=(), inserted_window_dims=(0,), + scatter_dims_to_operand_dims=(0,))), + ((10,), onp.array([[0], [0], [0]]), (3, 2), lax.ScatterDimensionNumbers( + update_window_dims=(1,), inserted_window_dims=(), + scatter_dims_to_operand_dims=(0,))), + ((10, 5,), onp.array([[0], [2], [1]]), (3, 3), lax.ScatterDimensionNumbers( + update_window_dims=(1,), inserted_window_dims=(0,), + scatter_dims_to_operand_dims=(0,))), + ] + for bdims in all_bdims(arg_shape, idxs.shape, update_shape))) + def testScatterAdd(self, arg_shape, dtype, idxs, update_shape, dnums, bdims): + fun = partial(lax.scatter_add, dimension_numbers=dnums) + self._CheckBatching(fun, 5, bdims, [arg_shape, idxs.shape, update_shape], + [dtype, idxs.dtype, dtype], jtu.rand_default()) # TODO Concatenate # TODO Reverse @@ -2975,7 +3030,6 @@ def testFft(self, fft_ndims, shape, bdims, rng_factory): # TODO Sort # TODO SortKeyVal # TODO Collapse - # TODO ScatterAdd # TODO Scatter From 7df124a7b45dc9c9161ca28f9ed045a3ad34b380 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Dec 2019 22:01:01 -0500 Subject: [PATCH 0533/1053] Relax fp16 test tolerance for scatter_add batching test. (#1887) --- tests/lax_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index 47cb7ee972d2..7ff7e74c99eb 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -3021,7 +3021,8 @@ def testGather(self, shape, dtype, idxs, dnums, slice_sizes, bdims): def testScatterAdd(self, arg_shape, dtype, idxs, update_shape, dnums, bdims): fun = partial(lax.scatter_add, dimension_numbers=dnums) self._CheckBatching(fun, 5, bdims, [arg_shape, idxs.shape, update_shape], - [dtype, idxs.dtype, dtype], jtu.rand_default()) + [dtype, idxs.dtype, dtype], jtu.rand_default(), + rtol={onp.float16: 5e-3}) # TODO Concatenate # TODO Reverse From 8f00e3f511d28ca8f7a2f0e53f8890303aeb5332 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 18 Dec 2019 11:07:39 -0500 Subject: [PATCH 0534/1053] Disable SVD GPU test because it is failing due to an LLVM integrate. (#1890) Remove some stale jaxlib version tests. --- jax/lax_linalg.py | 16 +++++----------- tests/linalg_test.py | 6 ++---- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index ea24ec28fa04..37cc5a50e53e 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -726,17 +726,11 @@ def _qr_cpu_gpu_translation_rule(geqrf_impl, orgqr_impl, c, operand, ad.primitive_jvps[qr_p] = qr_jvp_rule batching.primitive_batchers[qr_p] = qr_batching_rule -# TODO(phawkins): make unconditional after the minimum Jaxlib version is -# increased past 0.1.28. -if hasattr(lapack, "geqrf"): - xla.backend_specific_translations['cpu'][qr_p] = partial( - _qr_cpu_gpu_translation_rule, lapack.geqrf, lapack.orgqr) - -# TODO(phawkins): make unconditional after the minimum Jaxlib version is -# increased past 0.1.28. -if hasattr(cusolver, "geqrf"): - xla.backend_specific_translations['gpu'][qr_p] = partial( - _qr_cpu_gpu_translation_rule, cusolver.geqrf, cusolver.orgqr) +xla.backend_specific_translations['cpu'][qr_p] = partial( + _qr_cpu_gpu_translation_rule, lapack.geqrf, lapack.orgqr) + +xla.backend_specific_translations['gpu'][qr_p] = partial( + _qr_cpu_gpu_translation_rule, cusolver.geqrf, cusolver.orgqr) # Singular value decomposition diff --git a/tests/linalg_test.py b/tests/linalg_test.py index a70addb132bf..e386cceee342 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -416,12 +416,10 @@ def testNorm(self, shape, dtype, ord, axis, keepdims, rng_factory): for full_matrices in [False, True] for compute_uv in [False, True] for rng_factory in [jtu.rand_default])) - @jtu.skip_on_devices("tpu") + @jtu.skip_on_devices("gpu", "tpu") # TODO(b/145608614): SVD crashes on GPU. def testSVD(self, b, m, n, dtype, full_matrices, compute_uv, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) - if b != () and jax.lib.version <= (0, 1, 28): - raise unittest.SkipTest("Batched SVD requires jaxlib 0.1.29") args_maker = lambda: [rng(b + (m, n), dtype)] # Norm, adjusted for dimension and type. @@ -474,7 +472,7 @@ def testQr(self, shape, dtype, full_matrices, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) if (np.issubdtype(dtype, onp.complexfloating) and - (jtu.device_under_test() == "tpu" or jax.lib.version <= (0, 1, 27))): + jtu.device_under_test() == "tpu"): raise unittest.SkipTest("No complex QR implementation") m, n = shape[-2:] From a52dc452d25a5e6007884ff8291af655f45b5595 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 18 Dec 2019 11:57:22 -0500 Subject: [PATCH 0535/1053] Change jax.numpy scalar types to return 0D JAX arrays when instantiated. (#1836) * Change jax.numpy scalar types to return 0D JAX arrays rather than NumPy scalars when instantiated. jax.numpy and numpy have slightly different promotion behaviors. For consistency with JAX arrays, we would like the result of, say, `jax.numpy.int32(7)` to have the same promotion behavior as `jax.numpy.array(7, dtype=jax.numpy.int32)`. The easiest way to do this is to have the jax.numpy scalars return 0D arrays when instantiated; the difference between NumPy scalars and arrays is not a fundamental one and we do not need to distinguish between them in JAX. --- jax/dtypes.py | 9 ++- jax/lax_linalg.py | 7 ++- jax/numpy/lax_numpy.py | 109 ++++++++++++++++++++------------- tests/dtypes_test.py | 30 +++++++++ tests/lax_control_flow_test.py | 2 +- 5 files changed, 108 insertions(+), 49 deletions(-) diff --git a/jax/dtypes.py b/jax/dtypes.py index 6239ebde60bc..98d9872f1d32 100644 --- a/jax/dtypes.py +++ b/jax/dtypes.py @@ -135,7 +135,14 @@ def finfo(dtype): def issubdtype(a, b): if a == bfloat16: - return b in [onp.floating, onp.inexact, onp.number] + return b in [bfloat16, _bfloat16_dtype, onp.floating, onp.inexact, + onp.number] + if not issubclass(b, onp.generic): + # Workaround for JAX scalar types. NumPy's issubdtype has a backward + # compatibility behavior for the second argument of issubdtype that + # interacts badly with JAX's custom scalar types. As a workaround, + # explicitly cast the second argument to a NumPy type object. + b = onp.dtype(b).type return onp.issubdtype(a, b) can_cast = onp.can_cast diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 37cc5a50e53e..74186a5e77b4 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -94,7 +94,8 @@ def g(c, *args, **kwargs): # primitives -_cpu_lapack_types = {np.float32, np.float64, np.complex64, np.complex128} +_cpu_lapack_types = {onp.dtype(onp.float32), onp.dtype(onp.float64), + onp.dtype(onp.complex64), onp.dtype(onp.complex128)} # Cholesky decomposition @@ -137,7 +138,7 @@ def _nan_like(c, operand): def cholesky_cpu_translation_rule(c, operand): shape = c.GetShape(operand) dtype = shape.element_type().type - if len(shape.dimensions()) == 2 and dtype in _cpu_lapack_types: + if len(shape.dimensions()) == 2 and onp.dtype(dtype) in _cpu_lapack_types: result, info = lapack.potrf(c, operand, lower=True) return c.Select(c.Eq(info, c.ConstantS32Scalar(0)), result, _nan_like(c, result)) @@ -392,7 +393,7 @@ def _triangular_solve_cpu_translation_rule( c, a, b, left_side, lower, transpose_a, conjugate_a, unit_diagonal): shape = c.GetShape(a) dtype = shape.element_type().type - if len(shape.dimensions()) == 2 and dtype in _cpu_lapack_types: + if len(shape.dimensions()) == 2 and onp.dtype(dtype) in _cpu_lapack_types: if conjugate_a and not transpose_a: a = c.Conj(a) conjugate_a = False diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 5bf75844cf81..67ae58735081 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -126,29 +126,50 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, size = onp.size _dtype = dtypes.result_type -bool_ = onp.bool_ -int_ = dtypes.int_ -float_ = dtypes.float_ -complex_ = dtypes.complex_ - -uint8 = onp.uint8 -uint16 = onp.uint16 -uint32 = onp.uint32 -uint64 = onp.uint64 -int8 = onp.int8 -int16 = onp.int16 -int32 = onp.int32 -int64 = onp.int64 -bfloat16 = dtypes.bfloat16 -float16 = onp.float16 -float32 = single = onp.float32 -float64 = double = onp.float64 -complex64 = csingle = onp.complex64 -complex128 = cdouble = onp.complex128 +# At present JAX doesn't have a reason to distinguish between scalars and arrays +# in its object system. Further, we want JAX scalars to have the same type +# promotion behaviors as JAX arrays. Rather than introducing a new type of JAX +# scalar object with JAX promotion behaviors, instead we make the JAX scalar +# types return JAX arrays when instantiated. + +class _ScalarMeta(type): + def __hash__(self): + return hash(self.dtype.type) + + def __eq__(self, other): + return id(self) == id(other) or self.dtype == other + + def __ne__(self, other): + return not (self == other) + + def __call__(self, x): + return array(self.dtype.type(x), dtype=self.dtype) + +def _make_scalar_type(onp_scalar_type): + return type(onp_scalar_type.__name__, + (six.with_metaclass(_ScalarMeta, object),), + {"dtype": onp.dtype(onp_scalar_type)}) + +bool_ = _make_scalar_type(onp.bool_) +uint8 = _make_scalar_type(onp.uint8) +uint16 = _make_scalar_type(onp.uint16) +uint32 = _make_scalar_type(onp.uint32) +uint64 = _make_scalar_type(onp.uint64) +int8 = _make_scalar_type(onp.int8) +int16 = _make_scalar_type(onp.int16) +int32 = _make_scalar_type(onp.int32) +int64 = _make_scalar_type(onp.int64) +bfloat16 = _make_scalar_type(dtypes.bfloat16) +float16 = _make_scalar_type(onp.float16) +float32 = single = _make_scalar_type(onp.float32) +float64 = double = _make_scalar_type(onp.float64) +complex64 = csingle = _make_scalar_type(onp.complex64) +complex128 = cdouble = _make_scalar_type(onp.complex128) + +int_ = int32 if dtypes.int_ == onp.int32 else int64 +float_ = float32 if dtypes.float_ == onp.float32 else float64 +complex_ = complex64 if dtypes.complex_ == onp.complex64 else complex128 -flexible = onp.flexible -character = onp.character -object_ = onp.object_ number = onp.number inexact = onp.inexact complexfloating = onp.complexfloating @@ -157,6 +178,10 @@ def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, signedinteger = onp.signedinteger unsignedinteger = onp.unsignedinteger +flexible = onp.flexible +character = onp.character +object_ = onp.object_ + iinfo = dtypes.iinfo dtype = onp.dtype @@ -363,8 +388,6 @@ def finfo(dtype): return dtypes.finfo(dtype) @_wraps(onp.issubdtype) def issubdtype(arg1, arg2): return dtypes.issubdtype(arg1, arg2) -issubdtype = dtypes.issubdtype - @_wraps(onp.isscalar) def isscalar(num): return dtypes.is_python_scalar(num) or onp.isscalar(num) @@ -459,7 +482,7 @@ def _logical_op(np_op, bitwise_op): @_wraps(np_op, update_doc=False) def op(*args): zero = lambda x: lax.full_like(x, shape=(), fill_value=0) - args = (x if issubdtype(_dtype(x), onp.bool_) else lax.ne(x, zero(x)) + args = (x if issubdtype(_dtype(x), bool_) else lax.ne(x, zero(x)) for x in args) return bitwise_op(*_promote_args(np_op.__name__, *args)) return op @@ -481,7 +504,7 @@ def divide(x1, x2): # decide whether to perform integer division based on Numpy result dtype, as a # way to check whether Python 3 style division is active in Numpy result_dtype = _result_dtype(onp.divide, x1, x2) - if issubdtype(result_dtype, onp.integer): + if issubdtype(result_dtype, integer): return floor_divide(x1, x2) else: return true_divide(x1, x2) @@ -514,7 +537,7 @@ def floor_divide(x1, x2): @_wraps(onp.divmod) def divmod(x1, x2): x1, x2 = _promote_args("divmod", x1, x2) - if issubdtype(_dtype(x1), onp.integer): + if issubdtype(_dtype(x1), integer): return floor_divide(x1, x2), remainder(x1, x2) else: return _float_divmod(x1, x2) @@ -704,7 +727,7 @@ def arcsinh(x): x, = _promote_dtypes_inexact(x) one = lax._const(x, 1) result = lax.log(x + lax.sqrt(x * x + one)) - if issubdtype(_dtype(result), onp.complexfloating): + if issubdtype(_dtype(result), complexfloating): return result a = abs(x) sqrt_max_value = onp.sqrt(finfo(_dtype(x)).max) @@ -723,7 +746,7 @@ def arccosh(x): x, = _promote_dtypes_inexact(x) one = lax._const(x, 1) result = lax.log(x + lax.sqrt((x + one) * (x - one))) - if issubdtype(_dtype(result), onp.complexfloating): + if issubdtype(_dtype(result), complexfloating): return result sqrt_max_value = onp.sqrt(finfo(_dtype(x)).max) log2 = lax._const(x, onp.log(2)) @@ -736,7 +759,7 @@ def arctanh(x): x, = _promote_dtypes_inexact(x) one = lax._const(x, 1) result = lax._const(x, 0.5) * lax.log((one + x) / (one - x)) - if issubdtype(_dtype(result), onp.complexfloating): + if issubdtype(_dtype(result), complexfloating): return result return lax.select(abs(x) <= 1, result, lax.full_like(x, onp.nan)) @@ -981,7 +1004,7 @@ def _maybe_numpy_1_13_isclose_behavior(a, out): def where(condition, x=None, y=None): if x is None or y is None: raise ValueError("Must use the three-argument form of where().") - if not issubdtype(_dtype(condition), onp.bool_): + if not issubdtype(_dtype(condition), bool_): condition = lax.ne(condition, zeros_like(condition)) x, y = _promote_dtypes(x, y) condition, x, y = broadcast_arrays(condition, x, y) @@ -1070,7 +1093,7 @@ def clip(a, a_min=None, a_max=None): def _dtype_info(dtype): """Helper function for to get dtype info needed for clipping.""" - if issubdtype(dtype, onp.integer): + if issubdtype(dtype, integer): return iinfo(dtype) return finfo(dtype) @@ -1199,7 +1222,7 @@ def reduction(a, axis=None, dtype=None, out=None, keepdims=False): computation_dtype = result_dtype a = lax.convert_element_type(a, computation_dtype) result = lax.reduce(a, _reduction_init_val(a, init_val), - op if computation_dtype != bool_ else bool_op, dims) + op if computation_dtype != onp.bool_ else bool_op, dims) if keepdims: shape_with_singletons = lax.subvals(shape(a), zip(dims, (1,) * len(dims))) result = lax.reshape(result, shape_with_singletons) @@ -1224,7 +1247,7 @@ def _reduction_init_val(a, init_val): try: return onp.array(init_val, dtype=a_dtype) except OverflowError: - assert issubdtype(a_dtype, onp.integer) + assert issubdtype(a_dtype, integer) sign, info = onp.sign(init_val), iinfo(a_dtype) return onp.array(info.min if sign < 0 else info.max, dtype=a_dtype) @@ -1250,8 +1273,7 @@ def mean(a, axis=None, dtype=None, out=None, keepdims=False): else: normalizer = onp.prod(onp.take(shape(a), axis)) if dtype is None: - if (issubdtype(_dtype(a), onp.bool_) or - issubdtype(_dtype(a), onp.integer)): + if issubdtype(_dtype(a), bool_) or issubdtype(_dtype(a), integer): dtype = float_ else: dtype = _dtype(a) @@ -1391,8 +1413,7 @@ def nan_reduction(a, axis=None, out=None, keepdims=False, **kwargs): def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): if out is not None: raise ValueError("nanmean does not support the `out` argument.") - if (issubdtype(_dtype(a), onp.bool_) or - issubdtype(_dtype(a), onp.integer)): + if issubdtype(_dtype(a), bool_) or issubdtype(_dtype(a), integer): return mean(a, axis, dtype, out, keepdims) if dtype is None: dtype = _dtype(a) @@ -1759,7 +1780,7 @@ def eye(N, M=None, k=None, dtype=None): return lax.broadcasted_eye(dtype, (N, M), (0, 1)) else: k_dtype = _dtype(k) - if not issubdtype(k_dtype, onp.integer): + if not issubdtype(k_dtype, integer): msg = "eye argument `k` must be of integer dtype, got {}" raise TypeError(msg.format(k_dtype)) rows = k + lax.broadcasted_iota(k_dtype, (N, M), 0) @@ -1779,7 +1800,7 @@ def arange(start, stop=None, step=None, dtype=None): # If called like np.arange(N), we create a lazy lax._IotaConstant. if stop is None and step is None: dtype = dtype or _dtype(start) - if issubdtype(dtype, onp.integer): + if issubdtype(dtype, integer): return lax.iota(dtype, start) # avoids materializing # Fall back to instantiating an ndarray in host memory @@ -2189,7 +2210,7 @@ def matmul(a, b, precision=None): # pylint: disable=missing-docstring @_wraps(onp.vdot, lax_description=_PRECISION_DOC) def vdot(a, b, precision=None): - if issubdtype(_dtype(a), onp.complexfloating): + if issubdtype(_dtype(a), complexfloating): a = conj(a) return dot(a.ravel(), b.ravel(), precision=precision) @@ -2735,7 +2756,7 @@ def _merge_static_and_dynamic_indices(treedef, static_idx, dynamic_idx): return treedef.unflatten(idx) def _int(aval): - return not aval.shape and issubdtype(aval.dtype, onp.integer) + return not aval.shape and issubdtype(aval.dtype, integer) def _index_to_gather(x_shape, idx): # Remove ellipses and add trailing slice(None)s. @@ -2945,8 +2966,8 @@ def _expand_bool_indices(idx): abstract_i = core.get_aval(i) except TypeError: abstract_i = None - if (isinstance(abstract_i, ShapedArray) and issubdtype(abstract_i.dtype, onp.bool_) - or isinstance(i, list) and _all(not _shape(e) and issubdtype(_dtype(e), onp.bool_) + if (isinstance(abstract_i, ShapedArray) and issubdtype(abstract_i.dtype, bool_) + or isinstance(i, list) and _all(not _shape(e) and issubdtype(_dtype(e), bool_) for e in i)): if isinstance(i, list): i = array(i) diff --git a/tests/dtypes_test.py b/tests/dtypes_test.py index f7286b016acb..d0eb96c377ac 100644 --- a/tests/dtypes_test.py +++ b/tests/dtypes_test.py @@ -34,6 +34,7 @@ from jax import dtypes from jax import numpy as np from jax import test_util as jtu +from jax.interpreters import xla from jax.config import config config.parse_flags_with_absl() @@ -58,6 +59,10 @@ all_dtypes = (bool_dtypes + signed_dtypes + unsigned_dtypes + float_dtypes + complex_dtypes) +scalar_types = [np.bool_, np.int8, np.int16, np.int32, np.int64, + np.uint8, np.uint16, np.uint32, np.uint64, + np.bfloat16, np.float16, np.float32, np.float64, + np.complex64, np.complex128] class DtypesTest(jtu.JaxTestCase): @@ -138,6 +143,31 @@ def testPromoteDtypes(self): self.assertEqual(onp.promote_types(t1, t2), dtypes.promote_types(t1, t2)) + def testScalarInstantiation(self): + for t in [np.bool_, np.int32, np.bfloat16, np.float32, np.complex64]: + a = t(1) + self.assertEqual(a.dtype, np.dtype(t)) + self.assertIsInstance(a, xla.DeviceArray) + self.assertEqual(0, np.ndim(a)) + + def testIsSubdtype(self): + for t in scalar_types: + self.assertTrue(dtypes.issubdtype(t, t)) + self.assertTrue(dtypes.issubdtype(onp.dtype(t).type, t)) + self.assertTrue(dtypes.issubdtype(t, onp.dtype(t).type)) + if t != np.bfloat16: + for category in [onp.generic, np.inexact, np.integer, np.signedinteger, + np.unsignedinteger, np.floating, np.complexfloating]: + self.assertEqual(dtypes.issubdtype(t, category), + onp.issubdtype(onp.dtype(t).type, category)) + self.assertEqual(dtypes.issubdtype(t, category), + onp.issubdtype(onp.dtype(t).type, category)) + + def testArrayCasts(self): + for t in [np.bool_, np.int32, np.bfloat16, np.float32, np.complex64]: + a = onp.array([1, 2.5, -3.7]) + self.assertEqual(a.astype(t).dtype, np.dtype(t)) + self.assertEqual(np.array(a).astype(t).dtype, np.dtype(t)) @unittest.skipIf(six.PY2, "Test requires Python 3") def testEnumPromotion(self): diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 84e720af1dfe..8e4f8c815c89 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -329,7 +329,7 @@ def testForiLoopErrors(self): """Test typing error messages for while.""" with self.assertRaisesRegex( TypeError, "arguments to fori_loop must have equal types"): - lax.fori_loop(np.int16(0), np.int32(10), (lambda i, c: c), np.float32(7)) + lax.fori_loop(onp.int16(0), np.int32(10), (lambda i, c: c), np.float32(7)) def testForiLoopBatched(self): def body_fun(i, loop_carry): From 286ec51f6152d8972176bdf0f6fd2b38f1aa87ff Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 17 Dec 2019 17:49:06 -0800 Subject: [PATCH 0536/1053] make op-by-op computation follow arg placement --- .travis.yml | 4 +- jax/interpreters/xla.py | 58 +++++++++++++++++++--------- jax/lax/lax_parallel.py | 14 +++---- tests/api_test.py | 79 ++++++++++++++++++++++++++++++++++++++ tests/multibackend_test.py | 2 +- 5 files changed, 128 insertions(+), 29 deletions(-) diff --git a/.travis.yml b/.travis.yml index dcf1cd21ade9..ccd366e27b36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,9 @@ install: pip install sklearn; fi script: - - if [[ "$JAX_ONLY_DOCUMENTATION" == "" ]]; then + - if [[ "$MULTI_DEVICE_TEST" != "" ]]; then + XLA_FLAGS=--xla_force_host_platform_device_count=2 python tests/api_test.py MultiDeviceTest; + elif [[ "$JAX_ONLY_DOCUMENTATION" == "" ]]; then pytest -n 1 tests examples -W ignore ; else sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html; diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 1a6cb742d792..ec8c87f06f22 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -149,32 +149,48 @@ def _make_abstract_python_scalar(typ, _): def apply_primitive(prim, *args, **params): """Impl rule that compiles and runs a single primitive 'prim' using XLA.""" - abstract_args = map(abstractify, args) - compiled_fun = xla_primitive_callable(prim, *abstract_args, **params) + compiled_fun = xla_primitive_callable(prim, *map(arg_spec, args), **params) return compiled_fun(*args) +def arg_spec(x): + aval = abstractify(x) + try: + return aval, x._device + except: + return aval, None + @cache() -def xla_primitive_callable(prim, *abstract_args, **params): - backend = params.get('backend', None) - aval_out = prim.abstract_eval(*abstract_args, **params) +def xla_primitive_callable(prim, *arg_specs, **params): + avals, devices = unzip2(arg_specs) + # TODO(mattjj): make Device hashable instead of handling pairs here + try: + device, = set(d for d in devices if d is not None) or (None,) + except ValueError: + msg = "primitive arguments must be colocated on the same device, got {}" + names = ("{}({})".format(d[0].__name__, d[1]) for d in devices if d is not None) + raise ValueError(msg.format(", ".join(names))) + else: + all_devices = it.chain(xb.devices(), xb.devices('cpu')) + device = device and next(d for d in all_devices if (type(d), d.id) == device) + aval_out = prim.abstract_eval(*avals, **params) if prim.multiple_results: handlers = tuple(map(aval_to_result_handler, aval_out)) handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) else: handle_result = aval_to_result_handler(aval_out) - tuple_args = len(abstract_args) > 100 - built_c = primitive_computation(prim, tuple_args, *abstract_args, **params) - compiled = built_c.Compile(compile_options=xb.get_compile_options(), - backend=xb.get_backend(backend)) - return partial(_execute_compiled_primitive, prim, compiled, backend, - tuple_args, handle_result) + tuple_args = len(avals) > 100 + built_c = primitive_computation(prim, tuple_args, *avals, **params) + options = xb.get_compile_options(device_assignment=(device.id,) if device else None) + compiled = built_c.Compile(compile_options=options, + backend=xb.get_device_backend(device)) + return partial(_execute_compiled_primitive, prim, compiled, tuple_args, + handle_result) @cache() def primitive_computation(prim, tuple_args, *avals, **params): c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) c.SetOpMetadata(xc.OpMetadata(op_type=prim.name, op_name=str(params))) - backend = params.pop("backend", None) - platform = xb.get_backend(backend).platform + platform = xb.get_backend(None).platform xla_args = _xla_callable_args(c, avals, tuple_args) if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] @@ -184,10 +200,10 @@ def primitive_computation(prim, tuple_args, *avals, **params): rule(c, *xla_args, **params) # return val set as a side-effect on c elif prim in reduction_translations: rule = reduction_translations[prim] - rule(c, *xla_args, backend=backend, **params) # return val set as a side-effect on c + rule(c, *xla_args, **params) # return val set as a side-effect on c elif prim in initial_style_translations: rule = initial_style_translations[prim] - rule(c, AxisEnv(), *xla_args, backend=backend, **params) # side-effect on c + rule(c, AxisEnv(), *xla_args, **params) # side-effect on c else: raise NotImplementedError("XLA translation rule for {} not found".format(prim)) c.ClearOpMetadata() @@ -202,12 +218,12 @@ def primitive_computation(prim, tuple_args, *avals, **params): def primitive_subcomputation(prim, *avals, **params): return primitive_computation(prim, False, *avals, **params) -def _execute_compiled_primitive(prim, compiled, backend, tuple_args, +def _execute_compiled_primitive(prim, compiled, tuple_args, result_handler, *args): device, = compiled.local_devices() input_bufs = [device_put(x, device) for x in args if x is not token] if tuple_args: - input_bufs = [make_tuple(input_bufs, device, backend)] + input_bufs = [make_tuple(input_bufs, device, None)] out_buf = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) @@ -292,7 +308,7 @@ def write(v, node): replica_groups = axis_groups(axis_env, new_params['axis_name']) new_params = {k: new_params[k] for k in new_params if k != 'axis_name'} rule = parallel_translations[eqn.primitive] - ans = rule(c, *in_nodes, replica_groups=replica_groups, backend=backend, **new_params) + ans = rule(c, *in_nodes, replica_groups=replica_groups, **new_params) elif eqn.primitive in call_translations: new_params = check_backend_params(eqn.params, backend) (subjaxpr, const_bindings, freevar_bindings), = eqn.bound_subjaxprs @@ -660,12 +676,16 @@ class DeviceArray(DeviceValue): """A DeviceArray is an ndarray backed by a single device memory buffer.""" # We don't subclass ndarray because that would open up a host of issues, # but lax_numpy.py overrides isinstance behavior and attaches ndarray methods. - __slots__ = ["_npy_value"] + __slots__ = ["_npy_value", "_device"] __array_priority__ = 100 def __init__(self, aval, device_buffer): self.aval = aval self.device_buffer = device_buffer + # TODO(mattjj): make Device hashable + device = device_buffer.device() + self._device = device and (type(device), device.id) + self._npy_value = None if not core.skip_checks: assert type(aval) is ShapedArray diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index cd6d4ef1b6c6..86e0971b18a9 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -188,16 +188,16 @@ def _allreduce_split_axis_rule(prim, reducer, vals, which_mapped, axis_name): x, = vals return prim.bind(reducer(x, [0]), axis_name=axis_name), False -def _allreduce_translation_rule(prim, c, val, replica_groups, backend=None): +def _allreduce_translation_rule(prim, c, val, replica_groups): dtype = c.GetShape(val).numpy_dtype() scalar = ShapedArray((), dtype) - computation = xla.primitive_subcomputation(prim, scalar, scalar, backend=backend) + computation = xla.primitive_subcomputation(prim, scalar, scalar) return c.AllReduce(val, computation, replica_groups=replica_groups) # psum translation rule has special handling for complex dtypes -def _psum_translation_rule(c, val, replica_groups, backend=None): +def _psum_translation_rule(c, val, replica_groups): psum = partial(_allreduce_translation_rule, lax.add_p, c, - replica_groups=replica_groups, backend=backend) + replica_groups=replica_groups) dtype = c.GetShape(val).numpy_dtype() if dtypes.issubdtype(dtype, onp.complexfloating): return c.Complex(psum(c.Real(val)), psum(c.Imag(val))) @@ -227,8 +227,7 @@ def _psum_translation_rule(c, val, replica_groups, backend=None): partial(_allreduce_split_axis_rule, pmin_p, lax._reduce_min) -def _ppermute_translation_rule(c, x, replica_groups, perm, backend=None): - del backend +def _ppermute_translation_rule(c, x, replica_groups, perm): group_size = len(replica_groups[0]) srcs, dsts = unzip2((src % group_size, dst % group_size) for src, dst in perm) if not (len(srcs) == len(set(srcs)) and len(dsts) == len(set(dsts))): @@ -251,8 +250,7 @@ def _ppermute_transpose_rule(t, perm, axis_name): xla.parallel_translations[ppermute_p] = _ppermute_translation_rule -def _all_to_all_translation_rule(c, x, split_axis, concat_axis, replica_groups, backend=None): - del backend +def _all_to_all_translation_rule(c, x, split_axis, concat_axis, replica_groups): return c.AllToAll(x, split_axis, concat_axis, replica_groups) def _all_to_all_split_axis_rule(vals, which_mapped, split_axis, concat_axis, diff --git a/tests/api_test.py b/tests/api_test.py index 30800a14af9b..93afb582bb8c 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1582,6 +1582,25 @@ def jaxpr_subcomp_and_collect(c, jaxpr, *args, **kwargs): self.assertEqual(inner_jaxpr.eqns[0].primitive.name, 'mul') self.assertEqual(inner_jaxpr.eqns[1].primitive.name, 'add') + def test_primitive_compilation_cache(self): + primitive_computation = xla.primitive_computation + xla.xla_primitive_callable.cache_clear() # clear op-by-op cache + + count = [0] + def primitive_computation_and_count(*args, **kwargs): + count[0] += 1 + return primitive_computation(*args, **kwargs) + + + try: + xla.primitive_computation = primitive_computation_and_count + lax.add(1, 2) + lax.add(2, 3) + finally: + xla.primitive_computation = primitive_computation + + self.assertEqual(count[0], 1) + class JaxprTest(jtu.JaxTestCase): @@ -1625,5 +1644,65 @@ def f(x): """) +class MultiDeviceTest(jtu.JaxTestCase): + + def test_computation_follows_data(self): + if len(jax.devices()) < 2: + raise unittest.SkipTest("test requires multiple devices") + + x = jax.device_put(1, jax.devices()[0]) + y = jax.device_put(2, jax.devices()[0]) + z = x + y + self.assertEqual(z, 3) + self.assertEqual(z.device_buffer.device(), jax.devices()[0]) + + x = jax.device_put(1, jax.devices()[1]) + y = jax.device_put(2, jax.devices()[1]) + z = x + y + self.assertEqual(z, 3) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + + x = jax.device_put(1, jax.devices()[1]) + y = 4 + z = x + y + self.assertEqual(z, 5) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + + x = jax.device_put(1, jax.devices()[0]) + y = jax.device_put(2, jax.devices()[1]) + self.assertRaisesRegex( + ValueError, + "primitive arguments must be colocated on the same device", + lambda: x + y) + + x = jax.device_put(1, jax.devices()[1]) + y = x.reshape((1, 1)) + self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + + def test_primitive_compilation_cache(self): + if len(jax.devices()) < 2: + raise unittest.SkipTest("test requires multiple devices") + + primitive_computation = xla.primitive_computation + xla.xla_primitive_callable.cache_clear() # clear op-by-op cache + + count = [0] + def primitive_computation_and_count(*args, **kwargs): + count[0] += 1 + return primitive_computation(*args, **kwargs) + + x = jax.device_put(1, jax.devices()[1]) + + try: + xla.primitive_computation = primitive_computation_and_count + y = lax.add(x, x) + z = lax.add(y, y) + finally: + xla.primitive_computation = primitive_computation + + self.assertEqual(count[0], 1) + self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + if __name__ == '__main__': absltest.main() diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 54a8ae5731d8..93c3b06a53bb 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -121,7 +121,7 @@ def fun(x, y): z = fun(x, y) w = np.sin(z) self.assertEqual(z.device_buffer.platform(), backend) - self.assertEqual(w.device_buffer.platform(), jtu.device_under_test()) + self.assertEqual(w.device_buffer.platform(), backend) if __name__ == "__main__": From 8bd1a46ce7c7cc8e4827611531926ba200ad756e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 18 Dec 2019 11:18:33 -0800 Subject: [PATCH 0537/1053] revise handling of 'backend' values --- jax/interpreters/xla.py | 40 +++++++++++++------------------ jax/lax/lax.py | 48 +++++++++++++++---------------------- jax/lax/lax_control_flow.py | 2 +- jax/lib/xla_bridge.py | 5 ++++ 4 files changed, 41 insertions(+), 54 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index ec8c87f06f22..bfb0ac933d67 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -172,6 +172,7 @@ def xla_primitive_callable(prim, *arg_specs, **params): else: all_devices = it.chain(xb.devices(), xb.devices('cpu')) device = device and next(d for d in all_devices if (type(d), d.id) == device) + backend = xb.get_device_backend(device) aval_out = prim.abstract_eval(*avals, **params) if prim.multiple_results: handlers = tuple(map(aval_to_result_handler, aval_out)) @@ -179,18 +180,17 @@ def xla_primitive_callable(prim, *arg_specs, **params): else: handle_result = aval_to_result_handler(aval_out) tuple_args = len(avals) > 100 - built_c = primitive_computation(prim, tuple_args, *avals, **params) + built_c = primitive_computation(prim, backend, tuple_args, *avals, **params) options = xb.get_compile_options(device_assignment=(device.id,) if device else None) - compiled = built_c.Compile(compile_options=options, - backend=xb.get_device_backend(device)) - return partial(_execute_compiled_primitive, prim, compiled, tuple_args, - handle_result) + compiled = built_c.Compile(compile_options=options, backend=backend) + return partial(_execute_compiled_primitive, prim, compiled, backend, + tuple_args, handle_result) @cache() -def primitive_computation(prim, tuple_args, *avals, **params): +def primitive_computation(prim, backend, tuple_args, *avals, **params): c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) c.SetOpMetadata(xc.OpMetadata(op_type=prim.name, op_name=str(params))) - platform = xb.get_backend(None).platform + platform = xb.get_backend(backend).platform xla_args = _xla_callable_args(c, avals, tuple_args) if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] @@ -198,12 +198,9 @@ def primitive_computation(prim, tuple_args, *avals, **params): elif prim in translations: rule = translations[prim] rule(c, *xla_args, **params) # return val set as a side-effect on c - elif prim in reduction_translations: - rule = reduction_translations[prim] - rule(c, *xla_args, **params) # return val set as a side-effect on c elif prim in initial_style_translations: rule = initial_style_translations[prim] - rule(c, AxisEnv(), *xla_args, **params) # side-effect on c + rule(c, AxisEnv(), *xla_args, backend=backend, **params) # side-effect on c else: raise NotImplementedError("XLA translation rule for {} not found".format(prim)) c.ClearOpMetadata() @@ -216,14 +213,14 @@ def primitive_computation(prim, tuple_args, *avals, **params): raise RuntimeError(msg) def primitive_subcomputation(prim, *avals, **params): - return primitive_computation(prim, False, *avals, **params) + return primitive_computation(prim, None, False, *avals, **params) -def _execute_compiled_primitive(prim, compiled, tuple_args, +def _execute_compiled_primitive(prim, compiled, backend, tuple_args, result_handler, *args): device, = compiled.local_devices() input_bufs = [device_put(x, device) for x in args if x is not token] if tuple_args: - input_bufs = [make_tuple(input_bufs, device, None)] + input_bufs = [make_tuple(input_bufs, device, backend)] out_buf = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) @@ -296,17 +293,13 @@ def write(v, node): ans = rule(c, *in_nodes, **eqn.params) elif eqn.primitive in translations: ans = translations[eqn.primitive](c, *in_nodes, **eqn.params) - elif eqn.primitive in reduction_translations: - new_params = check_backend_params(eqn.params, backend) - ans = reduction_translations[eqn.primitive](c, *in_nodes, backend=backend, **new_params) elif eqn.primitive in initial_style_translations: new_params = check_backend_params(eqn.params, backend) rule = initial_style_translations[eqn.primitive] ans = rule(c, axis_env, *in_nodes, backend=backend, **new_params) elif eqn.primitive in parallel_translations: - new_params = check_backend_params(eqn.params, backend) - replica_groups = axis_groups(axis_env, new_params['axis_name']) - new_params = {k: new_params[k] for k in new_params if k != 'axis_name'} + replica_groups = axis_groups(axis_env, eqn.params['axis_name']) + new_params = {k: v for k, v in eqn.params.items() if k != 'axis_name'} rule = parallel_translations[eqn.primitive] ans = rule(c, *in_nodes, replica_groups=replica_groups, **new_params) elif eqn.primitive in call_translations: @@ -431,7 +424,7 @@ def eqn_collectives(eqn): def _xla_call_impl(fun, *args, **params): device = params['device'] - backend = params.get('backend', None) + backend = params['backend'] compiled_fun = _xla_callable(fun, device, backend, *map(abstractify, args)) try: return compiled_fun(*args) @@ -563,7 +556,7 @@ def _get_device(device, backend): xla_call_p.def_impl(_xla_call_impl) def _xla_call_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, - in_nodes, device=None, backend=None): + in_nodes, backend, device=None): del device # Ignored. subc = xb.make_computation_builder("jaxpr_subcomputation") # TODO(mattjj): name consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] @@ -578,7 +571,6 @@ def _xla_call_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, ### translation tables translations = {} -reduction_translations = {} parallel_translations = {} initial_style_translations = {} call_translations = {} @@ -853,7 +845,7 @@ def _device_put_impl(x, device=None): def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, in_nodes, - backend=None, device=None, concrete=None): + backend, device=None, concrete=None): # This looks a lot like _xla_call_translation_rule, except for a widget we use # to foil CSE. del device, concrete # Unused. diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 05be695164d6..4850f5e172d3 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1488,14 +1488,6 @@ def standard_primitive(shape_rule, dtype_rule, name, translation_rule=None): return prim -def standard_reduction_primitive(shape_rule, dtype_rule, name, translation_rule=None): - prim = Primitive(name) - prim.def_impl(partial(xla.apply_primitive, prim)) - prim.def_abstract_eval(partial(standard_abstract_eval, prim, shape_rule, dtype_rule)) - xla.reduction_translations[prim] = translation_rule or partial(standard_translate, name) - return prim - - def standard_abstract_eval(prim, shape_rule, dtype_rule, *args, **kwargs): assert all(isinstance(arg, UnshapedArray) for arg in args), args least_specialized = _max( @@ -3100,11 +3092,11 @@ def _scatter_shape_rule(operand, scatter_indices, updates, **kwargs): def _scatter_translation_rule(c, operand, scatter_indices, updates, update_jaxpr, update_consts, dimension_numbers, - updates_shape, backend=None): + updates_shape): dtype = c.GetShape(operand).numpy_dtype() init_value = c.Constant(onp.array(0, dtype)) update_computation = _reduction_computation( - c, update_jaxpr, backend, update_consts, init_value) + c, update_jaxpr, update_consts, init_value) indices_shape = c.GetShape(scatter_indices) return c.Scatter(operand, scatter_indices, updates, update_computation, _scatter_dimensions_proto(indices_shape, dimension_numbers)) @@ -3203,7 +3195,7 @@ def _scatter_batching_rule( scatter_dims_to_operand_dims=scatter_dims_to_operand_dims) return scatter_op(operand, scatter_indices, updates, dnums), 0 -scatter_add_p = standard_reduction_primitive( +scatter_add_p = standard_primitive( _scatter_shape_rule, _scatter_dtype_rule, 'scatter-add', _scatter_translation_rule) ad.primitive_jvps[scatter_add_p] = _scatter_add_jvp @@ -3212,14 +3204,14 @@ def _scatter_batching_rule( partial(_scatter_batching_rule, scatter_add)) # TODO(jlebar): Add derivatives. -scatter_min_p = standard_reduction_primitive( +scatter_min_p = standard_primitive( _scatter_shape_rule, _scatter_dtype_rule, 'scatter-min', _scatter_translation_rule) batching.primitive_batchers[scatter_min_p] = ( partial(_scatter_batching_rule, scatter_min)) # TODO(jlebar): Add derivatives. -scatter_max_p = standard_reduction_primitive( +scatter_max_p = standard_primitive( _scatter_shape_rule, _scatter_dtype_rule, 'scatter-max', _scatter_translation_rule) batching.primitive_batchers[scatter_max_p] = ( @@ -3319,7 +3311,7 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, return val_out, tangent_out -scatter_p = standard_reduction_primitive( +scatter_p = standard_primitive( _scatter_shape_rule, _scatter_dtype_rule, 'scatter', _scatter_translation_rule) ad.primitive_jvps[scatter_p] = _scatter_jvp @@ -3330,9 +3322,8 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, def _reduce_shape_rule(operand, init_value, computation, jaxpr, consts, dimensions): return tuple(onp.delete(operand.shape, dimensions)) -def _reduce_translation_rule(c, operand, init_value, computation, jaxpr, consts, dimensions, - backend=None): - xla_computation = _reduction_computation(c, jaxpr, backend, consts, init_value) +def _reduce_translation_rule(c, operand, init_value, computation, jaxpr, consts, dimensions): + xla_computation = _reduction_computation(c, jaxpr, consts, init_value) return c.Reduce(operand, init_value, xla_computation, dimensions) def _reduce_batch_rule(batched_args, batch_dims, computation, jaxpr, consts, dimensions): @@ -3346,13 +3337,13 @@ def _reduce_batch_rule(batched_args, batch_dims, computation, jaxpr, consts, dim else: raise NotImplementedError # loop and stack -def _reduction_computation(c, jaxpr, backend, consts, init_value): +def _reduction_computation(c, jaxpr, consts, init_value): shape = c.GetShape(init_value) axis_env = xla.AxisEnv() # no parallel primitives inside reductions subc = xla_bridge.make_computation_builder("reduction_computation") consts = [subc.ParameterWithShape(const) for const in consts] args = [subc.ParameterWithShape(shape), subc.ParameterWithShape(shape)] - out, = xla.jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, (), *args) + out, = xla.jaxpr_subcomp(subc, jaxpr, None, axis_env, consts, (), *args) return subc.Build(out) def _masking_defreducer(prim, identity): @@ -3374,7 +3365,7 @@ def _reducer_masking_rule(prim, identity, padded_vals, logical_shapes, masked_val = select(mask, padded_val, identity(padded_shape, padded_val.dtype)) return prim.bind(masked_val, axes=axes, input_shape=padded_shape) -reduce_p = standard_reduction_primitive(_reduce_shape_rule, _input_dtype, 'reduce', +reduce_p = standard_primitive(_reduce_shape_rule, _input_dtype, 'reduce', _reduce_translation_rule) batching.primitive_batchers[reduce_p] = _reduce_batch_rule @@ -3419,8 +3410,7 @@ def _reduce_prod_translation_rule(c, operand, axes): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(1, dtype)), - xla.primitive_subcomputation(mul_p, scalar, scalar), - axes) + xla.primitive_subcomputation(mul_p, scalar, scalar), axes) def _reduce_prod_jvp_rule(tangent, operand, axes): input_shape = onp.array(operand.shape) @@ -3528,8 +3518,8 @@ def _reduce_window_shape_rule(operand, init_value, jaxpr, consts, window_strides, padding) def _reduce_window_translation_rule(c, operand, init_value, jaxpr, consts, - window_dimensions, window_strides, padding, backend=None): - xla_computation = _reduction_computation(c, jaxpr, backend, consts, init_value) + window_dimensions, window_strides, padding): + xla_computation = _reduction_computation(c, jaxpr, consts, init_value) return c.ReduceWindow(operand, init_value, xla_computation, window_dimensions, window_strides, padding) @@ -3550,7 +3540,7 @@ def reduce_window(x, window_dimensions, window_strides, padding): window_dimensions, window_strides, padding) -reduce_window_p = standard_reduction_primitive( +reduce_window_p = standard_primitive( _reduce_window_shape_rule, _input_dtype, 'reduce_window', _reduce_window_translation_rule) batching.primitive_batchers[reduce_window_p] = _generic_reduce_window_batch_rule @@ -3683,13 +3673,13 @@ def _select_and_scatter_shape_rule( def _select_and_scatter_translation( c, operand, source, init_value, select_jaxpr, select_consts, scatter_jaxpr, - scatter_consts, window_dimensions, window_strides, padding, backend=None): - select = _reduction_computation(c, select_jaxpr, backend, select_consts, init_value) - scatter = _reduction_computation(c, scatter_jaxpr, backend, scatter_consts, init_value) + scatter_consts, window_dimensions, window_strides, padding): + select = _reduction_computation(c, select_jaxpr, select_consts, init_value) + scatter = _reduction_computation(c, scatter_jaxpr, scatter_consts, init_value) return c.SelectAndScatter(operand, select, window_dimensions, window_strides, padding, source, init_value, scatter) -select_and_scatter_p = standard_reduction_primitive( +select_and_scatter_p = standard_primitive( _select_and_scatter_shape_rule, _input_dtype, 'select_and_scatter', _select_and_scatter_translation) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index c29a86e886df..590d4c2646f2 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -213,7 +213,7 @@ def _while_loop_abstract_eval(*args, **kwargs): return kwargs["body_jaxpr"].out_avals def _while_loop_translation_rule(c, axis_env, *args, **kwargs): - backend = kwargs.pop('backend', None) + backend = kwargs.pop('backend') cond_jaxpr, body_jaxpr, cond_nconsts, body_nconsts = split_dict( kwargs, ["cond_jaxpr", "body_jaxpr", "cond_nconsts", "body_nconsts"]) cond_consts, body_consts, init_vals = split_list(args, [cond_nconsts, body_nconsts]) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index e99521dbacd0..69bff11e91b8 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -147,6 +147,11 @@ def _get_tpu_driver_backend(platform): @util.memoize def get_backend(platform=None): + # TODO(mattjj,skyewm): remove this input polymorphism after we clean up how + # 'backend' values are handled + if isinstance(platform, xla_client.Backend): + return platform + with _backend_lock: backend = _backends.get(FLAGS.jax_xla_backend) if backend is None: From 00e621df757c1746bf8065ce19ec90b61b80337c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 18 Dec 2019 11:20:42 -0800 Subject: [PATCH 0538/1053] add multi_device_test in travis --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index ccd366e27b36..c00a98587bea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,9 @@ matrix: include: - python: "3.7" env: JAX_ENABLE_X64=1 JAX_ONLY_DOCUMENTATION=true + include: + - python: "3.7" + env: MULTI_DEVICE_TEST=1 before_install: - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then From 2a394ce31ba61b587a9813cf72c7b320db202b81 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 18 Dec 2019 11:26:58 -0800 Subject: [PATCH 0539/1053] move multi-device test into its own file --- .travis.yml | 7 +-- tests/api_test.py | 60 ------------------- tests/multi_device_test.py | 119 +++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 66 deletions(-) create mode 100644 tests/multi_device_test.py diff --git a/.travis.yml b/.travis.yml index c00a98587bea..dcf1cd21ade9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,6 @@ matrix: include: - python: "3.7" env: JAX_ENABLE_X64=1 JAX_ONLY_DOCUMENTATION=true - include: - - python: "3.7" - env: MULTI_DEVICE_TEST=1 before_install: - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then @@ -45,9 +42,7 @@ install: pip install sklearn; fi script: - - if [[ "$MULTI_DEVICE_TEST" != "" ]]; then - XLA_FLAGS=--xla_force_host_platform_device_count=2 python tests/api_test.py MultiDeviceTest; - elif [[ "$JAX_ONLY_DOCUMENTATION" == "" ]]; then + - if [[ "$JAX_ONLY_DOCUMENTATION" == "" ]]; then pytest -n 1 tests examples -W ignore ; else sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html; diff --git a/tests/api_test.py b/tests/api_test.py index 93afb582bb8c..f34c65d90611 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1644,65 +1644,5 @@ def f(x): """) -class MultiDeviceTest(jtu.JaxTestCase): - - def test_computation_follows_data(self): - if len(jax.devices()) < 2: - raise unittest.SkipTest("test requires multiple devices") - - x = jax.device_put(1, jax.devices()[0]) - y = jax.device_put(2, jax.devices()[0]) - z = x + y - self.assertEqual(z, 3) - self.assertEqual(z.device_buffer.device(), jax.devices()[0]) - - x = jax.device_put(1, jax.devices()[1]) - y = jax.device_put(2, jax.devices()[1]) - z = x + y - self.assertEqual(z, 3) - self.assertEqual(z.device_buffer.device(), jax.devices()[1]) - - x = jax.device_put(1, jax.devices()[1]) - y = 4 - z = x + y - self.assertEqual(z, 5) - self.assertEqual(z.device_buffer.device(), jax.devices()[1]) - - x = jax.device_put(1, jax.devices()[0]) - y = jax.device_put(2, jax.devices()[1]) - self.assertRaisesRegex( - ValueError, - "primitive arguments must be colocated on the same device", - lambda: x + y) - - x = jax.device_put(1, jax.devices()[1]) - y = x.reshape((1, 1)) - self.assertEqual(y.device_buffer.device(), jax.devices()[1]) - - def test_primitive_compilation_cache(self): - if len(jax.devices()) < 2: - raise unittest.SkipTest("test requires multiple devices") - - primitive_computation = xla.primitive_computation - xla.xla_primitive_callable.cache_clear() # clear op-by-op cache - - count = [0] - def primitive_computation_and_count(*args, **kwargs): - count[0] += 1 - return primitive_computation(*args, **kwargs) - - x = jax.device_put(1, jax.devices()[1]) - - try: - xla.primitive_computation = primitive_computation_and_count - y = lax.add(x, x) - z = lax.add(y, y) - finally: - xla.primitive_computation = primitive_computation - - self.assertEqual(count[0], 1) - self.assertEqual(y.device_buffer.device(), jax.devices()[1]) - self.assertEqual(z.device_buffer.device(), jax.devices()[1]) - if __name__ == '__main__': absltest.main() diff --git a/tests/multi_device_test.py b/tests/multi_device_test.py new file mode 100644 index 000000000000..bd4aa1f88a8b --- /dev/null +++ b/tests/multi_device_test.py @@ -0,0 +1,119 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +from unittest import SkipTest + +from absl.testing import absltest + +import jax +from jax import lax +from jax import test_util as jtu +from jax.lib import xla_bridge +from jax.interpreters import xla + +from jax.config import config +config.parse_flags_with_absl() + +prev_xla_flags = None + + +# Run all tests with 8 CPU devices. +def setUpModule(): + global prev_xla_flags + prev_xla_flags = os.getenv("XLA_FLAGS") + flags_str = prev_xla_flags or "" + # Don't override user-specified device count, or other XLA flags. + if "xla_force_host_platform_device_count" not in flags_str: + os.environ["XLA_FLAGS"] = (flags_str + + " --xla_force_host_platform_device_count=8") + # Clear any cached backends so new CPU backend will pick up the env var. + xla_bridge.get_backend.cache_clear() + +# Reset to previous configuration in case other test modules will be run. +def tearDownModule(): + if prev_xla_flags is None: + del os.environ["XLA_FLAGS"] + else: + os.environ["XLA_FLAGS"] = prev_xla_flags + xla_bridge.get_backend.cache_clear() + + +class MultiDeviceTest(jtu.JaxTestCase): + + def test_computation_follows_data(self): + if len(jax.devices()) < 2: + raise SkipTest("test requires multiple devices") + + x = jax.device_put(1, jax.devices()[0]) + y = jax.device_put(2, jax.devices()[0]) + z = x + y + self.assertEqual(z, 3) + self.assertEqual(z.device_buffer.device(), jax.devices()[0]) + + x = jax.device_put(1, jax.devices()[1]) + y = jax.device_put(2, jax.devices()[1]) + z = x + y + self.assertEqual(z, 3) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + + x = jax.device_put(1, jax.devices()[1]) + y = 4 + z = x + y + self.assertEqual(z, 5) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + + x = jax.device_put(1, jax.devices()[0]) + y = jax.device_put(2, jax.devices()[1]) + self.assertRaisesRegex( + ValueError, + "primitive arguments must be colocated on the same device", + lambda: x + y) + + x = jax.device_put(1, jax.devices()[1]) + y = x.reshape((1, 1)) + self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + + def test_primitive_compilation_cache(self): + if len(jax.devices()) < 2: + raise SkipTest("test requires multiple devices") + + primitive_computation = xla.primitive_computation + xla.xla_primitive_callable.cache_clear() # clear op-by-op cache + + count = [0] + def primitive_computation_and_count(*args, **kwargs): + count[0] += 1 + return primitive_computation(*args, **kwargs) + + x = jax.device_put(1, jax.devices()[1]) + + try: + xla.primitive_computation = primitive_computation_and_count + y = lax.add(x, x) + z = lax.add(y, y) + finally: + xla.primitive_computation = primitive_computation + + self.assertEqual(count[0], 1) + self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + + +if __name__ == '__main__': + absltest.main() From ec4b5445081b9ecd5d31c0b0e6e71a115c87125d Mon Sep 17 00:00:00 2001 From: Roman Novak <44512421+romanngg@users.noreply.github.com> Date: Wed, 18 Dec 2019 15:27:46 -0800 Subject: [PATCH 0540/1053] Stax: allow arbitrary dimension numbers in pooling layers. (#1892) --- jax/experimental/stax.py | 31 ++++++++++++++++++++++--------- tests/stax_test.py | 16 +++++++++------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/jax/experimental/stax.py b/jax/experimental/stax.py index a59dc6e74e8e..95b4621270d6 100644 --- a/jax/experimental/stax.py +++ b/jax/experimental/stax.py @@ -167,18 +167,24 @@ def elementwise(fun, **fun_kwargs): def _pooling_layer(reducer, init_val, rescaler=None): - def PoolingLayer(window_shape, strides=None, padding='VALID'): + def PoolingLayer(window_shape, strides=None, padding='VALID', spec='NHWC'): """Layer construction function for a pooling layer.""" strides = strides or (1,) * len(window_shape) rescale = rescaler(window_shape, strides, padding) if rescaler else None - dims = (1,) + window_shape + (1,) # NHWC - strides = (1,) + strides + (1,) + + non_spatial_axes = spec.index('N'), spec.index('C') + for i in sorted(non_spatial_axes): + window_shape = window_shape[:i] + (1,) + window_shape[i:] + strides = strides[:i] + (1,) + strides[i:] + def init_fun(rng, input_shape): - out_shape = lax.reduce_window_shape_tuple(input_shape, dims, strides, padding) + out_shape = lax.reduce_window_shape_tuple(input_shape, window_shape, + strides, padding) return out_shape, () def apply_fun(params, inputs, **kwargs): - out = lax.reduce_window(inputs, init_val, reducer, dims, strides, padding) - return rescale(out, inputs) if rescale else out + out = lax.reduce_window(inputs, init_val, reducer, window_shape, + strides, padding) + return rescale(out, inputs, spec) if rescale else out return init_fun, apply_fun return PoolingLayer MaxPool = _pooling_layer(lax.max, -np.inf) @@ -186,10 +192,17 @@ def apply_fun(params, inputs, **kwargs): def _normalize_by_window_size(dims, strides, padding): - def rescale(outputs, inputs): - one = np.ones(inputs.shape[1:-1], dtype=inputs.dtype) + def rescale(outputs, inputs, spec): + non_spatial_axes = spec.index('N'), spec.index('C') + spatial_shape = tuple(inputs.shape[i] + for i in range(inputs.ndim) + if i not in non_spatial_axes) + one = np.ones(spatial_shape, dtype=inputs.dtype) window_sizes = lax.reduce_window(one, 0., lax.add, dims, strides, padding) - return outputs / window_sizes[..., np.newaxis] + for i in sorted(non_spatial_axes): + window_sizes = np.expand_dims(window_sizes, i) + + return outputs / window_sizes return rescale AvgPool = _pooling_layer(lax.add, 0., _normalize_by_window_size) diff --git a/tests/stax_test.py b/tests/stax_test.py index c521cb2e062d..14bde167239a 100644 --- a/tests/stax_test.py +++ b/tests/stax_test.py @@ -138,20 +138,22 @@ def testNonlinearShape(self, input_shape, nonlinear): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_window_shape={}_padding={}_strides={}_input_shape={}" - "_maxpool={}" + "_maxpool={}_spec={}" .format(window_shape, padding, strides, input_shape, - max_pool), + max_pool, spec), "window_shape": window_shape, "padding": padding, "strides": strides, - "input_shape": input_shape, "max_pool": max_pool} + "input_shape": input_shape, "max_pool": max_pool, "spec": spec} for window_shape in [(1, 1), (2, 3)] for padding in ["VALID"] for strides in [None, (2, 1)] - for input_shape in [(2, 5, 6, 1)] - for max_pool in [False, True])) + for input_shape in [(2, 5, 6, 4)] + for max_pool in [False, True] + for spec in ["NHWC", "NCHW", "WHNC", "WHCN"])) def testPoolingShape(self, window_shape, padding, strides, input_shape, - max_pool): + max_pool, spec): layer = stax.MaxPool if max_pool else stax.AvgPool - init_fun, apply_fun = layer(window_shape, padding=padding, strides=strides) + init_fun, apply_fun = layer(window_shape, padding=padding, strides=strides, + spec=spec) _CheckShapeAgreement(self, init_fun, apply_fun, input_shape) @parameterized.named_parameters(jtu.cases_from_list( From 0ed842ed118ef361fb4396118d42cfa60da7279d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 18 Dec 2019 15:55:39 -0800 Subject: [PATCH 0541/1053] add another multi-device test --- tests/multi_device_test.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/multi_device_test.py b/tests/multi_device_test.py index bd4aa1f88a8b..a84aaa4023c0 100644 --- a/tests/multi_device_test.py +++ b/tests/multi_device_test.py @@ -20,8 +20,10 @@ from unittest import SkipTest from absl.testing import absltest +import numpy as onp import jax +import jax.numpy as np from jax import lax from jax import test_util as jtu from jax.lib import xla_bridge @@ -78,6 +80,12 @@ def test_computation_follows_data(self): self.assertEqual(z, 5) self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + x = jax.device_put(1, jax.devices()[1]) + y = np.ones(3) + z = x + y + self.assertAllClose(z, 1 + onp.ones(3), check_dtypes=False) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + x = jax.device_put(1, jax.devices()[0]) y = jax.device_put(2, jax.devices()[1]) self.assertRaisesRegex( From 891aecb941fef011fb83cec481306519e227ecdf Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 19 Dec 2019 11:19:58 -0800 Subject: [PATCH 0542/1053] Add test utilities for counting compilations. (#1895) Also uses the new utilities to check that pmap doesn't compile constant computations. --- jax/linear_util.py | 3 +++ jax/test_util.py | 42 ++++++++++++++++++++++++++++++++++++++ tests/api_test.py | 15 +------------- tests/multi_device_test.py | 13 +----------- tests/pmap_test.py | 20 +++++++++++++----- 5 files changed, 62 insertions(+), 31 deletions(-) diff --git a/jax/linear_util.py b/jax/linear_util.py index b462774edbdf..94147e64cbbf 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -198,6 +198,7 @@ def wrap_init(f, params={}): def cache(call): fun_caches = weakref.WeakKeyDictionary() + def memoized_fun(fun, *args): cache = fun_caches.setdefault(fun.f, {}) key = (fun.transforms, fun.params, args) @@ -209,6 +210,8 @@ def memoized_fun(fun, *args): ans = call(fun, *args) cache[key] = (ans, fun.stores) return ans + + memoized_fun.cache_clear = fun_caches.clear return memoized_fun @transformation diff --git a/jax/test_util.py b/jax/test_util.py index de014de8ea8a..379e6a9e25c2 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -16,6 +16,7 @@ from __future__ import division from __future__ import print_function +from contextlib import contextmanager import functools import re import itertools as it @@ -246,6 +247,47 @@ def f_vjp(*args): _check_grads(f, args, order) + +@contextmanager +def count_primitive_compiles(): + xla.xla_primitive_callable.cache_clear() + + # We count how many times we call primitive_computation (which is called + # inside xla_primitive_callable) instead of xla_primitive_callable so we don't + # count cache hits. + primitive_computation = xla.primitive_computation + count = [0] + + def primitive_computation_and_count(*args, **kwargs): + count[0] += 1 + return primitive_computation(*args, **kwargs) + + xla.primitive_computation = primitive_computation_and_count + try: + yield count + finally: + xla.primitive_computation = primitive_computation + + +@contextmanager +def count_jit_and_pmap_compiles(): + # No need to clear any caches since we generally jit and pmap fresh callables + # in tests. + + jaxpr_subcomp = xla.jaxpr_subcomp + count = [0] + + def jaxpr_subcomp_and_count(*args, **kwargs): + count[0] += 1 + return jaxpr_subcomp(*args, **kwargs) + + xla.jaxpr_subcomp = jaxpr_subcomp_and_count + try: + yield count + finally: + xla.jaxpr_subcomp = jaxpr_subcomp + + def device_under_test(): return FLAGS.jax_test_dut or xla_bridge.get_backend().platform diff --git a/tests/api_test.py b/tests/api_test.py index f34c65d90611..0fdc046a0df5 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1583,22 +1583,9 @@ def jaxpr_subcomp_and_collect(c, jaxpr, *args, **kwargs): self.assertEqual(inner_jaxpr.eqns[1].primitive.name, 'add') def test_primitive_compilation_cache(self): - primitive_computation = xla.primitive_computation - xla.xla_primitive_callable.cache_clear() # clear op-by-op cache - - count = [0] - def primitive_computation_and_count(*args, **kwargs): - count[0] += 1 - return primitive_computation(*args, **kwargs) - - - try: - xla.primitive_computation = primitive_computation_and_count + with jtu.count_primitive_compiles() as count: lax.add(1, 2) lax.add(2, 3) - finally: - xla.primitive_computation = primitive_computation - self.assertEqual(count[0], 1) diff --git a/tests/multi_device_test.py b/tests/multi_device_test.py index a84aaa4023c0..babb10cecc00 100644 --- a/tests/multi_device_test.py +++ b/tests/multi_device_test.py @@ -101,22 +101,11 @@ def test_primitive_compilation_cache(self): if len(jax.devices()) < 2: raise SkipTest("test requires multiple devices") - primitive_computation = xla.primitive_computation - xla.xla_primitive_callable.cache_clear() # clear op-by-op cache - - count = [0] - def primitive_computation_and_count(*args, **kwargs): - count[0] += 1 - return primitive_computation(*args, **kwargs) - x = jax.device_put(1, jax.devices()[1]) - try: - xla.primitive_computation = primitive_computation_and_count + with jtu.count_primitive_compiles() as count: y = lax.add(x, x) z = lax.add(y, y) - finally: - xla.primitive_computation = primitive_computation self.assertEqual(count[0], 1) self.assertEqual(y.device_buffer.device(), jax.devices()[1]) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 5aede6dff14b..aa4fe994c38e 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -476,12 +476,16 @@ def testPmapConstant(self): device_count = xla_bridge.device_count() f = pmap(lambda x: 3) x = np.arange(device_count) - ans = f(x) + with jtu.count_jit_and_pmap_compiles() as count: + ans = f(x) + self.assertEqual(count[0], 0) expected = onp.repeat(3, device_count) self.assertAllClose(ans, expected, check_dtypes=False) f = pmap(lambda x: (x, 3)) - _, ans = f(x) + with jtu.count_jit_and_pmap_compiles() as count: + _, ans = f(x) + self.assertEqual(count[0], 1) self.assertAllClose(ans, expected, check_dtypes=False) def testPmapConstantDevices(self): @@ -492,7 +496,9 @@ def testPmapConstantDevices(self): shuffle(devices) f = pmap(lambda x: 3, devices=devices) x = np.arange(len(devices)) - ans = f(x) + with jtu.count_jit_and_pmap_compiles() as count: + ans = f(x) + self.assertEqual(count[0], 0) expected = onp.repeat(3, len(devices)) self.assertAllClose(ans, expected, check_dtypes=False) @@ -520,7 +526,9 @@ def testNestedPmapConstant(self): f = pmap(pmap(lambda x: 3)) shape = (2, xla_bridge.device_count() // 2, 3) x = np.arange(prod(shape)).reshape(shape) - ans = f(x) + with jtu.count_jit_and_pmap_compiles() as count: + ans = f(x) + self.assertEqual(count[0], 0) expected = 3 * onp.ones(shape[:2]) self.assertAllClose(ans, expected, check_dtypes=False) @@ -547,7 +555,9 @@ def testNestedPmapConstantDevices(self): f = pmap(pmap(lambda x: 3), devices=devices) shape = (2, len(devices) // 2, 3) x = np.arange(prod(shape)).reshape(shape) - ans = f(x) + with jtu.count_jit_and_pmap_compiles() as count: + ans = f(x) + self.assertEqual(count[0], 0) expected = 3 * onp.ones(shape[:2]) self.assertAllClose(ans, expected, check_dtypes=False) From 178c0d821eac27e78308ffc401e6aaf1a8e2856f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 20 Dec 2019 13:29:53 -0500 Subject: [PATCH 0543/1053] Fix type problem in dynamic_slice_in_dim in int32 default dtype mode. (#1902) --- jax/lax/lax.py | 4 ++-- tests/lax_test.py | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 4850f5e172d3..e8b89e5f3911 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4399,8 +4399,8 @@ def _dynamic_slice_indices(operand, start_indices): start_indices = [reshape(slice(start_indices, [i], [i+1]), ()) for i in range(operand.ndim)] else: - start_indices = [onp.asarray(i) if isinstance(i, int) else i - for i in start_indices] + start_indices = [onp.asarray(i, dtype=dtypes.int_) if isinstance(i, int) + else i for i in start_indices] if len(start_indices) != operand.ndim: msg = ("Length of slice indices must match number of operand dimensions ({} " "vs {})") diff --git a/tests/lax_test.py b/tests/lax_test.py index 7ff7e74c99eb..28290a5c9bf2 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -998,9 +998,10 @@ def testSliceAgainstNumpy(self, shape, dtype, starts, limits, "shape": shape, "dtype": dtype, "start_indices": start_indices, "size_indices": size_indices, "rng_factory": rng_factory} for shape, start_indices, size_indices in [ - [(3,), (1,), (1,)], + [(3,), onp.array((1,)), (1,)], [(5, 3), (1, 1), (3, 1)], - [(7, 5, 3), (4, 1, 0), (2, 0, 1)], + [(5, 3), onp.array((1, 1)), (3, 1)], + [(7, 5, 3), onp.array((4, 1, 0)), (2, 0, 1)], ] for dtype in default_dtypes for rng_factory in [jtu.rand_default])) @@ -1031,6 +1032,12 @@ def testDynamicSliceAgainstNumpy(self, shape, dtype, start_indices, numpy_op = lambda x, s: lax_reference.dynamic_slice(x, s, size_indices) self._CheckAgainstNumpy(op, numpy_op, args_maker) + def testDynamicSliceInDim(self): + # Regression test for mixed type problem in dynamic_slice_in_dim. + rng = jtu.rand_default() + x = rng((6, 7), onp.int32) + onp.testing.assert_equal(lax.dynamic_slice_in_dim(x, 2, 3), x[2:5]) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_start_indices={}_update_shape={}".format( jtu.format_shape_dtype_string(shape, dtype), From 574a9ed2cb781a2ddccd16e83688acbb1015fa65 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 20 Dec 2019 16:09:55 -0500 Subject: [PATCH 0544/1053] Fix incorrect symbolic zero instantiation in scatter JVP rule. (#1903) --- jax/lax/lax.py | 5 +++-- tests/lax_test.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index e8b89e5f3911..5368622e7af1 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3232,6 +3232,9 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, tangent_out = ad_util.zero return val_out, tangent_out + g_operand = ad.instantiate_zeros(operand, g_operand) + g_updates = ad.instantiate_zeros(updates, g_updates) + # If there are overlapping indices in the scatter, it is unspecified which # update "wins". So we use the following perhaps surprising scheme: # a) attach a positive ID to each update in updates, forming (value, id) pairs @@ -3298,8 +3301,6 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, slice_sizes=slice_sizes) # c) mask off input JVP elements that do not correspond to a primal output. - g_operand = ad.instantiate_zeros(operand, g_operand) - g_updates = ad.instantiate_zeros(updates, g_updates) masked_g_operand = select(eq(scattered_ids, _zeros(scattered_ids)), g_operand, _zeros(g_operand)) masked_g_updates = select(eq(update_ids, gathered_update_ids), diff --git a/tests/lax_test.py b/tests/lax_test.py index 28290a5c9bf2..6ad052648e07 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -2465,6 +2465,16 @@ def testScatterGrad(self, arg_shape, dtype, idxs, update_shape, dnums, y = rng(update_shape, dtype) check_grads(scatter, (x, y), 2, ["fwd", "rev"], 1e-2, 1e-2, 1.) + def testScatterGradSymbolicZeroUpdate(self): + # https://github.com/google/jax/issues/1901 + def f(x): + n = x.shape[0] + y = onp.arange(n, dtype=x.dtype) + return jax.ops.index_update(x, onp.diag_indices(n), y) + rng = jtu.rand_default() + check_grads(f, (rng((5, 5), onp.float32),), 2, ["fwd", "rev"], 1e-2, 1e-2, + 1.) + def testStopGradient(self): def f(x): return lax.sin(x) * lax.cos(lax.stop_gradient(x)) From d57f16f67d01d8c6ea13223337ba3d23ab10edf7 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 20 Dec 2019 16:25:15 -0500 Subject: [PATCH 0545/1053] Implement jax.numpy.diag_indices in terms of iota instead of numpy.diag_indices. (#1904) --- jax/numpy/lax_numpy.py | 10 +++++++++- tests/lax_numpy_test.py | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 67ae58735081..d6334150620e 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2091,11 +2091,19 @@ def wrapper(*args, **kwargs): return tuple(asarray(x) for x in f(*args, **kwargs)) return wrapper -diag_indices = _wrap_indices_function(onp.diag_indices) tril_indices = _wrap_indices_function(onp.tril_indices) triu_indices = _wrap_indices_function(onp.triu_indices) mask_indices = _wrap_indices_function(onp.mask_indices) +@_wraps(onp.diag_indices) +def diag_indices(n, ndim=2): + if n < 0: + raise ValueError("n argument to diag_indices must be nonnegative, got {}" + .format(n)) + if ndim < 0: + raise ValueError("ndim argument to diag_indices must be nonnegative, got {}" + .format(ndim)) + return (lax.iota(int_, n),) * ndim @_wraps(onp.diagonal) def diagonal(a, offset=0, axis1=0, axis2=1): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index d4d27b76b165..241bc8cf2408 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1065,6 +1065,16 @@ def testTriLU(self, dtype, shape, op, k, rng_factory): self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_ndim={}_n={}".format(ndim, n), + "ndim": ndim, "n": n} + for ndim in [0, 1, 4] + for n in [0, 1, 7])) + def testDiagIndices(self, ndim, n): + onp.testing.assert_equal(onp.diag_indices(n, ndim), + lnp.diag_indices(n, ndim)) + + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_k={}".format( jtu.format_shape_dtype_string(shape, dtype), k), From 698babf9ec65b5bcbdcabad99a687407f5d13062 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 20 Dec 2019 18:42:33 -0500 Subject: [PATCH 0546/1053] Implement jax.numpy.nonzero and 1-argument jax.numpy.where. (#1905) * Implement jax.numpy.nonzero. * Implement the one-argument form of np.where. * Fix output type and error message. * Add lax_description strings to where and nonzero. --- docs/jax.numpy.rst | 1 + jax/numpy/lax_numpy.py | 40 +++++++++++++++++++++++++++++++++++++--- tests/lax_numpy_test.py | 26 +++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index e19d3888756b..f326988b709d 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -179,6 +179,7 @@ Not every function in NumPy is implemented; contributions are welcome! nansum negative nextafter + nonzero not_equal ones ones_like diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index d6334150620e..6d84fc3b9717 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -999,11 +999,12 @@ def _maybe_numpy_1_13_isclose_behavior(a, out): # The `jit` on `where` exists to avoid materializing constants in cases like # `np.where(np.zeros(1000), 7, 4)`. In op-by-op mode, we don't want to # materialize the broadcast forms of scalar arguments. -@_wraps(onp.where, update_doc=False) @jit -def where(condition, x=None, y=None): +def _where(condition, x=None, y=None): if x is None or y is None: - raise ValueError("Must use the three-argument form of where().") + raise ValueError("Either both or neither of the x and y arguments should " + "be provided to jax.numpy.where, got {} and {}." + .format(x, y)) if not issubdtype(_dtype(condition), bool_): condition = lax.ne(condition, zeros_like(condition)) x, y = _promote_dtypes(x, y) @@ -1011,6 +1012,21 @@ def where(condition, x=None, y=None): return lax.select(condition, x, y) if onp.size(x) else x +_WHERE_DOC = """\ +At present, JAX does not support JIT-compilation of the single-argument form +of :py:func:`jax.numpy.where` because its output shape is data-dependent. The +three-argument form does not have a data-dependent shape and can be JIT-compiled +successfully. +""" + +@_wraps(onp.where, update_doc=False, lax_description=_WHERE_DOC) +def where(condition, x=None, y=None): + if x is None and y is None: + return nonzero(asarray(condition)) + else: + return _where(condition, x, y) + + @_wraps(onp.select) def select(condlist, choicelist, default=0): if len(condlist) != len(choicelist): @@ -1391,6 +1407,24 @@ def count_nonzero(a, axis=None): dtype=dtypes.canonicalize_dtype(onp.int_)) +_NONZERO_DOC = """\ +At present, JAX does not support JIT-compilation of :py:func:`jax.numpy.nonzero` +because its output shape is data-dependent. +""" + +@_wraps(onp.nonzero, lax_description=_NONZERO_DOC) +def nonzero(a): + # Note: this function cannot be jitted because its output has a dynamic + # shape. + a = atleast_1d(a) + dims = shape(a) + ndims = len(dims) + ds = [lax.broadcasted_iota(int_, dims + (1,), i) for i in range(ndims)] + d = concatenate(ds, axis=-1) + indexes = d[a != 0] + return tuple(indexes[..., i] for i in range(ndims)) + + def _make_nan_reduction(onp_reduction, np_reduction, init_val, nan_if_all_nan): @_wraps(onp_reduction) def nan_reduction(a, axis=None, out=None, keepdims=False, **kwargs): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 241bc8cf2408..0120432aa7b1 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -583,6 +583,18 @@ def testCountNonzero(self, shape, dtype, axis): self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype} + for shape in all_shapes for dtype in all_dtypes)) + def testNonzero(self, shape, dtype): + rng = jtu.rand_some_zero() + onp_fun = lambda x: onp.nonzero(x) + lnp_fun = lambda x: lnp.nonzero(x) + args_maker = lambda: [rng(shape, dtype)] + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "{}_inshape={}_axis={}".format( rec.test_name.capitalize(), @@ -1929,6 +1941,18 @@ def onp_fun(*args): self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype} + for shape in all_shapes for dtype in all_dtypes)) + def testWhereOneArgument(self, shape, dtype): + rng = jtu.rand_some_zero() + onp_fun = lambda x: onp.where(x) + lnp_fun = lambda x: lnp.where(x) + args_maker = lambda: [rng(shape, dtype)] + self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format("_".join( jtu.format_shape_dtype_string(shape, dtype) @@ -1937,7 +1961,7 @@ def onp_fun(*args): for shapes in filter(_shapes_are_broadcast_compatible, CombosWithReplacement(all_shapes, 3)) for dtypes in CombosWithReplacement(all_dtypes, 3))) - def testWhere(self, rng_factory, shapes, dtypes): + def testWhereThreeArgument(self, rng_factory, shapes, dtypes): rng = rng_factory() args_maker = self._GetArgsMaker(rng_factory(), shapes, dtypes) def onp_fun(cond, x, y): From 5b4106f533035d7c41b0c139d6751e8dda8c3458 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Sat, 21 Dec 2019 15:30:20 -0800 Subject: [PATCH 0547/1053] Fix typo in scipy.stats.poisson.pmf (#1894) * Fix typo in scipy.stats.poisson.pmf * Add test for Poisson PMF --- jax/scipy/stats/poisson.py | 2 +- tests/scipy_stats_test.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/jax/scipy/stats/poisson.py b/jax/scipy/stats/poisson.py index cc2b74e4e02e..db3fd64483b5 100644 --- a/jax/scipy/stats/poisson.py +++ b/jax/scipy/stats/poisson.py @@ -33,4 +33,4 @@ def logpmf(k, mu, loc=0): @np._wraps(osp_stats.poisson.pmf, update_doc=False) def pmf(k, mu, loc=0): - return np.exp(pmf(k, mu, loc)) + return np.exp(logpmf(k, mu, loc)) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index d3ca8b85c4cb..6701f87281b7 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -69,6 +69,24 @@ def args_maker(): tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + @genNamedParametersNArgs(3, jtu.rand_default) + def testPoissonPmf(self, rng_factory, shapes, dtypes): + rng = rng_factory() + scipy_fun = osp_stats.poisson.pmf + lax_fun = lsp_stats.poisson.pmf + + def args_maker(): + k, mu, loc = map(rng, shapes, dtypes) + k = onp.floor(k) + # clipping to ensure that rate parameter is strictly positive + mu = onp.clip(onp.abs(mu), a_min=0.1, a_max=None) + loc = onp.floor(loc) + return [k, mu, loc] + + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, + tol=1e-3) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + @genNamedParametersNArgs(3, jtu.rand_default) def testBernoulliLogPmf(self, rng_factory, shapes, dtypes): rng = rng_factory() From 0e552ff371bdd59306f09dd4461983493075a3a3 Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Sat, 21 Dec 2019 23:38:33 +0000 Subject: [PATCH 0548/1053] Register collections.defaultdict as a pytree. (#1908) PiperOrigin-RevId: 286732270 --- jax/tree_util.py | 5 +++++ tests/tree_util_tests.py | 2 ++ 2 files changed, 7 insertions(+) diff --git a/jax/tree_util.py b/jax/tree_util.py index 6578a5109666..5877396d4b63 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -205,6 +205,11 @@ def tree_all(tree): lambda x: (list(x.values()), list(x.keys())), lambda keys, values: collections.OrderedDict(safe_zip(keys, values))) +register_pytree_node( + collections.defaultdict, + lambda x: (tuple(x.values()), (x.default_factory, tuple(x.keys()))), + lambda s, values: collections.defaultdict(s[0], safe_zip(s[1], values))) + class Partial(functools.partial): """A version of functools.partial that works in pytrees. diff --git a/tests/tree_util_tests.py b/tests/tree_util_tests.py index 7fe9671c24ab..9d3603dcaa60 100644 --- a/tests/tree_util_tests.py +++ b/tests/tree_util_tests.py @@ -65,6 +65,8 @@ def __repr__(self): ([AnObject(3, None, [4, "foo"])],), ({"a": 1, "b": 2},), (collections.OrderedDict([("foo", 34), ("baz", 101), ("something", -42)]),), + (collections.defaultdict(dict, + [("foo", 34), ("baz", 101), ("something", -42)]),), (ANamedTupleSubclass(foo="hello", bar=3.5),), ] From a14a05d1f241f19482b75423d3d7eb2acea071df Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 22 Dec 2019 22:43:07 -0700 Subject: [PATCH 0549/1053] Support transforms along arbitrary axes with jax.numpy.fft (#1906) * Support transforms along arbitrary axes with jax.numpy.fft Fixes GH-1878 The logic that attempted to check for transformations along non-innermost axes was broken. Rather than fixing it, this PR adds support for these transformations by transposing and untransposing arrays. This adds some overhead over the LAX implementation, but it suspect it is minimal in most cases and it should be worthwhile for the sake of completeness. * Fixes per review --- jax/numpy/fft.py | 19 +++++++++++++++---- tests/fft_test.py | 19 ++++++++++--------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index a0494e617607..8b075197a2ba 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -60,15 +60,26 @@ def _fft_core(func_name, fft_type, a, s, axes, norm): raise ValueError( "%s does not support repeated axes. Got axes %s." % (full_name, axes)) - if any(axis in range(a.ndim - 3) for axis in axes): + if len(axes) > 3: + # XLA does not support FFTs over more than 3 dimensions raise ValueError( - "%s only supports 1D, 2D, and 3D FFTs over the innermost axes." - " Got axes %s with input rank %s." % (full_name, orig_axes, a.ndim)) + "%s only supports 1D, 2D, and 3D FFTs. " + "Got axes %s with input rank %s." % (full_name, orig_axes, a.ndim)) + + # XLA only supports FFTs over the innermost axes, so rearrange if necessary. + if orig_axes is not None: + axes = tuple(range(a.ndim - len(axes), a.ndim)) + a = np.moveaxis(a, orig_axes, axes) if s is None: s = [a.shape[axis] for axis in axes] + a = _promote_to_complex(a) - return lax.fft(a, fft_type, s) + transformed = lax.fft(a, fft_type, s) + + if orig_axes is not None: + transformed = np.moveaxis(transformed, axes, orig_axes) + return transformed @_wraps(onp.fft.fftn) diff --git a/tests/fft_test.py b/tests/fft_test.py index e5702686a35a..0ab042f19f87 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -16,6 +16,7 @@ from __future__ import division from __future__ import print_function +import itertools import unittest import numpy as onp @@ -44,9 +45,12 @@ def _get_fftn_test_axes(shape): axes = [[]] ndims = len(shape) # XLA's FFT op only supports up to 3 innermost dimensions. - if ndims <= 3: axes.append(None) + if ndims <= 3: + axes.append(None) for naxes in range(1, min(ndims, 3) + 1): - axes.append(range(ndims - naxes, ndims)) + axes.extend(itertools.combinations(range(ndims), naxes)) + for index in range(1, ndims + 1): + axes.append((-index,)) return axes @@ -90,20 +94,17 @@ def testFftnErrors(self, inverse): func = np.fft.ifftn if inverse else np.fft.fftn self.assertRaisesRegex( ValueError, - "jax.np.fft.{} only supports 1D, 2D, and 3D FFTs over the innermost axes. " + "jax.np.fft.{} only supports 1D, 2D, and 3D FFTs. " "Got axes None with input rank 4.".format(name), lambda: func(rng([2, 3, 4, 5], dtype=onp.float64), axes=None)) - self.assertRaisesRegex( - ValueError, - "jax.np.fft.{} only supports 1D, 2D, and 3D FFTs over the innermost axes. " - "Got axes \\[0\\] with input rank 4.".format(name), - lambda: func(rng([2, 3, 4, 5], dtype=onp.float64), axes=[0])) self.assertRaisesRegex( ValueError, "jax.np.fft.{} does not support repeated axes. Got axes \\[1, 1\\].".format(name), lambda: func(rng([2, 3], dtype=onp.float64), axes=[1, 1])) self.assertRaises( - IndexError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[2])) + ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[2])) + self.assertRaises( + ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[-3])) if __name__ == "__main__": From 0f2e08dd9d41f9fb5ff26106fdf232286c6b5b39 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 23 Dec 2019 11:49:01 -0800 Subject: [PATCH 0550/1053] in remat, handle hoisted outputs in out_avals In remat's partial_eval rule, we form a TypedJaxpr and hence need to set its output avals (modeling its output type). Since jaxprs are currently untyped, the logic looks at the Python output values returned by call bind to get their types. However, some of the output types might not correspond to value types in the jaxpr language; for example, instances of ad_util.Zero can be returned from a call bind. (In the past we've only formed TypedJaxprs in "initial-style" control-flow primitives, which don't have this possibility because there's no call bind involved.) We handle this possibility just by inspecting the jaxpr first before looking at the Python-valued outputs: wherever a non-jaxtype value has been hoisted out, a corresponding unit exists in the jaxpr outvars. So the logic is now: if the output has an abstract value from partial evaluation, use that to get the output type; otherwise if the output is a literal or unitvar, use that to get the output type; otherwise look at the const from partial evaluation (and it's an error if that const isn't a valid jaxtype). fixes #1907 --- jax/interpreters/partial_eval.py | 9 ++++++--- tests/api_test.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index aa35777f3239..eda7a648000f 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -524,8 +524,11 @@ def _remat_partial_eval(trace, f, tracers, params): jaxpr_converted = convert_freevars_jaxpr(jaxpr) in_avals = ([raise_to_shaped(t.pval[0]) for t in env] + [raise_to_shaped(pv) for pv in in_pvs]) - out_avals = [raise_to_shaped(pv if pv is not None else core.get_aval(const)) - for pv, const in zip(out_pvs, out_pval_consts1)] + out_avals = [raise_to_shaped(pv if pv is not None + else abstract_unit if var is unitvar + else get_aval(var.val) if type(var) is Literal + else get_aval(const)) + for var, pv, const in zip(jaxpr.outvars, out_pvs, out_pval_consts1)] typed_jaxpr = core.TypedJaxpr(jaxpr_converted, consts, in_avals, out_avals) in_unknowns = [t.pval[0] is not None for t in it.chain(env, tracers)] jaxpr_1, jaxpr_2, out_unknowns = partial_eval_jaxpr(typed_jaxpr, in_unknowns, False) @@ -565,7 +568,7 @@ def _dce_jaxpr(typed_jaxpr, outputs): # TODO(mattjj): better DCE jaxpr = typed_jaxpr.jaxpr outvars, out_avals = jaxpr.outvars, typed_jaxpr.out_avals - out_pairs = [(var, aval) if output else (core.unitvar, core.abstract_unit) + out_pairs = [(var, aval) if output else (unitvar, core.abstract_unit) for var, aval, output in zip(outvars, out_avals, outputs)] new_outvars, new_out_avals = unzip2(out_pairs) diff --git a/tests/api_test.py b/tests/api_test.py index 0fdc046a0df5..3dc11bc75f5c 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1533,6 +1533,35 @@ def binom_checkpoint(funs): self.assertAllClose(f1(x), f2(x), check_dtypes=False) self.assertAllClose(api.grad(f1)(x), api.grad(f2)(x), check_dtypes=False) + def test_remat_symbolic_zeros(self): + # code from https://github.com/google/jax/issues/1907 + test_remat = True + test_scan = True + + key = jax.random.PRNGKey(0) + key, split = jax.random.split(key) + n = 5 + + def func(D0): + def shift(R, dR, **unused_kwargs): + return R + dR + + def apply_fn(R): + return D0 * R + + Rinit = jax.random.uniform(split, (n,3), minval=0.0, maxval=5.0, + dtype=np.float32) + + def move(R,i): + F = apply_fn(R) + return shift(R, 0.001 * F), np.array([0.]) + + move = api.remat(move) + R, temp = lax.scan(move, Rinit, np.arange(2)) + return R[0, 0] + + api.grad(func)(5.0) # doesn't crash + def test_trivial_computations(self): x = np.array([1, 2, 3]) y = api.jit(lambda x: x)(x) From c75bf4ab72503314a092c707f264dfb2552d530b Mon Sep 17 00:00:00 2001 From: fehiepsi Date: Mon, 23 Dec 2019 23:02:08 -0500 Subject: [PATCH 0551/1053] make beta sampler faster --- jax/random.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index 2858d53ac38a..a56133616a94 100644 --- a/jax/random.py +++ b/jax/random.py @@ -618,7 +618,6 @@ def beta(key, a, b, shape=None, dtype=onp.float64): dtype = dtypes.canonicalize_dtype(dtype) return _beta(key, a, b, shape, dtype) -@partial(jit, static_argnums=(3, 4)) def _beta(key, a, b, shape, dtype): if shape is None: shape = lax.broadcast_shapes(onp.shape(a), onp.shape(b)) @@ -628,6 +627,8 @@ def _beta(key, a, b, shape, dtype): a = lax.convert_element_type(a, dtype) b = lax.convert_element_type(b, dtype) key_a, key_b = split(key) + a = np.broadcast_to(a, shape) + b = np.broadcast_to(b, shape) gamma_a = gamma(key_a, a, shape, dtype) gamma_b = gamma(key_b, b, shape, dtype) return gamma_a / (gamma_a + gamma_b) From 3bf12f6ecde817f8e8f2c8ec6c6d7bc9e1a2a0b0 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 24 Dec 2019 11:16:42 -0800 Subject: [PATCH 0552/1053] update readme jaxlib version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61c7b6ebe22b..41353eb4d853 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.36-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.37-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From a3eb2b1b9687593ac45b71082330c0782b066bc6 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 24 Dec 2019 18:59:06 -0800 Subject: [PATCH 0553/1053] improve computation-follows-data policy fixes #1914 (see discussion there) The new policy is that JAX's DeviceArrays, which are backed by device memory but potentially on different devices (like distinct GPUs, or CPU and GPU), can either be "stuck" to their device or not (i.e. "sticky" or not). A DeviceArray result is stuck to its device if 1. it was produced by a computation with an explicit user-provided device or backend label, i.e. a `jit` or `device_put` with an explicit device or backend argument, or 2. it was produced by a computation that consumed as an argument a sticky DeviceArray value. If a computation without an explicit device/backend label is applied to all non-sticky arguments, the result is non-sticky. If a computation without an explicit device/backend label is applied to any sticky arguments, then if all the sticky device labels agree the result is sticky on the same device, and otherwise an error is raised. (A computation with an explicit device/backend label can consume any sticky or non-sticky values without error, regardless of their devices.) Implementation-wise, every DeviceArray has an attribute _device (introduced in #1884, revised here) that set either to a value that represents a Device instance (actually stored as a Device class / int id pair), indicating that the DeviceArray is sticky on that device, or None indicating that the DeviceArray is not sticky. The value of the _device attribute for results of a computation is computed when the XLA executable is compiled and stored in the result handler (which packages up a raw device buffer into a DeviceArray). --- jax/interpreters/pxla.py | 2 +- jax/interpreters/xla.py | 122 +++++++++++++++++++++++-------------- tests/fft_test.py | 3 +- tests/multi_device_test.py | 68 ++++++++++++++++++--- tests/multibackend_test.py | 16 +++++ 5 files changed, 154 insertions(+), 57 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 3a87280146f9..94d0a6f55d3e 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -360,7 +360,7 @@ def __getitem__(self, idx): ids = self._ids() device_buffer = self.device_buffers[ids[idx]] aval = ShapedArray(self.aval.shape[1:], self.aval.dtype) - handler = xla.aval_to_result_handler(aval) + handler = xla.aval_to_result_handler(None, aval) return handler(device_buffer) else: return super(ShardedDeviceArray, self).__getitem__(idx) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index bfb0ac933d67..4e6c59654db9 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -70,14 +70,15 @@ def aval_to_xla_shape(aval): xla_shape_handlers[ShapedArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) xla_shape_handlers[ConcreteArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) -def aval_to_result_handler(aval): +def aval_to_result_handler(device, aval): try: - return xla_result_handlers[type(aval)](aval) + return xla_result_handlers[type(aval)](device, aval) except KeyError: raise TypeError("No xla_result_handler for type: {}".format(type(aval))) xla_result_handlers = {} -xla_result_handlers[core.AbstractUnit] = lambda _: lambda _: core.unit -def array_result_handler(aval): return partial(DeviceArray, raise_to_shaped(aval)) +xla_result_handlers[core.AbstractUnit] = lambda _, __: lambda _: core.unit +def array_result_handler(device, aval): + return partial(DeviceArray, raise_to_shaped(aval), device) xla_result_handlers[ShapedArray] = array_result_handler xla_result_handlers[ConcreteArray] = array_result_handler @@ -147,11 +148,6 @@ def _make_abstract_python_scalar(typ, _): ### op-by-op execution -def apply_primitive(prim, *args, **params): - """Impl rule that compiles and runs a single primitive 'prim' using XLA.""" - compiled_fun = xla_primitive_callable(prim, *map(arg_spec, args), **params) - return compiled_fun(*args) - def arg_spec(x): aval = abstractify(x) try: @@ -159,33 +155,51 @@ def arg_spec(x): except: return aval, None +def apply_primitive(prim, *args, **params): + """Impl rule that compiles and runs a single primitive 'prim' using XLA.""" + compiled_fun = xla_primitive_callable(prim, *map(arg_spec, args), **params) + return compiled_fun(*args) + @cache() def xla_primitive_callable(prim, *arg_specs, **params): - avals, devices = unzip2(arg_specs) - # TODO(mattjj): make Device hashable instead of handling pairs here - try: - device, = set(d for d in devices if d is not None) or (None,) - except ValueError: - msg = "primitive arguments must be colocated on the same device, got {}" - names = ("{}({})".format(d[0].__name__, d[1]) for d in devices if d is not None) - raise ValueError(msg.format(", ".join(names))) - else: - all_devices = it.chain(xb.devices(), xb.devices('cpu')) - device = device and next(d for d in all_devices if (type(d), d.id) == device) + avals, arg_devices = unzip2(arg_specs) + device = _device_from_arg_devices(arg_devices) backend = xb.get_device_backend(device) aval_out = prim.abstract_eval(*avals, **params) - if prim.multiple_results: - handlers = tuple(map(aval_to_result_handler, aval_out)) - handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) + if not prim.multiple_results: + handle_result = aval_to_result_handler(device, aval_out) else: - handle_result = aval_to_result_handler(aval_out) + handlers = tuple(map(partial(aval_to_result_handler, device), aval_out)) + handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) tuple_args = len(avals) > 100 built_c = primitive_computation(prim, backend, tuple_args, *avals, **params) - options = xb.get_compile_options(device_assignment=(device.id,) if device else None) + options = xb.get_compile_options(device_assignment=device and (device.id,)) compiled = built_c.Compile(compile_options=options, backend=backend) return partial(_execute_compiled_primitive, prim, compiled, backend, tuple_args, handle_result) +# TODO(mattjj): make Device instances hashable instead of handling pairs here +def _device_from_arg_devices(devices): + """Given devices of inputs, determine where to perform a computation. + + Args: + devices: list where each element is a either a pair consisting of a device + class and an int id (representing a Device instance) or a None. + Returns: + A Device instance or None. + Raises: + ValueError if input devices are inconsistent. + """ + try: + device, = set(d for d in devices if d is not None) or (None,) + except ValueError: + msg = "primitive arguments must be colocated on the same device, got {}" + names = ("{}({})".format(d[0].__name__, d[1]) for d in devices if d is not None) + raise ValueError(msg.format(", ".join(names))) + else: + all_devices = it.chain(xb.devices(), xb.devices('cpu')) + return device and next(d for d in all_devices if (type(d), d.id) == device) + @cache() def primitive_computation(prim, backend, tuple_args, *avals, **params): c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) @@ -425,7 +439,7 @@ def eqn_collectives(eqn): def _xla_call_impl(fun, *args, **params): device = params['device'] backend = params['backend'] - compiled_fun = _xla_callable(fun, device, backend, *map(abstractify, args)) + compiled_fun = _xla_callable(fun, device, backend, *map(arg_spec, args)) try: return compiled_fun(*args) except FloatingPointError: @@ -434,33 +448,38 @@ def _xla_call_impl(fun, *args, **params): return fun.call_wrapped(*args) # probably won't return @lu.cache -def _xla_callable(fun, device, backend, *abstract_args): +def _xla_callable(fun, device, backend, *arg_specs): + if device is not None and backend is not None: + raise ValueError("can't specify both a device and a backend for jit, " + "got device={} and backend={}".format(device, backend)) + + abstract_args, arg_devices = unzip2(arg_specs) pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] with core.new_master(pe.StagingJaxprTrace, True) as master: jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) assert not env # no subtraces here del master, env _map(prefetch, it.chain(consts, jaxpr_literals(jaxpr))) - result_handlers = tuple(map(_pval_to_result_handler, pvals)) + + nreps = jaxpr_replicas(jaxpr) + device = _xla_callable_device(nreps, backend, device, arg_devices) + result_handlers = tuple(map(partial(_pval_to_result_handler, device), pvals)) # Computations that only produce constants and/or only rearrange their inputs, # which are often produced from partial evaluation, don't need compilation, # and don't need to force their (potentially lazy) arguments. if not jaxpr.eqns: - device = _get_device(device, backend) + device = device or xb.get_backend(None).get_default_device_assignment(1)[0] return partial(_execute_trivial, jaxpr, device, consts, result_handlers) log_priority = logging.WARNING if FLAGS.jax_log_compiles else logging.DEBUG logging.log(log_priority, "Compiling {} for args {}.".format(fun.__name__, abstract_args)) - nreps = jaxpr_replicas(jaxpr) if nreps > xb.device_count(backend): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") raise ValueError(msg.format(nreps, xb.device_count(backend))) - axis_env = AxisEnv(nreps, [], []) - if xb.host_count() > 1 and (nreps > 1 or jaxpr_has_pmap(jaxpr)): raise NotImplementedError( "jit of multi-host pmap not implemented (and jit-of-pmap can cause " @@ -471,11 +490,10 @@ def _xla_callable(fun, device, backend, *abstract_args): c = xb.make_computation_builder("jit_{}".format(fun.__name__)) xla_consts = _map(c.Constant, consts) xla_args = _xla_callable_args(c, abstract_args, tuple_args) - out_nodes = jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, (), *xla_args) + out_nodes = jaxpr_subcomp(c, jaxpr, backend, AxisEnv(nreps, [], []), + xla_consts, (), *xla_args) built = c.Build(c.Tuple(*out_nodes)) - if device is not None and nreps > 1: - raise ValueError("can't specify device assignment for jit-of-pmap") options = xb.get_compile_options( num_replicas=nreps, device_assignment=(device.id,) if device else None) compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) @@ -485,6 +503,22 @@ def _xla_callable(fun, device, backend, *abstract_args): else: return partial(_execute_replicated, compiled, backend, result_handlers, tuple_args) +def _xla_callable_device(nreps, backend, device, arg_devices): + if nreps > 1: + if device is not None or backend is not None: + raise ValueError("can't specify device or backend for jit-of-pmap, " + "got device={} and backend={}".format(device, backend)) + return None + else: + if device is None and backend is None: + return _device_from_arg_devices(arg_devices) + elif device is not None and backend is None: + return device + elif device is None and backend is not None: + return xb.get_backend(backend).get_default_device_assignment(1)[0] + else: + assert False # Unreachable given the error check in _xla_callable + def _xla_callable_args(c, avals, tuple_args): if not tuple_args: xla_args = [c.ParameterWithShape(aval_to_xla_shape(a)) @@ -499,12 +533,12 @@ def _xla_callable_args(c, avals, tuple_args): assert next(xla_inputs, None) is None return xla_args -def _pval_to_result_handler(pval): +def _pval_to_result_handler(device, pval): pv, const = pval if pv is None: return lambda _: const else: - return aval_to_result_handler(pv) + return aval_to_result_handler(device, pv) def _execute_compiled(compiled, backend, handlers, tuple_args, *args): device, = compiled.local_devices() @@ -631,7 +665,7 @@ class Token(object): pass pytype_aval_mappings[Token] = lambda _: abstract_token core.pytype_aval_mappings[Token] = lambda _: abstract_token xla_shape_handlers[AbstractToken] = lambda _: xc.Shape.token_shape() -xla_result_handlers[AbstractToken] = lambda _: lambda _: token +xla_result_handlers[AbstractToken] = lambda _, __: lambda _: token canonicalize_dtype_handlers[Token] = identity @@ -671,11 +705,9 @@ class DeviceArray(DeviceValue): __slots__ = ["_npy_value", "_device"] __array_priority__ = 100 - def __init__(self, aval, device_buffer): + def __init__(self, aval, device, device_buffer): self.aval = aval self.device_buffer = device_buffer - # TODO(mattjj): make Device hashable - device = device_buffer.device() self._device = device and (type(device), device.id) self._npy_value = None @@ -835,7 +867,7 @@ def _device_put_impl(x, device=None): except TypeError: raise TypeError("Argument '{}' of type {} is not a valid JAX type" .format(x, type(x))) - handler = aval_to_result_handler(a) + handler = aval_to_result_handler(device, a) return handler(device_put(x, device)) device_put_p = core.Primitive('device_put') @@ -887,13 +919,13 @@ def _instantiate_device_constant(const, device=None, backend=None, cutoff=1e6): # dispatch an XLA Computation to build the constant on the device if it's # large, or alternatively build it on the host and transfer it if it's small assert isinstance(const, DeviceConstant) + backend = xb.get_backend(device.platform) if device else xb.get_backend(backend) if const.size > cutoff: c = xb.make_computation_builder("constant_instantiating_computation") xla_const = const.constant_handler(c, const) device_assignment = (device.id,) if device else None opts = xb.get_compile_options(device_assignment=device_assignment) - compiled = c.Build(xla_const).Compile((), opts, backend=xb.get_backend(backend)) + compiled = c.Build(xla_const).Compile((), opts, backend=backend) return compiled.Execute(()) else: - return xc.Buffer.from_pyval(onp.asarray(const), device, - backend=xb.get_backend(backend)) + return xc.Buffer.from_pyval(onp.asarray(const), device, backend=backend) diff --git a/tests/fft_test.py b/tests/fft_test.py index 0ab042f19f87..188404a90317 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -79,8 +79,7 @@ def testFftn(self, inverse, shape, dtype, axes, rng_factory): self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) # Test gradient for differentiable types. if dtype in inexact_dtypes: - # TODO(skye): can we be more precise? - tol = 1e-1 + tol = 0.15 # TODO(skye): can we be more precise? jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) diff --git a/tests/multi_device_test.py b/tests/multi_device_test.py index babb10cecc00..4c212b7c5eac 100644 --- a/tests/multi_device_test.py +++ b/tests/multi_device_test.py @@ -62,30 +62,77 @@ def test_computation_follows_data(self): if len(jax.devices()) < 2: raise SkipTest("test requires multiple devices") + # computation follows data explicitly placed on device 1 + x = jax.device_put(1, jax.devices()[1]) + y = x.reshape((1, 1)) + self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + z = y.reshape((1, 1)) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + + # multiple arguments explicitly placed on device 0 are compatible x = jax.device_put(1, jax.devices()[0]) y = jax.device_put(2, jax.devices()[0]) z = x + y self.assertEqual(z, 3) self.assertEqual(z.device_buffer.device(), jax.devices()[0]) + w = z + x + self.assertEqual(w.device_buffer.device(), jax.devices()[0]) + f = jax.jit(lambda x: x + 1, device=jax.devices()[0]) + z = f(1) + f(2) + self.assertEqual(z, 5) + self.assertEqual(z.device_buffer.device(), jax.devices()[0]) + w = z + z + self.assertEqual(z.device_buffer.device(), jax.devices()[0]) + + # multiple arguments explicitly placed on device 1 are compatible x = jax.device_put(1, jax.devices()[1]) y = jax.device_put(2, jax.devices()[1]) z = x + y self.assertEqual(z, 3) self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + w = z + x + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) - x = jax.device_put(1, jax.devices()[1]) - y = 4 - z = x + y + f = jax.jit(lambda x: x + 1, device=jax.devices()[1]) + z = f(1) + f(2) self.assertEqual(z, 5) self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + w = z + z + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) - x = jax.device_put(1, jax.devices()[1]) - y = np.ones(3) - z = x + y + # an argument explicitly placed on one device still works with values that + # aren't device-committed (and computaiton follows device-committed values) + z = jax.device_put(1., jax.devices()[1]) + 4 + self.assertEqual(z, 5.) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + w = z + 3 + self.assertEqual(w, 8.) + self.assertEqual(w.device_buffer.device(), jax.devices()[1]) + + z = jax.device_put(1., jax.devices()[1]) + np.ones(3) self.assertAllClose(z, 1 + onp.ones(3), check_dtypes=False) self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + w = z - 3 + self.assertAllClose(w, 1 + onp.ones(3) - 3, check_dtypes=False) + self.assertEqual(w.device_buffer.device(), jax.devices()[1]) + + z = jax.device_put(1., jax.devices()[1]) + np.array([1, 2]) + self.assertAllClose(z, 1 + onp.array([1, 2]), check_dtypes=False) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + w = z * 2 + self.assertAllClose(w, (1 + onp.array([1, 2])) * 2, check_dtypes=False) + self.assertEqual(w.device_buffer.device(), jax.devices()[1]) + + z = jax.device_put(1., jax.devices()[1]) + jax.device_put(2) + self.assertAllClose(z, 3., check_dtypes=False) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + + z = jax.device_put(1., jax.devices()[1]) + jax.jit(lambda x: x + 1)(3) + self.assertAllClose(z, 5., check_dtypes=False) + self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + # multiple arguments explicitly placed on distinct devices cause errors x = jax.device_put(1, jax.devices()[0]) y = jax.device_put(2, jax.devices()[1]) self.assertRaisesRegex( @@ -93,9 +140,12 @@ def test_computation_follows_data(self): "primitive arguments must be colocated on the same device", lambda: x + y) - x = jax.device_put(1, jax.devices()[1]) - y = x.reshape((1, 1)) - self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + f = jax.jit(lambda x: x + 1, device=jax.devices()[0]) + g = jax.jit(lambda x: x + 1, device=jax.devices()[1]) + self.assertRaisesRegex( + ValueError, + "primitive arguments must be colocated on the same device", + lambda: f(1) + g(2)) def test_primitive_compilation_cache(self): if len(jax.devices()) < 2: diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 93c3b06a53bb..7f54e45d75e7 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -123,6 +123,22 @@ def fun(x, y): self.assertEqual(z.device_buffer.platform(), backend) self.assertEqual(w.device_buffer.platform(), backend) + @jtu.skip_on_devices("cpu") # test can only fail with non-cpu backends + def testJitCpu(self): + @partial(api.jit, backend='cpu') + def get_arr(scale): + return scale + np.ones((2, 2)) + + x = get_arr(0.1) + + a = x / x.shape[0] + b = x + np.ones_like(x) + c = x + np.eye(2) + + self.assertEqual(a.device_buffer.device(), api.devices('cpu')[0]) + self.assertEqual(b.device_buffer.device(), api.devices('cpu')[0]) + self.assertEqual(c.device_buffer.device(), api.devices('cpu')[0]) + if __name__ == "__main__": absltest.main() From edf0e61bc913d0978ca1a7248b9dfe2d05193450 Mon Sep 17 00:00:00 2001 From: fehiepsi Date: Thu, 26 Dec 2019 22:43:06 -0500 Subject: [PATCH 0554/1053] support nested vmap for gamma sampler --- jax/random.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/jax/random.py b/jax/random.py index a56133616a94..4a7341bf822c 100644 --- a/jax/random.py +++ b/jax/random.py @@ -45,6 +45,7 @@ from jax.interpreters import batching from jax.interpreters import partial_eval as pe from jax.interpreters import xla +from jax.util import prod def PRNGKey(seed): @@ -888,18 +889,18 @@ def _gamma_grad(sample, a): return grads.reshape(onp.shape(a)) def _gamma_impl(key, a): - if key.ndim == 2: # batch of keys and alphas - size = np.size(a[0]) - key = vmap(split, in_axes=(0, None))(key, size) - else: - key = split(key, np.size(a)) - alphas = np.reshape(a, -1) + a_shape = np.shape(a) + # split key to match the shape of a + key_ndim = np.ndim(key) - 1 + key = np.reshape(key, (-1, 2)) + key = vmap(split, in_axes=(0, None))(key, prod(a_shape[key_ndim:])) keys = np.reshape(key, (-1, 2)) + alphas = np.reshape(a, -1) if xla_bridge.get_backend().platform == 'cpu': samples = lax.map(lambda args: _gamma_one(*args), (keys, alphas)) else: samples = vmap(_gamma_one)(keys, alphas) - return np.reshape(samples, np.shape(a)), + return np.reshape(samples, a_shape), def _gamma_batching_rule(batched_args, batch_dims): k, a = batched_args From 30bede1f6af5f147e379c5c5679172730f3767fa Mon Sep 17 00:00:00 2001 From: David Bieber Date: Fri, 27 Dec 2019 14:02:06 -0500 Subject: [PATCH 0555/1053] fix typo in autodiff cookbook (#1921) --- docs/notebooks/autodiff_cookbook.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index 301756af368e..0ba9c9ba313f 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -446,7 +446,7 @@ "\n", "$\\qquad \\partial^2 f (x) v = \\partial [x \\mapsto \\partial f(x) \\cdot v] = \\partial g(x)$,\n", "\n", - "where $g(x) = \\partial f(x) \\cdot v$ is a new scalar-valued function that dots the gradient of $f$ at $x$ with the vector $v$. Nottice that we're only ever differentiating scalar-valued functions of vector-valued arguments, which is exactly where we know `grad` is efficient.\n", + "where $g(x) = \\partial f(x) \\cdot v$ is a new scalar-valued function that dots the gradient of $f$ at $x$ with the vector $v$. Notice that we're only ever differentiating scalar-valued functions of vector-valued arguments, which is exactly where we know `grad` is efficient.\n", "\n", "In JAX code, we can just write this:" ] From f5723848d349488edd27f1a8ad663f9d999ddab0 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Dec 2019 07:36:36 -0800 Subject: [PATCH 0556/1053] fix error in autodiff cookbook: 3x not 2x --- docs/notebooks/autodiff_cookbook.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index 0ba9c9ba313f..a40a66b85ea8 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -774,7 +774,7 @@ "source": [ "The `jvp`-transformed function is evaluated much like the original function, but paired up with each primal value of type `a` it pushes along tangent values of type `T a`. For each primitive numerical operation that the original function would have applied, the `jvp`-transformed function executes a \"JVP rule\" for that primitive that both evaluates the primitive on the primals and applies the primitive's JVP at those primal values.\n", "\n", - "That evaluation strategy has some immediate implications about computational complexity: since we evaluate JVPs as we go, we don't need to store anything for later, and so the memory cost is independent of the depth of the computation. In addition, the FLOP cost of the `jvp`-transformed function is about 2x the cost of just evaluating the function. Put another way, for a fixed primal point $x$, we can evaluate $v \\mapsto \\partial f(x) \\cdot v$ for about the same cost as evaluating $f$.\n", + "That evaluation strategy has some immediate implications about computational complexity: since we evaluate JVPs as we go, we don't need to store anything for later, and so the memory cost is independent of the depth of the computation. In addition, the FLOP cost of the `jvp`-transformed function is about 3x the cost of just evaluating the function (one unit of work for evaluating the original function, for example `sin(x)`; one unit for linearizing, like `cos(x)`; and one unit for applying the linearized function to a vector, like `cos_x * v`). Put another way, for a fixed primal point $x$, we can evaluate $v \\mapsto \\partial f(x) \\cdot v$ for about the same marginal cost as evaluating $f$.\n", "\n", "That memory complexity sounds pretty compelling! So why don't we see forward-mode very often in machine learning?\n", "\n", @@ -860,7 +860,7 @@ "\n", "where we use `CT a` to denote the type for the cotangent space for `a`. In words, `vjp` takes as arguments a function of type `a -> b` and a point of type `a`, and gives back a pair consisting of a value of type `b` and a linear map of type `CT b -> CT a`.\n", "\n", - "This is great because it lets us build Jacobian matrices one row at a time, and the FLOP cost for evaluating $(x, v) \\mapsto (f(x), v^\\mathsf{T} \\partial f(x))$ is only about twice the cost of evaluating $f$. In particular, if we want the gradient of a function $f : \\mathbb{R}^n \\to \\mathbb{R}$, we can do it in just one call. That's how `grad` is efficient for gradient-based optimization, even for objectives like neural network training loss functions on millions or billions of parameters.\n", + "This is great because it lets us build Jacobian matrices one row at a time, and the FLOP cost for evaluating $(x, v) \\mapsto (f(x), v^\\mathsf{T} \\partial f(x))$ is only about three times the cost of evaluating $f$. In particular, if we want the gradient of a function $f : \\mathbb{R}^n \\to \\mathbb{R}$, we can do it in just one call. That's how `grad` is efficient for gradient-based optimization, even for objectives like neural network training loss functions on millions or billions of parameters.\n", "\n", "There's a cost, though: though the FLOPs are friendly, memory scales with the depth of the computation. Also, the implementation is traditionally more complex than that of forward-mode, though JAX has some tricks up its sleeve (that's a story for a future notebook!).\n", "\n", From e0693fe64978a2419236e339d9f8fea2964ee4f2 Mon Sep 17 00:00:00 2001 From: flowed Date: Wed, 25 Dec 2019 03:55:04 +0000 Subject: [PATCH 0557/1053] Fix Typos --- docs/conf.py | 2 +- docs/notebooks/JAX_pytrees.ipynb | 2 +- docs/notebooks/score_matching.ipynb | 6 +++--- jax/experimental/vectorize.py | 2 +- jax/tools/jax_to_hlo.py | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 06268367ea9b..2a8d2f6f5b71 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,7 +101,7 @@ autosummary_generate = True -napolean_use_rtype = False +napoleon_use_rtype = False # -- Options for nbsphinx ----------------------------------------------------- diff --git a/docs/notebooks/JAX_pytrees.ipynb b/docs/notebooks/JAX_pytrees.ipynb index f53cc3baf47a..2f6128bc4f99 100644 --- a/docs/notebooks/JAX_pytrees.ipynb +++ b/docs/notebooks/JAX_pytrees.ipynb @@ -261,7 +261,7 @@ " a pair of an iterable with the children to be flattened recursively,\n", " and some opaque auxiliary data to pass back to the unflattening recipe.\n", " The auxiliary data is stored in the treedef for use during unflattening.\n", - " The auxiliary data could be used, e.g., for dictionay keys.\n", + " The auxiliary data could be used, e.g., for dictionary keys.\n", " \"\"\"\n", " children = (v.x, v.y)\n", " aux_data = None\n", diff --git a/docs/notebooks/score_matching.ipynb b/docs/notebooks/score_matching.ipynb index 9d58ab5d5839..21aa13df819f 100644 --- a/docs/notebooks/score_matching.ipynb +++ b/docs/notebooks/score_matching.ipynb @@ -191,7 +191,7 @@ "colab_type": "text" }, "source": [ - "__Note__: we use `jax.jacfwd` since the input dimention is only 2" + "__Note__: we use `jax.jacfwd` since the input dimension is only 2" ] }, { @@ -392,7 +392,7 @@ "$$\\hat x_{t+1} := \\hat x_t + \\frac \\epsilon 2 \\nabla_{\\hat x_t} log p(\\hat x_t) + \\sqrt \\epsilon z_t, \\quad z_t \\sim N(0, I)$$\n", "\n", "\n", - "Performing this update multiple times in an MCMC fashion is a special case of Langevin Dynamics. Under $\\epsilon \\rightarrow 0, t \\rightarrow \\inf$: $\\hat x_t$ converges to a sample from $p(x)$. You can find a more detailed explanation and a formal proof in [Welling et al. (2011)](https://www.ics.uci.edu/~welling/publications/papers/stoclangevin_v6.pdf) and further exploration of SGLD in [Teh et al. (2014)](https://arxiv.org/abs/1409.0578) and [Vollmer et al. (2015)](https://arxiv.org/abs/1501.00438).\n", + "Performing this update multiple times in an MCMC fashion is a special case of Langevin Dynamics. Under $\\epsilon \\rightarrow 0, t \\rightarrow \\inf$: $\\hat x_t$ converges to a sample from $p(x)$. You can find a more detailed explanation and a formal proof in [Welling et al. (2011)](https://www.ics.uci.edu/~welling/publications/papers/stoclangevin_v6.pdf) and further exploration of SGLD in [The et al. (2014)](https://arxiv.org/abs/1409.0578) and [Vollmer et al. (2015)](https://arxiv.org/abs/1501.00438).\n", "\n", "In practice, we can initialize $x_0$ from some initial guess (e.g. uniform distribution over data space) and $\\epsilon$ to some positive value. As the sampling progresses, we can anneal $\\epsilon$ it until we are satisfied with the samples. Okay, now let's go implement that :)" ] @@ -496,7 +496,7 @@ "source": [ "### Sliced Score Matching\n", "\n", - "Now the problem with our previous loss function is that the computation of $tr(\\mathbf{J}_x [\\space model(x)])$ takes a $O(N^2 + N)$ time to compute, thus not being suitable for high-dimentional problems. The solution is using jacobian vector products which can be easily computed using forward mode auto-differentiation. This method is called Sliced Score Matching and was proposed by [Yang Song et al. (2019)](https://arxiv.org/abs/1905.07088).\n", + "Now the problem with our previous loss function is that the computation of $tr(\\mathbf{J}_x [\\space model(x)])$ takes a $O(N^2 + N)$ time to compute, thus not being suitable for high-dimensional problems. The solution is using jacobian vector products which can be easily computed using forward mode auto-differentiation. This method is called Sliced Score Matching and was proposed by [Yang Song et al. (2019)](https://arxiv.org/abs/1905.07088).\n", "\n", "Our new objective looks like this:\n", "\n", diff --git a/jax/experimental/vectorize.py b/jax/experimental/vectorize.py index 422fdedeb0e1..147cd3f4df49 100644 --- a/jax/experimental/vectorize.py +++ b/jax/experimental/vectorize.py @@ -235,7 +235,7 @@ def reorder_outputs(result, axis, output_core_dims): def vectorize(signature): """Vectorize a function using JAX. - Turns an abritrary function into a numpy style "gufunc". Once + Turns an arbitrary function into a numpy style "gufunc". Once you specify the behavior of the core axis, the rest will be broadcast naturally. diff --git a/jax/tools/jax_to_hlo.py b/jax/tools/jax_to_hlo.py index 362f70ebde87..e8b315af867c 100644 --- a/jax/tools/jax_to_hlo.py +++ b/jax/tools/jax_to_hlo.py @@ -50,7 +50,7 @@ def fn(x, y, z): Values of `constants` which are lists are converted to Numpy arrays using np.asarray. In addition, you can specify constants using the flag --evaled_constants; values there that are strings are first evaluated using -ast.literal_eval. --evaled_constants is primarly useful for genrules; Skylark +ast.literal_eval. --evaled_constants is primarily useful for genrules; Skylark doesn't support floating-point types, so genrules need to deal in strings. Note that XLA's backwards-compatibility guarantees for saved HLO are currently From 322ebe7c9b3738fae0ecd4f6eb338af4d5f2f8c1 Mon Sep 17 00:00:00 2001 From: Yo <58630804+yoverflow@users.noreply.github.com> Date: Fri, 27 Dec 2019 09:09:31 +0530 Subject: [PATCH 0558/1053] Update docs/conf.py --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 2a8d2f6f5b71..06268367ea9b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,7 +101,7 @@ autosummary_generate = True -napoleon_use_rtype = False +napolean_use_rtype = False # -- Options for nbsphinx ----------------------------------------------------- From 82dbf9131105a0b3a22c191930bc42b15d420794 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 31 Dec 2019 10:38:45 -0800 Subject: [PATCH 0559/1053] add tests for #1640, adapt make_jaxpr staging --- jax/api.py | 4 ++-- jax/interpreters/partial_eval.py | 6 +++--- jax/lax/lax_control_flow.py | 3 ++- tests/api_test.py | 8 ++++++++ tests/nn_test.py | 11 +++++++++++ 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/jax/api.py b/jax/api.py index 5a59b288211b..8f907ac345d9 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1337,8 +1337,8 @@ def jaxpr_maker(*args, **kwargs): jax_args, in_tree = tree_flatten((args, kwargs)) jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) in_pvals = map(pv_like, jax_args) - jaxpr, out_pvals, consts = pe.trace_to_jaxpr(jaxtree_fun, in_pvals, - instantiate=True) + jaxpr, out_pvals, consts = pe.trace_to_jaxpr( + jaxtree_fun, in_pvals, instantiate=True, stage_out_calls=True) out_avals = map(raise_to_shaped, unzip2(out_pvals)[0]) in_avals = tuple(raise_to_shaped(in_aval) for in_aval, _ in in_pvals) typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index eda7a648000f..46052b157fd1 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -325,10 +325,10 @@ def partial_val_aval(pv, const): else: raise TypeError(pv) -def trace_to_jaxpr(fun, pvals, **kwargs): +def trace_to_jaxpr(fun, pvals, instantiate=False, stage_out_calls=False): """Traces a function, given abstract inputs, to a jaxpr.""" - instantiate = kwargs.pop('instantiate', False) - with new_master(JaxprTrace) as master: + trace_type = StagingJaxprTrace if stage_out_calls else JaxprTrace + with new_master(trace_type) as master: fun = trace_to_subjaxpr(fun, master, instantiate) jaxpr, (out_pvals, consts, env) = fun.call_wrapped(pvals) assert not env diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 590d4c2646f2..d2d1c6a48b1f 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -57,7 +57,8 @@ def _initial_style_jaxpr(fun, in_tree, in_avals): in_pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) - jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=True) + jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=True, + stage_out_calls=True) out_avals = _map(raise_to_shaped, unzip2(out_pvals)[0]) const_avals = tuple(raise_to_shaped(core.get_aval(c)) for c in consts) typed_jaxpr = core.TypedJaxpr(pe.closure_convert_jaxpr(jaxpr), diff --git a/tests/api_test.py b/tests/api_test.py index 3dc11bc75f5c..8d9a5ed456d8 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -953,6 +953,14 @@ def test_issue_871(self): def test_partial_eval_lower(self): # this is a simplified model of a bug that arose when we first used @jit in # a jvp rule. it's in this file because we want to use make_jaxpr. + + # NOTE(mattjj): I no longer understand what this was meant to test. My guess + # is it was related to staging out the broadcast into a jaxpr to be + # transposed, but after #1749 that's no longer a problem. After changing + # make_jaxpr (and jit) to stage out sub-calls fully, this test started to + # fail; I left it in as skipped because deleting tests feels wrong. + raise unittest.SkipTest("obsolete test") + @api.jit def f(a, b, c): a = lax.broadcast(a, (2,)) diff --git a/tests/nn_test.py b/tests/nn_test.py index ad609a0dfb28..2960404b9a05 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -30,6 +30,7 @@ from jax import nn from jax import random import jax +import jax.numpy as np from jax.config import config config.parse_flags_with_absl() @@ -51,6 +52,16 @@ def testEluValue(self): val = nn.elu(1e4) self.assertAllClose(val, 1e4, check_dtypes=False) + @jtu.skip_on_devices("gpu", "tpu") + def testEluMemory(self): + # see https://github.com/google/jax/pull/1640 + jax.make_jaxpr(nn.elu)(np.ones((10 ** 12,))) # don't oom + + @jtu.skip_on_devices("gpu", "tpu") + def testHardTanhMemory(self): + # see https://github.com/google/jax/pull/1640 + jax.make_jaxpr(nn.hard_tanh)(np.ones((10 ** 12,))) # don't oom + InitializerRecord = collections.namedtuple( "InitializerRecord", ["name", "initializer", "shapes"]) From ed309b6f6a72048a986dc330900ed1cfb88f762b Mon Sep 17 00:00:00 2001 From: Neeraj Pradhan Date: Tue, 31 Dec 2019 12:00:58 -0800 Subject: [PATCH 0560/1053] Fix for compatibility with python>=3.7 and numpy>=1.18 --- jax/util.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jax/util.py b/jax/util.py index bd6454627677..b78bd20e2f6f 100644 --- a/jax/util.py +++ b/jax/util.py @@ -214,6 +214,10 @@ def get_module_functions(module): """ module_fns = set() for key in dir(module): + # Omitting module level __getattr__, __dir__ which was added in Python 3.7 + # https://www.python.org/dev/peps/pep-0562/ + if key in ('__getattr__', '__dir__'): + continue attr = getattr(module, key) if isinstance( attr, (types.BuiltinFunctionType, types.FunctionType, onp.ufunc)): From b380ac1f7f7efd6a07edf102d9b1e2ee69535038 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 1 Jan 2020 11:43:44 -0800 Subject: [PATCH 0561/1053] add faster reshape utility function --- jax/numpy/lax_numpy.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 6d84fc3b9717..ca9fae05c25c 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -885,10 +885,18 @@ def reshape(a, newshape, order="C"): except AttributeError: return _reshape(a, newshape, order=order) -def _reshape(a, newshape, order="C"): - dummy_val = onp.broadcast_to(0, shape(a)) # zero strides - computed_newshape = onp.reshape(dummy_val, newshape).shape +def _compute_newshape(a, newshape): + """Fixes a -1 value in newshape, if present.""" + # other errors, like having more than one -1, are caught downstream + newsize = _prod(newshape) + if newsize < 0: + fix = a.size // -newsize + return [d if d != -1 else fix for d in newshape] + else: + return newshape +def _reshape(a, newshape, order="C"): + computed_newshape = _compute_newshape(a, newshape) if order == "C": return lax.reshape(a, computed_newshape, None) elif order == "F": From fd6067471e08862547e76fd0bd80eaa3dbf69b53 Mon Sep 17 00:00:00 2001 From: John Mellor Date: Thu, 2 Jan 2020 12:57:24 +0000 Subject: [PATCH 0562/1053] Fix minor typo in Common_Gotchas_in_JAX.ipynb Moved misplaced backtick --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index e5378504722d..f388fcc419eb 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -2166,7 +2166,7 @@ "\n", "If you want to trace where NaNs are occurring in your functions or gradients, you can turn on the NaN-checker by:\n", "- setting the `JAX_DEBUG_NANS=True` environment variable.\n", - "- adding from jax.config `import config` and `config.update(\"jax_debug_nans\", True)` near the top of your main file\n", + "- adding `from jax.config import config` and `config.update(\"jax_debug_nans\", True)` near the top of your main file\n", "- adding `from jax.config import config` and `config.parse_flags_with_absl()` to your main file, then set the option using a command-line flag like `--jax_debug_nans=True`.\n", "\n", "This will cause computations to error-out immediately on production of a NaN.\n", From d9c6a5f4a896d8b68f9478334f08d105835039d7 Mon Sep 17 00:00:00 2001 From: Archis Joglekar Date: Thu, 2 Jan 2020 17:35:22 -0800 Subject: [PATCH 0563/1053] fft and ifft implementation (#1926) * first commit with placeholders for tests * added tests for the following: 1 - inverse 2 - dtypes 3 - size 4 - axis added error tests for the following: 1 - multiple axes provided instead of single axis 2 - axis out of bounds * removed placeholders added functions to .rst file --- docs/jax.numpy.rst | 2 ++ jax/numpy/fft.py | 30 +++++++++++++++++++++++++ tests/fft_test.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index f326988b709d..f6a1617f50d5 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -258,6 +258,8 @@ jax.numpy.fft fftn ifftn + fft + ifft jax.numpy.linalg ---------------- diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index 8b075197a2ba..f0d5d5039417 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -92,6 +92,36 @@ def ifftn(a, s=None, axes=None, norm=None): return _fft_core('ifftn', xla_client.FftType.IFFT, a, s, axes, norm) +@_wraps(onp.fft.fft) +def fft(a, n=None, axis=-1, norm=None): + if isinstance(axis,list) or isinstance(axis,tuple): + raise ValueError( + "jax.np.fft.fft does not support multiple axes. " + "Please use jax.np.fft.fftn. " + "Got axis %s." % (list(axis)) + ) + + if not axis is None: + axis = [axis] + + return _fft_core('fft', xla_client.FftType.FFT, a, s=n, axes=axis, norm=norm) + + +@_wraps(onp.fft.ifft) +def ifft(a, n=None, axis=-1, norm=None): + if isinstance(axis,list) or isinstance(axis,tuple): + raise ValueError( + "jax.np.fft.ifft does not support multiple axes. " + "Please use jax.np.fft.ifftn. " + "Got axis %s." % (list(axis)) + ) + + if not axis is None: + axis = [axis] + + return _fft_core('ifft', xla_client.FftType.IFFT, a, s=n, axes=axis, norm=norm) + + for func in get_module_functions(onp.fft): if func.__name__ not in globals(): globals()[func.__name__] = _not_implemented(func) diff --git a/tests/fft_test.py b/tests/fft_test.py index 188404a90317..42fc20543093 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -105,6 +105,62 @@ def testFftnErrors(self, inverse): self.assertRaises( ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[-3])) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_inverse={}_size={}_axis={}".format( + inverse, jtu.format_shape_dtype_string([size], dtype), axis), + "axis": axis, "size": size, "dtype": dtype, "rng_factory": rng_factory, + "inverse": inverse} + for inverse in [False, True] + for rng_factory in [jtu.rand_default] + for dtype in all_dtypes + for size in [10] + for axis in [-1, 0])) + def testFft(self, inverse, size, dtype, axis, rng_factory): + rng = rng_factory() + args_maker = lambda: (rng([size], dtype),) + np_op = np.fft.ifft if inverse else np.fft.fft + onp_op = onp.fft.ifft if inverse else onp.fft.fft + np_fn = lambda a: np_op(a, axis=axis) + onp_fn = lambda a: onp_op(a, axis=axis) + # Numpy promotes to complex128 aggressively. + self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, + tol=1e-4) + self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) + # Test gradient for differentiable types. + if dtype in inexact_dtypes: + tol = 0.15 # TODO(skye): can we be more precise? + jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) + jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_inverse={}".format(inverse), + "inverse": inverse} + for inverse in [False, True])) + def testFftErrors(self, inverse): + rng = jtu.rand_default() + name = 'ifft' if inverse else 'fft' + func = np.fft.ifft if inverse else np.fft.fft + + self.assertRaisesRegex( + ValueError, + "jax.np.fft.{} does not support multiple axes. " + "Please use jax.np.fft.{}n. " + "Got axis \\[1, 1\\].".format(name, name), + lambda: func(rng([2, 3], dtype=onp.float64), axis=[1, 1]) + ) + self.assertRaisesRegex( + ValueError, + "jax.np.fft.{} does not support multiple axes. " + "Please use jax.np.fft.{}n. " + "Got axis \\[1, 1\\].".format(name, name), + lambda: func(rng([2, 3], dtype=onp.float64), axis=(1, 1)) + ) + self.assertRaises( + ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axis=[2])) + self.assertRaises( + ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axis=[-3])) + pass + if __name__ == "__main__": absltest.main() From 52cafb3741575a6ea9e5081552608dcbe90f787c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 3 Jan 2020 17:55:11 -0800 Subject: [PATCH 0564/1053] Don't serialize jaxpr equations into XLA metadata. Equations can be quite large, e.g. if it's some kind of call primitive. This can result in using many GB of host memory just to create the HLO module. --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 4e6c59654db9..76523d5abff5 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -300,7 +300,7 @@ def write(v, node): _map(write, jaxpr.freevars, freevars) _map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: - c.SetOpMetadata(xc.OpMetadata( op_type=eqn.primitive.name, op_name=str(eqn))) + c.SetOpMetadata(xc.OpMetadata(op_type=eqn.primitive.name)) in_nodes = list(map(read, eqn.invars)) if eqn.primitive in backend_specific_translations[platform]: rule = backend_specific_translations[platform][eqn.primitive] From 592f167e5bfd7f4d6ff67bdaba94008895c5b5fa Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Sat, 4 Jan 2020 14:26:35 +0100 Subject: [PATCH 0565/1053] Implement numpy.gradient --- jax/numpy/lax_numpy.py | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ca9fae05c25c..dc32ba96296b 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -873,6 +873,49 @@ def diff(a, n=1, axis=-1,): return a +@partial(jit, static_argnums=1) +def _gradient(a, axis): + def gradient_along_axis(a, axis): + a_swap = swapaxes(a, 0, axis) + a_grad = concatenate(( + (a_swap[1] - a_swap[0])[newaxis], + (a_swap[2:] - a_swap[:-2]) * 0.5, + (a_swap[-1] - a_swap[-2])[newaxis] + ), axis=0) + return swapaxes(a_grad, 0, axis) + + if axis is None: + axis = range(a.ndim) + else: + if isinstance(axis, int): + axis = (axis,) + if not (isinstance(axis, tuple) or isinstance(axis, list)): + raise ValueError("Give `axis` either as int or iterable") + axis = [_canonicalize_axis(i, a.ndim) for i in axis] + + if min([s for i, s in enumerate(a.shape) if i in axis]) < 2: + raise ValueError( + "Shape of array too small to calculate a numerical gradient") + + # TODO: use jax.lax loop tools if possible + a_grad = [gradient_along_axis(a, ax) for ax in axis] + + if len(axis) == 1: + a_grad = a_grad[0] + + return a_grad + + +@_wraps(onp.gradient) +def gradient(a, *args, **kwargs): + axis = kwargs.pop("axis", None) + if not len(args) == 0: + raise ValueError("*varargs not implemented") + if not len(kwargs) == 0: + raise ValueError("Only `axis` keyword is implemented") + return _gradient(a, axis) + + @_wraps(onp.isrealobj) def isrealobj(x): return not iscomplexobj(x) From 2c87f72a47fef49fbe7ca92e3a0b3e0427a2c14a Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 4 Jan 2020 12:05:44 -0800 Subject: [PATCH 0566/1053] bump version for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 8315d6e33cf7..8ef9c0051f89 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.55" +__version__ = "0.1.56" From ca155129322cc9fdb4e483c14d66d9be58e96152 Mon Sep 17 00:00:00 2001 From: Archis Joglekar Date: Sat, 4 Jan 2020 18:21:30 -0800 Subject: [PATCH 0567/1053] added fft2 and ifft2, corresponding tests, and documentation links. (#1939) --- docs/jax.numpy.rst | 2 ++ jax/numpy/fft.py | 22 +++++++++++++++++++ tests/fft_test.py | 54 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index f6a1617f50d5..739c340e3a05 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -260,6 +260,8 @@ jax.numpy.fft ifftn fft ifft + fft2 + ifft2 jax.numpy.linalg ---------------- diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index f0d5d5039417..9fd3ee9b6b17 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -122,6 +122,28 @@ def ifft(a, n=None, axis=-1, norm=None): return _fft_core('ifft', xla_client.FftType.IFFT, a, s=n, axes=axis, norm=norm) +@_wraps(onp.fft.fft2) +def fft2(a, s=None, axes=(-2,-1), norm=None): + if len(axes) != 2: + raise ValueError( + "jax.np.fft.fft2 only supports 2 axes. " + "Got axes = %s." % (list(axes)) + ) + + return _fft_core('fft', xla_client.FftType.FFT, a, s=s, axes=axes, norm=norm) + + +@_wraps(onp.fft.ifft2) +def ifft2(a, s=None, axes=(-2,-1), norm=None): + if len(axes) != 2: + raise ValueError( + "jax.np.fft.ifft2 only supports 2 axes. " + "Got axes = %s." % (list(axes)) + ) + + return _fft_core('ifft', xla_client.FftType.IFFT, a, s=s, axes=axes, norm=norm) + + for func in get_module_functions(onp.fft): if func.__name__ not in globals(): globals()[func.__name__] = _not_implemented(func) diff --git a/tests/fft_test.py b/tests/fft_test.py index 42fc20543093..19f6465aaf98 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -159,7 +159,59 @@ def testFftErrors(self, inverse): ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axis=[2])) self.assertRaises( ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axis=[-3])) - pass + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_inverse={}_shape={}_axis={}".format( + inverse, jtu.format_shape_dtype_string(shape, dtype), axes), + "axes": axes, "shape": shape, "dtype": dtype, "rng_factory": rng_factory, + "inverse": inverse} + for inverse in [False, True] + for rng_factory in [jtu.rand_default] + for dtype in all_dtypes + for shape in [(16, 8, 4, 8), (16, 8, 4, 8, 4)] + for axes in [(-2, -1), (0, 1), (1, 3), (-1, 2)])) + def testFft2(self, inverse, shape, dtype, axes, rng_factory): + rng = rng_factory() + args_maker = lambda: (rng(shape, dtype),) + np_op = np.fft.ifft2 if inverse else np.fft.fft2 + onp_op = onp.fft.ifft2 if inverse else onp.fft.fft2 + np_fn = lambda a: np_op(a, axes=axes) + onp_fn = lambda a: onp_op(a, axes=axes) + # Numpy promotes to complex128 aggressively. + self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, + tol=1e-4) + self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) + # Test gradient for differentiable types. + if dtype in inexact_dtypes: + tol = 0.15 # TODO(skye): can we be more precise? + jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) + jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_inverse={}".format(inverse), + "inverse": inverse} + for inverse in [False, True])) + def testFft2Errors(self, inverse): + rng = jtu.rand_default() + name = 'ifft2' if inverse else 'fft2' + func = np.fft.ifft2 if inverse else np.fft.fft2 + + self.assertRaisesRegex( + ValueError, + "jax.np.fft.{} only supports 2 axes. " + "Got axes = \\[0\\].".format(name, name), + lambda: func(rng([2, 3], dtype=onp.float64), axes=[0]) + ) + self.assertRaisesRegex( + ValueError, + "jax.np.fft.{} only supports 2 axes. " + "Got axes = \\[0, 1, 2\\].".format(name, name), + lambda: func(rng([2, 3, 3], dtype=onp.float64), axes=(0, 1, 2)) + ) + self.assertRaises( + ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[2, 3])) + self.assertRaises( + ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[-3, -4])) if __name__ == "__main__": From ea9e93282c25c823ec273f031af46b6d9de942fc Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 5 Jan 2020 04:32:48 +0100 Subject: [PATCH 0568/1053] Fix bug with caching in presence of JVP and JIT The bug was that the auxiliary output of the process_env_traces was mutated before the next cache hit, so the cache content changed. Fixes: #1945 --- jax/core.py | 7 ++++--- tests/api_test.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/jax/core.py b/jax/core.py index 4bd51a7b6573..7cf5c106478d 100644 --- a/jax/core.py +++ b/jax/core.py @@ -567,8 +567,9 @@ def __repr__(self): return '*' def apply_todos(todos, outs): - while todos: - outs = map(full_lower, todos.pop()(outs)) + todos_list = list(todos) + while todos_list: + outs = map(full_lower, todos_list.pop()(outs)) return outs @lu.transformation_with_aux @@ -586,7 +587,7 @@ def process_env_traces(primitive, level, params_tuple, *args): outs = map(trace.full_raise, outs) outs, cur_todo = trace.post_process_call(primitive, outs, params) todo.append(cur_todo) - yield outs, todo + yield outs, tuple(todo) # Ensure the aux output is immutable def call_bind(primitive, f, *args, **params): top_trace = find_top_trace(args) diff --git a/tests/api_test.py b/tests/api_test.py index 8d9a5ed456d8..d631ef3101e0 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -567,6 +567,21 @@ def f1(x, y): # jaxpr2 = api.make_jaxpr(f2_vjp)(y) # assert len(jaxpr2.constvars) == 2 + def test_jvp_jit_cached(self): + """Bug in caching in presence of JVP and JIT.""" + + def func(x): + def inner(y): + return y * x + + # Must have two calls to the inner jit (the second one hits the cache) + res1 = api.jit(inner)(4.) + res2 = api.jit(inner)(5.) + return res1 + res2 + + self.assertAllClose((45., 9.), api.jvp(func, (5.,), (1.,)), check_dtypes=True) + + def test_complex_grad_raises_error(self): self.assertRaises(TypeError, lambda: grad(lambda x: np.sin(x))(1 + 2j)) From 528a69f32e0388a12adf441a838eb105643d2a84 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 5 Jan 2020 04:35:34 +0100 Subject: [PATCH 0569/1053] Added some more documentation to the linear_util module Also cleaned up the inconsistent way of importing the module. Prefer importing with qualified name 'lu.transformation' rather than just 'transformation'. --- jax/api_util.py | 8 +- jax/flatten_util.py | 4 +- jax/interpreters/ad.py | 31 ++++--- jax/interpreters/batching.py | 8 +- jax/interpreters/partial_eval.py | 5 +- jax/linear_util.py | 139 +++++++++++++++++-------------- tests/util_test.py | 88 +++++++++++++++++++ 7 files changed, 191 insertions(+), 92 deletions(-) create mode 100644 tests/util_test.py diff --git a/jax/api_util.py b/jax/api_util.py index 7a161bc4a5a0..6d5f79995c3c 100644 --- a/jax/api_util.py +++ b/jax/api_util.py @@ -18,7 +18,7 @@ from .tree_util import (build_tree, tree_flatten, tree_unflatten, treedef_is_leaf) -from .linear_util import transformation_with_aux +from . import linear_util as lu from .util import safe_map, unzip2, partial, curry map = safe_map @@ -38,7 +38,7 @@ def get_name(fun): return getattr(fun, "__name__", "") def get_module(fun): return getattr(fun, "__module__", "") def get_doc(fun): return getattr(fun, "__doc__", "") -@transformation_with_aux +@lu.transformation_with_aux def flatten_fun(in_tree, *args_flat): py_args, py_kwargs = tree_unflatten(in_tree, args_flat) ans = yield py_args, py_kwargs @@ -52,7 +52,7 @@ def apply_flat_fun(fun, io_tree, *py_args): ans = fun(*args) return tree_unflatten(out_tree, ans) -@transformation_with_aux +@lu.transformation_with_aux def flatten_fun_nokwargs(in_tree, *args_flat): py_args = tree_unflatten(in_tree, args_flat) ans = yield py_args, {} @@ -66,7 +66,7 @@ def apply_flat_fun_nokwargs(fun, io_tree, py_args): ans = fun(*args) return tree_unflatten(out_tree, ans) -@transformation_with_aux +@lu.transformation_with_aux def flatten_fun_nokwargs2(in_tree, *args_flat): py_args = tree_unflatten(in_tree, args_flat) ans, aux = yield py_args, {} diff --git a/jax/flatten_util.py b/jax/flatten_util.py index 1c60362c3409..65842a1eaf7f 100644 --- a/jax/flatten_util.py +++ b/jax/flatten_util.py @@ -17,7 +17,7 @@ from __future__ import print_function from .tree_util import tree_flatten, tree_unflatten -from .linear_util import transformation_with_aux +from . import linear_util as lu from .util import safe_zip import jax.numpy as np @@ -36,7 +36,7 @@ def ravel_list(*lst): return np.concatenate([np.ravel(elt) for elt in lst]) if lst else np.array([]) -@transformation_with_aux +@lu.transformation_with_aux def ravel_fun(unravel_inputs, flat_in, **kwargs): pytree_args = unravel_inputs(flat_in) ans = yield pytree_args, {} diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index ac5cefc14ac1..4b1af35926e1 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -22,16 +22,15 @@ from .. import core as core from ..core import Trace, Tracer, new_master, get_aval, call_p, Primitive, Literal from ..ad_util import (add_jaxvals, add_jaxvals_p, zeros_like_jaxval, zeros_like_aval, - zeros_like_p, zero, Zero) + zeros_like_p, zero) from ..abstract_arrays import raise_to_shaped -from ..util import unzip2, unzip3, safe_map, safe_zip, partial, split_list -from ..tree_util import build_tree, register_pytree_node, tree_map -from ..linear_util import (thunk, transformation, transformation_with_aux, - wrap_init, hashable_partial) +from ..util import unzip2, safe_map, safe_zip, partial, split_list +from ..tree_util import register_pytree_node +from .. import linear_util as lu from ..api_util import flatten_fun, flatten_fun_nokwargs from ..tree_util import tree_flatten, tree_unflatten -from six.moves import builtins, reduce +from six.moves import reduce zip = safe_zip map = safe_map @@ -45,7 +44,7 @@ def jvp(fun, has_aux=False, instantiate=True): fun, aux = jvp_subtrace_aux(fun) return jvpfun(fun, instantiate), aux -@transformation +@lu.transformation def jvpfun(instantiate, primals, tangents): with new_master(JVPTrace) as master: out_primals, out_tangents = yield (master, primals, tangents), {} @@ -56,7 +55,7 @@ def jvpfun(instantiate, primals, tangents): in zip(out_primals, out_tangents, instantiate)] yield out_primals, out_tangents -@transformation +@lu.transformation def jvp_subtrace(master, primals, tangents): trace = JVPTrace(master, core.cur_sublevel()) for x in list(primals) + list(tangents): @@ -69,7 +68,7 @@ def jvp_subtrace(master, primals, tangents): yield unzip2([(out_tracer.primal, out_tracer.tangent) for out_tracer in out_tracers]) -@transformation_with_aux +@lu.transformation_with_aux def jvp_subtrace_aux(master, primals, tangents): trace = JVPTrace(master, core.cur_sublevel()) for x in list(primals) + list(tangents): @@ -230,7 +229,7 @@ def is_linear(var): def _eval_subjaxpr_primals(prim, jaxpr, consts, freevar_vals, in_vals, params): all_args, in_tree_def = tree_flatten((consts, freevar_vals, in_vals)) - fun = hashable_partial(wrap_init(_eval_primals), jaxpr) + fun = lu.hashable_partial(lu.wrap_init(_eval_primals), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) out_flat = prim.bind(fun, *all_args, **params) return tree_unflatten(out_tree(), out_flat) @@ -458,7 +457,7 @@ def fun_jvp_partial_eval(trace, *tracers, **params): primals_out = [primals_out] out_avals = [raise_to_shaped(get_aval(x)) for x in primals_out] ct_pvals = [pe.PartialVal((aval, core.unit)) for aval in out_avals] - jaxpr, _, res = pe.trace_to_jaxpr(wrap_init(vjp_py), ct_pvals, instantiate=True) + jaxpr, _, res = pe.trace_to_jaxpr(lu.wrap_init(vjp_py), ct_pvals, instantiate=True) tangents_out = fun_lin_p.bind(*it.chain(res, tangents), trans_jaxpr=jaxpr, num_res=len(res), out_avals=out_avals) return primals_out + tangents_out @@ -534,7 +533,7 @@ def instantiate_zeros_aval(aval, tangent): else: return tangent -@transformation_with_aux +@lu.transformation_with_aux def traceable(num_primals, in_tree_def, *primals_and_tangents): new_primals = primals_and_tangents[:num_primals] new_tangents = primals_and_tangents[num_primals:] @@ -546,7 +545,7 @@ def traceable(num_primals, in_tree_def, *primals_and_tangents): def call_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) - fun = hashable_partial(wrap_init(backward_pass), jaxpr) + fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) out_flat = primitive.bind(fun, *all_args, **params) return tree_unflatten(out_tree(), out_flat) @@ -555,7 +554,7 @@ def call_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): def map_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) - fun = hashable_partial(wrap_init(backward_pass), jaxpr) + fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) out_flat = primitive.bind(fun, *all_args, **params) freevar_cts, arg_cts = tree_unflatten(out_tree(), out_flat) @@ -565,7 +564,7 @@ def map_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): def jvp_jaxpr(jaxpr, nonzeros, instantiate): assert len(jaxpr.in_avals) == len(nonzeros) - f = wrap_init(core.jaxpr_as_fun(jaxpr)) + f = lu.wrap_init(core.jaxpr_as_fun(jaxpr)) f_jvp, out_nonzeros = f_jvp_traceable(jvp(f, instantiate=instantiate), nonzeros) tangent_avals = [aval for aval, nz in zip(jaxpr.in_avals, nonzeros) if nz] avals_in = list(it.chain(jaxpr.in_avals, tangent_avals)) @@ -575,7 +574,7 @@ def jvp_jaxpr(jaxpr, nonzeros, instantiate): jaxpr_out = core.TypedJaxpr(jaxpr_out, literals_out, avals_in, avals_out) return jaxpr_out, out_nonzeros() -@transformation_with_aux +@lu.transformation_with_aux def f_jvp_traceable(nonzeros, *primals_and_nztangents): num_primals = len(nonzeros) primals = list(primals_and_nztangents[:num_primals]) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 102409aae03c..7420287a7bbf 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -30,7 +30,7 @@ from ..core import Trace, Tracer, new_master from ..abstract_arrays import ShapedArray, make_shaped_array, array_types, raise_to_shaped from ..ad_util import add_jaxvals, add_jaxvals_p, zeros_like_jaxval, zeros_like_p -from ..linear_util import transformation, transformation_with_aux, wrap_init +from .. import linear_util as lu from ..util import unzip2, partial, safe_map from . import xla from . import partial_eval as pe @@ -50,7 +50,7 @@ def batch_fun(fun, in_vals, in_dims): del master return out_vals, out_dims() -@transformation_with_aux +@lu.transformation_with_aux def batch_subtrace(master, in_dims, *in_vals): trace = BatchTrace(master, core.cur_sublevel()) in_tracers = [BatchTracer(trace, val, dim) if dim is not None else val @@ -301,7 +301,7 @@ def _promote_aval_rank(sz, aval): return ShapedArray((sz,) + aval.shape, aval.dtype) def batch_jaxpr(jaxpr, size, batched, instantiate): - f = wrap_init(core.jaxpr_as_fun(jaxpr)) + f = lu.wrap_init(core.jaxpr_as_fun(jaxpr)) f, batched_out = batched_traceable(f, size, batched, instantiate) avals_in = [_promote_aval_rank(size, a) if b else a for a, b in zip(jaxpr.in_avals, batched)] @@ -311,7 +311,7 @@ def batch_jaxpr(jaxpr, size, batched, instantiate): jaxpr_out = core.TypedJaxpr(jaxpr_out, consts_out, avals_in, avals_out) return jaxpr_out, batched_out() -@transformation_with_aux +@lu.transformation_with_aux def batched_traceable(size, batched, instantiate, *vals): in_dims = [0 if b else None for b in batched] with new_master(BatchTrace) as master: diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 46052b157fd1..0bb28ea830d4 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -27,7 +27,6 @@ from .. import core from .. import linear_util as lu from ..abstract_arrays import ShapedArray, ConcreteArray, raise_to_shaped -from ..linear_util import thunk, transformation, transformation_with_aux from ..util import unzip2, safe_zip, safe_map, toposort, partial, split_list from ..core import (Trace, Tracer, new_master, Jaxpr, Literal, get_aval, AbstractValue, unit, unitvar, abstract_unit, Primitive, @@ -237,7 +236,7 @@ def partial_eval(f, trace, pvs): return partial_eval_wrapper(f, tuple(pvs)) -@transformation_with_aux +@lu.transformation_with_aux def partial_eval_wrapper(avals, *consts): py_args = (map(PartialVal, zip(avals, consts)),) jaxpr, (out_pvals, consts, env) = yield py_args, {} @@ -336,7 +335,7 @@ def trace_to_jaxpr(fun, pvals, instantiate=False, stage_out_calls=False): return jaxpr, out_pvals, consts -@transformation +@lu.transformation def trace_to_subjaxpr(master, instantiate, pvals): assert all([isinstance(pv, PartialVal) for pv in pvals]), pvals trace = JaxprTrace(master, core.cur_sublevel()) diff --git a/jax/linear_util.py b/jax/linear_util.py index 94147e64cbbf..3be976214014 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -13,56 +13,53 @@ # limitations under the License. """ -Utilities for defining linear functions composed with transformations. +Utilities for defining functions composed with transformations. -"Linear" here is meant in the sense of linear types; that is, a linear function -may be called at most once. +For example, -For example: + from jax import linear_util as lu -from jax import linear_util as lu + wf = lu.wrap_init(f) # Produce a WrappedFun for applying transformations on `f` -# A transformation that scales its argument down and its result up. -@lu.transformation -def scale_transformer(scale, x): - ans = yield (x / scale,) - yield x * scale +A `WrappedFun` object represents a function `f`, together with a sequence of +nested transformations that are to be applied to the positional and keyword +arguments at call time and function return values at return time. +A transformation can take some static positional arguments that are given +at the wrapping time, and may also return some auxiliary output: -def f(x): - return x + 1 + wf, aux_out_thunk = trans1(wf, static_arg) -g = lu.wrap_init(f) # Wraps `f` as a `WrappedFun`. -g = scale_transformer(g, 2.0) # Scale inputs/outputs by 2.0 -g = scale_transformer(g, 0.7) # Scale inputs/outputs further by 0.7. -print(g.call_wrapped(3.)) # Call the transformed function. +We can call the transformed function. First, the transformation is applied +to the dynamic args and keyword args to produce new dynamic and keyword args. +Then the underlying function is called and the transformation is applied to +the results. +If there are multiple transformations, they form a stack. The arguments are +transformed first with the last applied transformation; the results are +transformed first with the first applied transformation. + + res = wf.call_wrapped(dynamic_args, kwargs) + # Now `aux_out_thunk()` is the auxiliary output. + +A transformation is written as a generator function that takes zero or more +static positional arguments (given when the transformation is instantiated), +along with positional and keyword arguments to be transformed. +The generator will yield twice: + + @lu.transformation_with_aux + def trans1(static_arg, *dynamic_args, **kwargs): + ... + # First yield: pair of transformed (args, kwargs). Get back the results. + results = yield (new_dynamic_args, new_kwargs) + ... + # Second yield: pair of (transformed results, and auxiliary output) + yield new_results, auxiliary_output -A `WrappedFun` object represents a function `f`, together with a -sequence of nested transformations that are to be applied to the positional -arguments at call time and function return values at return time. `WrappedFun` objects explicitly represent the set of transformations so that they can be used as dictionary keys for memoization. `WrappedFun` objects -compare as equal only if they compute the same function. - -Transformations are implemented as generators to save call stack frames. -A transformation's generator takes arguments `gen args + args`, and yields -a tuple of transformed arguments that should be passed to the wrapped -function. The result of the wrapped function is passed back to the generator -using `gen.send()`, and the generator yields the transformed results to pass -back to the caller. - -Transformations can also return auxiliary data using the `transform_with_aux` -decorator. For example: - -@lu.transformation_with_aux -def scale_transformer_aux(scale, x): - ans = yield (x / scale,) - yield (x * scale, "Auxiliary data: {}".format(x)) - -g = lu.wrap_init(f) # Wraps `f` as a `WrappedFun`. -g, aux_thunk = scale_transformer_aux(g, 2.0) # Scale inputs/outputs by 2.0 -print(g.call_wrapped(3.)) # Call the transformed function. -print(aux_thunk()) # Retrieves the auxiliary data computed during evaluation. +compare as equal only if they compute the same function. The static and the +dynamic positional arguments for the generators, and also the auxiliary output +data must be immutable, because it will be stored in function memoization tables. """ from __future__ import absolute_import @@ -71,18 +68,7 @@ def scale_transformer_aux(scale, x): import weakref -from .util import curry, partial - - -def thunk(f): - store = Store() - def f_memoized(): - if not store: - # TODO(dougalm): save/restore relevant environment state too - store.store(f()) - return store.val - - return f_memoized +from .util import curry class StoreException(Exception): pass @@ -91,6 +77,7 @@ class EmptyStoreValue(object): pass _EMPTY_STORE_VALUE = EmptyStoreValue() class Store(object): + """Storage for a value, with checks for overwriting or reading empty store.""" __slots__ = ("_val",) def __init__(self): @@ -117,9 +104,14 @@ class WrappedFun(object): Arguments: f: the function to be transformed. - transforms: a list of `(gen, gen_args, out_store)` tuples representing - transformations to apply to `f.` - params: extra parameters to pass as keyword arguments to `f`. + transforms: a list of `(gen, gen_static_args)` tuples representing + transformations to apply to `f.` Here `gen` is a generator function + and `gen_static_args` is a tuple of static arguments for the generator. See + description at the start of this module for the expected behavior of the + generator. + stores: a list of out_store for the auxiliary output of the `transforms`. + params: extra parameters to pass as keyword arguments to `f`, along with the + transformed keyword arguments. """ __slots__ = ("f", "transforms", "stores", "params") @@ -133,19 +125,26 @@ def __init__(self, f, transforms, stores, params): def __name__(self): return getattr(self.f, '__name__', '') - def wrap(self, gen, gen_args, out_store): - return WrappedFun(self.f, ((gen, gen_args),) + self.transforms, + def wrap(self, gen, gen_static_args, out_store): + """Add another transform and its store.""" + return WrappedFun(self.f, ((gen, gen_static_args),) + self.transforms, (out_store,) + self.stores, self.params) def populate_stores(self, stores): + """Copy the values from the `stores` into `self.stores`.""" for self_store, other_store in zip(self.stores, stores): if self_store is not None: self_store.store(other_store.val) def call_wrapped(self, *args, **kwargs): + """Calls the underlying function, applying the transforms. + + The positional `args` and keyword `kwargs` are passed to the first + transformation generator. + """ stack = [] - for (gen, gen_args), out_store in zip(self.transforms, self.stores): - gen = gen(*(gen_args + tuple(args)), **kwargs) + for (gen, gen_static_args), out_store in zip(self.transforms, self.stores): + gen = gen(*(gen_static_args + tuple(args)), **kwargs) args, kwargs = next(gen) stack.append((gen, out_store)) gen = None @@ -176,14 +175,21 @@ def __eq__(self, other): self.params == other.params) @curry -def transformation(gen, fun, *transformation_args): - return fun.wrap(gen, transformation_args, None) +def transformation(gen, fun, *gen_static_args): + """Adds one more transformation to a WrappedFun. + Args: + gen: the transformation generator function + fun: a WrappedFun on which to apply the transformation + gen_static_args: static args for the generator function + """ + return fun.wrap(gen, gen_static_args, None) @curry -def transformation_with_aux(gen, fun, *transformation_args): +def transformation_with_aux(gen, fun, *gen_static_args): + """Adds one more transformation with auxiliary output to a WrappedFun.""" out_store = Store() out_thunk = lambda: out_store.val - return fun.wrap(gen, transformation_args, out_store), out_thunk + return fun.wrap(gen, gen_static_args, out_store), out_thunk def fun_name(f): try: @@ -197,6 +203,13 @@ def wrap_init(f, params={}): def cache(call): + """Cache decorator for WrappedFun calls. + Args: + call: a function that takes a WrappedFun as a first argument + + Returns: + the memoized `call` function. + """ fun_caches = weakref.WeakKeyDictionary() def memoized_fun(fun, *args): diff --git a/tests/util_test.py b/tests/util_test.py new file mode 100644 index 000000000000..61f4c4d432cb --- /dev/null +++ b/tests/util_test.py @@ -0,0 +1,88 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +from functools import partial +import unittest +import warnings +import weakref + +from absl import logging +from absl.testing import absltest +import numpy as onp +import six + +if six.PY3: + import concurrent.futures + +import jax +import jax.numpy as np +from jax import jit, grad, device_put, jacfwd, jacrev, hessian +from jax import api, lax +from jax.core import Primitive +from jax.interpreters import ad +from jax.interpreters.xla import DeviceArray +from jax.abstract_arrays import concretization_err_msg +from jax.lib import xla_bridge as xb +from jax import linear_util as lu +from jax import test_util as jtu +from jax import tree_util + +from jax.config import config +config.parse_flags_with_absl() +FLAGS = config.FLAGS + +class UtilTest(jtu.JaxTestCase): + + def test_wrapped_fun_transforms(self): + """Test a combination of transforms.""" + + def f(*args, factor=2): + """The function to be transformed. + Scales the positional arguments by a factor. + Takes only one keyword argument, the factor to scale by.""" + return tuple(a * factor for a in args) + + @lu.transformation_with_aux + def kw_to_positional(factor, *args, **kwargs): + """A transformation with auxiliary output. + Turns all keyword parameters into positional ones. + + On entry, append the values of the keyword arguments to the positional + arguments. On exit, take a list of results and recreate a dictionary + from the tail of the results. The auxiliary output is the list of + keyword keys. + """ + kwargs_keys = kwargs.keys() + new_args = tuple(kwargs[k] for k in kwargs_keys) + new_kwargs = dict(factor=factor) + results = yield args + new_args, new_kwargs # Yield transformed (args, kwargs) + # Assume results correspond 1:1 to the args + new_args + assert len(results) == len(args) + len(new_args) + aux_output = len(new_args) + yield (results[0:len(args)], + dict(zip(kwargs_keys, results[len(args):]))), aux_output + + + wf = lu.wrap_init(f) # Wraps `f` as a `WrappedFun`. + wf, out_thunk = kw_to_positional(wf, 2) + # Call the transformed function. + scaled_positional, scaled_kwargs = wf.call_wrapped(1, 2, three=3, four=4) + self.assertEqual((2, 4), scaled_positional) + self.assertEqual(dict(three=6, four=8), scaled_kwargs) + self.assertEqual(2, out_thunk()) \ No newline at end of file From df374fa3a22b20af0aae6a6f360cb789c535678b Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 5 Jan 2020 16:46:29 +0100 Subject: [PATCH 0570/1053] Removed unused imports --- tests/util_test.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/tests/util_test.py b/tests/util_test.py index 61f4c4d432cb..73c300fe053e 100644 --- a/tests/util_test.py +++ b/tests/util_test.py @@ -16,29 +16,9 @@ from __future__ import division from __future__ import print_function -import collections -from functools import partial -import unittest -import warnings -import weakref - -from absl import logging -from absl.testing import absltest -import numpy as onp -import six - -if six.PY3: - import concurrent.futures - import jax import jax.numpy as np -from jax import jit, grad, device_put, jacfwd, jacrev, hessian from jax import api, lax -from jax.core import Primitive -from jax.interpreters import ad -from jax.interpreters.xla import DeviceArray -from jax.abstract_arrays import concretization_err_msg -from jax.lib import xla_bridge as xb from jax import linear_util as lu from jax import test_util as jtu from jax import tree_util From 4b2a5a1f1bb4533f58929eb51eac3aa079a0be28 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 5 Jan 2020 10:12:31 -0800 Subject: [PATCH 0571/1053] Attempt a fix for PY2 --- tests/util_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/util_test.py b/tests/util_test.py index 73c300fe053e..320bbcc172c9 100644 --- a/tests/util_test.py +++ b/tests/util_test.py @@ -32,10 +32,12 @@ class UtilTest(jtu.JaxTestCase): def test_wrapped_fun_transforms(self): """Test a combination of transforms.""" - def f(*args, factor=2): + def f(*args, **kwargs): """The function to be transformed. Scales the positional arguments by a factor. Takes only one keyword argument, the factor to scale by.""" + factor = kwargs.pop('factor', 2) # For PY2 + assert not kwargs return tuple(a * factor for a in args) @lu.transformation_with_aux From 1ca9e9b251ebdea78df168d7a86f4719f49c553b Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Mon, 6 Jan 2020 18:20:57 -0800 Subject: [PATCH 0572/1053] Concatenate error messages under numpy.{zeros,ones,full}. Closes #1822 --- jax/lax/lax.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 5368622e7af1..e3eab78516a9 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1054,10 +1054,10 @@ def full(shape, fill_value, dtype=None): """ try: shape = _canonicalize_shape(shape) - except TypeError: - msg = ("`full` requires shapes to be concrete. If using `jit`, try using " - "`static_argnums` or applying `jit` to smaller subfunctions instead.") - raise TypeError(msg) + except TypeError as e: + msg = ("Note: `full` requires shapes to be concrete. If using `jit`, try " + "using `static_argnums` or applying `jit` to smaller subfunctions.") + raise TypeError("{}. {}".format(e.message, msg)) if onp.shape(fill_value): msg = "full must be called with scalar fill_value, got fill_value.shape {}." From bb9cd233683565c5127f88bab5a51a504752cae2 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 6 Jan 2020 20:57:19 -0800 Subject: [PATCH 0573/1053] tweak shape error message, add test --- jax/lax/lax.py | 18 ++++++++---------- tests/lax_numpy_test.py | 13 +++++++++++++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index e3eab78516a9..38e4d627e35c 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -94,7 +94,11 @@ def _canonicalize_shape(shape): except TypeError: pass msg = ("Shapes must be 1D sequences of concrete values of integer type, " - "got {}") + "got {}.") + if any(isinstance(x, core.Tracer) and isinstance(core.get_aval(x), ShapedArray) + and not isinstance(core.get_aval(x), ConcreteArray) for x in shape): + msg += ("\nIf using `jit`, try using `static_argnums` or applying `jit` to " + "smaller subfunctions.") raise TypeError(msg.format(shape)) def _identity(x): return x @@ -1047,18 +1051,12 @@ def full(shape, fill_value, dtype=None): """Returns an array of `shape` filled with `fill_value`. Arguments: - shape: sequence of integers, describing the shape of the output array - fill_value: the value to fill the new array with + shape: sequence of integers, describing the shape of the output array. + fill_value: the value to fill the new array with. dtype: the type of the output array, or `None`. If not `None`, `fill_value` will be cast to `dtype`. """ - try: - shape = _canonicalize_shape(shape) - except TypeError as e: - msg = ("Note: `full` requires shapes to be concrete. If using `jit`, try " - "using `static_argnums` or applying `jit` to smaller subfunctions.") - raise TypeError("{}. {}".format(e.message, msg)) - + shape = _canonicalize_shape(shape) if onp.shape(fill_value): msg = "full must be called with scalar fill_value, got fill_value.shape {}." raise TypeError(msg.format(onp.shape(fill_value))) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 0120432aa7b1..d3c25c7997d0 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2565,6 +2565,19 @@ def testPrecision(self): partial(lnp.inner, precision=HIGHEST), ones_1d, ones_1d) + def testZerosShapeErrors(self): + # see https://github.com/google/jax/issues/1822 + self.assertRaisesRegex( + TypeError, + "Shapes must be 1D sequences of concrete values of integer type.*", + lambda: lnp.zeros(1.)) + self.assertRaisesRegex( + TypeError, + "Shapes must be 1D sequences of concrete values of integer type.*\n" + "If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions.", + lambda: api.jit(lnp.zeros)(2)) + + # Most grad tests are at the lax level (see lax_test.py), but we add some here # as needed for e.g. particular compound ops of interest. From 80d8ee4e3c6f1ed8f33c4a5dccb26285fa3aab0d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 6 Jan 2020 18:08:00 -0800 Subject: [PATCH 0574/1053] lower away grad_and_aux pure jaxpr tracers fixes #1950 --- jax/interpreters/ad.py | 1 + tests/api_test.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 4b1af35926e1..026737ae96ff 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -79,6 +79,7 @@ def jvp_subtrace_aux(master, primals, tangents): aux_tracers = map(trace.full_raise, aux) out_primals, out_tangents = unzip2((t.primal, t.tangent) for t in ans_tracers) aux_primals, _ = unzip2((t.primal, t.tangent) for t in aux_tracers) + aux_primals = map(core.full_lower, aux_primals) yield (out_primals, out_tangents), aux_primals def linearize(traceable, *primals, **kwargs): diff --git a/tests/api_test.py b/tests/api_test.py index d631ef3101e0..286ef024398d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -34,7 +34,7 @@ import jax import jax.numpy as np from jax import jit, grad, device_put, jacfwd, jacrev, hessian -from jax import api, lax +from jax import api, core, lax from jax.core import Primitive from jax.interpreters import ad from jax.interpreters import xla @@ -495,6 +495,17 @@ def test_grad_and_aux_constant(self): self.assertEqual(g, grad(lambda x: x**3)(4.)) self.assertEqual(aux, [4.**2, 4.]) + def test_grad_and_aux_no_tracers(self): + # see https://github.com/google/jax/issues/1950 + def f(x): + aux = dict(identity=x, p1=x+1) + return x ** 2, aux + + _, aux = jax.grad(f, has_aux=True)(3.) + self.assertIsInstance(aux, dict) + for val in aux.values(): + self.assertNotIsInstance(val, core.Tracer) + def test_jvp_mismatched_arguments(self): self.assertRaisesRegex( TypeError, From 1e8c9384f01869d030266b639770966298e3554d Mon Sep 17 00:00:00 2001 From: archis Date: Mon, 6 Jan 2020 12:38:12 -0800 Subject: [PATCH 0575/1053] added fftfreq, corresponding tests, and documentation links. --- docs/jax.numpy.rst | 1 + jax/numpy/fft.py | 39 +++++++++++++++++++++++++++++++++++++++ tests/fft_test.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index 739c340e3a05..17ada6ad1a61 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -262,6 +262,7 @@ jax.numpy.fft ifft fft2 ifft2 + fftfreq jax.numpy.linalg ---------------- diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index 9fd3ee9b6b17..d6a534af0f3c 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -24,6 +24,7 @@ from .lax_numpy import _not_implemented from .lax_numpy import _wraps from . import lax_numpy as np +from .. import ops as jaxops def _promote_to_complex(arg): @@ -82,6 +83,44 @@ def _fft_core(func_name, fft_type, a, s, axes, norm): return transformed +@_wraps(onp.fft.fftfreq) +def fftfreq(n, d=1.0): + if isinstance(n, list) or isinstance(n, tuple): + raise ValueError( + "The n argument of jax.np.fft.fftfreq only takes an int. " + "Got n = %s." % list(n)) + + elif isinstance(d, list) or isinstance(d, tuple): + raise ValueError( + "The d argument of jax.np.fft.fftfreq only takes a single value. " + "Got d = %s." % list(d)) + + k = np.zeros(n) + if n % 2 == 0: + # k[0: n // 2 - 1] = np.arange(0, n // 2 - 1) + k = jaxops.index_update(k, + jaxops.index[0: n // 2], + np.arange(0, n // 2)) + + # k[n // 2:] = np.arange(-n // 2, -1) + k = jaxops.index_update(k, + jaxops.index[n // 2:], + np.arange(-n // 2, 0)) + + else: + # k[0: (n - 1) // 2] = np.arange(0, (n - 1) // 2) + k = jaxops.index_update(k, + jaxops.index[0: (n - 1) // 2 + 1], + np.arange(0, (n - 1) // 2 + 1)) + + # k[(n - 1) // 2 + 1:] = np.arange(-(n - 1) // 2, -1) + k = jaxops.index_update(k, + jaxops.index[(n - 1) // 2 + 1:], + np.arange(-(n - 1) // 2, 0)) + + return k / (d * n) + + @_wraps(onp.fft.fftn) def fftn(a, s=None, axes=None, norm=None): return _fft_core('fftn', xla_client.FftType.FFT, a, s, axes, norm) diff --git a/tests/fft_test.py b/tests/fft_test.py index 19f6465aaf98..6e2fe7e50edd 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -213,6 +213,50 @@ def testFft2Errors(self, inverse): self.assertRaises( ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[-3, -4])) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_size={}_d={}".format( + jtu.format_shape_dtype_string([size], dtype), d), + "dtype": dtype, "size": size, "rng_factory": rng_factory, "d": d} + for rng_factory in [jtu.rand_default] + for dtype in all_dtypes + for size in [9, 10, 101, 102] + for d in [0.1, 2.])) + def testFftfreq(self, size, d, dtype, rng_factory): + rng = rng_factory() + args_maker = lambda: (rng([size], dtype),) + np_op = np.fft.fftfreq + onp_op = onp.fft.fftfreq + np_fn = lambda a: np_op(size, d=d) + onp_fn = lambda a: onp_op(size, d=d) + # Numpy promotes to complex128 aggressively. + self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, + tol=1e-4) + self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) + # Test gradient for differentiable types. + if dtype in inexact_dtypes: + tol = 0.15 # TODO(skye): can we be more precise? + jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) + jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_n={}".format(n), + "n": n} + for n in [[0,1,2]])) + def testFftfreqErrors(self, n): + name = 'fftfreq' + func = np.fft.fftfreq + self.assertRaisesRegex( + ValueError, + "The n argument of jax.np.fft.{} only takes an int. " + "Got n = \\[0, 1, 2\\]".format(name), + lambda: func(n=n) + ) + self.assertRaisesRegex( + ValueError, + "The d argument of jax.np.fft.{} only takes a single value. " + "Got d = \\[0, 1, 2\\].".format(name), + lambda: func(n=10, d=n) + ) if __name__ == "__main__": absltest.main() From e2f7f37f592b7d5fb5f27b0239323686d9b5b759 Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Mon, 6 Jan 2020 13:29:21 +0000 Subject: [PATCH 0576/1053] Allow Var to be a key in a JAX tree. --- jax/core.py | 8 ++++++++ tests/core_test.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/jax/core.py b/jax/core.py index 7cf5c106478d..9db0bcda3356 100644 --- a/jax/core.py +++ b/jax/core.py @@ -19,6 +19,7 @@ from operator import attrgetter from contextlib import contextmanager from collections import namedtuple, Counter, defaultdict +from functools import total_ordering import itertools as it from weakref import ref import threading @@ -86,11 +87,18 @@ def jaxpr_as_fun(typed_jaxpr, *args): new_jaxpr_eqn = JaxprEqn +@total_ordering class Var(object): def __init__(self, count, suffix): self.count = count self.suffix = suffix + def __lt__(self, other): + if not isinstance(other, Var): + return NotImplemented + else: + return (self.count, self.suffix) < (other.count, other.suffix) + def __repr__(self): rem = self.count s = '' diff --git a/tests/core_test.py b/tests/core_test.py index 7a469f36a223..d61b15ff9f7a 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -18,6 +18,7 @@ from collections import namedtuple import gc +import itertools as it import operator import numpy as onp @@ -30,7 +31,7 @@ from jax import test_util as jtu from jax.api import jvp, linearize, vjp, jit from jax.lax import UnshapedArray, ShapedArray, ConcreteArray -from jax.tree_util import tree_flatten, tree_unflatten, tree_multimap, tree_reduce +from jax.tree_util import tree_flatten, tree_unflatten, tree_multimap, tree_reduce, tree_leaves from jax.util import partial from jax.interpreters import partial_eval as pe from jax.interpreters import xla @@ -275,5 +276,34 @@ def f(x): finally: gc.set_debug(debug) + def test_comparing_var(self): + newsym = core.gensym('') + a = newsym() + b = newsym() + c = newsym() + assert a < b < c + assert c > b > a + assert a != b and b != c and a != c + + def test_var_ordering(self): + newsym = core.gensym('') + a = newsym() + b = newsym() + c = newsym() + for ordering in it.permutations([a, b, c]): + assert sorted(list(ordering)) == [a, b, c] + + def test_var_compared_by_identity(self): + a1 = core.gensym('')() + a2 = core.gensym('')() + assert str(a1) == str(a2) + assert a1 != a2 + + def test_var_tree_flatten(self): + newsym = core.gensym('') + a, b, c, d = newsym(), newsym(), newsym(), newsym() + syms = {c: d, a: b} + assert 'bd' == ''.join(map(str, tree_leaves(syms))) + if __name__ == '__main__': absltest.main() From 58ee0a8ea4a2699f723dc4fee3afe8887b91f9ec Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Mon, 30 Dec 2019 23:20:08 +0100 Subject: [PATCH 0577/1053] Add np.iterable --- jax/numpy/lax_numpy.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ca9fae05c25c..608adec3f64e 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -391,6 +391,14 @@ def issubdtype(arg1, arg2): return dtypes.issubdtype(arg1, arg2) @_wraps(onp.isscalar) def isscalar(num): return dtypes.is_python_scalar(num) or onp.isscalar(num) +@_wraps(onp.iterable) +def iterable(y): + try: + iter(y) + except TypeError: + return False + return True + @_wraps(onp.result_type) def result_type(*args): return dtypes.result_type(*args) From 0c9aacf1dac3804cad8044d517f009a15cf49654 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Sat, 4 Jan 2020 13:38:56 +0100 Subject: [PATCH 0578/1053] Use numpy function directly instead of copying source code --- jax/numpy/lax_numpy.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 608adec3f64e..d27dd9e4bfb5 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -391,13 +391,7 @@ def issubdtype(arg1, arg2): return dtypes.issubdtype(arg1, arg2) @_wraps(onp.isscalar) def isscalar(num): return dtypes.is_python_scalar(num) or onp.isscalar(num) -@_wraps(onp.iterable) -def iterable(y): - try: - iter(y) - except TypeError: - return False - return True +iterable = onp.iterable @_wraps(onp.result_type) def result_type(*args): From 7da75587b5ccc708d7267aef16f182ed39e098d0 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 6 Jan 2020 22:45:44 -0800 Subject: [PATCH 0579/1053] make control flow abstract eval to shaped level fixes #1919 --- jax/lax/lax_control_flow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index d2d1c6a48b1f..9bd9712dbe55 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -211,7 +211,7 @@ def while_loop(cond_fun, body_fun, init_val): return tree_unflatten(body_tree, outs) def _while_loop_abstract_eval(*args, **kwargs): - return kwargs["body_jaxpr"].out_avals + return _map(raise_to_shaped, kwargs["body_jaxpr"].out_avals) def _while_loop_translation_rule(c, axis_env, *args, **kwargs): backend = kwargs.pop('backend') @@ -363,7 +363,7 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): return tree_unflatten(true_out_tree, out) def _cond_abstract_eval(*args, **kwargs): - return kwargs["true_jaxpr"].out_avals + return _map(raise_to_shaped, kwargs["true_jaxpr"].out_avals) def _cond_translation_rule(c, axis_env, pred, *args, **kwargs): backend = kwargs.pop("backend", None) From b15a27a7fc4b8dce0056c53e5ec45d97ab40dee8 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Tue, 7 Jan 2020 12:34:34 +0100 Subject: [PATCH 0580/1053] Tests for jax.numpy.gradient and minor tweaks --- jax/numpy/lax_numpy.py | 4 ++-- tests/lax_numpy_test.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index dc32ba96296b..3b00e394478b 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -889,7 +889,7 @@ def gradient_along_axis(a, axis): else: if isinstance(axis, int): axis = (axis,) - if not (isinstance(axis, tuple) or isinstance(axis, list)): + if not isinstance(axis, tuple) and not isinstance(axis, list): raise ValueError("Give `axis` either as int or iterable") axis = [_canonicalize_axis(i, a.ndim) for i in axis] @@ -910,7 +910,7 @@ def gradient_along_axis(a, axis): def gradient(a, *args, **kwargs): axis = kwargs.pop("axis", None) if not len(args) == 0: - raise ValueError("*varargs not implemented") + raise ValueError("*args (sample distances) not implemented") if not len(kwargs) == 0: raise ValueError("Only `axis` keyword is implemented") return _gradient(a, axis) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 0120432aa7b1..5f8ea9f5f065 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2565,6 +2565,26 @@ def testPrecision(self): partial(lnp.inner, precision=HIGHEST), ones_1d, ones_1d) + @parameterized.named_parameters( + jtu.cases_from_list( + {"testcase_name": ("_shape={}_dtype={}").format(shape, dtype), + "shape": shape, + "dtype": dtype, "rng_factory": rng_factory} + for shape in [(10,), (10, 15), (10, 15, 20)] + for dtype in inexact_dtypes + for rng_factory in [jtu.rand_default])) + def testGradient(self, shape, dtype, rng_factory): + rng = rng_factory() + args_maker = self._GetArgsMaker(rng, [shape], [dtype]) + ndim = len(shape) + for num_axes in range(ndim): + for axis in itertools.combinations(range(ndim), num_axes): + lnp_fun = lambda y: lnp.gradient(y, axis=axis) + onp_fun = lambda y: onp.gradient(y, axis=axis) + self._CheckAgainstNumpy( + onp_fun, lnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + # Most grad tests are at the lax level (see lax_test.py), but we add some here # as needed for e.g. particular compound ops of interest. From c5a9eba3a8742c9d8f4e40fa9c2f43839f1d8481 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 7 Jan 2020 10:56:15 -0500 Subject: [PATCH 0581/1053] Implement batched cholesky decomposition using LAPACK/Cusolver (#1956) * Implement batched Cholesky decomposition on CPU and GPU using LAPACK and cuSolver. Adds support for complex batched Cholesky decomposition on both platforms.. Fix concurrency bug in batched cuBlas kernels where a host to device memcpy could take place too early before the device buffer was ready. --- jax/lax_linalg.py | 29 +++++--- jaxlib/BUILD | 1 + jaxlib/cublas.cc | 42 ++++------- jaxlib/cusolver.cc | 136 +++++++++++++++++++++++++++++++++++ jaxlib/cusolver.py | 33 +++++++++ jaxlib/gpu_kernel_helpers.cc | 14 ++++ jaxlib/gpu_kernel_helpers.h | 10 +++ jaxlib/lapack.pyx | 75 ++++++++++++------- tests/linalg_test.py | 5 +- 9 files changed, 282 insertions(+), 63 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 74186a5e77b4..2047236d6ba2 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -135,20 +135,31 @@ def _nan_like(c, operand): nan = c.Constant(onp.array(onp.nan, dtype=dtype)) return c.Broadcast(nan, shape.dimensions()) -def cholesky_cpu_translation_rule(c, operand): +# TODO(phawkins): remove supports_batching argument after the minimum jaxlib +# version is 0.1.38. +def _cholesky_cpu_gpu_translation_rule(potrf_impl, potrf_supports_batching, c, + operand): shape = c.GetShape(operand) + batch_dims = shape.dimensions()[:-2] dtype = shape.element_type().type - if len(shape.dimensions()) == 2 and onp.dtype(dtype) in _cpu_lapack_types: - result, info = lapack.potrf(c, operand, lower=True) - return c.Select(c.Eq(info, c.ConstantS32Scalar(0)), result, - _nan_like(c, result)) + if len(batch_dims) == 0 or potrf_supports_batching: + result, info = potrf_impl(c, operand, lower=True) + ok = c.Eq(info, c.ConstantS32Scalar(0)) + return _broadcasting_select(c, + c.Reshape(ok, None, batch_dims + (1, 1)), result, + _nan_like(c, result)) else: - # Fall back to the HLO implementation for batched Cholesky decomposition or - # unsupported types. - # TODO(phawkins): support LAPACK primitives in batched mode. + # Fall back to the HLO implementation for batched Cholesky decomposition. return c.Cholesky(operand) -xla.backend_specific_translations['cpu'][cholesky_p] = cholesky_cpu_translation_rule +xla.backend_specific_translations['cpu'][cholesky_p] = partial( + _cholesky_cpu_gpu_translation_rule, lapack.potrf, + not hasattr(lapack, "jax_potrf")) + +# TODO(phawkins): remove after the minimum jaxlib version is 0.1.38. +if hasattr(cusolver, "potrf"): + xla.backend_specific_translations['gpu'][cholesky_p] = partial( + _cholesky_cpu_gpu_translation_rule, cusolver.potrf, True) # Asymmetric eigendecomposition diff --git a/jaxlib/BUILD b/jaxlib/BUILD index 3d5cc27dad4f..4d967d201c3f 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -59,6 +59,7 @@ cc_library( features = ["-use_header_modules"], deps = [ "@com_google_absl//absl/base", + "@com_google_absl//absl/memory", "@com_google_absl//absl/strings", "@local_config_cuda//cuda:cuda_headers", ], diff --git a/jaxlib/cublas.cc b/jaxlib/cublas.cc index 48db7b8b6d18..efa13beb35ae 100644 --- a/jaxlib/cublas.cc +++ b/jaxlib/cublas.cc @@ -182,22 +182,6 @@ int SizeOfType(Type type) { } } -// Builds an array of pointers to each array in a batch, in device memory. -template -cudaError_t MakeBatchPointers(T* buffer, T** dev_ptrs, int batch, - int batch_elem_size) { - std::vector host_ptrs(batch); - for (int i = 0; i < batch; ++i) { - host_ptrs[i] = buffer; - buffer += batch_elem_size; - } - // TODO(phawkins): ideally we would not use a synchronous copy here, but to - // avoid it we need a way to keep the host-side buffer alive until the copy - // completes. - return cudaMemcpy(dev_ptrs, host_ptrs.data(), sizeof(T*) * batch, - cudaMemcpyHostToDevice); -} - // Batched triangular solve: trsmbatched struct TrsmBatchedDescriptor { @@ -238,14 +222,20 @@ void TrsmBatched(cudaStream_t stream, void** buffers, const char* opaque, } const int lda = d.side == CUBLAS_SIDE_LEFT ? d.m : d.n; const int ldb = d.m; + auto a_batch_host = MakeBatchPointers(stream, buffers[0], buffers[3], d.batch, + SizeOfType(d.type) * lda * lda); + auto b_batch_host = MakeBatchPointers(stream, buffers[2], buffers[4], d.batch, + SizeOfType(d.type) * d.m * d.n); + // TODO(phawkins): ideally we would not need to synchronize here, but to + // avoid it we need a way to keep the host-side buffer alive until the copy + // completes. + ThrowIfError(cudaStreamSynchronize(stream)); switch (d.type) { case Type::F32: { float* a = static_cast(buffers[0]); float* b = static_cast(buffers[2]); float** a_batch_ptrs = static_cast(buffers[3]); float** b_batch_ptrs = static_cast(buffers[4]); - ThrowIfError(MakeBatchPointers(a, a_batch_ptrs, d.batch, lda * lda)); - ThrowIfError(MakeBatchPointers(b, b_batch_ptrs, d.batch, d.m * d.n)); // NOTE(phawkins): if alpha is in GPU memory, cuBlas seems to segfault. const float alpha = 1.0f; ThrowIfErrorStatus(cublasStrsmBatched( @@ -260,8 +250,6 @@ void TrsmBatched(cudaStream_t stream, void** buffers, const char* opaque, double** a_batch_ptrs = static_cast(buffers[3]); double** b_batch_ptrs = static_cast(buffers[4]); const double alpha = 1.0; - ThrowIfError(MakeBatchPointers(a, a_batch_ptrs, d.batch, lda * lda)); - ThrowIfError(MakeBatchPointers(b, b_batch_ptrs, d.batch, d.m * d.n)); ThrowIfErrorStatus(cublasDtrsmBatched( handle.get(), d.side, d.uplo, d.trans, d.diag, d.m, d.n, &alpha, const_cast(a_batch_ptrs), lda, b_batch_ptrs, ldb, @@ -274,8 +262,6 @@ void TrsmBatched(cudaStream_t stream, void** buffers, const char* opaque, cuComplex** a_batch_ptrs = static_cast(buffers[3]); cuComplex** b_batch_ptrs = static_cast(buffers[4]); const cuComplex alpha = make_cuComplex(1.0f, 0.0f); - ThrowIfError(MakeBatchPointers(a, a_batch_ptrs, d.batch, lda * lda)); - ThrowIfError(MakeBatchPointers(b, b_batch_ptrs, d.batch, d.m * d.n)); ThrowIfErrorStatus(cublasCtrsmBatched( handle.get(), d.side, d.uplo, d.trans, d.diag, d.m, d.n, &alpha, const_cast(a_batch_ptrs), lda, b_batch_ptrs, ldb, @@ -290,8 +276,6 @@ void TrsmBatched(cudaStream_t stream, void** buffers, const char* opaque, cuDoubleComplex** b_batch_ptrs = static_cast(buffers[4]); const cuDoubleComplex alpha = make_cuDoubleComplex(1.0f, 0.0f); - ThrowIfError(MakeBatchPointers(a, a_batch_ptrs, d.batch, lda * lda)); - ThrowIfError(MakeBatchPointers(b, b_batch_ptrs, d.batch, d.m * d.n)); ThrowIfErrorStatus(cublasZtrsmBatched( handle.get(), d.side, d.uplo, d.trans, d.diag, d.m, d.n, &alpha, const_cast(a_batch_ptrs), lda, b_batch_ptrs, @@ -329,11 +313,16 @@ void GetrfBatched(cudaStream_t stream, void** buffers, const char* opaque, int* ipiv = static_cast(buffers[2]); int* info = static_cast(buffers[3]); + auto a_ptrs_host = MakeBatchPointers(stream, buffers[1], buffers[4], d.batch, + SizeOfType(d.type) * d.n * d.n); + // TODO(phawkins): ideally we would not need to synchronize here, but to + // avoid it we need a way to keep the host-side buffer alive until the copy + // completes. + ThrowIfError(cudaStreamSynchronize(stream)); switch (d.type) { case Type::F32: { float* a = static_cast(buffers[1]); float** batch_ptrs = static_cast(buffers[4]); - ThrowIfError(MakeBatchPointers(a, batch_ptrs, d.batch, d.n * d.n)); ThrowIfErrorStatus(cublasSgetrfBatched(handle.get(), d.n, batch_ptrs, d.n, ipiv, info, d.batch)); break; @@ -341,7 +330,6 @@ void GetrfBatched(cudaStream_t stream, void** buffers, const char* opaque, case Type::F64: { double* a = static_cast(buffers[1]); double** batch_ptrs = static_cast(buffers[4]); - ThrowIfError(MakeBatchPointers(a, batch_ptrs, d.batch, d.n * d.n)); ThrowIfErrorStatus(cublasDgetrfBatched(handle.get(), d.n, batch_ptrs, d.n, ipiv, info, d.batch)); break; @@ -349,7 +337,6 @@ void GetrfBatched(cudaStream_t stream, void** buffers, const char* opaque, case Type::C64: { cuComplex* a = static_cast(buffers[1]); cuComplex** batch_ptrs = static_cast(buffers[4]); - ThrowIfError(MakeBatchPointers(a, batch_ptrs, d.batch, d.n * d.n)); ThrowIfErrorStatus(cublasCgetrfBatched(handle.get(), d.n, batch_ptrs, d.n, ipiv, info, d.batch)); break; @@ -357,7 +344,6 @@ void GetrfBatched(cudaStream_t stream, void** buffers, const char* opaque, case Type::C128: { cuDoubleComplex* a = static_cast(buffers[1]); cuDoubleComplex** batch_ptrs = static_cast(buffers[4]); - ThrowIfError(MakeBatchPointers(a, batch_ptrs, d.batch, d.n * d.n)); ThrowIfErrorStatus(cublasZgetrfBatched(handle.get(), d.n, batch_ptrs, d.n, ipiv, info, d.batch)); break; diff --git a/jaxlib/cusolver.cc b/jaxlib/cusolver.cc index 8d1c49f26d12..a925a1178c19 100644 --- a/jaxlib/cusolver.cc +++ b/jaxlib/cusolver.cc @@ -21,6 +21,7 @@ limitations under the License. #include "absl/base/casts.h" #include "absl/container/flat_hash_map.h" +#include "absl/memory/memory.h" #include "absl/strings/str_format.h" #include "absl/synchronization/mutex.h" #include "third_party/gpus/cuda/include/cuda.h" @@ -188,6 +189,139 @@ int SizeOfType(Type type) { } } +// potrf: Cholesky decomposition + +struct PotrfDescriptor { + Type type; + cublasFillMode_t uplo; + std::int64_t batch, n; + int lwork; +}; + +// Returns the workspace size and a descriptor for a potrf operation. +std::pair BuildPotrfDescriptor(const py::dtype& dtype, + bool lower, int b, int n) { + Type type = DtypeToType(dtype); + auto handle = SolverHandlePool::Borrow(); + int lwork; + std::int64_t workspace_size; + cublasFillMode_t uplo = + lower ? CUBLAS_FILL_MODE_LOWER : CUBLAS_FILL_MODE_UPPER; + if (b == 1) { + switch (type) { + case Type::F32: + ThrowIfErrorStatus(cusolverDnSpotrf_bufferSize(handle.get(), uplo, n, + /*A=*/nullptr, + /*lda=*/n, &lwork)); + workspace_size = lwork * sizeof(float); + break; + case Type::F64: + ThrowIfErrorStatus(cusolverDnDpotrf_bufferSize(handle.get(), uplo, n, + /*A=*/nullptr, + /*lda=*/n, &lwork)); + workspace_size = lwork * sizeof(double); + break; + case Type::C64: + ThrowIfErrorStatus(cusolverDnCpotrf_bufferSize(handle.get(), uplo, n, + /*A=*/nullptr, + /*lda=*/n, &lwork)); + workspace_size = lwork * sizeof(cuComplex); + break; + case Type::C128: + ThrowIfErrorStatus(cusolverDnZpotrf_bufferSize(handle.get(), uplo, n, + /*A=*/nullptr, + /*lda=*/n, &lwork)); + workspace_size = lwork * sizeof(cuDoubleComplex); + break; + } + } else { + // We use the workspace buffer for our own scratch space. + workspace_size = sizeof(void*) * b; + } + return {workspace_size, + PackDescriptor(PotrfDescriptor{type, uplo, b, n, lwork})}; +} + +void Potrf(cudaStream_t stream, void** buffers, const char* opaque, + size_t opaque_len) { + const PotrfDescriptor& d = + *UnpackDescriptor(opaque, opaque_len); + auto handle = SolverHandlePool::Borrow(stream); + if (buffers[1] != buffers[0]) { + ThrowIfError(cudaMemcpyAsync(buffers[1], buffers[0], + SizeOfType(d.type) * d.batch * d.n * d.n, + cudaMemcpyDeviceToDevice, stream)); + } + + int* info = static_cast(buffers[2]); + void* workspace = buffers[3]; + if (d.batch == 1) { + switch (d.type) { + case Type::F32: { + float* a = static_cast(buffers[1]); + ThrowIfErrorStatus(cusolverDnSpotrf(handle.get(), d.uplo, d.n, a, d.n, + static_cast(workspace), + d.lwork, info)); + break; + } + case Type::F64: { + double* a = static_cast(buffers[1]); + ThrowIfErrorStatus(cusolverDnDpotrf(handle.get(), d.uplo, d.n, a, d.n, + static_cast(workspace), + d.lwork, info)); + break; + } + case Type::C64: { + cuComplex* a = static_cast(buffers[1]); + ThrowIfErrorStatus(cusolverDnCpotrf(handle.get(), d.uplo, d.n, a, d.n, + static_cast(workspace), + d.lwork, info)); + break; + } + case Type::C128: { + cuDoubleComplex* a = static_cast(buffers[1]); + ThrowIfErrorStatus(cusolverDnZpotrf( + handle.get(), d.uplo, d.n, a, d.n, + static_cast(workspace), d.lwork, info)); + break; + } + } + } else { + auto buffer_ptrs_host = MakeBatchPointers( + stream, buffers[1], workspace, d.batch, SizeOfType(d.type) * d.n * d.n); + // Make sure that accesses to buffer_ptrs_host complete before we delete it. + // TODO(phawkins): avoid synchronization here. + ThrowIfError(cudaStreamSynchronize(stream)); + switch (d.type) { + case Type::F32: { + ThrowIfErrorStatus(cusolverDnSpotrfBatched( + handle.get(), d.uplo, d.n, static_cast(workspace), d.n, + + info, d.batch)); + break; + } + case Type::F64: { + ThrowIfErrorStatus(cusolverDnDpotrfBatched( + handle.get(), d.uplo, d.n, static_cast(workspace), d.n, + info, d.batch)); + break; + } + case Type::C64: { + ThrowIfErrorStatus(cusolverDnCpotrfBatched( + handle.get(), d.uplo, d.n, static_cast(workspace), d.n, + info, d.batch)); + break; + } + case Type::C128: { + ThrowIfErrorStatus(cusolverDnZpotrfBatched( + handle.get(), d.uplo, d.n, + static_cast(workspace), d.n, info, d.batch)); + break; + } + } + } +} + // getrf: LU decomposition struct GetrfDescriptor { @@ -1127,6 +1261,7 @@ void Gesvdj(cudaStream_t stream, void** buffers, const char* opaque, py::dict Registrations() { py::dict dict; + dict["cusolver_potrf"] = EncapsulateFunction(Potrf); dict["cusolver_getrf"] = EncapsulateFunction(Getrf); dict["cusolver_geqrf"] = EncapsulateFunction(Geqrf); dict["cusolver_orgqr"] = EncapsulateFunction(Orgqr); @@ -1139,6 +1274,7 @@ py::dict Registrations() { PYBIND11_MODULE(cusolver_kernels, m) { m.def("registrations", &Registrations); + m.def("build_potrf_descriptor", &BuildPotrfDescriptor); m.def("build_getrf_descriptor", &BuildGetrfDescriptor); m.def("build_geqrf_descriptor", &BuildGeqrfDescriptor); m.def("build_orgqr_descriptor", &BuildOrgqrDescriptor); diff --git a/jaxlib/cusolver.py b/jaxlib/cusolver.py index 6c52e57c8b45..c096aae1e322 100644 --- a/jaxlib/cusolver.py +++ b/jaxlib/cusolver.py @@ -99,6 +99,39 @@ def trsm(c, a, b, left_side=False, lower=False, trans_a=False, conj_a=False, return c.GetTupleElement(out, 0) +def potrf(c, a, lower): + """Cholesky decomposition.""" + a_shape = c.GetShape(a) + dtype = a_shape.element_type() + dims = a_shape.dimensions() + m, n = dims[-2:] + assert m == n + batch_dims = tuple(dims[:-2]) + num_bd = len(batch_dims) + batch = _prod(batch_dims) + + lwork, opaque = cusolver_kernels.build_potrf_descriptor( + np.dtype(dtype), lower, batch, n) + kernel = b"cusolver_potrf" + + out = c.CustomCall( + kernel, + operands=(a,), + shape_with_layout=_Shape.tuple_shape(( + _Shape.array_shape( + dtype, batch_dims + (n, n), + (num_bd, num_bd + 1) + tuple(range(num_bd - 1, -1, -1))), + _Shape.array_shape( + np.dtype(np.int32), batch_dims, tuple(range(num_bd - 1, -1, -1))), + _Shape.array_shape(np.dtype(np.int8), (lwork,), (0,)), + )), + operand_shapes_with_layout=(_Shape.array_shape( + dtype, batch_dims + (n, n), + (num_bd, num_bd + 1) + tuple(range(num_bd - 1, -1, -1))),), + opaque=opaque) + return c.GetTupleElement(out, 0), c.GetTupleElement(out, 1) + + def getrf(c, a): """LU decomposition.""" a_shape = c.GetShape(a) diff --git a/jaxlib/gpu_kernel_helpers.cc b/jaxlib/gpu_kernel_helpers.cc index a8b521eaabbd..289c90946dcc 100644 --- a/jaxlib/gpu_kernel_helpers.cc +++ b/jaxlib/gpu_kernel_helpers.cc @@ -17,6 +17,7 @@ limitations under the License. #include +#include "absl/memory/memory.h" #include "absl/strings/str_cat.h" namespace jax { @@ -28,5 +29,18 @@ void ThrowIfError(cudaError_t error) { } } +std::unique_ptr MakeBatchPointers(cudaStream_t stream, void* buffer, + void* dev_ptrs, int batch, + int batch_elem_size) { + char* ptr = static_cast(buffer); + auto host_ptrs = absl::make_unique(batch); + for (int i = 0; i < batch; ++i) { + host_ptrs[i] = ptr; + ptr += batch_elem_size; + } + ThrowIfError(cudaMemcpyAsync(dev_ptrs, host_ptrs.get(), sizeof(void*) * batch, + cudaMemcpyHostToDevice, stream)); + return host_ptrs; +} } // namespace jax diff --git a/jaxlib/gpu_kernel_helpers.h b/jaxlib/gpu_kernel_helpers.h index fc4d8b72ab3d..7159c0edac87 100644 --- a/jaxlib/gpu_kernel_helpers.h +++ b/jaxlib/gpu_kernel_helpers.h @@ -16,12 +16,22 @@ limitations under the License. #ifndef JAXLIB_GPU_KERNEL_HELPERS_H_ #define JAXLIB_GPU_KERNEL_HELPERS_H_ +#include + #include "third_party/gpus/cuda/include/cuda_runtime_api.h" namespace jax { void ThrowIfError(cudaError_t error); +// Builds an array of pointers to each array in a batch, in device memory. +// Caution: the return value must be kept alive (e.g., via a stream +// synchronization) until the copy enqueued by MakeBatchPointers on `stream` +// completes. +std::unique_ptr MakeBatchPointers(cudaStream_t stream, void* buffer, + void* dev_ptrs, int batch, + int batch_elem_size); + } // namespace jax #endif // JAXLIB_GPU_KERNEL_HELPERS_H_ diff --git a/jaxlib/lapack.pyx b/jaxlib/lapack.pyx index 6b9abbbd5041..b88f040b9b1e 100644 --- a/jaxlib/lapack.pyx +++ b/jaxlib/lapack.pyx @@ -773,67 +773,87 @@ def orgqr(c, a, tau): cdef void lapack_spotrf(void* out_tuple, void** data) nogil: cdef int32_t lower = ((data[0]))[0] - cdef int n = ((data[1]))[0] - cdef const float* a_in = (data[2]) + cdef int b = ((data[1]))[0] + cdef int n = ((data[2]))[0] + cdef const float* a_in = (data[3]) cdef char uplo = 'L' if lower else 'U' cdef void** out = (out_tuple) cdef float* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, (n) * (n) * sizeof(float)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(float)) - spotrf(&uplo, &n, a_out, &n, info) + for i in range(b): + spotrf(&uplo, &n, a_out, &n, info) + a_out += (n) * (n) + info += 1 register_cpu_custom_call_target(b"lapack_spotrf", (lapack_spotrf)) cdef void lapack_dpotrf(void* out_tuple, void** data) nogil: cdef int32_t lower = ((data[0]))[0] - cdef int n = ((data[1]))[0] - cdef const double* a_in = (data[2]) + cdef int b = ((data[1]))[0] + cdef int n = ((data[2]))[0] + cdef const double* a_in = (data[3]) cdef char uplo = 'L' if lower else 'U' cdef void** out = (out_tuple) cdef double* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, (n) * (n) * sizeof(double)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(double)) - dpotrf(&uplo, &n, a_out, &n, info) + for i in range(b): + dpotrf(&uplo, &n, a_out, &n, info) + a_out += (n) * (n) + info += 1 register_cpu_custom_call_target(b"lapack_dpotrf", (lapack_dpotrf)) cdef void lapack_cpotrf(void* out_tuple, void** data) nogil: cdef int32_t lower = ((data[0]))[0] - cdef int n = ((data[1]))[0] - cdef const float complex* a_in = (data[2]) + cdef int b = ((data[1]))[0] + cdef int n = ((data[2]))[0] + cdef const float complex* a_in = (data[3]) cdef char uplo = 'L' if lower else 'U' cdef void** out = (out_tuple) cdef float complex* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, (n) * (n) * sizeof(float complex)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(float complex)) - cpotrf(&uplo, &n, a_out, &n, info) + for i in range(b): + cpotrf(&uplo, &n, a_out, &n, info) + a_out += (n) * (n) + info += 1 register_cpu_custom_call_target(b"lapack_cpotrf", (lapack_cpotrf)) cdef void lapack_zpotrf(void* out_tuple, void** data) nogil: cdef int32_t lower = ((data[0]))[0] - cdef int n = ((data[1]))[0] - cdef const double complex* a_in = (data[2]) + cdef int b = ((data[1]))[0] + cdef int n = ((data[2]))[0] + cdef const double complex* a_in = (data[3]) cdef char uplo = 'L' if lower else 'U' cdef void** out = (out_tuple) cdef double complex* a_out = (out[0]) cdef int* info = (out[1]) if a_out != a_in: - memcpy(a_out, a_in, (n) * (n) * sizeof(double complex)) + memcpy(a_out, a_in, + (b) * (n) * (n) * sizeof(double complex)) - zpotrf(&uplo, &n, a_out, &n, info) + for i in range(b): + zpotrf(&uplo, &n, a_out, &n, info) + a_out += (n) * (n) + info += 1 register_cpu_custom_call_target(b"lapack_zpotrf", (lapack_zpotrf)) @@ -842,7 +862,8 @@ def potrf(c, a, lower=False): a_shape = c.GetShape(a) dtype = a_shape.element_type() - m, n = a_shape.dimensions() + dims = a_shape.dimensions() + m, n = dims[-2:] if m != n: raise ValueError("potrf expects a square matrix, got {}".format(a_shape)) if dtype == np.float32: @@ -855,24 +876,30 @@ def potrf(c, a, lower=False): fn = b"lapack_zpotrf" else: raise NotImplementedError("Unsupported dtype {}".format(dtype)) + batch_dims = tuple(dims[:-2]) + num_bd = len(batch_dims) + b = 1 + for d in batch_dims: + b *= d + layout = (num_bd, num_bd + 1) + tuple(range(num_bd - 1, -1, -1)) out = c.CustomCall( fn, - operands=(c.ConstantS32Scalar(int(lower)), c.ConstantS32Scalar(n), a), + operands=(c.ConstantS32Scalar(int(lower)), + c.ConstantS32Scalar(b), c.ConstantS32Scalar(n), a), shape_with_layout=Shape.tuple_shape(( - Shape.array_shape(dtype, (n, n), (0, 1)), - Shape.array_shape(np.dtype(np.int32), (), ()), + Shape.array_shape(dtype, dims, layout), + Shape.array_shape( + np.dtype(np.int32), batch_dims, tuple(range(num_bd - 1, -1, -1))), )), operand_shapes_with_layout=( Shape.array_shape(np.dtype(np.int32), (), ()), Shape.array_shape(np.dtype(np.int32), (), ()), - Shape.array_shape(dtype, (n, n), (0, 1)), + Shape.array_shape(np.dtype(np.int32), (), ()), + Shape.array_shape(dtype, dims, layout), )) return tuple(c.GetTupleElement(out, i) for i in range(2)) -def jax_potrf(c, a, lower=False): - return c.Tuple(*potrf(c, a, lower)) - # ?gesdd: Singular value decomposition diff --git a/tests/linalg_test.py b/tests/linalg_test.py index e386cceee342..0317d1900b9c 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -72,8 +72,9 @@ def args_maker(): a = rng(factor_shape, dtype) return [onp.matmul(a, np.conj(T(a)))] - if np.issubdtype(dtype, np.complexfloating) and ( - len(shape) > 2 or jtu.device_under_test() != "cpu"): + if (np.issubdtype(dtype, np.complexfloating) and + (jtu.device_under_test() == "tpu" or + (jtu.device_under_test() == "cpu" and jax.lib.version < (0, 1, 38)))): self.skipTest("Unimplemented case for complex Cholesky decomposition.") self._CheckAgainstNumpy(onp.linalg.cholesky, np.linalg.cholesky, args_maker, From ad9b6d4d94139b21db41297e96c2f6b1c5e48e69 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 3 Jan 2020 15:46:19 -0800 Subject: [PATCH 0582/1053] implement lazy sublanguage Before this commit, this computation would avoid materializing the iota array at trace time: @jit def f(x): m, n = x.shape return x + np.arange(n) But this one would materialize the iota array at trace time and stage it into the computation as a potentially large array constant: @jit def f(x): m, n = x.shape return x + np.arange(m)[:, None] The difference is that previously operations like broadcasts, transposes, and reshapes that add singleton dimensions (as above) would force otherwise lazy values to be materialized, while after this commit broadcasts, transposes, and reshapes are all lazy operations that only update metadata on their input rather than compiling and executing XLA computations and producing new buffers. Also, np.eye and np.tri become lazy (in addition to np.zeros, np.ones, np.full). This commit replaces the ad-hoc "lazy device constant" system, which was used to get the simpler behavior in the first example above. Incidentally fixes #1431 See https://github.com/google/jax/pull/1668 for more. --- jax/interpreters/pxla.py | 15 +- jax/interpreters/xla.py | 138 +++++++++++------ jax/lax/__init__.py | 2 +- jax/lax/lax.py | 229 ++++++++++++----------------- jax/lazy.py | 244 +++++++++++++++++++++++++++++++ jax/numpy/lax_numpy.py | 40 ++--- jax/scipy/special.py | 3 +- jax/util.py | 6 + tests/api_test.py | 188 +++++++++++++++++++++++- tests/batching_test.py | 2 +- tests/lax_numpy_indexing_test.py | 7 +- tests/lax_numpy_test.py | 15 +- tests/lax_test.py | 17 +-- tests/multi_device_test.py | 34 +++++ tests/multibackend_test.py | 12 ++ tests/pmap_test.py | 1 + 16 files changed, 716 insertions(+), 237 deletions(-) create mode 100644 jax/lazy.py diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 94d0a6f55d3e..049e50486887 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -30,6 +30,7 @@ from ..config import flags from .. import core from .. import linear_util as lu +from .. import lazy from ..abstract_arrays import (ConcreteArray, ShapedArray, array_types, raise_to_shaped) from ..util import partial, unzip2, concatenate, prod, safe_map @@ -360,8 +361,7 @@ def __getitem__(self, idx): ids = self._ids() device_buffer = self.device_buffers[ids[idx]] aval = ShapedArray(self.aval.shape[1:], self.aval.dtype) - handler = xla.aval_to_result_handler(None, aval) - return handler(device_buffer) + return xla.DeviceArray(aval, None, lazy.array(aval.shape), device_buffer) else: return super(ShardedDeviceArray, self).__getitem__(idx) @@ -376,11 +376,14 @@ def _shard_sharded_device_array(x, devices, assignments): return (xla.device_put(x[assignments[r]], devices[r]) for r in range(n)) shard_arg_handlers[ShardedDeviceArray] = _shard_sharded_device_array +def _sharded_device_array_constant_handler(c, val, canonicalize_types=True): + return c.Constant(onp.asarray(val), canonicalize_types=canonicalize_types) +xb.register_constant_handler(ShardedDeviceArray, _sharded_device_array_constant_handler) + core.pytype_aval_mappings[ShardedDeviceArray] = ConcreteArray xla.device_put_handlers[ShardedDeviceArray] = xla._device_put_array -xla.pytype_aval_mappings[ShardedDeviceArray] = lambda x: x.aval +xla.pytype_aval_mappings[ShardedDeviceArray] = op.attrgetter('aval') xla.canonicalize_dtype_handlers[ShardedDeviceArray] = identity -xb.register_constant_handler(ShardedDeviceArray, xla._device_array_constant_handler) class ChunkedDeviceArray(ShardedDeviceArray): @@ -398,10 +401,8 @@ def __getitem__(self, idx): core.pytype_aval_mappings[ChunkedDeviceArray] = ConcreteArray xla.device_put_handlers[ChunkedDeviceArray] = xla._device_put_array -xla.pytype_aval_mappings[ChunkedDeviceArray] = lambda x: x.aval +xla.pytype_aval_mappings[ChunkedDeviceArray] = op.attrgetter('aval') xla.canonicalize_dtype_handlers[ChunkedDeviceArray] = identity -xb.register_constant_handler(ChunkedDeviceArray, - xla._device_array_constant_handler) ### the xla_pmap primitive and its rules are comparable to xla_call in xla.py diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 76523d5abff5..852920727a17 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -32,6 +32,7 @@ from .. import ad_util from .. import tree_util from .. import dtypes +from .. import lazy from .. import linear_util as lu from ..abstract_arrays import (ConcreteArray, ShapedArray, AbstractToken, make_shaped_array, array_types, raise_to_shaped, @@ -78,7 +79,7 @@ def aval_to_result_handler(device, aval): xla_result_handlers = {} xla_result_handlers[core.AbstractUnit] = lambda _, __: lambda _: core.unit def array_result_handler(device, aval): - return partial(DeviceArray, raise_to_shaped(aval), device) + return partial(DeviceArray, raise_to_shaped(aval), device, lazy.array(aval.shape)) xla_result_handlers[ShapedArray] = array_result_handler xla_result_handlers[ConcreteArray] = array_result_handler @@ -146,6 +147,7 @@ def _make_abstract_python_scalar(typ, _): for _t in dtypes.python_scalar_dtypes.keys(): pytype_aval_mappings[_t] = partial(_make_abstract_python_scalar, _t) + ### op-by-op execution def arg_spec(x): @@ -536,6 +538,7 @@ def _xla_callable_args(c, avals, tuple_args): def _pval_to_result_handler(device, pval): pv, const = pval if pv is None: + const = _device_put_impl(const, device) if device else const return lambda _: const else: return aval_to_result_handler(device, pv) @@ -566,8 +569,8 @@ def _execute_trivial(jaxpr, device, consts, handlers, *args): _map(env.setdefault, jaxpr.constvars, consts) outs = [canonicalize_dtype(v.val) if type(v) is Literal else env[v] for v in jaxpr.outvars] - return [x if type(x) is DeviceArray else handler(device_put(x, device)) - for handler, x in zip(handlers, outs)] + return [_copy_device_array_to_device(x, device) if type(x) is DeviceArray + else h(device_put(x, device)) for h, x in zip(handlers, outs)] def make_tuple(bufs, device, backend): return xb.get_backend(backend).make_tuple(bufs, device) @@ -678,7 +681,7 @@ def __init__(self, aval, device_buffer): self.device_buffer = device_buffer def _check_if_deleted(self): - if self.device_buffer is None: + if self.device_buffer is deleted_buffer: raise ValueError("DeviceValue has been deleted.") def block_until_ready(self): @@ -702,13 +705,14 @@ class DeviceArray(DeviceValue): """A DeviceArray is an ndarray backed by a single device memory buffer.""" # We don't subclass ndarray because that would open up a host of issues, # but lax_numpy.py overrides isinstance behavior and attaches ndarray methods. - __slots__ = ["_npy_value", "_device"] + __slots__ = ["_npy_value", "_device", "_lazy_expr"] __array_priority__ = 100 - def __init__(self, aval, device, device_buffer): + def __init__(self, aval, device, lazy_expr, device_buffer): self.aval = aval self.device_buffer = device_buffer self._device = device and (type(device), device.id) + self._lazy_expr = lazy_expr self._npy_value = None if not core.skip_checks: @@ -720,7 +724,10 @@ def __init__(self, aval, device, device_buffer): def _value(self): self._check_if_deleted() if self._npy_value is None: - self._npy_value = self.device_buffer.to_py() + if is_device_constant(self): + self._npy_value = lazy.eval_lexpr(self._lazy_expr, None) + else: + self._npy_value = _force(self).device_buffer.to_py() self._npy_value.flags.writeable = False return self._npy_value @@ -747,7 +754,7 @@ def copy(self): def copy_to_host_async(self): """Requests a copy of the buffer to the host.""" self._check_if_deleted() - if self._npy_value is None: + if self._npy_value is None and not is_device_constant(self): self.device_buffer.copy_to_host_async() def delete(self): @@ -762,7 +769,7 @@ def delete(self): time of deletion. """ self.device_buffer.delete() - self.device_buffer = None + self.device_buffer = deleted_buffer self._npy_value = None def __repr__(self): @@ -837,31 +844,97 @@ def __eq__(self, other): return self._value == other def __hash__(self): raise TypeError("JAX DeviceArray, like numpy.ndarray, is not hashable.") +class DeletedBuffer(object): pass +deleted_buffer = DeletedBuffer() + +class DeviceConstant(object): + __slots__ = ["_device"] + def __init__(self, device=None): self._device = device + def device(self): return self._device + def to_py(self): return None + +def is_device_constant(x): + return type(x) is DeviceArray and type(x.device_buffer) is DeviceConstant + core.literalable_types.add(DeviceArray) core.pytype_aval_mappings[DeviceArray] = ConcreteArray -pytype_aval_mappings[DeviceArray] = lambda x: x.aval +pytype_aval_mappings[DeviceArray] = op.attrgetter('aval') canonicalize_dtype_handlers[DeviceArray] = identity def _device_array_constant_handler(c, val, canonicalize_types=True): - return c.Constant(onp.asarray(val), canonicalize_types=canonicalize_types) + if is_device_constant(val): + return lazy.stage_lexpr(c, val._lazy_expr, None) + else: + base_val = c.Constant(val.device_buffer.to_py()) + return lazy.stage_lexpr(c, val._lazy_expr, base_val) xb.register_constant_handler(DeviceArray, _device_array_constant_handler) def _device_put_device_array(x, device): - # TODO(skye): we're assuming the DeviceBuffers without "platform" are - # XrtBuffers. Figure out a less risky way to deal with XrtBuffers. - if (not hasattr(x.device_buffer, "platform") or - xb.get_device_backend(device).platform == x.device_buffer.platform()): + x = _copy_device_array_to_device(x, device) + return _force(x).device_buffer +device_put_handlers[DeviceArray] = _device_put_device_array + +def _copy_device_array_to_device(x, device): + if is_device_constant(x): + return DeviceArray(x.aval, device, x._lazy_expr, DeviceConstant(device)) + elif xb.get_device_backend(device).platform == x.device_buffer.platform(): if device is None or x.device_buffer.device() == device: - return x.device_buffer + return x else: - return x.device_buffer.copy_to_device(device) + moved_buf = x.device_buffer.copy_to_device(device) else: - # Buffers from different XLA backends are passed through the host. - return xc.Buffer.from_pyval(x, device, backend=xb.get_device_backend(device)) -device_put_handlers[DeviceArray] = _device_put_device_array + # Buffers from different XLA backends are passed through the host. + moved_buf = xc.Buffer.from_pyval(x.device_buffer.to_py(), device, + backend=xb.get_device_backend(device)) + return DeviceArray(x.aval, device, x._lazy_expr, moved_buf) + +def _force(x): + if lazy.is_trivial(x._lazy_expr): + return x + else: + # force x on the device where it lives, but preserve stickiness on result + if x._device: + device = x._device + sticky = True + else: + d = x.device_buffer.device() + device = d and (type(d), d.id) + sticky = False + force_fun = _lazy_force_computation(sticky, x.aval, device, x._lazy_expr) + return force_fun(x) + +@cache() +def _lazy_force_computation(sticky, aval, device, lexpr): + c = xb.make_computation_builder("lazy_force") + if lazy.is_constant(lexpr): + param = None + else: + idxs = [(src, dst) for dst, src in enumerate(lexpr.dims) if src is not None] + param_shape = [None] * len(idxs) + for src, dst in idxs: + param_shape[src] = aval.shape[dst] + param = c.ParameterWithShape(xc.Shape.array_shape(aval.dtype, param_shape)) + xla_out = lazy.stage_lexpr(c, lexpr, param) + built_c = c.Build(xla_out) + + device = _device_from_arg_devices([device]) + options = xb.get_compile_options(device_assignment=device and (device.id,)) + backend = xb.get_device_backend(device) + compiled = built_c.Compile(compile_options=options, backend=backend) + + result_device = device if sticky else None + handler = partial(DeviceArray, aval, result_device, lazy.array(aval.shape)) + if lazy.is_constant(lexpr): + force_fun = lambda _: handler(compiled.Execute([])) + else: + force_fun = lambda x: handler(compiled.Execute([x.device_buffer])) + return force_fun def _device_put_impl(x, device=None): + if type(x) is DeviceArray: + return _copy_device_array_to_device(x, device) + try: a = abstractify(x) except TypeError: @@ -904,28 +977,3 @@ def _foil_cse(c, x): shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) return c.Select(pred, x, zero) - - -### lazy constants - -class DeviceConstant(DeviceArray): - def copy_to_host_async(self): pass - - @staticmethod - def constant_handler(c, constant_instance, canonicalize_types=True): - assert False - -def _instantiate_device_constant(const, device=None, backend=None, cutoff=1e6): - # dispatch an XLA Computation to build the constant on the device if it's - # large, or alternatively build it on the host and transfer it if it's small - assert isinstance(const, DeviceConstant) - backend = xb.get_backend(device.platform) if device else xb.get_backend(backend) - if const.size > cutoff: - c = xb.make_computation_builder("constant_instantiating_computation") - xla_const = const.constant_handler(c, const) - device_assignment = (device.id,) if device else None - opts = xb.get_compile_options(device_assignment=device_assignment) - compiled = c.Build(xla_const).Compile((), opts, backend=backend) - return compiled.Execute(()) - else: - return xc.Buffer.from_pyval(onp.asarray(const), device, backend=backend) diff --git a/jax/lax/__init__.py b/jax/lax/__init__.py index c40c3531b233..8a7192a91182 100644 --- a/jax/lax/__init__.py +++ b/jax/lax/__init__.py @@ -21,7 +21,7 @@ _input_dtype, _const, _eq_meet, _safe_mul, _broadcasting_select, _check_user_dtype_supported, _one, _const, _upcast_fp16_for_computation, - _broadcasting_shape_rule) + _broadcasting_shape_rule, _eye, _tri, _delta) from .lax_control_flow import * from .lax_fft import * from .lax_parallel import * diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 38e4d627e35c..dc3789df40e3 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -36,6 +36,7 @@ from .. import api from .. import linear_util as lu from .. import dtypes +from .. import lazy from ..config import flags from ..core import Primitive from ..abstract_arrays import (UnshapedArray, ShapedArray, ConcreteArray, @@ -615,15 +616,12 @@ def broadcast(operand, sizes): Returns: An array containing the result. """ - return broadcast_p.bind(operand, sizes=tuple(sizes)) + dims = tuple(range(len(sizes), len(sizes) + onp.ndim(operand))) + return broadcast_in_dim(operand, tuple(sizes) + onp.shape(operand), dims) def broadcast_in_dim(operand, shape, broadcast_dimensions): if onp.ndim(operand) == len(shape) and not len(broadcast_dimensions): return operand - if any(x < 0 or x >= len(shape) for x in broadcast_dimensions): - msg = ("broadcast dimensions must be >= 0 and < ndim(shape), got {} for " - "shape {}") - raise ValueError(msg.format(broadcast_dimensions, shape)) return broadcast_in_dim_p.bind( operand, shape=tuple(shape), broadcast_dimensions=tuple(broadcast_dimensions)) @@ -1060,47 +1058,64 @@ def full(shape, fill_value, dtype=None): if onp.shape(fill_value): msg = "full must be called with scalar fill_value, got fill_value.shape {}." raise TypeError(msg.format(onp.shape(fill_value))) - dtype = dtype or _dtype(fill_value) - dtype = dtypes.canonicalize_dtype(dtype) - - # For constants (defined as Python scalars, raw ndarrays, or DeviceValues), - # create a _FilledConstant value, otherwise just call broadcast. - if onp.isscalar(fill_value) or type(fill_value) is onp.ndarray: - return _FilledConstant(onp.asarray(fill_value, dtype), shape) - elif isinstance(fill_value, xla.DeviceValue): - val = onp.asarray(fill_value, dtype) - return _FilledConstant(val, shape) - else: - return broadcast(convert_element_type(fill_value, dtype), shape) + dtype = dtypes.canonicalize_dtype(dtype or _dtype(fill_value)) + # TODO(mattjj): remove device_put when dtype conversion produces DeviceArray + fill_value = xla.device_put_p.bind(convert_element_type(fill_value, dtype)) + return broadcast(fill_value, shape) def iota(dtype, size): """Wraps XLA's `Iota `_ operator. """ - return broadcasted_iota(dtype, (int(size),), 0) + size = int(size) + dtype = dtypes.canonicalize_dtype(dtype) + lazy_expr = lazy.iota(dtype, size) + aval = ShapedArray((size,), dtype) + return xla.DeviceArray(aval, None, lazy_expr, xla.DeviceConstant()) def broadcasted_iota(dtype, shape, dimension): - """Wraps XLA's `Iota - `_ - operator. - """ + """Convenience wrapper around ``iota``.""" dtype = dtypes.canonicalize_dtype(dtype) shape = _canonicalize_shape(shape) dimension = int(dimension) - return _IotaConstant(dtype, shape, dimension) + return broadcast_in_dim(iota(dtype, shape[dimension]), shape, [dimension]) -def eye(dtype, size): - return broadcasted_eye(dtype, (size, size), (0, 1)) +def _eye(dtype, shape, offset): + """Like numpy.eye, create a 2D array with ones on a diagonal. -def broadcasted_eye(dtype, shape, axes): - if not isinstance(axes, (list, tuple)) or not len(axes) >= 2: - raise TypeError("make_diagonal `axes` must be a tuple with len at least 2.") + This function exists for creating lazy identity matrices; that is, + materialization of the array is delayed and it may be fused into consumers to + avoid materialization at all.""" + N, M = tuple(map(int, shape)) + offset = int(offset) dtype = dtypes.canonicalize_dtype(dtype) - shape = _canonicalize_shape(shape) + lazy_expr = lazy.eye(dtype, (N, M), offset) + aval = ShapedArray((N, M), dtype) + return xla.DeviceArray(aval, None, lazy_expr, xla.DeviceConstant()) + +def _delta(dtype, shape, axes): + """This function exists for creating lazy Kronecker delta arrays, particularly + for use in jax.numpy.einsum to express traces. It differs from ``eye`` in that + it can create arrays of any rank, but doesn't allow offsets.""" + shape = tuple(map(int, shape)) axes = tuple(map(int, axes)) - return _EyeConstant(shape, axes, dtype) - + dtype = dtypes.canonicalize_dtype(dtype) + base_shape = tuple(onp.take(shape, axes)) + lazy_expr = lazy.broadcast(lazy.delta(dtype, base_shape), shape, axes) + aval = ShapedArray(shape, dtype) + return xla.DeviceArray(aval, None, lazy_expr, xla.DeviceConstant()) + +def _tri(dtype, shape, offset): + """Like numpy.tri, create a 2D array with ones below a diagonal. + This function exists for creating lazy triangular matrices, particularly for + use in jax.numpy.tri.""" + N, M = tuple(map(int, shape)) + offset = int(offset) + dtype = dtypes.canonicalize_dtype(dtype) + lazy_expr = lazy.tri(dtype, (N, M), offset) + aval = ShapedArray((N, M), dtype) + return xla.DeviceArray(aval, None, lazy_expr, xla.DeviceConstant()) def stop_gradient(x): """Stops gradient computation. @@ -2288,11 +2303,23 @@ def _broadcast_batch_rule(batched_args, batch_dims, sizes): ad.deflinear(broadcast_p, lambda t, sizes: [_reduce_sum(t, range(len(sizes)))]) batching.primitive_batchers[broadcast_p] = _broadcast_batch_rule +def _broadcast_in_dim_impl(operand, shape, broadcast_dimensions): + if type(operand) is xla.DeviceArray: + aval = ShapedArray(shape, _dtype(operand)) + lazy_expr = lazy.broadcast(operand._lazy_expr, shape, broadcast_dimensions) + return xla.DeviceArray(aval, None, lazy_expr, operand.device_buffer) + else: + return xla.apply_primitive(broadcast_in_dim_p, operand, shape=shape, + broadcast_dimensions=broadcast_dimensions) def _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions): _check_shapelike('broadcast_in_dim', 'shape', shape) _check_shapelike('broadcast_in_dim', 'broadcast_dimensions', broadcast_dimensions) + if any(x >= len(shape) for x in broadcast_dimensions): + msg = ("broadcast_in_dim broadcast dimensions must be less than " + "ndim(shape), got {} for shape {}.") + raise ValueError(msg.format(broadcast_dimensions, shape)) if operand.ndim != len(broadcast_dimensions): msg = ('broadcast_in_dim broadcast_dimensions must have length equal to ' 'operand ndim, got broadcast_dimensions {} for operand ndim {}.') @@ -2319,6 +2346,7 @@ def _broadcast_in_dim_batch_rule(batched_args, batch_dims, shape, broadcast_in_dim_p = standard_primitive( _broadcast_in_dim_shape_rule, _input_dtype, 'broadcast_in_dim') +broadcast_in_dim_p.def_impl(_broadcast_in_dim_impl) ad.deflinear(broadcast_in_dim_p, _broadcast_in_dim_transpose_rule) batching.primitive_batchers[broadcast_in_dim_p] = _broadcast_in_dim_batch_rule @@ -2466,9 +2494,14 @@ def _pad_batch_rule(batched_args, batch_dims, padding_config): batching.primitive_batchers[pad_p] = _pad_batch_rule -# We have a nonstandard reshape impl so that we can be lazy about data movement -# for specific types, particularly ShardedDeviceArrays / ChunkedDeviceArrays +# We have a nonstandard reshape impl so that we can be lazy about data movement. def _reshape_impl(operand, new_sizes, dimensions, old_sizes): + if type(operand) is xla.DeviceArray and dimensions is None: + bcast_dims = _is_singleton_reshape(old_sizes, new_sizes) + if bcast_dims is not None: + aval = ShapedArray(new_sizes, operand.dtype) + lazy_expr = lazy.broadcast(operand._lazy_expr, new_sizes, bcast_dims) + return xla.DeviceArray(aval, None, lazy_expr, operand.device_buffer) if (type(operand) is pxla.ShardedDeviceArray and dimensions is None and _is_axis_merge(old_sizes, new_sizes)): aval = ShapedArray(new_sizes, operand.dtype) @@ -2482,6 +2515,26 @@ def _reshape_impl(operand, new_sizes, dimensions, old_sizes): return xla.apply_primitive(reshape_p, operand, new_sizes=new_sizes, dimensions=dimensions, old_sizes=old_sizes) +def _is_singleton_reshape(old, new): + # A singleton reshape is one where only singleton dimensions are added. We + # want to detect them because they can be expressed as (lazy) broadcasts. + old, new = iter(old), iter(new) + d1, d2 = next(old, None), next(new, None) + bcast_dims = [] + i = 0 + while True: + if d1 is d2 is None: + return bcast_dims + elif d1 == d2: + bcast_dims.append(i) + i += 1 + d1, d2 = next(old, None), next(new, None) + elif d2 == 1: + i += 1 + d2 = next(new, None) + else: + return None + def _is_axis_merge(s1, s2): return s1[2:] == s2[1:] and s1[0] * s1[1] == s2[0] @@ -2560,6 +2613,14 @@ def _rev_batch_rule(batched_args, batch_dims, dimensions): batching.primitive_batchers[rev_p] = _rev_batch_rule +def _transpose_impl(operand, permutation): + if type(operand) is xla.DeviceArray: + lazy_expr = lazy.transpose(operand._lazy_expr, permutation) + aval = ShapedArray(lazy_expr.shape, operand.dtype) + return xla.DeviceArray(aval, None, lazy_expr, operand.device_buffer) + else: + return xla.apply_primitive(transpose_p, operand, permutation=permutation) + def _transpose_shape_rule(operand, permutation): if not isinstance(permutation, (tuple, list, onp.ndarray)): msg = "transpose permutation must be a tuple/list/ndarray, got {}." @@ -2578,6 +2639,7 @@ def _transpose_batch_rule(batched_args, batch_dims, permutation): transpose_p = standard_primitive(_transpose_shape_rule, _input_dtype, 'transpose') +transpose_p.def_impl(_transpose_impl) ad.deflinear(transpose_p, lambda t, permutation: [transpose(t, onp.argsort(permutation))]) batching.primitive_batchers[transpose_p] = _transpose_batch_rule @@ -4037,100 +4099,6 @@ def _tie_in_batch_rule(batched_args, batch_dims): masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] -### constants - - -class _FilledConstant(xla.DeviceConstant): - __slots__ = ["fill_value"] - - def __init__(self, fill_value, shape): - assert type(fill_value) is onp.ndarray - self.aval = ShapedArray(shape, _dtype(fill_value)) - self._npy_value = None - - self.fill_value = fill_value - - @property - def _value(self): - return onp.full(self.shape, self.fill_value) - - @staticmethod - def constant_handler(c, filled_const, canonicalize_types=True): - return c.Broadcast( - c.NumpyArrayConstant(filled_const.fill_value, canonicalize_types), - filled_const.shape) - - -class _IotaConstant(xla.DeviceConstant): - __slots__ = ["axis"] - - def __init__(self, dtype, shape, axis): - self.aval = ShapedArray(shape, onp.dtype(dtype)) - self._npy_value = None - - self.axis = axis - - @property - def _value(self): - if self._npy_value is None: - iota = onp.arange(self.shape[self.axis], dtype=self.dtype) - iota = iota.reshape([self.shape[self.axis] if i == self.axis else 1 - for i in range(self.ndim)]) - self._npy_value = onp.broadcast_to(iota, self.shape) - return self._npy_value - - @staticmethod - def constant_handler(c, iota_constant, canonicalize_types=True): - dtype = iota_constant.dtype - if canonicalize_types: - dtype = dtypes.canonicalize_dtype(dtype) - return c.BroadcastedIota(dtype, iota_constant.shape, iota_constant.axis) - - -class _EyeConstant(xla.DeviceConstant): - __slots__ = ["axes"] - - def __init__(self, shape, axes, dtype): - self.aval = ShapedArray(shape, onp.dtype(dtype)) - self._npy_value = None - - self.axes = axes - - @property - def _value(self): - if self._npy_value is None: - ones = [1] * self.ndim - iotas = [onp.arange(self.shape[axis]).reshape(subvals(ones, [(axis, -1)])) - for axis in self.axes] - eyes = [i1 == i2 for i1, i2 in zip(iotas[:-1], iotas[1:])] - result = onp.asarray(_reduce(operator.and_, eyes), self.dtype) - self._npy_value = onp.broadcast_to(result, self.shape) - return self._npy_value - - @staticmethod - def constant_handler(c, diag_const, canonicalize_types=True): - if canonicalize_types: - etype = xla_bridge.dtype_to_etype(diag_const.dtype) - else: - etype = xla_client.dtype_to_etype(diag_const.dtype) - etype = xla_bridge.dtype_to_etype(diag_const.dtype) - iotas = [c.BroadcastedIota(onp.uint32, diag_const.shape, axis) - for axis in diag_const.axes] - eyes = [c.Eq(i1, i2) for i1, i2 in zip(iotas[:-1], iotas[1:])] - return c.ConvertElementType(_reduce(c.And, eyes), etype) - - -for _t in [_FilledConstant, _IotaConstant, _EyeConstant]: - xla_bridge.register_constant_handler(_t, _t.constant_handler) - core.pytype_aval_mappings[_t] = ConcreteArray - xla.pytype_aval_mappings[_t] = make_shaped_array - xla.device_put_handlers[_t] = xla._instantiate_device_constant - pxla.shard_arg_handlers[_t] = pxla._shard_array - xla.canonicalize_dtype_handlers[_t] = _identity - ad_util.jaxval_adders[_t] = add - ad_util.jaxval_zeros_likers[_t] = zeros_like_array - - ### stop-gradient def _stop_gradient_jvp_rule(primals, tangents): @@ -4589,13 +4557,6 @@ def _eq_meet(a, b): return eq(a, b) -def subvals(lst, replace): - lst = list(lst) - for i, v in replace: - lst[i] = v - return tuple(lst) - - def _abstractify(x): return raise_to_shaped(core.get_aval(x)) diff --git a/jax/lazy.py b/jax/lazy.py new file mode 100644 index 000000000000..6c4fcbf5dce4 --- /dev/null +++ b/jax/lazy.py @@ -0,0 +1,244 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from collections import namedtuple +import operator as op + +import numpy as onp +from six.moves import reduce + +from .util import safe_map, safe_zip, unzip2, subvals +from .lib import xla_bridge as xb + +map = safe_map +zip = safe_zip + + +### util + +# TODO(mattjj): replace with dataclass when Python 2 support is removed +def taggedtuple(name, fields): + """Lightweight version of namedtuple where equality depends on the type.""" + def __new__(cls, *xs): + return tuple.__new__(cls, (cls,) + xs) + def __str__(self): + return '{}{}'.format(name, tuple.__str__(self[1:])) + class_namespace = {'__new__' : __new__, '__str__': __str__} + for i, f in enumerate(fields): + class_namespace[f] = property(op.itemgetter(i+1)) + return type(name, (tuple,), class_namespace) + + +### lazy sublanguage + +# There are two components to a LazyExpr: an input and a reindexing +# specification. The input represents a base array to which the reindexing +# specification is applied. +# +# An input can represent an array constructor (Iota, Eye, etc.) or it can be an +# ArrayVar which encodes that the base array is some exogenous array value (from +# an environment with only a single value in it). These LazyExprs are attached +# to DeviceArrays, so when the input part of the expression is ArrayVar that +# basically means the associated device buffer represents the input, while if +# the input is an array constructor then the associated device_buffer field of +# the DeviceArray should be set to a DeviceConstant sentinel value. For the +# array constructor expressions: +# * Iota builds a 1D sequence [0, 1, ..., N-1], +# * Eye builds a 2D array with ones on a (possibly offset) diagonal and zeros +# elsewhere (like numpy.eye), +# * Tri builds a triangular matrix with ones on and below a diagonal and zeros +# elsewhere (like numpy.tri), and +# * Delta builds a Kronecker delta array with ones along its multidimensional +# main diagonal and zeros elsewhere (for use in tensor contractions). +# +# The reindexing specification encodes the shape of the final result and a list +# of dimensions, which are integers or Nones. The integer entries take on values +# 0, 1, ..., R-1 where R is the rank of the input array, and encode where the +# axes of the input array are to be mapped in the final output. When an entry is +# None that indicates that the corresponding axis of the result is a broadcasted +# one. +# +# Here are some examples of lazy expressions and the arrays they represent: +# +# LazyExpr(input=Iota(dtype=dtype('float32'), size=3), +# shape=(3, 4), dims=(0, None)) +# DeviceArray([[0., 0., 0., 0.], +# [1., 1., 1., 1.], +# [2., 2., 2., 2.]], dtype=float32) +# +# LazyExpr(input=Iota(dtype=dtype('float32'), size=3), +# shape=(4, 3), dims=(None, 0)) +# DeviceArray([[0., 1., 2.], +# [0., 1., 2.], +# [0., 1., 2.], +# [0., 1., 2.]], dtype=float32) +# +# For performance, some functions on lazy expressions accept None as an input to +# stand for the identity lazy expression. +# +# We use the `taggedtuple` class constructor, rather than standard namedtuples, +# because two namedtuple instances of different types but equal elements hash to +# the same value, e.g. +# A = namedtuple('A', ['x', 'y']) +# B = namedtuple('B', ['x', 'y']) +# hash(A(1, 2)) == hash(B(1, 2)) # True +# but we want hashes to be sensitive to the type tag (while still being fast). + +LazyExpr = namedtuple('LazyExpr', ['input', 'shape', 'dims']) +ArrayVar = taggedtuple('ArrayVar', []) +Iota = taggedtuple('Iota', ['dtype', 'size']) # like np.arange(N) +Eye = taggedtuple('Eye', ['dtype', 'shape', 'offset']) # like np.eye +Tri = taggedtuple('Tri', ['dtype', 'shape', 'offset']) # like np.tri +Delta = taggedtuple('Delta', ['dtype', 'shape']) # kronecker delta arrays + +def array(shape): + return LazyExpr(ArrayVar(), shape, tuple(range(len(shape)))) + +def iota(dtype, size): + return LazyExpr(Iota(dtype, size), (size,), (0,)) + +def eye(dtype, shape, offset): + assert len(shape) == 2 + return LazyExpr(Eye(dtype, shape, offset), shape, (0, 1)) + +def tri(dtype, shape, offset): + assert len(shape) == 2 + return LazyExpr(Tri(dtype, shape, offset), shape, (0, 1)) + +def delta(dtype, shape): + return LazyExpr(Delta(dtype, shape), shape, tuple(range(len(shape)))) + +def broadcast(lexpr, shape, broadcast_dimensions): + new_dims = [None] * len(shape) + for i, d in enumerate(broadcast_dimensions): + new_dims[d] = lexpr.dims[i] + return LazyExpr(lexpr.input, shape, tuple(new_dims)) + +def transpose(lexpr, perm): + new_shape = tuple(lexpr.shape[i] for i in perm) + new_dims = tuple(lexpr.dims[i] for i in perm) + return LazyExpr(lexpr.input, new_shape, new_dims) + +def is_constant(lexpr): + return lexpr is not None and type(lexpr.input) is not ArrayVar + +def is_trivial(lexpr): + return (type(lexpr.input) is ArrayVar and + lexpr.dims == tuple(range(len(lexpr.shape)))) + + +def eval_lexpr(lexpr, x): + """Evaluate a lazy expression using NumPy. + Args: + lexpr: the LazyExpr to evaluate. + x: ndarray or None, representing the value of ArrayVar if present. + Returns: + An ndarray representing the value of the lazy expression. + """ + if is_trivial(lexpr): + return x + + input_, shape, dims = lexpr + + # first create a starting ndarray from input_ + t = type(input_) + if t is ArrayVar: + assert x is not None and type(x) is onp.ndarray + elif t is Iota: + assert x is None + x = onp.arange(input_.size, dtype=input_.dtype) + elif t is Eye: + assert x is None + N, M = input_.shape + x = onp.eye(N, M, dtype=input_.dtype, k=input_.offset) + elif t is Tri: + assert x is None + N, M = input_.shape + x = onp.tri(N, M, dtype=input_.dtype, k=input_.offset) + elif t is Delta: + ones = [1] * len(input_.shape) + iotas = [onp.arange(d).reshape(subvals(ones, [(i, -1)])) + for i, d in enumerate(input_.shape)] + eyes = [i1 == i2 for i1, i2 in zip(iotas[:-1], iotas[1:])] + x = onp.asarray(reduce(op.and_, eyes), input_.dtype) + else: + assert False + + # then apply the reindexing operation + perm = [d for d in dims if d is not None] + if perm != list(range(len(perm))): + x = onp.transpose(x, perm) + if shape != x.shape: + in_shape = [1 if d is None else s for d, s in zip(dims, shape)] + x = onp.broadcast_to(onp.reshape(x, in_shape), shape) + + return x + + +def stage_lexpr(c, lexpr, x): + """Stage a lazy expression into an XLA computation. + Args: + c: XLA ComputationBuilder into which to stage the expression. + lexpr: a LazyExpr to evaluate (or None for the identity expression). + x: XlaOp or None, representing the value of ArrayVar if present. + Returns: + An XlaOp representing the value of the lazy expression. + """ + if lexpr is None or is_trivial(lexpr): + return x + + input_, shape, dims = lexpr + + # first create a starting XlaOp from input_ + t = type(input_) + if t is ArrayVar: + assert x is not None + elif t is Iota: + assert x is None + x = c.Iota(input_.dtype, input_.size) + elif t is Eye: + assert x is None + N, M = input_.shape + bool_eye = c.Eq(c.Add(c.BroadcastedIota(onp.int32, (N, M), 0), + c.Constant(onp.array(input_.offset, onp.int32))), + c.BroadcastedIota(onp.int32, (N, M), 1)) + x = c.ConvertElementType(bool_eye, xb.dtype_to_etype(input_.dtype)) + elif t is Tri: + assert x is None + N, M = input_.shape + bool_tri = c.Ge(c.Add(c.BroadcastedIota(onp.int32, (N, M), 0), + c.Constant(onp.array(input_.offset, onp.int32))), + c.BroadcastedIota(onp.int32, (N, M), 1)) + x = c.ConvertElementType(bool_tri, xb.dtype_to_etype(input_.dtype)) + elif t is Delta: + etype = xb.dtype_to_etype(input_.dtype) + iotas = [c.BroadcastedIota(onp.uint32, input_.shape, i) + for i in range(len(input_.shape))] + eyes = [c.Eq(i1, i2) for i1, i2 in zip(iotas[:-1], iotas[1:])] + x = c.ConvertElementType(reduce(c.And, eyes), etype) + else: + assert False + + # then apply the operations encoded in reindex + bcast_dims, perm = unzip2((i, d) for i, d in enumerate(dims) if d is not None) + if tuple(perm) != tuple(range(len(perm))): + x = c.Transpose(x, perm) + if shape != c.GetShape(x).dimensions(): + x = c.BroadcastInDim(x, shape, bcast_dims) + + return x diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index d27dd9e4bfb5..793312bfdf88 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -52,7 +52,7 @@ from ..config import flags from ..interpreters.xla import DeviceArray from .. import lax -from ..util import partial, get_module_functions, unzip2, prod as _prod +from ..util import partial, get_module_functions, unzip2, prod as _prod, subvals from ..lib import pytree from ..lib import xla_client @@ -1087,7 +1087,7 @@ def split(ary, indices_or_sections, axis=0): subarrays = onp.split(dummy_val, indices_or_sections, axis) # shapes split_indices = onp.cumsum([0] + [onp.shape(sub)[axis] for sub in subarrays]) starts, ends = [0] * ndim(ary), shape(ary) - _subval = lambda x, i, v: lax.subvals(x, [(i, v)]) + _subval = lambda x, i, v: subvals(x, [(i, v)]) return [lax.slice(ary, _subval(starts, axis, start), _subval(ends, axis, end)) for start, end in zip(split_indices[:-1], split_indices[1:])] @@ -1250,7 +1250,7 @@ def reduction(a, axis=None, dtype=None, out=None, keepdims=False): result = lax.reduce(a, _reduction_init_val(a, init_val), op if computation_dtype != onp.bool_ else bool_op, dims) if keepdims: - shape_with_singletons = lax.subvals(shape(a), zip(dims, (1,) * len(dims))) + shape_with_singletons = subvals(shape(a), zip(dims, (1,) * len(dims))) result = lax.reshape(result, shape_with_singletons) return lax.convert_element_type(result, dtype or result_dtype) @@ -1813,23 +1813,20 @@ def array_equal(a1, a2): @_wraps(onp.eye) -def eye(N, M=None, k=None, dtype=None): +def eye(N, M=None, k=0, dtype=None): lax._check_user_dtype_supported(dtype, "eye") dtype = float_ if dtype is None else dtype M = N if M is None else M + k = int(k) if N < 0 or M < 0: msg = "negative dimensions are not allowed, got {} and {}" raise ValueError(msg.format(N, M)) - if k is None: - return lax.broadcasted_eye(dtype, (N, M), (0, 1)) - else: + if k is not None: k_dtype = _dtype(k) if not issubdtype(k_dtype, integer): msg = "eye argument `k` must be of integer dtype, got {}" raise TypeError(msg.format(k_dtype)) - rows = k + lax.broadcasted_iota(k_dtype, (N, M), 0) - cols = lax.broadcasted_iota(k_dtype, (N, M), 1) - return lax.convert_element_type(lax.eq(rows, cols), dtype) + return lax._eye(dtype, (N, M), k) @_wraps(onp.identity) @@ -1841,16 +1838,11 @@ def identity(n, dtype=None): @_wraps(onp.arange) def arange(start, stop=None, step=None, dtype=None): lax._check_user_dtype_supported(dtype, "arange") - # If called like np.arange(N), we create a lazy lax._IotaConstant. if stop is None and step is None: dtype = dtype or _dtype(start) - if issubdtype(dtype, integer): - return lax.iota(dtype, start) # avoids materializing - - # Fall back to instantiating an ndarray in host memory - dtype = dtype or result_type( - *(x for x in (start, stop, step) if x is not None)) - return onp.arange(start, stop=stop, step=step, dtype=dtype) + return lax.iota(dtype, start) # avoids materializing + else: + return array(onp.arange(start, stop=stop, step=step, dtype=dtype)) def _wrap_numpy_nullary_function(f): @@ -2074,13 +2066,7 @@ def tri(N, M=None, k=0, dtype=None): lax._check_user_dtype_supported(dtype, "tri") M = M if M is not None else N dtype = dtype or float32 - x = arange(N, dtype=int32) - y = arange(M, dtype=int32) - mask = lax.ge( - (lax.broadcast_in_dim(x, shape=(N, M), broadcast_dimensions=(0,)) + - int32(k)), - lax.broadcast(y, [N])) - return lax.convert_element_type(mask, dtype) + return lax._tri(dtype, (N, M), k) @_wraps(onp.tril) @@ -2339,7 +2325,7 @@ def sum_repeats(operand, names, counts, keep_names): for name, count in counts.items(): if count > 1: axes = [i for i, n in enumerate(names) if n == name] - eye = lax.broadcasted_eye(operand.dtype, operand.shape, axes) + eye = lax._delta(operand.dtype, operand.shape, axes) if name not in keep_names: operand = sum(operand * eye, axes) names = names.replace(name, '') @@ -2849,7 +2835,7 @@ def _index_to_gather(x_shape, idx): collapsed_slice_dims = [] start_index_map = [] - gather_indices = zeros((0,), dtype=int32) + gather_indices = onp.zeros((0,), dtype=int32) # use onp to save a compilation # We perform three transformations to y before the scatter op, in order: # First, y is broadcast to slice_shape. In general `y` only need broadcast to diff --git a/jax/scipy/special.py b/jax/scipy/special.py index 5129d0ff112b..d8f8a2f9a67b 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -20,6 +20,7 @@ import scipy.special as osp_special from .. import lax +from .. import util from ..api import custom_transforms, defjvp from ..numpy import lax_numpy as np from ..numpy.lax_numpy import (_wraps, asarray, _reduction_dims, _constant_like, @@ -84,7 +85,7 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False): if b is not None or return_sign: raise NotImplementedError("Only implemented for b=None, return_sign=False") dims = _reduction_dims(a, axis) - shape = lax.subvals(onp.shape(a), zip(dims, (1,) * len(dims))) + shape = util.subvals(onp.shape(a), zip(dims, (1,) * len(dims))) dimadd = lambda x: lax.reshape(x, shape) amax = lax.reduce(a, _constant_like(a, -onp.inf), lax.max, dims) amax = lax.select(lax.is_finite(amax), amax, lax.full_like(amax, 0)) diff --git a/jax/util.py b/jax/util.py index b78bd20e2f6f..0ad1e63d0ca6 100644 --- a/jax/util.py +++ b/jax/util.py @@ -56,6 +56,12 @@ def unzip3(xyzs): zs.append(z) return tuple(xs), tuple(ys), tuple(zs) +def subvals(lst, replace): + lst = list(lst) + for i, v in replace: + lst[i] = v + return tuple(lst) + def split_list(args, ns): assert type(ns) is list args = list(args) diff --git a/tests/api_test.py b/tests/api_test.py index 286ef024398d..6b83a01a67ec 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -17,6 +17,7 @@ from __future__ import print_function import collections +from contextlib import contextmanager import copy from functools import partial import unittest @@ -24,7 +25,7 @@ import weakref from absl import logging -from absl.testing import absltest +from absl.testing import absltest, parameterized import numpy as onp import six @@ -34,7 +35,7 @@ import jax import jax.numpy as np from jax import jit, grad, device_put, jacfwd, jacrev, hessian -from jax import api, core, lax +from jax import api, core, lax, lax_reference from jax.core import Primitive from jax.interpreters import ad from jax.interpreters import xla @@ -1344,7 +1345,7 @@ def f(x): python_should_be_executing = False api.pmap(f, 'i')(x) - def test_repr(self): + def test_device_array_repr(self): rep = repr(np.ones(()) + 1.) self.assertStartsWith(rep, 'DeviceArray') @@ -1694,5 +1695,186 @@ def f(x): """) +class LazyTest(jtu.JaxTestCase): + + @contextmanager + def count_compiles(self): + + make_computation_builder = xb.make_computation_builder + count = [0] + + def make_computation_builder_and_count(*args, **kwargs): + count[0] += 1 + return make_computation_builder(*args, **kwargs) + + xb.make_computation_builder = make_computation_builder_and_count + try: + yield count + finally: + xb.make_computation_builder = make_computation_builder + + @jtu.skip_on_devices("tpu") + def test_lazy_jit_closed_over_values(self): + if not core.skip_checks: + raise SkipTest("oom test skipped when core.skip_checks is False") + + y = np.arange(int(1e12)) # will likely oom if materialized + ans = jit(lambda x: (x + y)[1])(1) + self.assertEqual(ans, 2) + + def test_jit_forces_arguments(self): + + @api.jit + def f(x): + assert python_should_be_executing + return np.sum(x) + + x = np.arange(10, dtype=np.int32) + assert xla.is_device_constant(x) # lazy iota + + python_should_be_executing = True + _ = f(x) + + python_should_be_executing = False # should not recompile + x = onp.arange(10, dtype=onp.int32) + _ = f(x) + + @parameterized.parameters(jtu.cases_from_list(range(10000))) + def test_random_lazy_program(self, seed): + + def random_array(rng): + kind = rng.choice(['arr', 'iota', 'eye', 'tri']) + if kind == 'arr': + dtype = [onp.float32, onp.int32][rng.choice(2)] + dim = rng.randint(4) + shape = rng.randint(4, size=dim) + onp_x = onp.asarray(rng.randn(*shape), dtype=dtype) + jax_x = np.array(onp_x, dtype=dtype) + elif kind == 'iota': + dtype = [onp.float32, onp.int32][rng.choice(2)] + size = rng.randint(5) + onp_x = onp.arange(size, dtype=dtype) + jax_x = lax.iota(dtype, size) + elif kind == 'eye': + dtype = [onp.float32, onp.int32][rng.choice(2)] + N = rng.randint(2, 5) + M = None if rng.rand() < 0.5 else rng.randint(2, 5) + k = rng.choice([-1, 0, 1]) + onp_x = onp.eye(N, M, k, dtype=dtype) + jax_x = np.eye(N, M, k, dtype=dtype) + elif kind == 'tri': + dtype = [onp.float32, onp.int32][rng.choice(2)] + N = rng.randint(2, 5) + M = None if rng.rand() < 0.5 else rng.randint(2, 5) + k = rng.choice([-1, 0, 1]) + onp_x = onp.tri(N, M, k, dtype=dtype) + jax_x = np.tri(N, M, k, dtype=dtype) + else: + assert False + assert type(onp_x) is onp.ndarray and type(jax_x) is xla.DeviceArray + return onp_x, jax_x + + def random_op(rng, shape): + kind = rng.choice(['transpose', 'broadcast', 'reshape']) + if kind == 'transpose': + perm = tuple(rng.permutation(len(shape))) + return Op(partial(onp.transpose, axes=perm), + partial(lax.transpose, permutation=perm)) + elif kind == 'broadcast': + n = rng.randint(1, 3) + new_sizes = rng.randint(1, 4, size=n) + new_ndim = n + len(shape) + bcast_dims = tuple(sorted(rng.permutation(new_ndim)[:len(shape)])) + shape_iter = iter(shape) + new_sizes = iter(rng.randint(1, 4, size=n)) + new_shape = [next(shape_iter) if i in bcast_dims else next(new_sizes) + for i in range(new_ndim)] + return Op(partial(lax_reference.broadcast_in_dim, shape=new_shape, + broadcast_dimensions=bcast_dims), + partial(lax.broadcast_in_dim, shape=new_shape, + broadcast_dimensions=bcast_dims)) + elif kind == 'reshape': + new_shape = list(shape) + for _ in range(rng.randint(1, 3)): + loc = len(new_shape) and rng.randint(len(new_shape)) + new_shape.insert(loc, 1) + new_shape = tuple(new_shape) + return Op(partial(onp.reshape, newshape=new_shape), + partial(lax.reshape, new_sizes=new_shape)) + else: + assert False + Op = collections.namedtuple('Op', ['onp_fn', 'jax_fn']) + + rng = onp.random.RandomState(seed) + onp_x, jax_x = _, orig_x = random_array(rng) + ops = [] + with jtu.count_primitive_compiles() as count: + for _ in range(rng.randint(5)): + op = random_op(rng, onp.shape(onp_x)) + onp_x = op.onp_fn(onp_x) + jax_x = op.jax_fn(jax_x) + ops.append(op) + self.assertEqual(count[0], 0) + + kind = rng.choice(['closure', 'npy_value', 'force', 'add']) + if kind == 'closure': + result = api.jit(lambda x: x + jax_x)(0) + self.assertAllClose(onp_x, result, check_dtypes=False) + elif kind == 'npy_value': + self.assertAllClose(onp_x, jax_x, check_dtypes=False) + elif kind == 'force': + result = xla._force(jax_x) + self.assertAllClose(onp_x, result, check_dtypes=False) + elif kind == 'add': + result = jax_x + onp.zeros(jax_x.shape, dtype=jax_x.dtype) + self.assertAllClose(onp_x, result, check_dtypes=False) + else: + assert False + + @jit + def apply_ops(x): + for op in ops: + x = op.jax_fn(x) + return x + + jit_result = apply_ops(orig_x) + self.assertAllClose(jit_result, onp_x, check_dtypes=False) + + @jit + def apply_ops_closure(): + x = orig_x + for op in ops: + x = op.jax_fn(x) + return x + + jit_result = apply_ops_closure() + self.assertAllClose(jit_result, onp_x, check_dtypes=False) + + def test_constant_forcing_computations_cached(self): + # from https://github.com/google/jax/issues/1909 + xla._lazy_force_computation.cache_clear() # clear force compile cache + big_lazy_x = np.ones((api.device_count(), 100)) + f = api.pmap(lambda x: 2 * x) + _ = f(big_lazy_x) + + with self.count_compiles() as count: + _ = f(big_lazy_x) + self.assertEqual(count[0], 0) + + def test_zeros_ones_compilation(self): + w = np.ones(3) + np.ones(3) # ensure + has a cache entry + w.block_until_ready() + + xla._lazy_force_computation.cache_clear() # clear force compile cache + + with self.count_compiles() as count: + x = np.ones(3) + np.zeros(3) + y = np.ones(3) + np.ones(3) + + self.assertEqual(count[0], 1) + self.assertAllClose(x, onp.ones(3), check_dtypes=False) + self.assertAllClose(y, onp.ones(3) + onp.ones(3), check_dtypes=False) + + if __name__ == '__main__': absltest.main() diff --git a/tests/batching_test.py b/tests/batching_test.py index c442b6490a88..9a8fd0d2e71e 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -299,7 +299,7 @@ def testDot4(self): ans = vmap(np.dot, in_axes=(1, None))(xs, ys) expected = onp.einsum('ij,i->j', xs, ys) self.assertAllClose(ans, expected, check_dtypes=False) - + def testDot5(self): f = vmap(partial(np.einsum, 'ij,j->i'), (None, 0)) jaxpr = make_jaxpr(f)(np.zeros((1000, 1000)), np.zeros((1000, 1000))) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index bf4580852cde..bf5684a19c26 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -32,6 +32,7 @@ from jax import numpy as lnp from jax import ops from jax import test_util as jtu +from jax import util from jax.config import config config.parse_flags_with_absl() @@ -426,8 +427,8 @@ def _ReplaceSlicesWithTuples(self, idx): isnone = [i for i, elt in enumerate(triple) if elt is None] zeros = itertools.repeat(0) nones = itertools.repeat(None) - out = lax.subvals(triple, zip(isnone, zeros)) - return out, lambda out: slice(*lax.subvals(out, zip(isnone, nones))) + out = util.subvals(triple, zip(isnone, zeros)) + return out, lambda out: slice(*util.subvals(out, zip(isnone, nones))) elif isinstance(idx, (tuple, list)) and idx: t = type(idx) elts, packs = zip(*map(self._ReplaceSlicesWithTuples, idx)) @@ -630,7 +631,7 @@ def testMixedAdvancedIntegerIndexing(self, shape, dtype, rng_factory, indexer): args_maker = lambda: [rng(shape, dtype), indexer_with_dummies] def fun(x, indexer_with_dummies): - idx = type(indexer)(lax.subvals(indexer_with_dummies, substitutes)) + idx = type(indexer)(util.subvals(indexer_with_dummies, substitutes)) return x[idx] self._CompileAndCheck(fun, args_maker, check_dtypes=True) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index d3c25c7997d0..b7d585df8feb 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -40,7 +40,7 @@ from jax import test_util as jtu from jax import dtypes from jax import tree_util -from jax.interpreters import partial_eval +from jax.interpreters import partial_eval, xla from jax.test_util import check_grads from jax.config import config @@ -2074,11 +2074,10 @@ def testArange(self): self.assertAllClose(lnp.arange(53, 5, -3), onp.arange(53, 5, -3, dtype=lnp.int_), check_dtypes=True) - # TODO(mattjj): make these tests work when jax_enable_x64=True - # self.assertAllClose(lnp.arange(77, dtype=float), - # onp.arange(77, dtype=float), check_dtypes=True) - # self.assertAllClose(lnp.arange(2, 13, dtype=int), - # onp.arange(2, 13, dtype=int), check_dtypes=True) + self.assertAllClose(lnp.arange(77, dtype=float), + onp.arange(77, dtype=float), check_dtypes=True) + self.assertAllClose(lnp.arange(2, 13, dtype=int), + onp.arange(2, 13, dtype=int), check_dtypes=True) self.assertAllClose(lnp.arange(0, 1, -0.5), onp.arange(0, 1, -0.5, dtype=lnp.float_), check_dtypes=True) @@ -2095,6 +2094,10 @@ def testArange(self): self.assertTrue(type(lnp.arange(77, dtype=lnp.int32)) == type(lax.iota(onp.int32, 77))) + # test laziness for int dtypes + self.assertTrue(xla.is_device_constant(lnp.arange(77))) + self.assertTrue(xla.is_device_constant(lnp.arange(77, dtype=lnp.int32))) + def testIssue830(self): a = lnp.arange(4, dtype=lnp.complex64) self.assertEqual(a.dtype, lnp.complex64) diff --git a/tests/lax_test.py b/tests/lax_test.py index 6ad052648e07..e5a625cc5783 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1543,8 +1543,8 @@ def testDynamicUpdateSliceTypeErrors(self): onp.zeros((2, 2), dtype=onp.float32), (onp.int32(1), onp.int16(2)))) -class DeviceConstantTest(jtu.JaxTestCase): - def _CheckDeviceConstant(self, make_const, expected): +class LazyConstantTest(jtu.JaxTestCase): + def _Check(self, make_const, expected): # check casting to ndarray works asarray_result = onp.asarray(make_const()) @@ -1575,7 +1575,7 @@ def testFilledConstant(self, shape, fill_value, dtype): make_const = lambda: lax.full(shape, fill_value, dtype) expected = onp.full(shape, fill_value, dtype or dtypes.result_type(fill_value)) - self._CheckDeviceConstant(make_const, expected) + self._Check(make_const, expected) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_dim={}".format( @@ -1595,7 +1595,7 @@ def testIotaConstant(self, dtype, shape, dimension): singleton_shape[dimension] = shape[dimension] expected = onp.broadcast_to(arr.reshape(singleton_shape), shape) - self._CheckDeviceConstant(make_const, expected) + self._Check(make_const, expected) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_axes={}".format( @@ -1612,13 +1612,12 @@ def testIotaConstant(self, dtype, shape, dimension): [(2, 3, 4, 2), (0, 2, 3)], [(1001, 1001), (0, 1)], ])) - def testEyeConstant(self, dtype, shape, axes): - make_const = lambda: lax.broadcasted_eye(dtype, shape, axes) - + @jtu.skip_on_devices("tpu") # TODO(mattjj): investigate failure + def testDeltaConstant(self, dtype, shape, axes): + make_const = lambda: lax._delta(dtype, shape, axes) # don't check the asarray case, just assume it's right expected = onp.asarray(make_const()) - - self._CheckDeviceConstant(make_const, expected) + self._Check(make_const, expected) GradTestSpec = collections.namedtuple( diff --git a/tests/multi_device_test.py b/tests/multi_device_test.py index 4c212b7c5eac..303baccfa6eb 100644 --- a/tests/multi_device_test.py +++ b/tests/multi_device_test.py @@ -161,6 +161,40 @@ def test_primitive_compilation_cache(self): self.assertEqual(y.device_buffer.device(), jax.devices()[1]) self.assertEqual(z.device_buffer.device(), jax.devices()[1]) + def test_device_put(self): + if len(jax.devices()) < 2: + raise SkipTest("test requires multiple devices") + + # test device_put on regular values + x = jax.device_put(1, device=jax.devices()[0]) + self.assertEqual(x.device_buffer.device(), jax.devices()[0]) + + # test device_put on its own output + y = jax.device_put(x, device=jax.devices()[1]) + self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + + # test device_put on lazy values + x = jax.device_put(np.zeros(2), device=jax.devices()[0]) + self.assertEqual(x.device_buffer.device(), jax.devices()[0]) + + y = jax.device_put(x, device=jax.devices()[1]) + self.assertEqual(y.device_buffer.device(), jax.devices()[1]) + + x = jax.device_put(np.zeros(2), device=jax.devices()[1]) + self.assertEqual(x.device_buffer.device(), jax.devices()[1]) + + def test_closed_over_values_device_placement(self): + # see https://github.com/google/jax/issues/1431 + if len(jax.devices()) < 2: + raise SkipTest("test requires multiple devices") + + def f(): return lax.add(3., 4.) + self.assertIsInstance(f(), xla.DeviceArray) + self.assertEqual(f().device_buffer.device(), jax.devices()[0]) + self.assertEqual(jax.jit(f)().device_buffer.device(), jax.devices()[0]) + self.assertEqual(jax.jit(f, device=jax.devices()[1])().device_buffer.device(), + jax.devices()[1]) + if __name__ == '__main__': absltest.main() diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 7f54e45d75e7..ea1421e241ae 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -139,6 +139,18 @@ def get_arr(scale): self.assertEqual(b.device_buffer.device(), api.devices('cpu')[0]) self.assertEqual(c.device_buffer.device(), api.devices('cpu')[0]) + @jtu.skip_on_devices("cpu") # test can only fail with non-cpu backends + def test_closed_over_values_device_placement(self): + # see https://github.com/google/jax/issues/1431 + if len(jax.devices()) < 2: + raise SkipTest("test requires multiple devices") + + def f(): return lax.add(3., 4.) + self.assertNotEqual(jax.jit(f)().device_buffer.device(), + api.devices('cpu')[0]) + self.assertEqual(jax.jit(f, backend='cpu')().device_buffer.device(), + api.devices('cpu')[0]) + if __name__ == "__main__": absltest.main() diff --git a/tests/pmap_test.py b/tests/pmap_test.py index aa4fe994c38e..74afbfa82c1e 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -483,6 +483,7 @@ def testPmapConstant(self): self.assertAllClose(ans, expected, check_dtypes=False) f = pmap(lambda x: (x, 3)) + x = onp.arange(device_count) with jtu.count_jit_and_pmap_compiles() as count: _, ans = f(x) self.assertEqual(count[0], 1) From b04019ea74534eb178eacf3ed72146853d840895 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 7 Jan 2020 22:30:54 -0800 Subject: [PATCH 0583/1053] fix test typos --- tests/multibackend_test.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index ea1421e241ae..6de02bdaea1c 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -142,13 +142,10 @@ def get_arr(scale): @jtu.skip_on_devices("cpu") # test can only fail with non-cpu backends def test_closed_over_values_device_placement(self): # see https://github.com/google/jax/issues/1431 - if len(jax.devices()) < 2: - raise SkipTest("test requires multiple devices") - def f(): return lax.add(3., 4.) - self.assertNotEqual(jax.jit(f)().device_buffer.device(), + self.assertNotEqual(api.jit(f)().device_buffer.device(), api.devices('cpu')[0]) - self.assertEqual(jax.jit(f, backend='cpu')().device_buffer.device(), + self.assertEqual(api.jit(f, backend='cpu')().device_buffer.device(), api.devices('cpu')[0]) From 48cb6af6b4125b5874c6ffc2586dbe9c5c1565f0 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Wed, 8 Jan 2020 12:22:12 +0100 Subject: [PATCH 0584/1053] Support None and negative indices in slice_in_dim --- jax/lax/lax.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 5368622e7af1..028d06ab2998 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1309,6 +1309,17 @@ def slice_in_dim(operand, start_index, limit_index, stride=1, axis=0): limit_indices = list(operand.shape) strides = [1] * operand.ndim + # translate `None` + len_axis = operand.shape[axis] + start_index = start_index if start_index is not None else 0 + limit_index = limit_index if limit_index is not None else len_axis + + # translate negative indices + if start_index < 0: + start_index = start_index + len_axis + if limit_index < 0: + limit_index = limit_index + len_axis + axis = int(axis) start_indices[axis] = int(start_index) limit_indices[axis] = int(limit_index) From ac1aaedc4f2ec6acf352e7ccb718a9a4fb59ae06 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Wed, 8 Jan 2020 12:31:45 +0100 Subject: [PATCH 0585/1053] Change from swapaxes to slice_in_dim in numpy.gradient --- jax/numpy/lax_numpy.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 3b00e394478b..5f89a2bfc551 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -876,13 +876,13 @@ def diff(a, n=1, axis=-1,): @partial(jit, static_argnums=1) def _gradient(a, axis): def gradient_along_axis(a, axis): - a_swap = swapaxes(a, 0, axis) + sliced = partial(lax.slice_in_dim, a, axis=axis) a_grad = concatenate(( - (a_swap[1] - a_swap[0])[newaxis], - (a_swap[2:] - a_swap[:-2]) * 0.5, - (a_swap[-1] - a_swap[-2])[newaxis] - ), axis=0) - return swapaxes(a_grad, 0, axis) + sliced(1, 2) - sliced(0, 1), + (sliced(2, None) - sliced(0, -2)) * 0.5, + sliced(-1, None) - sliced(-2, -1), + ), axis) + return a_grad if axis is None: axis = range(a.ndim) From dcc882cf6b2cf980783cb2221beac1318bcbb412 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 8 Jan 2020 13:17:55 -0500 Subject: [PATCH 0586/1053] Drop Python 2 support from JAX. (#1962) Remove six dependency. --- .travis.yml | 7 +------ README.md | 7 ++++--- build/build_jaxlib_wheels.sh | 2 +- build/build_jaxlib_wheels_macos.sh | 1 - build/setup.py | 3 ++- examples/datasets.py | 4 ++-- examples/kernel_lsq.py | 4 +--- examples/onnx2xla.py | 4 ++-- examples/resnet50.py | 4 +--- jax/abstract_arrays.py | 5 ----- jax/api.py | 5 ++--- jax/core.py | 7 +------ jax/dtypes.py | 4 ---- jax/experimental/loops.py | 8 ++------ jax/experimental/optimizers.py | 4 +--- jax/experimental/stax.py | 3 +-- jax/interpreters/ad.py | 7 +++---- jax/interpreters/batching.py | 3 --- jax/interpreters/masking.py | 9 ++++---- jax/interpreters/parallel.py | 2 -- jax/interpreters/pxla.py | 2 -- jax/interpreters/xla.py | 4 ---- jax/lax/lax.py | 14 ++++++------- jax/lax/lax_control_flow.py | 4 ++-- jax/lax/lax_parallel.py | 9 +++----- jax/lax_reference.py | 3 +-- jax/lazy.py | 6 +++--- jax/lib/xla_bridge.py | 1 - jax/numpy/lax_numpy.py | 33 +++++++++++------------------- jax/pprint_util.py | 6 +++--- jax/test_util.py | 4 +--- jax/tree_util.py | 3 +-- jaxlib/cuda_prng.py | 4 ++-- jaxlib/cusolver.py | 4 ++-- setup.py | 3 ++- tests/api_test.py | 8 ++------ tests/benchmarks/xla.py | 17 ++++++++------- tests/dtypes_test.py | 7 +------ tests/lax_numpy_test.py | 12 +---------- tests/lax_test.py | 6 ------ tests/loops_test.py | 11 ++++------ tests/multibackend_test.py | 1 - 42 files changed, 82 insertions(+), 173 deletions(-) diff --git a/.travis.yml b/.travis.yml index dcf1cd21ade9..47de338fb489 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ notifications: dist: xenial language: python python: - - "2.7" - "3.6" env: - JAX_ENABLE_X64=0 JAX_NUM_GENERATED_CASES=25 @@ -15,11 +14,7 @@ matrix: env: JAX_ENABLE_X64=1 JAX_ONLY_DOCUMENTATION=true before_install: - - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then - wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh -O miniconda.sh; - else - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh; - fi + - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh; - bash miniconda.sh -b -p $HOME/miniconda - export PATH="$HOME/miniconda/bin:$PATH" - conda config --set always_yes yes --set changeps1 no --set show_channel_urls yes diff --git a/README.md b/README.md index 41353eb4d853..275629c27e2b 100644 --- a/README.md +++ b/README.md @@ -391,7 +391,7 @@ cloud VM), you can run ```bash # install jaxlib -PYTHON_VERSION=cp37 # alternatives: cp27, cp35, cp36, cp37 +PYTHON_VERSION=cp37 # alternatives: cp35, cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' @@ -412,8 +412,9 @@ grep CUDNN_MAJOR -A 2 /usr/local/cuda/include/cudnn.h # might need different pa ``` The Python version must match your Python interpreter. There are prebuilt wheels -for Python 2.7, 3.5, 3.6, and 3.7; for anything else, you must build from -source. +for Python 3.5, 3.6, 3.7, and 3.8; for anything else, you must build from +source. Jax requires Python 3.5 or above. Jax does not support Python 2 any +more. Please let us know on [the issue tracker](https://github.com/google/jax/issues) if you run into any errors or problems with the prebuilt wheels. diff --git a/build/build_jaxlib_wheels.sh b/build/build_jaxlib_wheels.sh index fea98164be89..97b10eea415e 100755 --- a/build/build_jaxlib_wheels.sh +++ b/build/build_jaxlib_wheels.sh @@ -1,7 +1,7 @@ #!/bin/bash set -xev -PYTHON_VERSIONS="2.7.15 3.5.6 3.6.8 3.7.2 3.8.0" +PYTHON_VERSIONS="3.5.6 3.6.8 3.7.2 3.8.0" CUDA_VERSIONS="9.0 9.2 10.0 10.1" CUDA_VARIANTS="cuda" # "cuda-included" diff --git a/build/build_jaxlib_wheels_macos.sh b/build/build_jaxlib_wheels_macos.sh index 01fcb0559e4f..1fccedaa3fa1 100755 --- a/build/build_jaxlib_wheels_macos.sh +++ b/build/build_jaxlib_wheels_macos.sh @@ -43,7 +43,6 @@ build_jax () { rm -fr build/dist -build_jax 2.7.15 cp27 1.15.4 1.2.0 build_jax 3.5.6 cp35 1.15.4 1.2.0 build_jax 3.6.8 cp36 1.15.4 1.2.0 build_jax 3.7.2 cp37 1.15.4 1.2.0 diff --git a/build/setup.py b/build/setup.py index 60bbc102f86b..cb4c37ad311b 100644 --- a/build/setup.py +++ b/build/setup.py @@ -31,7 +31,8 @@ author='JAX team', author_email='jax-dev@google.com', packages=['jaxlib'], - install_requires=['scipy', 'numpy>=1.12', 'six', 'protobuf>=3.6.0', 'absl-py'], + python_requires='>=3.5', + install_requires=['scipy', 'numpy>=1.12', 'six', 'absl-py'], url='https://github.com/google/jax', license='Apache-2.0', package_data={'jaxlib': binary_libs}, diff --git a/examples/datasets.py b/examples/datasets.py index 9c8e03e36494..0ae58ce5497e 100644 --- a/examples/datasets.py +++ b/examples/datasets.py @@ -23,7 +23,7 @@ import os from os import path import struct -from six.moves.urllib.request import urlretrieve +import urllib import numpy as np @@ -37,7 +37,7 @@ def _download(url, filename): os.makedirs(_DATA) out_file = path.join(_DATA, filename) if not path.isfile(out_file): - urlretrieve(url, out_file) + urllib.request.urlretrieve(url, out_file) print("downloaded {} to {}".format(url, _DATA)) diff --git a/examples/kernel_lsq.py b/examples/kernel_lsq.py index b2fb3fba0183..9172079022b9 100644 --- a/examples/kernel_lsq.py +++ b/examples/kernel_lsq.py @@ -18,8 +18,6 @@ from functools import partial -from six.moves import xrange - import numpy.random as npr import jax.numpy as np @@ -50,7 +48,7 @@ def update(i, opt_state): return opt_update(i, grad(f)(x), opt_state) opt_state = opt_init(x) - for i in xrange(num_steps): + for i in range(num_steps): opt_state = update(i, opt_state) return get_params(opt_state) diff --git a/examples/onnx2xla.py b/examples/onnx2xla.py index 47a1bd0f6d6e..3cdb0d1b3ead 100644 --- a/examples/onnx2xla.py +++ b/examples/onnx2xla.py @@ -25,7 +25,7 @@ import onnx from onnx import numpy_helper from onnx import onnx_pb2 -from six.moves.urllib.request import urlopen +import urllib import jax.numpy as np from jax import jit, grad @@ -115,7 +115,7 @@ def interpret_onnx(graph, *args): url = ('https://github.com/onnx/models/blob/' '81c4779096d1205edd0b809e191a924c58c38fef/' 'mnist/model.onnx?raw=true') - download = urlopen(url).read() + download = urllib.request.urlopen(url).read() if hashlib.md5(download).hexdigest() != 'bc8ad9bd19c5a058055dc18d0f089dad': print("onnx file checksum mismatch") sys.exit(1) diff --git a/examples/resnet50.py b/examples/resnet50.py index 211176fd2e23..30ceb955d1f0 100644 --- a/examples/resnet50.py +++ b/examples/resnet50.py @@ -23,8 +23,6 @@ import numpy.random as npr -from six.moves import xrange - import jax.numpy as np from jax.config import config from jax import jit, grad, random @@ -126,7 +124,7 @@ def update(i, opt_state, batch): return opt_update(i, grad(loss)(params, batch), opt_state) opt_state = opt_init(init_params) - for i in xrange(num_steps): + for i in range(num_steps): opt_state = update(i, opt_state, next(batches)) trained_params = get_params(opt_state) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index f169964d9ad3..a0dc95255db7 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -17,7 +17,6 @@ from __future__ import print_function import numpy as onp -import six from . import core from . import ad_util @@ -67,8 +66,6 @@ def __repr__(self): _bool = _nonzero = concretization_function_error(bool) _float = concretization_function_error(float) _int = concretization_function_error(int) - if six.PY2: - _long = concretization_function_error(long) # noqa: F821 _complex = concretization_function_error(complex) _hex = concretization_function_error(hex) _oct = concretization_function_error(oct) @@ -191,8 +188,6 @@ def strip_weak_type(self): _bool = _nonzero = partialmethod(_forward_to_value, bool) _float = partialmethod(_forward_to_value, float) _int = partialmethod(_forward_to_value, int) - if six.PY2: - _long = partialmethod(_forward_to_value, long) # noqa: F821 _complex = partialmethod(_forward_to_value, complex) _hex = partialmethod(_forward_to_value, hex) _oct = partialmethod(_forward_to_value, oct) diff --git a/jax/api.py b/jax/api.py index 8f907ac345d9..ec33e4a029e3 100644 --- a/jax/api.py +++ b/jax/api.py @@ -28,6 +28,7 @@ from __future__ import print_function import collections +import functools import itertools as it import operator as op import os @@ -37,8 +38,6 @@ import numpy as onp from contextlib import contextmanager from distutils.util import strtobool -import six -from six.moves import reduce from . import core from . import linear_util as lu @@ -1628,7 +1627,7 @@ def custom_jvp(primals, tangents): ans = fun(*primals) tangents_out = [rule(t, ans, *primals) for rule, t in zip(jvprules, tangents) if rule is not None and t is not ad_util.zero] - return ans, reduce(ad.add_tangents, tangents_out, ad_util.zero) + return ans, functools.reduce(ad.add_tangents, tangents_out, ad_util.zero) defjvp_all(fun, custom_jvp) def defvjp_all(fun, custom_vjp): diff --git a/jax/core.py b/jax/core.py index 9db0bcda3356..13ab6663b843 100644 --- a/jax/core.py +++ b/jax/core.py @@ -25,8 +25,6 @@ import threading import types -import six - from . import linear_util as lu from .util import safe_zip, safe_map, partial, curry from .pprint_util import pp, vcat, hcat, pp_kv_pairs @@ -370,10 +368,7 @@ def __getattr__(self, name): if t is aval_property: return attr.fget(self) elif t is aval_method: - if six.PY3: - return types.MethodType(attr.fun, self) - else: - return types.MethodType(attr.fun, self, None) + return types.MethodType(attr.fun, self) else: return attr diff --git a/jax/dtypes.py b/jax/dtypes.py index 98d9872f1d32..40d8dbf08287 100644 --- a/jax/dtypes.py +++ b/jax/dtypes.py @@ -28,7 +28,6 @@ import os import numpy as onp -import six from . import util from .config import flags @@ -97,9 +96,6 @@ def canonicalize_dtype(dtype): complex: onp.dtype(complex_), } -if six.PY2: - python_scalar_dtypes[long] = onp.dtype(int_) # noqa: F821 - def scalar_type_of(x): typ = dtype(x) if onp.issubdtype(typ, onp.bool_): diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index c9ce6d715e2a..1f2df920523a 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -111,7 +111,6 @@ def loop_body(i, acc_arr): from functools import partial import itertools import numpy as onp -import six import traceback from jax import abstract_arrays @@ -287,11 +286,8 @@ def __init__(self, scope, loop_builder): self.scope = scope self.loop_builder = loop_builder self.first_iteration = True # If we are tracing the first iteration - if six.PY3: - # Stack trace, without this line and the s.range function - self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) - else: - self.stack = None + # Stack trace, without this line and the s.range function + self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) # Next are state kept from the start of the first iteration to the end of the iteration. self.carried_state_initial = {} diff --git a/jax/experimental/optimizers.py b/jax/experimental/optimizers.py index 09b604a8f0a8..50e46c95757d 100644 --- a/jax/experimental/optimizers.py +++ b/jax/experimental/optimizers.py @@ -74,8 +74,6 @@ import functools import operator -from six.moves import reduce - import jax.numpy as np from jax.util import partial, safe_zip, safe_map, unzip2 from jax import tree_util @@ -420,7 +418,7 @@ def init(x0): def update(i, g, state): x, m, vs = state vs = [broadcast_into(g.ndim, v, i) for i, v in enumerate(vs)] - accum = reduce(np.minimum, vs) + g ** 2 + accum = functools.reduce(np.minimum, vs) + g ** 2 accum_inv_sqrt = np.where(accum > 0, 1. / np.sqrt(accum), 0) m = (1. - momentum) * (g * accum_inv_sqrt) + momentum * m x = x - step_size(i) * m diff --git a/jax/experimental/stax.py b/jax/experimental/stax.py index 95b4621270d6..3f668e479a9f 100644 --- a/jax/experimental/stax.py +++ b/jax/experimental/stax.py @@ -26,7 +26,6 @@ import operator as op import numpy as onp -from six.moves import reduce from jax import lax from jax import random @@ -210,7 +209,7 @@ def rescale(outputs, inputs, spec): def Flatten(): """Layer construction function for flattening all but the leading dim.""" def init_fun(rng, input_shape): - output_shape = input_shape[0], reduce(op.mul, input_shape[1:], 1) + output_shape = input_shape[0], functools.reduce(op.mul, input_shape[1:], 1) return output_shape, () def apply_fun(params, inputs, **kwargs): return np.reshape(inputs, (inputs.shape[0], -1)) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 026737ae96ff..0c7016dba3e2 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -16,6 +16,7 @@ from __future__ import division from __future__ import print_function +import functools import itertools as it from . import partial_eval as pe @@ -30,8 +31,6 @@ from ..api_util import flatten_fun, flatten_fun_nokwargs from ..tree_util import tree_flatten, tree_unflatten -from six.moves import reduce - zip = safe_zip map = safe_map def identity(x): return x @@ -412,7 +411,7 @@ def standard_jvp(jvprules, primitive, primals, tangents, **params): val_out = primitive.bind(*primals, **params) tangents_out = [rule(t, *primals, **params) for rule, t in zip(jvprules, tangents) if rule is not None and t is not zero] - return val_out, reduce(add_tangents, tangents_out, zero) + return val_out, functools.reduce(add_tangents, tangents_out, zero) def defjvp2(primitive, *jvprules): assert isinstance(primitive, Primitive) @@ -422,7 +421,7 @@ def standard_jvp2(jvprules, primitive, primals, tangents, **params): val_out = primitive.bind(*primals, **params) tangents_out = (rule(t, val_out, *primals, **params) for rule, t in zip(jvprules, tangents) if rule is not None and t is not zero) - return val_out, reduce(add_tangents, tangents_out, zero) + return val_out, functools.reduce(add_tangents, tangents_out, zero) def add_tangents(x, y): if x is zero: diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 7420287a7bbf..32ab93b5935b 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -22,9 +22,6 @@ import numpy as onp -import six -from six.moves import reduce - from .. import core from .. import dtypes from ..core import Trace, Tracer, new_master diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index bebb271a796e..bd5e6adf2393 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -16,13 +16,13 @@ from contextlib import contextmanager from collections import defaultdict, Counter, namedtuple +import functools from functools import partial, wraps import itertools as it import operator as op import string import numpy as onp -import six from .. import core from ..core import Trace, Tracer @@ -33,11 +33,10 @@ map = safe_map zip = safe_zip -reduce = six.moves.reduce def prod(xs): xs = list(xs) - return reduce(op.mul, xs) if xs else 1 + return functools.reduce(op.mul, xs) if xs else 1 ### main transformation functions @@ -225,10 +224,10 @@ def parse_spec(spec=''): def parse_dim(spec): if '+' in spec: terms = map(parse_dim, spec.split('+')) - return reduce(op.add, terms) + return functools.reduce(op.add, terms) elif '*' in spec: terms = map(parse_dim, spec.split('*')) - return reduce(op.mul, terms) + return functools.reduce(op.mul, terms) elif spec in digits: return parse_lit(spec) elif spec in identifiers: diff --git a/jax/interpreters/parallel.py b/jax/interpreters/parallel.py index 4c30d25d5c3e..622801349f30 100644 --- a/jax/interpreters/parallel.py +++ b/jax/interpreters/parallel.py @@ -20,8 +20,6 @@ import warnings import numpy as onp -import six -from six.moves import reduce from .. import core from .. import linear_util as lu diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 049e50486887..e27b29dad267 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -24,8 +24,6 @@ from absl import logging import numpy as onp -import six -from six.moves import reduce from ..config import flags from .. import core diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 852920727a17..933b6802ce0d 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -24,8 +24,6 @@ from absl import logging import numpy as onp -import six -from six.moves import xrange from ..config import flags from .. import core @@ -828,8 +826,6 @@ def __array__(self, dtype=None, context=None): __bool__ = __nonzero__ = partialmethod(_forward_to_value, bool) __float__ = partialmethod(_forward_to_value, float) __int__ = partialmethod(_forward_to_value, int) - if six.PY2: - __long__ = partialmethod(_forward_to_value, long) # noqa: F821 __complex__ = partialmethod(_forward_to_value, complex) __hex__ = partialmethod(_forward_to_value, hex) __oct__ = partialmethod(_forward_to_value, oct) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index dc3789df40e3..5eada7ea8dbb 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -16,6 +16,7 @@ from __future__ import division from __future__ import print_function +import builtins import collections import enum import functools @@ -24,9 +25,6 @@ import string import warnings -import six -from six.moves import builtins, xrange - import numpy as onp from ..util import partial, prod @@ -59,7 +57,7 @@ _max = builtins.max _min = builtins.max -_reduce = six.moves.reduce +_reduce = functools.reduce @cache() @@ -1471,8 +1469,8 @@ def _iter(tracer): raise TypeError("iteration over a 0-d array") # same as numpy error else: n = tracer.shape[0] - # return (index_in_dim(tracer, i, keepdims=False) for i in xrange(n)) - return iter([index_in_dim(tracer, i, keepdims=False) for i in xrange(n)]) + # return (index_in_dim(tracer, i, keepdims=False) for i in range(n)) + return iter([index_in_dim(tracer, i, keepdims=False) for i in range(n)]) ShapedArray._iter = staticmethod(_iter) # Add some ad handlers that use (or could use) lax primitives @@ -3198,7 +3196,7 @@ def _scatter_add_transpose_rule(t, operand, scatter_indices, updates, start_index_map=dimension_numbers.scatter_dims_to_operand_dims) slice_sizes = [] pos = 0 - for i in xrange(len(t.shape)): + for i in range(len(t.shape)): if i in dimension_numbers.inserted_window_dims: slice_sizes.append(1) else: @@ -3350,7 +3348,7 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, start_index_map=dnums.scatter_dims_to_operand_dims) slice_sizes = [] pos = 0 - for i in xrange(len(scattered_ids.shape)): + for i in range(len(scattered_ids.shape)): if i in dnums.inserted_window_dims: slice_sizes.append(1) else: diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 9bd9712dbe55..73e3b8075fee 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -21,12 +21,12 @@ from __future__ import print_function import collections +import functools import itertools import operator import threading import numpy as onp -import six from jax import api from jax import core @@ -50,7 +50,7 @@ _map = safe_map zip = safe_zip -_reduce = six.moves.reduce +_reduce = functools.reduce @cache() diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 86e0971b18a9..96eaae3592a3 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -19,9 +19,6 @@ from __future__ import division from __future__ import print_function -import six -from six.moves import xrange - import numpy as onp from jax import core @@ -503,14 +500,14 @@ def cases(x, y, xdim, ydim, xc, yc, xb, yb): y = _allgather(y, ydim, size, name) z = lax.dot_general( x, y, sub_dims(xdim, None, xc, yc, xb, yb), precision) - zdim = xdim + len(xb) - len([d for d in xrange(xdim) if d in xc]) + zdim = xdim + len(xb) - len([d for d in range(xdim) if d in xc]) return True, (z, zdim) else: # case f: x split but not contracting, y not split assert ydim is None z = lax.dot_general( x, y, sub_dims(xdim, None, xc, yc, xb, yb), precision) - zdim = xdim + len(xb) - len([d for d in xrange(xdim) if d in xc]) + zdim = xdim + len(xb) - len([d for d in range(xdim) if d in xc]) return True, (z, zdim) else: # cases g, h @@ -527,7 +524,7 @@ def cases(x, y, xdim, ydim, xc, yc, xb, yb): # zdim = ( # ydim + len(xb) + # batch dimensions # x.ndim - len(xc) - # non-contracting x dimensions - # len([d for d in xrange(ydim) if d in yc])) + # len([d for d in range(ydim) if d in yc])) # return True, (z, zdim) return False, 'lhs not split, rhs split but not contracting' diff --git a/jax/lax_reference.py b/jax/lax_reference.py index 0e7686ca3d5f..62be2ac49708 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -16,6 +16,7 @@ from __future__ import division from __future__ import print_function +import builtins import collections import itertools @@ -23,8 +24,6 @@ import opt_einsum import scipy.special -from six.moves import builtins - from . import dtypes _slice = builtins.slice diff --git a/jax/lazy.py b/jax/lazy.py index 6c4fcbf5dce4..8115c7bc0d24 100644 --- a/jax/lazy.py +++ b/jax/lazy.py @@ -17,10 +17,10 @@ from __future__ import print_function from collections import namedtuple +import functools import operator as op import numpy as onp -from six.moves import reduce from .util import safe_map, safe_zip, unzip2, subvals from .lib import xla_bridge as xb @@ -175,7 +175,7 @@ def eval_lexpr(lexpr, x): iotas = [onp.arange(d).reshape(subvals(ones, [(i, -1)])) for i, d in enumerate(input_.shape)] eyes = [i1 == i2 for i1, i2 in zip(iotas[:-1], iotas[1:])] - x = onp.asarray(reduce(op.and_, eyes), input_.dtype) + x = onp.asarray(functools.reduce(op.and_, eyes), input_.dtype) else: assert False @@ -230,7 +230,7 @@ def stage_lexpr(c, lexpr, x): iotas = [c.BroadcastedIota(onp.uint32, input_.shape, i) for i in range(len(input_.shape))] eyes = [c.Eq(i1, i2) for i1, i2 in zip(iotas[:-1], iotas[1:])] - x = c.ConvertElementType(reduce(c.And, eyes), etype) + x = c.ConvertElementType(functools.reduce(c.And, eyes), etype) else: assert False diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 69bff11e91b8..196fd5579c35 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -33,7 +33,6 @@ from .. import util from .. import dtypes import numpy as onp # 'onp' rather than 'np' to distinguish from autograd.numpy -import six import threading try: diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 793312bfdf88..9ccdc87a47e4 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -28,11 +28,9 @@ from __future__ import print_function from distutils.util import strtobool +import builtins import collections -try: - from collections.abc import Sequence -except ImportError: # python 2 - from collections import Sequence +from collections.abc import Sequence import itertools import os import re @@ -42,8 +40,6 @@ import numpy as onp import opt_einsum -import six -from six.moves import builtins, xrange from jax import jit, device_put, custom_transforms, defjvp from .. import core @@ -64,12 +60,8 @@ 'Control NumPy-style automatic rank promotion broadcasting ' '("allow", "warn", or "raise").') -if six.PY3: - def removechars(s, chars): - return s.translate(str.maketrans(dict.fromkeys(chars))) -else: - def removechars(s, chars): - return s.translate(None, ''.join(chars)) +def removechars(s, chars): + return s.translate(str.maketrans(dict.fromkeys(chars))) newaxis = None @@ -112,7 +104,7 @@ def __instancecheck__(self, instance): except AttributeError: return isinstance(instance, _arraylike_types) -class ndarray(six.with_metaclass(_ArrayMeta, onp.ndarray)): +class ndarray(onp.ndarray, metaclass=_ArrayMeta): def __init__(shape, dtype=None, buffer=None, offset=0, strides=None, order=None): raise TypeError("jax.numpy.ndarray() should not be instantiated explicitly." @@ -146,9 +138,8 @@ def __call__(self, x): return array(self.dtype.type(x), dtype=self.dtype) def _make_scalar_type(onp_scalar_type): - return type(onp_scalar_type.__name__, - (six.with_metaclass(_ScalarMeta, object),), - {"dtype": onp.dtype(onp_scalar_type)}) + return _ScalarMeta(onp_scalar_type.__name__, (object,), + {"dtype": onp.dtype(onp_scalar_type)}) bool_ = _make_scalar_type(onp.bool_) uint8 = _make_scalar_type(onp.uint8) @@ -347,7 +338,7 @@ def wrap(op): signatures = [] summary = None - for i in xrange(len(sections)): + for i in range(len(sections)): if _numpy_signature_re.match(sections[i]): signatures.append(sections[i]) else: @@ -571,7 +562,7 @@ def power(x1, x2): # TODO(phawkins): add integer pow support to XLA. bits = 6 # Anything more would overflow for any x1 > 1 acc = ones(shape(x1), dtype=dtype) - for _ in xrange(bits): + for _ in range(bits): acc = where(lax.bitwise_and(x2, _constant_like(x2, 1)), lax.mul(acc, x1), acc) x1 = lax.mul(x1, x1) @@ -1545,7 +1536,7 @@ def _pad(array, pad_width, mode, constant_values): if mode == "constant": constant_values = broadcast_to(asarray(constant_values), (nd, 2)) constant_values = lax.convert_element_type(constant_values, array.dtype) - for i in xrange(nd): + for i in range(nd): widths = [(0, 0, 0)] * nd widths[i] = (pad_width[i, 0], 0, 0) array = lax.pad(array, constant_values[i, 0], widths) @@ -1553,7 +1544,7 @@ def _pad(array, pad_width, mode, constant_values): array = lax.pad(array, constant_values[i, 1], widths) return array elif mode == "wrap": - for i in xrange(nd): + for i in range(nd): if array.shape[i] == 0: _check_no_padding(pad_width[i], mode) continue @@ -1569,7 +1560,7 @@ def _pad(array, pad_width, mode, constant_values): array = lax.concatenate(parts, dimension=i) return array elif mode in ("symmetric", "reflect"): - for i in xrange(nd): + for i in range(nd): if array.shape[i] == 0: _check_no_padding(pad_width[i], mode) continue diff --git a/jax/pprint_util.py b/jax/pprint_util.py index 62e2afb539e1..fd6034c05c4b 100644 --- a/jax/pprint_util.py +++ b/jax/pprint_util.py @@ -16,7 +16,7 @@ from __future__ import division from __future__ import print_function -from six.moves import reduce +import functools class PrettyPrint(object): @@ -52,14 +52,14 @@ def pp(s): def hcat(ps): - return reduce(lambda x, y: x >> y, ps) + return functools.reduce(lambda x, y: x >> y, ps) def vcat(ps): if not ps: return pp('') else: - return reduce(lambda x, y: x + y, ps) + return functools.reduce(lambda x, y: x + y, ps) def pp_kv_pairs(kv_pairs): diff --git a/jax/test_util.py b/jax/test_util.py index 379e6a9e25c2..fc10204c841d 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -29,8 +29,6 @@ import numpy as onp import numpy.random as npr -from six.moves import xrange - from . import api from . import dtypes from . import lax @@ -644,7 +642,7 @@ def cases_from_gens(*gens): sizes = [1, 3, 10] cases_per_size = int(FLAGS.num_generated_cases / len(sizes)) + 1 for size in sizes: - for i in xrange(cases_per_size): + for i in range(cases_per_size): yield ('_{}_{}'.format(size, i),) + tuple(gen(size) for gen in gens) diff --git a/jax/tree_util.py b/jax/tree_util.py index 5877396d4b63..291759f23661 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -41,7 +41,6 @@ import functools import collections -from six.moves import reduce from .lib import pytree @@ -195,7 +194,7 @@ def _replace_nones(sentinel, tree): return tree def tree_reduce(f, tree): - return reduce(f, tree_leaves(tree)) + return functools.reduce(f, tree_leaves(tree)) def tree_all(tree): return all(tree_leaves(tree)) diff --git a/jaxlib/cuda_prng.py b/jaxlib/cuda_prng.py index 795dfdb70d0e..d08b51b5dc54 100644 --- a/jaxlib/cuda_prng.py +++ b/jaxlib/cuda_prng.py @@ -16,11 +16,11 @@ from __future__ import division from __future__ import print_function +import functools import itertools import operator import numpy as np -from six.moves import reduce from jaxlib import xla_client @@ -31,7 +31,7 @@ except ImportError: pass -_prod = lambda xs: reduce(operator.mul, xs, 1) +_prod = lambda xs: functools.reduce(operator.mul, xs, 1) def threefry2x32(c, keys, data): diff --git a/jaxlib/cusolver.py b/jaxlib/cusolver.py index c096aae1e322..bdfdd4c56229 100644 --- a/jaxlib/cusolver.py +++ b/jaxlib/cusolver.py @@ -16,10 +16,10 @@ from __future__ import division from __future__ import print_function +import functools import operator import numpy as np -from six.moves import reduce from jaxlib import xla_client @@ -54,7 +54,7 @@ def _real_type(dtype): else: raise NotImplementedError("Unsupported dtype {}".format(dtype)) -_prod = lambda xs: reduce(operator.mul, xs, 1) +_prod = lambda xs: functools.reduce(operator.mul, xs, 1) def trsm(c, a, b, left_side=False, lower=False, trans_a=False, conj_a=False, diag=False): diff --git a/setup.py b/setup.py index f4f3b7af5788..5b5f4485fd49 100644 --- a/setup.py +++ b/setup.py @@ -27,8 +27,9 @@ author='JAX team', author_email='jax-dev@google.com', packages=find_packages(exclude=["examples"]), + python_requires='>=3.5', install_requires=[ - 'numpy>=1.12', 'six', 'absl-py', 'opt_einsum', 'fastcache' + 'numpy>=1.12', 'absl-py', 'opt_einsum', 'fastcache' ], url='https://github.com/google/jax', license='Apache-2.0', diff --git a/tests/api_test.py b/tests/api_test.py index 6b83a01a67ec..38351853ba42 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -27,10 +27,8 @@ from absl import logging from absl.testing import absltest, parameterized import numpy as onp -import six -if six.PY3: - import concurrent.futures +import concurrent.futures import jax import jax.numpy as np @@ -250,7 +248,7 @@ def f(x, n): lambda: jit(f)(0, 5)) def test_casts(self): - for castfun in [float, complex, hex, oct] + list(six.integer_types): + for castfun in [float, complex, hex, oct, int]: f = lambda x: castfun(x) self.assertRaisesRegex( TypeError, @@ -1094,7 +1092,6 @@ def pmapped_multi_step(state): u = np.ones((device_count, 100)) u_final = multi_step_pmap(u) # doesn't crash - @unittest.skipIf(six.PY2, "Test requires Python 3") def test_concurrent_device_get_and_put(self): def f(x): for _ in range(100): @@ -1109,7 +1106,6 @@ def f(x): for x, y in zip(xs, ys): self.assertAllClose(x, y, check_dtypes=True) - @unittest.skipIf(six.PY2, "Test requires Python 3") def test_concurrent_jit(self): @jit def f(x): diff --git a/tests/benchmarks/xla.py b/tests/benchmarks/xla.py index 2abdfddccd00..174a3d6870af 100644 --- a/tests/benchmarks/xla.py +++ b/tests/benchmarks/xla.py @@ -16,15 +16,20 @@ from __future__ import division from __future__ import print_function +import enum import pytest import numpy as np -import six import jax from jax import numpy as jnp from jax.interpreters import xla +class AnEnum(enum.IntEnum): + A = 123 + B = 456 + + _abstractify_args = [ 3, 3.5, @@ -33,16 +38,10 @@ np.random.randn(3, 4, 5, 6), np.arange(100, dtype=np.float32), jnp.int64(-3), - jnp.array([1, 2, 3]) + jnp.array([1, 2, 3]), + AnEnum.B, ] -if six.PY3: - import enum - class AnEnum(enum.IntEnum): - A = 123 - B = 456 - _abstractify_args.append(AnEnum.B) - @pytest.mark.parametrize("arg", _abstractify_args) def test_abstractify(benchmark, arg): benchmark(xla.abstractify, arg) \ No newline at end of file diff --git a/tests/dtypes_test.py b/tests/dtypes_test.py index d0eb96c377ac..04c305433d99 100644 --- a/tests/dtypes_test.py +++ b/tests/dtypes_test.py @@ -16,15 +16,11 @@ from __future__ import division from __future__ import print_function +import enum import itertools import operator import unittest -import six - -if six.PY3: - import enum - from absl.testing import absltest from absl.testing import parameterized @@ -169,7 +165,6 @@ def testArrayCasts(self): self.assertEqual(a.astype(t).dtype, np.dtype(t)) self.assertEqual(np.array(a).astype(t).dtype, np.dtype(t)) - @unittest.skipIf(six.PY2, "Test requires Python 3") def testEnumPromotion(self): class AnEnum(enum.IntEnum): A = 42 diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index b7d585df8feb..2d6f5968d562 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -27,7 +27,6 @@ from absl.testing import absltest from absl.testing import parameterized -import six import numpy as onp @@ -175,7 +174,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("conjugate", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("deg2rad", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, ["rev"], - inexact=six.PY3), + inexact=True), op_record("divmod", 2, int_dtypes + float_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], @@ -341,15 +340,6 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("ptp", 1, number_dtypes, nonempty_shapes, jtu.rand_default, []), ] -if six.PY2: - JAX_OPERATOR_OVERLOADS += [ - op_record("__div__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), - ] - JAX_RIGHT_OPERATOR_OVERLOADS += [ - op_record("__rdiv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), - ] - - CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/lax_test.py b/tests/lax_test.py index e5a625cc5783..67aea79c3ff4 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -27,7 +27,6 @@ import numpy as onp import numpy.random as npr -import six from jax import api from jax import core @@ -1498,11 +1497,6 @@ def testScatter(self, arg_shape, dtype, idxs, update_shape, dnums, fun = partial(lax.scatter, dimension_numbers=dnums) self._CompileAndCheck(fun, args_maker, check_dtypes=True) - def testLongConstantHandling(self): - if six.PY3: - self.skipTest("Test is Python 2 specific") - self.assertTrue(api.jit(lambda x: lax.lt(x, long(10)))(long(3))) # noqa: F821 - def testIssue831(self): # Tests the DeviceTuple constant handler def f(x): diff --git a/tests/loops_test.py b/tests/loops_test.py index e3a2deac0a9a..f305891f3a60 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -21,7 +21,6 @@ from absl.testing import absltest import numpy as onp import re -import six from jax import api, lax, ops from jax import numpy as np @@ -191,7 +190,6 @@ def f_op(inc): def test_range_locations(self): """Ranges have locations.""" - if six.PY2: self.skipTest("Source location not implemented for PY2") with loops.Scope() as s: r = s.range(5) cr = s.cond_range(True) @@ -230,11 +228,10 @@ def bad_function(exit_how="break"): pass return 0. - if six.PY3: - with self.assertRaisesRegex(ValueError, - re.compile(("Some ranges have exited prematurely. The innermost such range is at" - ".*s.range.555."), re.DOTALL)): - bad_function("break") + with self.assertRaisesRegex(ValueError, + re.compile(("Some ranges have exited prematurely. The innermost such range is at" + ".*s.range.555."), re.DOTALL)): + bad_function("break") with self.assertRaisesRegex(ValueError, "Some ranges have exited prematurely"): bad_function("return") # On exception exit, we let the exception propagate diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 6de02bdaea1c..1947d9df0462 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -23,7 +23,6 @@ import numpy as onp import numpy.random as npr -import six from unittest import SkipTest from jax import api From e51b6b34e15fca8d108de10617c673321202a1fe Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 8 Jan 2020 10:53:27 -0800 Subject: [PATCH 0587/1053] fix test typo --- tests/multibackend_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 1947d9df0462..7fc2aacb2834 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -141,7 +141,7 @@ def get_arr(scale): @jtu.skip_on_devices("cpu") # test can only fail with non-cpu backends def test_closed_over_values_device_placement(self): # see https://github.com/google/jax/issues/1431 - def f(): return lax.add(3., 4.) + def f(): return np.add(3., 4.) self.assertNotEqual(api.jit(f)().device_buffer.device(), api.devices('cpu')[0]) self.assertEqual(api.jit(f, backend='cpu')().device_buffer.device(), From 14fb85fee4192295f0b6bb39b68a2cf0d455b350 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 8 Jan 2020 13:38:37 -0800 Subject: [PATCH 0588/1053] bump version for pypi --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 8ef9c0051f89..a722a80b70f6 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.56" +__version__ = "0.1.57" From c45d9dbc20d6b5b4aaf5b08dd491dee9ae81a835 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 8 Jan 2020 15:03:47 -0800 Subject: [PATCH 0589/1053] Drop Python 2 support from jax BUILD rule. (#1965) --- jax/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/BUILD b/jax/BUILD index f99717dfcff6..ede1f4d1b209 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -38,6 +38,7 @@ py_library( "*_test.py", "**/*_test.py", ], + srcs_version = "PY3", ), deps = ["@org_tensorflow//tensorflow/compiler/xla/python:xla_client"], ) From 46014da21d49febb713781d033c0cbfcb79dfedb Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 8 Jan 2020 15:08:11 -0800 Subject: [PATCH 0590/1053] Fix c45d9db ("Drop Python 2 support from jax BUILD rule. #1965") --- jax/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/BUILD b/jax/BUILD index ede1f4d1b209..2ed87e6c942b 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -38,8 +38,8 @@ py_library( "*_test.py", "**/*_test.py", ], - srcs_version = "PY3", ), + srcs_version = "PY3", deps = ["@org_tensorflow//tensorflow/compiler/xla/python:xla_client"], ) From 9ef9b38b4e2274608d7449269af9c29780482ed1 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Thu, 9 Jan 2020 08:46:36 +0100 Subject: [PATCH 0591/1053] Put axis in named_parameters for numpy.gradient test --- tests/lax_numpy_test.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index d9dda3574922..1fcd62dec1a8 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2560,23 +2560,23 @@ def testPrecision(self): @parameterized.named_parameters( jtu.cases_from_list( - {"testcase_name": ("_shape={}_dtype={}").format(shape, dtype), + {"testcase_name": ("_shape={}_axis={}_dtype={}").format(shape, axis, dtype), "shape": shape, + "axis": axis, "dtype": dtype, "rng_factory": rng_factory} for shape in [(10,), (10, 15), (10, 15, 20)] + for _num_axes in range(len(shape)) + for axis in itertools.combinations(range(len(shape)), _num_axes) for dtype in inexact_dtypes for rng_factory in [jtu.rand_default])) - def testGradient(self, shape, dtype, rng_factory): + def testGradient(self, shape, axis, dtype, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) - ndim = len(shape) - for num_axes in range(ndim): - for axis in itertools.combinations(range(ndim), num_axes): - lnp_fun = lambda y: lnp.gradient(y, axis=axis) - onp_fun = lambda y: onp.gradient(y, axis=axis) - self._CheckAgainstNumpy( - onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + lnp_fun = lambda y: lnp.gradient(y, axis=axis) + onp_fun = lambda y: onp.gradient(y, axis=axis) + self._CheckAgainstNumpy( + onp_fun, lnp_fun, args_maker, check_dtypes=False) + self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) def testZerosShapeErrors(self): # see https://github.com/google/jax/issues/1822 From ab2582585e0000e6a148a180ff419253c02390db Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 9 Jan 2020 11:16:52 -0500 Subject: [PATCH 0592/1053] Implement np.sign for unsigned integers. (#1970) Fix definition of np.sign for complex numbers. Document lax.sign better for non-float types. --- jax/lax/lax.py | 30 ++++++++++++++++++++++++++---- jax/numpy/lax_numpy.py | 11 ++++++++++- tests/lax_numpy_test.py | 13 +++++++++++-- tests/lax_test.py | 3 ++- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 5eada7ea8dbb..73a272d53a46 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -111,13 +111,24 @@ def neg(x): def sign(x): r"""Elementwise sign. + For floating-point inputs, returns :math:`\mathrm{sign}(x) = \begin{cases} -1 & x < 0\\ -0 & x = -0\\ \mathit{NaN} & x = \mathit{NaN}\\ +0 & x = +0\\ 1 & x > 0 - \end{cases}`. + \end{cases}` + + For signed integer inputs, returns + :math:`\mathrm{sign}(x) = \begin{cases} + -1 & x < 0\\ + 0 & x = 0\\ + 1 & x > 0 + \end{cases}` + + For complex inputs, returns the complex phase, i.e. + :math:`\mathrm{sign}(x) = \frac{x}{|x|}`. """ return sign_p.bind(x) @@ -1531,9 +1542,10 @@ def unop_dtype_rule(result_dtype, accepted_dtypes, name, aval, **kwargs): return result_dtype(aval.dtype) -def unop(result_dtype, accepted_dtypes, name): +def unop(result_dtype, accepted_dtypes, name, translation_rule=None): dtype_rule = partial(unop_dtype_rule, result_dtype, accepted_dtypes, name) - prim = standard_primitive(_attrgetter('shape'), dtype_rule, name) + prim = standard_primitive(_attrgetter('shape'), dtype_rule, name, + translation_rule=translation_rule) batching.defvectorized(prim) masking.defvectorized(prim) return prim @@ -1623,7 +1635,17 @@ def _brcast_to(x, shape): neg_p = standard_unop(_num, 'neg') ad.deflinear(neg_p, lambda t: [neg(t)]) -sign_p = standard_unop(_num, 'sign') +def _sign_translation_rule(c, x): + shape = c.GetShape(x) + dtype = shape.numpy_dtype() + if dtypes.issubdtype(dtype, onp.unsignedinteger): + zero = c.Constant(onp.array(0, dtype=dtype)) + dims = c.GetShape(x).dimensions() + return c.Select(c.Eq(x, zero), c.Broadcast(zero, dims), + c.Broadcast(c.Constant(onp.array(1, dtype=dtype)), dims)) + return c.Sign(x) + +sign_p = standard_unop(_num, 'sign', translation_rule=_sign_translation_rule) ad.defjvp_zero(sign_p) nextafter_p = standard_binop( diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 9ccdc87a47e4..4d1cb5a58d96 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -415,7 +415,6 @@ def fn(x1, x2): bitwise_not = _one_to_one_unop(onp.bitwise_not, lax.bitwise_not) negative = _one_to_one_unop(onp.negative, lax.neg) positive = _one_to_one_unop(onp.positive, lambda x: x) -sign = _one_to_one_unop(onp.sign, lax.sign) floor = _one_to_one_unop(onp.floor, lax.floor, True) ceil = _one_to_one_unop(onp.ceil, lax.ceil, True) @@ -486,6 +485,16 @@ def op(*args): logical_xor = _logical_op(onp.logical_xor, lax.bitwise_xor) +@_wraps(onp.sign) +def sign(x): + dtype = _dtype(x) + if issubdtype(dtype, complexfloating): + re = lax.real(x) + return lax.complex( + lax.sign(where(re != 0, re, lax.imag(x))), _constant_like(re, 0)) + return lax.sign(x) + + @_wraps(onp.true_divide) def true_divide(x1, x2): x1, x2 = _promote_args_inexact("true_divide", x1, x2) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 2d6f5968d562..9af3887bfc73 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -60,6 +60,7 @@ {lnp.bfloat16, onp.float16, onp.float32, onp.float64})) complex_dtypes = [onp.complex64, onp.complex128] int_dtypes = [onp.int32, onp.int64] +uint_dtypes = [onp.uint32, onp.uint64] unsigned_dtypes = [onp.uint32, onp.uint64] bool_dtypes = [onp.bool_] default_dtypes = float_dtypes + int_dtypes @@ -188,6 +189,10 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("fix", 1, float_dtypes, all_shapes, jtu.rand_default, []), op_record("floor_divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, ["rev"]), + # TODO(phawkins): merge this with the preceding entry after the minimum + # Jaxlib version is increased to 0.1.38. + op_record("floor_divide", 2, uint_dtypes, all_shapes, jtu.rand_nonzero, + ["rev"]), op_record("heaviside", 2, default_dtypes, all_shapes, jtu.rand_default, [], inexact=True), op_record("hypot", 2, default_dtypes, all_shapes, jtu.rand_default, [], @@ -230,6 +235,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("remainder", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-2}), op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("sign", 1, number_dtypes + uint_dtypes, all_shapes, + jtu.rand_some_inf_and_nan, []), op_record("sinc", 1, [t for t in number_dtypes if t != lnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], tolerance={onp.complex64: 1e-5}, inexact=True, @@ -297,7 +304,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, tolerance={onp.float32: 2e-4, onp.complex64: 2e-4, onp.complex128: 1e-14}), op_record("__mod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), - op_record("__floordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("__floordiv__", 2, default_dtypes, all_shapes, + jtu.rand_nonzero, []), op_record("__truediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, [], inexact=True), op_record("__abs__", 1, number_dtypes, all_shapes, jtu.rand_default, []), @@ -319,7 +327,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, tolerance={onp.float32: 2e-4, onp.complex64: 1e-3}), op_record("__rmod__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, [], tolerance={onp.float16: 1e-1}), - op_record("__rfloordiv__", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), + op_record("__rfloordiv__", 2, default_dtypes, all_shapes, + jtu.rand_nonzero, []), op_record("__rtruediv__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, [], inexact=True), # op_record("__ror__", 2, number_dtypes, all_shapes, jtu.rand_bool, []), diff --git a/tests/lax_test.py b/tests/lax_test.py index 67aea79c3ff4..4d6be9d60440 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -62,6 +62,7 @@ def num_float_bits(dtype): {onp.complex64, onp.complex128})) inexact_dtypes = float_dtypes + complex_dtypes int_dtypes = list(jtu.supported_dtypes().intersection({onp.int32, onp.int64})) +uint_dtypes = list(jtu.supported_dtypes().intersection({onp.uint32, onp.uint64})) bool_dtypes = [onp.bool_] default_dtypes = float_dtypes + int_dtypes all_dtypes = float_dtypes + complex_dtypes + int_dtypes + bool_dtypes @@ -77,7 +78,7 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): LAX_OPS = [ op_record("neg", 1, default_dtypes + complex_dtypes, jtu.rand_small), - op_record("sign", 1, default_dtypes, jtu.rand_small), + op_record("sign", 1, default_dtypes + uint_dtypes, jtu.rand_small), op_record("floor", 1, float_dtypes, jtu.rand_small), op_record("ceil", 1, float_dtypes, jtu.rand_small), op_record("round", 1, float_dtypes, jtu.rand_default), From facbe0d76a58c45f48bc9338827328d70ba4a76b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 9 Jan 2020 14:36:37 -0500 Subject: [PATCH 0593/1053] Handle 0D convolutions correctly in shape rule. (#1972) --- jax/lax/lax.py | 3 ++- tests/lax_test.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2b3f58b56968..097573597e47 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4331,7 +4331,8 @@ def conv_shape_tuple(lhs_shape, rhs_shape, strides, pads): msg = "Wrong number of explicit pads for convolution: expected {}, got {}." raise TypeError(msg.format(len(lhs_shape) - 2, len(pads))) - lhs_padded = onp.add(lhs_shape[2:], onp.add(*zip(*pads))) + lhs_padded = onp.add(lhs_shape[2:], onp.sum(onp.array(pads).reshape(-1, 2), + axis=1)) out_space = onp.floor_divide( onp.subtract(lhs_padded, rhs_shape[2:]), strides) + 1 out_space = onp.maximum(0, out_space) diff --git a/tests/lax_test.py b/tests/lax_test.py index 4d6be9d60440..01cd4f105119 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -489,6 +489,16 @@ def fun(lhs, rhs): # TODO(mattjj): test conv_general_dilated against numpy + def testConv0DIsDot(self): + rng = jtu.rand_default() + def args_maker(): + return [rng((10, 5), onp.float32), rng((5, 7), onp.float32)] + jnp_fun = partial(lax.conv_general_dilated, window_strides=(), + padding='VALID', dimension_numbers=('NC', 'IO', 'NC')) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(jnp_fun, onp.dot, args_maker) + + @staticmethod def _conv_transpose_via_grad(data, kernel, strides, padding, rhs_dilation=None, dimension_numbers=None): From 8bca2c90e7e1ae22ac645cfb7175a76937ca7b9c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 9 Jan 2020 20:25:42 -0800 Subject: [PATCH 0594/1053] fix urllib import for py3 --- examples/datasets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/datasets.py b/examples/datasets.py index 0ae58ce5497e..d1067bd9ca2f 100644 --- a/examples/datasets.py +++ b/examples/datasets.py @@ -23,7 +23,7 @@ import os from os import path import struct -import urllib +import urllib.request import numpy as np From f36d858c4ef62f5ea2f9616701f33fb38b74b464 Mon Sep 17 00:00:00 2001 From: Julius Kunze Date: Fri, 10 Jan 2020 13:28:03 +0000 Subject: [PATCH 0595/1053] Require shape = sample_shape + batch_shape in random.categorical --- jax/random.py | 31 ++++++++++++++++++++----------- tests/random_test.py | 11 ++++++----- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/jax/random.py b/jax/random.py index dead56231acd..2dffb3745b9c 100644 --- a/jax/random.py +++ b/jax/random.py @@ -946,25 +946,34 @@ def _gumbel(key, shape, dtype): return -np.log(-np.log( uniform(key, shape, dtype, minval=np.finfo(dtype).eps, maxval=1.))) -def categorical(key, logits, axis=-1, shape=()): +def categorical(key, logits, axis=-1, shape=None): """Sample random values from categorical distributions. Args: key: a PRNGKey used as the random key. - logits: Unnormalized log probabilities of the categorical distribution(s) to sample from, so that - `softmax(logits, axis)` gives the corresponding probabilities. - axis: Specifies the axis along which logits belong to the same categorical distribution. - shape: Specifies how many samples to take per categorical distribution and in what shape to arrange them. + logits: Unnormalized log probabilities of the categorical distribution(s) to sample from, + so that `softmax(logits, axis)` gives the corresponding probabilities. + axis: Axis along which logits belong to the same categorical distribution. + shape: Optional, a tuple of nonnegative integers representing the result shape. + Must be broadcast-compatible with ``onp.delete(logits.shape, axis)``. + The default (None) produces a result shape equal to ``onp.delete(logits.shape, axis)``. Returns: - Samples of shape `shape + tuple(onp.delete(logits.shape, axis))`. - The first len(shape) dimensions specify which sample, - while the last len(logits.shape) - 1 dimensions make up the shape per sample. - """ + A random array with int dtype and shape given by ``shape`` if ``shape`` + is not None, or else ``onp.delete(logits.shape, axis)``. + """ + if axis >= 0: - axis += len(shape) + axis -= len(logits.shape) + + batch_shape = tuple(onp.delete(logits.shape, axis)) + if shape is None: + shape = batch_shape + else: + _check_shape("categorical", shape, batch_shape) - return np.argmax(gumbel(key, shape + logits.shape, logits.dtype) + logits, axis=axis) + sample_shape = shape[:len(shape)-len(batch_shape)] + return np.argmax(gumbel(key, sample_shape + logits.shape, logits.dtype) + logits, axis=axis) def laplace(key, shape=(), dtype=onp.float64): """Sample Laplace random values with given shape and float dtype. diff --git a/tests/random_test.py b/tests/random_test.py index ce5eb623bfda..96625abbc44d 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -188,15 +188,16 @@ def testBernoulli(self, p, dtype): self._CheckChiSquared(samples, scipy.stats.bernoulli(p).pmf) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_p={}_{}".format(p, dtype), - "p": p, "axis": axis, "dtype": onp.dtype(dtype).name} + {"testcase_name": "_p={}_{}_{}".format(p, dtype, sample_shape), + "p": p, "axis": axis, "dtype": onp.dtype(dtype).name, 'sample_shape': sample_shape} for (p, axis) in [([.25] * 4, -1), ([[.25, .25], [.1, .9]], 1), ([[.25, .1], [.25, .9]], 0)] + for sample_shape in [(10000,), (5000, 2)] for dtype in [onp.float32, onp.float64])) - def testCategorical(self, p, axis, dtype): + def testCategorical(self, p, axis, dtype, sample_shape): key = random.PRNGKey(0) p = onp.array(p, dtype=dtype) logits = onp.log(p) - 42 # test unnormalized - shape = (10000,) + shape = sample_shape + tuple(onp.delete(logits.shape, axis)) rand = lambda key, p: random.categorical(key, logits, shape=shape, axis=axis) crand = api.jit(rand) @@ -207,7 +208,7 @@ def testCategorical(self, p, axis, dtype): if axis < 0: axis += len(logits.shape) - assert samples.shape == shape + tuple(onp.delete(p.shape, axis)) + assert samples.shape == shape if len(p.shape[:-1]) > 0: for cat_index, p_ in enumerate(p): From 0417e1e5c38addc898eaca73c43115a6f4523c92 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 10 Jan 2020 09:38:19 -0800 Subject: [PATCH 0596/1053] Fix `jax.lax.axis_index` in multi-host setting. (#1976) --- jax/interpreters/pxla.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index e27b29dad267..d4bfe05f577c 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -505,7 +505,21 @@ def dynamic_fun(dummy, *args): msg = ("compiling computation that requires {} replicas, but only {} XLA " "devices are available") raise ValueError(msg.format(num_global_replicas, xb.device_count(backend))) - device_assignment = None + + # On a single host, we use the platform's default device assignment to + # potentially take advantage of device locality. On multiple hosts, the + # default device assignment may interleave different hosts' replicas, + # violating pmap's semantics where data is sharded across replicas in + # row-major order. Instead, manually create a device assignment that ensures + # each host is responsible for a continguous set of replicas. + if xb.host_count() > 1: + # TODO(skye): use a locality-aware assignment that satisfies the above + # constraint. + devices = [d for host_id in xb.host_ids() + for d in xb.local_devices(host_id)] + else: + devices = xb.get_backend(backend).get_default_device_assignment( + num_global_replicas) else: if num_local_replicas != len(local_devices): local_devices_str = ", ".join(map(str, local_devices)) @@ -518,7 +532,8 @@ def dynamic_fun(dummy, *args): raise ValueError("compiling computation that requires %s replicas, " "but %s devices were specified" % (num_global_replicas, len(devices))) - device_assignment = tuple(d.id for d in devices) + + device_assignment = tuple(d.id for d in devices) compiled = built.Compile( compile_options=xb.get_compile_options(num_global_replicas, device_assignment), backend=xb.get_backend(backend)) From 773ebe1323e6cf9783e6a02bf3e189e5bf9aeb00 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 10 Jan 2020 10:10:26 -0800 Subject: [PATCH 0597/1053] Adjust tolerance for LaxTest.testConv0DIsDot. (#1978) This was failing on TPU. --- tests/lax_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index 01cd4f105119..7685ae1ddc00 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -496,7 +496,7 @@ def args_maker(): jnp_fun = partial(lax.conv_general_dilated, window_strides=(), padding='VALID', dimension_numbers=('NC', 'IO', 'NC')) self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) - self._CheckAgainstNumpy(jnp_fun, onp.dot, args_maker) + self._CheckAgainstNumpy(jnp_fun, onp.dot, args_maker, tol=.1) @staticmethod From afb8af19ff7474561c3c904e03c63dbf8f57de3f Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Fri, 10 Jan 2020 15:31:51 -0800 Subject: [PATCH 0598/1053] implement JVP of while loop Co-authored-by: Matthew Johnson --- jax/core.py | 3 ++ jax/lax/lax_control_flow.py | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/jax/core.py b/jax/core.py index 13ab6663b843..1f237d370c80 100644 --- a/jax/core.py +++ b/jax/core.py @@ -87,6 +87,9 @@ def jaxpr_as_fun(typed_jaxpr, *args): @total_ordering class Var(object): + # TODO(frostig,mattjj): We don't override __eq__ or __hash__, so comparison is + # by object id, but pretty printing might collide. + def __init__(self, count, suffix): self.count = count self.suffix = suffix diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 73e3b8075fee..6d0974a51bcd 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -307,10 +307,70 @@ def _while_loop_batching_rule(args, dims, cond_nconsts, cond_jaxpr, out_bdims = [0 if b else batching.not_mapped for b in carry_bat] return outs, out_bdims +def _while_loop_jvp(primals, tangents, cond_nconsts, cond_jaxpr, body_nconsts, + body_jaxpr): + nonzeros = [t is not ad_util.zero for t in tangents] + cconst_nz, bconst_nz, init_nz = split_list(nonzeros, [cond_nconsts, body_nconsts]) + + carry_nz = init_nz + for _ in range(1 + len(carry_nz)): + nonzeros = bconst_nz + carry_nz + body_jvp, nonzeros_out = ad.jvp_jaxpr( + body_jaxpr, nonzeros, instantiate=carry_nz) + if nonzeros_out == carry_nz: + break + else: + carry_nz = _map(operator.or_, carry_nz, nonzeros_out) + else: + assert False, "Fixpoint not reached" + + tangents = [ad.instantiate_zeros(x, t) if t is ad_util.zero and nz else t + for x, t, nz in zip(primals, tangents, nonzeros)] + + cconst, bconst, init = split_list(primals, [cond_nconsts, body_nconsts]) + _, bconst_dot, init_dot = split_list(tangents, [cond_nconsts, body_nconsts]) + bconst_dot = _prune_zeros(bconst_dot) + init_dot = _prune_zeros(init_dot) + + num_carry = len(primals) - cond_nconsts - body_nconsts + + body_jvp_rearranged = ad.rearrange_binders( + body_jvp, + [body_nconsts, num_carry], [len(bconst_dot), len(init_dot)], + [num_carry], [len(init_dot)]) + + newvar = core.gensym('') + invars_aug = ( + cond_jaxpr.jaxpr.invars + [newvar() for _ in range(len(init_dot))]) + cond_jaxpr_augmented = core.Jaxpr(cond_jaxpr.jaxpr.constvars, + cond_jaxpr.jaxpr.freevars, + invars_aug, + cond_jaxpr.jaxpr.outvars, + cond_jaxpr.jaxpr.eqns) + in_avals_aug = (cond_jaxpr.in_avals[:cond_nconsts] + + body_jvp_rearranged.in_avals[body_nconsts + len(bconst_dot):]) + cond_jaxpr_augmented = core.TypedJaxpr(cond_jaxpr_augmented, + cond_jaxpr.literals, + in_avals_aug, + cond_jaxpr.out_avals) + + out = while_p.bind( + *(cconst + bconst + bconst_dot + init + init_dot), + cond_nconsts=cond_nconsts, + cond_jaxpr=cond_jaxpr_augmented, + body_nconsts=len(bconst) + len(bconst_dot), + body_jaxpr=body_jvp_rearranged) + + out_carry, out_carry_dot = split_list(out, [num_carry]) + out_tangents = iter(out_carry_dot) + out_tangents = [next(out_tangents) if nz else ad_util.zero for nz in nonzeros_out] + return out_carry, out_tangents + while_p = lax.Primitive('while') while_p.multiple_results = True while_p.def_impl(partial(xla.apply_primitive, while_p)) while_p.def_abstract_eval(_while_loop_abstract_eval) +ad.primitive_jvps[while_p] = _while_loop_jvp xla.initial_style_translations[while_p] = _while_loop_translation_rule batching.primitive_batchers[while_p] = _while_loop_batching_rule From 160cc43a5d098a935c2c8bb2157915a64e0e5582 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 10 Jan 2020 15:47:49 -0800 Subject: [PATCH 0599/1053] Disable failing GPU test for now pending XLA fix. --- tests/lax_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/lax_test.py b/tests/lax_test.py index 7685ae1ddc00..65944935127d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -489,6 +489,7 @@ def fun(lhs, rhs): # TODO(mattjj): test conv_general_dilated against numpy + @jtu.skip_on_devices("gpu") # b/147488740 def testConv0DIsDot(self): rng = jtu.rand_default() def args_maker(): From ed33d102796e5d9d32fe6b222f2bfb06ecff293f Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 10 Jan 2020 15:58:52 -0800 Subject: [PATCH 0600/1053] Add ppermute as an allowed multi-host collective. (#1981) I manually tested that this works as of 0417e1e. The indices used in ppermute correspond to those returned by `axis_index`. --- jax/lax/lax_parallel.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 96eaae3592a3..15ebdf4aa5e1 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -245,6 +245,7 @@ def _ppermute_transpose_rule(t, perm, axis_name): ppermute_p = standard_pmap_primitive('ppermute') ad.deflinear(ppermute_p, _ppermute_transpose_rule) xla.parallel_translations[ppermute_p] = _ppermute_translation_rule +pxla.multi_host_supported_collectives.add(ppermute_p) def _all_to_all_translation_rule(c, x, split_axis, concat_axis, replica_groups): From 05f09fc93511c3e1a480ccc81f055d14488779bc Mon Sep 17 00:00:00 2001 From: archis Date: Fri, 10 Jan 2020 16:31:47 -0800 Subject: [PATCH 0601/1053] added rfftfreq, tests, and documentation link. --- docs/jax.numpy.rst | 1 + jax/numpy/fft.py | 23 +++++++++++++++++++++++ tests/fft_test.py | 47 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index 17ada6ad1a61..6df68e252d34 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -263,6 +263,7 @@ jax.numpy.fft fft2 ifft2 fftfreq + rfftfreq jax.numpy.linalg ---------------- diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index d6a534af0f3c..9ba9b893af47 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -121,6 +121,29 @@ def fftfreq(n, d=1.0): return k / (d * n) +@_wraps(onp.fft.rfftfreq) +def rfftfreq(n, d=1.0): + if isinstance(n, list) or isinstance(n, tuple): + raise ValueError( + "The n argument of jax.np.fft.rfftfreq only takes an int. " + "Got n = %s." % list(n)) + + elif isinstance(d, list) or isinstance(d, tuple): + raise ValueError( + "The d argument of jax.np.fft.rfftfreq only takes a single value. " + "Got d = %s." % list(d)) + + if n % 2 == 0: + # k[0: n // 2 - 1] = np.arange(0, n // 2 - 1) + k = np.arange(0, n // 2 + 1) + + else: + # k[0: (n - 1) // 2] = np.arange(0, (n - 1) // 2) + k = np.arange(0, (n - 1) // 2 + 1) + + return k / (d * n) + + @_wraps(onp.fft.fftn) def fftn(a, s=None, axes=None, norm=None): return _fft_core('fftn', xla_client.FftType.FFT, a, s, axes, norm) diff --git a/tests/fft_test.py b/tests/fft_test.py index 6e2fe7e50edd..5f95cddd401a 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -248,7 +248,52 @@ def testFftfreqErrors(self, n): self.assertRaisesRegex( ValueError, "The n argument of jax.np.fft.{} only takes an int. " - "Got n = \\[0, 1, 2\\]".format(name), + "Got n = \\[0, 1, 2\\].".format(name), + lambda: func(n=n) + ) + self.assertRaisesRegex( + ValueError, + "The d argument of jax.np.fft.{} only takes a single value. " + "Got d = \\[0, 1, 2\\].".format(name), + lambda: func(n=10, d=n) + ) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_size={}_d={}".format( + jtu.format_shape_dtype_string([size], dtype), d), + "dtype": dtype, "size": size, "rng_factory": rng_factory, "d": d} + for rng_factory in [jtu.rand_default] + for dtype in all_dtypes + for size in [9, 10, 101, 102] + for d in [0.1, 2.])) + def testRfftfreq(self, size, d, dtype, rng_factory): + rng = rng_factory() + args_maker = lambda: (rng([size], dtype),) + np_op = np.fft.rfftfreq + onp_op = onp.fft.rfftfreq + np_fn = lambda a: np_op(size, d=d) + onp_fn = lambda a: onp_op(size, d=d) + # Numpy promotes to complex128 aggressively. + self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, + tol=1e-4) + self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) + # Test gradient for differentiable types. + if dtype in inexact_dtypes: + tol = 0.15 # TODO(skye): can we be more precise? + jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) + jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_n={}".format(n), + "n": n} + for n in [[0, 1, 2]])) + def testRfftfreqErrors(self, n): + name = 'rfftfreq' + func = np.fft.rfftfreq + self.assertRaisesRegex( + ValueError, + "The n argument of jax.np.fft.{} only takes an int. " + "Got n = \\[0, 1, 2\\].".format(name), lambda: func(n=n) ) self.assertRaisesRegex( From 8b6f660d269a3fe64a3d79d5f1cf197fc4ee87de Mon Sep 17 00:00:00 2001 From: archis Date: Fri, 10 Jan 2020 16:33:17 -0800 Subject: [PATCH 0602/1053] removed redundant comments --- jax/numpy/fft.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index 9ba9b893af47..ba8ab0fcf813 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -134,11 +134,9 @@ def rfftfreq(n, d=1.0): "Got d = %s." % list(d)) if n % 2 == 0: - # k[0: n // 2 - 1] = np.arange(0, n // 2 - 1) k = np.arange(0, n // 2 + 1) else: - # k[0: (n - 1) // 2] = np.arange(0, (n - 1) // 2) k = np.arange(0, (n - 1) // 2 + 1) return k / (d * n) From 34ede6b72ec9a49386b55a55e40d7efbc46956c2 Mon Sep 17 00:00:00 2001 From: Chase Roberts Date: Fri, 10 Jan 2020 16:49:08 -0800 Subject: [PATCH 0603/1053] Added pshuffle (#1975) --- jax/lax/lax_parallel.py | 24 ++++++++++++++++++++++++ tests/pmap_test.py | 22 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 15ebdf4aa5e1..0aeb19524edf 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -113,6 +113,30 @@ def ppermute(x, axis_name, perm): """ return ppermute_p.bind(x, axis_name=axis_name, perm=tuple(perm)) +def pshuffle(x, axis_name, perm): + """Perform a collective shuffle according to the permutation ``perm``. + + This function is a simple wrapper around jax.lax.ppermute. + + Args: + x: array with a mapped axis named ``axis_name``. + axis_name: hashable Python object used to name a pmapped axis (see the + ``pmap`` docstring for more details). + perm: list of of ints, representing the new order of the source indicies + that encode how the mapped axis named ``axis_name`` should be + shuffled. The integer values are treated as indices into the mapped axis + ``axis_name``. Every int between 0 and ``len(perm)-1`` should be included. + + Returns: + An array with the same shape as ``x`` with slices along the axis + ``axis_name`` gathered from ``x`` according to the permutation ``perm``. + """ + if set(perm) != set(range(len(perm))): + raise AssertionError( + "Given `perm` does not represent a real permutation: {}".format(perm)) + return ppermute(x, axis_name, list(zip(perm, range(len(perm))))) + + def pswapaxes(x, axis_name, axis): """Swap the pmapped axis ``axis_name`` with the unmapped axis ``axis``. diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 74afbfa82c1e..ba2e5c6c2828 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -354,6 +354,28 @@ def testCollectivePermuteCyclicGrad(self): expected = onp.roll(onp.pi + onp.arange(device_count), 1) self.assertAllClose(ans, expected, check_dtypes=False) + @jtu.skip_on_devices("cpu") + def testCollectivePermuteCyclicWithPShuffle(self): + device_count = xla_bridge.device_count() + values = onp.arange(device_count) + shift_right = [(i - 1) % device_count for i in range(device_count)] + f = lambda x: lax.pshuffle(x, perm=shift_right, axis_name='i') + expected = onp.transpose(values, shift_right) + ans = onp.asarray(pmap(f, "i")(values)) + self.assertAllClose(ans, expected, check_dtypes=False) + + @jtu.skip_on_devices("cpu") + def testPShuffleWithBadPerm(self): + device_count = xla_bridge.device_count() + bad_perm = list(range(device_count)) + bad_perm[0] = 1 + f = lambda x: lax.pshuffle(x, perm=bad_perm, axis_name='i') + g = lambda: pmap(f, "i")(onp.arange(device_count)) + self.assertRaisesRegex( + AssertionError, + "Given `perm` does not represent a real permutation: {}".format(bad_perm), + g) + @jtu.skip_on_devices("cpu", "gpu") def testPpermuteWithZipObject(self): # https://github.com/google/jax/issues/1703 From 9afa2c6b69695a015b1af7d1ccbb3546ddc002ae Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 10 Jan 2020 20:44:24 -0800 Subject: [PATCH 0604/1053] fix broken link to trax, fixes #1974 --- cloud_tpu_colabs/Pmap_Cookbook.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud_tpu_colabs/Pmap_Cookbook.ipynb b/cloud_tpu_colabs/Pmap_Cookbook.ipynb index 07b10b773eab..d538a24531b9 100644 --- a/cloud_tpu_colabs/Pmap_Cookbook.ipynb +++ b/cloud_tpu_colabs/Pmap_Cookbook.ipynb @@ -73,7 +73,7 @@ "\n", "To run this notebook with any parallelism, you'll need multiple XLA devices available, e.g. with a multi-GPU machine or a Cloud TPU.\n", "\n", - "The code in this notebook is simple. For an example of how to use these tools to do data-parallel neural network training, check out [the SPMD MNIST example](https://github.com/google/jax/blob/master/examples/spmd_mnist_classifier_fromscratch.py) or the much more capable [Trax library](https://github.com/tensorflow/trax/)." + "The code in this notebook is simple. For an example of how to use these tools to do data-parallel neural network training, check out [the SPMD MNIST example](https://github.com/google/jax/blob/master/examples/spmd_mnist_classifier_fromscratch.py) or the much more capable [Trax library](https://github.com/google/trax/)." ] }, { From a7eb5897d31f5f0fd2b346cfd26e51faa11e9c97 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 11 Jan 2020 16:31:59 -0800 Subject: [PATCH 0605/1053] add mini-libraries readme --- README.md | 8 ++++ jax/experimental/README.md | 88 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 jax/experimental/README.md diff --git a/README.md b/README.md index 275629c27e2b..9a9d7a0d7b0e 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,14 @@ For a deeper dive into JAX: - See the [full list of notebooks](https://github.com/google/jax/tree/master/docs/notebooks). +You can also take a look at [the mini-libraries in +`jax.experimental`](https://github.com/google/jax/tree/master/jax/experimental/README.md), +like [`stax` for building neural +networks](https://github.com/google/jax/tree/master/jax/experimental/README.md#neural-net-building-with-stax) +and [`optimizers` for first-order stochastic +optimization](https://github.com/google/jax/tree/master/jax/experimental/README.md#first-order-optimization), +or the [examples](https://github.com/google/jax/tree/master/examples). + ## Transformations At its core, JAX is an extensible system for transforming numerical functions. diff --git a/jax/experimental/README.md b/jax/experimental/README.md new file mode 100644 index 000000000000..20844f37e156 --- /dev/null +++ b/jax/experimental/README.md @@ -0,0 +1,88 @@ +## Mini-libraries + +JAX provides some small, experimental libraries for machine learning. These +libraries are in part about providing tools and in part about serving as +examples for how to build such libraries using JAX. Each one is only a few +hundred lines of code, so take a look inside and adapt them as you need! + +### Neural-net building with Stax + +**Stax** is a functional neural network building library. The basic idea is that +a single layer or an entire network can be modeled as an `(init_fun, apply_fun)` +pair. The `init_fun` is used to initialize network parameters and the +`apply_fun` takes parameters and inputs to produce outputs. There are +constructor functions for common basic pairs, like `Conv` and `Relu`, and these +pairs can be composed in series using `stax.serial` or in parallel using +`stax.parallel`. + +Here’s an example: + +```python +import jax.numpy as np +from jax import random +from jax.experimental import stax +from jax.experimental.stax import Conv, Dense, MaxPool, Relu, Flatten, LogSoftmax + +# Use stax to set up network initialization and evaluation functions +net_init, net_apply = stax.serial( + Conv(32, (3, 3), padding='SAME'), Relu, + Conv(64, (3, 3), padding='SAME'), Relu, + MaxPool((2, 2)), Flatten, + Dense(128), Relu, + Dense(10), LogSoftmax, +) + +# Initialize parameters, not committing to a batch shape +rng = random.PRNGKey(0) +in_shape = (-1, 28, 28, 1) +out_shape, net_params = net_init(rng, in_shape) + +# Apply network to dummy inputs +inputs = np.zeros((128, 28, 28, 1)) +predictions = net_apply(net_params, inputs) +``` + +### First-order optimization + +JAX has a minimal optimization library focused on stochastic first-order +optimizers. Every optimizer is modeled as an `(init_fun, update_fun, +get_params)` triple of functions. The `init_fun` is used to initialize the +optimizer state, which could include things like momentum variables, and the +`update_fun` accepts a gradient and an optimizer state to produce a new +optimizer state. The `get_params` function extracts the current iterate (i.e. +the current parameters) from the optimizer state. The parameters being optimized +can be ndarrays or arbitrarily-nested list/tuple/dict structures, so you can +store your parameters however you’d like. + +Here’s an example, using `jit` to compile the whole update end-to-end: + +```python +from jax.experimental import optimizers +from jax import jit, grad + +# Define a simple squared-error loss +def loss(params, batch): + inputs, targets = batch + predictions = net_apply(params, inputs) + return np.sum((predictions - targets)**2) + +# Use optimizers to set optimizer initialization and update functions +opt_init, opt_update, get_params = optimizers.momentum(step_size=1e-3, mass=0.9) + +# Define a compiled update step +@jit +def step(i, opt_state, batch): + params = get_params(opt_state) + g = grad(loss)(params, batch) + return opt_update(i, g, opt_state) + +# Dummy input data stream +data_generator = ((np.zeros((128, 28, 28, 1)), np.zeros((128, 10))) + for _ in range(10)) + +# Optimize parameters in a loop +opt_state = opt_init(net_params) +for i in range(10): + opt_state = step(i, opt_state, next(data_generator)) +net_params = get_params(opt_state) +``` From cfc854c6b3a19ed50556078dc5a45714a72fa6fe Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 13 Jan 2020 14:12:37 -0800 Subject: [PATCH 0606/1053] Fix PmapTest.testPShuffleWithBadPerm regexp. --- tests/pmap_test.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index ba2e5c6c2828..0940a4a16cba 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -372,9 +372,8 @@ def testPShuffleWithBadPerm(self): f = lambda x: lax.pshuffle(x, perm=bad_perm, axis_name='i') g = lambda: pmap(f, "i")(onp.arange(device_count)) self.assertRaisesRegex( - AssertionError, - "Given `perm` does not represent a real permutation: {}".format(bad_perm), - g) + AssertionError, + "Given `perm` does not represent a real permutation: \[1.*\]", g) @jtu.skip_on_devices("cpu", "gpu") def testPpermuteWithZipObject(self): From 9919fe5e7de4887aec0481766a07d09ca0ccfdf8 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 13 Jan 2020 14:55:29 -0800 Subject: [PATCH 0607/1053] Fix PmapTest.testCollectivePermuteCyclicWithPShuffle. --- tests/pmap_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 0940a4a16cba..2248583eb03f 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -360,7 +360,7 @@ def testCollectivePermuteCyclicWithPShuffle(self): values = onp.arange(device_count) shift_right = [(i - 1) % device_count for i in range(device_count)] f = lambda x: lax.pshuffle(x, perm=shift_right, axis_name='i') - expected = onp.transpose(values, shift_right) + expected = onp.roll(values, -1) ans = onp.asarray(pmap(f, "i")(values)) self.assertAllClose(ans, expected, check_dtypes=False) From a5b6e8abf3a6c4f172b7b8b339d6ef64dd8d73dc Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 13 Jan 2020 14:59:00 -0800 Subject: [PATCH 0608/1053] Real valued FFTs (#1657) * WIP: real valued fft functions Note: The transpose rule is not correct yet (hence the failing tests). * Fix transpose rules for rfft and irfft * Typo fix * fix test failures in x64 mode * Add 1d/2d real fft functions, plus docs --- docs/jax.numpy.rst | 10 ++- jax/lax/lax_fft.py | 99 ++++++++++++++++++---- jax/numpy/fft.py | 183 ++++++++++++++++++++-------------------- tests/fft_test.py | 202 ++++++++++++++++++++++++++++----------------- 4 files changed, 314 insertions(+), 180 deletions(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index 6df68e252d34..f94c0bd8f74f 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -256,12 +256,18 @@ jax.numpy.fft .. autosummary:: :toctree: _autosummary - fftn - ifftn fft ifft fft2 ifft2 + fftn + ifftn + rfft + irfft + rfft2 + irfft2 + rfftn + irfftn fftfreq rfftfreq diff --git a/jax/lax/lax_fft.py b/jax/lax/lax_fft.py index bfe7658e72d6..35fa459763c3 100644 --- a/jax/lax/lax_fft.py +++ b/jax/lax/lax_fft.py @@ -16,42 +16,113 @@ from __future__ import division from __future__ import print_function +from functools import partial + import numpy as onp from jax.abstract_arrays import ShapedArray +from jax.api import jit, vjp from jax.core import Primitive from jax.interpreters import xla -from .. import dtypes +from jax.util import prod +from . import dtypes, lax +from ..lib.xla_bridge import xla_client from ..interpreters import ad from ..interpreters import batching -def fft(x, fft_type, fft_lengths=None): - if fft_lengths is None: - fft_lengths = x.shape - elif len(fft_lengths) == 0: +def _promote_to_complex(arg): + dtype = onp.result_type(arg, onp.complex64) + # XLA's FFT op only supports C64. + if dtype == onp.complex128: + dtype = onp.complex64 + return lax.convert_element_type(arg, dtype) + +def _promote_to_real(arg): + dtype = onp.result_type(arg, onp.float64) + # XLA's FFT op only supports F32. + if dtype == onp.float64: + dtype = onp.float32 + return lax.convert_element_type(arg, dtype) + +def fft(x, fft_type, fft_lengths): + if fft_type == xla_client.FftType.RFFT: + if onp.iscomplexobj(x): + raise ValueError("only real valued inputs supported for rfft") + x = _promote_to_real(x) + else: + x = _promote_to_complex(x) + if len(fft_lengths) == 0: # XLA FFT doesn't support 0-rank. return x - else: - fft_lengths = tuple(fft_lengths) + fft_lengths = tuple(fft_lengths) return fft_p.bind(x, fft_type=fft_type, fft_lengths=fft_lengths) def fft_impl(x, fft_type, fft_lengths): return xla.apply_primitive(fft_p, x, fft_type=fft_type, fft_lengths=fft_lengths) +_complex_dtype = lambda dtype: (onp.zeros((), dtype) + onp.zeros((), onp.complex64)).dtype +_real_dtype = lambda dtype: onp.zeros((), dtype).real.dtype +_is_even = lambda x: x % 2 == 0 + def fft_abstract_eval(x, fft_type, fft_lengths): - if not dtypes.issubdtype(x.dtype, onp.complexfloating): - raise TypeError("FFT requires complex inputs, got {}.".format(x.dtype.name)) - if x.dtype != onp.complex64: - msg = "FFT is only implemented for complex64 types, got {}." - raise NotImplementedError(msg.format(x.dtype.name)) - return ShapedArray(x.shape, x.dtype) + if fft_type == xla_client.FftType.RFFT: + shape = (x.shape[:-len(fft_lengths)] + fft_lengths[:-1] + + (fft_lengths[-1] // 2 + 1,)) + dtype = _complex_dtype(x.dtype) + elif fft_type == xla_client.FftType.IRFFT: + shape = x.shape[:-len(fft_lengths)] + fft_lengths + dtype = _real_dtype(x.dtype) + else: + shape = x.shape + dtype = x.dtype + return ShapedArray(shape, dtype) def fft_translation_rule(c, x, fft_type, fft_lengths): return c.Fft(x, fft_type, fft_lengths) +def _naive_rfft(x, fft_lengths): + y = fft(x, xla_client.FftType.FFT, fft_lengths) + n = fft_lengths[-1] + return y[..., : n//2 + 1] + +@partial(jit, static_argnums=1) +def _rfft_transpose(t, fft_lengths): + # The transpose of RFFT can't be expressed only in terms of irfft. Instead of + # manually building up larger twiddle matrices (which would increase the + # asymptotic complexity and is also rather complicated), we rely JAX to + # transpose a naive RFFT implementation. + dummy_shape = t.shape[:-len(fft_lengths)] + fft_lengths + dummy_primals = lax.full_like(t, 0.0, onp.float64, dummy_shape) + _, jvpfun = vjp(partial(_naive_rfft, fft_lengths=fft_lengths), dummy_primals) + result, = jvpfun(t) + return result + +def _irfft_transpose(t, fft_lengths): + # The transpose of IRFFT is the RFFT of the cotangent times a scaling + # factor and a mask. The mask scales the cotangent for the Hermitian + # symmetric components of the RFFT by a factor of two, since these components + # are de-duplicated in the RFFT. + x = fft(t, xla_client.FftType.RFFT, fft_lengths) + n = x.shape[-1] + is_odd = fft_lengths[-1] % 2 + full = partial(lax.full_like, t, dtype=onp.float64) + mask = lax.concatenate( + [full(1.0, shape=(1,)), + full(2.0, shape=(n - 2 + is_odd,)), + full(1.0, shape=(1 - is_odd,))], + dimension=0) + scale = 1 / prod(fft_lengths) + return scale * mask * x + def fft_transpose_rule(t, fft_type, fft_lengths): - return fft(t, fft_type, fft_lengths), + if fft_type == xla_client.FftType.RFFT: + result = _rfft_transpose(t, fft_lengths) + elif fft_type == xla_client.FftType.IRFFT: + result = _irfft_transpose(t, fft_lengths) + else: + result = fft(t, fft_type, fft_lengths) + return result, def fft_batching_rule(batched_args, batch_dims, fft_type, fft_lengths): x, = batched_args diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index ba8ab0fcf813..71be3d9ce4ce 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -27,14 +27,6 @@ from .. import ops as jaxops -def _promote_to_complex(arg): - dtype = np.result_type(arg, onp.complex64) - # XLA's FFT op only supports C64. - if dtype == onp.complex128: - dtype = onp.complex64 - return lax.convert_element_type(arg, dtype) - - def _fft_core(func_name, fft_type, a, s, axes, norm): # TODO(skye): implement padding/cropping based on 's'. full_name = "jax.np.fft." + func_name @@ -53,10 +45,6 @@ def _fft_core(func_name, fft_type, a, s, axes, norm): else: axes = range(a.ndim - len(s), a.ndim) - # XLA doesn't support 0-rank axes. - if len(axes) == 0: - return a - if len(axes) != len(set(axes)): raise ValueError( "%s does not support repeated axes. Got axes %s." % (full_name, axes)) @@ -73,9 +61,13 @@ def _fft_core(func_name, fft_type, a, s, axes, norm): a = np.moveaxis(a, orig_axes, axes) if s is None: - s = [a.shape[axis] for axis in axes] + if fft_type == xla_client.FftType.IRFFT: + s = [a.shape[axis] for axis in axes[:-1]] + if axes: + s += [max(0, 2 * (a.shape[axes[-1]] - 1))] + else: + s = [a.shape[axis] for axis in axes] - a = _promote_to_complex(a) transformed = lax.fft(a, fft_type, s) if orig_axes is not None: @@ -83,6 +75,89 @@ def _fft_core(func_name, fft_type, a, s, axes, norm): return transformed +@_wraps(onp.fft.fftn) +def fftn(a, s=None, axes=None, norm=None): + return _fft_core('fftn', xla_client.FftType.FFT, a, s, axes, norm) + + +@_wraps(onp.fft.ifftn) +def ifftn(a, s=None, axes=None, norm=None): + return _fft_core('ifftn', xla_client.FftType.IFFT, a, s, axes, norm) + + +@_wraps(onp.fft.rfftn) +def rfftn(a, s=None, axes=None, norm=None): + return _fft_core('rfftn', xla_client.FftType.RFFT, a, s, axes, norm) + + +@_wraps(onp.fft.irfftn) +def irfftn(a, s=None, axes=None, norm=None): + return _fft_core('irfftn', xla_client.FftType.IRFFT, a, s, axes, norm) + + +def _fft_core_1d(func_name, fft_type, a, s, axis, norm): + full_name = "jax.np.fft." + func_name + if isinstance(axis, (list, tuple)): + raise ValueError( + "%s does not support multiple axes. Please use %sn. " + "Got axis = %r." % (full_name, full_name, axis) + ) + axes = None if axis is None else [axis] + return _fft_core(func_name, fft_type, a, s, axes, norm) + + +@_wraps(onp.fft.fft) +def fft(a, n=None, axis=-1, norm=None): + return _fft_core_1d('fft', xla_client.FftType.FFT, a, s=n, axis=axis, + norm=norm) + +@_wraps(onp.fft.ifft) +def ifft(a, n=None, axis=-1, norm=None): + return _fft_core_1d('ifft', xla_client.FftType.IFFT, a, s=n, axis=axis, + norm=norm) + +@_wraps(onp.fft.rfft) +def rfft(a, n=None, axis=-1, norm=None): + return _fft_core_1d('rfft', xla_client.FftType.RFFT, a, s=n, axis=axis, + norm=norm) + +@_wraps(onp.fft.irfft) +def irfft(a, n=None, axis=-1, norm=None): + return _fft_core_1d('irfft', xla_client.FftType.IRFFT, a, s=n, axis=axis, + norm=norm) + + +def _fft_core_2d(func_name, fft_type, a, s, axes, norm): + full_name = "jax.np.fft." + func_name + if len(axes) != 2: + raise ValueError( + "%s only supports 2 axes. Got axes = %r." + % (full_name, axes) + ) + return _fft_core(func_name, fft_type, a, s, axes, norm) + + +@_wraps(onp.fft.fft2) +def fft2(a, s=None, axes=(-2,-1), norm=None): + return _fft_core_2d('fft2', xla_client.FftType.FFT, a, s=s, axes=axes, + norm=norm) + +@_wraps(onp.fft.ifft2) +def ifft2(a, s=None, axes=(-2,-1), norm=None): + return _fft_core_2d('ifft2', xla_client.FftType.IFFT, a, s=s, axes=axes, + norm=norm) + +@_wraps(onp.fft.rfft2) +def rfft2(a, s=None, axes=(-2,-1), norm=None): + return _fft_core_2d('rfft2', xla_client.FftType.RFFT, a, s=s, axes=axes, + norm=norm) + +@_wraps(onp.fft.irfft2) +def irfft2(a, s=None, axes=(-2,-1), norm=None): + return _fft_core_2d('irfft2', xla_client.FftType.IRFFT, a, s=s, axes=axes, + norm=norm) + + @_wraps(onp.fft.fftfreq) def fftfreq(n, d=1.0): if isinstance(n, list) or isinstance(n, tuple): @@ -98,25 +173,19 @@ def fftfreq(n, d=1.0): k = np.zeros(n) if n % 2 == 0: # k[0: n // 2 - 1] = np.arange(0, n // 2 - 1) - k = jaxops.index_update(k, - jaxops.index[0: n // 2], - np.arange(0, n // 2)) + k = jaxops.index_update(k, jaxops.index[0: n // 2], np.arange(0, n // 2)) # k[n // 2:] = np.arange(-n // 2, -1) - k = jaxops.index_update(k, - jaxops.index[n // 2:], - np.arange(-n // 2, 0)) + k = jaxops.index_update(k, jaxops.index[n // 2:], np.arange(-n // 2, 0)) else: # k[0: (n - 1) // 2] = np.arange(0, (n - 1) // 2) - k = jaxops.index_update(k, - jaxops.index[0: (n - 1) // 2 + 1], - np.arange(0, (n - 1) // 2 + 1)) + k = jaxops.index_update(k, jaxops.index[0: (n - 1) // 2 + 1], + np.arange(0, (n - 1) // 2 + 1)) # k[(n - 1) // 2 + 1:] = np.arange(-(n - 1) // 2, -1) - k = jaxops.index_update(k, - jaxops.index[(n - 1) // 2 + 1:], - np.arange(-(n - 1) // 2, 0)) + k = jaxops.index_update(k, jaxops.index[(n - 1) // 2 + 1:], + np.arange(-(n - 1) // 2, 0)) return k / (d * n) @@ -142,68 +211,6 @@ def rfftfreq(n, d=1.0): return k / (d * n) -@_wraps(onp.fft.fftn) -def fftn(a, s=None, axes=None, norm=None): - return _fft_core('fftn', xla_client.FftType.FFT, a, s, axes, norm) - - -@_wraps(onp.fft.ifftn) -def ifftn(a, s=None, axes=None, norm=None): - return _fft_core('ifftn', xla_client.FftType.IFFT, a, s, axes, norm) - - -@_wraps(onp.fft.fft) -def fft(a, n=None, axis=-1, norm=None): - if isinstance(axis,list) or isinstance(axis,tuple): - raise ValueError( - "jax.np.fft.fft does not support multiple axes. " - "Please use jax.np.fft.fftn. " - "Got axis %s." % (list(axis)) - ) - - if not axis is None: - axis = [axis] - - return _fft_core('fft', xla_client.FftType.FFT, a, s=n, axes=axis, norm=norm) - - -@_wraps(onp.fft.ifft) -def ifft(a, n=None, axis=-1, norm=None): - if isinstance(axis,list) or isinstance(axis,tuple): - raise ValueError( - "jax.np.fft.ifft does not support multiple axes. " - "Please use jax.np.fft.ifftn. " - "Got axis %s." % (list(axis)) - ) - - if not axis is None: - axis = [axis] - - return _fft_core('ifft', xla_client.FftType.IFFT, a, s=n, axes=axis, norm=norm) - - -@_wraps(onp.fft.fft2) -def fft2(a, s=None, axes=(-2,-1), norm=None): - if len(axes) != 2: - raise ValueError( - "jax.np.fft.fft2 only supports 2 axes. " - "Got axes = %s." % (list(axes)) - ) - - return _fft_core('fft', xla_client.FftType.FFT, a, s=s, axes=axes, norm=norm) - - -@_wraps(onp.fft.ifft2) -def ifft2(a, s=None, axes=(-2,-1), norm=None): - if len(axes) != 2: - raise ValueError( - "jax.np.fft.ifft2 only supports 2 axes. " - "Got axes = %s." % (list(axes)) - ) - - return _fft_core('ifft', xla_client.FftType.IFFT, a, s=s, axes=axes, norm=norm) - - for func in get_module_functions(onp.fft): if func.__name__ not in globals(): globals()[func.__name__] = _not_implemented(func) diff --git a/tests/fft_test.py b/tests/fft_test.py index 5f95cddd401a..ccc129b8bee2 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -24,6 +24,7 @@ from absl.testing import absltest from absl.testing import parameterized +from jax import lax from jax import numpy as np from jax import test_util as jtu @@ -38,7 +39,8 @@ inexact_dtypes = float_dtypes + complex_dtypes int_dtypes = [onp.int32, onp.int64] bool_dtypes = [onp.bool_] -all_dtypes = float_dtypes + complex_dtypes + int_dtypes + bool_dtypes +real_dtypes = float_dtypes + int_dtypes + bool_dtypes +all_dtypes = real_dtypes + complex_dtypes def _get_fftn_test_axes(shape): @@ -54,43 +56,83 @@ def _get_fftn_test_axes(shape): return axes +def _get_fftn_func(module, inverse, real): + if inverse: + return _irfft_with_zeroed_inputs(module.irfftn) if real else module.ifftn + else: + return module.rfftn if real else module.fftn + + +def _irfft_with_zeroed_inputs(irfft_fun): + # irfft isn't defined on the full domain of inputs, so in order to have a + # well defined derivative on the whole domain of the function, we zero-out + # the imaginary part of the first and possibly the last elements. + def wrapper(z, axes): + return irfft_fun(_zero_for_irfft(z, axes), axes=axes) + return wrapper + + +def _zero_for_irfft(z, axes): + if axes is not None and not axes: + return z + axis = z.ndim - 1 if axes is None else axes[-1] + try: + size = z.shape[axis] + except IndexError: + return z # only if axis is invalid, as occurs in some tests + if size % 2: + parts = [lax.slice_in_dim(z.real, 0, 1, axis=axis).real, + lax.slice_in_dim(z.real, 1, size - 1, axis=axis), + lax.slice_in_dim(z.real, size - 1, size, axis=axis).real] + else: + parts = [lax.slice_in_dim(z.real, 0, 1, axis=axis).real, + lax.slice_in_dim(z.real, 1, size, axis=axis)] + return np.concatenate(parts, axis=axis) + + class FftTest(jtu.JaxTestCase): @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_inverse={}_shape={}_axes={}".format( - inverse, jtu.format_shape_dtype_string(shape, dtype), axes), - "axes": axes, "shape": shape, "dtype": dtype, "rng_factory": rng_factory, - "inverse": inverse} + {"testcase_name": "_inverse={}_real={}_shape={}_axes={}".format( + inverse, real, jtu.format_shape_dtype_string(shape, dtype), axes), + "axes": axes, "shape": shape, "dtype": dtype, + "rng_factory": rng_factory, "inverse": inverse, "real": real} for inverse in [False, True] + for real in [False, True] for rng_factory in [jtu.rand_default] - for dtype in all_dtypes - for shape in [(10,), (10, 10), (2, 3, 4), (2, 3, 4, 5)] + for dtype in (real_dtypes if real and not inverse else all_dtypes) + for shape in [(10,), (10, 10), (9,), (2, 3, 4), (2, 3, 4, 5)] for axes in _get_fftn_test_axes(shape))) - def testFftn(self, inverse, shape, dtype, axes, rng_factory): + def testFftn(self, inverse, real, shape, dtype, axes, rng_factory): rng = rng_factory() args_maker = lambda: (rng(shape, dtype),) - np_op = np.fft.ifftn if inverse else np.fft.fftn - onp_op = onp.fft.ifftn if inverse else onp.fft.fftn + np_op = _get_fftn_func(np.fft, inverse, real) + onp_op = _get_fftn_func(onp.fft, inverse, real) np_fn = lambda a: np_op(a, axes=axes) - onp_fn = lambda a: onp_op(a, axes=axes) - # Numpy promotes to complex128 aggressively. + onp_fn = lambda a: onp_op(a, axes=axes) if axes is None or axes else a + # Numpy promotes to complex128 aggressively. self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) # Test gradient for differentiable types. - if dtype in inexact_dtypes: - tol = 0.15 # TODO(skye): can we be more precise? - jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) + if dtype in (float_dtypes if real and not inverse else inexact_dtypes): + # TODO(skye): can we be more precise? + tol = 0.15 jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_inverse={}".format(inverse), - "inverse": inverse} - for inverse in [False, True])) - def testFftnErrors(self, inverse): + {"testcase_name": "_inverse={}_real={}".format(inverse, real), + "inverse": inverse, "real": real} + for inverse in [False, True] + for real in [False, True])) + def testFftnErrors(self, inverse, real): rng = jtu.rand_default() - name = 'ifftn' if inverse else 'fftn' - func = np.fft.ifftn if inverse else np.fft.fftn + name = 'fftn' + if real: + name = 'r' + name + if inverse: + name = 'i' + name + func = _get_fftn_func(np.fft, inverse, real) self.assertRaisesRegex( ValueError, "jax.np.fft.{} only supports 1D, 2D, and 3D FFTs. " @@ -106,53 +148,59 @@ def testFftnErrors(self, inverse): ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axes=[-3])) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_inverse={}_size={}_axis={}".format( - inverse, jtu.format_shape_dtype_string([size], dtype), axis), - "axis": axis, "size": size, "dtype": dtype, "rng_factory": rng_factory, - "inverse": inverse} + {"testcase_name": "_inverse={}_real={}_shape={}_axis={}".format( + inverse, real, jtu.format_shape_dtype_string(shape, dtype), axis), + "axis": axis, "shape": shape, "dtype": dtype, + "rng_factory": rng_factory, "inverse": inverse, "real": real} for inverse in [False, True] + for real in [False, True] for rng_factory in [jtu.rand_default] - for dtype in all_dtypes - for size in [10] + for dtype in (real_dtypes if real and not inverse else all_dtypes) + for shape in [(10,)] for axis in [-1, 0])) - def testFft(self, inverse, size, dtype, axis, rng_factory): + def testFft(self, inverse, real, shape, dtype, axis, rng_factory): rng = rng_factory() - args_maker = lambda: (rng([size], dtype),) - np_op = np.fft.ifft if inverse else np.fft.fft - onp_op = onp.fft.ifft if inverse else onp.fft.fft + args_maker = lambda: (rng(shape, dtype),) + name = 'fft' + if real: + name = 'r' + name + if inverse: + name = 'i' + name + np_op = getattr(np.fft, name) + onp_op = getattr(onp.fft, name) np_fn = lambda a: np_op(a, axis=axis) onp_fn = lambda a: onp_op(a, axis=axis) # Numpy promotes to complex128 aggressively. - self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, + self._CheckAgainstNumpy(onp_op, np_op, args_maker, check_dtypes=False, tol=1e-4) - self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) - # Test gradient for differentiable types. - if dtype in inexact_dtypes: - tol = 0.15 # TODO(skye): can we be more precise? - jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) - jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) + self._CompileAndCheck(np_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_inverse={}".format(inverse), - "inverse": inverse} - for inverse in [False, True])) - def testFftErrors(self, inverse): + {"testcase_name": "_inverse={}_real={}".format(inverse, real), + "inverse": inverse, "real": real} + for inverse in [False, True] + for real in [False, True])) + def testFftErrors(self, inverse, real): rng = jtu.rand_default() - name = 'ifft' if inverse else 'fft' - func = np.fft.ifft if inverse else np.fft.fft + name = 'fft' + if real: + name = 'r' + name + if inverse: + name = 'i' + name + func = getattr(np.fft, name) self.assertRaisesRegex( ValueError, "jax.np.fft.{} does not support multiple axes. " "Please use jax.np.fft.{}n. " - "Got axis \\[1, 1\\].".format(name, name), + "Got axis = \\[1, 1\\].".format(name, name), lambda: func(rng([2, 3], dtype=onp.float64), axis=[1, 1]) ) self.assertRaisesRegex( ValueError, "jax.np.fft.{} does not support multiple axes. " "Please use jax.np.fft.{}n. " - "Got axis \\[1, 1\\].".format(name, name), + "Got axis = \\(1, 1\\).".format(name, name), lambda: func(rng([2, 3], dtype=onp.float64), axis=(1, 1)) ) self.assertRaises( @@ -161,40 +209,44 @@ def testFftErrors(self, inverse): ValueError, lambda: func(rng([2, 3], dtype=onp.float64), axis=[-3])) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_inverse={}_shape={}_axis={}".format( - inverse, jtu.format_shape_dtype_string(shape, dtype), axes), - "axes": axes, "shape": shape, "dtype": dtype, "rng_factory": rng_factory, - "inverse": inverse} - for inverse in [False, True] - for rng_factory in [jtu.rand_default] - for dtype in all_dtypes - for shape in [(16, 8, 4, 8), (16, 8, 4, 8, 4)] - for axes in [(-2, -1), (0, 1), (1, 3), (-1, 2)])) - def testFft2(self, inverse, shape, dtype, axes, rng_factory): + {"testcase_name": "_inverse={}_real={}_shape={}_axes={}".format( + inverse, real, jtu.format_shape_dtype_string(shape, dtype), axes), + "axes": axes, "shape": shape, "dtype": dtype, + "rng_factory": rng_factory, "inverse": inverse, "real": real} + for inverse in [False, True] + for real in [False, True] + for rng_factory in [jtu.rand_default] + for dtype in (real_dtypes if real and not inverse else all_dtypes) + for shape in [(16, 8, 4, 8), (16, 8, 4, 8, 4)] + for axes in [(-2, -1), (0, 1), (1, 3), (-1, 2)])) + def testFft2(self, inverse, real, shape, dtype, axes, rng_factory): rng = rng_factory() args_maker = lambda: (rng(shape, dtype),) - np_op = np.fft.ifft2 if inverse else np.fft.fft2 - onp_op = onp.fft.ifft2 if inverse else onp.fft.fft2 - np_fn = lambda a: np_op(a, axes=axes) - onp_fn = lambda a: onp_op(a, axes=axes) + name = 'fft2' + if real: + name = 'r' + name + if inverse: + name = 'i' + name + np_op = getattr(np.fft, name) + onp_op = getattr(onp.fft, name) # Numpy promotes to complex128 aggressively. - self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, + self._CheckAgainstNumpy(onp_op, np_op, args_maker, check_dtypes=False, tol=1e-4) - self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) - # Test gradient for differentiable types. - if dtype in inexact_dtypes: - tol = 0.15 # TODO(skye): can we be more precise? - jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) - jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) + self._CompileAndCheck(np_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( - {"testcase_name": "_inverse={}".format(inverse), - "inverse": inverse} - for inverse in [False, True])) - def testFft2Errors(self, inverse): + {"testcase_name": "_inverse={}_real={}".format(inverse, real), + "inverse": inverse, "real": real} + for inverse in [False, True] + for real in [False, True])) + def testFft2Errors(self, inverse, real): rng = jtu.rand_default() - name = 'ifft2' if inverse else 'fft2' - func = np.fft.ifft2 if inverse else np.fft.fft2 + name = 'fft2' + if real: + name = 'r' + name + if inverse: + name = 'i' + name + func = getattr(np.fft, name) self.assertRaisesRegex( ValueError, @@ -205,7 +257,7 @@ def testFft2Errors(self, inverse): self.assertRaisesRegex( ValueError, "jax.np.fft.{} only supports 2 axes. " - "Got axes = \\[0, 1, 2\\].".format(name, name), + "Got axes = \\(0, 1, 2\\).".format(name, name), lambda: func(rng([2, 3, 3], dtype=onp.float64), axes=(0, 1, 2)) ) self.assertRaises( @@ -235,7 +287,6 @@ def testFftfreq(self, size, d, dtype, rng_factory): # Test gradient for differentiable types. if dtype in inexact_dtypes: tol = 0.15 # TODO(skye): can we be more precise? - jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( @@ -280,7 +331,6 @@ def testRfftfreq(self, size, d, dtype, rng_factory): # Test gradient for differentiable types. if dtype in inexact_dtypes: tol = 0.15 # TODO(skye): can we be more precise? - jtu.check_grads(np_fn, args_maker(), order=1, atol=tol, rtol=tol) jtu.check_grads(np_fn, args_maker(), order=2, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( From 681ba37f7e203d8c61af8040c270d30cf3f4a185 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 14 Jan 2020 10:08:23 -0500 Subject: [PATCH 0609/1053] Drop fastcache dependency, which isn't necessary on Python 3. (#1995) Drop protobuf and six dependencies from travis configuration. --- .travis.yml | 2 +- jax/util.py | 5 ++--- setup.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 47de338fb489..76f89d3eedac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ before_install: - conda config --add channels conda-forge - conda update -q conda install: - - conda install --yes python=$TRAVIS_PYTHON_VERSION pip six protobuf>=3.6.0 absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark fastcache + - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. diff --git a/jax/util.py b/jax/util.py index 0ad1e63d0ca6..e3dbd76f4f6a 100644 --- a/jax/util.py +++ b/jax/util.py @@ -21,7 +21,6 @@ import itertools as it import types -import fastcache import numpy as onp @@ -177,9 +176,9 @@ def merge(new_lhs, new_rhs): return lhs, rhs, merge def cache(max_size=4096): - return fastcache.clru_cache(maxsize=max_size) + return functools.lru_cache(maxsize=max_size) -memoize = fastcache.clru_cache(maxsize=None) +memoize = functools.lru_cache(maxsize=None) def prod(xs): out = 1 diff --git a/setup.py b/setup.py index 5b5f4485fd49..e83d99dba1ec 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ packages=find_packages(exclude=["examples"]), python_requires='>=3.5', install_requires=[ - 'numpy>=1.12', 'absl-py', 'opt_einsum', 'fastcache' + 'numpy>=1.12', 'absl-py', 'opt_einsum' ], url='https://github.com/google/jax', license='Apache-2.0', From 64bf55dc6fb76e68c92bea52b0ff1dc6f9fa0894 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 14 Jan 2020 11:05:54 -0500 Subject: [PATCH 0610/1053] Update XLA. (#1997) Drop six dependency from jaxlib, since xla_client.py no longer uses six. --- WORKSPACE | 6 +++--- build/setup.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e0a3256a7e6..3ba69a2698cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -23,10 +23,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "d01c8cafd20c842b7e1af0eb15c45699c12aceb159e002a5cab56af187906d58", - strip_prefix = "tensorflow-84add98ff286a5b805d6b45d016f484b7c4f42ba", + sha256 = "516d4568ee2506f0df2b66d672124232a08fede139643d974d269676c16f5f3d", + strip_prefix = "tensorflow-d2318f541e51ac3afe573c5e7d91b93f8570d63d", urls = [ - "https://github.com/tensorflow/tensorflow/archive/84add98ff286a5b805d6b45d016f484b7c4f42ba.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/d2318f541e51ac3afe573c5e7d91b93f8570d63d.tar.gz", ], ) diff --git a/build/setup.py b/build/setup.py index cb4c37ad311b..06194b24a033 100644 --- a/build/setup.py +++ b/build/setup.py @@ -32,7 +32,7 @@ author_email='jax-dev@google.com', packages=['jaxlib'], python_requires='>=3.5', - install_requires=['scipy', 'numpy>=1.12', 'six', 'absl-py'], + install_requires=['scipy', 'numpy>=1.12', 'absl-py'], url='https://github.com/google/jax', license='Apache-2.0', package_data={'jaxlib': binary_libs}, From dcda87d0e7f79ada2ca72e4054b92c799971c543 Mon Sep 17 00:00:00 2001 From: AmKhan Date: Tue, 14 Jan 2020 16:18:47 +0000 Subject: [PATCH 0611/1053] added batching to LAPACK triangular_solve (#1985) * Added batching to cpu triangular_solver * addressed comments about int overflows and returned triangular solve to use XLA over LAPACK * add todo to benchmark LAPACK vs XLA --- jax/lax_linalg.py | 6 +-- jaxlib/lapack.pyx | 98 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 2047236d6ba2..1fc43de8c06e 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -404,6 +404,7 @@ def _triangular_solve_cpu_translation_rule( c, a, b, left_side, lower, transpose_a, conjugate_a, unit_diagonal): shape = c.GetShape(a) dtype = shape.element_type().type + if len(shape.dimensions()) == 2 and onp.dtype(dtype) in _cpu_lapack_types: if conjugate_a and not transpose_a: a = c.Conj(a) @@ -412,9 +413,8 @@ def _triangular_solve_cpu_translation_rule( c, c.Constant(onp.array(1, dtype=dtype)), a, b, left_side, lower, transpose_a, conjugate_a, unit_diagonal) else: - # Fall back to the HLO implementation for batched triangular_solve or - # unsupported types. - # TODO(phawkins): support BLAS primitives in batched mode. + # Fall back to the HLO implementation for unsupported types or batching. + # TODO: Consider swapping XLA for LAPACK in batched case return c.TriangularSolve(a, b, left_side, lower, transpose_a, conjugate_a, unit_diagonal) diff --git a/jaxlib/lapack.pyx b/jaxlib/lapack.pyx index b88f040b9b1e..bc54d93c851c 100644 --- a/jaxlib/lapack.pyx +++ b/jaxlib/lapack.pyx @@ -59,13 +59,14 @@ cdef void blas_strsm(void* out, void** data) nogil: cdef int32_t diag = ((data[3]))[0] cdef int m = ((data[4]))[0] cdef int n = ((data[5]))[0] - cdef float* alpha = (data[6]) - cdef float* a = (data[7]) - cdef float* b = (data[8]) + cdef int batch = ((data[6]))[0] + cdef float* alpha = (data[7]) + cdef float* a = (data[8]) + cdef float* b = (data[9]) cdef float* x = (out) if x != b: - memcpy(x, b, (m) * (n) * sizeof(float)) + memcpy(x, b, (batch) * (m) * (n) * sizeof(float)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -77,7 +78,14 @@ cdef void blas_strsm(void* out, void** data) nogil: cdef char cdiag = 'U' if diag else 'N' cdef int lda = m if left_side else n cdef int ldb = m - strsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + + cdef int64_t x_plus = (m) * (n) + cdef int64_t a_plus = (lda) * (lda) + + for _ in range(batch): + strsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + x += x_plus + a += a_plus register_cpu_custom_call_target(b"blas_strsm", (blas_strsm)) @@ -88,13 +96,14 @@ cdef void blas_dtrsm(void* out, void** data) nogil: cdef int32_t diag = ((data[3]))[0] cdef int m = ((data[4]))[0] cdef int n = ((data[5]))[0] - cdef double* alpha = (data[6]) - cdef double* a = (data[7]) - cdef double* b = (data[8]) + cdef int batch = ((data[6]))[0] + cdef double* alpha = (data[7]) + cdef double* a = (data[8]) + cdef double* b = (data[9]) cdef double* x = (out) if x != b: - memcpy(x, b, (m) * (n) * sizeof(double)) + memcpy(x, b, (batch) * (m) * (n) * sizeof(double)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -106,7 +115,15 @@ cdef void blas_dtrsm(void* out, void** data) nogil: cdef char cdiag = 'U' if diag else 'N' cdef int lda = m if left_side else n cdef int ldb = m - dtrsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + + cdef int64_t x_plus = (m) * (n) + cdef int64_t a_plus = (lda) * (lda) + + for _ in range(batch): + dtrsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + x += x_plus + a += a_plus + register_cpu_custom_call_target(b"blas_dtrsm", (blas_dtrsm)) @@ -118,13 +135,14 @@ cdef void blas_ctrsm(void* out, void** data) nogil: cdef int32_t diag = ((data[3]))[0] cdef int m = ((data[4]))[0] cdef int n = ((data[5]))[0] - cdef float complex* alpha = (data[6]) - cdef float complex* a = (data[7]) - cdef float complex* b = (data[8]) + cdef int batch = ((data[6]))[0] + cdef float complex* alpha = (data[7]) + cdef float complex* a = (data[8]) + cdef float complex* b = (data[9]) cdef float complex* x = (out) if x != b: - memcpy(x, b, (m) * (n) * sizeof(float complex)) + memcpy(x, b, (batch) * (m) * (n) * sizeof(float complex)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -136,7 +154,15 @@ cdef void blas_ctrsm(void* out, void** data) nogil: cdef char cdiag = 'U' if diag else 'N' cdef int lda = m if left_side else n cdef int ldb = m - ctrsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + + cdef int64_t x_plus = (m) * (n) + cdef int64_t a_plus = (lda) * (lda) + + for _ in range(batch): + ctrsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + x += x_plus + a += a_plus + register_cpu_custom_call_target(b"blas_ctrsm", (blas_ctrsm)) @@ -147,13 +173,14 @@ cdef void blas_ztrsm(void* out, void** data) nogil: cdef int32_t diag = ((data[3]))[0] cdef int m = ((data[4]))[0] cdef int n = ((data[5]))[0] - cdef double complex* alpha = (data[6]) - cdef double complex* a = (data[7]) - cdef double complex* b = (data[8]) + cdef int batch = ((data[6]))[0] + cdef double complex* alpha = (data[7]) + cdef double complex* a = (data[8]) + cdef double complex* b = (data[9]) cdef double complex* x = (out) if x != b: - memcpy(x, b, (m) * (n) * sizeof(double complex)) + memcpy(x, b, (batch) * (m) * (n) * sizeof(double complex)) cdef char cside = 'L' if left_side else 'R' cdef char cuplo = 'L' if lower else 'U' @@ -165,20 +192,36 @@ cdef void blas_ztrsm(void* out, void** data) nogil: cdef char cdiag = 'U' if diag else 'N' cdef int lda = m if left_side else n cdef int ldb = m - ztrsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + + cdef int64_t x_plus = (m) * (n) + cdef int64_t a_plus = (lda) * (lda) + + for _ in range(batch): + ztrsm(&cside, &cuplo, &ctransa, &cdiag, &m, &n, alpha, a, &lda, x, &ldb) + x += x_plus + a += a_plus register_cpu_custom_call_target(b"blas_ztrsm", (blas_ztrsm)) def trsm(c, alpha, a, b, left_side=False, lower=False, trans_a=False, conj_a=False, diag=False): + a_shape = c.GetShape(a) b_shape = c.GetShape(b) dtype = b_shape.element_type() - m, n = b_shape.dimensions() + + dims = b_shape.dimensions() + + m, n = dims[-2:] k = m if left_side else n - a_shape = c.GetShape(a) - if (k, k) != a_shape.dimensions() or a_shape.element_type() != dtype: + batch_dims = tuple(dims[:-2]) + num_bd = len(batch_dims) + num_b = 1 + for d in batch_dims: + num_b *= d + + if batch_dims + (k, k) != a_shape.dimensions() or a_shape.element_type() != dtype: raise ValueError("Argument mismatch for trsm, got {} and {}".format( a_shape, b_shape)) @@ -196,6 +239,7 @@ def trsm(c, alpha, a, b, left_side=False, lower=False, trans_a=False, if conj_a and not trans_a: raise NotImplementedError("Conjugation without transposition not supported") + layout = (num_bd, num_bd + 1) + tuple(range(num_bd - 1, -1, -1)) return c.CustomCall( fn, operands=( @@ -205,8 +249,9 @@ def trsm(c, alpha, a, b, left_side=False, lower=False, trans_a=False, c.ConstantS32Scalar(int(diag)), c.ConstantS32Scalar(m), c.ConstantS32Scalar(n), + c.ConstantS32Scalar(num_b), alpha, a, b), - shape_with_layout=Shape.array_shape(dtype, b_shape.dimensions(), (0, 1)), + shape_with_layout=Shape.array_shape(dtype, b_shape.dimensions(), layout), operand_shapes_with_layout=( Shape.array_shape(np.dtype(np.int32), (), ()), Shape.array_shape(np.dtype(np.int32), (), ()), @@ -214,9 +259,10 @@ def trsm(c, alpha, a, b, left_side=False, lower=False, trans_a=False, Shape.array_shape(np.dtype(np.int32), (), ()), Shape.array_shape(np.dtype(np.int32), (), ()), Shape.array_shape(np.dtype(np.int32), (), ()), + Shape.array_shape(np.dtype(np.int32), (), ()), Shape.array_shape(dtype, (), ()), - Shape.array_shape(dtype, a_shape.dimensions(), (0, 1)), - Shape.array_shape(dtype, b_shape.dimensions(), (0, 1)), + Shape.array_shape(dtype, a_shape.dimensions(), layout), + Shape.array_shape(dtype, b_shape.dimensions(), layout), )) jax_trsm = trsm From 938a7f801255d1d9969c68131d9a894819589ce9 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 14 Jan 2020 11:33:21 -0500 Subject: [PATCH 0612/1053] Remove :libjax alias from BUILD file. (#1996) --- jax/BUILD | 6 ------ 1 file changed, 6 deletions(-) diff --git a/jax/BUILD b/jax/BUILD index 2ed87e6c942b..4485599bd650 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -43,12 +43,6 @@ py_library( deps = ["@org_tensorflow//tensorflow/compiler/xla/python:xla_client"], ) -# Old name for library, use ":jax" instead. -py_library( - name = "libjax", - deps = [":jax"], -) - py_library( name = "stax", srcs = ["experimental/stax.py"], From 11224bd2b19a011cd65577940ac26eb80be04ba7 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 14 Jan 2020 16:20:53 -0500 Subject: [PATCH 0613/1053] Use a uniform rng rather than a normal rng to defeat CSE. (#2000) The normal distribution is relatively expensive to compute. --- jax/interpreters/xla.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 933b6802ce0d..6473b5385a2e 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -966,10 +966,10 @@ def _foil_cse(c, x): assert not xla_shape.tuple_shapes() return x else: - rng = c.RngNormal(c.Constant(onp.array(0, dtype=onp.float32)), - c.Constant(onp.array(1, dtype=onp.float32)), - []) - pred = c.Lt(rng, c.Constant(onp.finfo(onp.float32).max)) + rng = c.RngUniform(c.Constant(onp.array(0, dtype=onp.float32)), + c.Constant(onp.array(1, dtype=onp.float32)), + []) + pred = c.Lt(rng, c.Constant(onp.array(2, dtype=onp.float32))) shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) return c.Select(pred, x, zero) From 653001aa64f8de1a6b020a4c4bf17949cea0584b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 15 Jan 2020 10:51:46 -0500 Subject: [PATCH 0614/1053] Update references to bazel repositories in WORKSPACE to match TF head. (#2005) --- WORKSPACE | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ba69a2698cc..bdca3fcc54cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -2,19 +2,24 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "io_bazel_rules_closure", - sha256 = "e0a111000aeed2051f29fcc7a3f83be3ad8c6c93c186e64beb1ad313f0c7f9f9", - strip_prefix = "rules_closure-cf1e44edb908e9616030cc83d085989b8e6cd6df", + sha256 = "5b00383d08dd71f28503736db0500b6fb4dda47489ff5fc6bed42557c07c6ba9", + strip_prefix = "rules_closure-308b05b2419edb5c8ee0471b67a40403df940149", urls = [ - "http://mirror.tensorflow.org/github.com/bazelbuild/rules_closure/archive/cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz", - "https://github.com/bazelbuild/rules_closure/archive/cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz", # 2019-04-04 + "https://storage.googleapis.com/mirror.tensorflow.org/github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz", + "https://github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz", # 2019-06-13 ], ) + +# https://github.com/bazelbuild/bazel-skylib/releases http_archive( name = "bazel_skylib", - sha256 = "2ef429f5d7ce7111263289644d233707dba35e39696377ebab8b0bc701f7818e", - urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/0.8.0/bazel-skylib.0.8.0.tar.gz"], -) # https://github.com/bazelbuild/bazel-skylib/releases + sha256 = "1dde365491125a3db70731e25658dfdd3bc5dbdfd11b840b3e987ecf043c7ca0", + urls = [ + "http://mirror.tensorflow.org/github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz", + ], +) # To update TensorFlow to a new revision, # a) update URL and strip_prefix to the new git commit hash From a5644edbbcbd4093cc8cfa993145f471336fa0b6 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 15 Jan 2020 09:14:59 -0700 Subject: [PATCH 0615/1053] Defer to unrecognized types in arithmetic (#1942) This is useful for building higher level array libraries around JAX, because it makes it possible to override operations like `jax_array + other`. I think I covered all the array types that JAX should be able to handle: - Python builtin numbers int, float and complex - NumPy scalars - NumPy arrays - JAX array types and tracers Did I miss anything? Maybe bfloat16 scalars? --- jax/numpy/lax_numpy.py | 77 +++++++++++++++++++++++------------------ tests/lax_numpy_test.py | 44 +++++++++++++++++++++++ 2 files changed, 87 insertions(+), 34 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 8e961ec59ac4..0b5ae04125c3 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3340,6 +3340,15 @@ def wrapped(*args, **kwargs): # operator overloads mainly just forward calls to the corresponding lax_numpy # functions, which can themselves handle instances from any of these classes. +_scalar_types = (int, float, complex, onp.generic) + +def _defer_to_unrecognized_arg(binary_op): + # Ensure that other array types have the chance to override arithmetic. + def deferring_binary_op(self, other): + if not isinstance(other, _scalar_types + _arraylike_types + (core.Tracer,)): + return NotImplemented + return binary_op(self, other) + return deferring_binary_op def _swap_args(f): return lambda x, y: f(y, x) @@ -3360,42 +3369,42 @@ def _operator_round(number, ndigits=None): "setitem": _unimplemented_setitem, "neg": negative, "pos": positive, - "eq": equal, - "ne": not_equal, - "lt": less, - "le": less_equal, - "gt": greater, - "ge": greater_equal, + "eq": _defer_to_unrecognized_arg(equal), + "ne": _defer_to_unrecognized_arg(not_equal), + "lt": _defer_to_unrecognized_arg(less), + "le": _defer_to_unrecognized_arg(less_equal), + "gt": _defer_to_unrecognized_arg(greater), + "ge": _defer_to_unrecognized_arg(greater_equal), "abs": abs, - "add": add, - "radd": add, - "sub": subtract, - "rsub": _swap_args(subtract), - "mul": multiply, - "rmul": multiply, - "div": divide, - "rdiv": _swap_args(divide), - "truediv": true_divide, - "rtruediv": _swap_args(true_divide), - "floordiv": floor_divide, - "rfloordiv": _swap_args(floor_divide), - "divmod": divmod, - "rdivmod": _swap_args(divmod), - "mod": mod, - "rmod": _swap_args(mod), - "pow": power, - "rpow": _swap_args(power), - "matmul": matmul, - "rmatmul": _swap_args(matmul), - "and": bitwise_and, - "rand": bitwise_and, - "or": bitwise_or, - "ror": bitwise_or, - "xor": bitwise_xor, - "rxor": bitwise_xor, + "add": _defer_to_unrecognized_arg(add), + "radd": _defer_to_unrecognized_arg(add), + "sub": _defer_to_unrecognized_arg(subtract), + "rsub": _defer_to_unrecognized_arg(_swap_args(subtract)), + "mul": _defer_to_unrecognized_arg(multiply), + "rmul": _defer_to_unrecognized_arg(multiply), + "div": _defer_to_unrecognized_arg(divide), + "rdiv": _defer_to_unrecognized_arg(_swap_args(divide)), + "truediv": _defer_to_unrecognized_arg(true_divide), + "rtruediv": _defer_to_unrecognized_arg(_swap_args(true_divide)), + "floordiv": _defer_to_unrecognized_arg(floor_divide), + "rfloordiv": _defer_to_unrecognized_arg(_swap_args(floor_divide)), + "divmod": _defer_to_unrecognized_arg(divmod), + "rdivmod": _defer_to_unrecognized_arg(_swap_args(divmod)), + "mod": _defer_to_unrecognized_arg(mod), + "rmod": _defer_to_unrecognized_arg(_swap_args(mod)), + "pow": _defer_to_unrecognized_arg(power), + "rpow": _defer_to_unrecognized_arg(_swap_args(power)), + "matmul": _defer_to_unrecognized_arg(matmul), + "rmatmul": _defer_to_unrecognized_arg(_swap_args(matmul)), + "and": _defer_to_unrecognized_arg(bitwise_and), + "rand": _defer_to_unrecognized_arg(bitwise_and), + "or": _defer_to_unrecognized_arg(bitwise_or), + "ror": _defer_to_unrecognized_arg(bitwise_or), + "xor": _defer_to_unrecognized_arg(bitwise_xor), + "rxor": _defer_to_unrecognized_arg(bitwise_xor), "invert": bitwise_not, - "lshift": left_shift, - "rshift": right_shift, + "lshift": _defer_to_unrecognized_arg(left_shift), + "rshift": _defer_to_unrecognized_arg(right_shift), "round": _operator_round, } diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 174ed4386eb9..7fc1825b318a 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -296,6 +296,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("__eq__", 2, number_dtypes, all_shapes, jtu.rand_default, []), op_record("__ne__", 2, number_dtypes, all_shapes, jtu.rand_default, []), op_record("__lt__", 2, default_dtypes, all_shapes, jtu.rand_default, []), + op_record("__le__", 2, default_dtypes, all_shapes, jtu.rand_default, []), op_record("__gt__", 2, default_dtypes, all_shapes, jtu.rand_default, []), op_record("__ge__", 2, default_dtypes, all_shapes, jtu.rand_default, []), op_record("__pos__", 1, number_dtypes, all_shapes, jtu.rand_default, []), @@ -337,6 +338,21 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, # op_record("__rdivmod__", 2, number_dtypes, all_shapes, jtu.rand_nonzero, []), ] +class _OverrideEverything(object): + pass + +for rec in JAX_OPERATOR_OVERLOADS + JAX_RIGHT_OPERATOR_OVERLOADS: + if rec.nargs == 2: + setattr(_OverrideEverything, rec.name, lambda self, other: self) + +class _OverrideNothing(object): + pass + +for rec in JAX_OPERATOR_OVERLOADS + JAX_RIGHT_OPERATOR_OVERLOADS: + if rec.nargs == 2: + setattr(_OverrideNothing, rec.name, lambda self, other: NotImplemented) + + numpy_version = tuple(map(int, onp.version.version.split('.'))) if numpy_version >= (1, 15): JAX_COMPOUND_OP_RECORDS += [ @@ -490,6 +506,34 @@ def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, fun, args_maker, check_dtypes=True, # not scalar_arg and not empty_shape, atol=tol, rtol=tol) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": rec.test_name + "_{}".format(dtype), + "rng_factory": rec.rng_factory, + "op_name": rec.name, "dtype": dtype} + for rec in JAX_OPERATOR_OVERLOADS if rec.nargs == 2 + for dtype in rec.dtypes)) + def testBinaryOperatorDefers(self, op_name, rng_factory, dtype): + rng = rng_factory() + arg = jax.device_put(rng((), dtype)) + op = getattr(operator, op_name) + + other = _OverrideEverything() + assert op(other, arg) is other + assert op(arg, other) is other + + other = _OverrideNothing() + if op_name == "__eq__": + assert op(other, arg) is False + assert op(arg, other) is False + elif op_name == "__ne__": + assert op(other, arg) is True + assert op(arg, other) is True + else: + with self.assertRaises(TypeError): + op(other, arg) + with self.assertRaises(TypeError): + op(arg, other) + @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix( From 12975bbcc84ae0303f243b3ed727340bbd514321 Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Wed, 15 Jan 2020 18:09:02 +0000 Subject: [PATCH 0616/1053] [pmap] Add support for nested pmaps on multihost platforms via axis_size (#2002) One issue with nested pmaps on multihost platforms is inferring the global pmap axis size without communication. This commit sidesteps the issue by adding an `axis_size` argument to manually provide this information. This change only enables a single cross-host pmap; all inner pmaps must be single-host. Addressing: #1753 --- jax/api.py | 28 ++++++++++++++----- jax/interpreters/pxla.py | 60 ++++++++++++++++++++++++---------------- 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/jax/api.py b/jax/api.py index ec33e4a029e3..46ffefde3383 100644 --- a/jax/api.py +++ b/jax/api.py @@ -717,7 +717,7 @@ def _flatten_axes(treedef, axis_tree): return axes -def pmap(fun, axis_name=None, devices=None, backend=None): +def pmap(fun, axis_name=None, devices=None, backend=None, axis_size=None): """Parallel map with support for collectives. The purpose of ``pmap`` is to express single-program multiple-data (SPMD) @@ -868,16 +868,28 @@ def pmap(fun, axis_name=None, devices=None, backend=None): _check_callable(fun) axis_name = _TempAxisName(fun) if axis_name is None else axis_name + # axis_size is an optional integer representing the global axis size. + # The aggregate size (across all hosts) size of the mapped axis must match + # the given value. This argument is mutually exclusive with ``devices``. + if axis_size is not None and devices is not None: + msg = "pmap got devices and axis_size. They're mutually exclusive." + raise ValueError(msg) + @wraps(fun) def f_pmapped(*args, **kwargs): f = lu.wrap_init(fun) args, in_tree = tree_flatten((args, kwargs)) - axis_size = _pmap_axis_size(args) + local_axis_size = _pmap_axis_size(args) _check_args(args) flat_fun, out_tree = flatten_fun(f, in_tree) - out = pxla.xla_pmap(flat_fun, *args, axis_name=axis_name, axis_size=axis_size, - devices=tuple(devices) if devices is not None else devices, - backend=backend) + out = pxla.xla_pmap( + flat_fun, + *args, + axis_name=axis_name, + axis_size=local_axis_size, + global_axis_size=axis_size, + devices=tuple(devices) if devices is not None else devices, + backend=backend) return tree_unflatten(out_tree(), out) namestr = "pmap({}, axis_name={})".format @@ -932,7 +944,8 @@ def f_pmapped(*args, **kwargs): soft_mapped_fun = pxla.split_axis(flat_fun, axis_name, chunk_size) reshaped_outs = pxla.xla_pmap(soft_mapped_fun, *reshaped_args, axis_name=axis_name, axis_size=num_chunks, - devices=None, backend=backend) + global_axis_size=None, devices=None, + backend=backend) outs = [_reshape_merge(out) for out in reshaped_outs] return tree_unflatten(out_tree(), outs) @@ -990,7 +1003,8 @@ def pfun(*args): f, out_axes = parallel.papply_transform(f, axis_name, axis_size) f = pxla.split_axis(f, axis_name, chunk_size) outs = pxla.xla_pmap(f, *reshaped_args, axis_name=axis_name, - axis_size=num_chunks, devices=None) + axis_size=num_chunks, global_axis_size=None, + devices=None, backend=None) outs = map(_reshape_merge, outs) outs = [batching.matchaxis(axis_size, 0, dst, x) for dst, x in zip(out_axes(), outs)] diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index d4bfe05f577c..eba0341a99d8 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -408,34 +408,47 @@ def __getitem__(self, idx): def xla_pmap_impl(fun, *args, **params): axis_name = params.pop('axis_name') axis_size = params.pop('axis_size') + global_axis_size = params.pop('global_axis_size') devices = params.pop('devices') - backend = params.pop('backend', None) + backend = params.pop('backend') assert not params abstract_args = map(xla.abstractify, args) - compiled_fun = parallel_callable(fun, backend, axis_name, axis_size, devices, - *abstract_args) + compiled_fun = parallel_callable(fun, backend, axis_name, axis_size, + global_axis_size, devices, *abstract_args) return compiled_fun(*args) @lu.cache -def parallel_callable(fun, backend, axis_name, axis_size, devices, *avals): +def parallel_callable(fun, backend, axis_name, axis_size, global_axis_size, + devices, *avals): if devices is not None and len(devices) == 0: raise ValueError("'devices' argument to pmap must be non-empty, or None.") + # Determine global_axis_size for use in AxisEnv. if devices: + assert global_axis_size is None # Checked in api.py global_axis_size = len(devices) elif xb.host_count() > 1: - # TODO(skye): relax this constraint or provide functionality for - # automatically passing appropriate `devices`. - if axis_size != xb.local_device_count(): - raise ValueError( - "On multi-host platforms, the input to pmapped functions must have " - "leading axis size equal to the number of local devices if no " - "`devices` argument is specified. Got axis_size=%d, " - "num_local_devices=%d" % (axis_size, xb.local_device_count())) - global_axis_size = xb.device_count() + if global_axis_size is None: + # TODO(skye): relax this constraint or provide functionality for + # automatically passing appropriate `devices`. + # TODO(trevorcai): This check forces us to provide global_axis_size for + # all pmaps on pmap-on-pod. Can we do it after tracing? + if axis_size != xb.local_device_count(): + raise ValueError( + "On multi-host platforms, the input to pmapped functions must have " + "leading axis size equal to the number of local devices if no " + "`devices` argument is specified. Got axis_size=%d, " + "num_local_devices=%d" % (axis_size, xb.local_device_count())) + global_axis_size = xb.device_count() else: - global_axis_size = axis_size + if global_axis_size is not None: + if global_axis_size != axis_size: + raise ValueError( + "Specified axis_size {} doesn't match received axis_size {}.".format( + global_axis_size, axis_size)) + else: + global_axis_size = axis_size log_priority = logging.WARNING if FLAGS.jax_log_compiles else logging.DEBUG logging.log(log_priority, @@ -512,7 +525,7 @@ def dynamic_fun(dummy, *args): # violating pmap's semantics where data is sharded across replicas in # row-major order. Instead, manually create a device assignment that ensures # each host is responsible for a continguous set of replicas. - if xb.host_count() > 1: + if num_global_replicas > num_local_replicas: # TODO(skye): use a locality-aware assignment that satisfies the above # constraint. devices = [d for host_id in xb.host_ids() @@ -544,7 +557,7 @@ def dynamic_fun(dummy, *args): handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, out_pvals, compiled.local_devices(), backend) - return partial(execute_replicated, compiled, backend, num_local_replicas, handle_args, handle_outs) + return partial(execute_replicated, compiled, backend, handle_args, handle_outs) multi_host_supported_collectives = set() @@ -625,11 +638,7 @@ def _pval_to_result_handler(axis_size, nrep, pval, devices, backend): else: return aval_to_result_handler(axis_size, nrep, pv) -def execute_replicated(compiled, backend, nrep, in_handler, out_handler, *args): - if nrep > xb.device_count(backend): - msg = ("executing pmap computation that requires {} replicas, but only {} " - "XLA devices are available") - raise ValueError(msg.format(nrep, xb.device_count(backend))) +def execute_replicated(compiled, backend, in_handler, out_handler, *args): input_bufs = in_handler(args) out_bufs = compiled.ExecutePerReplica(list(input_bufs)) return out_handler(out_bufs) @@ -642,12 +651,15 @@ def execute_replicated(compiled, backend, nrep, in_handler, out_handler, *args): xla_pmap_p.def_impl(xla_pmap_impl) def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, - in_nodes, axis_name, axis_size, devices, backend=None): + in_nodes, axis_name, axis_size, global_axis_size, + devices, backend=None): # We in-line here rather than generating a Call HLO as in the xla_call # translation rule just because the extra tuple stuff is a pain. if axis_env.devices is not None or (axis_env.names and devices is not None): raise ValueError("Nested pmaps with explicit devices argument.") - new_env = xla.extend_axis_env(axis_env, axis_name, axis_size) + if global_axis_size is None: + global_axis_size = axis_size + new_env = xla.extend_axis_env(axis_env, axis_name, global_axis_size) in_nodes_sharded = list(map(partial(_xla_shard, c, new_env), in_nodes)) sharded_outs = xla.jaxpr_subcomp(c, jaxpr, backend, new_env, const_nodes, freevar_nodes, *in_nodes_sharded) @@ -822,7 +834,7 @@ def process_call(self, call_primitive, f, tracers, params): def process_map(self, map_primitive, f, tracers, params): vals, names = unzip2((t.val, t.axis_name) for t in tracers) if all(name is not_mapped for name in names): - return map_primitive.bind(f, *vals, **params) + return map_primitive.bind(f, *vals, **params) else: # because the map primitive maps over leading axes, we need to transpose # the software-mapped axis on any mapped arguments to be the second axis; From 80b35dd4e52e0b19e3eaf555c8b8fbdf8ea3e9e8 Mon Sep 17 00:00:00 2001 From: Srinivas Vasudevan Date: Wed, 15 Jan 2020 13:13:11 -0800 Subject: [PATCH 0617/1053] Add betainc to JAX (#1998) Adds betaln, a wrapper for the Beta function (scipy.special.betaln). --- docs/jax.lax.rst | 1 + docs/jax.scipy.rst | 1 + jax/interpreters/masking.py | 34 +++++++------- jax/lax/lax.py | 92 +++++++++++++++++++++++-------------- jax/lax_linalg.py | 4 +- jax/lax_reference.py | 1 + jax/scipy/special.py | 6 +++ tests/lax_scipy_test.py | 6 +++ tests/lax_test.py | 6 +++ 9 files changed, 98 insertions(+), 53 deletions(-) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index 30a715290fb6..de6449456ed5 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -32,6 +32,7 @@ Operators batch_matmul bessel_i0e bessel_i1e + betainc bitcast_convert_type bitwise_not bitwise_and diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index fbd92f564519..693b21804c74 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -43,6 +43,7 @@ jax.scipy.special .. autosummary:: :toctree: _autosummary + betainc digamma entr erf diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index bd5e6adf2393..cd1363576b54 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -328,25 +328,25 @@ def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): return prim.bind(padded_val, **params) -def defbinop(prim): - shape_rules[prim] = binop_shape_rule - masking_rules[prim] = partial(binop_masking_rule, prim) - -def binop_shape_rule(shape_exprs): - x_shape_expr, y_shape_expr = shape_exprs - if x_shape_expr == y_shape_expr: - return x_shape_expr - elif not x_shape_expr: - return y_shape_expr - elif not y_shape_expr: - return x_shape_expr - else: - raise ShapeError +def defnaryop(prim): + shape_rules[prim] = naryop_shape_rule + masking_rules[prim] = partial(naryop_masking_rule, prim) -def binop_masking_rule(prim, padded_vals, logical_shapes): +def naryop_masking_rule(prim, padded_vals, logical_shapes): del logical_shapes # Unused. - padded_x, padded_y = padded_vals - return prim.bind(padded_x, padded_y) + return prim.bind(*padded_vals) + +# Assumes n > 1 +def naryop_shape_rule(shape_exprs): + if shape_exprs.count(shape_exprs[0]) == len(shape_exprs): + return shape_exprs[0] + + filtered_exprs = [s for s in shape_exprs if s] + if filtered_exprs.count(filtered_exprs[0]) == len(filtered_exprs): + return filtered_exprs[0] + + raise ShapeError + ### definition-time (import-time) shape checker tracer machinery diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 097573597e47..32c9fa3e37e5 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -192,6 +192,13 @@ def atan2(x, y): :math:`\mathrm{atan}({x \over y})`.""" return atan2_p.bind(x, y) +def betainc(a, b, x): + r"""Elementwise regularized incomplete beta integral.""" + a = _brcast(_brcast(a, b), x) + b = _brcast(b, a) + x = _brcast(x, a) + return regularized_incomplete_beta_p.bind(a, b, x) + def lgamma(x): r"""Elementwise log gamma: :math:`\mathrm{log}(\Gamma(x))`.""" return lgamma_p.bind(x) @@ -1335,7 +1342,7 @@ def slice_in_dim(operand, start_index, limit_index, stride=1, axis=0): len_axis = operand.shape[axis] start_index = start_index if start_index is not None else 0 limit_index = limit_index if limit_index is not None else len_axis - + # translate negative indices if start_index < 0: start_index = start_index + len_axis @@ -1564,7 +1571,7 @@ def unop(result_dtype, accepted_dtypes, name, translation_rule=None): _attrgetter = lambda name: lambda x, **kwargs: getattr(x, name) -def binop_dtype_rule(result_dtype, accepted_dtypes, name, *avals, **kwargs): +def naryop_dtype_rule(result_dtype, accepted_dtypes, name, *avals, **kwargs): aval_dtypes = [aval.dtype for aval in avals] for i, (aval_dtype, types) in enumerate(zip(aval_dtypes, accepted_dtypes)): if not any(dtypes.issubdtype(aval_dtype, t) for t in types): @@ -1593,15 +1600,15 @@ def _broadcasting_shape_rule(name, *avals): return tuple(result_shape) -def binop(result_dtype, accepted_dtypes, name, translation_rule=None): - dtype_rule = partial(binop_dtype_rule, result_dtype, accepted_dtypes, name) +def naryop(result_dtype, accepted_dtypes, name, translation_rule=None): + dtype_rule = partial(naryop_dtype_rule, result_dtype, accepted_dtypes, name) shape_rule = partial(_broadcasting_shape_rule, name) prim = standard_primitive(shape_rule, dtype_rule, name, translation_rule=translation_rule) batching.defbroadcasting(prim) - masking.defbinop(prim) + masking.defnaryop(prim) return prim -standard_binop = partial(binop, _input_dtype) +standard_naryop = partial(naryop, _input_dtype) # NOTE(mattjj): this isn't great for orchestrate fwd mode because it means JVPs @@ -1609,7 +1616,7 @@ def binop(result_dtype, accepted_dtypes, name, translation_rule=None): # a broadcast). but saving the shape info with the primitives isn't great either # because then we can't trace these ops without shape data. def _brcast(x, *others): - # Used in jvprules to make binop broadcasting explicit for transposability. + # Used in jvprules to make naryop broadcasting explicit for transposability. # Requires shape info during jvp tracing, which isn't strictly necessary. # We don't need full numpy broadcasting, but otherwise the logic is the same # so we reuse the broadcast_shapes function after filtering out scalars. @@ -1659,7 +1666,7 @@ def _sign_translation_rule(c, x): sign_p = standard_unop(_num, 'sign', translation_rule=_sign_translation_rule) ad.defjvp_zero(sign_p) -nextafter_p = standard_binop( +nextafter_p = standard_naryop( [_float, _float], 'nextafter', translation_rule=lambda c, x1, x2: c.NextAfter(x1, x2)) @@ -1696,11 +1703,28 @@ def _sign_translation_rule(c, x): cos_p = standard_unop(_float | _complex, 'cos') ad.defjvp(cos_p, lambda g, x: neg(mul(g, sin(x)))) -atan2_p = standard_binop([_float, _float], 'atan2') +atan2_p = standard_naryop([_float, _float], 'atan2') ad.defjvp(atan2_p, lambda g, x, y: _brcast(g, y) * (y / (square(x) + square(y))), lambda g, x, y: _brcast(g, x) * -x / (square(x) + square(y))) +regularized_incomplete_beta_p = standard_naryop( + [_float, _float, _float], 'regularized_incomplete_beta') + +def betainc_gradx(g, a, b, x): + lbeta = lgamma(a) + lgamma(b) - lgamma(a + b) + partial_x = exp((b - 1) * log1p(-x) + + (a - 1) * log(x) - lbeta) + return partial_x * g + +def betainc_grad_not_implemented(g, a, b, x): + raise ValueError("Betainc gradient with respect to a and b not supported.") + +ad.defjvp(regularized_incomplete_beta_p, + betainc_grad_not_implemented, + betainc_grad_not_implemented, + betainc_gradx) + lgamma_p = standard_unop(_float, 'lgamma') ad.defjvp(lgamma_p, lambda g, x: mul(g, digamma(x))) @@ -1738,7 +1762,7 @@ def _bessel_i1e_jvp(g, y, x): ad.defjvp(imag_p, lambda g, _: real(mul(_const(g, -1j), g))) _complex_dtype = lambda dtype, *args: (onp.zeros((), dtype) + onp.zeros((), onp.complex64)).dtype -complex_p = binop(_complex_dtype, [_complex_elem_types, _complex_elem_types], +complex_p = naryop(_complex_dtype, [_complex_elem_types, _complex_elem_types], 'complex') ad.deflinear(complex_p, lambda t: [real(t), imag(neg(t))]) @@ -1775,7 +1799,7 @@ def _abs_jvp_rule(g, ans, x): lambda g, ans, x: _safe_mul(g, mul(_const(x, -0.5), pow(x, _const(x, -1.5))))) -pow_p = standard_binop([_float | _complex, _float | _complex], 'pow') +pow_p = standard_naryop([_float | _complex, _float | _complex], 'pow') def _pow_jvp_lhs(g, ans, x, y): # we call _safe_mul here so that we get the behavior 0*inf = 0, since when a @@ -1792,20 +1816,20 @@ def _pow_jvp_rhs(g, ans, x, y): not_p = standard_unop(_int | _bool, 'not') -and_p = standard_binop([_any, _any], 'and') +and_p = standard_naryop([_any, _any], 'and') ad.defjvp_zero(and_p) -or_p = standard_binop([_any, _any], 'or') +or_p = standard_naryop([_any, _any], 'or') ad.defjvp_zero(or_p) -xor_p = standard_binop([_any, _any], 'xor') +xor_p = standard_naryop([_any, _any], 'xor') ad.defjvp_zero(xor_p) def _add_transpose(t, x, y): # assert x is ad.undefined_primal and y is ad.undefined_primal # not affine return [t, t] -add_p = standard_binop([_num, _num], 'add') +add_p = standard_naryop([_num, _num], 'add') ad.defjvp(add_p, lambda g, x, y: _brcast(g, y), lambda g, x, y: _brcast(g, x)) ad.primitive_transposes[add_p] = _add_transpose @@ -1814,13 +1838,13 @@ def _sub_transpose(t, x, y): assert x is ad.undefined_primal and y is ad.undefined_primal # not affine return [t, neg(t) if t is not ad_util.zero else ad_util.zero] -sub_p = standard_binop([_num, _num], 'sub') +sub_p = standard_naryop([_num, _num], 'sub') ad.defjvp(sub_p, lambda g, x, y: _brcast(g, y), lambda g, x, y: _brcast(neg(g), x)) ad.primitive_transposes[sub_p] = _sub_transpose -mul_p = standard_binop([_num, _num], 'mul') +mul_p = standard_naryop([_num, _num], 'mul') ad.defbilinear_broadcasting(_brcast, mul_p, mul, mul) @@ -1833,7 +1857,7 @@ def _safe_mul_translation_rule(c, x, y): c.Broadcast(zero, out_shape), c.Mul(x, y)) -safe_mul_p = standard_binop([_num, _num], 'safe_mul', +safe_mul_p = standard_naryop([_num, _num], 'safe_mul', translation_rule=_safe_mul_translation_rule) ad.defbilinear_broadcasting(_brcast, safe_mul_p, _safe_mul, _safe_mul) @@ -1842,13 +1866,13 @@ def _div_transpose_rule(cotangent, x, y): assert x is ad.undefined_primal and y is not ad.undefined_primal res = ad_util.zero if cotangent is ad_util.zero else div(cotangent, y) return res, None -div_p = standard_binop([_num, _num], 'div') +div_p = standard_naryop([_num, _num], 'div') ad.defjvp(div_p, lambda g, x, y: div(_brcast(g, y), y), lambda g, x, y: div(mul(neg(_brcast(g, x)), x), square(y))) ad.primitive_transposes[div_p] = _div_transpose_rule -rem_p = standard_binop([_num, _num], 'rem') +rem_p = standard_naryop([_num, _num], 'rem') ad.defjvp(rem_p, lambda g, x, y: _brcast(g, y), lambda g, x, y: mul(_brcast(neg(g), x), floor(div(x, y)))) @@ -1879,44 +1903,44 @@ def _minmax_translation_rule(c, x, y, minmax=None, cmp=None): x, y) return minmax(c)(x, y) -max_p = standard_binop([_any, _any], 'max', translation_rule=partial( +max_p = standard_naryop([_any, _any], 'max', translation_rule=partial( _minmax_translation_rule, minmax=lambda c: c.Max, cmp=lambda c: c.Gt)) ad.defjvp2(max_p, lambda g, ans, x, y: mul(_brcast(g, y), _balanced_eq(x, ans, y)), lambda g, ans, x, y: mul(_brcast(g, x), _balanced_eq(y, ans, x))) -min_p = standard_binop([_any, _any], 'min', translation_rule=partial( +min_p = standard_naryop([_any, _any], 'min', translation_rule=partial( _minmax_translation_rule, minmax=lambda c: c.Min, cmp=lambda c: c.Lt)) ad.defjvp2(min_p, lambda g, ans, x, y: mul(_brcast(g, y), _balanced_eq(x, ans, y)), lambda g, ans, x, y: mul(_brcast(g, x), _balanced_eq(y, ans, x))) -shift_left_p = standard_binop([_int, _int], 'shift_left') +shift_left_p = standard_naryop([_int, _int], 'shift_left') ad.defjvp_zero(shift_left_p) -shift_right_arithmetic_p = standard_binop([_int, _int], 'shift_right_arithmetic') +shift_right_arithmetic_p = standard_naryop([_int, _int], 'shift_right_arithmetic') ad.defjvp_zero(shift_right_arithmetic_p) -shift_right_logical_p = standard_binop([_int, _int], 'shift_right_logical') +shift_right_logical_p = standard_naryop([_int, _int], 'shift_right_logical') ad.defjvp_zero(shift_right_logical_p) -eq_p = binop(_fixed_dtype(onp.bool_), [_any, _any], 'eq') +eq_p = naryop(_fixed_dtype(onp.bool_), [_any, _any], 'eq') ad.defjvp_zero(eq_p) -ne_p = binop(_fixed_dtype(onp.bool_), [_any, _any], 'ne') +ne_p = naryop(_fixed_dtype(onp.bool_), [_any, _any], 'ne') ad.defjvp_zero(ne_p) -ge_p = binop(_fixed_dtype(onp.bool_), [_any, _any], 'ge') +ge_p = naryop(_fixed_dtype(onp.bool_), [_any, _any], 'ge') ad.defjvp_zero(ge_p) -gt_p = binop(_fixed_dtype(onp.bool_), [_any, _any], 'gt') +gt_p = naryop(_fixed_dtype(onp.bool_), [_any, _any], 'gt') ad.defjvp_zero(gt_p) -le_p = binop(_fixed_dtype(onp.bool_), [_any, _any], 'le') +le_p = naryop(_fixed_dtype(onp.bool_), [_any, _any], 'le') ad.defjvp_zero(le_p) -lt_p = binop(_fixed_dtype(onp.bool_), [_any, _any], 'lt') +lt_p = naryop(_fixed_dtype(onp.bool_), [_any, _any], 'lt') ad.defjvp_zero(lt_p) @@ -1992,7 +2016,7 @@ def _conv_general_dilated_shape_rule( def _conv_general_dilated_dtype_rule( lhs, rhs, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, **unused_kwargs): - return binop_dtype_rule(_input_dtype, [_float, _float], + return naryop_dtype_rule(_input_dtype, [_float, _float], 'conv_general_dilated', lhs, rhs) _conv_spec_transpose = lambda spec: (spec[1], spec[0]) + spec[2:] @@ -2185,7 +2209,7 @@ def _dot_general_shape_rule(lhs, rhs, dimension_numbers, precision): def _dot_general_dtype_rule(lhs, rhs, dimension_numbers, precision): - return binop_dtype_rule(_input_dtype, [_num, _num], 'dot_general', lhs, rhs) + return naryop_dtype_rule(_input_dtype, [_num, _num], 'dot_general', lhs, rhs) def _dot_general_transpose_lhs(g, y, dimension_numbers, precision, @@ -2391,7 +2415,7 @@ def _clamp_shape_rule(min, operand, max): raise TypeError(m.format(max.shape)) return operand.shape -_clamp_dtype_rule = partial(binop_dtype_rule, _input_dtype, [_any, _any, _any], +_clamp_dtype_rule = partial(naryop_dtype_rule, _input_dtype, [_any, _any, _any], 'clamp') clamp_p = standard_primitive(_clamp_shape_rule, _clamp_dtype_rule, 'clamp') diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 1fc43de8c06e..a1ba3424c2ce 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -34,7 +34,7 @@ from jax.util import partial, prod from jax.abstract_arrays import ShapedArray from jax.core import Primitive -from jax.lax import (standard_primitive, standard_unop, binop_dtype_rule, +from jax.lax import (standard_primitive, standard_unop, naryop_dtype_rule, _float, _complex, _input_dtype, _broadcasting_select) from jax.lib import xla_client from jax.lib import lapack @@ -311,7 +311,7 @@ def eigh_batching_rule(batched_args, batch_dims, lower): triangular_solve_dtype_rule = partial( - binop_dtype_rule, _input_dtype, (_float | _complex, _float | _complex), + naryop_dtype_rule, _input_dtype, (_float | _complex, _float | _complex), 'triangular_solve') def triangular_solve_shape_rule(a, b, left_side=False, **unused_kwargs): diff --git a/jax/lax_reference.py b/jax/lax_reference.py index 62be2ac49708..d91613e70ad0 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -60,6 +60,7 @@ sinh = onp.sinh cosh = onp.cosh +betainc = scipy.special.betainc lgamma = scipy.special.gammaln digamma = scipy.special.digamma erf = scipy.special.erf diff --git a/jax/scipy/special.py b/jax/scipy/special.py index d8f8a2f9a67b..d10388ccfb96 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -39,6 +39,12 @@ def betaln(x, y): return lax.lgamma(x) + lax.lgamma(y) - lax.lgamma(x + y) +@_wraps(osp_special.betainc) +def betainc(a, b, x): + a, b, x = _promote_args_inexact("betainc", a, b, x) + return lax.betainc(a, b, x) + + @_wraps(osp_special.digamma, update_doc=False) def digamma(x): x, = _promote_args_inexact("digamma", x) diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index f6cf1c16e3ca..db72d09c3a7d 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -30,6 +30,7 @@ import scipy.stats as osp_stats from jax import api +from jax import lib from jax import test_util as jtu from jax.scipy import special as lsp_special from jax.scipy import stats as lsp_stats @@ -76,6 +77,11 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): op_record("entr", 1, float_dtypes, jtu.rand_default, False), ] +if lib.version > (0, 1, 37): + JAX_SPECIAL_FUNCTION_RECORDS.append( + op_record("betainc", 3, float_dtypes, jtu.rand_positive, False) + ) + CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/lax_test.py b/tests/lax_test.py index 65944935127d..aadba64d203a 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -32,6 +32,7 @@ from jax import core from jax import dtypes from jax import lax +from jax import lib from jax import test_util as jtu from jax import lax_reference from jax import dtypes @@ -157,6 +158,11 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("le", 2, default_dtypes, jtu.rand_small), op_record("lt", 2, default_dtypes, jtu.rand_small), ] +if lib.version > (0, 1, 37): + LAX_OPS.append( + op_record("betainc", 3, float_dtypes, jtu.rand_positive, + {onp.float64: 1e-14}) + ) CombosWithReplacement = itertools.combinations_with_replacement From 55c971e47fbfad18bdb2248efc72249221bffae9 Mon Sep 17 00:00:00 2001 From: Julius Kunze Date: Thu, 16 Jan 2020 00:36:00 +0000 Subject: [PATCH 0618/1053] Implement shapecheck for more primitives (#1990) * shapecheck of jit, device_put, broadcast_in_dim, better error for unsupported ops, parse multi-digit integer literals * WIP shapecheck np.pad * Implement shapecheck of gather, pad * Fix shapecheck of pad * Implement polymorphic shape rule for (strided/dilated) convolution, refactor * Cleanup * Fix * Remove all polymorphic shape rules, reuse shape rules instead. * Register shape_rule for all standard_primitives * Remove ShapeExpr, canonicalize_poly, renames * Complete shapecheck(binop) implementation, remove special cases for polymorphic shapes * Allow Poly of form d*poly + k to be divided by d * Fix bug, inline poly_without_zeros. --- jax/api.py | 4 +- jax/interpreters/masking.py | 223 +++++++++++++++++++++++------------- jax/interpreters/xla.py | 3 + jax/lax/lax.py | 88 ++++---------- jax/lax/lax_control_flow.py | 12 +- tests/masking_test.py | 160 +++++++++++++++++++++++++- 6 files changed, 332 insertions(+), 158 deletions(-) diff --git a/jax/api.py b/jax/api.py index 46ffefde3383..88c78a3b0e33 100644 --- a/jax/api.py +++ b/jax/api.py @@ -62,7 +62,7 @@ from .interpreters import batching from .interpreters import parallel from .interpreters import masking -from .interpreters.masking import shapecheck +from .interpreters.masking import shapecheck, ensure_poly from .config import flags, config map = safe_map @@ -1055,7 +1055,7 @@ def _bind_shapes(shape_exprs, shapes): env = {} for shape_expr, shape in zip(shape_exprs, shapes): for poly, d in zip(shape_expr, shape): - if masking.is_constant(poly): + if ensure_poly(poly).is_constant: continue else: (binder,), = poly # TODO generalize to handle striding diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index cd1363576b54..366ca73a9b1e 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -29,7 +29,6 @@ from ..util import unzip2, safe_map, safe_zip, curry from ..abstract_arrays import ShapedArray from .. import linear_util as lu -from . import partial_eval as pe map = safe_map zip = safe_zip @@ -53,19 +52,18 @@ def extend_shape_envs(logical_env, padded_env): yield shape_envs = prev +def is_polymorphic(shape): + return any(map(lambda d: isinstance(d, Poly), shape)) + def shape_as_value(expr): - if type(expr) is ShapeExpr: - return eval_shape_expr(shape_envs.logical, expr) - elif type(expr) is tuple and any(type(d) is Poly for d in expr): + if type(expr) is tuple and is_polymorphic(expr): return tuple(eval_dim_expr(shape_envs.logical, d) if type(d) is Poly else d for d in expr) else: return expr def padded_shape_as_value(expr): - if type(expr) is ShapeExpr: - return eval_shape_expr(shape_envs.padded, expr) - elif type(expr) is tuple and any(type(d) is Poly for d in expr): + if type(expr) is tuple and is_polymorphic(expr): return tuple(eval_dim_expr(shape_envs.padded, d) if type(d) is Poly else d for d in expr) else: @@ -91,43 +89,133 @@ def mask_subtrace(master, in_vals, shape_exprs): yield out_vals, out_shapes -### shape expressions +def ensure_poly(p): + if isinstance(p, Poly): + return p -# Shape expressions model tuples of formal polynomials with integer -# coefficients. Here are the internal data structures we use to represent them. -# -# type ShapeExpr = [Poly] -# type Poly = Map Mon Int -# type Mon = Map Str Int + return constant_poly(int(p)) -class ShapeExpr(tuple): # type ShapeExpr = [Poly] - def __str__(self): - return 'ShapeExpr({})'.format(', '.join(map(str, self))) - def __getitem__(self, idx): - if type(idx) is int: - return super(ShapeExpr, self).__getitem__(idx) - else: - return ShapeExpr(super(ShapeExpr, self).__getitem__(idx)) +class Poly(Counter): + """Polynomial with integer coefficients, + usable as element in a polymorphic shape. + + type Poly = Map Mon Int -- monomials to coeffs + type Mon = Map Str Int + """ + def __init__(self, coeffs): + # Makes sure Polynomials are always in canonical form to simplify operators: + coeffs = {mon: coeff for mon, coeff in coeffs.items() if coeff != 0} + coeffs = {Mon(): 0} if len(coeffs) == 0 else coeffs + super().__init__(coeffs) -class Poly(Counter): # type Poly = Map Mon Int -- monomials to coeffs - def __mul__(p1, p2): - new_poly = Poly() - for (mon1, coeff1), (mon2, coeff2) in it.product(p1.items(), p2.items()): + def __add__(self, other): + coeffs = self.copy() + + for mon, coeff in ensure_poly(other).items(): + coeffs[mon] = coeffs.get(mon, 0) + coeff + + return Poly(coeffs) + + def __sub__(self, other): + return self + -other + + def __neg__(self): + return Poly({mon: -coeff for mon, coeff in self.items()}) + + def __mul__(self, other): + coeffs = dict() + for (mon1, coeff1), (mon2, coeff2) \ + in it.product(self.items(), ensure_poly(other).items()): mon = Mon(mon1 + mon2) # add monomials' id degrees coeff = coeff1 * coeff2 # multiply integer coeffs - new_poly[mon] = new_poly.get(mon, 0) + coeff # accumulate coeffs - return new_poly + coeffs[mon] = coeffs.get(mon, 0) + coeff # accumulate coeffs + + return Poly(coeffs) - def __add__(p1, p2): - return Poly(Counter.__add__(p1, p2)) + def __rmul__(self, other): + return self * other + + def __radd__(self, other): + return self + other + + def __rsub__(self, other): + return self + -other + + def __floordiv__(self, divisor): + q, _ = divmod(self, divisor) + return q + + def __mod__(self, divisor): + _, r = divmod(self, divisor) + return r + + def __divmod__(self, divisor): + if self.is_constant: + q, r = divmod(int(self), divisor) + + return constant_poly(q), r + + def divided(count): + q, r = divmod(count, divisor) + if r != 0: + raise ValueError('shapecheck currently only supports strides ' + 'that exactly divide the strided axis length.') + return q + + return Poly( + {k: coeff // divisor if k.degree == 0 else divided(coeff) + for k, coeff in self.items()}), self[Mon()] % divisor def __hash__(self): - return hash(tuple(self.items())) + return hash(super()) + + def __eq__(self, other): + return super().__eq__(ensure_poly(other)) + + def __ne__(self, other): + return not self == other + + def __ge__(self, other): + other = ensure_poly(other) + + if other.is_constant and self.is_constant: + return int(self) >= int(other) + + if other.is_constant and int(other) <= 1: + # Assume polynomials > 0, allowing to use shape rules of binops, conv: + return True + + if self.is_constant and int(self) <= 0: + return False # See above. + + if self == other: + return True + + raise ValueError('Polynomials comparison "{} >= {}" is inconclusive.' + .format(self, other)) + + def __le__(self, other): + return ensure_poly(other) >= self + + def __lt__(self, other): + return not (self >= other) + + def __gt__(self, other): + return not (ensure_poly(other) >= self) def __str__(self): - return ' + '.join('{} {}'.format(v, k) if v != 1 else str(k) + return ' + '.join('{} {}'.format(v, k) if (v != 1 or k.degree == 0) else str(k) for k, v in sorted(self.items())).strip() + def __int__(self): + assert self.is_constant + + return int(next(iter(self.values()))) + + @property + def is_constant(self): + return len(self) == 1 and next(iter(self)).degree == 0 + class Mon(Counter): # type Mon = Map Id Int -- ids to degrees def __hash__(self): return hash(tuple(self.items())) @@ -138,19 +226,14 @@ def __str__(self): def __lt__(self, other): # sort by total degree, then lexicographically on indets - self_key = self.degree(), tuple(sorted(self)) - other_key = other.degree(), tuple(sorted(other)) + self_key = self.degree, tuple(sorted(self)) + other_key = other.degree, tuple(sorted(other)) return self_key < other_key + @property def degree(self): return sum(self.values()) -def concrete_shape(shape): - if type(shape) is ShapeExpr: - return shape - else: - return ShapeExpr((Poly({Mon(): d}) for d in shape)) - def eval_shape_expr(env, expr): return tuple(eval_dim_expr(env, poly) for poly in expr) @@ -175,13 +258,6 @@ def mul(coeff, mon): else: return 0 if coeff == 0 else mon if coeff == 1 else coeff * mon -def is_constant(poly): - try: - ([], _), = poly.items() - return True - except (ValueError, TypeError): - return False - class ShapeError(Exception): pass class ShapeSyntaxError(Exception): pass @@ -204,13 +280,13 @@ class ShapeSyntaxError(Exception): pass # ShapeSpecs encode ShapeExprs but can have some monomorphic dims inside them, # which must be replaced with concrete shapes when known. -class ShapeSpec(list): +class ShapeSpec(tuple): def __str__(self): return 'ShapeSpec({})'.format(', '.join(map(str, self))) def finalize_spec(spec, shape): - return ShapeExpr(parse_lit(d) if e is monomorphic_dim else e - for e, d in zip(spec, shape)) + return tuple(parse_lit(d) if e is monomorphic_dim else e + for e, d in zip(spec, shape)) def parse_spec(spec=''): if not spec: @@ -228,7 +304,7 @@ def parse_dim(spec): elif '*' in spec: terms = map(parse_dim, spec.split('*')) return functools.reduce(op.mul, terms) - elif spec in digits: + elif spec.isdigit() or spec.startswith('-') and spec[1:].isdigit(): return parse_lit(spec) elif spec in identifiers: return parse_id(spec) @@ -240,7 +316,8 @@ def parse_dim(spec): identifiers = frozenset(string.ascii_lowercase) def parse_id(name): return Poly({Mon({name: 1}): 1}) -def parse_lit(val_str): return Poly({Mon(): int(val_str)}) +def parse_lit(val_str): return constant_poly(int(val_str)) +def constant_poly(val): return Poly({Mon(): val}) class MonomorphicDim(object): def __str__(self): return '_' @@ -275,7 +352,7 @@ def aval(self): return ShapedArray(self.shape_expr, self.val.dtype) def is_pure(self): - return all(is_constant(poly) for poly in self.shape_expr) + return all(ensure_poly(poly).is_constant for poly in self.shape_expr) def full_lower(self): if self.is_pure(): @@ -285,10 +362,10 @@ def full_lower(self): class MaskTrace(Trace): def pure(self, val): - return MaskTracer(self, val, concrete_shape(onp.shape(val))) + return MaskTracer(self, val, onp.shape(val)) def lift(self, val): - return MaskTracer(self, val, concrete_shape(onp.shape(val))) + return MaskTracer(self, val, onp.shape(val)) def sublift(self, val): return MaskTracer(self, val.val, val.shape_expr) @@ -299,7 +376,7 @@ def process_primitive(self, primitive, tracers, params): rule = shape_parameterized_primitive_rules[primitive] out, out_shape = rule(shape_envs, vals, shape_exprs, **params) else: - out_shape = shape_rules[primitive](shape_exprs, **params) + out_shape = shape_rules[primitive](*(t.aval for t in tracers), **params) logical_shapes = map(partial(eval_shape_expr, shape_envs.logical), shape_exprs) out = masking_rules[primitive](vals, logical_shapes, **params) if not primitive.multiple_results: @@ -315,13 +392,8 @@ def process_call(self, call_primitive, f, tracers, params): shape_rules = {} def defvectorized(prim): - shape_rules[prim] = vectorized_shape_rule masking_rules[prim] = partial(vectorized_masking_rule, prim) -def vectorized_shape_rule(shape_exprs, **unused_params): - shape_expr, = shape_exprs - return shape_expr - def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): del logical_shapes # Unused. padded_val, = padded_vals @@ -329,25 +401,12 @@ def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): def defnaryop(prim): - shape_rules[prim] = naryop_shape_rule masking_rules[prim] = partial(naryop_masking_rule, prim) def naryop_masking_rule(prim, padded_vals, logical_shapes): del logical_shapes # Unused. return prim.bind(*padded_vals) -# Assumes n > 1 -def naryop_shape_rule(shape_exprs): - if shape_exprs.count(shape_exprs[0]) == len(shape_exprs): - return shape_exprs[0] - - filtered_exprs = [s for s in shape_exprs if s] - if filtered_exprs.count(filtered_exprs[0]) == len(filtered_exprs): - return filtered_exprs[0] - - raise ShapeError - - ### definition-time (import-time) shape checker tracer machinery @@ -383,18 +442,22 @@ def full_lower(self): class ShapeCheckTrace(Trace): def pure(self, val): - return ShapeCheckTracer(self, concrete_shape(onp.shape(val))) + return ShapeCheckTracer(self, onp.shape(val)) def lift(self, val): - return ShapeCheckTracer(self, concrete_shape(onp.shape(val))) + return ShapeCheckTracer(self, onp.shape(val)) def sublift(self, val): return ShapeCheckTracer(self, val.shape_expr) def process_primitive(self, primitive, tracers, params): - shape_exprs = [t.shape_expr for t in tracers] - out_shape_expr = shape_rules[primitive](shape_exprs, **params) - return ShapeCheckTracer(self, out_shape_expr) + avals = [t.aval for t in tracers] + shape_rule = shape_rules.get(primitive) + if shape_rule is None: + raise NotImplementedError('Shape rule for {} not implemented yet.'.format(primitive)) + out_shape = shape_rule(*avals, **params) + return ShapeCheckTracer(self, out_shape) def process_call(self, call_primitive, f, tracers, params): - raise NotImplementedError # TODO check-of-jit + # TODO apply proper subtrace: + return map(self.full_raise, f.call_wrapped(*tracers)) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 6473b5385a2e..c5801c475a3e 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -42,6 +42,7 @@ from ..lib import xla_client as xc from . import partial_eval as pe from . import ad +from . import masking FLAGS = flags.FLAGS flags.DEFINE_bool('jax_debug_nans', @@ -943,6 +944,8 @@ def _device_put_impl(x, device=None): device_put_p.def_impl(_device_put_impl) pe.custom_partial_eval_rules[device_put_p] = lambda trace, x, **params: x ad.deflinear(device_put_p, lambda cotangent, **kwargs: [cotangent]) +masking.shape_rules[device_put_p] = lambda x, **_: x.shape +masking.defvectorized(device_put_p) def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, in_nodes, diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 32c9fa3e37e5..6b7e537fa065 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -46,7 +46,6 @@ from ..interpreters import ad from ..interpreters import batching from ..interpreters import masking -from ..interpreters.masking import ShapeExpr, ShapeError from ..util import curry, cache, safe_zip, unzip2, prod from ..tree_util import build_tree, tree_unflatten, tree_map from ..lib import pytree @@ -67,9 +66,9 @@ def broadcast_shapes(*shapes): return shapes[0] ndim = _max(len(shape) for shape in shapes) shapes = onp.array([(1,) * (ndim - len(shape)) + shape for shape in shapes]) - min_shape = onp.min(shapes, axis=0) + is_zero = onp.any(shapes == 0, axis=0) max_shape = onp.max(shapes, axis=0) - result_shape = onp.where(min_shape == 0, 0, max_shape) + result_shape = onp.where(is_zero, 0, max_shape) if not onp.all((shapes == result_shape) | (shapes == 1)): raise ValueError("Incompatible shapes for broadcasting: {}" .format(tuple(map(tuple, shapes)))) @@ -85,8 +84,7 @@ def _canonicalize_shape(shape): A tuple of integers. """ # TODO(mattjj): this next check is a temporary workaround for masking - if (type(shape) is ShapeExpr - or type(shape) is tuple and any(type(d) is masking.Poly for d in shape)): + if (type(shape) is tuple and masking.is_polymorphic(shape)): return shape try: return tuple(map(operator.index, shape)) @@ -1525,6 +1523,7 @@ def standard_primitive(shape_rule, dtype_rule, name, translation_rule=None): prim.def_impl(partial(xla.apply_primitive, prim)) prim.def_abstract_eval(partial(standard_abstract_eval, prim, shape_rule, dtype_rule)) xla.translations[prim] = translation_rule or partial(standard_translate, name) + masking.shape_rules[prim] = shape_rule return prim @@ -1591,9 +1590,9 @@ def _broadcasting_shape_rule(name, *avals): if len({len(shape) for shape in shapes}) != 1: msg = '{} got arrays of different rank: {}.' raise TypeError(msg.format(name, ', '.join(map(str, map(tuple, shapes))))) - min_shape = onp.min(shapes, axis=0) + is_zero = onp.any(shapes == 0, axis=0) max_shape = onp.max(shapes, axis=0) - result_shape = onp.where(min_shape == 0, 0, max_shape) + result_shape = onp.where(is_zero, 0, max_shape) if not onp.all((shapes == result_shape) | (shapes == 1)): msg = '{} got incompatible shapes for broadcasting: {}.' raise TypeError(msg.format(name, ', '.join(map(str, map(tuple, shapes))))) @@ -2292,28 +2291,6 @@ def _dot_general_translation_rule(c, lhs, rhs, dimension_numbers, precision): return c.DotGeneral(lhs, rhs, dimension_numbers, precision_config=_precision_config(precision)) -def _dot_general_polymorphic_shape_rule(shape_exprs, dimension_numbers, - precision): - del precision # Unused. - lhs_shape, rhs_shape = shape_exprs - lhs_ndim, rhs_ndim = len(lhs_shape), len(rhs_shape) - (lhs_contract, rhs_contract), (lhs_batch, rhs_batch) = dimension_numbers - - lhs_batch_shape = [lhs_shape[d] for d in lhs_batch] - rhs_batch_shape = [rhs_shape[d] for d in rhs_batch] - if lhs_batch_shape != rhs_batch_shape: raise ShapeError - - lhs_contract_shape = [lhs_shape[d] for d in lhs_contract] - rhs_contract_shape = [rhs_shape[d] for d in rhs_contract] - if lhs_contract_shape != rhs_contract_shape: raise ShapeError - - lhs_tensorprod_shape = [lhs_shape[d] for d in range(lhs_ndim) - if d not in lhs_batch and d not in lhs_contract] - rhs_tensorprod_shape = [rhs_shape[d] for d in range(rhs_ndim) - if d not in rhs_batch and d not in rhs_contract] - return ShapeExpr( - lhs_batch_shape + lhs_tensorprod_shape + rhs_tensorprod_shape) - def _dot_general_masking_rule(padded_vals, logical_shapes, dimension_numbers, precision): lhs, rhs = padded_vals @@ -2339,7 +2316,6 @@ def _dot_general_masking_rule(padded_vals, logical_shapes, dimension_numbers, ad.defbilinear(dot_general_p, _dot_general_transpose_lhs, _dot_general_transpose_rhs) batching.primitive_batchers[dot_general_p] = _dot_general_batch_rule -masking.shape_rules[dot_general_p] = _dot_general_polymorphic_shape_rule masking.masking_rules[dot_general_p] = _dot_general_masking_rule @@ -2487,11 +2463,6 @@ def _concatenate_batch_rule(batched_args, batch_dims, dimension, operand_shapes) for op, bdim in zip(batched_args, batch_dims)] return concatenate(operands, dimension + 1), 0 -def _concat_polymorphic_shape_rule(shape_exprs, dimension, operand_shapes): - out_shape = list(shape_exprs[0]) - out_shape[dimension] = _reduce(operator.add, [e[dimension] for e in shape_exprs]) - return ShapeExpr(out_shape) - # The concatenate_p masking rule requires use of a while-loop construct and so # is defined in lax_control_flow.py @@ -2501,14 +2472,16 @@ def _concat_polymorphic_shape_rule(shape_exprs, dimension, operand_shapes): ad.deflinear(concatenate_p, _concatenate_transpose_rule) ad.primitive_transposes[concatenate_p] = _concatenate_transpose_rule batching.primitive_batchers[concatenate_p] = _concatenate_batch_rule -masking.shape_rules[concatenate_p] = _concat_polymorphic_shape_rule -def _pad_shape_rule(operand, padding_value, padding_config): +def _pad_dtype_rule(operand, padding_value, padding_config): if operand.dtype != padding_value.dtype: msg = "pad operand and padding_value must be same dtype: got {} and {}." raise TypeError(msg.format(operand.dtype, padding_value.dtype)) + return _input_dtype(operand, padding_value) + +def _pad_shape_rule(operand, padding_value, padding_config): lo, hi, interior = zip(*padding_config) out_shape = onp.add(onp.add(onp.add(lo, hi), operand.shape), onp.multiply(interior, onp.subtract(operand.shape, 1))) @@ -2543,7 +2516,7 @@ def _pad_batch_rule(batched_args, batch_dims, padding_config): else: raise NotImplementedError # loop and stack -pad_p = standard_primitive(_pad_shape_rule, _input_dtype, 'pad') +pad_p = standard_primitive(_pad_shape_rule, _pad_dtype_rule, 'pad') ad.deflinear(pad_p, _pad_transpose) ad.primitive_transposes[pad_p] = _pad_transpose batching.primitive_batchers[pad_p] = _pad_batch_rule @@ -2632,18 +2605,11 @@ def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unuse dimensions = (0,) + tuple(onp.add(1, dimensions)) return reshape(operand, operand.shape[:1] + new_sizes, dimensions), 0 -def _reshape_polymorphic_shape_rule(shape_exprs, new_sizes, dimensions, old_sizes): - if dimensions is not None: raise NotImplementedError - shape_expr, = shape_exprs - if masking.prod(shape_expr) != masking.prod(new_sizes): raise ShapeError - return new_sizes - reshape_p = standard_primitive(_reshape_shape_rule, _reshape_dtype_rule, 'reshape', _reshape_translation_rule) reshape_p.def_impl(_reshape_impl) ad.deflinear(reshape_p, _reshape_transpose_rule) batching.primitive_batchers[reshape_p] = _reshape_batch_rule -masking.shape_rules[reshape_p] = _reshape_polymorphic_shape_rule def _rev_shape_rule(operand, dimensions): @@ -3463,13 +3429,8 @@ def _reduction_computation(c, jaxpr, consts, init_value): return subc.Build(out) def _masking_defreducer(prim, identity): - masking.shape_rules[prim] = _reducer_polymorphic_shape_rule masking.masking_rules[prim] = partial(_reducer_masking_rule, prim, identity) -def _reducer_polymorphic_shape_rule(shape_exprs, axes, **unused_params): - shape_expr, = shape_exprs - return ShapeExpr([d for i, d in enumerate(shape_expr) if i not in axes]) - def _reducer_masking_rule(prim, identity, padded_vals, logical_shapes, axes, input_shape): del input_shape # Unused. @@ -3495,7 +3456,7 @@ def _reduce_number_dtype_rule(name, operand, *args, **kw): def _reduce_sum_shape_rule(operand, axes, input_shape): assert operand.shape == input_shape, ('{} != {}' .format(operand.shape, input_shape)) - return tuple(onp.delete(operand.shape, axes)) + return _reduce_op_shape_rule(operand, axes) def _reduce_sum_translation_rule(c, operand, axes, input_shape): dtype = c.GetShape(operand).numpy_dtype() @@ -3519,7 +3480,7 @@ def _reduce_sum_transpose_rule(cotangent, input_shape, axes): lambda shape, dtype: onp.broadcast_to(onp.array(0, dtype), shape)) -def _reduce_prod_shape_rule(operand, axes): +def _reduce_op_shape_rule(operand, axes): return tuple(onp.delete(operand.shape, axes)) def _reduce_prod_translation_rule(c, operand, axes): @@ -3559,7 +3520,7 @@ def _reduce_prod_jvp_rule(tangent, operand, axes): return _reduce_sum(mul(tangent, mul(left_products, right_products)), (0,)) reduce_prod_p = standard_primitive( - _reduce_prod_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_prod'), + _reduce_op_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_prod'), 'reduce_prod', _reduce_prod_translation_rule) ad.defjvp(reduce_prod_p, _reduce_prod_jvp_rule) batching.defreducer(reduce_prod_p) @@ -3586,7 +3547,7 @@ def _reduce_chooser_jvp_rule(g, ans, operand, axes): _reduce_max_translation_rule = partial(_reduce_chooser_translation_rule, max_p, _get_max_identity) -reduce_max_p = standard_primitive(_reduce_chooser_shape_rule, _input_dtype, +reduce_max_p = standard_primitive(_reduce_op_shape_rule, _input_dtype, 'reduce_max', _reduce_max_translation_rule) ad.defjvp2(reduce_max_p, _reduce_chooser_jvp_rule) batching.defreducer(reduce_max_p) @@ -3594,7 +3555,7 @@ def _reduce_chooser_jvp_rule(g, ans, operand, axes): _reduce_min_translation_rule = partial( _reduce_chooser_translation_rule, min_p, _get_min_identity) -reduce_min_p = standard_primitive(_reduce_chooser_shape_rule, _input_dtype, +reduce_min_p = standard_primitive(_reduce_op_shape_rule, _input_dtype, 'reduce_min', _reduce_min_translation_rule) ad.defjvp2(reduce_min_p, _reduce_chooser_jvp_rule) batching.defreducer(reduce_min_p) @@ -4150,7 +4111,7 @@ def _tie_in_batch_rule(batched_args, batch_dims): xla.translations[tie_in_p] = lambda c, x, y: y ad.deflinear(tie_in_p, _tie_in_transpose_rule) batching.primitive_batchers[tie_in_p] = _tie_in_batch_rule -masking.shape_rules[tie_in_p] = lambda shape_exprs: shape_exprs[1] +masking.shape_rules[tie_in_p] = lambda x, y: y.shape masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] @@ -4280,7 +4241,8 @@ def _dilate_shape(shape, dilation): return onp.where(shape == 0, 0, onp.multiply(dilation, onp.subtract(shape, 1)) + 1) - +def _ceil_divide(x1, x2): + return -onp.floor_divide(onp.negative(x1), x2) def padtype_to_pads(in_shape, window_shape, window_strides, padding): """Convert padding string to list of pairs of pad values.""" @@ -4295,10 +4257,9 @@ def padtype_to_pads(in_shape, window_shape, window_strides, padding): raise RuntimeError(msg.format(padding)) if padding == PaddingType.SAME: - out_shape = onp.ceil(onp.true_divide(in_shape, window_strides)).astype(int) - pad_sizes = [_max((out_size - 1) * stride + window_shape - in_size, 0) - for out_size, stride, window_shape, in_size - in zip(out_shape, window_strides, window_shape, in_shape)] + out_shape = _ceil_divide(in_shape, window_strides) + pad_sizes = onp.maximum(0, (out_shape - 1) * window_strides + + window_shape - in_shape) return [(pad_size // 2, pad_size - pad_size // 2) for pad_size in pad_sizes] elif padding == PaddingType.VALID: return [(0, 0)] * len(in_shape) @@ -4358,7 +4319,7 @@ def conv_shape_tuple(lhs_shape, rhs_shape, strides, pads): lhs_padded = onp.add(lhs_shape[2:], onp.sum(onp.array(pads).reshape(-1, 2), axis=1)) out_space = onp.floor_divide( - onp.subtract(lhs_padded, rhs_shape[2:]), strides) + 1 + onp.subtract(lhs_padded, rhs_shape[2:]), strides) + 1 out_space = onp.maximum(0, out_space) out_shape = (lhs_shape[0], rhs_shape[0]) + tuple(out_space) return tuple(out_shape) @@ -4393,8 +4354,7 @@ def conv_transpose_shape_tuple(lhs_shape, rhs_shape, window_strides, padding, def _check_shapelike(fun_name, arg_name, obj): """Check that `obj` is a shape-like value (e.g. tuple of nonnegative ints).""" - if (type(obj) is masking.ShapeExpr - or type(obj) is tuple and any(type(d) is masking.Poly for d in obj)): + if (type(obj) is tuple and masking.is_polymorphic(obj)): return obj if not isinstance(obj, (tuple, list, onp.ndarray)): msg = "{} {} must be of type tuple/list/ndarray, got {}." diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 73e3b8075fee..519bd1a2b555 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -855,17 +855,17 @@ def _scan_batching_rule(args, dims, forward, length, jaxpr, num_consts, ys_bdims = [1 if b else batching.not_mapped for b in ys_batched] return outs, carry_bdims + ys_bdims -def _scan_polymorphic_shape_rule(shape_exprs, forward, length, jaxpr, - num_consts, num_carry, linear): - const_shexprs, init_shexprs, xs_shexprs = split_list(shape_exprs, [num_consts, num_carry]) +def _scan_shape_rule(shapes, forward, length, jaxpr, + num_consts, num_carry, linear): + const_shexprs, init_shexprs, xs_shexprs = split_list(shapes, [num_consts, num_carry]) _, y_avals = split_list(jaxpr.out_avals, [num_carry]) - ys_shapes = [ShapeExpr(length, *y_aval.shape) for y_aval in y_avals] + ys_shapes = [tuple(length, *y_aval.shape) for y_aval in y_avals] return init_shexprs + ys_shapes def _scan_masking_rule(shape_envs, padded_vals, shape_exprs, forward, length, jaxpr, num_consts, num_carry, linear): - out_shape = _scan_polymorphic_shape_rule(shape_exprs, forward, length, jaxpr, - num_consts, num_carry, linear) + out_shape = _scan_shape_rule(shape_exprs, forward, length, jaxpr, + num_consts, num_carry, linear) dynamic_length = masking.eval_dim_expr(shape_envs.logical, length) masked_jaxpr = _masked_scan_jaxpr(jaxpr, num_consts, num_carry) consts, init, xs = split_list(padded_vals, [num_consts, num_carry]) diff --git a/tests/masking_test.py b/tests/masking_test.py index d15431f61ff0..dfa9a6ddd297 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -23,8 +23,9 @@ from absl.testing import absltest from absl.testing import parameterized -from jax import test_util as jtu -from jax.interpreters.masking import ShapeError, shape_as_value, parse_spec +from jax import test_util as jtu, core as jc, api +from jax.interpreters.masking import ShapeError, shape_as_value, parse_spec, \ + constant_poly, Mon, Poly, parse_id from jax import mask, vmap, jit, grad, shapecheck from jax import lax import jax.numpy as np @@ -44,6 +45,8 @@ class MaskingTest(jtu.JaxTestCase): ['m * n', 'ShapeSpec(m n)'], ['(m * n,)', 'ShapeSpec(m n)'], ['(3, m)', 'ShapeSpec(3, m)'], + ['(10, m)', 'ShapeSpec(10, m)'], + ['(-10, m)', 'ShapeSpec(-10, m)'], ['(3 * m)', 'ShapeSpec(3 m)'], ['m', 'ShapeSpec(m)'], ['', 'ShapeSpec()'], @@ -56,7 +59,67 @@ class MaskingTest(jtu.JaxTestCase): def test_shape_parsing(self, spec, ans): self.assertEqual(str(parse_spec(spec)), ans) - def test_dot_shape_checking(self): + def test_poly_equal(self): + assert constant_poly(3) == 3 + assert onp.array(3, onp.int64) == constant_poly(3) + assert onp.array(3, onp.int64)[()] == constant_poly(3) + assert not onp.array(3, onp.int64) != constant_poly(3) + assert constant_poly(4) != 3 + assert 3 == constant_poly(3) + assert 4 != constant_poly(3) + assert constant_poly(4) == constant_poly(4) + assert constant_poly(3) != constant_poly(4) + assert Poly({Mon(): 3, Mon({'n': 1}): 4}) == Poly({Mon({'n': 1}): 4, Mon(): 3}) + assert Poly({Mon(): 3, Mon({'n': 1}): 4}) != Poly({Mon(): 3, Mon({'n': 2}): 4}) + assert Poly({Mon(): 3, Mon({'m': 1}): 4}) != Poly({Mon(): 3, Mon({'n': 1}): 4}) + + def test_poly_compare(self): + poly = Poly({Mon(): 3, Mon({'n': 1}): 4}) + # Assume poly > 0 to make various shape rules work with polymorphic shapes: + assert poly >= 0 + assert poly >= 1 + assert poly > 0 + + assert 0 <= poly + assert 0 < poly + assert constant_poly(3) >= 1 + assert constant_poly(3) > 1 + self.assertRaisesRegex(ValueError, "", lambda: poly >= 2) + self.assertRaisesRegex(ValueError, "", lambda: poly > 1) + + def test_poly_divmod(self): + n = parse_id('n') + assert (n, 1) == divmod(2*n+1, 2) + assert (2*n, 0) == divmod(10*n, 5) + assert (2*n+4, 3) == divmod(10*n+23, 5) + + def test_shapecheck_add_broadcast(self): + @shapecheck(['(m, n)', 'n'], '(m, n)') + @shapecheck(['n', ''], 'n') + def add(a, b): + return a + b + + def test_shapecheck_sum(self): + @shapecheck(['(m, n)'], '') + def sum(x): + return np.sum(x) + + def test_shapecheck_prod(self): + @shapecheck(['(m, n)'], '') + def prod(x): + return np.prod(x) + + def test_shapecheck_max(self): + @shapecheck(['(m, n)'], '') + def prod(x): + return np.max(x) + + def test_shapecheck_min(self): + @shapecheck(['(m, n)'], '') + def prod(x): + return np.min(x) + + def test_shapecheck_dot(self): @shapecheck(['(m, n)', 'n'], 'm') def matvec(A, b): return np.dot(A, b) @@ -65,14 +128,14 @@ def thunk(): @shapecheck(['(m, n)', 'n'], 'm') def matvec(A, b): return lax.dot_general(A, b, [((0,), (0,)), ((), ())]) - self.assertRaisesRegex(ShapeError, "", thunk) + self.assertRaisesRegex(TypeError, "", thunk) - def test_flatten_shape_checking(self): + def test_shapecheck_flatten(self): @shapecheck(['(m, n)'], 'm * n') def flatten(x): return lax.reshape(x, (x.shape[0] * x.shape[1],)) - def test_concatenate_shape_checking(self): + def test_shapecheck_concatenate(self): @shapecheck(['m', 'n', 'm'], '3*m + n') def cat(x, y, z): return lax.concatenate([x, y, x, z], 0) @@ -83,6 +146,91 @@ def cat(x, y, z): return lax.concatenate([x, y, x], 0) self.assertRaisesRegex(ShapeError, "", thunk) + def test_shapecheck_device_put(self): + @shapecheck(['n'], 'n') + def d_put(x): + return api.device_put(x) + + def test_shapecheck_broadcast_in_dim(self): + x = np.zeros((7, 1)) + lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) + @shapecheck(['(n, 1)'], '(3, n, 4)') + def broadcast_in_dim(x): + return lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) + + def test_shapecheck_jit(self): + @shapecheck(['n'], '2*n') + @jit + def concat(x): + return lax.concatenate([x, x], 0) + + def test_shapecheck_pad(self): + @shapecheck(['n'], '2*n+1') + def p(x): + return lax.pad(x, 0, [(1, 1, 1)]) + + def test_shapecheck_numpy_pad(self): + @shapecheck(['n'], 'n+1') + def p(x): + return np.pad(x, (0, 1)) + + @parameterized.named_parameters(jtu.cases_from_list( + { + 'testcase_name': "strides={}_padding={}_lhs_dilation={}_dimension_numbers" + "={}_lhs_perm={}_rhs_perm={}_out_perm={}".format( + strides, padding, lhs_dilation, dimension_numbers, lhs_perm, rhs_perm, out_perm), + 'strides': strides, 'padding': padding, 'lhs_dilation': lhs_dilation, + 'dimension_numbers': dimension_numbers, 'lhs_perm': lhs_perm, + 'rhs_perm': rhs_perm, 'out_perm': out_perm} + for strides in [(1, 1), (2, 1)] + for padding in ['SAME', 'VALID', ((1, 0), (2, 0))] + for lhs_dilation in (None, (1, 2)) + for dimension_numbers, (lhs_perm, rhs_perm, out_perm) in ( + (("NCHW", "OIHW", "NCHW"), ((0, 1, 2, 3), (0, 1, 2, 3), (0, 1, 2, 3))), + (("NHWC", "HWIO", "NHWC"), ((0, 2, 3, 1), (2, 3, 1, 0), (0, 2, 3, 1))), + (("NCHW", "HWIO", "NHWC"), ((0, 1, 2, 3), (2, 3, 1, 0), (0, 2, 3, 1))) + ) + # String padding is not implemented for transposed convolution, see conv_general_dilated implementation: + if (lhs_dilation is None or not isinstance(padding, str)) and + # only test strides with same padding: + (strides[0] == 1 or padding == 'SAME'))) + def test_shapecheck_conv(self, strides, padding, lhs_dilation, + dimension_numbers, lhs_perm, rhs_perm, out_perm): + valid = padding == 'VALID' + is_strided = strides[0] != 1 + lhs_shape = '({}, {}, {}, {})'.format(*onp.take(['n', 'i', '2*h' if is_strided else 'h', 'w'], lhs_perm)) + rhs_shape = '({}, {}, {}, {})'.format(*onp.take(['o', 'i', '2', '3'], rhs_perm)) + out_shape = '({}, {}, {}, {})'.format(*onp.take([ + 'n', 'o', 'h+-1' if valid and not is_strided else 'h', + ('w+-2' if valid else 'w') if lhs_dilation is None else '2*w+-1'], out_perm)) + + @shapecheck([lhs_shape, rhs_shape], out_shape) + def conv(lhs, rhs): + return lax.conv_general_dilated( + lhs, rhs, strides, padding, + lhs_dilation=lhs_dilation, dimension_numbers=dimension_numbers) + + # TODO: + def DISABLED_shapecheck_slicing(self): + @shapecheck(['n'], 'n+-1') + def slice(x): + return x[1:] + + @shapecheck(['n'], 'n+-1') + def slice(x): + return x[:-1] + + def test_shapecheck_unsupported_op(self): + p = jc.Primitive('unsupported_op') + p.def_impl(lambda x: x) + + def thunk(): + @shapecheck(['n'], 'n') + def identity(x): + return p.bind(x) + + self.assertRaisesRegex(NotImplementedError, "Shape rule for unsupported_op not implemented yet.", thunk) + def test_sum(self): @partial(mask, in_shapes=['n'], out_shape='') def padded_sum(x): From 335ecb97b838ea0185c26ec744d63c3a096a858b Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Wed, 15 Jan 2020 18:06:31 -0800 Subject: [PATCH 0619/1053] test JVP of while loop, and fix the nonzero tangent calculation in the JVP rule --- jax/lax/lax_control_flow.py | 8 ++-- tests/lax_control_flow_test.py | 73 ++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 6d0974a51bcd..7aa551fc1a3e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -314,16 +314,16 @@ def _while_loop_jvp(primals, tangents, cond_nconsts, cond_jaxpr, body_nconsts, carry_nz = init_nz for _ in range(1 + len(carry_nz)): - nonzeros = bconst_nz + carry_nz + body_nonzeros = bconst_nz + carry_nz body_jvp, nonzeros_out = ad.jvp_jaxpr( - body_jaxpr, nonzeros, instantiate=carry_nz) + body_jaxpr, body_nonzeros, instantiate=carry_nz) if nonzeros_out == carry_nz: break - else: - carry_nz = _map(operator.or_, carry_nz, nonzeros_out) + carry_nz = _map(operator.or_, carry_nz, nonzeros_out) else: assert False, "Fixpoint not reached" + nonzeros = cconst_nz + body_nonzeros tangents = [ad.instantiate_zeros(x, t) if t is ad_util.zero and nz else t for x, t, nz in zip(primals, tangents, nonzeros)] diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 8e4f8c815c89..17e20e2d3153 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -42,6 +42,12 @@ config.parse_flags_with_absl() +def while_loop_reference(cond, body, carry): + while cond(carry): + carry = body(carry) + return carry + + def scan_reference(f, init, xs): carry = init ys = [] @@ -1117,6 +1123,73 @@ def testWhileCondConstant(self): out = lax.while_loop(lambda _: False, lambda _: (), ()) # doesn't crash self.assertEqual(out, ()) + @parameterized.named_parameters( + {"testcase_name": "_jit_loop={}_jit_body={}_jit_cond={}".format( + jit_loop, jit_body, jit_cond), + "jit_loop": jit_loop, "jit_body": jit_body, "jit_cond": jit_cond} + for jit_loop in [False, True] + for jit_body in [False, True] + for jit_cond in [False, True]) + def testWhileJVP(self, jit_loop, jit_body, jit_cond): + cond = lambda x: x[0, 2] <= 8 + body = lambda x: x * x + + if jit_cond: + cond = api.jit(cond) + if jit_body: + body = api.jit(body) + + loop = partial(lax.while_loop, cond, body) + if jit_loop: + loop = api.jit(loop) + + loop_ref = partial(while_loop_reference, cond, body) + + x = np.arange(9.).reshape((3, 3)) + ans = api.jvp(loop, (x,), (x,)) + expected = api.jvp(loop_ref, (x,), (x,)) + self.assertAllClose(ans, expected, check_dtypes=False) + + jtu.check_grads(loop, (x,), order=2, modes=["fwd"]) + + def testWhileJVPViaForiLoop(self): + f = lambda x: lax.fori_loop(0, 3, lambda i, x: x * 2, x) + self.assertAllClose(f(2.), 16., check_dtypes=False) + self.assertAllClose(api.jvp(f, (2.,), (1.,)), (16., 8.), check_dtypes=False) + jtu.check_grads(f, (2.,), order=2, modes=["fwd"]) + + f = lambda x: lax.fori_loop(0, 3, lambda i, x: x * (i + 1), x) + self.assertAllClose(f(2.), 12., check_dtypes=False) + self.assertAllClose(api.jvp(f, (2.,), (1.,)), (12., 6.), check_dtypes=False) + jtu.check_grads(f, (2.,), order=2, modes=["fwd"]) + + def testWhileJVPWithGrowingNonzeroTangents(self): + rng = onp.random.RandomState(0) + + def cond(state): + i, x, y, z = state + return i < 2 + + def body(state): + i, x, y, z = state + y = x * x + z = y * y + return i + 1, x, y, z + + y, z = rng.randn(2), rng.randn(2) + def loop(loop_impl, x): + return loop_impl(cond, body, (0, x, y, z))[1] + + loop_lax = partial(loop, lax.while_loop) + loop_ref = partial(loop, while_loop_reference) + + x = rng.randn(2) + ans = api.jvp(loop_lax, (x,), (x,)) + expected = api.jvp(loop_ref, (x,), (x,)) + self.assertAllClose(ans, expected, check_dtypes=False) + + jtu.check_grads(loop_lax, (x,), order=2, modes=["fwd"]) + def testIssue1316(self): def f(carry, _): c, key = carry From 71323b5d023a33bf8c06d435c4a6e406dea3c0a8 Mon Sep 17 00:00:00 2001 From: Surya Bulusu Date: Fri, 17 Jan 2020 07:17:15 +0530 Subject: [PATCH 0620/1053] changes loop_mjp(f, x, M) (#2013) a minor change: we iterate over M and not S --- docs/notebooks/autodiff_cookbook.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index a40a66b85ea8..75d7e75530dd 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -1175,7 +1175,7 @@ "def loop_jmp(f, x, M):\n", " # jvp immediately returns the primal and tangent values as a tuple,\n", " # so we'll compute and select the tangents in a list comprehension\n", - " return np.vstack([jvp(f, (W,), (si,))[1] for si in S])\n", + " return np.vstack([jvp(f, (W,), (si,))[1] for si in M])\n", "\n", "def vmap_jmp(f, x, M):\n", " _jvp = lambda s: jvp(f, (W,), (s,))[1]\n", From 3974df0aeeeb89d74ee6832894ab153406626266 Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Fri, 17 Jan 2020 17:48:27 +0000 Subject: [PATCH 0621/1053] [docs] Pmap compiles functions with XLA (#2021) --- README.md | 4 +++- jax/api.py | 13 +++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9a9d7a0d7b0e..043dcfa0a844 100644 --- a/README.md +++ b/README.md @@ -261,7 +261,9 @@ differentiation for fast Jacobian and Hessian matrix calculations in For parallel programming of multiple accelerators, like multiple GPUs, use [`pmap`](https://jax.readthedocs.io/en/latest/jax.html#parallelization-pmap). With `pmap` you write single-program multiple-data (SPMD) programs, including -fast parallel collective communication operations. +fast parallel collective communication operations. Applying `pmap` will mean +that the function you write is compiled by XLA (similarly to `jit`), then +replicated and executed in parallel accross devices. Here's an example on an 8-GPU machine: diff --git a/jax/api.py b/jax/api.py index 88c78a3b0e33..7250119825ba 100644 --- a/jax/api.py +++ b/jax/api.py @@ -721,12 +721,13 @@ def pmap(fun, axis_name=None, devices=None, backend=None, axis_size=None): """Parallel map with support for collectives. The purpose of ``pmap`` is to express single-program multiple-data (SPMD) - programs and execute them in parallel on XLA devices, such as multiple GPUs or - multiple TPU cores. Semantically it is comparable to ``vmap`` because both - transformations map a function over array axes, but where ``vmap`` vectorizes - functions by pushing the mapped axis down into primitive operations, ``pmap`` - instead replicates the function and executes each replica on its own XLA - device in parallel. + programs. Applying ``pmap`` to a function will compile the function with XLA + (similarly to ``jit``), then execute it in parallel on XLA devices, such as + multiple GPUs or multiple TPU cores. Semantically it is comparable to + ``vmap`` because both transformations map a function over array axes, but + where ``vmap`` vectorizes functions by pushing the mapped axis down into + primitive operations, ``pmap`` instead replicates the function and executes + each replica on its own XLA device in parallel. Another key difference with ``vmap`` is that while ``vmap`` can only express pure maps, ``pmap`` enables the use of parallel SPMD collective operations, From 371001aad1d6235e86e8825286b7fa2eb1f0fdb2 Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Fri, 17 Jan 2020 17:48:56 +0000 Subject: [PATCH 0622/1053] Fix README typo (#2020) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 043dcfa0a844..e0244d826c53 100644 --- a/README.md +++ b/README.md @@ -282,7 +282,7 @@ print(pmap(np.mean)(result)) # prints [1.1566595 1.1805978 ... 1.2321935 1.2015157] ``` -In addition to expressing pure maps, you can fast use [collective communication +In addition to expressing pure maps, you can use fast [collective communication operations](https://jax.readthedocs.io/en/latest/jax.lax.html#parallel-operators) between devices: From 19fb494adbd4cefc984f08edf1982e644fe4a2b1 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 17 Jan 2020 11:34:59 -0800 Subject: [PATCH 0623/1053] Add jax changelog (#2022) --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000000..786ca68a3567 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +These are the release notes for JAX. + +## jax 0.1.58 (unreleased) + +### Breaking changes + +### New features + +- Forward AD of while loop (https://github.com/google/jax/pull/1980) + +### Notable bug fixes From 7dbc8dc1bc1bec13408c02d9415f001eabc7595e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 18 Jan 2020 08:26:23 -0500 Subject: [PATCH 0624/1053] Minimal changes to make Jax pass a pytype check. (#2024) --- jax/BUILD | 22 +++++++++++++++------- jax/ad_util.py | 3 --- jax/api.py | 21 +++++++++------------ jax/core.py | 2 +- jax/experimental/loops.py | 4 +++- jax/interpreters/ad.py | 4 +++- jax/interpreters/masking.py | 4 ++-- jax/interpreters/pxla.py | 25 ++++++++++++------------- jax/interpreters/xla.py | 9 ++++++--- jax/lax/lax.py | 9 +++++---- jax/lax/lax_control_flow.py | 12 +++++++----- jax/lax/lax_parallel.py | 12 +++++++----- jax/lazy.py | 5 ++++- jax/lib/__init__.py | 2 +- jax/linear_util.py | 4 ++-- jax/numpy/lax_numpy.py | 1 + jax/numpy/linalg.py | 5 +++-- tests/api_test.py | 6 +++--- tests/batching_test.py | 1 + tests/lax_numpy_test.py | 9 ++++++--- tests/lax_test.py | 11 ++++++++--- tests/masking_test.py | 2 +- tests/multibackend_test.py | 10 +++++----- tests/parallel_test.py | 2 +- tests/random_test.py | 1 + 25 files changed, 107 insertions(+), 79 deletions(-) diff --git a/jax/BUILD b/jax/BUILD index 4485599bd650..3e3c7f1e97b2 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -14,13 +14,15 @@ # JAX is Autograd and XLA +pytype_library = py_library + licenses(["notice"]) package(default_visibility = ["//visibility:public"]) # top-level EF placeholder -py_library( +pytype_library( name = "jax", srcs = glob( [ @@ -43,38 +45,44 @@ py_library( deps = ["@org_tensorflow//tensorflow/compiler/xla/python:xla_client"], ) -py_library( +pytype_library( name = "stax", srcs = ["experimental/stax.py"], + srcs_version = "PY3", deps = [":jax"], ) -py_library( +pytype_library( name = "optimizers", srcs = ["experimental/optimizers.py"], + srcs_version = "PY3", deps = [":jax"], ) -py_library( +pytype_library( name = "optix", srcs = ["experimental/optix.py"], + srcs_version = "PY3", deps = [":jax"], ) -py_library( +pytype_library( name = "ode", srcs = ["experimental/ode.py"], + srcs_version = "PY3", deps = [":jax"], ) -py_library( +pytype_library( name = "vectorize", srcs = ["experimental/vectorize.py"], + srcs_version = "PY3", deps = [":jax"], ) -py_library( +pytype_library( name = "loops", srcs = ["experimental/loops.py"], + srcs_version = "PY3", deps = [":jax"], ) diff --git a/jax/ad_util.py b/jax/ad_util.py index a98d102aa57c..00b9230aa3af 100644 --- a/jax/ad_util.py +++ b/jax/ad_util.py @@ -39,9 +39,6 @@ def add_impl(xs, ys): def add_abstract(xs, ys): return lattice_join(xs, ys) -def zeros_like_impl_jaxtuple(xs): - return JaxTuple(map(zeros_like_impl, xs)) - jaxval_zeros_likers = {} def zeros_like_aval(aval): diff --git a/jax/api.py b/jax/api.py index 7250119825ba..c52692618bcd 100644 --- a/jax/api.py +++ b/jax/api.py @@ -938,7 +938,7 @@ def f_pmapped(*args, **kwargs): msg = ("soft_pmap mapped axis size must be divisble by the number of " "XLA devices (or be less than or equal to that number), but got " "an axis size of {} with {} devices.") - raise ValueError(msg.format(axis_size, pxla.pxla.unmapped_device_count())) + raise ValueError(msg.format(axis_size, pxla.unmapped_device_count())) num_chunks = axis_size // chunk_size reshaped_args = [_reshape_split(num_chunks, x) for x in args_flat] @@ -1922,15 +1922,12 @@ def jaxpr_to_graphviz(jaxpr, consts): fragment.extend(map(constant_node, jaxpr.constvars, consts)) for eqn in jaxpr.eqns: - if eqn.destructure: - id_name = next(id_names) - fragment.append(function_node(id_name, eqn.primitive.name)) - fragment.extend(edge(invar, id_name) for invar in eqn.invars) - fragment.extend(edge(id_name, outvar) for outvar in eqn.outvars) - else: - fragment.append(function_node(eqn.outvars[0], eqn.primitive.name)) - fragment.extend(edge(invar, eqn.outvars[0]) for invar in eqn.invars) - fragment.append(outvar_node(jaxpr.outvar, "out")) + id_name = next(id_names) + fragment.append(function_node(id_name, eqn.primitive.name)) + fragment.extend(edge(invar, id_name) for invar in eqn.invars) + fragment.extend(edge(id_name, outvar) for outvar in eqn.outvars) + for ov in jaxpr.outvars: + fragment.append(outvar_node(ov, "out")) return graph(''.join(fragment)) edge = '{} -> {} [color=gray30];\n'.format @@ -1944,8 +1941,8 @@ def jaxpr_to_graphviz(jaxpr, consts): @wraps(fun) def graphviz_maker(*args, **kwargs): wrapped = lu.wrap_init(fun, kwargs) - jax_args, in_trees = unzip2(map(pytree_to_jaxtupletree, args)) - jaxtree_fun, out_tree = pytree_fun_to_jaxtupletree_fun(wrapped, in_trees) + jax_args, in_tree = tree_flatten((args, kwargs)) + jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) pvals = map(pv_like, jax_args) jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) return jaxpr_to_graphviz(jaxpr, consts) diff --git a/jax/core.py b/jax/core.py index 1f237d370c80..93d755222552 100644 --- a/jax/core.py +++ b/jax/core.py @@ -136,7 +136,7 @@ def __eq__(self, other): def __repr__(self): if self.hash is None: - return 'Literal(val={}, hashable={})'.format(self.val, self.hashable) + return 'Literal(val={})'.format(self.val) else: return '{}'.format(self.val) diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index 1f2df920523a..eefffbbf1807 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -112,6 +112,7 @@ def loop_body(i, acc_arr): import itertools import numpy as onp import traceback +from typing import Any, List, cast from jax import abstract_arrays from jax import lax, core @@ -287,7 +288,8 @@ def __init__(self, scope, loop_builder): self.loop_builder = loop_builder self.first_iteration = True # If we are tracing the first iteration # Stack trace, without this line and the s.range function - self.stack = traceback.StackSummary.from_list(traceback.extract_stack()[:-2]) + self.stack = traceback.StackSummary.from_list( + cast(List[Any], traceback.extract_stack()[:-2])) # Next are state kept from the start of the first iteration to the end of the iteration. self.carried_state_initial = {} diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 0c7016dba3e2..d83dd51aefa8 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -18,6 +18,7 @@ import functools import itertools as it +from typing import Any from . import partial_eval as pe from .. import core as core @@ -36,13 +37,14 @@ def identity(x): return x -def jvp(fun, has_aux=False, instantiate=True): +def jvp(fun, has_aux=False, instantiate=True) -> Any: if not has_aux: return jvpfun(jvp_subtrace(fun), instantiate) else: fun, aux = jvp_subtrace_aux(fun) return jvpfun(fun, instantiate), aux + @lu.transformation def jvpfun(instantiate, primals, tangents): with new_master(JVPTrace) as master: diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 366ca73a9b1e..d8c6de5b64af 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -142,11 +142,11 @@ def __rsub__(self, other): return self + -other def __floordiv__(self, divisor): - q, _ = divmod(self, divisor) + q, _ = divmod(self, divisor) # pytype: disable=wrong-arg-types return q def __mod__(self, divisor): - _, r = divmod(self, divisor) + _, r = divmod(self, divisor) # pytype: disable=wrong-arg-types return r def __divmod__(self, divisor): diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index eba0341a99d8..a29ce07b7748 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -286,19 +286,7 @@ def _axis_index_translation_rule(c, nreps, sizes, soft_size, axis_name): ### lazy device-memory persistence and result handling -class ShardedDeviceValue(xla.DeviceValue): - def _check_if_deleted(self): - if self.device_buffers is None: - raise ValueError("ShardedDeviceValue has been deleted.") - - def block_until_ready(self): - self._check_if_deleted() - for buf in self.device_buffers: - buf.block_host_until_ready() - return self - - -class ShardedDeviceArray(ShardedDeviceValue, xla.DeviceArray): +class ShardedDeviceArray(xla.DeviceArray): """A ShardedDeviceArray is an ndarray sharded across devices. The purpose of a ShardedDeviceArray is to reduce the number of transfers when @@ -346,6 +334,16 @@ def delete(self): self.device_buffers = None self._npy_value = None + def _check_if_deleted(self): + if self.device_buffers is None: + raise ValueError("ShardedDeviceArray has been deleted.") + + def block_until_ready(self): + self._check_if_deleted() + for buf in self.device_buffers: + buf.block_host_until_ready() + return self + @property def _value(self): if self._npy_value is None: @@ -757,6 +755,7 @@ def aval(self): if self.axis_name is not_mapped: return aval else: + assert isinstance(aval, ShapedArray) return ShapedArray(aval.shape[1:], aval.dtype) def full_lower(self): diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index c5801c475a3e..fa212ada1f3e 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -825,9 +825,9 @@ def __array__(self, dtype=None, context=None): __str__ = partialmethod(_forward_to_value, str) __bool__ = __nonzero__ = partialmethod(_forward_to_value, bool) - __float__ = partialmethod(_forward_to_value, float) - __int__ = partialmethod(_forward_to_value, int) - __complex__ = partialmethod(_forward_to_value, complex) + def __float__(self): return self._value.__float__() + def __int__(self): return self._value.__int__() + def __complex__(self): return self._value.__complex__() __hex__ = partialmethod(_forward_to_value, hex) __oct__ = partialmethod(_forward_to_value, oct) __index__ = partialmethod(_forward_to_value, op.index) @@ -841,6 +841,9 @@ def __eq__(self, other): return self._value == other def __hash__(self): raise TypeError("JAX DeviceArray, like numpy.ndarray, is not hashable.") + # The following methods are dynamically overridden in lax_numpy.py. + def __getitem__(self, i): raise NotImplementedError + class DeletedBuffer(object): pass deleted_buffer = DeletedBuffer() diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 6b7e537fa065..61d8096ff0d2 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -23,6 +23,7 @@ import itertools import operator import string +from typing import Any import warnings import numpy as onp @@ -678,7 +679,7 @@ def select(pred, on_true, on_false): """ return select_p.bind(pred, on_true, on_false) -def slice(operand, start_indices, limit_indices, strides=None): +def slice(operand: Any, start_indices, limit_indices, strides=None): """Wraps XLA's `Slice `_ operator. @@ -4180,8 +4181,8 @@ def infeed(token, shape=None): flat_shapes, treedef = pytree.flatten(shape) for shape in flat_shapes: if not isinstance(shape, ShapedArray): - raise TypeError("shapes argument to infeed must be a pytree of " - "ShapedArray values, got {}".format(shapes)) + raise TypeError("shape argument to infeed must be a pytree of " + "ShapedArray values, got {}".format(shape)) xs_and_token = infeed_p.bind(token, shapes=tuple(flat_shapes)) return (treedef.unflatten(xs_and_token[:-1]), xs_and_token[-1]) @@ -4387,7 +4388,7 @@ def _dynamic_slice_indices(operand, start_indices): if len(start_indices) != operand.ndim: msg = ("Length of slice indices must match number of operand dimensions ({} " "vs {})") - raise ValueError(msg.format(len(start_indices, operand.shape))) + raise ValueError(msg.format(len(start_indices), operand.shape)) # map int over operand.shape to raise any dynamic-shape errors return [select(lt(i, _const(i, 0)), add(i, _const(i, int(d))), i) for i, d in zip(start_indices, operand.shape)] diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 645367c83c68..656fde235c46 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -362,8 +362,9 @@ def _while_loop_jvp(primals, tangents, cond_nconsts, cond_jaxpr, body_nconsts, body_jaxpr=body_jvp_rearranged) out_carry, out_carry_dot = split_list(out, [num_carry]) - out_tangents = iter(out_carry_dot) - out_tangents = [next(out_tangents) if nz else ad_util.zero for nz in nonzeros_out] + out_tangents_iter = iter(out_carry_dot) + out_tangents = [next(out_tangents_iter) if nz else ad_util.zero + for nz in nonzeros_out] return out_carry, out_tangents while_p = lax.Primitive('while') @@ -701,8 +702,9 @@ def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, carry, carry_dot, ys, ys_dot = split_list(out_flat, [num_carry, len(init_dot), num_ys]) primals_out = carry + ys - tangents_out = iter(carry_dot + ys_dot) - tangents_out = [next(tangents_out) if nz else ad_util.zero for nz in nonzeros_out] + tangents_out_iter = iter(carry_dot + ys_dot) + tangents_out = [next(tangents_out_iter) if nz else ad_util.zero + for nz in nonzeros_out] return primals_out, tangents_out def _prune_zeros(ts): @@ -919,7 +921,7 @@ def _scan_shape_rule(shapes, forward, length, jaxpr, num_consts, num_carry, linear): const_shexprs, init_shexprs, xs_shexprs = split_list(shapes, [num_consts, num_carry]) _, y_avals = split_list(jaxpr.out_avals, [num_carry]) - ys_shapes = [tuple(length, *y_aval.shape) for y_aval in y_avals] + ys_shapes = [(length,) + tuple(y_aval.shape) for y_aval in y_avals] return init_shexprs + ys_shapes def _scan_masking_rule(shape_envs, padded_vals, shape_exprs, forward, length, diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 0aeb19524edf..19076e3a6243 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -619,12 +619,14 @@ def _add_jaxvals_papply_rule(name, size, vals, dims): xdim, ydim = dims if xdim == ydim: out_dim = xdim - elif ydim is None: - y = lax.psplit_like(y, x, name) - out_dim = xdim else: - x = lax.psplit_like(x, y, name) - out_dim = ydim + raise NotImplementedError + # elif ydim is None: + # y = lax.psplit_like(y, x, name) + # out_dim = xdim + # else: + # x = lax.psplit_like(x, y, name) + # out_dim = ydim return ad_util.add_jaxvals_p.bind(x, y), out_dim diff --git a/jax/lazy.py b/jax/lazy.py index 8115c7bc0d24..2dca052d5272 100644 --- a/jax/lazy.py +++ b/jax/lazy.py @@ -19,6 +19,7 @@ from collections import namedtuple import functools import operator as op +from typing import Any, Callable import numpy as onp @@ -32,7 +33,7 @@ ### util # TODO(mattjj): replace with dataclass when Python 2 support is removed -def taggedtuple(name, fields): +def taggedtuple(name, fields) -> Callable[..., Any]: """Lightweight version of namedtuple where equality depends on the type.""" def __new__(cls, *xs): return tuple.__new__(cls, (cls,) + xs) @@ -99,12 +100,14 @@ def __str__(self): # hash(A(1, 2)) == hash(B(1, 2)) # True # but we want hashes to be sensitive to the type tag (while still being fast). +# pytype: disable=wrong-arg-count LazyExpr = namedtuple('LazyExpr', ['input', 'shape', 'dims']) ArrayVar = taggedtuple('ArrayVar', []) Iota = taggedtuple('Iota', ['dtype', 'size']) # like np.arange(N) Eye = taggedtuple('Eye', ['dtype', 'shape', 'offset']) # like np.eye Tri = taggedtuple('Tri', ['dtype', 'shape', 'offset']) # like np.tri Delta = taggedtuple('Delta', ['dtype', 'shape']) # kronecker delta arrays +# pytype: enable=wrong-arg-count def array(shape): return LazyExpr(ArrayVar(), shape, tuple(range(len(shape)))) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 55f97888aa55..26939002fe8e 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -45,7 +45,7 @@ def _check_jaxlib_version(): try: - from jaxlib import tpu_client + from jaxlib import tpu_client # pytype: disable=import-error except: tpu_client = None from jaxlib import xla_client diff --git a/jax/linear_util.py b/jax/linear_util.py index 3be976214014..b7f191c9ec3a 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -175,7 +175,7 @@ def __eq__(self, other): self.params == other.params) @curry -def transformation(gen, fun, *gen_static_args): +def transformation(gen, fun: WrappedFun, *gen_static_args): """Adds one more transformation to a WrappedFun. Args: gen: the transformation generator function @@ -185,7 +185,7 @@ def transformation(gen, fun, *gen_static_args): return fun.wrap(gen, gen_static_args, None) @curry -def transformation_with_aux(gen, fun, *gen_static_args): +def transformation_with_aux(gen, fun: WrappedFun, *gen_static_args): """Adds one more transformation with auxiliary output to a WrappedFun.""" out_store = Store() out_thunk = lambda: out_store.val diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0b5ae04125c3..b51273982af9 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +# pytype: skip-file """ Implements the NumPy API, using the primitives in :mod:`jax.lax`. diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index f4fc5070df9a..99f3c5df3c7c 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -21,6 +21,7 @@ import numpy as onp import warnings import textwrap +from typing import Tuple, Union, cast from jax import jit from .. import lax @@ -173,7 +174,7 @@ def inv(a): @partial(jit, static_argnums=(1, 2, 3)) -def _norm(x, ord, axis, keepdims): +def _norm(x, ord, axis: Union[None, Tuple[int, ...], int], keepdims): x = _promote_arg_dtypes(np.asarray(x)) x_shape = np.shape(x) ndim = len(x_shape) @@ -214,7 +215,7 @@ def _norm(x, ord, axis, keepdims): return np.power(out, 1. / ord) elif num_axes == 2: - row_axis, col_axis = axis + row_axis, col_axis = cast(Tuple[int, ...], axis) if ord is None or ord in ('f', 'fro'): return np.sqrt(np.sum(np.real(x * np.conj(x)), axis=axis, keepdims=keepdims)) diff --git a/tests/api_test.py b/tests/api_test.py index 38351853ba42..39f53f81a049 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -527,11 +527,11 @@ def f(x, y): return x + y self.assertRaisesRegex( TypeError, "primal and tangent arguments to jax.jvp must be tuples or lists; found float and tuple.", - lambda: partial(api.jvp(f, 0., (1.,)))) + lambda: api.jvp(f, 0., (1.,))) self.assertRaisesRegex( TypeError, "primal and tangent arguments to jax.jvp must be tuples or lists; found tuple and ndarray.", - lambda: partial(api.jvp(f, (0.,), onp.array([1., 2.])))) + lambda: api.jvp(f, (0.,), onp.array([1., 2.]))) def test_vjp_mismatched_arguments(self): _, pullback = api.vjp(lambda x, y: x * y, onp.float32(3), onp.float32(4)) @@ -1712,7 +1712,7 @@ def make_computation_builder_and_count(*args, **kwargs): @jtu.skip_on_devices("tpu") def test_lazy_jit_closed_over_values(self): if not core.skip_checks: - raise SkipTest("oom test skipped when core.skip_checks is False") + raise unittest.SkipTest("oom test skipped when core.skip_checks is False") y = np.arange(int(1e12)) # will likely oom if materialized ans = jit(lambda x: (x + y)[1])(1) diff --git a/tests/batching_test.py b/tests/batching_test.py index 9a8fd0d2e71e..0d73bd02c522 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -20,6 +20,7 @@ from absl.testing import absltest from absl.testing import parameterized +import jax import jax.numpy as np from jax import test_util as jtu from jax.abstract_arrays import ShapedArray diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 7fc1825b318a..9dbe3bdcc5db 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -21,6 +21,7 @@ from functools import partial import itertools import operator +from typing import cast, Optional import unittest from unittest import SkipTest import warnings @@ -493,7 +494,7 @@ def testOperatorOverload(self, name, rng_factory, shapes, dtypes, tol): def testRightOperatorOverload(self, name, rng_factory, shapes, dtypes, op_tolerance): if shapes[1] is jtu.PYTHON_SCALAR_SHAPE: - raise SkipTest() # TODO(mattjj): clean up + raise SkipTest("scalars not implemented") # TODO(mattjj): clean up rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes, onp_arrays=False) fun = lambda fst, snd: getattr(snd, name)(fst) @@ -1815,7 +1816,8 @@ def testRoll(self, shape, dtype, shifts, axis, rng_factory): "index_dtype": index_dtype, "axis": axis, "mode": mode} for shape in [(3,), (3, 4), (3, 4, 5)] for index_shape in scalar_shapes + [(3,), (2, 1, 3)] - for axis in itertools.chain(range(-len(shape), len(shape)), [None]) + for axis in itertools.chain(range(-len(shape), len(shape)), + [cast(Optional[int], None)]) for dtype in all_dtypes for index_dtype in int_dtypes for mode in ['wrap', 'clip'] @@ -1844,7 +1846,8 @@ def args_maker(): _shapes_are_equal_length, filter(_shapes_are_broadcast_compatible, CombosWithReplacement(nonempty_nonscalar_array_shapes, 2))) - for axis in itertools.chain(range(len(x_shape)), [-1], [None]) + for axis in itertools.chain(range(len(x_shape)), [-1], + [cast(Optional[int], None)]) for dtype in default_dtypes for rng_factory in [jtu.rand_default])) def testTakeAlongAxis(self, x_shape, i_shape, dtype, axis, rng_factory): diff --git a/tests/lax_test.py b/tests/lax_test.py index aadba64d203a..25ff95f5eb55 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -20,6 +20,7 @@ import functools from functools import partial import itertools +from typing import Optional, cast from unittest import skip, SkipTest from absl.testing import absltest @@ -28,6 +29,7 @@ import numpy as onp import numpy.random as npr +import jax from jax import api from jax import core from jax import dtypes @@ -2524,7 +2526,8 @@ def testRemainder(self): def all_bdims(*shapes): - bdims = (itertools.chain([None], range(len(shape) + 1)) for shape in shapes) + bdims = (itertools.chain([cast(Optional[int], None)], + range(len(shape) + 1)) for shape in shapes) return (t for t in itertools.product(*bdims) if not all(e is None for e in t)) def add_bdim(bdim_size, bdim, shape): @@ -2603,8 +2606,10 @@ def testOp(self, op_name, rng_factory, shapes, dtype, bdims): (("NCHW", "OIHW", "NCHW"), ([0, 1, 2, 3], [0, 1, 2, 3])), (("NHWC", "HWIO", "NHWC"), ([0, 2, 3, 1], [2, 3, 1, 0])), (("NHWC", "OIHW", "NCHW"), ([0, 2, 3, 1], [0, 1, 2, 3]))] - for lhs_bdim in itertools.chain([None], range(len(lhs_shape) + 1)) - for rhs_bdim in itertools.chain([None], range(len(rhs_shape) + 1)) + for lhs_bdim in itertools.chain([cast(Optional[int], None)], + range(len(lhs_shape) + 1)) + for rhs_bdim in itertools.chain([cast(Optional[int], None)], + range(len(rhs_shape) + 1)) if (lhs_bdim, rhs_bdim) != (None, None) for rng_factory in [jtu.rand_default] )) diff --git a/tests/masking_test.py b/tests/masking_test.py index dfa9a6ddd297..ee920d2908b6 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -437,7 +437,7 @@ def step(h, x): ans = grad(lambda W: vmap(rnn, ((None, 0, 0), 0))((W, seqs, ys), dict(t=ts)).sum())(W) def rnn_reference(W, seqs, targets): - total_loss = 0 + total_loss = np.array(0, np.float_) for xs, target in zip(seqs, targets): h = np.zeros(n) for x in xs: diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 7fc2aacb2834..81b0c3328dad 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -46,7 +46,7 @@ class MultiBackendTest(jtu.JaxTestCase): )) def testMultiBackend(self, backend): if backend not in ('cpu', jtu.device_under_test(), None): - raise SkipTest() + raise SkipTest("Backend is not CPU or the device under test") @partial(api.jit, backend=backend) def fun(x, y): return np.matmul(x, y) @@ -65,7 +65,7 @@ def fun(x, y): def testMultiBackendNestedJit(self, ordering): outer, inner = ordering if outer not in ('cpu', jtu.device_under_test(), None): - raise SkipTest() + raise SkipTest("Backend is not CPU or the device under test") @partial(api.jit, backend=outer) def fun(x, y): @partial(api.jit, backend=inner) @@ -91,9 +91,9 @@ def infun(x, y): def testMultiBackendNestedJitConflict(self, ordering): outer, inner = ordering if outer not in ('cpu', jtu.device_under_test(), None): - raise SkipTest() + raise SkipTest("Backend is not CPU or the device under test") if inner not in ('cpu', jtu.device_under_test(), None): - raise SkipTest() + raise SkipTest("Backend is not CPU or the device under test") @partial(api.jit, backend=outer) def fun(x, y): @partial(api.jit, backend=inner) @@ -111,7 +111,7 @@ def infun(x, y): )) def testGpuMultiBackendOpByOpReturn(self, backend): if backend not in ('cpu', jtu.device_under_test()): - raise SkipTest() + raise SkipTest("Backend is not CPU or the device under test") @partial(api.jit, backend=backend) def fun(x, y): return np.matmul(x, y) diff --git a/tests/parallel_test.py b/tests/parallel_test.py index d8414f49755c..449bcb0bf65f 100644 --- a/tests/parallel_test.py +++ b/tests/parallel_test.py @@ -309,7 +309,7 @@ def f(x, y): pfun, axis_name = _papply(fun) ans = soft_pmap(pfun, axis_name)(x, y) except (NotImplementedError, TypeError) as e: - raise SkipTest(e) + raise SkipTest(str(e)) ans = self.dedup(ans, expected.ndim) self.assertAllClose(ans, expected, check_dtypes=False) diff --git a/tests/random_test.py b/tests/random_test.py index 4c3299b1170c..66b400e50fe4 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -23,6 +23,7 @@ from absl.testing import parameterized import numpy as onp +import scipy.linalg import scipy.special import scipy.stats From 17b5fe11d03e35bcebe662fc14d2decaeca81b95 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 18 Jan 2020 22:12:07 -0800 Subject: [PATCH 0625/1053] add test for issue #553 --- tests/api_test.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/api_test.py b/tests/api_test.py index 39f53f81a049..4dbe2366de66 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1648,6 +1648,14 @@ def test_primitive_compilation_cache(self): lax.add(2, 3) self.assertEqual(count[0], 1) + def test_arange_jit(self): + # see https://github.com/google/jax/issues/553 + def fun(x): + r = np.arange(x.shape[0])[x] + return r + + jit(fun)(np.array([0, 1, 2], dtype=np.int32)) # doesn't crash + class JaxprTest(jtu.JaxTestCase): From 2c80cd3d88c7393a9bfaa80da626be1a868c0049 Mon Sep 17 00:00:00 2001 From: Mu Li Date: Tue, 21 Jan 2020 13:26:36 -0800 Subject: [PATCH 0626/1053] Fix Sysml paper link in README (#2036) The original ULR was broken as sysml updated their links. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0244d826c53..d849313d6063 100644 --- a/README.md +++ b/README.md @@ -454,7 +454,7 @@ the year corresponds to the project's open-source release. A nascent version of JAX, supporting only automatic differentiation and compilation to XLA, was described in a [paper that appeared at SysML -2018](https://www.sysml.cc/doc/2018/146.pdf). We're currently working on +2018](https://mlsys.org/Conferences/2019/doc/2018/146.pdf). We're currently working on covering JAX's ideas and capabilities in a more comprehensive and up-to-date paper. From f04348ed534dc88e0041b753d369a3c7a39ec60b Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 21 Jan 2020 16:59:27 -0800 Subject: [PATCH 0627/1053] Bump jaxlib version to 0.1.38 and update WORKSPACE. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bdca3fcc54cf..71a5de6bdc0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "516d4568ee2506f0df2b66d672124232a08fede139643d974d269676c16f5f3d", - strip_prefix = "tensorflow-d2318f541e51ac3afe573c5e7d91b93f8570d63d", + sha256 = "2ab391a719df06984d729b4e85e3291066615581fd831550e39cb96ef4a7a853", + strip_prefix = "tensorflow-d2db6a515e7ae7195234c30f3dc83c9ee69f0681", urls = [ - "https://github.com/tensorflow/tensorflow/archive/d2318f541e51ac3afe573c5e7d91b93f8570d63d.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/d2db6a515e7ae7195234c30f3dc83c9ee69f0681.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index a222ca339d30..007fa926a6de 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.37" +__version__ = "0.1.38" From 03b2ae6d5907e76472c0d43e5d7793e80523bb95 Mon Sep 17 00:00:00 2001 From: Sri Hari Krishna Narayanan Date: Wed, 22 Jan 2020 00:11:51 -0500 Subject: [PATCH 0628/1053] Issue1635 expm (#1940) * Issue1635 expm Implemented expm using Pade approximation. The implmentation is wrapped using custom_transforms. Frechet derivatives are provided using defvjp. * Issue1635 expm Implemented expm using Pade approximation based on tf.linalg.expm. * Revert "Revert "Merge remote-tracking branch 'origin/Issue1635' into Issue1635"" This reverts commit dd26c6eeeb60fa556f55abc8acb2f5969b64a2f5, reversing changes made to b63c190c7671ebb9b911a52dcc203285c56a8051. * Issue1635 expm testing Add a test that compares numerical output of scipy.linalg.expm against jax.scipy.linalg.expm * travis build Issue1635 branch * Issue1635 expm testing Use rand_small to get numerical agreeming * Issue1635 expm testing Use @jit to prevent recompilation * Issue1635 expm testing Use rand_small to get numerical agreement * Revert "travis build Issue1635 branch" This reverts commit 6139772555e3af79dc0307fce88838a480e42d38. * Issue1635 Replace construct with jax.numpy.select * Issue1635 Restructure to support the docstring from SciPy * Issue1635 Restructure to support the docstring from SciPy * Issue1635 Remove the note that sparsity is not exploited because JAX does not support sparsity. * Issue1635 expm Support for the case where A is upper triangular. Instead of autodetection, the option is specified explicitly. * Issue1635 Rename argument, make it positional. Update documentation Co-authored-by: Jan --- docs/jax.scipy.rst | 1 + jax/scipy/linalg.py | 117 ++++++++++++++++++++++++++++++++++++++++++- tests/linalg_test.py | 24 +++++++++ 3 files changed, 141 insertions(+), 1 deletion(-) diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index 693b21804c74..9b3f07a59860 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -14,6 +14,7 @@ jax.scipy.linalg cholesky det eigh + expm inv lu lu_factor diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index 9fef2b3ab167..b8e82357b4f8 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -19,6 +19,7 @@ from functools import partial import scipy.linalg +import textwrap from jax import jit from .. import lax @@ -27,7 +28,6 @@ from ..numpy import lax_numpy as np from ..numpy import linalg as np_linalg - _T = lambda x: np.swapaxes(x, -1, -2) @partial(jit, static_argnums=(1,)) @@ -264,3 +264,118 @@ def tril(m, k=0): @_wraps(scipy.linalg.triu) def triu(m, k=0): return np.triu(m, k) + +@_wraps(scipy.linalg.expm, lax_description=textwrap.dedent("""\ + In addition to the original NumPy argument(s) listed below, + also supports the optional boolean argument ``upper_triangular`` + to specify whether the ``A`` matrix is upper triangular. + """)) +def expm(A, *, upper_triangular=False): + return _expm(A, upper_triangular) + +def _expm(A, upper_triangular=False): + P,Q,n_squarings = _calc_P_Q(A) + R = _solve_P_Q(P, Q, upper_triangular) + R = _squaring(R, n_squarings) + return R + +@jit +def _calc_P_Q(A): + A = np.asarray(A) + if A.ndim != 2 or A.shape[0] != A.shape[1]: + raise ValueError('expected A to be a square matrix') + A_L1 = np_linalg.norm(A,1) + n_squarings = 0 + if A.dtype == 'float64' or A.dtype == 'complex128': + U3,V3 = _pade3(A) + U5,V5 = _pade5(A) + U7,V7 = _pade7(A) + U9,V9 = _pade9(A) + maxnorm = 5.371920351148152 + n_squarings = np.maximum(0, np.floor_divide(np.log2(A_L1 / maxnorm),1)) + A = A / 2**n_squarings + U13,V13 = _pade13(A) + conds=np.array([1.495585217958292e-002, 2.539398330063230e-001, 9.504178996162932e-001, 2.097847961257068e+000]) + U = np.select((maxnorm Date: Wed, 22 Jan 2020 17:15:36 -0800 Subject: [PATCH 0629/1053] implement JVP of cond Co-authored-by: Matthew Johnson --- jax/lax/lax_control_flow.py | 53 ++++++++++++++++++++++++++++++++++ tests/lax_control_flow_test.py | 21 ++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 656fde235c46..94a5bc380d56 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -490,10 +490,63 @@ def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr, true_nconsts, true_jaxpr=true_jaxpr_batched, false_jaxpr=false_jaxpr_batched, true_nconsts=len(true_consts), false_nconsts=len(false_consts)), out_dims +def _cond_jvp(primals, tangents, true_jaxpr, false_jaxpr, true_nconsts, + false_nconsts): + nonzeros = [t is not ad_util.zero for t in tangents] + + true_nops = len(true_jaxpr.in_avals) - true_nconsts + false_nops = len(false_jaxpr.in_avals) - false_nconsts + + (pred_nz,), tconst_nz, t_nz, fconst_nz, f_nz = split_list( + nonzeros, [1, true_nconsts, true_nops, false_nconsts]) + + assert pred_nz is False + + _, true_out_nz = ad.jvp_jaxpr(true_jaxpr, tconst_nz + t_nz, + instantiate=False) + _, false_out_nz = ad.jvp_jaxpr(false_jaxpr, fconst_nz + f_nz, + instantiate=False) + + out_nz = [a or b for a, b in zip(true_out_nz, false_out_nz)] + + true_jvp, _ = ad.jvp_jaxpr(true_jaxpr, tconst_nz + t_nz, instantiate=out_nz) + false_jvp, _ = ad.jvp_jaxpr(false_jaxpr, fconst_nz + f_nz, instantiate=out_nz) + + (pred,), tconsts, tops, fconsts, fops = split_list( + primals, [1, true_nconsts, true_nops, false_nconsts]) + _, tconsts_dot, tops_dot, fconsts_dot, fops_dot = split_list( + tangents, [1, true_nconsts, true_nops, false_nconsts]) + + tconsts_dot = _prune_zeros(tconsts_dot) + tops_dot = _prune_zeros(tops_dot) + fconsts_dot = _prune_zeros(fconsts_dot) + fops_dot = _prune_zeros(fops_dot) + + true_jvp = ad.rearrange_binders(true_jvp, [true_nconsts, true_nops], + [len(tconsts_dot), len(tops_dot)], + [len(out_nz)], [sum(out_nz)]) + false_jvp = ad.rearrange_binders(false_jvp, [false_nconsts, false_nops], + [len(fconsts_dot), len(fops_dot)], + [len(out_nz)], [sum(out_nz)]) + + out = cond_p.bind( + *itertools.chain([pred], + tconsts, tconsts_dot, tops, tops_dot, + fconsts, fconsts_dot, fops, fops_dot), + true_jaxpr=true_jvp, false_jaxpr=false_jvp, + true_nconsts=len(tconsts) + len(tconsts_dot), + false_nconsts=len(fconsts) + len(fconsts_dot)) + out_primals, out_tangents = split_list(out, [len(out_nz)]) + out_tangents_iter = iter(out_tangents) + out_tangents = [ + next(out_tangents_iter) if nz else ad_util.zero for nz in out_nz] + return out_primals, out_tangents + cond_p = lax.Primitive('cond') cond_p.multiple_results = True cond_p.def_impl(partial(xla.apply_primitive, cond_p)) cond_p.def_abstract_eval(_cond_abstract_eval) +ad.primitive_jvps[cond_p] = _cond_jvp batching.primitive_batchers[cond_p] = _cond_batching_rule xla.initial_style_translations[cond_p] = _cond_translation_rule diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 17e20e2d3153..1c1182657477 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -633,6 +633,27 @@ def fun(x, y, z): self.assertAllClose(ans, expected, check_dtypes=False) assert "select" in str(jaxpr) + def testCondJVP(self): + def fun_ref(x): + if x < 3: + return (x, x) + else: + y = 2 * x + return y, 2 * y + + def fun(x): + def false_fun(x): + y = 2 * x + return y, 2 * y + return lax.cond(x < 3, x, lambda x: (x, x), x, false_fun) + + x = 3.14 + ans = api.jvp(fun, (x,), (x,)) + expected = api.jvp(fun_ref, (x,), (x,)) + self.assertAllClose(ans, expected, check_dtypes=False) + + jtu.check_grads(fun, (x,), order=2, modes=["fwd"]) + def testIssue1263(self): def f(rng, x): cond = random.bernoulli(rng) From e18d697ac6250f6cf541a9ec8653312fc35dfd61 Mon Sep 17 00:00:00 2001 From: brett koonce Date: Wed, 22 Jan 2020 19:18:00 -0600 Subject: [PATCH 0630/1053] minor spelling tweaks (#2043) --- jax/api.py | 4 ++-- jax/dtypes.py | 2 +- jax/experimental/vectorize.py | 2 +- jax/lax/lax.py | 2 +- jax/lax/lax_control_flow.py | 4 ++-- jax/lax/lax_parallel.py | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jax/api.py b/jax/api.py index c52692618bcd..9174934d1eae 100644 --- a/jax/api.py +++ b/jax/api.py @@ -935,7 +935,7 @@ def f_pmapped(*args, **kwargs): if chunk_size == 0 and leftover: return pmap(fun, axis_name, backend)(*args) # can map directly onto hardware elif leftover: - msg = ("soft_pmap mapped axis size must be divisble by the number of " + msg = ("soft_pmap mapped axis size must be divisible by the number of " "XLA devices (or be less than or equal to that number), but got " "an axis size of {} with {} devices.") raise ValueError(msg.format(axis_size, pxla.unmapped_device_count())) @@ -1668,7 +1668,7 @@ def defvjp_all(fun, custom_vjp): Args: fun: a custom_transforms function. custom_vjp: a Python callable specifying the VJP rule, taking the same - arguments as ``fun`` and returning a pair where the first elment is the + arguments as ``fun`` and returning a pair where the first element is the value of ``fun`` applied to the arguments and the second element is a Python callable representing the VJP map from output cotangents to input cotangents. The returned VJP function must accept a value with the same diff --git a/jax/dtypes.py b/jax/dtypes.py index 40d8dbf08287..e92063624840 100644 --- a/jax/dtypes.py +++ b/jax/dtypes.py @@ -110,7 +110,7 @@ def scalar_type_of(x): raise TypeError("Invalid scalar value {}".format(x)) def coerce_to_array(x): - """Coreces a scalar or NumPy array to an onp.array. + """Coerces a scalar or NumPy array to an onp.array. Handles Python scalar type promotion according to JAX's rules, not NumPy's rules. diff --git a/jax/experimental/vectorize.py b/jax/experimental/vectorize.py index 147cd3f4df49..b795ce13d3be 100644 --- a/jax/experimental/vectorize.py +++ b/jax/experimental/vectorize.py @@ -36,7 +36,7 @@ * Addition: `(),()->()` * 1D inner product: `(i),(i)->()` * 1D sum: `(i)->()` -* Matrix multiplcation: `(m,n),(n,k)->(m,k)` +* Matrix multiplication: `(m,n),(n,k)->(m,k)` Why write gufuncs? ===================== diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 61d8096ff0d2..5fb0a60e5e41 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4498,7 +4498,7 @@ def conv_general_permutations(dimension_numbers): for i, (a, b) in enumerate(charpairs): if not dimension_numbers[i].count(a) == dimension_numbers[i].count(b) == 1: msg = ("convolution dimension_numbers[{}] must contain the characters " - "'{}' and '{}' exatly once, got {}.") + "'{}' and '{}' exactly once, got {}.") raise TypeError(msg.format(i, a, b, dimension_numbers[i])) if len(dimension_numbers[i]) != len(set(dimension_numbers[i])): msg = ("convolution dimension_numbers[{}] cannot have duplicate " diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 656fde235c46..35e22f07f120 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1249,7 +1249,7 @@ def custom_linear_solve( This function allows for overriding or defining gradients for a linear solve directly via implicit differentiation at the solution, rather than by - differenting *through* the solve operation. This can sometimes be much faster + differentiating *through* the solve operation. This can sometimes be much faster or more numerically stable, or differentiating through the solve operation may not even be implemented (e.g., if ``solve`` uses ``lax.while_loop``). @@ -1264,7 +1264,7 @@ def custom_linear_solve( of arrays. solve: higher level function that solves for solution to the linear equation, i.e., ``solve(matvec, x)) == x`` for all ``x`` of the same form - as ``b``. This function need not be differenatiable. + as ``b``. This function need not be differentiable. transpose_solve: higher level function for solving the transpose linear equation, i.e., ``transpose_solve(vecmat, x) == x``, where ``vecmat`` is the transpose of the linear map ``matvec`` (computed automatically with diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 19076e3a6243..ca40c22d72b5 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -122,7 +122,7 @@ def pshuffle(x, axis_name, perm): x: array with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). - perm: list of of ints, representing the new order of the source indicies + perm: list of of ints, representing the new order of the source indices that encode how the mapped axis named ``axis_name`` should be shuffled. The integer values are treated as indices into the mapped axis ``axis_name``. Every int between 0 and ``len(perm)-1`` should be included. From 07260f6572ac436317558a4b78b4b0931e0b30ad Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 22 Jan 2020 17:19:14 -0800 Subject: [PATCH 0631/1053] remove hasing methods from core.Literal (#2038) --- jax/core.py | 6 +++--- jax/interpreters/ad.py | 2 +- jax/interpreters/partial_eval.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/jax/core.py b/jax/core.py index 93d755222552..1a59e0071baa 100644 --- a/jax/core.py +++ b/jax/core.py @@ -129,10 +129,10 @@ def __init__(self, val): self.hash = None def __hash__(self): - return id(self.val) if self.hash is None else self.hash + assert False def __eq__(self, other): - return self.val is other.val if self.hash is None else self.val == other.val + assert False def __repr__(self): if self.hash is None: @@ -627,7 +627,7 @@ def context(): return "\njaxpr:\n{}\n".format(jaxpr) def read_env(env, v): - if v not in env and type(v) is not Literal: + if type(v) is not Literal and v not in env: raise Exception("Variable '{}' not defined".format(v) + context()) def write_env(env, v): diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index d83dd51aefa8..14d452d7f6e1 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -146,7 +146,7 @@ def backward_pass(jaxpr, consts, freevar_vals, args, cotangents_in): def write_cotangent(v, ct): # assert v not in primal_env - if ct is not None: + if ct is not None and type(v) is not Literal: ct_env[v] = add_tangents(ct_env[v], ct) if v in ct_env else ct def read_cotangent(v): diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 0bb28ea830d4..c8e23e15e76f 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -571,12 +571,12 @@ def _dce_jaxpr(typed_jaxpr, outputs): for var, aval, output in zip(outvars, out_avals, outputs)] new_outvars, new_out_avals = unzip2(out_pairs) - needed_vars = set(new_outvars) + needed_vars = {v for v in new_outvars if type(v) is not Literal} new_eqns = [] for eqn in jaxpr.eqns[::-1]: if set(eqn.outvars) & needed_vars: new_eqns.append(eqn) - needed_vars.update(eqn.invars) + needed_vars.update(v for v in eqn.invars if type(v) is not Literal) new_eqns = new_eqns[::-1] new_jaxpr = core.Jaxpr(jaxpr.constvars, jaxpr.freevars, jaxpr.invars, From bb176d414b97fe9afa84a5924aea728442634303 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 23 Jan 2020 10:11:58 -0500 Subject: [PATCH 0632/1053] Fix type promotion behavior of jnp.power and jnp.gcd for Python scalars. (#2051) Fix problem in test harness that meant we were not testing promotion against Python scalars. --- jax/numpy/lax_numpy.py | 9 ++++----- tests/lax_numpy_test.py | 5 ++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index b51273982af9..55991f92c220 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -560,8 +560,6 @@ def _float_divmod(x1, x2): @_wraps(onp.power) def power(x1, x2): - x1 = asarray(x1) - x2 = asarray(x2) x1, x2 = _promote_args(onp.power, x1, x2) dtype = _dtype(x1) if not issubdtype(dtype, integer): @@ -1023,7 +1021,7 @@ def moveaxis(a, source, destination): @_wraps(onp.isclose) def isclose(a, b, rtol=1e-05, atol=1e-08): - a, b = _promote_args("isclose", asarray(a), asarray(b)) + a, b = _promote_args("isclose", a, b) dtype = _dtype(a) if issubdtype(dtype, inexact): if issubdtype(dtype, complexfloating): @@ -3143,9 +3141,10 @@ def gcd(x1, x2): if (not issubdtype(_dtype(x1), integer) or not issubdtype(_dtype(x2), integer)): raise ValueError("Arguments to gcd must be integers.") - x1, x2 = _promote_dtypes(lax.abs(x1), lax.abs(x2)) + x1, x2 = _promote_dtypes(x1, x2) x1, x2 = broadcast_arrays(x1, x2) - gcd, _ = lax.while_loop(_gcd_cond_fn, _gcd_body_fn, (x1, x2)) + gcd, _ = lax.while_loop(_gcd_cond_fn, _gcd_body_fn, + (lax.abs(x1), lax.abs(x2))) return gcd diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 9dbe3bdcc5db..dca6e9ee30c8 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -423,7 +423,10 @@ def _GetArgsMaker(self, rng, shapes, dtypes, onp_arrays=True): def f(): out = [rng(shape, dtype or lnp.float_) for shape, dtype in zip(shapes, dtypes)] - return out if onp_arrays else [lnp.asarray(a) for a in out] + if onp_arrays: + return out + return [lnp.asarray(a) if isinstance(a, (onp.ndarray, onp.generic)) else a + for a in out] return f @parameterized.named_parameters(itertools.chain.from_iterable( From a3de80201f64727682a1505f53e502eb8c96e491 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 23 Jan 2020 11:53:55 -0500 Subject: [PATCH 0633/1053] Fix type specifications for bitwise ops. (#2054) --- jax/lax/lax.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 5fb0a60e5e41..31ccb6c3a455 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1649,6 +1649,7 @@ def _brcast_to(x, shape): _num = _int | _float | _complex _any = _int | _float | _complex | _bool +_bool_or_int = _int | _bool neg_p = standard_unop(_num, 'neg') ad.deflinear(neg_p, lambda t: [neg(t)]) @@ -1814,15 +1815,15 @@ def _pow_jvp_rhs(g, ans, x, y): ad.defjvp2(pow_p, _pow_jvp_lhs, _pow_jvp_rhs) _replace_zero = lambda x: select(eq(x, _const(x, 0)), _ones(x), x) -not_p = standard_unop(_int | _bool, 'not') +not_p = standard_unop(_bool_or_int, 'not') -and_p = standard_naryop([_any, _any], 'and') +and_p = standard_naryop([_bool_or_int, _bool_or_int], 'and') ad.defjvp_zero(and_p) -or_p = standard_naryop([_any, _any], 'or') +or_p = standard_naryop([_bool_or_int, _bool_or_int], 'or') ad.defjvp_zero(or_p) -xor_p = standard_naryop([_any, _any], 'xor') +xor_p = standard_naryop([_bool_or_int, _bool_or_int], 'xor') ad.defjvp_zero(xor_p) def _add_transpose(t, x, y): From 6b5ef898dc7eaa3295ef3556a523507620d05793 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 23 Jan 2020 10:21:55 -0800 Subject: [PATCH 0634/1053] fix autodiff cookbook np.allclose tuple bug (#2055) --- docs/notebooks/autodiff_cookbook.ipynb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index 75d7e75530dd..f2c3b82d1142 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -1129,7 +1129,8 @@ "# multiply, rather than an outer loop over vector-matrix multiplies.\n", "def vmap_mjp(f, x, M):\n", " y, vjp_fun = vjp(f, x)\n", - " return vmap(vjp_fun)(M)\n", + " outs, = vmap(vjp_fun)(M)\n", + " return outs\n", "\n", "key = random.PRNGKey(0)\n", "num_covecs = 128\n", @@ -1175,7 +1176,7 @@ "def loop_jmp(f, x, M):\n", " # jvp immediately returns the primal and tangent values as a tuple,\n", " # so we'll compute and select the tangents in a list comprehension\n", - " return np.vstack([jvp(f, (W,), (si,))[1] for si in M])\n", + " return np.vstack([jvp(f, (W,), (mi,))[1] for mi in M])\n", "\n", "def vmap_jmp(f, x, M):\n", " _jvp = lambda s: jvp(f, (W,), (s,))[1]\n", From a61bcff54d3167ac22d098341de309bf22c128b4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 23 Jan 2020 10:25:49 -0800 Subject: [PATCH 0635/1053] update readme gotchas about pure functions --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d849313d6063..21e65da67858 100644 --- a/README.md +++ b/README.md @@ -343,22 +343,23 @@ we highly recommend reading the [Gotchas Notebook](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html). Some standouts: +1. JAX transformations only work on [pure functions](https://en.wikipedia.org/wiki/Pure_function), which don't have side-effects and respect [referential transparency](https://en.wikipedia.org/wiki/Referential_transparency) (i.e. object identity testing with `is` isn't preserved). If you use a JAX transformation on an impure Python function, you might see an error like `Exception: Can't lift Traced...` or `Exception: Different traces at same level`. 1. [In-place mutating updates of arrays](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-In-Place-Updates), like `x[i] += y`, aren't supported, but [there are functional alternatives](https://jax.readthedocs.io/en/latest/jax.ops.html). Under a `jit`, those functional alternatives will reuse buffers in-place automatically. -2. [Random numbers are +1. [Random numbers are different](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-Random-Numbers), but for [good reasons](https://github.com/google/jax/blob/master/design_notes/prng.md). -3. If you're looking for [convolution +1. If you're looking for [convolution operators](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-Convolutions), they're in the `jax.lax` package. -4. JAX enforces single-precision (32-bit, e.g. `float32`) values by default, and +1. JAX enforces single-precision (32-bit, e.g. `float32`) values by default, and [to enable double-precision](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#Double-(64bit)-precision) (64-bit, e.g. `float64`) one needs to set the `jax_enable_x64` variable at startup (or set the environment variable `JAX_ENABLE_X64=True`). -5. Some of NumPy's dtype promotion semantics involving a mix of Python scalars +1. Some of NumPy's dtype promotion semantics involving a mix of Python scalars and NumPy types aren't preserved, namely `np.add(1, np.array([2], np.float32)).dtype` is `float64` rather than `float32`. -6. Some transformations, like `jit`, [constrain how you can use Python control +1. Some transformations, like `jit`, [constrain how you can use Python control flow](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-Control-Flow). You'll always get loud errors if something goes wrong. You might have to use [`jit`'s `static_argnums` From 8cf6cd8768dc7c8f7246bafd338f1a22f3a26590 Mon Sep 17 00:00:00 2001 From: Christopher Suter Date: Thu, 23 Jan 2020 14:07:57 -0500 Subject: [PATCH 0636/1053] Tidy up prng.md (#2033) * Tidy up prng.md Make bulleted list alphabetical, to match references in subsequent text, and fix a little reduplication typo further below. --- design_notes/prng.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/design_notes/prng.md b/design_notes/prng.md index a9cdb5f1aa90..9ea684273052 100644 --- a/design_notes/prng.md +++ b/design_notes/prng.md @@ -96,10 +96,11 @@ def main(): ``` Some points to notice: -- there is no sequential dependence between the calls to bar() and baz() and they can be evaluated in either order without affecting the value of the result, which solves the remaining performance goals (#5, #6), -- functions do not need to return updated versions of PRNGs and it is straightforward to call a random subroutine without affecting existing PRNG states, improving the expressiveness (#1) from the other functional model. -The example doesn’t show it, but as a consequence of the choice (B) the only way to advance the PRNG state is to call split(). That is, we have two ways to achieve (A), and they differ in whether they burden the user program with explicit calls to split(), as in the above example, or instead burden the user program with explicit threading. We prefer the former, i.e. the version with explicit splitting, because we can easily implement the explicit-threading version in terms of it. +1. there is no sequential dependence between the calls to bar() and baz() and they can be evaluated in either order without affecting the value of the result, which solves the remaining performance goals (#5, #6), +2. functions do not need to return updated versions of PRNGs and it is straightforward to call a random subroutine without affecting existing PRNG states, improving the expressiveness (#1) from the other functional model. + +The example doesn’t show it, but as a consequence of the choice (2) the only way to advance the PRNG state is to call split(). That is, we have two ways to achieve (1), and they differ in whether they burden the user program with explicit calls to split(), as in the above example, or instead burden the user program with explicit threading. We prefer the former, i.e. the version with explicit splitting, because we can easily implement the explicit-threading version in terms of it. ## Design @@ -176,7 +177,7 @@ def parallel(*layers): return init_fun, apply_fun ``` -Here we’re using a version a simple extended version of split that can produce multiple copies. +Here we’re using a simple extended version of split that can produce multiple copies. ## Tradeoffs and alternatives From 393938f38720e1c49553bd971f7ed4bd12239110 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 23 Jan 2020 16:35:35 -0800 Subject: [PATCH 0637/1053] Update WORKSPACE to TF commit that builds with build_jaxlib_wheels.sh --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71a5de6bdc0c..426323f3b018 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "2ab391a719df06984d729b4e85e3291066615581fd831550e39cb96ef4a7a853", - strip_prefix = "tensorflow-d2db6a515e7ae7195234c30f3dc83c9ee69f0681", + sha256 = "b8b62014b91c1550f6ae69e3860c72b05cbb42b7361dab4150756cfe74981fdc", + strip_prefix = "tensorflow-2c23f12b5a75e3471d491f88b4f813ba67d08273", urls = [ - "https://github.com/tensorflow/tensorflow/archive/d2db6a515e7ae7195234c30f3dc83c9ee69f0681.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/2c23f12b5a75e3471d491f88b4f813ba67d08273.tar.gz", ], ) From b6dfb8bf18482eff334f9eeb50a09fe9de2e3e7f Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 23 Jan 2020 16:46:45 -0800 Subject: [PATCH 0638/1053] Bump minimum bazel version to 0.26.0. (#2060) Fixes #2044 --- build/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.py b/build/build.py index 64965ee21b47..52e87d58ae56 100755 --- a/build/build.py +++ b/build/build.py @@ -307,7 +307,7 @@ def main(): # Find a working Bazel. bazel_path = get_bazel_path(args.bazel_path) - check_bazel_version(bazel_path, min_version="0.24.0", max_version=None) + check_bazel_version(bazel_path, min_version="0.26.0", max_version=None) print("Bazel binary path: {}".format(bazel_path)) python_bin_path = get_python_bin_path(args.python_bin_path) From 9aba39e9be15b7758f328f37d9c2376d02a3b975 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 23 Jan 2020 17:11:23 -0800 Subject: [PATCH 0639/1053] Revert lax_numpy.asclose() behavior to work with lists again. (#2059) This should be revisited to fix the issue originally addressed in https://github.com/google/jax/pull/2051. --- jax/numpy/lax_numpy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 55991f92c220..e63e85ad3956 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -314,12 +314,12 @@ def update_numpydoc(docstr, fun, op): def _wraps(fun, update_doc=True, lax_description=""): """Like functools.wraps but works with numpy.ufuncs. - It is important that when wrapping numpy functions the parameters names + It is important that when wrapping numpy functions the parameters names in the original function and in the JAX version are the same Parameters: fun: The function being wrapped update_doc: whether to transform the numpy docstring to remove references of - parameters that are supported by the numpy version but not the JAX version. + parameters that are supported by the numpy version but not the JAX version. If False, include the numpy docstring verbatim. """ def wrap(op): @@ -1021,7 +1021,7 @@ def moveaxis(a, source, destination): @_wraps(onp.isclose) def isclose(a, b, rtol=1e-05, atol=1e-08): - a, b = _promote_args("isclose", a, b) + a, b = _promote_args("isclose", asarray(a), asarray(b)) dtype = _dtype(a) if issubdtype(dtype, inexact): if issubdtype(dtype, complexfloating): From f1339cd0b0f717a0e21697a48c3b59abd962b6ae Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 23 Jan 2020 17:24:23 -0800 Subject: [PATCH 0640/1053] Remove missing PPA in Dockerfile. (#2061) This PPA has been removed by the owner: https://launchpad.net/~jonathonf/+archive/ubuntu/python-3.6 This causes `apt-get update` to fail when generating the Docker image. We don't seem to need this repository, so just remove it before calling `apt-get update`. --- build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/Dockerfile b/build/Dockerfile index 4b8285df87a5..c88c6a279b0d 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -2,6 +2,7 @@ FROM gcr.io/tensorflow-testing/nosla-cuda10.0-cudnn7-ubuntu16.04-manylinux2010 LABEL maintainer "Matt Johnson " WORKDIR / +RUN rm /etc/apt/sources.list.d/jonathonf-ubuntu-python-3_6-xenial.list RUN apt-get update RUN apt-get install libffi-dev RUN git clone --branch v1.2.14 https://github.com/pyenv/pyenv.git /pyenv From 0c95c26e97d6f53475086d640eef80a740954c78 Mon Sep 17 00:00:00 2001 From: Ziyad Edher Date: Fri, 24 Jan 2020 16:52:40 -0500 Subject: [PATCH 0641/1053] Implement np.linalg.matrix_power (#2042) * Implement numpy.linalg.matrix_power * Write tests for numpy.linalg.matrix_power * Check for input matrix shapes * Move to matrix-multiplication operator in matrix power * Improve error messages and directly use broadcasting * Include matrix_power in documentation --- docs/jax.numpy.rst | 1 + jax/numpy/linalg.py | 42 ++++++++++++++++++++++++++++++++++++++++-- tests/linalg_test.py | 19 +++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index f94c0bd8f74f..a7c25a8c72fb 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -284,6 +284,7 @@ jax.numpy.linalg eig eigh inv + matrix_power norm qr slogdet diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 99f3c5df3c7c..0d917eb281c8 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -21,9 +21,10 @@ import numpy as onp import warnings import textwrap +import operator from typing import Tuple, Union, cast -from jax import jit +from jax import jit, ops from .. import lax from .. import lax_linalg from .. import dtypes @@ -62,6 +63,43 @@ def svd(a, full_matrices=True, compute_uv=True): return lax_linalg.svd(a, full_matrices, compute_uv) +@_wraps(onp.linalg.matrix_power) +def matrix_power(a, n): + a = _promote_arg_dtypes(np.asarray(a)) + + if a.ndim < 2: + raise TypeError("{}-dimensional array given. Array must be at least " + "two-dimensional".format(a.ndim)) + if a.shape[-2] != a.shape[-1]: + raise TypeError("Last 2 dimensions of the array must be square") + try: + n = operator.index(n) + except TypeError: + raise TypeError("exponent must be an integer, got {}".format(n)) + + if n == 0: + return np.broadcast_to(np.eye(a.shape[-2], dtype=a.dtype), a.shape) + elif n < 0: + a = inv(a) + n = np.abs(n) + + if n == 1: + return a + elif n == 2: + return a @ a + elif n == 3: + return (a @ a) @ a + + z = result = None + while n > 0: + z = a if z is None else (z @ z) + n, bit = divmod(n, 2) + if bit: + result = z if result is None else (result @ z) + + return result + + # TODO(pfau): make this work for complex types def _jvp_slogdet(g, ans, x): jvp_sign = np.zeros(x.shape[:-2]) @@ -152,7 +190,7 @@ def pinv(a, rcond=None): rcond = 10. * max_rows_cols * np.finfo(a.dtype).eps rcond = np.asarray(rcond) u, s, v = svd(a, full_matrices=False) - # Singular values less than or equal to ``rcond * largest_singular_value`` + # Singular values less than or equal to ``rcond * largest_singular_value`` # are set to zero. cutoff = rcond[..., np.newaxis] * np.amax(s, axis=-1, keepdims=True) large = s > cutoff diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 5875d5a38d14..7b04c9516aee 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -604,6 +604,25 @@ def testPinv(self, shape, dtype, rng_factory): check_dtypes=True, tol=1e-3) self._CompileAndCheck(np.linalg.pinv, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}_n={}".format( + jtu.format_shape_dtype_string(shape, dtype), n), + "shape": shape, "dtype": dtype, "n": n, "rng_factory": rng_factory} + for shape in [(1, 1), (2, 2), (4, 4), (5, 5), + (1, 2, 2), (2, 3, 3), (2, 5, 5)] + for dtype in float_types + complex_types + for n in [-5, -2, -1, 0, 1, 2, 3, 4, 5, 10] + for rng_factory in [jtu.rand_default])) + def testMatrixPower(self, shape, dtype, n, rng_factory): + rng = rng_factory() + _skip_if_unsupported_type(dtype) + args_maker = lambda: [rng(shape, dtype)] + self._CheckAgainstNumpy(partial(onp.linalg.matrix_power, n=n), + partial(np.linalg.matrix_power, n=n), + args_maker, check_dtypes=True, tol=1e-3) + self._CompileAndCheck(partial(np.linalg.matrix_power, n=n), args_maker, + check_dtypes=True, rtol=1e-3) + # Regression test for incorrect type for eigenvalues of a complex matrix. @jtu.skip_on_devices("tpu") # TODO(phawkins): No complex eigh implementation on TPU. def testIssue669(self): From 632326ac5c95e83c05201a6a88168cf682496c96 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 24 Jan 2020 16:58:00 -0500 Subject: [PATCH 0642/1053] Add unsupported wrapper around XLA RngUniform API. (#2068) --- jax/lax/lax.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 31ccb6c3a455..6a20bd470f30 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4229,6 +4229,37 @@ def _outfeed_translation_rule(c, token, *xs): outfeed_p.def_abstract_eval(_outfeed_abstract_eval) xla.translations[outfeed_p] = _outfeed_translation_rule +def rng_uniform(a, b, shape): + """Stateful PRNG generator. Experimental and its use is discouraged. + + Returns uniformly distributed random numbers in the range [a, b) + + You should use jax.random for most purposes; this function exists only for + niche use cases with special performance requirements. + + This API may be removed at any time. + """ + return rng_uniform_p.bind(a, b, shape=tuple(shape)) + +def _rng_uniform_abstract_eval(a, b, shape): + if a.dtype != b.dtype: + raise ValueError( + "Arguments to rng_uniform must have identical dtypes, got {} " + "and {}.".format(a.dtype, b.dtype)) + if a.shape != () or b.shape != (): + raise ValueError( + "Arguments to rng_uniform must be scalars; got shapes {} and {}." + .format(a.shape, b.shape)) + return ShapedArray(shape, a.dtype) + +def _rng_uniform_translation_rule(c, a, b, shape): + return c.RngUniform(a, b, shape) + +rng_uniform_p = Primitive("rng_uniform") +rng_uniform_p.def_impl(partial(xla.apply_primitive, rng_uniform_p)) +rng_uniform_p.def_abstract_eval(_rng_uniform_abstract_eval) +xla.translations[rng_uniform_p] = _rng_uniform_translation_rule + ### util _ndim = onp.ndim From 0fca476c54b62fbbfe50ce36042a2a490c54b78c Mon Sep 17 00:00:00 2001 From: Ziyad Edher Date: Sun, 26 Jan 2020 14:29:33 -0500 Subject: [PATCH 0643/1053] Implement np.linalg.matrix_rank (#2008) * Implement np.linalg.matrix_rank * Test np.linalg.matrix_rank * Use helper numpy testing function * Fix issue with 1D matrix rank procedure * Add new tests for 1D matrices and jit * Do not check dtypes to circumvent int32 vs int64 * Include documentation for matrix_rank * Fix ordering * Use np.sum --- docs/jax.numpy.rst | 1 + jax/numpy/linalg.py | 13 +++++++++++++ tests/linalg_test.py | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index a7c25a8c72fb..3187526073f5 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -285,6 +285,7 @@ jax.numpy.linalg eigh inv matrix_power + matrix_rank norm qr slogdet diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 0d917eb281c8..3244aaed592e 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -100,6 +100,19 @@ def matrix_power(a, n): return result +@_wraps(onp.linalg.matrix_rank) +def matrix_rank(M, tol=None): + M = _promote_arg_dtypes(np.asarray(M)) + if M.ndim > 2: + raise TypeError("array should have 2 or fewer dimensions") + if M.ndim < 2: + return np.any(M != 0).astype(np.int32) + S = svd(M, full_matrices=False, compute_uv=False) + if tol is None: + tol = S.max() * np.max(M.shape) * np.finfo(S.dtype).eps + return np.sum(S > tol) + + # TODO(pfau): make this work for complex types def _jvp_slogdet(g, ans, x): jvp_sign = np.zeros(x.shape[:-2]) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 7b04c9516aee..81d18c495f9c 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -623,6 +623,25 @@ def testMatrixPower(self, shape, dtype, n, rng_factory): self._CompileAndCheck(partial(np.linalg.matrix_power, n=n), args_maker, check_dtypes=True, rtol=1e-3) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} + for shape in [(3, ), (1, 2), (8, 5), (4, 4), (5, 5), (50, 50)] + for dtype in float_types + complex_types + for rng_factory in [jtu.rand_default])) + @jtu.skip_on_devices("gpu", "tpu") # TODO(b/145608614): SVD crashes on GPU. + def testMatrixRank(self, shape, dtype, rng_factory): + rng = rng_factory() + _skip_if_unsupported_type(dtype) + n = shape[-1] + args_maker = lambda: [rng(shape, dtype)] + a, = args_maker() + self._CheckAgainstNumpy(onp.linalg.matrix_rank, np.linalg.matrix_rank, + args_maker, check_dtypes=False, tol=1e-3) + self._CompileAndCheck(np.linalg.matrix_rank, args_maker, + check_dtypes=False, rtol=1e-3) + # Regression test for incorrect type for eigenvalues of a complex matrix. @jtu.skip_on_devices("tpu") # TODO(phawkins): No complex eigh implementation on TPU. def testIssue669(self): From a15aa9bd4d97cfaa65baf31ecc8ac47ae584ac7b Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Sun, 26 Jan 2020 23:27:56 -0800 Subject: [PATCH 0644/1053] include call stack + transforms in XLA metadata (#2073) --- jax/api.py | 23 ++++--- jax/core.py | 5 ++ jax/interpreters/ad.py | 6 +- jax/interpreters/batching.py | 4 +- jax/interpreters/partial_eval.py | 7 +- jax/interpreters/pxla.py | 29 ++++---- jax/interpreters/xla.py | 60 +++++++++------- jax/lax/lax.py | 2 +- jax/lax/lax_control_flow.py | 24 ++++--- jax/pprint_util.py | 4 +- jax/util.py | 6 ++ tests/metadata_test.py | 113 +++++++++++++++++++++++++++++++ 12 files changed, 217 insertions(+), 66 deletions(-) create mode 100644 tests/metadata_test.py diff --git a/jax/api.py b/jax/api.py index 9174934d1eae..f040629f67ff 100644 --- a/jax/api.py +++ b/jax/api.py @@ -50,7 +50,7 @@ tree_transpose, tree_leaves, tree_multimap, _replace_nones) from .util import (unzip2, unzip3, curry, partial, safe_map, safe_zip, - WrapHashably, Hashable, prod, split_list) + WrapHashably, Hashable, prod, split_list, extend_name_stack, wrap_name) from .lib import xla_bridge as xb from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, host_id, host_ids, host_count) @@ -146,10 +146,11 @@ def f_jitted(*args, **kwargs): args_flat, in_tree = tree_flatten((dyn_args, kwargs)) _check_args(args_flat) flat_fun, out_tree = flatten_fun(f, in_tree) - out = xla.xla_call(flat_fun, *args_flat, device=device, backend=backend) + out = xla.xla_call(flat_fun, *args_flat, device=device, backend=backend, + name=flat_fun.__name__) return tree_unflatten(out_tree(), out) - jitted_name = "jit({}, static_argnums={})" + jitted_name = "jit({}, static_argnums={})" f_jitted.__name__ = jitted_name.format(f_jitted.__name__, static_argnums) return f_jitted @@ -306,8 +307,9 @@ def computation_maker(*args, **kwargs): c = xb.make_computation_builder('xla_computation_{}'.format(fun_name)) xla_consts = map(c.Constant, consts) xla_args = xla._xla_callable_args(c, avals, tuple_args) - outs = xla.jaxpr_subcomp(c, jaxpr, backend, axis_env_, xla_consts, (), - *xla_args) + outs = xla.jaxpr_subcomp( + c, jaxpr, backend, axis_env_, xla_consts, (), + extend_name_stack(wrap_name(fun_name, 'xla_computation')), *xla_args) return c.Build(c.Tuple(*outs)) return computation_maker @@ -886,11 +888,12 @@ def f_pmapped(*args, **kwargs): out = pxla.xla_pmap( flat_fun, *args, + backend=backend, axis_name=axis_name, axis_size=local_axis_size, global_axis_size=axis_size, devices=tuple(devices) if devices is not None else devices, - backend=backend) + name=flat_fun.__name__) return tree_unflatten(out_tree(), out) namestr = "pmap({}, axis_name={})".format @@ -943,10 +946,10 @@ def f_pmapped(*args, **kwargs): reshaped_args = [_reshape_split(num_chunks, x) for x in args_flat] soft_mapped_fun = pxla.split_axis(flat_fun, axis_name, chunk_size) - reshaped_outs = pxla.xla_pmap(soft_mapped_fun, *reshaped_args, + reshaped_outs = pxla.xla_pmap(soft_mapped_fun, *reshaped_args, backend=backend, axis_name=axis_name, axis_size=num_chunks, global_axis_size=None, devices=None, - backend=backend) + name=soft_mapped_fun.__name__) outs = [_reshape_merge(out) for out in reshaped_outs] return tree_unflatten(out_tree(), outs) @@ -1003,9 +1006,9 @@ def pfun(*args): reshaped_args = [_reshape_split(num_chunks, x) for x in args_flat] f, out_axes = parallel.papply_transform(f, axis_name, axis_size) f = pxla.split_axis(f, axis_name, chunk_size) - outs = pxla.xla_pmap(f, *reshaped_args, axis_name=axis_name, + outs = pxla.xla_pmap(f, *reshaped_args, backend=None, axis_name=axis_name, axis_size=num_chunks, global_axis_size=None, - devices=None, backend=None) + devices=None, name=f.__name__) outs = map(_reshape_merge, outs) outs = [batching.matchaxis(axis_size, 0, dst, x) for dst, x in zip(out_axes(), outs)] diff --git a/jax/core.py b/jax/core.py index 1a59e0071baa..5bb74e34cdc2 100644 --- a/jax/core.py +++ b/jax/core.py @@ -656,6 +656,11 @@ def write_env(env, v): def pp_vars(vs): return ' '.join(map(str, vs)) +def pp_eqn_compact(primitive_name, params): + filtered_params = {k: v for k, v in params.items() + if not isinstance(v, (Jaxpr, TypedJaxpr))} + return pp(primitive_name) >> pp_kv_pairs(sorted(filtered_params.items())) + def pp_eqn(eqn): lhs = pp_vars(eqn.outvars) pp_subexpr = pp('') diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 14d452d7f6e1..85bed6b0abcd 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -26,7 +26,7 @@ from ..ad_util import (add_jaxvals, add_jaxvals_p, zeros_like_jaxval, zeros_like_aval, zeros_like_p, zero) from ..abstract_arrays import raise_to_shaped -from ..util import unzip2, safe_map, safe_zip, partial, split_list +from ..util import unzip2, safe_map, safe_zip, partial, split_list, wrap_name from ..tree_util import register_pytree_node from .. import linear_util as lu from ..api_util import flatten_fun, flatten_fun_nokwargs @@ -324,6 +324,8 @@ def process_call(self, call_primitive, f, tracers, params): tangents = [t.tangent for t in tracers] nonzero_tangents, in_tree_def = tree_flatten(tangents) f_jvp, out_tree_def = traceable(jvp_subtrace(f, self.master), len(primals), in_tree_def) + name = params.get('name', f.__name__) + params = dict(params, name=wrap_name(name, 'jvp')) result = call_primitive.bind(f_jvp, *(primals + nonzero_tangents), **params) primal_out, tangent_out = tree_unflatten(out_tree_def(), result) return [JVPTracer(self, p, t) for p, t in zip(primal_out, tangent_out)] @@ -549,6 +551,7 @@ def call_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) + params = dict(params, name=wrap_name(params['name'], 'transpose')) out_flat = primitive.bind(fun, *all_args, **params) return tree_unflatten(out_tree(), out_flat) primitive_transposes[core.call_p] = partial(call_transpose, call_p) @@ -558,6 +561,7 @@ def map_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) + params = dict(params, name=wrap_name(params['name'], 'transpose')) out_flat = primitive.bind(fun, *all_args, **params) freevar_cts, arg_cts = tree_unflatten(out_tree(), out_flat) freevar_cts = [x.sum(0) if x is not zero else x for x in freevar_cts] diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 32ab93b5935b..7c30ba051cf5 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -28,7 +28,7 @@ from ..abstract_arrays import ShapedArray, make_shaped_array, array_types, raise_to_shaped from ..ad_util import add_jaxvals, add_jaxvals_p, zeros_like_jaxval, zeros_like_p from .. import linear_util as lu -from ..util import unzip2, partial, safe_map +from ..util import unzip2, partial, safe_map, wrap_name from . import xla from . import partial_eval as pe @@ -119,6 +119,8 @@ def process_primitive(self, primitive, tracers, params): def process_call(self, call_primitive, f, tracers, params): assert call_primitive.multiple_results + name = params.get('name', f.__name__) + params = dict(params, name=wrap_name(name, 'vmap')) if call_primitive in pe.map_primitives: return self.process_map(call_primitive, f, tracers, params) vals, dims = unzip2((t.val, t.batch_dim) for t in tracers) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index c8e23e15e76f..42e1497f1e40 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -27,7 +27,8 @@ from .. import core from .. import linear_util as lu from ..abstract_arrays import ShapedArray, ConcreteArray, raise_to_shaped -from ..util import unzip2, safe_zip, safe_map, toposort, partial, split_list +from ..util import (unzip2, safe_zip, safe_map, toposort, partial, split_list, + wrap_name) from ..core import (Trace, Tracer, new_master, Jaxpr, Literal, get_aval, AbstractValue, unit, unitvar, abstract_unit, Primitive, call_p, TypedJaxpr, new_jaxpr_eqn) @@ -115,8 +116,12 @@ def process_primitive(self, primitive, tracers, params): return out_tracer def process_call(self, call_primitive, f, tracers, params): + name = params.get('name', f.__name__) if self.master.trace_type is StagingJaxprTrace: tracers = map(self.instantiate_const_abstracted, tracers) + else: + name = wrap_name(name, 'pe') + params = dict(params, name=name) if call_primitive in call_partial_eval_rules: return call_partial_eval_rules[call_primitive](self, f, tracers, params) if call_primitive in map_primitives: diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index a29ce07b7748..26731c449055 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -31,7 +31,8 @@ from .. import lazy from ..abstract_arrays import (ConcreteArray, ShapedArray, array_types, raise_to_shaped) -from ..util import partial, unzip2, concatenate, prod, safe_map +from ..util import (partial, unzip2, concatenate, prod, safe_map, + extend_name_stack, wrap_name) from ..lib import xla_bridge as xb from .xla import aval_to_xla_shape, xla_destructure from .batching import broadcast, not_mapped @@ -403,22 +404,16 @@ def __getitem__(self, idx): ### the xla_pmap primitive and its rules are comparable to xla_call in xla.py -def xla_pmap_impl(fun, *args, **params): - axis_name = params.pop('axis_name') - axis_size = params.pop('axis_size') - global_axis_size = params.pop('global_axis_size') - devices = params.pop('devices') - backend = params.pop('backend') - assert not params - +def xla_pmap_impl(fun, *args, backend, axis_name, axis_size, global_axis_size, + devices, name): abstract_args = map(xla.abstractify, args) compiled_fun = parallel_callable(fun, backend, axis_name, axis_size, - global_axis_size, devices, *abstract_args) + global_axis_size, devices, name, *abstract_args) return compiled_fun(*args) @lu.cache def parallel_callable(fun, backend, axis_name, axis_size, global_axis_size, - devices, *avals): + devices, name, *avals): if devices is not None and len(devices) == 0: raise ValueError("'devices' argument to pmap must be non-empty, or None.") @@ -508,7 +503,8 @@ def dynamic_fun(dummy, *args): c = xb.make_computation_builder("pmap_{}".format(fun.__name__)) xla_consts = _map(c.Constant, consts) xla_args = xla._xla_callable_args(c, avals, tuple_args) - out_nodes = xla.jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, (), *xla_args) + out_nodes = xla.jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, (), + extend_name_stack(wrap_name(name, 'pmap')), *xla_args) built = c.Build(c.Tuple(*out_nodes)) if devices is None: @@ -649,8 +645,8 @@ def execute_replicated(compiled, backend, in_handler, out_handler, *args): xla_pmap_p.def_impl(xla_pmap_impl) def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, - in_nodes, axis_name, axis_size, global_axis_size, - devices, backend=None): + in_nodes, name_stack, axis_name, axis_size, + global_axis_size, devices, name, backend=None): # We in-line here rather than generating a Call HLO as in the xla_call # translation rule just because the extra tuple stuff is a pain. if axis_env.devices is not None or (axis_env.names and devices is not None): @@ -659,8 +655,9 @@ def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, global_axis_size = axis_size new_env = xla.extend_axis_env(axis_env, axis_name, global_axis_size) in_nodes_sharded = list(map(partial(_xla_shard, c, new_env), in_nodes)) - sharded_outs = xla.jaxpr_subcomp(c, jaxpr, backend, new_env, const_nodes, - freevar_nodes, *in_nodes_sharded) + sharded_outs = xla.jaxpr_subcomp( + c, jaxpr, backend, new_env, const_nodes, freevar_nodes, + extend_name_stack(name_stack, wrap_name(name, 'pmap')), *in_nodes_sharded) outs = [_xla_unshard(c, new_env, shard) for shard in sharded_outs] return c.Tuple(*outs) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index fa212ada1f3e..b47f0a5b9807 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -35,9 +35,10 @@ from ..abstract_arrays import (ConcreteArray, ShapedArray, AbstractToken, make_shaped_array, array_types, raise_to_shaped, abstract_token) -from ..core import valid_jaxtype, Literal +from ..core import valid_jaxtype, Literal, pp_eqn_compact +from ..pprint_util import pp from ..util import (partial, partialmethod, cache, safe_map, prod, unzip2, - memoize) + memoize, extend_name_stack, wrap_name) from ..lib import xla_bridge as xb from ..lib import xla_client as xc from . import partial_eval as pe @@ -204,18 +205,21 @@ class and an int id (representing a Device instance) or a None. @cache() def primitive_computation(prim, backend, tuple_args, *avals, **params): c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) - c.SetOpMetadata(xc.OpMetadata(op_type=prim.name, op_name=str(params))) + c.SetOpMetadata(xc.OpMetadata( + op_type=prim.name, + op_name=str(pp_eqn_compact(prim.name, params)))) platform = xb.get_backend(backend).platform xla_args = _xla_callable_args(c, avals, tuple_args) + # return val always set as a side-effect on c if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] - rule(c, *xla_args, **params) # return val set as a side-effect on c + rule(c, *xla_args, **params) elif prim in translations: rule = translations[prim] - rule(c, *xla_args, **params) # return val set as a side-effect on c + rule(c, *xla_args, **params) elif prim in initial_style_translations: rule = initial_style_translations[prim] - rule(c, AxisEnv(), *xla_args, backend=backend, **params) # side-effect on c + rule(c, AxisEnv(), extend_name_stack(prim.name), *xla_args, backend=backend, **params) else: raise NotImplementedError("XLA translation rule for {} not found".format(prim)) c.ClearOpMetadata() @@ -282,7 +286,7 @@ def eqn_literals(eqn): if type(v) is core.Literal: yield v.val -def jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, freevars, *args): +def jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, freevars, name_stack, *args): platform = xb.get_backend(backend).platform def read(v): @@ -301,7 +305,10 @@ def write(v, node): _map(write, jaxpr.freevars, freevars) _map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: - c.SetOpMetadata(xc.OpMetadata(op_type=eqn.primitive.name)) + c.SetOpMetadata(xc.OpMetadata( + op_type=eqn.primitive.name, + op_name=str(pp(name_stack) >> pp_eqn_compact( + eqn.primitive.name, eqn.params)))) in_nodes = list(map(read, eqn.invars)) if eqn.primitive in backend_specific_translations[platform]: rule = backend_specific_translations[platform][eqn.primitive] @@ -311,7 +318,8 @@ def write(v, node): elif eqn.primitive in initial_style_translations: new_params = check_backend_params(eqn.params, backend) rule = initial_style_translations[eqn.primitive] - ans = rule(c, axis_env, *in_nodes, backend=backend, **new_params) + ans = rule(c, axis_env, extend_name_stack(name_stack, eqn.primitive.name), + *in_nodes, backend=backend, **new_params) elif eqn.primitive in parallel_translations: replica_groups = axis_groups(axis_env, eqn.params['axis_name']) new_params = {k: v for k, v in eqn.params.items() if k != 'axis_name'} @@ -324,7 +332,7 @@ def write(v, node): freevar_nodes = _map(read, freevar_bindings) rule = call_translations[eqn.primitive] ans = rule(c, subjaxpr, axis_env, const_nodes, freevar_nodes, in_nodes, - backend=backend, **new_params) + name_stack, backend=backend, **new_params) else: msg = "XLA translation rule for primitive '{}' not found" raise NotImplementedError(msg.format(eqn.primitive.name)) @@ -437,10 +445,8 @@ def eqn_collectives(eqn): ### xla_call underlying jit -def _xla_call_impl(fun, *args, **params): - device = params['device'] - backend = params['backend'] - compiled_fun = _xla_callable(fun, device, backend, *map(arg_spec, args)) +def _xla_call_impl(fun, *args, device, backend, name): + compiled_fun = _xla_callable(fun, device, backend, name, *map(arg_spec, args)) try: return compiled_fun(*args) except FloatingPointError: @@ -449,7 +455,7 @@ def _xla_call_impl(fun, *args, **params): return fun.call_wrapped(*args) # probably won't return @lu.cache -def _xla_callable(fun, device, backend, *arg_specs): +def _xla_callable(fun, device, backend, name, *arg_specs): if device is not None and backend is not None: raise ValueError("can't specify both a device and a backend for jit, " "got device={} and backend={}".format(device, backend)) @@ -491,8 +497,9 @@ def _xla_callable(fun, device, backend, *arg_specs): c = xb.make_computation_builder("jit_{}".format(fun.__name__)) xla_consts = _map(c.Constant, consts) xla_args = _xla_callable_args(c, abstract_args, tuple_args) - out_nodes = jaxpr_subcomp(c, jaxpr, backend, AxisEnv(nreps, [], []), - xla_consts, (), *xla_args) + out_nodes = jaxpr_subcomp( + c, jaxpr, backend, AxisEnv(nreps, [], []), xla_consts, (), + extend_name_stack(wrap_name(name, 'jit')), *xla_args) built = c.Build(c.Tuple(*out_nodes)) options = xb.get_compile_options( @@ -592,13 +599,14 @@ def _get_device(device, backend): xla_call_p.def_impl(_xla_call_impl) def _xla_call_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, - in_nodes, backend, device=None): + in_nodes, name_stack, backend, name, device=None): del device # Ignored. - subc = xb.make_computation_builder("jaxpr_subcomputation") # TODO(mattjj): name + subc = xb.make_computation_builder("jit_{}".format(name)) consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, *args) + out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, + extend_name_stack(name_stack, wrap_name(name, 'jit')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) return c.Call(subc, list(const_nodes) + list(freevar_nodes) + list(in_nodes)) ad.primitive_transposes[xla_call_p] = partial(ad.call_transpose, xla_call_p) @@ -639,16 +647,17 @@ def lower_fun(fun, instantiate=False, initial_style=False): def f(c, *args, **params): backend = params.pop('backend', None) if initial_style: - axis_env, xla_args = args[0], args[1:] + axis_env, name_stack, xla_args = args[0], args[1], args[2:] else: - axis_env, xla_args = AxisEnv(), args + axis_env, name_stack, xla_args = AxisEnv(), '', args xla_shapes = tuple(map(c.GetShape, xla_args)) avals = map(_aval_from_xla_shape, xla_shapes) pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, params), pvals, instantiate=True) consts = _map(c.Constant, consts) - outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, (), *xla_args) + outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, (), + name_stack, *xla_args) return c.Tuple(*outs) return f @@ -952,7 +961,7 @@ def _device_put_impl(x, device=None): def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, in_nodes, - backend, device=None, concrete=None): + name_stack, backend, name, device=None, concrete=None): # This looks a lot like _xla_call_translation_rule, except for a widget we use # to foil CSE. del device, concrete # Unused. @@ -961,7 +970,8 @@ def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, in_n freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] args = [_foil_cse(subc, x) for x in args] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, *args) + out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, + extend_name_stack(name_stack, wrap_name(name, 'remat')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) return c.Call(subc, list(const_nodes) + list(freevar_nodes) + list(in_nodes)) call_translations[pe.remat_call_p] = _remat_translation_rule diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 6a20bd470f30..3dce7b236ef8 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3427,7 +3427,7 @@ def _reduction_computation(c, jaxpr, consts, init_value): subc = xla_bridge.make_computation_builder("reduction_computation") consts = [subc.ParameterWithShape(const) for const in consts] args = [subc.ParameterWithShape(shape), subc.ParameterWithShape(shape)] - out, = xla.jaxpr_subcomp(subc, jaxpr, None, axis_env, consts, (), *args) + out, = xla.jaxpr_subcomp(subc, jaxpr, None, axis_env, consts, (), '', *args) return subc.Build(out) def _masking_defreducer(prim, identity): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 01543a5e07f5..b8f2d631b215 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -43,7 +43,7 @@ from jax.lib import xla_bridge as xb from jax.lib import xla_client from jax.util import (partial, unzip2, safe_map, safe_zip, split_list, - split_dict, cache) + split_dict, cache, extend_name_stack) from jax.tree_util import (tree_flatten, tree_unflatten, treedef_is_leaf, treedef_children, treedef_tuple) from jax import ad_util @@ -213,7 +213,7 @@ def while_loop(cond_fun, body_fun, init_val): def _while_loop_abstract_eval(*args, **kwargs): return _map(raise_to_shaped, kwargs["body_jaxpr"].out_avals) -def _while_loop_translation_rule(c, axis_env, *args, **kwargs): +def _while_loop_translation_rule(c, axis_env, name_stack, *args, **kwargs): backend = kwargs.pop('backend') cond_jaxpr, body_jaxpr, cond_nconsts, body_nconsts = split_dict( kwargs, ["cond_jaxpr", "body_jaxpr", "cond_nconsts", "body_nconsts"]) @@ -233,7 +233,8 @@ def _while_loop_translation_rule(c, axis_env, *args, **kwargs): cond_carry_elts = [cond_c.GetTupleElement(cond_carry, i) for i in range(len(args))] x, _, z = split_list(cond_carry_elts, [cond_nconsts, body_nconsts]) pred, = xla.jaxpr_subcomp(cond_c, cond_jaxpr.jaxpr, backend, axis_env, - _map(cond_c.Constant, cond_jaxpr.literals), (), *(x + z)) + _map(cond_c.Constant, cond_jaxpr.literals), (), + extend_name_stack(name_stack, 'cond'), *(x + z)) if batched: scalar = ShapedArray((), onp.bool_) or_ = xla.primitive_subcomputation(lax.or_p, scalar, scalar) @@ -245,10 +246,12 @@ def _while_loop_translation_rule(c, axis_env, *args, **kwargs): body_carry_elts = [body_c.GetTupleElement(body_carry, i) for i in range(len(args))] x, y, z = split_list(body_carry_elts, [cond_nconsts, body_nconsts]) new_z = xla.jaxpr_subcomp(body_c, body_jaxpr.jaxpr, backend, axis_env, - _map(body_c.Constant, body_jaxpr.literals), (), *(y + z)) + _map(body_c.Constant, body_jaxpr.literals), (), + extend_name_stack(name_stack, 'body'), *(y + z)) if batched: body_pred, = xla.jaxpr_subcomp(body_c, cond_jaxpr.jaxpr, backend, axis_env, - _map(body_c.Constant, cond_jaxpr.literals), (), *(x + z)) + _map(body_c.Constant, cond_jaxpr.literals), (), + extend_name_stack(name_stack, 'body_pred'), *(x + z)) new_z = _map(partial(_pred_bcast_select, body_c, body_pred), new_z, z) assert _map(body_c.GetShape, new_z) == _map(body_c.GetShape, z) # no broadcast new_carry = body_c.Tuple(*itertools.chain(x, y, new_z)) @@ -426,7 +429,7 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): def _cond_abstract_eval(*args, **kwargs): return _map(raise_to_shaped, kwargs["true_jaxpr"].out_avals) -def _cond_translation_rule(c, axis_env, pred, *args, **kwargs): +def _cond_translation_rule(c, axis_env, name_stack, pred, *args, **kwargs): backend = kwargs.pop("backend", None) true_jaxpr, false_jaxpr, true_nconsts, false_nconsts = split_dict( kwargs, ["true_jaxpr", "false_jaxpr", "true_nconsts", "false_nconsts"]) @@ -435,18 +438,19 @@ def _cond_translation_rule(c, axis_env, pred, *args, **kwargs): args, [true_nconsts, true_nops, false_nconsts]) def make_computation(name, jaxpr, op_shape): - c = xb.make_computation_builder(name) + c = xb.make_computation_builder(name + '_comp') op = c.ParameterWithShape(op_shape) ops = [c.GetTupleElement(op, i) for i in range(len(jaxpr.in_avals))] outs = xla.jaxpr_subcomp(c, jaxpr.jaxpr, backend, axis_env, - _map(c.Constant, jaxpr.literals), (), *ops) + _map(c.Constant, jaxpr.literals), (), + extend_name_stack(name_stack, name + '_fun'), *ops) return c.Build(c.Tuple(*outs)) true_op = c.Tuple(*(true_consts + true_ops)) - true_c = make_computation("true_comp", true_jaxpr, c.GetShape(true_op)) + true_c = make_computation('true', true_jaxpr, c.GetShape(true_op)) false_op = c.Tuple(*(false_consts + false_ops)) - false_c = make_computation("false_comp", false_jaxpr, c.GetShape(false_op)) + false_c = make_computation('false', false_jaxpr, c.GetShape(false_op)) return c.Conditional(pred, true_op, true_c, false_op, false_c) diff --git a/jax/pprint_util.py b/jax/pprint_util.py index fd6034c05c4b..da639f9d7194 100644 --- a/jax/pprint_util.py +++ b/jax/pprint_util.py @@ -35,6 +35,8 @@ def __add__(self, rhs): def __rshift__(self, rhs): if not rhs.lines: return self + if not self.lines: + return rhs indent, s = self.lines[-1] indented_block = rhs.indent(indent + len(s)) @@ -44,7 +46,7 @@ def __rshift__(self, rhs): + indented_block.lines[1:]) def __str__(self): - return '\n'.join(' ' * indent + s for indent, s in self.lines) + '\n' + return '\n'.join(' ' * indent + s for indent, s in self.lines) def pp(s): diff --git a/jax/util.py b/jax/util.py index e3dbd76f4f6a..fa7cfe766648 100644 --- a/jax/util.py +++ b/jax/util.py @@ -228,3 +228,9 @@ def get_module_functions(module): attr, (types.BuiltinFunctionType, types.FunctionType, onp.ufunc)): module_fns.add(attr) return module_fns + +def wrap_name(name, transform_name): + return transform_name + '(' + name + ')' + +def extend_name_stack(stack, name=''): + return stack + name + '/' diff --git a/tests/metadata_test.py b/tests/metadata_test.py new file mode 100644 index 000000000000..344369abaf82 --- /dev/null +++ b/tests/metadata_test.py @@ -0,0 +1,113 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +from jax import test_util as jtu +from jax.lib import xla_bridge as xb +import jax +from jax import numpy as jnp + +from jax.config import config +config.parse_flags_with_absl() + +class MetadataTest(jtu.JaxTestCase): + + def setUp(self): + self.op_names = [] + self.op_types = [] + def SetOpMetadata(builder, metadata): + self.op_names.append(metadata.op_name) + self.op_types.append(metadata.op_type) + return super(xb._JaxComputationBuilder, builder).SetOpMetadata(metadata) + xb._JaxComputationBuilder.SetOpMetadata = SetOpMetadata + + def tearDown(self): + self.op_names = [] + self.op_types = [] + del xb._JaxComputationBuilder.SetOpMetadata + + def test_primitive_metadata(self): + _ = jnp.sin(1.) + assert self.op_types[-1] == 'sin' + assert self.op_names[-1] == 'sin' + _ = jnp.reshape(1., (1,)) + assert self.op_types[-1] == 'reshape' + assert self.op_names[-1] == 'reshape[ dimensions=None\n' \ + ' new_sizes=(1,)\n' \ + ' old_sizes=() ]' + + def test_jit_metadata(self): + _ = jax.jit(jnp.sin)(1.) + assert self.op_types[-1] == 'sin' + assert self.op_names[-1] == 'jit(sin)/sin' + def foo(x): + return jnp.sin(x) + _ = jax.jit(foo)(1.) + assert self.op_types[-1] == 'sin' + assert self.op_names[-1] == 'jit(foo)/sin' + + def test_nested_jit_metadata(self): + @jax.jit + def foo(x): + return jnp.sin(x) + def bar(x): + return jnp.cos(foo(x)) + _ = bar(1.) + assert self.op_types[-2] == 'sin' + assert self.op_names[-2] == 'jit(foo)/sin' + assert self.op_types[-1] == 'cos' + assert self.op_names[-1] == 'cos' + _ = jax.jit(bar)(1.) + assert self.op_types[-3] == 'xla_call' + assert self.op_names[-3] == 'jit(bar)/xla_call[ backend=None\n' \ + ' device=None\n' \ + ' name=foo ]' + assert self.op_types[-2] == 'sin' + assert self.op_names[-2] == 'jit(bar)/jit(foo)/sin' + assert self.op_types[-1] == 'cos' + assert self.op_names[-1] == 'jit(bar)/cos' + + def test_grad_jit_metadata(self): + @jax.jit + def foo(x): + return jnp.sin(x) + _ = jax.grad(foo)(1.) + assert self.op_types[-3] == 'sin' + assert self.op_names[-3] == 'jit(pe(jvp(foo)))/sin' + assert self.op_types[-2] == 'cos' + assert self.op_names[-2] == 'jit(pe(jvp(foo)))/cos' + assert self.op_types[-1] == 'mul' + assert self.op_names[-1] == 'jit(transpose(pe(jvp(foo))))/mul' + + def test_cond_metadata(self): + def true_fun(x): + return jnp.sin(x) + def false_fun(x): + return jnp.cos(x) + _ = jax.lax.cond(True, 1., true_fun, 1., false_fun) + assert self.op_types[-3] == 'cond' + assert self.op_names[-3] == 'cond[ false_nconsts=0\n' \ + ' true_nconsts=0 ]' + assert self.op_types[-2] == 'sin' + assert self.op_names[-2] == 'cond/true_fun/sin' + assert self.op_types[-1] == 'cos' + assert self.op_names[-1] == 'cond/false_fun/cos' + + +if __name__ == "__main__": + absltest.main() From 6a4bb9516925f28f613387d7fdc45e2643fc1de6 Mon Sep 17 00:00:00 2001 From: Roman Novak <44512421+romanngg@users.noreply.github.com> Date: Mon, 27 Jan 2020 00:16:04 -0800 Subject: [PATCH 0645/1053] Mare the reverse operator work on empty list of dimensions Example that this fixes: ``` from jax import lax import jax.numpy as np from jax.api import jacrev x = np.ones((3, 5)) def f(x): return lax.conv_general_dilated(lhs=x, rhs=np.ones((5, 2)), window_strides=(), padding='VALID', dimension_numbers=('NC', 'IO', 'NC')) jacrev(f)(x) ``` currently gives ``` --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in () 12 dimension_numbers=('NC', 'IO', 'NC')) 13 ---> 14 jacrev(f)(x).shape 15 frames google3/third_party/py/jax/api.py in jacfun(*args, **kwargs) 514 y, pullback = vjp(f_partial, *dyn_args) 515 holomorphic or tree_map(_check_real_output_jacrev, y) --> 516 jac = vmap(pullback)(_std_basis(y)) 517 jac = jac[0] if isinstance(argnums, int) else jac 518 example_args = dyn_args[0] if isinstance(argnums, int) else dyn_args google3/third_party/py/jax/api.py in batched_fun(*args) 692 _check_axis_sizes(in_tree, args_flat, in_axes_flat) 693 out_flat = batching.batch(flat_fun, args_flat, in_axes_flat, --> 694 lambda: _flatten_axes(out_tree(), out_axes)) 695 return tree_unflatten(out_tree(), out_flat) 696 google3/third_party/py/jax/interpreters/batching.py in batch(fun, in_vals, in_dims, out_dim_dests) 38 def batch(fun, in_vals, in_dims, out_dim_dests): 39 size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} ---> 40 out_vals, out_dims = batch_fun(fun, in_vals, in_dims) 41 return map(partial(matchaxis, size), out_dims, out_dim_dests(), out_vals) 42 google3/third_party/py/jax/interpreters/batching.py in batch_fun(fun, in_vals, in_dims) 44 with new_master(BatchTrace) as master: 45 fun, out_dims = batch_subtrace(fun, master, in_dims) ---> 46 out_vals = fun.call_wrapped(*in_vals) 47 del master 48 return out_vals, out_dims() google3/third_party/py/jax/linear_util.py in call_wrapped(self, *args, **kwargs) 150 gen = None 151 --> 152 ans = self.f(*args, **dict(self.params, **kwargs)) 153 del args 154 while stack: google3/third_party/py/jax/api.py in _vjp_pullback_wrapper(fun, cotangent_dtypes, io_tree, py_args) 1237 "match type of corresponding primal output ({})") 1238 raise TypeError(msg.format(_dtype(a), dtype)) -> 1239 ans = fun(*args) 1240 return tree_unflatten(out_tree, ans) 1241 google3/third_party/py/jax/interpreters/ad.py in vjp_(*cts) 114 dummy_primals_and_cts = (core.unit,) * len(cts) + cts 115 dummy_args = (undefined_primal,) * len(jaxpr.invars) --> 116 _, arg_cts = backward_pass(jaxpr, consts, (), dummy_args, dummy_primals_and_cts) 117 arg_cts = arg_cts[len(primals):] 118 return map(instantiate_zeros, primals, arg_cts) google3/third_party/py/jax/interpreters/ad.py in backward_pass(jaxpr, consts, freevar_vals, args, cotangents_in) 222 map(write_cotangent, bound_vars, ct_free_vars_out) 223 else: --> 224 cts_out = get_primitive_transpose(eqn.primitive)(cts_in, *invals, **eqn.params) 225 cts_out = [zero] * len(eqn.invars) if cts_out is zero else cts_out 226 map(write_cotangent, eqn.invars, cts_out) google3/third_party/py/jax/interpreters/ad.py in bilinear_transpose(lhs_rule, rhs_rule, cotangent, x, y, **kwargs) 505 assert (x is undefined_primal) ^ (y is undefined_primal) 506 if x is undefined_primal: --> 507 out = zero if cotangent is zero else lhs_rule(cotangent, y, **kwargs) 508 return out, None 509 else: google3/third_party/py/jax/lax/lax.py in _conv_general_dilated_transpose_lhs(g, rhs, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, lhs_shape, rhs_shape, precision) 2042 window_strides, onp.take(g.shape, out_sdims), padding, lhs_dilation, 2043 rhs_dilation) -> 2044 revd_weights = rev(rhs, rhs_sdims) 2045 return conv_general_dilated( 2046 g, revd_weights, window_strides=lhs_dilation, padding=padding, google3/third_party/py/jax/lax/lax.py in rev(operand, dimensions) 671 operator. 672 """ --> 673 return rev_p.bind(operand, dimensions=tuple(dimensions)) 674 675 def select(pred, on_true, on_false): google3/third_party/py/jax/core.py in bind(self, *args, **kwargs) 157 top_trace = find_top_trace(args) 158 if top_trace is None: --> 159 return self.impl(*args, **kwargs) 160 161 tracers = map(top_trace.full_raise, args) google3/third_party/py/jax/interpreters/xla.py in apply_primitive(prim, *args, **params) 159 def apply_primitive(prim, *args, **params): 160 """Impl rule that compiles and runs a single primitive 'prim' using XLA.""" --> 161 compiled_fun = xla_primitive_callable(prim, *map(arg_spec, args), **params) 162 return compiled_fun(*args) 163 google3/third_party/py/jax/interpreters/xla.py in xla_primitive_callable(prim, *arg_specs, **params) 167 device = _device_from_arg_devices(arg_devices) 168 backend = xb.get_device_backend(device) --> 169 aval_out = prim.abstract_eval(*avals, **params) 170 if not prim.multiple_results: 171 handle_result = aval_to_result_handler(device, aval_out) google3/third_party/py/jax/lax/lax.py in standard_abstract_eval(prim, shape_rule, dtype_rule, *args, **kwargs) 1540 return ConcreteArray(prim.impl(*[x.val for x in args], **kwargs)) 1541 elif least_specialized is ShapedArray: -> 1542 return ShapedArray(shape_rule(*args, **kwargs), dtype_rule(*args, **kwargs)) 1543 elif least_specialized is UnshapedArray: 1544 return UnshapedArray(dtype_rule(*args, **kwargs)) google3/third_party/py/jax/lax/lax.py in _rev_shape_rule(operand, dimensions) 2620 msg = 'rev dimensions must be unique, got {}.' 2621 raise TypeError(msg.format(dimensions)) -> 2622 if not _max(dimensions) < operand.ndim: 2623 msg = ('rev dimensions must all be less than operand ndim, got dimensions ' 2624 '{} for operand ndim {}.') ValueError: max() arg is an empty sequence ``` --- jax/lax/lax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 3dce7b236ef8..d750e9882450 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2619,7 +2619,7 @@ def _rev_shape_rule(operand, dimensions): if len(set(dimensions)) != len(dimensions): msg = 'rev dimensions must be unique, got {}.' raise TypeError(msg.format(dimensions)) - if not _max(dimensions) < operand.ndim: + if dimensions and not _max(dimensions) < operand.ndim: msg = ('rev dimensions must all be less than operand ndim, got dimensions ' '{} for operand ndim {}.') raise TypeError(msg.format(dimensions, operand.ndim)) From ffa198e8ef14aa538254636ef1de6e06b389b496 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 27 Jan 2020 12:48:10 -0500 Subject: [PATCH 0646/1053] Fix test failure on TPU. (#2088) Update GUARDED_BY annotations to use newer ABSL_GUARDED_BY form. --- jaxlib/cublas.cc | 3 ++- jaxlib/cusolver.cc | 3 ++- tests/linalg_test.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/jaxlib/cublas.cc b/jaxlib/cublas.cc index efa13beb35ae..d4fdc2cc8a1a 100644 --- a/jaxlib/cublas.cc +++ b/jaxlib/cublas.cc @@ -19,6 +19,7 @@ limitations under the License. #include #include "absl/base/casts.h" +#include "absl/base/thread_annotations.h" #include "absl/container/flat_hash_map.h" #include "absl/strings/str_format.h" #include "absl/synchronization/mutex.h" @@ -116,7 +117,7 @@ class BlasHandlePool { void Return(cublasHandle_t handle); absl::Mutex mu_; - std::vector handles_ GUARDED_BY(mu_); + std::vector handles_ ABSL_GUARDED_BY(mu_); }; /*static*/ BlasHandlePool* BlasHandlePool::Instance() { diff --git a/jaxlib/cusolver.cc b/jaxlib/cusolver.cc index a925a1178c19..dacc9e03f926 100644 --- a/jaxlib/cusolver.cc +++ b/jaxlib/cusolver.cc @@ -20,6 +20,7 @@ limitations under the License. #include #include "absl/base/casts.h" +#include "absl/base/thread_annotations.h" #include "absl/container/flat_hash_map.h" #include "absl/memory/memory.h" #include "absl/strings/str_format.h" @@ -122,7 +123,7 @@ class SolverHandlePool { void Return(cusolverDnHandle_t handle); absl::Mutex mu_; - std::vector handles_ GUARDED_BY(mu_); + std::vector handles_ ABSL_GUARDED_BY(mu_); }; /*static*/ SolverHandlePool* SolverHandlePool::Instance() { diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 81d18c495f9c..fe620a902965 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -617,9 +617,10 @@ def testMatrixPower(self, shape, dtype, n, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) args_maker = lambda: [rng(shape, dtype)] + tol = 1e-1 if jtu.device_under_test() == "tpu" else 1e-3 self._CheckAgainstNumpy(partial(onp.linalg.matrix_power, n=n), partial(np.linalg.matrix_power, n=n), - args_maker, check_dtypes=True, tol=1e-3) + args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(partial(np.linalg.matrix_power, n=n), args_maker, check_dtypes=True, rtol=1e-3) From 832bb71c5dcfcbb35ca1f1f0dcaa1056af5dce7e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 27 Jan 2020 13:15:41 -0500 Subject: [PATCH 0647/1053] Add missing BUILD dependency. (#2089) --- jaxlib/BUILD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jaxlib/BUILD b/jaxlib/BUILD index 4d967d201c3f..32a88ce48897 100644 --- a/jaxlib/BUILD +++ b/jaxlib/BUILD @@ -123,6 +123,7 @@ pybind_extension( ":kernel_pybind11_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", + "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/container:flat_hash_map", "@com_google_absl//absl/hash", "@com_google_absl//absl/memory", @@ -151,6 +152,7 @@ pybind_extension( ":kernel_pybind11_helpers", "@com_google_absl//absl/algorithm:container", "@com_google_absl//absl/base", + "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/container:flat_hash_map", "@com_google_absl//absl/hash", "@com_google_absl//absl/memory", From e0ed5adc755ae1c16ae77a65b466844e424df957 Mon Sep 17 00:00:00 2001 From: Aidan Dang Date: Mon, 27 Jan 2020 19:57:43 +0000 Subject: [PATCH 0648/1053] Allow JVP for SVD when not computing singular vectors (#2076) * Allow SVD JVP when not computing singular vectors * Test SVD JVP when not computing full singular vecs --- jax/lax_linalg.py | 2 +- tests/linalg_test.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index a1ba3424c2ce..f2532478e7b8 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -776,7 +776,7 @@ def svd_jvp_rule(primals, tangents, full_matrices, compute_uv): dA, = tangents s, U, Vt = svd_p.bind(A, full_matrices=False, compute_uv=True) - if full_matrices: + if compute_uv and full_matrices: # TODO: implement full matrices case, documented here: https://people.maths.ox.ac.uk/gilesm/files/NA-08-01.pdf raise NotImplementedError( "Singular value decomposition JVP not implemented for full matrices") diff --git a/tests/linalg_test.py b/tests/linalg_test.py index fe620a902965..bb37d71e3ce9 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -456,8 +456,8 @@ def norm(x): self._CompileAndCheck(partial(np.linalg.svd, full_matrices=full_matrices, compute_uv=compute_uv), args_maker, check_dtypes=True) - if not full_matrices: - svd = partial(np.linalg.svd, full_matrices=False) + if not (compute_uv and full_matrices): + svd = partial(np.linalg.svd, full_matrices=full_matrices, compute_uv=compute_uv) jtu.check_jvp(svd, partial(jvp, svd), (a,), rtol=1e-2, atol=1e-1) @parameterized.named_parameters(jtu.cases_from_list( From 82d6c6ce518d4d6925c42f3cd2cc1fd1a2d15146 Mon Sep 17 00:00:00 2001 From: Chase Roberts Date: Mon, 27 Jan 2020 15:44:33 -0800 Subject: [PATCH 0649/1053] Added better error messages. (#2058) #2057 Added better error messages for when a user accidentally uses a python cast instead of a the `jax.numpy` casting. --- jax/abstract_arrays.py | 28 ++++++++++++++++------------ tests/api_test.py | 10 ++++++++++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index a0dc95255db7..51cf2f0240a3 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -24,17 +24,18 @@ from . util import prod, partialmethod -def concretization_err_msg(fun): +def concretization_err_msg(fun, context=None): fname = getattr(fun, "__name__", fun) - msg = ("Abstract value passed to `{}`, which requires a concrete value. " - "The function to be transformed can't be traced at the required level " - "of abstraction. If using `jit`, try using `static_argnums` or " - "applying `jit` to smaller subfunctions instead.") - return msg.format(fname) - -def concretization_function_error(fun): + if context is None: + context = ("The function to be transformed can't be traced at the required level " + "of abstraction. If using `jit`, try using `static_argnums` or " + "applying `jit` to smaller subfunctions instead.") + msg = "Abstract value passed to `{}`, which requires a concrete value. {}" + return msg.format(fname, context) + +def concretization_function_error(fun, context=None): def error(self, *args): - raise TypeError(concretization_err_msg(fun)) + raise TypeError(concretization_err_msg(fun, context)) return error @@ -64,9 +65,12 @@ def __repr__(self): ", weak_type=True" if self.weak_type else "") _bool = _nonzero = concretization_function_error(bool) - _float = concretization_function_error(float) - _int = concretization_function_error(int) - _complex = concretization_function_error(complex) + _float = concretization_function_error( + float, "Try using `value.astype(float)` instead.") + _int = concretization_function_error( + int, "Try using `value.astype(int)` instead.") + _complex = concretization_function_error( + complex, "Try using `value.astype(complex)` instead.") _hex = concretization_function_error(hex) _oct = concretization_function_error(oct) diff --git a/tests/api_test.py b/tests/api_test.py index 4dbe2366de66..0d21d3a379b6 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -221,6 +221,16 @@ def f(x, y): self.assertRaisesRegex( TypeError, "Incompatible shapes for dot: got \\(3L?,\\) and \\(4L?,\\).", lambda: grad(f)(onp.zeros(3), onp.zeros(4))) + + def test_abstract_error_message(self): + for castfun in [float, complex, int]: + def f(x): + return castfun(x) + + self.assertRaisesRegex( + TypeError, + "Try using `value.astype\({}\)` instead".format(castfun.__name__), + lambda: jit(f)(1.0)) def test_switch_value_jit(self): def f(x): From 95ccaae8058f8fb49c81680f1f9061bf96d8d95e Mon Sep 17 00:00:00 2001 From: Roman Novak <44512421+romanngg@users.noreply.github.com> Date: Mon, 27 Jan 2020 16:14:28 -0800 Subject: [PATCH 0650/1053] Add test for empty dimension list for reversion --- tests/lax_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/lax_test.py b/tests/lax_test.py index 25ff95f5eb55..420990d5a8ec 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -913,6 +913,10 @@ def testPadAgainstNumpy(self, shape, dtype, pads, rng_factory): def testReverse(self): rev = api.jit(lambda operand: lax.rev(operand, dimensions)) + dimensions = [] + self.assertAllClose(onp.array([0, 1, 2, 3]), rev(onp.array([0, 1, 2, 3])), + check_dtypes=False) + dimensions = [0] self.assertAllClose(onp.array([3, 2, 1]), rev(onp.array([1, 2, 3])), check_dtypes=False) From 21551c2378b1f56f358d72beb814befb38ff0b25 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 28 Jan 2020 09:24:26 -0500 Subject: [PATCH 0651/1053] Bump JAX version to 0.1.58. --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index a722a80b70f6..d40ee5e15f5b 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.57" +__version__ = "0.1.58" From 0fe601227fd5f6e9c1c7a6e650167f6113fe7322 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 28 Jan 2020 09:57:15 -0500 Subject: [PATCH 0652/1053] Update README.md and CHANGELOG.md. --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++-- README.md | 7 +++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 786ca68a3567..7ac399a7a4f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,38 @@ These are the release notes for JAX. -## jax 0.1.58 (unreleased) +## jax 0.1.59 (unreleased) + +## jax 0.1.58 ### Breaking changes +* JAX has dropped Python 2 support, because Python 2 reached its end of life on + January 1, 2020. Please update to Python 3.5 or newer. + ### New features -- Forward AD of while loop (https://github.com/google/jax/pull/1980) +* Forward-mode automatic differentiation (`jvp`) of while loop + (https://github.com/google/jax/pull/1980) +* New NumPy and SciPy functions: + * `jax.numpy.fft.fft2` + * `jax.numpy.fft.ifft2` + * `jax.numpy.fft.rfft` + * `jax.numpy.fft.irfft` + * `jax.numpy.fft.rfft2` + * `jax.numpy.fft.irfft2` + * `jax.numpy.fft.rfftn` + * `jax.numpy.fft.irfftn` + * `jax.numpy.fft.fftfreq` + * `jax.numpy.fft.rfftfreq` + * `jax.numpy.linalg.matrix_rank` + * `jax.numpy.linalg.matrix_power` + * `jax.scipy.special.betainc` +* Batched Cholesky decomposition on GPU now uses a more efficient batched + kernel. + ### Notable bug fixes + +* With the Python 3 upgrade, JAX no longer depends on `fastcache`, which should + help with installation. diff --git a/README.md b/README.md index 21e65da67858..3d95a148499d 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,13 @@ | [**Install guide**](#installation) | [**Reference docs**](https://jax.readthedocs.io/en/latest/) +## Announcements + +* `jax` 0.1.58 has been released. As of `jax` 0.1.58, JAX has dropped Python 2 + support. Please update to Python 3.5 or newer. + +## What is JAX? + JAX is [Autograd](https://github.com/hips/autograd) and [XLA](https://www.tensorflow.org/xla), brought together for high-performance machine learning research. From 55f2d3be27eaf0f75aac9b2937e6fab87076315a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 28 Jan 2020 11:17:21 -0500 Subject: [PATCH 0653/1053] Update Jaxlib docker build. * work around https://github.com/bazelbuild/bazel/issues/9254 by setting BAZEL_LINKLIBS=-lstdc++ * drop CUDA 9.0 support, since we use a batched kernel only present in CUDA 9.2 or later. * drop Python 2.7 support. --- build/Dockerfile | 6 ------ build/build_jaxlib_wheels.sh | 2 +- build/build_wheel_docker_entrypoint.sh | 3 +++ 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index c88c6a279b0d..009e6f375d4d 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -7,18 +7,12 @@ RUN apt-get update RUN apt-get install libffi-dev RUN git clone --branch v1.2.14 https://github.com/pyenv/pyenv.git /pyenv ENV PYENV_ROOT /pyenv -RUN /pyenv/bin/pyenv install 2.7.15 RUN /pyenv/bin/pyenv install 3.5.6 RUN /pyenv/bin/pyenv install 3.6.8 RUN /pyenv/bin/pyenv install 3.7.2 RUN /pyenv/bin/pyenv install 3.8.0 -# Install build-dependencies of scipy. -# TODO(phawkins): remove when there are scipy wheels for Python 3.8. -RUN apt-get update && apt-get install -y libopenblas-dev gfortran - # We pin numpy to a version < 1.16 to avoid version compatibility issues. -RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 2.7.15 && pip install numpy==1.15.4 scipy cython setuptools wheel future six RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.5.6 && pip install numpy==1.15.4 scipy cython setuptools wheel six RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.6.8 && pip install numpy==1.15.4 scipy cython setuptools wheel six RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.7.2 && pip install numpy==1.15.4 scipy cython setuptools wheel six diff --git a/build/build_jaxlib_wheels.sh b/build/build_jaxlib_wheels.sh index 97b10eea415e..d6d8346f062f 100755 --- a/build/build_jaxlib_wheels.sh +++ b/build/build_jaxlib_wheels.sh @@ -2,7 +2,7 @@ set -xev PYTHON_VERSIONS="3.5.6 3.6.8 3.7.2 3.8.0" -CUDA_VERSIONS="9.0 9.2 10.0 10.1" +CUDA_VERSIONS="9.2 10.0 10.1" CUDA_VARIANTS="cuda" # "cuda-included" mkdir -p dist diff --git a/build/build_wheel_docker_entrypoint.sh b/build/build_wheel_docker_entrypoint.sh index c5df29d11571..7014a363efde 100755 --- a/build/build_wheel_docker_entrypoint.sh +++ b/build/build_wheel_docker_entrypoint.sh @@ -38,6 +38,9 @@ PY_TAG=$(python -c "import wheel; import wheel.pep425tags as t; print(t.get_abbr echo "Python tag: $PY_TAG" +# Workaround for https://github.com/bazelbuild/bazel/issues/9254 +export BAZEL_LINKLIBS="-lstdc++" + case $2 in cuda-included) python build.py --enable_cuda --bazel_startup_options="--output_user_root=/build/root" From b54c18efb4e30831c77cd8698dcdaa7864e74440 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 28 Jan 2020 15:45:40 -0500 Subject: [PATCH 0654/1053] Use Device hash and equality instead of using a (class, id) pair. We couldn't figure out why we did it this way in the first place and all the tests we have pass. --- jax/interpreters/xla.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index b47f0a5b9807..226f37e1c425 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -180,15 +180,13 @@ def xla_primitive_callable(prim, *arg_specs, **params): return partial(_execute_compiled_primitive, prim, compiled, backend, tuple_args, handle_result) -# TODO(mattjj): make Device instances hashable instead of handling pairs here def _device_from_arg_devices(devices): """Given devices of inputs, determine where to perform a computation. Args: - devices: list where each element is a either a pair consisting of a device - class and an int id (representing a Device instance) or a None. + devices: list where each element is a either a `Device` instance or `None`. Returns: - A Device instance or None. + A `Device` instance or None. Raises: ValueError if input devices are inconsistent. """ @@ -200,7 +198,7 @@ class and an int id (representing a Device instance) or a None. raise ValueError(msg.format(", ".join(names))) else: all_devices = it.chain(xb.devices(), xb.devices('cpu')) - return device and next(d for d in all_devices if (type(d), d.id) == device) + return device and next(d for d in all_devices if d == device) @cache() def primitive_computation(prim, backend, tuple_args, *avals, **params): @@ -719,7 +717,7 @@ class DeviceArray(DeviceValue): def __init__(self, aval, device, lazy_expr, device_buffer): self.aval = aval self.device_buffer = device_buffer - self._device = device and (type(device), device.id) + self._device = device self._lazy_expr = lazy_expr self._npy_value = None @@ -906,8 +904,7 @@ def _force(x): device = x._device sticky = True else: - d = x.device_buffer.device() - device = d and (type(d), d.id) + device = x.device_buffer.device() sticky = False force_fun = _lazy_force_computation(sticky, x.aval, device, x._lazy_expr) return force_fun(x) From b68d8b5c4fead01ba85da9a9574a686493a5b7ba Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Tue, 28 Jan 2020 15:48:37 -0500 Subject: [PATCH 0655/1053] Clarify instructions for building from source. (#2093) Adds additional subsections of the `Building from source` documentation page to make it more obvious that you can install `jaxlib` from pip when doing Python-only development. --- docs/developer.rst | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/docs/developer.rst b/docs/developer.rst index 7a5bc7ade836..ea55a9fd6b77 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -8,18 +8,34 @@ First, obtain the JAX source code. git clone https://github.com/google/jax cd jax +Building JAX involves two steps: -There are two steps to building JAX: building ``jaxlib`` and installing ``jax``. +1. Building or installing ``jaxlib``, the C++ support library for ``jax``. +2. Installing the ``jax`` Python package. + +Building or installing ``jaxlib`` +--------------------------------- + +Installing ``jaxlib`` with pip +.............................. If you're only modifying Python portions of JAX, you may be able to install -``jaxlib`` from pip or a prebuilt wheel and skip to installing ``jax`` from -source. +``jaxlib`` from pip (or a prebuilt wheel). You can install with pip by running: + +.. code-block:: shell + + pip install jaxlib -To build ``jaxlib``, you must also install some prerequisites: - * a C++ compiler (g++ or clang) - * Numpy - * Scipy - * Cython + +Building ``jaxlib`` from source +............................... + +To build ``jaxlib`` from source, you must also install some prerequisites: + +* a C++ compiler (g++ or clang) +* Numpy +* Scipy +* Cython On Ubuntu 18.04 or Debian you can install the necessary prerequisites with: @@ -58,6 +74,9 @@ To build ``jaxlib`` without CUDA GPU support (CPU only), drop the ``--enable_cud python build/build.py pip install -e build # installs jaxlib (includes XLA) +Installing ``jax`` +------------------ + Once ``jaxlib`` has been installed, you can install ``jax`` by running .. code-block:: shell @@ -66,8 +85,8 @@ Once ``jaxlib`` has been installed, you can install ``jax`` by running To upgrade to the latest version from GitHub, just run ``git pull`` from the JAX repository root, and rebuild by running ``build.py`` or upgrading ``jaxlib`` if -necessary. You shouldn't have to reinstall because ``pip install -e`` sets up -symbolic links from site-packages into the repository. +necessary. You shouldn't have to reinstall ``jax`` because ``pip install -e`` +sets up symbolic links from site-packages into the repository. Running the tests ================= From 126ae7fccfc9d2a93947f26fd427ed87c627bb08 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 28 Jan 2020 15:58:02 -0500 Subject: [PATCH 0656/1053] Implement ndarray.tolist() on DeviceArray. --- jax/numpy/lax_numpy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e63e85ad3956..810cfa93f0b3 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3445,6 +3445,7 @@ def _operator_round(number, ndigits=None): setattr(DeviceArray, "real", property(real)) setattr(DeviceArray, "imag", property(imag)) setattr(DeviceArray, "astype", _astype) +setattr(DeviceArray, "tolist", lambda x: onp.array(x).tolist()) # Extra methods that are handy From 1afcac70dfeaa4ffc89d79dc64f72361e18c4a91 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 28 Jan 2020 16:41:21 -0800 Subject: [PATCH 0657/1053] tweak readme not to have bad line wrap --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 3d95a148499d..e2ec67ee4597 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,7 @@ | [**Install guide**](#installation) | [**Reference docs**](https://jax.readthedocs.io/en/latest/) -## Announcements - -* `jax` 0.1.58 has been released. As of `jax` 0.1.58, JAX has dropped Python 2 - support. Please update to Python 3.5 or newer. +As of `jax` 0.1.58, JAX has dropped Python 2 support. Please update to Python 3.5 or newer. ## What is JAX? From 6aaf257d8a61e654bb7c42a44f1a37e6204d311c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 28 Jan 2020 18:04:52 -0800 Subject: [PATCH 0658/1053] Update WORKSPACE --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 426323f3b018..9c4a4ff76292 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "b8b62014b91c1550f6ae69e3860c72b05cbb42b7361dab4150756cfe74981fdc", - strip_prefix = "tensorflow-2c23f12b5a75e3471d491f88b4f813ba67d08273", + sha256 = "d873d5cedbd91b44f5512fee2548c158f9d6ed5448e4a554264eca0800df1e6f", + strip_prefix = "tensorflow-e0d40be9f3db043787637c07ca342bd3ed1a2bee", urls = [ - "https://github.com/tensorflow/tensorflow/archive/2c23f12b5a75e3471d491f88b4f813ba67d08273.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/e0d40be9f3db043787637c07ca342bd3ed1a2bee.tar.gz", ], ) From 71811be3b9257ab1fc48fce8fb0512c0a384d901 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 28 Jan 2020 18:15:16 -0800 Subject: [PATCH 0659/1053] tweak top-line announcement text in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2ec67ee4597..891656f528da 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | [**Install guide**](#installation) | [**Reference docs**](https://jax.readthedocs.io/en/latest/) -As of `jax` 0.1.58, JAX has dropped Python 2 support. Please update to Python 3.5 or newer. +**Announcement:** As of version 0.1.58, JAX has dropped Python 2 support, and requires Python 3.5 or newer. See [CHANGELOG.md](https://github.com/google/jax/blob/master/CHANGELOG.md). ## What is JAX? From d46e82d0abbb4e0d009d5b201a178871d5e2c672 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 28 Jan 2020 18:16:04 -0800 Subject: [PATCH 0660/1053] tweak readme announcement text again --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 891656f528da..31df73e93616 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | [**Install guide**](#installation) | [**Reference docs**](https://jax.readthedocs.io/en/latest/) -**Announcement:** As of version 0.1.58, JAX has dropped Python 2 support, and requires Python 3.5 or newer. See [CHANGELOG.md](https://github.com/google/jax/blob/master/CHANGELOG.md). +**Announcement:** JAX 0.1.58 has dropped Python 2 support, and requires Python 3.5 or newer. See [CHANGELOG.md](https://github.com/google/jax/blob/master/CHANGELOG.md). ## What is JAX? From 9f7f161c5f9667c96b24db07325eddfce6dd26d4 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 28 Jan 2020 21:42:45 -0500 Subject: [PATCH 0661/1053] Incorporate review comments. --- jax/interpreters/xla.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 226f37e1c425..8e029cf19845 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -192,13 +192,11 @@ def _device_from_arg_devices(devices): """ try: device, = set(d for d in devices if d is not None) or (None,) + return device except ValueError: msg = "primitive arguments must be colocated on the same device, got {}" names = ("{}({})".format(d[0].__name__, d[1]) for d in devices if d is not None) raise ValueError(msg.format(", ".join(names))) - else: - all_devices = it.chain(xb.devices(), xb.devices('cpu')) - return device and next(d for d in all_devices if d == device) @cache() def primitive_computation(prim, backend, tuple_args, *avals, **params): From 1a5d9c531a7ec37da5ccb0a904aea454f20df5ee Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 28 Jan 2020 18:45:45 -0800 Subject: [PATCH 0662/1053] clear compilation cache before metadata tests (#2103) --- tests/metadata_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/metadata_test.py b/tests/metadata_test.py index 344369abaf82..e4a614dc9ece 100644 --- a/tests/metadata_test.py +++ b/tests/metadata_test.py @@ -18,7 +18,9 @@ from absl.testing import absltest from jax import test_util as jtu +from jax.interpreters import xla from jax.lib import xla_bridge as xb + import jax from jax import numpy as jnp @@ -28,6 +30,8 @@ class MetadataTest(jtu.JaxTestCase): def setUp(self): + xla.xla_primitive_callable.cache_clear() + xla._xla_callable.cache_clear() self.op_names = [] self.op_types = [] def SetOpMetadata(builder, metadata): From 4e575e1492afc08c8307d77cf7c784a17a52016e Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Wed, 29 Jan 2020 03:04:59 +0000 Subject: [PATCH 0663/1053] Support trees in lax parallel operations. (#1953) It is relatively common to apply collective operations to trees. For example in sync distributed training it is typical to sum all gradients across replicas `grads = jax.tree_map(partial(lax.psum, axis_name='i'), grads)`. We can make this a little more convenient by making lax parallel ops support trees directly: `grads = lax.psum(grads, 'i')`. There is room for improvement in this change. We should in some (all?) cases just pass a tuple of values to XLA (rather than bind the primivive n times bind once with a tuple of n values) however this produced strange values when combined with pmap and a fix was not obvious. This is something we can follow up on without users having to change their code. --- jax/lax/lax_parallel.py | 73 +++++++++++++++++++++++++++-------------- tests/pmap_test.py | 28 ++++++++++++++++ 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index ca40c22d72b5..7808d4911ee6 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -24,6 +24,7 @@ from jax import core from jax import ad_util from jax import dtypes +from jax import tree_util from jax.lax import lax from jax.abstract_arrays import ShapedArray from jax.interpreters import ad @@ -41,13 +42,16 @@ def psum(x, axis_name): """Compute an all-reduce sum on ``x`` over the pmapped axis ``axis_name``. + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + Args: - x: array with a mapped axis named ``axis_name``. + x: array(s) with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). Returns: - An array with the same shape as ``x`` representing the result of an + Array(s) with the same shape as ``x`` representing the result of an all-reduce sum along the axis ``axis_name``. For example, with 4 XLA devices available: @@ -60,43 +64,52 @@ def psum(x, axis_name): >>> print(y) [ 0. 0.16666667 0.33333334 0.5 ] """ - return psum_p.bind(x, axis_name=axis_name) + return tree_util.tree_map(partial(psum_p.bind, axis_name=axis_name), x) def pmax(x, axis_name): """Compute an all-reduce max on ``x`` over the pmapped axis ``axis_name``. + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + Args: - x: array with a mapped axis named ``axis_name``. + x: array(s) with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). Returns: - An array with the same shape as ``x`` representing the result of an + Array(s) with the same shape as ``x`` representing the result of an all-reduce max along the axis ``axis_name``. """ - return pmax_p.bind(x, axis_name=axis_name) + return tree_util.tree_map(partial(pmax_p.bind, axis_name=axis_name), x) def pmin(x, axis_name): """Compute an all-reduce min on ``x`` over the pmapped axis ``axis_name``. + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + Args: - x: array with a mapped axis named ``axis_name``. + x: array(s) with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). Returns: - An array with the same shape as ``x`` representing the result of an + Array(s) with the same shape as ``x`` representing the result of an all-reduce min along the axis ``axis_name``. """ - return pmin_p.bind(x, axis_name=axis_name) + return tree_util.tree_map(partial(pmin_p.bind, axis_name=axis_name), x) def ppermute(x, axis_name, perm): """Perform a collective permutation according to the permutation ``perm``. + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + This function is an analog of the CollectivePermute XLA HLO. Args: - x: array with a mapped axis named ``axis_name``. + x: array(s) with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). perm: list of pairs of ints, representing (source_index, destination_index) @@ -108,18 +121,22 @@ def ppermute(x, axis_name, perm): values in the result are filled with zeros of the appropriate type. Returns: - An array with the same shape as ``x`` with slices along the axis + Array(s) with the same shape as ``x`` with slices along the axis ``axis_name`` gathered from ``x`` according to the permutation ``perm``. """ - return ppermute_p.bind(x, axis_name=axis_name, perm=tuple(perm)) + return tree_util.tree_map( + partial(ppermute_p.bind, axis_name=axis_name, perm=tuple(perm)), x) def pshuffle(x, axis_name, perm): """Perform a collective shuffle according to the permutation ``perm``. + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + This function is a simple wrapper around jax.lax.ppermute. Args: - x: array with a mapped axis named ``axis_name``. + x: array(s) with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). perm: list of of ints, representing the new order of the source indices @@ -128,7 +145,7 @@ def pshuffle(x, axis_name, perm): ``axis_name``. Every int between 0 and ``len(perm)-1`` should be included. Returns: - An array with the same shape as ``x`` with slices along the axis + Array(s) with the same shape as ``x`` with slices along the axis ``axis_name`` gathered from ``x`` according to the permutation ``perm``. """ if set(perm) != set(range(len(perm))): @@ -140,6 +157,9 @@ def pshuffle(x, axis_name, perm): def pswapaxes(x, axis_name, axis): """Swap the pmapped axis ``axis_name`` with the unmapped axis ``axis``. + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + The mapped axis size must be equal to the size of the unmapped axis; that is, we must have ``lax.psum(1, axis_name) == x.shape[axis]``. @@ -148,14 +168,14 @@ def pswapaxes(x, axis_name, axis): equivalent to ``all_to_all(x, axis_name, axis, axis)``. Args: - x: array with a mapped axis named ``axis_name``. + x: array(s) with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). axis: int indicating the unmapped axis of ``x`` to map with the name ``axis_name``. Returns: - An array with shape ``np.insert(np.delete(x.shape, axis), axis, axis_size)`` + Array(s) with shape ``np.insert(np.delete(x.shape, axis), axis, axis_size)`` where ``axis_size`` is the size of the mapped axis named ``axis_name`` in the input ``x``. """ @@ -164,6 +184,9 @@ def pswapaxes(x, axis_name, axis): def all_to_all(x, axis_name, split_axis, concat_axis): """Materialize the mapped axis and map a different axis. + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + In the output, the input mapped axis ``axis_name`` is materialized at the logical axis position ``concat_axis``, and the input unmapped axis at position ``split_axis`` is mapped with the name ``axis_name``. @@ -172,7 +195,7 @@ def all_to_all(x, axis_name, split_axis, concat_axis): that is, we must have ``lax.psum(1, axis_name) == x.shape[split_axis]``. Args: - x: array with a mapped axis named ``axis_name``. + x: array(s) with a mapped axis named ``axis_name``. axis_name: hashable Python object used to name a pmapped axis (see the ``pmap`` docstring for more details). split_axis: int indicating the unmapped axis of ``x`` to map with the name @@ -181,18 +204,20 @@ def all_to_all(x, axis_name, split_axis, concat_axis): mapped axis of the input with the name ``axis_name``. Returns: - An array with shape given by the expression:: + Array(s) with shape given by the expression:: np.insert(np.delete(x.shape, split_axis), concat_axis, axis_size) where ``axis_size`` is the size of the mapped axis named ``axis_name`` in the input ``x``, i.e. ``axis_size = lax.psum(1, axis_name)``. """ - if psum(1, axis_name) != x.shape[split_axis]: - msg = ("all_to_all requires the size of the mapped axis axis_name to equal " - "x.shape[split_axis], but they are {} and {} respectively.") - raise ValueError(msg.format(psum(1, axis_name), x.shape[split_axis])) - return all_to_all_p.bind(x, split_axis=split_axis, concat_axis=concat_axis, - axis_name=axis_name) + def bind(x): + if psum(1, axis_name) != x.shape[split_axis]: + msg = ("all_to_all requires the size of the mapped axis axis_name to " + "equal x.shape[split_axis], but they are {} and {} respectively.") + raise ValueError(msg.format(psum(1, axis_name), x.shape[split_axis])) + return all_to_all_p.bind(x, split_axis=split_axis, concat_axis=concat_axis, + axis_name=axis_name) + return tree_util.tree_map(bind, x) ### parallel primitives diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 2248583eb03f..4e58f8096672 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -28,6 +28,7 @@ import jax import jax.numpy as np from jax import test_util as jtu +from jax import tree_util from jax import core from jax import lax from jax import random @@ -90,6 +91,33 @@ def testBasic(self): ans = f(x) self.assertAllClose(ans, expected, check_dtypes=False) + def testTrees(self): + ptranspose = lambda x, axis_name: lax.all_to_all(x, axis_name, 0, 0) + def protate(x, axis_name): + n = lax.psum(1, axis_name) + return lax.ppermute(x, axis_name, [(i, (i + 1) % n) for i in range(n)]) + + tree_f = lambda f: partial(tree_util.tree_map, f) + jax_f = lambda p: pmap(lambda x: p(x, 'i'), 'i') + onp_f = lambda p: tree_f(lambda x: onp.broadcast_to(p(x, 0), x.shape)) + onp_transpose = tree_f(onp.transpose) + onp_rotate = tree_f(lambda x: onp.concatenate([x[-1:], x[:-1]])) + + n = xla_bridge.device_count() + x = {'a': onp.arange(1 * n * n, 2 * n * n).reshape([n, n]), + 'b': onp.arange(2 * n * n, 3 * n * n).reshape([n, n]), + 'c': onp.arange(4 * n * n, 5 * n * n).reshape([n, n])} + + assert_allclose = partial(tree_util.tree_multimap, + partial(self.assertAllClose, check_dtypes=False)) + assert_allclose(jax_f(lax.pmax)(x), onp_f(onp.max)(x)) + assert_allclose(jax_f(lax.pmin)(x), onp_f(onp.min)(x)) + assert_allclose(jax_f(lax.psum)(x), onp_f(onp.sum)(x)) + if jtu.device_under_test() not in ("cpu", "gpu"): + # NOTE: all-to-all and ppermute only supported on TPU. + assert_allclose(jax_f(ptranspose)(x), onp_transpose(x)) + assert_allclose(jax_f(protate)(x), onp_rotate(x)) + def testComplexPsum(self): f = pmap(lambda x: x - lax.psum(x, 'i'), axis_name='i') From 04befac4f64e712772dfe5e3c248ce6cee7b618d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 10:14:36 -0500 Subject: [PATCH 0664/1053] Fix error case in tensordot. (#2111) --- jax/numpy/lax_numpy.py | 2 +- tests/lax_numpy_test.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 810cfa93f0b3..063a43c1f168 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2308,7 +2308,7 @@ def tensordot(a, b, axes=2, precision=None): if type(axes) is int: if axes > _min(a_ndim, b_ndim): msg = "Number of tensordot axes (axes {}) exceeds input ranks ({} and {})" - raise msg.format(axes, a.shape, b.shape) + raise TypeError(msg.format(axes, a.shape, b.shape)) contracting_dims = tuple(range(a_ndim - axes, a_ndim)), tuple(range(axes)) elif type(axes) in (list, tuple) and len(axes) == 2: ax1, ax2 = axes diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index dca6e9ee30c8..029202870d09 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -814,6 +814,13 @@ def onp_fun(a, b): tol=tol) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + def testTensordotErrors(self): + a = onp.random.random((3, 2, 2)) + b = onp.random.random((2,)) + self.assertRaisesRegex( + TypeError, "Number of tensordot axes.*exceeds input ranks.*", + lambda: lnp.tensordot(a, b, axes=2)) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_{}".format( jtu.format_shape_dtype_string(lhs_shape, lhs_dtype), From 0904e5ff742d3ee76dbca4440e9372f0c2b5595b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 10:51:39 -0500 Subject: [PATCH 0665/1053] Fix implementation of cumsum/cumprod for boolean inputs. (#2112) Check for number inputs in the reduce_window_sum dtype rule. --- jax/lax/lax.py | 3 +++ jax/numpy/lax_numpy.py | 3 ++- tests/lax_numpy_test.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index d750e9882450..5f4f7fd2fe2a 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3627,6 +3627,9 @@ def reduce_window(x, window_dimensions, window_strides, padding): def _reduce_window_sum_shape_rule(operand, window_dimensions, window_strides, padding, input_shape): + if not dtypes.issubdtype(operand.dtype, onp.number): + msg = "operand to reduce_window_sum must have a number dtype, got {}" + raise TypeError(msg.format(onp.dtype(operand.dtype).name)) return _common_reduce_window_shape_rule(operand, window_dimensions, window_strides, padding) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 063a43c1f168..6f23c183995c 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1534,6 +1534,8 @@ def _cumulative_reduction(a, axis, dtype): if squash_nan: a = where(isnan(a), _constant_like(a, init_val), a) + if not dtype and _dtype(a) == bool_: + dtype = int_ if dtype: a = lax.convert_element_type(a, dtype) @@ -1553,7 +1555,6 @@ def _cumulative_reduction(a, axis, dtype): def cumulative_reduction(a, axis=None, dtype=None): # jit doesn't support kwargs as static_args. return _cumulative_reduction(a, axis, dtype) - return cumulative_reduction diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 029202870d09..1e9fbb2c5af4 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1082,7 +1082,7 @@ def test_single(m, args_maker, repeats, axis): "rng_factory": jtu.rand_default, "lnp_op": getattr(lnp, op), "onp_op": getattr(onp, op)} for op in ["cumsum", "cumprod"] - for dtype in default_dtypes + for dtype in all_dtypes for out_dtype in default_dtypes for shape in all_shapes for axis in [None] + list(range(-len(shape), len(shape))))) From cfef568dd63afb91a962b7f210d1ed2e513a90f4 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 11:24:40 -0500 Subject: [PATCH 0666/1053] Implement jax.scipy.linalg.block_diag. (#2113) --- docs/jax.scipy.rst | 1 + jax/scipy/linalg.py | 24 +++++++++++++++++++++++- tests/linalg_test.py | 17 +++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index 9b3f07a59860..336233bd7ec4 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -9,6 +9,7 @@ jax.scipy.linalg .. autosummary:: :toctree: _autosummary + block_diag cho_factor cho_solve cholesky diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index b8e82357b4f8..e285f2d4ffc5 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -278,7 +278,7 @@ def _expm(A, upper_triangular=False): R = _solve_P_Q(P, Q, upper_triangular) R = _squaring(R, n_squarings) return R - + @jit def _calc_P_Q(A): A = np.asarray(A) @@ -379,3 +379,25 @@ def _pade13(A): U = np.dot(A,np.dot(A6, b[13]*A6 + b[11]*A4 + b[9]*A2) + b[7]*A6 + b[5]*A4 + b[3]*A2 + b[1]*ident) V = np.dot(A6, b[12]*A6 + b[10]*A4 + b[8]*A2) + b[6]*A6 + b[4]*A4 + b[2]*A2 + b[0]*ident return U,V + + +@_wraps(scipy.linalg.block_diag) +@jit +def block_diag(*arrs): + if len(arrs) == 0: + arrs = [np.zeros((1, 0))] + arrs = np._promote_dtypes(*arrs) + bad_shapes = [i for i, a in enumerate(arrs) if np.ndim(a) > 2] + if bad_shapes: + raise ValueError("Arguments to jax.scipy.linalg.block_diag must have at " + "most 2 dimensions, got {} at argument {}." + .format(arrs[bad_shapes[0]], bad_shapes[0])) + arrs = [np.atleast_2d(a) for a in arrs] + acc = arrs[0] + dtype = lax.dtype(acc) + for a in arrs[1:]: + _, c = a.shape + a = lax.pad(a, dtype.type(0), ((0, 0, 0), (acc.shape[-1], 0, 0))) + acc = lax.pad(acc, dtype.type(0), ((0, 0, 0), (0, c, 0))) + acc = lax.concatenate([acc, a], dimension=0) + return acc diff --git a/tests/linalg_test.py b/tests/linalg_test.py index bb37d71e3ce9..33012d96389d 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -682,6 +682,23 @@ def f(inp): class ScipyLinalgTest(jtu.JaxTestCase): + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_i={}".format(i), "args": args} + for i, args in enumerate([ + (), + (1,), + (7, -2), + (3, 4, 5), + (onp.ones((3, 4), dtype=np.float_), 5, + onp.random.randn(5, 2).astype(np.float_)), + ]))) + def testBlockDiag(self, args): + args_maker = lambda: args + self._CheckAgainstNumpy(osp.linalg.block_diag, jsp.linalg.block_diag, + args_maker, check_dtypes=True) + self._CompileAndCheck(jsp.linalg.block_diag, args_maker, check_dtypes=True) + + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), From 62966d9a9fd749d60079a8ff6d15f6fda4484ebc Mon Sep 17 00:00:00 2001 From: Srinivas Vasudevan Date: Wed, 29 Jan 2020 08:25:21 -0800 Subject: [PATCH 0667/1053] Add gammainc/gammaincc to JAX (#2064) --- docs/jax.lax.rst | 2 ++ docs/jax.scipy.rst | 2 ++ jax/lax/lax.py | 29 +++++++++++++++++++++++++++++ jax/scipy/special.py | 12 ++++++++++++ tests/lax_scipy_test.py | 4 +++- tests/lax_test.py | 7 +++++-- 6 files changed, 53 insertions(+), 3 deletions(-) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index de6449456ed5..59fb8bc434c8 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -76,6 +76,8 @@ Operators gather ge gt + igamma + igammac imag index_in_dim index_take diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index 336233bd7ec4..6b1b1743861c 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -52,6 +52,8 @@ jax.scipy.special erfc erfinv expit + gammainc + gammaincc gammaln i0e i1e diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 5f4f7fd2fe2a..0a4dc8f6ca9e 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -206,6 +206,14 @@ def digamma(x): r"""Elementwise digamma: :math:`\psi(x)`.""" return digamma_p.bind(x) +def igamma(a, x): + r"""Elementwise regularized incomplete gamma function.""" + return igamma_p.bind(_brcast(a, x), _brcast(x, a)) + +def igammac(a, x): + r"""Elementwise complementary regularized incomplete gamma function.""" + return igammac_p.bind(_brcast(a, x), _brcast(x, a)) + def bessel_i0e(x): r"""Exponentially scaled modified Bessel function of order 0: :math:`\mathrm{i0e}(x) = e^{-|x|} \mathrm{i0}(x)` @@ -1731,6 +1739,27 @@ def betainc_grad_not_implemented(g, a, b, x): digamma_p = standard_unop(_float, 'digamma') +igamma_p = standard_naryop([_float, _float], 'igamma') + +def igamma_gradx(g, a, x): + return g * exp(-x + (a - 1.) * log(x) - lgamma(a)) + +# TODO(srvasude): Igamma and Igammac gradient aren't supported with respect to +# a. We can reuse some of the reparameterization code in the JAX gamma sampler, +# but better to add an XLA op for this (which will also allow TF Igamma gradient +# code to be XLA compiled). +def gamma_grad_not_implemented(a, b, x): + raise ValueError("Igamma(c) gradient with respect to `a` not supported.") + +ad.defjvp(igamma_p, gamma_grad_not_implemented, igamma_gradx) + +igammac_p = standard_naryop([_float, _float], 'igammac') + +def igammac_gradx(g, a, x): + return -igamma_gradx(g, a, x) + +ad.defjvp(igammac_p, gamma_grad_not_implemented, igammac_gradx) + bessel_i0e_p = standard_unop(_float, 'bessel_i0e') ad.defjvp2(bessel_i0e_p, lambda g, y, x: g * (bessel_i1e(x) - sign(x) * y)) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index d10388ccfb96..f88984bef9f9 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -51,6 +51,18 @@ def digamma(x): return lax.digamma(x) +@_wraps(osp_special.gammainc, update_doc=False) +def gammainc(a, x): + a, x = _promote_args_inexact("gammainc", a, x) + return lax.igamma(a, x) + + +@_wraps(osp_special.gammaincc, update_doc=False) +def gammaincc(a, x): + a, x = _promote_args_inexact("gammaincc", a, x) + return lax.igammac(a, x) + + @_wraps(osp_special.erf) def erf(x): x, = _promote_args_inexact("erf", x) diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index db72d09c3a7d..9490fe27a99c 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -79,7 +79,9 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): if lib.version > (0, 1, 37): JAX_SPECIAL_FUNCTION_RECORDS.append( - op_record("betainc", 3, float_dtypes, jtu.rand_positive, False) + op_record("betainc", 3, float_dtypes, jtu.rand_positive, False), + op_record("gammainc", 2, float_dtypes, jtu.rand_positive, False), + op_record("gammaincc", 2, float_dtypes, jtu.rand_positive, False), ) CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/lax_test.py b/tests/lax_test.py index 420990d5a8ec..8d039ad91f14 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -116,7 +116,6 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("atan", 1, float_dtypes, jtu.rand_small), op_record("sinh", 1, float_dtypes + complex_dtypes, jtu.rand_default), op_record("cosh", 1, float_dtypes + complex_dtypes, jtu.rand_default), - op_record("lgamma", 1, float_dtypes, jtu.rand_positive, {onp.float32: 1e-3 if jtu.device_under_test() == "tpu" else 1e-5, onp.float64: 1e-14}), @@ -163,7 +162,11 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): if lib.version > (0, 1, 37): LAX_OPS.append( op_record("betainc", 3, float_dtypes, jtu.rand_positive, - {onp.float64: 1e-14}) + {onp.float64: 1e-14}), + op_record("igamma", 2, float_dtypes, jtu.rand_positive, + {onp.float64: 1e-14}), + op_record("igammac", 2, float_dtypes, jtu.rand_positive, + {onp.float64: 1e-14}), ) CombosWithReplacement = itertools.combinations_with_replacement From 4803a75c3bd5129226910d9a1f3024bf447e39b9 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 11:55:53 -0500 Subject: [PATCH 0668/1053] Implement np.block. (#2106) Rename np.removechars to _removechars; it should never have been public. --- docs/jax.numpy.rst | 1 + jax/numpy/lax_numpy.py | 39 +++++++++++++++++++++++++++++++++------ tests/lax_numpy_test.py | 23 +++++++++++++++++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index 3187526073f5..f23219da4a95 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -68,6 +68,7 @@ Not every function in NumPy is implemented; contributions are welcome! bitwise_or bitwise_xor blackman + block broadcast_arrays broadcast_to can_cast diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 6f23c183995c..c04521f6252c 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -61,9 +61,6 @@ 'Control NumPy-style automatic rank promotion broadcasting ' '("allow", "warn", or "raise").') -def removechars(s, chars): - return s.translate(str.maketrans(dict.fromkeys(chars))) - newaxis = None # We replace some builtin names to follow Numpy's API, so we capture here. @@ -1723,6 +1720,33 @@ def column_stack(tup): return concatenate(arrays, 1) +def _atleast_nd(x, n): + m = ndim(x) + return lax.broadcast(x, (1,) * (n - m)) if m < n else x + +def _block(xs): + if isinstance(xs, tuple): + raise ValueError("jax.numpy.block does not allow tuples, got {}" + .format(xs)) + elif isinstance(xs, list): + if len(xs) == 0: + raise ValueError("jax.numpy.block does not allow empty list arguments") + xs, depths = unzip2([_block(x) for x in xs]) + if _any(d != depths[0] for d in depths[1:]): + raise ValueError("Mismatched list depths in jax.numpy.block") + rank = _max(depths[0], _max(ndim(x) for x in xs)) + xs = [_atleast_nd(x, rank) for x in xs] + return concatenate(xs, axis=-depths[0]), depths[0] + 1 + else: + return asarray(xs), 1 + +@_wraps(onp.block) +@jit +def block(arrays): + out, _ = _block(arrays) + return out + + @_wraps(onp.atleast_1d, update_doc=False) def atleast_1d(*arys): if len(arys) == 1: @@ -2350,6 +2374,9 @@ def einsum_path(subscripts, *operands, **kwargs): # using einsum_call=True here is an internal api for opt_einsum return opt_einsum.contract_path(subscripts, *operands, optimize=optimize) +def _removechars(s, chars): + return s.translate(str.maketrans(dict.fromkeys(chars))) + @partial(jit, static_argnums=(1, 2)) def _einsum(operands, contractions, precision): operands = list(_promote_dtypes(*operands)) @@ -2361,7 +2388,7 @@ def sum_uniques(operand, names, uniques): if uniques: axes = [names.index(name) for name in uniques] operand = sum(operand, axes) - names = removechars(names, uniques) + names = _removechars(names, uniques) return operand, names def sum_repeats(operand, names, counts, keep_names): @@ -2446,8 +2473,8 @@ def sum_repeats(operand, names, counts, keep_names): dimension_numbers = [(lhs_cont, rhs_cont), (bdims, bdims)] operand = lax.dot_general(lhs, rhs, dimension_numbers, precision) deleted_names = batch_names + ''.join(contracted_names) - names = (batch_names + removechars(lhs_names, deleted_names) - + removechars(rhs_names, deleted_names)) + names = (batch_names + _removechars(lhs_names, deleted_names) + + _removechars(rhs_names, deleted_names)) else: raise NotImplementedError # if this is actually reachable, open an issue! diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 1e9fbb2c5af4..dcd43c1ce9a7 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2113,6 +2113,29 @@ def testAtLeastNdLiterals(self, pytype, dtype, op): self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + @parameterized.named_parameters(*jtu.cases_from_list( + {"testcase_name": "_case={}".format(i), + "input": input} + for i, input in enumerate([ + 3, + [3], + [onp.array(3)], + [onp.array([3])], + [[onp.array(3)]], + [[onp.array([3])]], + [3, 4, 5], + [ + [onp.eye(2, dtype=onp.int32) * 2, onp.zeros((2, 3), dtype=onp.int32)], + [onp.ones((3, 2), dtype=onp.int32), onp.eye(3, dtype=onp.int32) * 3], + ], + [onp.array([1, 2, 3]), onp.array([2, 3, 4]), 10], + [onp.ones((2, 2), dtype=onp.int32), onp.zeros((2, 2), dtype=onp.int32)], + [[onp.array([1, 2, 3])], [onp.array([2, 3, 4])]], + ]))) + def testBlock(self, input): + args_maker = lambda: [input] + self._CheckAgainstNumpy(onp.block, lnp.block, args_maker, check_dtypes=True) + self._CompileAndCheck(lnp.block, args_maker, check_dtypes=True) def testLongLong(self): self.assertAllClose(onp.int64(7), api.jit(lambda x: x)(onp.longlong(7)), From e60d5dd54cd7768abeb5de145316f710c6b8dcce Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 12:29:03 -0500 Subject: [PATCH 0669/1053] Remove "from __future__" uses from JAX. (#2117) The future (Python 3) has arrived; no need to request it explicitly. --- build/build.py | 3 --- examples/advi.py | 2 -- examples/datasets.py | 3 --- examples/differentially_private_sgd.py | 3 --- examples/examples_test.py | 3 --- examples/gaussian_process_regression.py | 3 --- examples/kernel_lsq.py | 3 --- examples/mnist_classifier.py | 3 --- examples/mnist_classifier_fromscratch.py | 3 --- examples/mnist_vae.py | 3 --- examples/onnx2xla.py | 3 --- examples/resnet50.py | 3 --- examples/spmd_mnist_classifier_fromscratch.py | 3 --- jax/abstract_arrays.py | 3 --- jax/ad_util.py | 3 --- jax/api.py | 3 --- jax/api_util.py | 3 --- jax/core.py | 3 --- jax/dtypes.py | 3 --- jax/experimental/loops.py | 3 --- jax/experimental/ode.py | 3 --- jax/experimental/optimizers.py | 3 --- jax/experimental/optix.py | 3 --- jax/experimental/stax.py | 3 --- jax/flatten_util.py | 3 --- jax/interpreters/ad.py | 3 --- jax/interpreters/batching.py | 3 --- jax/interpreters/masking.py | 1 - jax/interpreters/parallel.py | 3 --- jax/interpreters/partial_eval.py | 3 --- jax/interpreters/pxla.py | 3 --- jax/interpreters/xla.py | 3 --- jax/lax/__init__.py | 1 - jax/lax/lax.py | 3 --- jax/lax/lax_control_flow.py | 3 --- jax/lax/lax_fft.py | 3 --- jax/lax/lax_parallel.py | 3 --- jax/lax_linalg.py | 3 --- jax/lax_reference.py | 3 --- jax/lazy.py | 3 --- jax/lib/xla_bridge.py | 3 --- jax/linear_util.py | 3 --- jax/nn/functions.py | 2 -- jax/nn/initializers.py | 2 -- jax/numpy/__init__.py | 1 - jax/numpy/fft.py | 3 --- jax/numpy/lax_numpy.py | 3 --- jax/numpy/linalg.py | 3 --- jax/ops/__init__.py | 1 - jax/ops/scatter.py | 3 --- jax/pprint_util.py | 3 --- jax/random.py | 3 --- jax/scipy/__init__.py | 1 - jax/scipy/linalg.py | 3 --- jax/scipy/ndimage.py | 3 --- jax/scipy/special.py | 3 --- jax/scipy/stats/__init__.py | 1 - jax/scipy/stats/bernoulli.py | 3 --- jax/scipy/stats/beta.py | 3 --- jax/scipy/stats/cauchy.py | 3 --- jax/scipy/stats/dirichlet.py | 3 --- jax/scipy/stats/expon.py | 3 --- jax/scipy/stats/gamma.py | 3 --- jax/scipy/stats/laplace.py | 3 --- jax/scipy/stats/multivariate_normal.py | 3 --- jax/scipy/stats/norm.py | 3 --- jax/scipy/stats/pareto.py | 3 --- jax/scipy/stats/poisson.py | 3 --- jax/scipy/stats/t.py | 3 --- jax/scipy/stats/uniform.py | 3 --- jax/test_util.py | 3 --- jax/tools/jax_to_hlo.py | 3 --- jax/tree_util.py | 3 --- jax/util.py | 3 --- jaxlib/cuda_prng.py | 3 --- jaxlib/cusolver.py | 3 --- tests/api_test.py | 3 --- tests/batching_test.py | 3 --- tests/benchmarks/xla.py | 3 --- tests/core_test.py | 3 --- tests/debug_nans_test.py | 3 --- tests/dtypes_test.py | 3 --- tests/fft_test.py | 3 --- tests/generated_fun_test.py | 3 --- tests/infeed_test.py | 3 --- tests/jax_to_hlo_test.py | 3 --- tests/lax_control_flow_test.py | 3 --- tests/lax_numpy_einsum_test.py | 3 --- tests/lax_numpy_indexing_test.py | 3 --- tests/lax_numpy_test.py | 3 --- tests/lax_scipy_test.py | 3 --- tests/lax_test.py | 3 --- tests/linalg_test.py | 3 --- tests/loops_test.py | 3 --- tests/masking_test.py | 3 --- tests/metadata_test.py | 3 --- tests/multi_device_test.py | 3 --- tests/multibackend_test.py | 3 --- tests/nn_test.py | 3 --- tests/optimizers_test.py | 3 --- tests/optix_test.py | 3 --- tests/parallel_test.py | 3 --- tests/pmap_test.py | 3 --- tests/random_test.py | 3 --- tests/scipy_ndimage_test.py | 3 --- tests/scipy_stats_test.py | 3 --- tests/stax_test.py | 3 --- tests/tree_util_tests.py | 3 --- tests/util_test.py | 3 --- tests/vectorize_test.py | 3 --- tests/xla_bridge_test.py | 3 --- 111 files changed, 318 deletions(-) diff --git a/build/build.py b/build/build.py index 52e87d58ae56..9eede47b28dd 100755 --- a/build/build.py +++ b/build/build.py @@ -16,9 +16,6 @@ # # Helper script for building JAX's libjax easily. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import argparse import collections diff --git a/examples/advi.py b/examples/advi.py index 36a468b559d1..3d2893f75eee 100644 --- a/examples/advi.py +++ b/examples/advi.py @@ -18,8 +18,6 @@ density, by differentiating through a Monte Carlo estimate of the variational evidence lower bound (ELBO).""" -from __future__ import absolute_import -from __future__ import print_function from functools import partial import matplotlib.pyplot as plt diff --git a/examples/datasets.py b/examples/datasets.py index d1067bd9ca2f..c8a79942fe8d 100644 --- a/examples/datasets.py +++ b/examples/datasets.py @@ -14,9 +14,6 @@ """Datasets used in examples.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import array import gzip diff --git a/examples/differentially_private_sgd.py b/examples/differentially_private_sgd.py index 6e0492ea7b42..b2c6014953d9 100644 --- a/examples/differentially_private_sgd.py +++ b/examples/differentially_private_sgd.py @@ -63,9 +63,6 @@ --epochs=45 \ --learning_rate=.25 \ """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import itertools import time diff --git a/examples/examples_test.py b/examples/examples_test.py index 4393cbc53dd2..9e6e72298b67 100644 --- a/examples/examples_test.py +++ b/examples/examples_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import os import sys diff --git a/examples/gaussian_process_regression.py b/examples/gaussian_process_regression.py index af0e8f3c0a37..7edb2382b059 100644 --- a/examples/gaussian_process_regression.py +++ b/examples/gaussian_process_regression.py @@ -15,9 +15,6 @@ """A basic example demonstrating using JAX to do Gaussian process regression. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl import app from absl import flags from functools import partial diff --git a/examples/kernel_lsq.py b/examples/kernel_lsq.py index 9172079022b9..b1d8c1412f38 100644 --- a/examples/kernel_lsq.py +++ b/examples/kernel_lsq.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial diff --git a/examples/mnist_classifier.py b/examples/mnist_classifier.py index c075f3f88390..f821f2c10903 100644 --- a/examples/mnist_classifier.py +++ b/examples/mnist_classifier.py @@ -19,9 +19,6 @@ optimization. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import time import itertools diff --git a/examples/mnist_classifier_fromscratch.py b/examples/mnist_classifier_fromscratch.py index fafbcff3a14e..8022e4207679 100644 --- a/examples/mnist_classifier_fromscratch.py +++ b/examples/mnist_classifier_fromscratch.py @@ -17,9 +17,6 @@ The primary aim here is simplicity and minimal dependencies. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import time diff --git a/examples/mnist_vae.py b/examples/mnist_vae.py index 44f181105174..6e1fbd6bcdd4 100644 --- a/examples/mnist_vae.py +++ b/examples/mnist_vae.py @@ -18,9 +18,6 @@ optimization library. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import os import time diff --git a/examples/onnx2xla.py b/examples/onnx2xla.py index 3cdb0d1b3ead..1ef915035086 100644 --- a/examples/onnx2xla.py +++ b/examples/onnx2xla.py @@ -13,9 +13,6 @@ # limitations under the License. """An ONNX to XLA compiler by JAX-tracing a Numpy-backed ONNX interpreter.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from cStringIO import StringIO from functools import partial diff --git a/examples/resnet50.py b/examples/resnet50.py index 30ceb955d1f0..fb170120792b 100644 --- a/examples/resnet50.py +++ b/examples/resnet50.py @@ -17,9 +17,6 @@ This file uses the stax neural network definition library and the optimizers optimization library. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy.random as npr diff --git a/examples/spmd_mnist_classifier_fromscratch.py b/examples/spmd_mnist_classifier_fromscratch.py index 96e92e0b37d2..5c16f27b32ec 100644 --- a/examples/spmd_mnist_classifier_fromscratch.py +++ b/examples/spmd_mnist_classifier_fromscratch.py @@ -20,9 +20,6 @@ optimizers libraries. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial import time diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 51cf2f0240a3..99d67cc7adf8 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp diff --git a/jax/ad_util.py b/jax/ad_util.py index 00b9230aa3af..8c94a0e5ad5e 100644 --- a/jax/ad_util.py +++ b/jax/ad_util.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from .core import lattice_join, Primitive, Unit, unit, AbstractUnit, abstract_unit from .tree_util import register_pytree_node diff --git a/jax/api.py b/jax/api.py index f040629f67ff..2f0568dec694 100644 --- a/jax/api.py +++ b/jax/api.py @@ -23,9 +23,6 @@ arrays. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import functools diff --git a/jax/api_util.py b/jax/api_util.py index 6d5f79995c3c..8e1b46623ac0 100644 --- a/jax/api_util.py +++ b/jax/api_util.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from .tree_util import (build_tree, tree_flatten, tree_unflatten, treedef_is_leaf) diff --git a/jax/core.py b/jax/core.py index 5bb74e34cdc2..c920fd4faf94 100644 --- a/jax/core.py +++ b/jax/core.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from operator import attrgetter from contextlib import contextmanager diff --git a/jax/dtypes.py b/jax/dtypes.py index e92063624840..9825fc9b472d 100644 --- a/jax/dtypes.py +++ b/jax/dtypes.py @@ -19,9 +19,6 @@ # b) the set of supported types (e.g., bfloat16), # so we need our own implementation that deviates from NumPy in places. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from distutils.util import strtobool import functools diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index eefffbbf1807..732c65f2d171 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -103,9 +103,6 @@ def loop_body(i, acc_arr): For usage example, see tests/loops_test.py. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import copy from functools import partial diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index 80b478402b33..f90c5b9b40cf 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -22,9 +22,6 @@ Adjoint algorithm based on Appendix C of https://arxiv.org/pdf/1806.07366.pdf """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools import time diff --git a/jax/experimental/optimizers.py b/jax/experimental/optimizers.py index 50e46c95757d..7970825fe750 100644 --- a/jax/experimental/optimizers.py +++ b/jax/experimental/optimizers.py @@ -66,9 +66,6 @@ and get_params. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import namedtuple import functools diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 344a29f0110a..e9ef600fdd30 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -38,9 +38,6 @@ for convenience, we provide aliases for some of the most popular ones. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections diff --git a/jax/experimental/stax.py b/jax/experimental/stax.py index 3f668e479a9f..ead852a8ba8a 100644 --- a/jax/experimental/stax.py +++ b/jax/experimental/stax.py @@ -17,9 +17,6 @@ For an example of its use, see examples/resnet50.py. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools import itertools diff --git a/jax/flatten_util.py b/jax/flatten_util.py index 65842a1eaf7f..0a95a670618f 100644 --- a/jax/flatten_util.py +++ b/jax/flatten_util.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from .tree_util import tree_flatten, tree_unflatten from . import linear_util as lu diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 85bed6b0abcd..9f82ce18f8dc 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools import itertools as it diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 7c30ba051cf5..3444737996f4 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import namedtuple diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index d8c6de5b64af..4a7461039846 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import print_function from contextlib import contextmanager from collections import defaultdict, Counter, namedtuple diff --git a/jax/interpreters/parallel.py b/jax/interpreters/parallel.py index 622801349f30..7268cd240acf 100644 --- a/jax/interpreters/parallel.py +++ b/jax/interpreters/parallel.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial import warnings diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 42e1497f1e40..ba65d7fe61e5 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import itertools as it from collections import namedtuple, Counter, defaultdict diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 26731c449055..14ad99efefe5 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import namedtuple, defaultdict from contextlib import contextmanager diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 8e029cf19845..674fb7ff0b54 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import namedtuple, defaultdict from distutils.util import strtobool diff --git a/jax/lax/__init__.py b/jax/lax/__init__.py index 8a7192a91182..a91aa5a28921 100644 --- a/jax/lax/__init__.py +++ b/jax/lax/__init__.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import from .lax import * from .lax import (_reduce_sum, _reduce_max, _reduce_min, _reduce_or, _reduce_and, _reduce_window_sum, _reduce_window_max, diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 0a4dc8f6ca9e..083eaa4d9454 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import builtins import collections diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index b8f2d631b215..c5ba623b7a7e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -16,9 +16,6 @@ Control flow primitives. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import functools diff --git a/jax/lax/lax_fft.py b/jax/lax/lax_fft.py index 35fa459763c3..269b68ea827e 100644 --- a/jax/lax/lax_fft.py +++ b/jax/lax/lax_fft.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 7808d4911ee6..65a34e65f7d9 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -15,9 +15,6 @@ Parallelization primitives. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index f2532478e7b8..a53e838cf190 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -13,9 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial import numpy as onp diff --git a/jax/lax_reference.py b/jax/lax_reference.py index d91613e70ad0..a3c6ecf190bc 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import builtins import collections diff --git a/jax/lazy.py b/jax/lazy.py index 2dca052d5272..624731aa25e6 100644 --- a/jax/lazy.py +++ b/jax/lazy.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import namedtuple import functools diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 196fd5579c35..55cfb1143185 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -19,9 +19,6 @@ XLA. There are also a handful of related casting utilities. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial import os diff --git a/jax/linear_util.py b/jax/linear_util.py index b7f191c9ec3a..ac2ad1c5eb4e 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -62,9 +62,6 @@ def trans1(static_arg, *dynamic_args, **kwargs): data must be immutable, because it will be stored in function memoization tables. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import weakref diff --git a/jax/nn/functions.py b/jax/nn/functions.py index a6d3f9aeaed0..16d5761e3a3a 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -14,8 +14,6 @@ """Shared neural network activations and other functions.""" -from __future__ import absolute_import -from __future__ import division import numpy as onp diff --git a/jax/nn/initializers.py b/jax/nn/initializers.py index a577385b2b10..d552ad8ad121 100644 --- a/jax/nn/initializers.py +++ b/jax/nn/initializers.py @@ -17,8 +17,6 @@ used in Keras and Sonnet. """ -from __future__ import absolute_import -from __future__ import division from functools import partial diff --git a/jax/numpy/__init__.py b/jax/numpy/__init__.py index 2da1b5171c0d..2a6de18dd131 100644 --- a/jax/numpy/__init__.py +++ b/jax/numpy/__init__.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import from .lax_numpy import * from . import fft from . import linalg diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index 71be3d9ce4ce..27f06dae0c4b 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index c04521f6252c..364884f15082 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -24,9 +24,6 @@ rules for the underlying :code:`lax` primitives. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from distutils.util import strtobool import builtins diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 3244aaed592e..cbe181940c9a 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial diff --git a/jax/ops/__init__.py b/jax/ops/__init__.py index 66f9aac42396..f0cdac3770ee 100644 --- a/jax/ops/__init__.py +++ b/jax/ops/__init__.py @@ -12,6 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import from .scatter import index, index_add, index_update, index_min, index_max, segment_sum diff --git a/jax/ops/scatter.py b/jax/ops/scatter.py index 067ebfed47a4..d75784470acf 100644 --- a/jax/ops/scatter.py +++ b/jax/ops/scatter.py @@ -14,9 +14,6 @@ # Helpers for indexed updates. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections from functools import partial diff --git a/jax/pprint_util.py b/jax/pprint_util.py index da639f9d7194..727cfc3ef358 100644 --- a/jax/pprint_util.py +++ b/jax/pprint_util.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools diff --git a/jax/random.py b/jax/random.py index 11f2d75128ae..732392d2ef33 100644 --- a/jax/random.py +++ b/jax/random.py @@ -20,9 +20,6 @@ https://github.com/google/jax/blob/master/design_notes/prng.md """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial import itertools diff --git a/jax/scipy/__init__.py b/jax/scipy/__init__.py index 095d64a124ff..574f4e00a9f8 100644 --- a/jax/scipy/__init__.py +++ b/jax/scipy/__init__.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import from . import linalg from . import ndimage from . import special diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index e285f2d4ffc5..eb379e23f412 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial diff --git a/jax/scipy/ndimage.py b/jax/scipy/ndimage.py index 2ba922233cce..a2ff0203eb0f 100644 --- a/jax/scipy/ndimage.py +++ b/jax/scipy/ndimage.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools import itertools diff --git a/jax/scipy/special.py b/jax/scipy/special.py index f88984bef9f9..14a61d2c5f97 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.special as osp_special diff --git a/jax/scipy/stats/__init__.py b/jax/scipy/stats/__init__.py index 706002064aa9..dbd2a32a1041 100644 --- a/jax/scipy/stats/__init__.py +++ b/jax/scipy/stats/__init__.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import from . import bernoulli from . import poisson from . import beta diff --git a/jax/scipy/stats/bernoulli.py b/jax/scipy/stats/bernoulli.py index a2f1e54e2386..87e8ab9897ee 100644 --- a/jax/scipy/stats/bernoulli.py +++ b/jax/scipy/stats/bernoulli.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/beta.py b/jax/scipy/stats/beta.py index d65331eb0b06..2194115b1f4e 100644 --- a/jax/scipy/stats/beta.py +++ b/jax/scipy/stats/beta.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/cauchy.py b/jax/scipy/stats/cauchy.py index 886c68ca89b5..3f99a05cc01f 100644 --- a/jax/scipy/stats/cauchy.py +++ b/jax/scipy/stats/cauchy.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/dirichlet.py b/jax/scipy/stats/dirichlet.py index ad9031cdbd21..998ef0e14647 100644 --- a/jax/scipy/stats/dirichlet.py +++ b/jax/scipy/stats/dirichlet.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/expon.py b/jax/scipy/stats/expon.py index fa3369f80b39..edf22f89d22d 100644 --- a/jax/scipy/stats/expon.py +++ b/jax/scipy/stats/expon.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/gamma.py b/jax/scipy/stats/gamma.py index 896128fccd77..f63a88689fcd 100644 --- a/jax/scipy/stats/gamma.py +++ b/jax/scipy/stats/gamma.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/laplace.py b/jax/scipy/stats/laplace.py index bfb5a7c150de..c8609e09f881 100644 --- a/jax/scipy/stats/laplace.py +++ b/jax/scipy/stats/laplace.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/multivariate_normal.py b/jax/scipy/stats/multivariate_normal.py index 20741aa0462d..02865bcf0851 100644 --- a/jax/scipy/stats/multivariate_normal.py +++ b/jax/scipy/stats/multivariate_normal.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/norm.py b/jax/scipy/stats/norm.py index ed2ca9bb660e..1746d2fc4af6 100644 --- a/jax/scipy/stats/norm.py +++ b/jax/scipy/stats/norm.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/pareto.py b/jax/scipy/stats/pareto.py index caafcecc8d1d..17508471e8f1 100644 --- a/jax/scipy/stats/pareto.py +++ b/jax/scipy/stats/pareto.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/poisson.py b/jax/scipy/stats/poisson.py index db3fd64483b5..403c61ae6ff2 100644 --- a/jax/scipy/stats/poisson.py +++ b/jax/scipy/stats/poisson.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import scipy.stats as osp_stats diff --git a/jax/scipy/stats/t.py b/jax/scipy/stats/t.py index f439f3a782ba..648841e11bd7 100644 --- a/jax/scipy/stats/t.py +++ b/jax/scipy/stats/t.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp import scipy.stats as osp_stats diff --git a/jax/scipy/stats/uniform.py b/jax/scipy/stats/uniform.py index 1105f62261fe..ce237c511bb3 100644 --- a/jax/scipy/stats/uniform.py +++ b/jax/scipy/stats/uniform.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import scipy.stats as osp_stats diff --git a/jax/test_util.py b/jax/test_util.py index fc10204c841d..58096bb83a1c 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from contextlib import contextmanager import functools diff --git a/jax/tools/jax_to_hlo.py b/jax/tools/jax_to_hlo.py index e8b315af867c..81afaec1bb40 100644 --- a/jax/tools/jax_to_hlo.py +++ b/jax/tools/jax_to_hlo.py @@ -63,9 +63,6 @@ def fn(x, y, z): Google's genrules still run with python2, b/66712815. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from ast import literal_eval import importlib diff --git a/jax/tree_util.py b/jax/tree_util.py index 291759f23661..f56eeaef8fe3 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -35,9 +35,6 @@ for examples. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools import collections diff --git a/jax/util.py b/jax/util.py index fa7cfe766648..489080ae1ce5 100644 --- a/jax/util.py +++ b/jax/util.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import functools diff --git a/jaxlib/cuda_prng.py b/jaxlib/cuda_prng.py index d08b51b5dc54..a28c4b310a44 100644 --- a/jaxlib/cuda_prng.py +++ b/jaxlib/cuda_prng.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools import itertools diff --git a/jaxlib/cusolver.py b/jaxlib/cusolver.py index bdfdd4c56229..4517a85c9bea 100644 --- a/jaxlib/cusolver.py +++ b/jaxlib/cusolver.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools import operator diff --git a/tests/api_test.py b/tests/api_test.py index 0d21d3a379b6..e8d8bdbe257d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections from contextlib import contextmanager diff --git a/tests/batching_test.py b/tests/batching_test.py index 0d73bd02c522..ddf612b9c97c 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import numpy as onp from absl.testing import absltest diff --git a/tests/benchmarks/xla.py b/tests/benchmarks/xla.py index 174a3d6870af..8ea3a597a6b4 100644 --- a/tests/benchmarks/xla.py +++ b/tests/benchmarks/xla.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import enum import pytest diff --git a/tests/core_test.py b/tests/core_test.py index d61b15ff9f7a..53ef0609bd7a 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import namedtuple import gc diff --git a/tests/debug_nans_test.py b/tests/debug_nans_test.py index 95d5dd004a10..9a1723880dc4 100644 --- a/tests/debug_nans_test.py +++ b/tests/debug_nans_test.py @@ -13,9 +13,6 @@ # limitations under the License. """Tests for --debug_nans.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest from absl.testing import parameterized diff --git a/tests/dtypes_test.py b/tests/dtypes_test.py index 04c305433d99..af1a11cc22a0 100644 --- a/tests/dtypes_test.py +++ b/tests/dtypes_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import enum import itertools diff --git a/tests/fft_test.py b/tests/fft_test.py index ccc129b8bee2..35de3160702d 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import itertools import unittest diff --git a/tests/generated_fun_test.py b/tests/generated_fun_test.py index 50dbf5d1e862..db98a8f06ff8 100644 --- a/tests/generated_fun_test.py +++ b/tests/generated_fun_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import namedtuple from functools import partial diff --git a/tests/infeed_test.py b/tests/infeed_test.py index 606a7f0153e8..cc3c8aa742d7 100644 --- a/tests/infeed_test.py +++ b/tests/infeed_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import threading diff --git a/tests/jax_to_hlo_test.py b/tests/jax_to_hlo_test.py index eca55368d51e..ba24fa55c075 100644 --- a/tests/jax_to_hlo_test.py +++ b/tests/jax_to_hlo_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest import jax.numpy as np diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 1c1182657477..85f4a1f26d7f 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections from functools import partial diff --git a/tests/lax_numpy_einsum_test.py b/tests/lax_numpy_einsum_test.py index 42de963c6555..0f553f4eb5f4 100644 --- a/tests/lax_numpy_einsum_test.py +++ b/tests/lax_numpy_einsum_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from collections import defaultdict import itertools diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index bf5684a19c26..27e2c0788bdf 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import enum diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index dcd43c1ce9a7..e5fbab1649ce 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import functools diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 9490fe27a99c..d35d550bf27e 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import functools diff --git a/tests/lax_test.py b/tests/lax_test.py index 8d039ad91f14..6a5a1d69c16c 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import functools diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 33012d96389d..9b919e2ce548 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -13,9 +13,6 @@ # limitations under the License. """Tests for the LAPAX linear algebra module.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial import itertools diff --git a/tests/loops_test.py b/tests/loops_test.py index f305891f3a60..b8f99e4d34b8 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -14,9 +14,6 @@ """Tests for the experimental/loops.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest import numpy as onp diff --git a/tests/masking_test.py b/tests/masking_test.py index ee920d2908b6..6ff0aec54e7d 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial from unittest import SkipTest diff --git a/tests/metadata_test.py b/tests/metadata_test.py index e4a614dc9ece..36e8c3c9ac1a 100644 --- a/tests/metadata_test.py +++ b/tests/metadata_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest from jax import test_util as jtu diff --git a/tests/multi_device_test.py b/tests/multi_device_test.py index 303baccfa6eb..72f1f3807b49 100644 --- a/tests/multi_device_test.py +++ b/tests/multi_device_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import os from unittest import SkipTest diff --git a/tests/multibackend_test.py b/tests/multibackend_test.py index 81b0c3328dad..bf0aa5249b5f 100644 --- a/tests/multibackend_test.py +++ b/tests/multibackend_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial diff --git a/tests/nn_test.py b/tests/nn_test.py index 2960404b9a05..e8e5b9c24267 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -13,9 +13,6 @@ # limitations under the License. """Tests for nn module.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import itertools diff --git a/tests/optimizers_test.py b/tests/optimizers_test.py index ee782238cdff..6a994e90ca5c 100644 --- a/tests/optimizers_test.py +++ b/tests/optimizers_test.py @@ -13,9 +13,6 @@ # limitations under the License. """Tests for the optimizers module.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import functools diff --git a/tests/optix_test.py b/tests/optix_test.py index f5dbf4caf07b..6624554ed722 100644 --- a/tests/optix_test.py +++ b/tests/optix_test.py @@ -14,9 +14,6 @@ """Tests for the optix module.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest from jax import numpy as jnp diff --git a/tests/parallel_test.py b/tests/parallel_test.py index 449bcb0bf65f..ff2bc4f40959 100644 --- a/tests/parallel_test.py +++ b/tests/parallel_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import itertools import unittest diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 4e58f8096672..c5bb08b63612 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial import os diff --git a/tests/random_test.py b/tests/random_test.py index 66b400e50fe4..69d661d302cf 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial from unittest import SkipTest diff --git a/tests/scipy_ndimage_test.py b/tests/scipy_ndimage_test.py index be3af1b6a233..eceea0a11c51 100644 --- a/tests/scipy_ndimage_test.py +++ b/tests/scipy_ndimage_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from functools import partial diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 6701f87281b7..5c63f1f0999d 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections import itertools diff --git a/tests/stax_test.py b/tests/stax_test.py index 14bde167239a..0c009a593e60 100644 --- a/tests/stax_test.py +++ b/tests/stax_test.py @@ -13,9 +13,6 @@ # limitations under the License. """Tests for Stax library.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest from absl.testing import parameterized diff --git a/tests/tree_util_tests.py b/tests/tree_util_tests.py index 9d3603dcaa60..709fed56a9ea 100644 --- a/tests/tree_util_tests.py +++ b/tests/tree_util_tests.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import collections diff --git a/tests/util_test.py b/tests/util_test.py index 320bbcc172c9..20bf70eab79f 100644 --- a/tests/util_test.py +++ b/tests/util_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import jax import jax.numpy as np diff --git a/tests/vectorize_test.py b/tests/vectorize_test.py index fe9336f4faa6..145969c0b671 100644 --- a/tests/vectorize_test.py +++ b/tests/vectorize_test.py @@ -13,9 +13,6 @@ # limitations under the License. """Tests for Vectorize library.""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest from absl.testing import parameterized diff --git a/tests/xla_bridge_test.py b/tests/xla_bridge_test.py index ecad2f49488d..56c13b669915 100644 --- a/tests/xla_bridge_test.py +++ b/tests/xla_bridge_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function from absl.testing import absltest from jax.lib import xla_bridge as xb From ab13cf3f652c05cdd1b4d29ba008419e17bf0da1 Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Wed, 29 Jan 2020 18:10:48 +0000 Subject: [PATCH 0670/1053] Add `lax.pmean(x, axis_name)`. (#2081) --- jax/lax/lax_parallel.py | 28 ++++++++++++++++++++++++++++ tests/pmap_test.py | 11 +++++++++++ 2 files changed, 39 insertions(+) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 65a34e65f7d9..746782e7db9e 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -63,6 +63,34 @@ def psum(x, axis_name): """ return tree_util.tree_map(partial(psum_p.bind, axis_name=axis_name), x) +def pmean(x, axis_name): + """Compute an all-reduce mean on ``x`` over the pmapped axis ``axis_name``. + + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + + Args: + x: array(s) with a mapped axis named ``axis_name``. + axis_name: hashable Python object used to name a pmapped axis (see the + ``pmap`` docstring for more details). + + Returns: + Array(s) with the same shape as ``x`` representing the result of an + all-reduce mean along the axis ``axis_name``. + + For example, with 4 XLA devices available: + + >>> x = np.arange(4) + >>> y = jax.pmap(lambda x: jax.lax.pmean(x, 'i'), axis_name='i')(x) + >>> print(y) + [ 1.5 1.5 1.5 1.5 ] + >>> y = jax.pmap(lambda x: x / jax.lax.pmean(x, 'i'), axis_name='i')(x) + >>> print(y) + [ 0. 0.66666667 1.33333334 2.0 ] + """ + x, n = psum((x, 1), axis_name=axis_name) + return tree_util.tree_map(lambda v: v / n, x) + def pmax(x, axis_name): """Compute an all-reduce max on ``x`` over the pmapped axis ``axis_name``. diff --git a/tests/pmap_test.py b/tests/pmap_test.py index c5bb08b63612..32755d81f2d5 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -88,6 +88,16 @@ def testBasic(self): ans = f(x) self.assertAllClose(ans, expected, check_dtypes=False) + def testMean(self): + f = pmap(lambda x: x - lax.pmean(x, 'i'), axis_name='i') + + shape = (xla_bridge.device_count(), 4) + x = onp.arange(prod(shape), dtype=onp.float32).reshape(shape) + expected = x - onp.broadcast_to(onp.mean(x, 0), x.shape) + + ans = f(x) + self.assertAllClose(ans, expected, check_dtypes=False) + def testTrees(self): ptranspose = lambda x, axis_name: lax.all_to_all(x, axis_name, 0, 0) def protate(x, axis_name): @@ -110,6 +120,7 @@ def protate(x, axis_name): assert_allclose(jax_f(lax.pmax)(x), onp_f(onp.max)(x)) assert_allclose(jax_f(lax.pmin)(x), onp_f(onp.min)(x)) assert_allclose(jax_f(lax.psum)(x), onp_f(onp.sum)(x)) + assert_allclose(jax_f(lax.pmean)(x), onp_f(onp.mean)(x)) if jtu.device_under_test() not in ("cpu", "gpu"): # NOTE: all-to-all and ppermute only supported on TPU. assert_allclose(jax_f(ptranspose)(x), onp_transpose(x)) From 48928a18c4ef96378a5d294b973e930a0fdacfc0 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 13:24:45 -0500 Subject: [PATCH 0671/1053] Fix test failures in incomplete gamma functions with Jaxlib 0.1.38. (#2118) --- jax/lax_reference.py | 2 ++ tests/lax_scipy_test.py | 4 ++-- tests/lax_test.py | 14 ++++++++------ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/jax/lax_reference.py b/jax/lax_reference.py index a3c6ecf190bc..bc4783374b9e 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -60,6 +60,8 @@ betainc = scipy.special.betainc lgamma = scipy.special.gammaln digamma = scipy.special.digamma +igamma = scipy.special.gammainc +igammac = scipy.special.gammaincc erf = scipy.special.erf erfc = scipy.special.erfc erf_inv = scipy.special.erfinv diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index d35d550bf27e..ef353539cd77 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -75,11 +75,11 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): ] if lib.version > (0, 1, 37): - JAX_SPECIAL_FUNCTION_RECORDS.append( + JAX_SPECIAL_FUNCTION_RECORDS += [ op_record("betainc", 3, float_dtypes, jtu.rand_positive, False), op_record("gammainc", 2, float_dtypes, jtu.rand_positive, False), op_record("gammaincc", 2, float_dtypes, jtu.rand_positive, False), - ) + ] CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/lax_test.py b/tests/lax_test.py index 6a5a1d69c16c..b734fcb104ea 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -157,14 +157,16 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("lt", 2, default_dtypes, jtu.rand_small), ] if lib.version > (0, 1, 37): - LAX_OPS.append( + LAX_OPS += [ op_record("betainc", 3, float_dtypes, jtu.rand_positive, {onp.float64: 1e-14}), - op_record("igamma", 2, float_dtypes, jtu.rand_positive, - {onp.float64: 1e-14}), - op_record("igammac", 2, float_dtypes, jtu.rand_positive, - {onp.float64: 1e-14}), - ) + op_record("igamma", 2, + [f for f in float_dtypes if f not in [dtypes.bfloat16, onp.float16]], + jtu.rand_positive, {onp.float64: 1e-14}), + op_record("igammac", 2, + [f for f in float_dtypes if f not in [dtypes.bfloat16, onp.float16]], + jtu.rand_positive, {onp.float64: 1e-14}), + ] CombosWithReplacement = itertools.combinations_with_replacement From 409d057f76b7a4403f4e4ba58c46e1c65db66b45 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 29 Jan 2020 10:47:17 -0800 Subject: [PATCH 0672/1053] Build CUDA 10.2 jaxlibs. (#2121) Also adds install_cuda.sh script that sets appropriate nccl and cuDNN versions. --- build/Dockerfile | 16 +++------------- build/build_jaxlib_wheels.sh | 2 +- build/install_cuda.sh | 28 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 build/install_cuda.sh diff --git a/build/Dockerfile b/build/Dockerfile index 009e6f375d4d..08e99e37c973 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -20,20 +20,10 @@ RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.8.0 && pip ins # Change the CUDA version if it doesn't match the installed version. ARG JAX_CUDA_VERSION=10.0 +COPY install_cuda.sh /install_cuda.sh +RUN chmod +x /install_cuda.sh RUN /bin/bash -c 'if [[ ! "$CUDA_VERSION" =~ ^$JAX_CUDA_VERSION.*$ ]]; then \ - apt-get update && \ - apt-get remove -y --allow-change-held-packages cuda-license-10-0 libcudnn7 libnccl2 && \ - apt-get install -y --no-install-recommends \ - cuda-nvml-dev-$JAX_CUDA_VERSION \ - cuda-command-line-tools-$JAX_CUDA_VERSION \ - cuda-libraries-dev-$JAX_CUDA_VERSION \ - cuda-minimal-build-$JAX_CUDA_VERSION \ - libnccl2=$NCCL_VERSION-1+cuda$JAX_CUDA_VERSION \ - libnccl-dev=$NCCL_VERSION-1+cuda$JAX_CUDA_VERSION \ - libcudnn7=$CUDNN_VERSION-1+cuda$JAX_CUDA_VERSION \ - libcudnn7-dev=$CUDNN_VERSION-1+cuda$JAX_CUDA_VERSION && \ - rm -f /usr/local/cuda && \ - ln -s /usr/local/cuda-$JAX_CUDA_VERSION /usr/local/cuda; \ + /install_cuda.sh $JAX_CUDA_VERSION; \ fi' diff --git a/build/build_jaxlib_wheels.sh b/build/build_jaxlib_wheels.sh index d6d8346f062f..c2de7c80df0e 100755 --- a/build/build_jaxlib_wheels.sh +++ b/build/build_jaxlib_wheels.sh @@ -2,7 +2,7 @@ set -xev PYTHON_VERSIONS="3.5.6 3.6.8 3.7.2 3.8.0" -CUDA_VERSIONS="9.2 10.0 10.1" +CUDA_VERSIONS="9.2 10.0 10.1 10.2" CUDA_VARIANTS="cuda" # "cuda-included" mkdir -p dist diff --git a/build/install_cuda.sh b/build/install_cuda.sh new file mode 100644 index 000000000000..3455e883273e --- /dev/null +++ b/build/install_cuda.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -xe + +CUDA_VERSION=$1 + +if [ $CUDA_VERSION = "10.2" ] +then + NCCL_VERSION=2.5.6 + CUDNN_VERSION=7.6.5.32 +fi + +echo "Installing cuda version $CUDA_VERSION" +echo "nccl version: $NCCL_VERSION" +echo "cudnn version: $CUDNN_VERSION" + +apt-get update +apt-get remove -y --allow-change-held-packages cuda-license-10-0 libcudnn7 libnccl2 +apt-get install -y --no-install-recommends \ + cuda-nvml-dev-$CUDA_VERSION \ + cuda-command-line-tools-$CUDA_VERSION \ + cuda-libraries-dev-$CUDA_VERSION \ + cuda-minimal-build-$CUDA_VERSION \ + libnccl2=$NCCL_VERSION-1+cuda$CUDA_VERSION \ + libnccl-dev=$NCCL_VERSION-1+cuda$CUDA_VERSION \ + libcudnn7=$CUDNN_VERSION-1+cuda$CUDA_VERSION \ + libcudnn7-dev=$CUDNN_VERSION-1+cuda$CUDA_VERSION +rm -f /usr/local/cuda +ln -s /usr/local/cuda-$CUDA_VERSION /usr/local/cuda From 09d2421f28787e4d27736d04ecc7ae8b57e52a47 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 29 Jan 2020 10:48:20 -0800 Subject: [PATCH 0673/1053] Update jaxlib version in README to 0.1.38 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31df73e93616..f9dda10e7af6 100644 --- a/README.md +++ b/README.md @@ -410,7 +410,7 @@ PYTHON_VERSION=cp37 # alternatives: cp35, cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.37-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.38-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From 991324f8dfa7fea3b985be5e99b130db29409074 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 14:16:58 -0500 Subject: [PATCH 0674/1053] Increase minimum jaxlib version to 0.1.38. (#2120) --- .travis.yml | 2 +- CHANGELOG.md | 11 ++++++++++- jax/lax_linalg.py | 28 +++++++++------------------- jax/lib/__init__.py | 2 +- tests/lax_numpy_test.py | 10 ++++------ tests/lax_scipy_test.py | 9 +++------ tests/lax_test.py | 19 ++++++++----------- tests/linalg_test.py | 3 +-- 8 files changed, 37 insertions(+), 47 deletions(-) diff --git a/.travis.yml b/.travis.yml index 76f89d3eedac..920c9b8cf6c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ install: # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. - - pip install jaxlib==0.1.37 + - pip install jaxlib==0.1.38 - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - if [[ "$JAX_ONLY_DOCUMENTATION" != "" ]]; then diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ac399a7a4f9..dbcad3a4cb24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,16 @@ These are the release notes for JAX. ## jax 0.1.59 (unreleased) -## jax 0.1.58 +### Breaking changes + +* The minimum jaxlib version is now 0.1.38. + +## jaxlib 0.1.38 (January 29, 2020) + +* CUDA 9.0 is no longer supported. +* CUDA 10.2 wheels are now built by default. + +## jax 0.1.58 (January 28, 2020) ### Breaking changes diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index a53e838cf190..61c2c23583f8 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -132,31 +132,21 @@ def _nan_like(c, operand): nan = c.Constant(onp.array(onp.nan, dtype=dtype)) return c.Broadcast(nan, shape.dimensions()) -# TODO(phawkins): remove supports_batching argument after the minimum jaxlib -# version is 0.1.38. -def _cholesky_cpu_gpu_translation_rule(potrf_impl, potrf_supports_batching, c, - operand): +def _cholesky_cpu_gpu_translation_rule(potrf_impl, c, operand): shape = c.GetShape(operand) batch_dims = shape.dimensions()[:-2] dtype = shape.element_type().type - if len(batch_dims) == 0 or potrf_supports_batching: - result, info = potrf_impl(c, operand, lower=True) - ok = c.Eq(info, c.ConstantS32Scalar(0)) - return _broadcasting_select(c, - c.Reshape(ok, None, batch_dims + (1, 1)), result, - _nan_like(c, result)) - else: - # Fall back to the HLO implementation for batched Cholesky decomposition. - return c.Cholesky(operand) + result, info = potrf_impl(c, operand, lower=True) + ok = c.Eq(info, c.ConstantS32Scalar(0)) + return _broadcasting_select(c, + c.Reshape(ok, None, batch_dims + (1, 1)), result, + _nan_like(c, result)) xla.backend_specific_translations['cpu'][cholesky_p] = partial( - _cholesky_cpu_gpu_translation_rule, lapack.potrf, - not hasattr(lapack, "jax_potrf")) + _cholesky_cpu_gpu_translation_rule, lapack.potrf) -# TODO(phawkins): remove after the minimum jaxlib version is 0.1.38. -if hasattr(cusolver, "potrf"): - xla.backend_specific_translations['gpu'][cholesky_p] = partial( - _cholesky_cpu_gpu_translation_rule, cusolver.potrf, True) +xla.backend_specific_translations['gpu'][cholesky_p] = partial( + _cholesky_cpu_gpu_translation_rule, cusolver.potrf) # Asymmetric eigendecomposition diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 26939002fe8e..790f9383f841 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 37) +_minimum_jaxlib_version = (0, 1, 38) try: from jaxlib import version as jaxlib_version except: diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index e5fbab1649ce..b9fde9de649b 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -185,12 +185,10 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_small_positive, [], tolerance={onp.float64: 1e-8}, inexact=True), op_record("fix", 1, float_dtypes, all_shapes, jtu.rand_default, []), - op_record("floor_divide", 2, number_dtypes, all_shapes, jtu.rand_nonzero, - ["rev"]), - # TODO(phawkins): merge this with the preceding entry after the minimum - # Jaxlib version is increased to 0.1.38. - op_record("floor_divide", 2, uint_dtypes, all_shapes, jtu.rand_nonzero, - ["rev"]), + op_record("floor_divide", 2, number_dtypes, all_shapes, + jtu.rand_nonzero, ["rev"]), + op_record("floor_divide", 2, uint_dtypes, all_shapes, + jtu.rand_nonzero, ["rev"]), op_record("heaviside", 2, default_dtypes, all_shapes, jtu.rand_default, [], inexact=True), op_record("hypot", 2, default_dtypes, all_shapes, jtu.rand_default, [], diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index ef353539cd77..5dfe5df52f1b 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -58,7 +58,10 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): JAX_SPECIAL_FUNCTION_RECORDS = [ # TODO: digamma has no JVP implemented. op_record("betaln", 2, float_dtypes, jtu.rand_positive, False), + op_record("betainc", 3, float_dtypes, jtu.rand_positive, False), op_record("digamma", 1, float_dtypes, jtu.rand_positive, False), + op_record("gammainc", 2, float_dtypes, jtu.rand_positive, False), + op_record("gammaincc", 2, float_dtypes, jtu.rand_positive, False), op_record("erf", 1, float_dtypes, jtu.rand_small_positive, True), op_record("erfc", 1, float_dtypes, jtu.rand_small_positive, True), op_record("erfinv", 1, float_dtypes, jtu.rand_small_positive, True), @@ -74,12 +77,6 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): op_record("entr", 1, float_dtypes, jtu.rand_default, False), ] -if lib.version > (0, 1, 37): - JAX_SPECIAL_FUNCTION_RECORDS += [ - op_record("betainc", 3, float_dtypes, jtu.rand_positive, False), - op_record("gammainc", 2, float_dtypes, jtu.rand_positive, False), - op_record("gammaincc", 2, float_dtypes, jtu.rand_positive, False), - ] CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/lax_test.py b/tests/lax_test.py index b734fcb104ea..655344a18b68 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -118,6 +118,14 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): onp.float64: 1e-14}), op_record("digamma", 1, float_dtypes, jtu.rand_positive, {onp.float64: 1e-14}), + op_record("betainc", 3, float_dtypes, jtu.rand_positive, + {onp.float64: 1e-14}), + op_record("igamma", 2, + [f for f in float_dtypes if f not in [dtypes.bfloat16, onp.float16]], + jtu.rand_positive, {onp.float64: 1e-14}), + op_record("igammac", 2, + [f for f in float_dtypes if f not in [dtypes.bfloat16, onp.float16]], + jtu.rand_positive, {onp.float64: 1e-14}), op_record("erf", 1, float_dtypes, jtu.rand_small), op_record("erfc", 1, float_dtypes, jtu.rand_small), # TODO(b/142976030): the approximation of erfinf used by XLA is only @@ -156,17 +164,6 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("le", 2, default_dtypes, jtu.rand_small), op_record("lt", 2, default_dtypes, jtu.rand_small), ] -if lib.version > (0, 1, 37): - LAX_OPS += [ - op_record("betainc", 3, float_dtypes, jtu.rand_positive, - {onp.float64: 1e-14}), - op_record("igamma", 2, - [f for f in float_dtypes if f not in [dtypes.bfloat16, onp.float16]], - jtu.rand_positive, {onp.float64: 1e-14}), - op_record("igammac", 2, - [f for f in float_dtypes if f not in [dtypes.bfloat16, onp.float16]], - jtu.rand_positive, {onp.float64: 1e-14}), - ] CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 9b919e2ce548..0dad7afbee12 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -70,8 +70,7 @@ def args_maker(): return [onp.matmul(a, np.conj(T(a)))] if (np.issubdtype(dtype, np.complexfloating) and - (jtu.device_under_test() == "tpu" or - (jtu.device_under_test() == "cpu" and jax.lib.version < (0, 1, 38)))): + jtu.device_under_test() == "tpu"): self.skipTest("Unimplemented case for complex Cholesky decomposition.") self._CheckAgainstNumpy(onp.linalg.cholesky, np.linalg.cholesky, args_maker, From 633aa00392d88867ff0c72e46a3d097083c7929f Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 29 Jan 2020 11:23:27 -0800 Subject: [PATCH 0675/1053] Update README to drop CUDA 9.0 and add CUDA 10.2 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f9dda10e7af6..7285604c2ebc 100644 --- a/README.md +++ b/README.md @@ -407,7 +407,7 @@ cloud VM), you can run ```bash # install jaxlib PYTHON_VERSION=cp37 # alternatives: cp35, cp36, cp37, cp38 -CUDA_VERSION=cuda92 # alternatives: cuda90, cuda92, cuda100, cuda101 +CUDA_VERSION=cuda92 # alternatives: cuda92, cuda100, cuda101, cuda102 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.38-$PYTHON_VERSION-none-$PLATFORM.whl @@ -416,8 +416,8 @@ pip install --upgrade jax # install jax ``` The library package name must correspond to the version of the existing CUDA -installation you want to use, with `cuda101` for CUDA 10.1, `cuda100` for CUDA -10.0, `cuda92` for CUDA 9.2, and `cuda90` for CUDA 9.0. To find your CUDA and +installation you want to use, with `cuda102` for CUDA 10.2, `cuda101` for CUDA +10.1, `cuda100` for CUDA 10.0, and `cuda92` for CUDA 9.2. To find your CUDA and CUDNN versions, you can run commands like these, depending on your CUDNN install path: From a50339569240f8b9decc6ddac937323d3f078402 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Wed, 29 Jan 2020 19:35:48 +0000 Subject: [PATCH 0676/1053] Add `num_partitions` parameter to `get_compile_options`. (#2052) --- jax/interpreters/pxla.py | 5 ++++- jax/interpreters/xla.py | 18 ++++++++++++---- jax/lib/xla_bridge.py | 46 +++++++++++++++++++++++----------------- tests/xla_bridge_test.py | 4 ++-- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 14ad99efefe5..c38bc684b13f 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -539,7 +539,10 @@ def dynamic_fun(dummy, *args): device_assignment = tuple(d.id for d in devices) compiled = built.Compile( - compile_options=xb.get_compile_options(num_global_replicas, device_assignment), + compile_options=xb.get_compile_options( + num_replicas=num_global_replicas, + num_partitions=1, + device_assignment=device_assignment), backend=xb.get_backend(backend)) handle_args = partial(shard_args, backend, compiled.local_devices(), diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 674fb7ff0b54..1f12b8c317f8 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -172,7 +172,10 @@ def xla_primitive_callable(prim, *arg_specs, **params): handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) tuple_args = len(avals) > 100 built_c = primitive_computation(prim, backend, tuple_args, *avals, **params) - options = xb.get_compile_options(device_assignment=device and (device.id,)) + options = xb.get_compile_options( + num_replicas=1, + num_partitions=1, + device_assignment=device and (device.id,)) compiled = built_c.Compile(compile_options=options, backend=backend) return partial(_execute_compiled_primitive, prim, compiled, backend, tuple_args, handle_result) @@ -496,7 +499,9 @@ def _xla_callable(fun, device, backend, name, *arg_specs): built = c.Build(c.Tuple(*out_nodes)) options = xb.get_compile_options( - num_replicas=nreps, device_assignment=(device.id,) if device else None) + num_replicas=nreps, + num_partitions=1, + device_assignment=(device.id,) if device else None) compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) if nreps == 1: @@ -580,7 +585,9 @@ def _get_device(device, backend): c = xb.make_computation_builder("get_device") built = c.Build(c.Tuple()) options = xb.get_compile_options( - num_replicas=1, device_assignment=(device.id,) if device else None) + num_replicas=1, + num_partitions=1, + device_assignment=(device.id,) if device else None) compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) out, = compiled.local_devices() return out @@ -919,7 +926,10 @@ def _lazy_force_computation(sticky, aval, device, lexpr): built_c = c.Build(xla_out) device = _device_from_arg_devices([device]) - options = xb.get_compile_options(device_assignment=device and (device.id,)) + options = xb.get_compile_options( + num_replicas=1, + num_partitions=1, + device_assignment=device and (device.id,)) backend = xb.get_device_backend(device) compiled = built_c.Compile(compile_options=options, backend=backend) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 55cfb1143185..f54eb0f3100d 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -56,36 +56,42 @@ 'pass "cpu" for CPU or "gpu" for GPU.') -def get_compile_options(num_replicas=None, device_assignment=None): +def get_compile_options(num_replicas, num_partitions, device_assignment=None): """Returns the compile options to use, as derived from flag values. Args: - num_replicas: Optional int indicating the number of replicas for which to - compile (default inherited from xla_client.CompileOptions). + num_replicas: int indicating the number of replicas for which to compile. + num_partitions: int indicating the number of partitions for which to compile. device_assignment: Optional tuple of integers indicating the assignment of logical replicas to physical devices (default inherited from - xla_client.CompileOptions). Must be consistent with `num_replicas`. + xla_client.CompileOptions). Must be consistent with `num_replicas` and + `num_partitions`. """ - compile_options = None - if num_replicas is not None: - compile_options = compile_options or xla_client.CompileOptions() - compile_options.num_replicas = num_replicas + compile_options = xla_client.CompileOptions() + compile_options.num_replicas = num_replicas + compile_options.num_partitions = num_partitions if device_assignment is not None: - logging.vlog(2, "get_compile_options: num_replicas=%s device_assignment=%s", - num_replicas, device_assignment) - # NOTE(mattjj): xla_client.DeviceAssignment.create expects a 2D ndarray - # indexed by replica number and computation per replica, respectively, while - # here we currently assume only one computation per replica, hence the - # second axis is always trivial. - if num_replicas is not None and num_replicas != len(device_assignment): - msg = "device_assignment does not match num_replicas: {} vs {}." - raise ValueError(msg.format(device_assignment, num_replicas)) - compile_options = compile_options or xla_client.CompileOptions() + logging.vlog( + 2, + 'get_compile_options: num_replicas=%s num_partitions=%s device_assignment=%s', + num_replicas, num_partitions, device_assignment) device_assignment = onp.array(device_assignment) - if device_assignment.ndim == 1: + + # Allow 1D device assignment if num_partitions is 1. + if (device_assignment.ndim == 1) and (num_partitions == 1): device_assignment = device_assignment[:, None] + + if num_replicas != device_assignment.shape[0]: + msg = 'device_assignment does not match num_replicas: {} vs {}.' + raise ValueError(msg.format(device_assignment, num_replicas)) + + if num_partitions != device_assignment.shape[1]: + msg = 'device_assignment does not match num_partitions: {} vs {}.' + raise ValueError(msg.format(device_assignment, num_partitions)) + device_assignment = xla_client.DeviceAssignment.create(device_assignment) - assert num_replicas is None or device_assignment.replica_count() == num_replicas + assert device_assignment.replica_count() == num_replicas + assert device_assignment.computation_count() == num_partitions compile_options.device_assignment = device_assignment return compile_options diff --git a/tests/xla_bridge_test.py b/tests/xla_bridge_test.py index 56c13b669915..55f794c08254 100644 --- a/tests/xla_bridge_test.py +++ b/tests/xla_bridge_test.py @@ -21,7 +21,7 @@ class XlaBridgeTest(absltest.TestCase): def test_set_device_assignment_no_partition(self): compile_options = xb.get_compile_options( - num_replicas=4, device_assignment=[0, 1, 2, 3]) + num_replicas=4, num_partitions=1, device_assignment=[0, 1, 2, 3]) expected_device_assignment = ("Computations: 1 Replicas: 4\nComputation 0: " "0 1 2 3 \n") self.assertEqual(compile_options.device_assignment.__repr__(), @@ -29,7 +29,7 @@ def test_set_device_assignment_no_partition(self): def test_set_device_assignment_with_partition(self): compile_options = xb.get_compile_options( - num_replicas=2, device_assignment=[[0, 1], [2, 3]]) + num_replicas=2, num_partitions=2, device_assignment=[[0, 1], [2, 3]]) expected_device_assignment = ("Computations: 2 Replicas: 2\nComputation 0: " "0 2 \nComputation 1: 1 3 \n") self.assertEqual(compile_options.device_assignment.__repr__(), From bbcbe23c1ee52cf76542f3a60f8344832a0dd05f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 16:11:30 -0500 Subject: [PATCH 0677/1053] Use lax.erf_inv to implement ndtri. (#2122) --- jax/scipy/special.py | 124 +++---------------------------------------- tests/lax_test.py | 4 +- 2 files changed, 7 insertions(+), 121 deletions(-) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index 14a61d2c5f97..ae7d577347ea 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -13,6 +13,8 @@ # limitations under the License. +import math + import numpy as onp import scipy.special as osp_special @@ -145,7 +147,7 @@ def multigammaln(a, d): # Normal distributions -# Functions "ndtr" and "ndtri" are derived from calculations made in: +# Functions "ndtr" [... is] derived from calculations made in: # https://root.cern.ch/doc/v608/SpecFuncCephesInv_8cxx_source.html # In the following email exchange, the author gives his consent to redistribute # derived works under an Apache 2.0 license. @@ -273,7 +275,7 @@ def ndtri(p): This is a based on the implementation in netlib. Args: - p: an array of type `float32`, `float64`. + p: an array of floating-point type. Returns: an array with `dtype=p.dtype`. @@ -281,122 +283,8 @@ def ndtri(p): Raises: TypeError: if `p` is not floating-type. """ - x = np.asarray(p) - dtype = lax.dtype(p) - if dtype not in (np.float32, np.float64): - raise TypeError( - "x.dtype={} is not supported, see docstring for supported types." - .format(dtype)) - return _ndtri(p) - - -def _ndtri(p): - """Implements ndtri core logic.""" - - # Constants used in piece-wise rational approximations. Taken from the cephes - # library: - # https://root.cern.ch/doc/v608/SpecFuncCephesInv_8cxx_source.html - p0 = list(reversed([-5.99633501014107895267E1, - 9.80010754185999661536E1, - -5.66762857469070293439E1, - 1.39312609387279679503E1, - -1.23916583867381258016E0])) - q0 = list(reversed([1.0, - 1.95448858338141759834E0, - 4.67627912898881538453E0, - 8.63602421390890590575E1, - -2.25462687854119370527E2, - 2.00260212380060660359E2, - -8.20372256168333339912E1, - 1.59056225126211695515E1, - -1.18331621121330003142E0])) - p1 = list(reversed([4.05544892305962419923E0, - 3.15251094599893866154E1, - 5.71628192246421288162E1, - 4.40805073893200834700E1, - 1.46849561928858024014E1, - 2.18663306850790267539E0, - -1.40256079171354495875E-1, - -3.50424626827848203418E-2, - -8.57456785154685413611E-4])) - q1 = list(reversed([1.0, - 1.57799883256466749731E1, - 4.53907635128879210584E1, - 4.13172038254672030440E1, - 1.50425385692907503408E1, - 2.50464946208309415979E0, - -1.42182922854787788574E-1, - -3.80806407691578277194E-2, - -9.33259480895457427372E-4])) - p2 = list(reversed([3.23774891776946035970E0, - 6.91522889068984211695E0, - 3.93881025292474443415E0, - 1.33303460815807542389E0, - 2.01485389549179081538E-1, - 1.23716634817820021358E-2, - 3.01581553508235416007E-4, - 2.65806974686737550832E-6, - 6.23974539184983293730E-9])) - q2 = list(reversed([1.0, - 6.02427039364742014255E0, - 3.67983563856160859403E0, - 1.37702099489081330271E0, - 2.16236993594496635890E-1, - 1.34204006088543189037E-2, - 3.28014464682127739104E-4, - 2.89247864745380683936E-6, - 6.79019408009981274425E-9])) - - dtype = lax.dtype(p).type - shape = np.shape(p) - - def _create_polynomial(var, coeffs): - """Compute n_th order polynomial via Horner's method.""" - coeffs = onp.array(coeffs, dtype) - if not coeffs.size: - return np.zeros_like(var) - return coeffs[0] + _create_polynomial(var, coeffs[1:]) * var - - - maybe_complement_p = np.where(p > dtype(-onp.expm1(-2.)), dtype(1.) - p, p) - # Write in an arbitrary value in place of 0 for p since 0 will cause NaNs - # later on. The result from the computation when p == 0 is not used so any - # number that doesn't result in NaNs is fine. - sanitized_mcp = np.where( - maybe_complement_p <= dtype(0.), - np.full(shape, dtype(0.5)), - maybe_complement_p) - - # Compute x for p > exp(-2): x/sqrt(2pi) = w + w**3 P0(w**2)/Q0(w**2). - w = sanitized_mcp - dtype(0.5) - ww = lax.square(w) - x_for_big_p = w + w * ww * (_create_polynomial(ww, p0) - / _create_polynomial(ww, q0)) - x_for_big_p *= -dtype(onp.sqrt(2. * onp.pi)) - - # Compute x for p <= exp(-2): x = z - log(z)/z - (1/z) P(1/z) / Q(1/z), - # where z = sqrt(-2. * log(p)), and P/Q are chosen between two different - # arrays based on whether p < exp(-32). - z = lax.sqrt(dtype(-2.) * lax.log(sanitized_mcp)) - first_term = z - lax.log(z) / z - second_term_small_p = ( - _create_polynomial(dtype(1.) / z, p2) / - _create_polynomial(dtype(1.) / z, q2) / z) - second_term_otherwise = ( - _create_polynomial(dtype(1.) / z, p1) / - _create_polynomial(dtype(1.) / z, q1) / z) - x_for_small_p = first_term - second_term_small_p - x_otherwise = first_term - second_term_otherwise - - x = np.where(sanitized_mcp > dtype(onp.exp(-2.)), - x_for_big_p, - np.where(z >= dtype(8.0), x_for_small_p, x_otherwise)) - - x = np.where(p > dtype(1. - onp.exp(-2.)), x, -x) - infinity = np.full(shape, dtype(onp.inf)) - x_nan_replaced = np.where( - p <= dtype(0.0), -infinity, np.where(p >= dtype(1.0), infinity, x)) - return x_nan_replaced + p, = _promote_args_inexact("ndtri", p) + return lax.erf_inv(np.asarray(p) * 2 - 1) * math.sqrt(2) @custom_transforms diff --git a/tests/lax_test.py b/tests/lax_test.py index 655344a18b68..65466779890a 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -128,10 +128,8 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): jtu.rand_positive, {onp.float64: 1e-14}), op_record("erf", 1, float_dtypes, jtu.rand_small), op_record("erfc", 1, float_dtypes, jtu.rand_small), - # TODO(b/142976030): the approximation of erfinf used by XLA is only - # accurate to float32 precision. op_record("erf_inv", 1, float_dtypes, jtu.rand_small, - {onp.float64: 1e-9}), + {onp.float64: 1e-14}), op_record("bessel_i0e", 1, float_dtypes, jtu.rand_default), op_record("bessel_i1e", 1, float_dtypes, jtu.rand_default), From 96102dc7278c0ded95a9f016e33e563d6cf02498 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 29 Jan 2020 13:17:39 -0800 Subject: [PATCH 0678/1053] simplify cond by removing consts (#2102) Some higher-order primitives, like 'scan' and 'while', benefit from distinguishing constants from other inputs to their closure-converted function arguments; the reason is that for those primitives constants act differently from the other inputs, which are loop carries or scanned-over values, and are handled differently by transformations. For example, they're used differently than loop carries in lattice fixed-point computations. As another example, in scan the constants in the forward computation are fanned out, so when transposing scan we generate an accumulate-add. However, these considerations don't hold true for cond: since there's no looping going on (and hence no lattice fixed-points), constants are treated just like the other operands. So we don't need to carry around the distinction. That simplifies the cond rules a bit. Co-authored-by: Roy Frostig --- jax/experimental/loops.py | 3 +- jax/lax/lax_control_flow.py | 91 ++++++++++++------------------------- tests/api_test.py | 4 +- tests/metadata_test.py | 3 +- 4 files changed, 32 insertions(+), 69 deletions(-) diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index 732c65f2d171..be3efee17cdc 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -510,8 +510,7 @@ def build_output_vals(self, scope, carried_state_names, carried_tree, return lax_control_flow.cond_p.bind( *itertools.chain([self.pred], body_const_vals, init_vals, false_body_const_vals, init_vals), - true_jaxpr=body_typed_jaxpr, false_jaxpr=false_body_typed_jaxpr, - true_nconsts=len(body_const_vals), false_nconsts=len(false_body_const_vals)) + true_jaxpr=body_typed_jaxpr, false_jaxpr=false_body_typed_jaxpr) class _WhileBuilder(_LoopBuilder): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index c5ba623b7a7e..3f9bbca56675 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -419,20 +419,15 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): false_out_tree, false_jaxpr.out_avals) out = cond_p.bind( *itertools.chain([pred], true_consts, true_ops, false_consts, false_ops), - true_jaxpr=true_jaxpr, false_jaxpr=false_jaxpr, - true_nconsts=len(true_consts), false_nconsts=len(false_consts)) + true_jaxpr=true_jaxpr, false_jaxpr=false_jaxpr) return tree_unflatten(true_out_tree, out) def _cond_abstract_eval(*args, **kwargs): return _map(raise_to_shaped, kwargs["true_jaxpr"].out_avals) -def _cond_translation_rule(c, axis_env, name_stack, pred, *args, **kwargs): - backend = kwargs.pop("backend", None) - true_jaxpr, false_jaxpr, true_nconsts, false_nconsts = split_dict( - kwargs, ["true_jaxpr", "false_jaxpr", "true_nconsts", "false_nconsts"]) - true_nops = len(true_jaxpr.in_avals) - true_nconsts - true_consts, true_ops, false_consts, false_ops = split_list( - args, [true_nconsts, true_nops, false_nconsts]) +def _cond_translation_rule(c, axis_env, name_stack, pred, *args, + true_jaxpr, false_jaxpr, backend=None): + true_ops, false_ops = split_list(args, [len(true_jaxpr.in_avals)]) def make_computation(name, jaxpr, op_shape): c = xb.make_computation_builder(name + '_comp') @@ -443,10 +438,10 @@ def make_computation(name, jaxpr, op_shape): extend_name_stack(name_stack, name + '_fun'), *ops) return c.Build(c.Tuple(*outs)) - true_op = c.Tuple(*(true_consts + true_ops)) + true_op = c.Tuple(*true_ops) true_c = make_computation('true', true_jaxpr, c.GetShape(true_op)) - false_op = c.Tuple(*(false_consts + false_ops)) + false_op = c.Tuple(*false_ops) false_c = make_computation('false', false_jaxpr, c.GetShape(false_op)) return c.Conditional(pred, true_op, true_c, false_op, false_c) @@ -455,29 +450,25 @@ def _cond_pred_bcast_select(pred, x, y): bcast_pred = lax.broadcast_in_dim(pred, onp.shape(x), list(range(onp.ndim(pred)))) return lax.select(bcast_pred, x, y) -def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr, true_nconsts, - false_nconsts): +def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr): # TODO: maybe avoid moving arg axes to front if we're promoting to select? args = [batching.moveaxis(x, d, 0) if d is not batching.not_mapped and d != 0 else x for x, d in zip(args, dims)] - true_nops = len(true_jaxpr.in_avals) - true_nconsts - (pred,), true_consts, true_ops, false_consts, false_ops = split_list( - args, [1, true_nconsts, true_nops, false_nconsts]) + (pred,), true_ops, false_ops = split_list(args, [1, len(true_jaxpr.in_avals)]) size, = {x.shape[d] for x, d in zip(args, dims) if d is not batching.not_mapped} orig_bat = [d is not batching.not_mapped for d in dims] - (pred_bat,), tconst_bat, t_bat, fconst_bat, f_bat = split_list( - orig_bat, [1, true_nconsts, true_nops, false_nconsts]) + (pred_bat,), t_bat, f_bat = split_list(orig_bat, [1, len(true_jaxpr.in_avals)]) - _, true_out_bat = batching.batch_jaxpr(true_jaxpr, size, tconst_bat + t_bat, False) - _, false_out_bat = batching.batch_jaxpr(false_jaxpr, size, fconst_bat + f_bat, False) + _, true_out_bat = batching.batch_jaxpr(true_jaxpr, size, t_bat, False) + _, false_out_bat = batching.batch_jaxpr(false_jaxpr, size, f_bat, False) out_bat = [a or b for a, b in zip(true_out_bat, false_out_bat)] - true_jaxpr_batched, _ = batching.batch_jaxpr(true_jaxpr, size, tconst_bat + t_bat, out_bat) - false_jaxpr_batched, _ = batching.batch_jaxpr(false_jaxpr, size, fconst_bat + f_bat, out_bat) + true_jaxpr_batched, _ = batching.batch_jaxpr(true_jaxpr, size, t_bat, out_bat) + false_jaxpr_batched, _ = batching.batch_jaxpr(false_jaxpr, size, f_bat, out_bat) if pred_bat: - true_out = core.jaxpr_as_fun(true_jaxpr_batched)(*(true_consts + true_ops)) - false_out = core.jaxpr_as_fun(false_jaxpr_batched)(*(false_consts + false_ops)) + true_out = core.jaxpr_as_fun(true_jaxpr_batched)(*true_ops) + false_out = core.jaxpr_as_fun(false_jaxpr_batched)(*false_ops) true_out = [batching.broadcast(x, size, 0) if not b else x for x, b in zip(true_out, out_bat)] false_out = [batching.broadcast(x, size, 0) if not b else x @@ -486,57 +477,33 @@ def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr, true_nconsts, for t, f in zip(true_out, false_out)], [0] * len(true_out) else: out_dims = [0 if b else batching.not_mapped for b in out_bat] - return cond_p.bind( - *itertools.chain([pred], true_consts, true_ops, false_consts, false_ops), - true_jaxpr=true_jaxpr_batched, false_jaxpr=false_jaxpr_batched, - true_nconsts=len(true_consts), false_nconsts=len(false_consts)), out_dims + out = cond_p.bind( + *itertools.chain([pred], true_ops, false_ops), + true_jaxpr=true_jaxpr_batched, false_jaxpr=false_jaxpr_batched) + return out, out_dims -def _cond_jvp(primals, tangents, true_jaxpr, false_jaxpr, true_nconsts, - false_nconsts): +def _cond_jvp(primals, tangents, true_jaxpr, false_jaxpr): nonzeros = [t is not ad_util.zero for t in tangents] - true_nops = len(true_jaxpr.in_avals) - true_nconsts - false_nops = len(false_jaxpr.in_avals) - false_nconsts - - (pred_nz,), tconst_nz, t_nz, fconst_nz, f_nz = split_list( - nonzeros, [1, true_nconsts, true_nops, false_nconsts]) - + (pred_nz,), t_nz, f_nz = split_list(nonzeros, [1, len(true_jaxpr.in_avals)]) assert pred_nz is False - _, true_out_nz = ad.jvp_jaxpr(true_jaxpr, tconst_nz + t_nz, - instantiate=False) - _, false_out_nz = ad.jvp_jaxpr(false_jaxpr, fconst_nz + f_nz, - instantiate=False) - + _, true_out_nz = ad.jvp_jaxpr(true_jaxpr, t_nz, instantiate=False) + _, false_out_nz = ad.jvp_jaxpr(false_jaxpr, f_nz, instantiate=False) out_nz = [a or b for a, b in zip(true_out_nz, false_out_nz)] - true_jvp, _ = ad.jvp_jaxpr(true_jaxpr, tconst_nz + t_nz, instantiate=out_nz) - false_jvp, _ = ad.jvp_jaxpr(false_jaxpr, fconst_nz + f_nz, instantiate=out_nz) + true_jvp, _ = ad.jvp_jaxpr(true_jaxpr, t_nz, instantiate=out_nz) + false_jvp, _ = ad.jvp_jaxpr(false_jaxpr, f_nz, instantiate=out_nz) - (pred,), tconsts, tops, fconsts, fops = split_list( - primals, [1, true_nconsts, true_nops, false_nconsts]) - _, tconsts_dot, tops_dot, fconsts_dot, fops_dot = split_list( - tangents, [1, true_nconsts, true_nops, false_nconsts]) + (pred,), tops, fops = split_list(primals, [1, len(true_jaxpr.in_avals)]) + _, tops_dot, fops_dot = split_list(tangents, [1, len(true_jaxpr.in_avals)]) - tconsts_dot = _prune_zeros(tconsts_dot) tops_dot = _prune_zeros(tops_dot) - fconsts_dot = _prune_zeros(fconsts_dot) fops_dot = _prune_zeros(fops_dot) - true_jvp = ad.rearrange_binders(true_jvp, [true_nconsts, true_nops], - [len(tconsts_dot), len(tops_dot)], - [len(out_nz)], [sum(out_nz)]) - false_jvp = ad.rearrange_binders(false_jvp, [false_nconsts, false_nops], - [len(fconsts_dot), len(fops_dot)], - [len(out_nz)], [sum(out_nz)]) - out = cond_p.bind( - *itertools.chain([pred], - tconsts, tconsts_dot, tops, tops_dot, - fconsts, fconsts_dot, fops, fops_dot), - true_jaxpr=true_jvp, false_jaxpr=false_jvp, - true_nconsts=len(tconsts) + len(tconsts_dot), - false_nconsts=len(fconsts) + len(fconsts_dot)) + *itertools.chain([pred], tops, tops_dot, fops, fops_dot), + true_jaxpr=true_jvp, false_jaxpr=false_jvp) out_primals, out_tangents = split_list(out, [len(out_nz)]) out_tangents_iter = iter(out_tangents) out_tangents = [ diff --git a/tests/api_test.py b/tests/api_test.py index e8d8bdbe257d..89c37f8a9db6 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1697,11 +1697,9 @@ def f(x): e = cond[ false_jaxpr={ lambda ; ; b a. let c = sub a b in [c] } - false_nconsts=1 true_jaxpr={ lambda ; ; b a. let c = add a b - in [c] } - true_nconsts=1 ] b a c a d + in [c] } ] b a c a d in [e] } """) diff --git a/tests/metadata_test.py b/tests/metadata_test.py index 36e8c3c9ac1a..a527c3e0d62f 100644 --- a/tests/metadata_test.py +++ b/tests/metadata_test.py @@ -102,8 +102,7 @@ def false_fun(x): return jnp.cos(x) _ = jax.lax.cond(True, 1., true_fun, 1., false_fun) assert self.op_types[-3] == 'cond' - assert self.op_names[-3] == 'cond[ false_nconsts=0\n' \ - ' true_nconsts=0 ]' + assert self.op_names[-3] == 'cond' assert self.op_types[-2] == 'sin' assert self.op_names[-2] == 'cond/true_fun/sin' assert self.op_types[-1] == 'cos' From 1c134f8a6d33b729d2d43c84a3f527473be87b23 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 16:23:27 -0500 Subject: [PATCH 0679/1053] Rename Tracer.trace to Tracer._trace. (#2114) Makes the .trace() method work on arrays. --- jax/core.py | 32 ++++++++++++++++---------------- jax/interpreters/ad.py | 6 +++--- jax/interpreters/batching.py | 2 +- jax/interpreters/masking.py | 4 ++-- jax/interpreters/parallel.py | 2 +- jax/interpreters/partial_eval.py | 8 ++++---- jax/interpreters/pxla.py | 4 ++-- tests/lax_numpy_test.py | 6 ++++++ 8 files changed, 35 insertions(+), 29 deletions(-) diff --git a/jax/core.py b/jax/core.py index c920fd4faf94..050e83a6a23f 100644 --- a/jax/core.py +++ b/jax/core.py @@ -225,7 +225,7 @@ def full_lower(val): def find_top_trace(xs): try: - top_trace = max((x.trace for x in xs if isinstance(x, Tracer)), + top_trace = max((x._trace for x in xs if isinstance(x, Tracer)), key=attrgetter('level')) except ValueError: return None @@ -247,22 +247,22 @@ def full_raise(self, val): return self.pure(val) level = self.level sublevel = self.sublevel - if val.trace.master is self.master: - if val.trace.sublevel == sublevel: + if val._trace.master is self.master: + if val._trace.sublevel == sublevel: return val - elif val.trace.sublevel < sublevel: + elif val._trace.sublevel < sublevel: return self.sublift(val) else: raise Exception("Can't lift sublevels {} to {}" - .format(val.trace.sublevel, sublevel)) - elif val.trace.level < level: - if val.trace.sublevel > sublevel: + .format(val._trace.sublevel, sublevel)) + elif val._trace.level < level: + if val._trace.sublevel > sublevel: raise Exception("Incompatible sublevel: {}, {}" - .format(val.trace, (level, sublevel))) + .format(val._trace, (level, sublevel))) return self.lift(val) - elif val.trace.level > level: + elif val._trace.level > level: raise Exception("Can't lift {} to {}".format(val, self)) - elif val.trace.level == self.level: + elif val._trace.level == self.level: raise Exception("Different traces at same level: {}, {}".format(val, self)) else: raise Exception("Can't lift {} to {}".format(val, self)) @@ -284,14 +284,14 @@ def __repr__(self): class Tracer(object): __array_priority__ = 1000 - __slots__ = ['trace', '__weakref__'] + __slots__ = ['_trace', '__weakref__'] def __array__(self, *args, **kw): raise Exception("Tracer can't be used with raw numpy functions. " "You might have\n import numpy as np\ninstead of\n import jax.numpy as np") def __init__(self, trace): - self.trace = trace + self._trace = trace def __iter__(self): return iter(self.aval._iter(self)) @@ -373,7 +373,7 @@ def __getattr__(self, name): return attr def __repr__(self): - return 'Traced<{}>with<{}>'.format(self.aval, self.trace) + return 'Traced<{}>with<{}>'.format(self.aval, self._trace) def __copy__(self): return self @@ -581,12 +581,12 @@ def process_env_traces(primitive, level, params_tuple, *args): params = dict(params_tuple) todo = [] while True: - tracers = [x for x in outs if isinstance(x, Tracer) and x.trace.level > level] + tracers = [x for x in outs if isinstance(x, Tracer) and x._trace.level > level] if tracers: - ans = max(tracers, key=lambda x: x.trace.level) + ans = max(tracers, key=lambda x: x._trace.level) else: break - trace = type(ans.trace)(ans.trace.master, cur_sublevel()) + trace = type(ans._trace)(ans._trace.master, cur_sublevel()) outs = map(trace.full_raise, outs) outs, cur_todo = trace.post_process_call(primitive, outs, params) todo.append(cur_todo) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 9f82ce18f8dc..07217ae8e6ca 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -58,7 +58,7 @@ def jvp_subtrace(master, primals, tangents): trace = JVPTrace(master, core.cur_sublevel()) for x in list(primals) + list(tangents): if isinstance(x, Tracer): - assert x.trace.level < trace.level + assert x._trace.level < trace.level in_tracers = [JVPTracer(trace, x, t) if t is not zero else x for x, t in zip(primals, tangents)] ans = yield in_tracers, {} @@ -71,7 +71,7 @@ def jvp_subtrace_aux(master, primals, tangents): trace = JVPTrace(master, core.cur_sublevel()) for x in list(primals) + list(tangents): if isinstance(x, Tracer): - assert x.trace.level < trace.level + assert x._trace.level < trace.level ans, aux = yield map(partial(JVPTracer, trace), primals, tangents), {} ans_tracers = map(trace.full_raise, ans) aux_tracers = map(trace.full_raise, aux) @@ -357,7 +357,7 @@ class JVPTracer(Tracer): def __init__(self, trace, primal, tangent): if not core.skip_checks: _primal_tangent_shapes_match(primal, tangent) - self.trace = trace + self._trace = trace self.primal = primal self.tangent = tangent diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 3444737996f4..d2cdb3fa9cf3 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -66,7 +66,7 @@ class BatchTracer(Tracer): def __init__(self, trace, val, batch_dim): assert core.skip_checks or type(batch_dim) in (int, NotMapped) - self.trace = trace + self._trace = trace self.val = val self.batch_dim = batch_dim diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 4a7461039846..33be793f3776 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -342,7 +342,7 @@ class MaskTracer(Tracer): __slots__ = ["val", "shape_expr"] def __init__(self, trace, val, shape_expr): - self.trace = trace + self._trace = trace self.val = val self.shape_expr = shape_expr @@ -429,7 +429,7 @@ class ShapeCheckTracer(Tracer): __slots__ = ["shape_expr"] def __init__(self, trace, shape_expr): - self.trace = trace + self._trace = trace self.shape_expr = shape_expr @property diff --git a/jax/interpreters/parallel.py b/jax/interpreters/parallel.py index 7268cd240acf..634c67aa0002 100644 --- a/jax/interpreters/parallel.py +++ b/jax/interpreters/parallel.py @@ -66,7 +66,7 @@ def papply_subtrace(master, name, axis_size, axes, *vals): class PapplyTracer(Tracer): def __init__(self, trace, name, axis_size, val, axis): - self.trace = trace + self._trace = trace self.name = name self.axis_size = axis_size self.val = val diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index ba65d7fe61e5..a173aee81ce7 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -55,7 +55,7 @@ def sublift(self, val): return JaxprTracer(self, val.pval, FreeVar(val)) def new_const(self, val): - if isinstance(val, Tracer) and val.trace.level == self.level: + if isinstance(val, Tracer) and val._trace.level == self.level: raise Exception return JaxprTracer(self, PartialVal((None, val)), unit) @@ -264,13 +264,13 @@ def __init__(self, trace, pval, recipe): assert isinstance(pval, PartialVal) pv, const = pval if isinstance(const, Tracer): - assert const.trace.level < trace.level - self.trace = trace + assert const._trace.level < trace.level + self._trace = trace self.pval = pval self.recipe = recipe def __repr__(self): - return 'Traced<{}:{}>'.format(self.aval, self.trace) + return 'Traced<{}:{}>'.format(self.aval, self._trace) @property def aval(self): diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index c38bc684b13f..bf6df6bbe551 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -453,7 +453,7 @@ def parallel_callable(fun, backend, axis_name, axis_size, global_axis_size, @lu.wrap_init def dynamic_fun(dummy, *args): - with extend_dynamic_axis_env(axis_name, dummy.trace, global_axis_size): + with extend_dynamic_axis_env(axis_name, dummy._trace, global_axis_size): return fun.call_wrapped(*args) avals = tuple(map(partial(shard_aval, axis_size), avals)) @@ -742,7 +742,7 @@ def add_chunk_to_axis_env(axis_name, soft_trace, soft_size): class SplitAxisTracer(core.Tracer): def __init__(self, trace, axis_name, val): - self.trace = trace + self._trace = trace self.axis_name = axis_name self.val = val diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index b9fde9de649b..3a31726c4820 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2674,6 +2674,12 @@ def testZerosShapeErrors(self): "If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions.", lambda: api.jit(lnp.zeros)(2)) + def testTraceMethod(self): + x = onp.random.randn(3, 4).astype(lnp.float_) + self.assertAllClose(x.trace(), lnp.array(x).trace(), check_dtypes=True) + self.assertAllClose(x.trace(), api.jit(lambda y: y.trace())(x), + check_dtypes=True) + # Most grad tests are at the lax level (see lax_test.py), but we add some here # as needed for e.g. particular compound ops of interest. From be2704e425e8325a6eddbbc317e6c00da390acb1 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 29 Jan 2020 14:24:11 -0800 Subject: [PATCH 0680/1053] Ensure ShapedArray.shape is always a tuple of builtins integers (#2039) * Ensure ShapedArray.shape is always a tuple of builtins integers Currently, it can sometimes include elements of type int64, e.g., In [1]: import jax.numpy as jnp In [2]: x = jnp.arange(3) + 1 In [3]: x.shape # looks fine at first glance Out[3]: (3,) In [4]: type(x.shape[0]) # yikes! Out[4]: numpy.int64 This confirms my hypothesis that NumPy's scalar types are the root of all evil. * Allow Poly in shapes * Simple shape coercion in ShapedArray * cleaner --- jax/abstract_arrays.py | 17 ++++++++++++++++- jax/interpreters/masking.py | 5 ++++- tests/lax_test.py | 4 ++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 99d67cc7adf8..14e6699bad57 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -13,6 +13,8 @@ # limitations under the License. +import operator + import numpy as onp from . import core @@ -90,6 +92,19 @@ def strip_weak_type(self): """Returns a copy of the aval with weak_type=False.""" return UnshapedArray(self.dtype) if self.weak_type else self +# Registry for valid dimension types. This is used by masking.Poly. +_DIMENSION_TYPES = {int} + +def _canonicalize_dimension(dim): + if type(dim) in _DIMENSION_TYPES: + return dim + else: + return operator.index(dim) + +def _canonicalize_shape(shape): + """Ensure shape is a tuple of int or registered _DIMENSION_TYPES.""" + return tuple(map(_canonicalize_dimension, shape)) + class ShapedArray(UnshapedArray): __slots__ = ['shape'] @@ -97,7 +112,7 @@ class ShapedArray(UnshapedArray): def __init__(self, shape, dtype, weak_type=False): super(ShapedArray, self).__init__(dtype, weak_type=weak_type) - self.shape = shape + self.shape = _canonicalize_shape(shape) ndim = property(lambda self: len(self.shape)) size = property(lambda self: prod(self.shape)) diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 33be793f3776..50b318ca1b88 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -23,6 +23,7 @@ import numpy as onp +from .. import abstract_arrays from .. import core from ..core import Trace, Tracer from ..util import unzip2, safe_map, safe_zip, curry @@ -87,7 +88,6 @@ def mask_subtrace(master, in_vals, shape_exprs): out_vals, out_shapes = unzip2((t.val, t.shape_expr) for t in out_tracers) yield out_vals, out_shapes - def ensure_poly(p): if isinstance(p, Poly): return p @@ -215,6 +215,9 @@ def __int__(self): def is_constant(self): return len(self) == 1 and next(iter(self)).degree == 0 +abstract_arrays._DIMENSION_TYPES.add(Poly) + + class Mon(Counter): # type Mon = Map Id Int -- ids to degrees def __hash__(self): return hash(tuple(self.items())) diff --git a/tests/lax_test.py b/tests/lax_test.py index 65466779890a..c2ece7284c4d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -3058,6 +3058,10 @@ def testScatterAdd(self, arg_shape, dtype, idxs, update_shape, dnums, bdims): [dtype, idxs.dtype, dtype], jtu.rand_default(), rtol={onp.float16: 5e-3}) + def testShapeUsesBuiltinInt(self): + x = lax.iota(onp.int32, 3) + 1 + self.assertIsInstance(x.shape[0], int) # not np.int64 + # TODO Concatenate # TODO Reverse # TODO DynamicSlice From 511d33983a24074ac2070d8bb7b2136fe207b493 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 29 Jan 2020 23:19:14 -0500 Subject: [PATCH 0681/1053] Initial implementation of DLPack support. (#2123) * Initial implementation of DLPack support. Unfortunately there are still a few bugs in the jaxlib DLPack support, so this code won't be ready to use until jaxlib 0.1.39. * Fix test failures. * Update XLA. Fix failing torch test. --- WORKSPACE | 6 +-- jax/dlpack.py | 48 +++++++++++++++++++ tests/dlpack_test.py | 110 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 jax/dlpack.py create mode 100644 tests/dlpack_test.py diff --git a/WORKSPACE b/WORKSPACE index 9c4a4ff76292..2615988322ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "d873d5cedbd91b44f5512fee2548c158f9d6ed5448e4a554264eca0800df1e6f", - strip_prefix = "tensorflow-e0d40be9f3db043787637c07ca342bd3ed1a2bee", + sha256 = "46d17ceaae12196c1cb2e99ca0cf040e7cefdc45ae9eede60c3caf3c5aaf5e48", + strip_prefix = "tensorflow-93ccefd6d3b8d32f7afcc43568fc7e872e744767", urls = [ - "https://github.com/tensorflow/tensorflow/archive/e0d40be9f3db043787637c07ca342bd3ed1a2bee.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/93ccefd6d3b8d32f7afcc43568fc7e872e744767.tar.gz", ], ) diff --git a/jax/dlpack.py b/jax/dlpack.py new file mode 100644 index 000000000000..92d8ee5b9e0b --- /dev/null +++ b/jax/dlpack.py @@ -0,0 +1,48 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import lazy +from .interpreters import xla +from .lib import xla_client +from .lib import xla_bridge + +def to_dlpack(x): + """Returns a DLPack tensor that encapsulates a DeviceArray `x`. + + The DLPack shares memory with `x`. + + Args: + x: a `DeviceArray`, on either CPU or GPU. + """ + if not isinstance(x, xla.DeviceArray): + raise TypeError("Argument to to_dlpack must be a DeviceArray, got {}" + .format(type(x))) + buf = xla._force(x).device_buffer + return xla_client._xla.BufferToDLPackManagedTensor(buf) + +def from_dlpack(dlpack, backend=None): + """Returns a `DeviceArray` representation of a DLPack tensor `dlpack`. + + The returned `DeviceArray` shares memory with `dlpack`. + + Args: + dlpack: a DLPack tensor, on either CPU or GPU. + backend: experimental, optional: the platform on which `dlpack` lives. + """ + # TODO(phawkins): ideally the user wouldn't need to provide a backend and we + # would be able to figure it out from the DLPack. + backend = backend or xla_bridge.get_backend() + buf = xla_client._xla.DLPackManagedTensorToBuffer(dlpack, backend.client) + aval = xla._aval_from_xla_shape(buf.shape()) + return xla.DeviceArray(aval, buf.device(), lazy.array(aval.shape), buf) \ No newline at end of file diff --git a/tests/dlpack_test.py b/tests/dlpack_test.py new file mode 100644 index 000000000000..658717d1b470 --- /dev/null +++ b/tests/dlpack_test.py @@ -0,0 +1,110 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from absl.testing import absltest, parameterized +import numpy as np + +import jax +from jax.config import config +import jax.dlpack +import jax.numpy as jnp +from jax import test_util as jtu + +config.parse_flags_with_absl() + +try: + import torch + import torch.utils.dlpack +except ImportError: + torch = None + + +scalar_types = [jnp.bool_, jnp.int8, jnp.int16, jnp.int32, jnp.int64, + jnp.uint8, jnp.uint16, jnp.uint32, jnp.uint64, + jnp.bfloat16, jnp.float16, jnp.float32, jnp.float64] +torch_types = [jnp.int8, jnp.int16, jnp.int32, jnp.int64, + jnp.uint8, jnp.float16, jnp.float32, jnp.float64] + +nonempty_nonscalar_array_shapes = [(4,), (3, 4), (2, 3, 4)] +empty_array_shapes = [] +# TODO(phawkins): size 0 and 1 dimensions are mishandled (with an error) when +# being imported to JAX in jaxlib 0.1.38. +if jax.lib.version > (0, 1, 38): + empty_array_shapes += [(0,), (0, 4), (3, 0),] + nonempty_nonscalar_array_shapes += [(3, 1), (1, 4), (2, 1, 4)] + +nonempty_array_shapes = [()] + nonempty_nonscalar_array_shapes +all_shapes = nonempty_array_shapes + empty_array_shapes + +class DLPackTest(jtu.JaxTestCase): + def setUp(self): + if jtu.device_under_test() == "tpu": + self.skipTest("DLPack not supported on TPU") + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_{}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype} + for shape in all_shapes + for dtype in scalar_types)) + def testJaxRoundTrip(self, shape, dtype): + rng = jtu.rand_default() + np = rng(shape, dtype) + x = jnp.array(np) + dlpack = jax.dlpack.to_dlpack(x) + y = jax.dlpack.from_dlpack(dlpack) + self.assertAllClose(x, y, check_dtypes=True) + + self.assertRaisesRegex(RuntimeError, + "DLPack tensor may be consumed at most once", + lambda: jax.dlpack.from_dlpack(dlpack)) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_{}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype} + for shape in all_shapes + for dtype in torch_types)) + @unittest.skipIf(not torch, "Test requires PyTorch") + def testTorchToJax(self, shape, dtype): + rng = jtu.rand_default() + np = rng(shape, dtype) + x = torch.from_numpy(np) + x = x.cuda() if jtu.device_under_test() == "gpu" else x + dlpack = torch.utils.dlpack.to_dlpack(x) + y = jax.dlpack.from_dlpack(dlpack) + self.assertAllClose(np, y, check_dtypes=True) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_{}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype} + for shape in all_shapes + for dtype in torch_types)) + @unittest.skipIf(not torch or jax.lib.version <= (0, 1, 38), + "Test requires PyTorch and jaxlib >= 0.1.39") + # TODO(phawkins): the dlpack destructor issues errors in jaxlib 0.1.38. + def testJaxToTorch(self, shape, dtype): + rng = jtu.rand_default() + np = rng(shape, dtype) + x = jnp.array(np) + dlpack = jax.dlpack.to_dlpack(x) + y = torch.utils.dlpack.from_dlpack(dlpack) + self.assertAllClose(np, y.numpy(), check_dtypes=True) + + +if __name__ == "__main__": + absltest.main() From 60bc0c0d778de323abfe0b026aed2c01e86b74b6 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 30 Jan 2020 13:02:58 -0500 Subject: [PATCH 0682/1053] Batching rule for custom_linear_solve (#2099) * Add batching rule for custom_linear_solve The custom_linear_solve primitive is batched by batching each of the jaxprs stored in the primitive. Conceptually, this corresponds to transforming the initial linear system solve into an implicit "block diagonal" solve, where matvec/vecmat apply a linear operation to each part of the input, and solve/transpose_solve solve each block separately. Note that the batching of the input and output must agree between all four jaxprs, since the custom_linear_solve JVP and transpose rules assume the shapes all match. In particular, the JVP passes the output of solve into (the JVP of) matvec and then that output back into solve, and the transpose rule causes the (cotangents for the) output of solve to be fed back into solve_transpose and vecmat. To ensure consistency we can do a fixed-point iteration to figure out whether each component of x and b are batched or not. * Add support for batched solves without a transpose If there is no transpose solve, we don't need to batch the transposed versions of the jaxprs. * Add pytree test for custom linear solve Custom linear solve supports solves that act on pytrees, not just single arrays. This commit adds a test for a linear operator and solver that operate on Python lists of scalars instead of vectors, and confirms that transformations work correctly. The batching behavior has been chosen to make sure it requires a few iterations to find the fixed point of which elements have a batch axis. --- jax/lax/lax_control_flow.py | 76 +++++++++++++++++++++++++++- tests/lax_control_flow_test.py | 90 ++++++++++++++++++++++++++++++---- 2 files changed, 156 insertions(+), 10 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 3f9bbca56675..eb450f351fab 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1410,6 +1410,80 @@ def _linear_solve_transpose_rule(cotangent, *primals, **kwargs): return [None] * sum(const_lengths) + cotangent_b +def _linear_solve_batching_rule(args, dims, **kwargs): + const_lengths, jaxprs, tree = split_dict(kwargs, + ["const_lengths", "jaxprs", "tree"]) + orig_bat = [d is not batching.not_mapped for d in dims] + size, = { + a.shape[d] for a, d in zip(args, dims) if d is not batching.not_mapped + } + + params, b = _split_linear_solve_args(args, const_lengths) + params_dims, b_dims = _split_linear_solve_args(dims, const_lengths) + params_bat, orig_b_bat = _split_linear_solve_args(orig_bat, const_lengths) + + (matvec, vecmat, solve, solve_t) = jaxprs + (matvec_bat, vecmat_bat, solve_bat, solve_t_bat) = params_bat + + # Fixpoint computation of which parts of x and b are batched; we need to + # ensure this is consistent between all four jaxprs + b_bat = orig_b_bat + x_bat = [False] * len(solve.out_avals) + for i in range(1 + len(orig_b_bat) + len(solve.out_avals)): + # Apply vecmat and solve -> new batched parts of x + solve_jaxpr_batched, solve_x_bat = batching.batch_jaxpr( + solve, size, solve_bat + b_bat, instantiate=x_bat) + if vecmat is None: + vecmat_jaxpr_batched = None + x_bat_out = solve_x_bat + else: + vecmat_jaxpr_batched, vecmat_x_bat = batching.batch_jaxpr( + vecmat, size, vecmat_bat + b_bat, instantiate=x_bat) + x_bat_out = _map(operator.or_, vecmat_x_bat, solve_x_bat) + # Apply matvec and solve_t -> new batched parts of b + matvec_jaxpr_batched, matvec_b_bat = batching.batch_jaxpr( + matvec, size, matvec_bat + x_bat_out, instantiate=b_bat) + if solve_t is None: + solve_t_jaxpr_batched = None + b_bat_out = _map(operator.or_, matvec_b_bat, orig_b_bat) + else: + solve_t_jaxpr_batched, solve_t_b_bat = batching.batch_jaxpr( + solve_t, size, solve_t_bat + x_bat_out, instantiate=b_bat) + b_bat_out = _map(lambda m, s, o: m or s or o, matvec_b_bat, solve_t_b_bat, + orig_b_bat) + if x_bat_out == x_bat and b_bat_out == b_bat: + break + else: + x_bat = x_bat_out + b_bat = b_bat_out + else: + assert False, "Fixedpoint not reached" + + batched_jaxprs = _LinearSolveTuple(matvec_jaxpr_batched, vecmat_jaxpr_batched, + solve_jaxpr_batched, solve_t_jaxpr_batched) + + # Move batched axes to the front + new_params = [ + batching.moveaxis(x, d, 0) + if d is not batching.not_mapped and d != 0 else x + for x, d in zip(_flatten(params), _flatten(params_dims)) + ] + # Broadcast out b if necessary + new_b = [ + batching.broadcast(x, size, 0) if now_bat and not was_bat else + batching.moveaxis(x, d, 0) if now_bat and d != 0 else x + for x, d, was_bat, now_bat in zip(b, b_dims, orig_b_bat, b_bat) + ] + + outs = linear_solve_p.bind( + *(new_params + new_b), + const_lengths=const_lengths, + jaxprs=batched_jaxprs, + tree=tree) + out_dims = [0 if batched else batching.not_mapped for batched in b_bat] + return outs, out_dims + + linear_solve_p = core.Primitive('custom_linear_solve') linear_solve_p.multiple_results = True linear_solve_p.def_impl(_custom_linear_solve_impl) @@ -1418,4 +1492,4 @@ def _linear_solve_transpose_rule(cotangent, *primals, **kwargs): xla.initial_style_translations[linear_solve_p] = xla.lower_fun( _custom_linear_solve_impl, initial_style=True) ad.primitive_transposes[linear_solve_p] = _linear_solve_transpose_rule -# TODO(shoyer): write batching rule +batching.primitive_batchers[linear_solve_p] = _linear_solve_batching_rule diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 85f4a1f26d7f..ee08e70550af 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1368,11 +1368,10 @@ def linear_solve(a, b): actual = api.jit(linear_solve)(a, b) self.assertAllClose(expected, actual, check_dtypes=True) - # TODO(shoyer): reenable when batching works - # c = rng.randn(3, 2) - # expected = np.linalg.solve(a, c) - # actual = api.vmap(linear_solve, (None, 1), 1)(a, c) - # self.assertAllClose(expected, actual, check_dtypes=True) + c = rng.randn(3, 2) + expected = np.linalg.solve(a, c) + actual = api.vmap(linear_solve, (None, 1), 1)(a, c) + self.assertAllClose(expected, actual, check_dtypes=True) def test_custom_linear_solve_zeros(self): def explicit_jacobian_solve(matvec, b): @@ -1421,10 +1420,12 @@ def build_and_solve(a, b): self.assertAllClose(expected, actual, atol=1e-5, check_dtypes=True) jtu.check_grads(build_and_solve, (a, b), atol=1e-5, order=2, rtol=2e-3) - # TODO(shoyer): reenable when batching works - # a2 = rng.randn(1, 2, 2) - # b2 = rng.randn(1, 2, 2) - # jtu.check_grads(api.vmap(build_and_solve), (a2, b2), atol=1e-5, order=2) + # vmap across an empty dimension + jtu.check_grads( + api.vmap(build_and_solve), (a[None, :, :], b[None, :]), + atol=1e-5, + order=2, + rtol=2e-3) def test_custom_linear_solve_cholesky(self): @@ -1498,10 +1499,81 @@ def loss(a, b): jtu.check_grads(loss, (a, b), order=2, modes=['fwd'], atol={onp.float32: 2e-3, onp.float64: 1e-11}) + jtu.check_grads(api.vmap(loss), (a[None,:,:], b[None,:]), order=2, + modes=['fwd'], atol={onp.float32: 2e-3, onp.float64: 1e-11}) with self.assertRaisesRegex(TypeError, "transpose_solve required"): api.grad(loss)(a, b) + def test_custom_linear_solve_pytree(self): + """Test custom linear solve with inputs and outputs that are pytrees.""" + + def unrolled_matvec(mat, x): + """Apply a Python list of lists of scalars to a list of scalars.""" + result = [] + for i in range(len(mat)): + v = 0 + for j in range(len(x)): + if mat[i][j] is not None: + v += mat[i][j] * x[j] + result.append(v) + return result + + def unrolled_substitution_solve(matvec, b, lower_tri): + """Solve a triangular unrolled system with fwd/back substitution.""" + zero = np.zeros(()) + one = np.ones(()) + x = [zero for _ in b] + ordering = range(len(b)) if lower_tri else range(len(b) - 1, -1, -1) + for i in ordering: + residual = b[i] - matvec(x)[i] + diagonal = matvec([one if i == j else zero for j in range(len(b))])[i] + x[i] = residual / diagonal + return x + + def custom_unrolled_lower_tri_solve(mat, b): + return lax.custom_linear_solve( + partial(unrolled_matvec, mat), b, + partial(unrolled_substitution_solve, lower_tri=True), + partial(unrolled_substitution_solve, lower_tri=False)) + + mat = [[1.0, None, None, None, None, None, None], + [1.0, 1.0, None, None, None, None, None], + [None, 1.0, 1.0, None, None, None, None], + [None, None, 1.0, 1.0, None, None, None], + [None, None, None, 1.0, 1.0, None, None], + [None, None, None, None, None, 2.0, None], + [None, None, None, None, None, 4.0, 3.0]] + + rng = onp.random.RandomState(0) + b = list(rng.randn(7)) + + # Non-batched + jtu.check_grads(custom_unrolled_lower_tri_solve, (mat, b), order=2) + + # Batch one element of b (which, because of unrolling, should only affect + # the first block of outputs) + b_bat = list(b) + b_bat[3] = rng.randn(3) + jtu.check_grads( + api.vmap( + custom_unrolled_lower_tri_solve, + in_axes=(None, [None, None, None, 0, None, None, None]), + out_axes=[0, 0, 0, 0, 0, None, None]), (mat, b_bat), + order=2) + + # Batch one element of mat (again only affecting first block) + mat[2][1] = rng.randn(3) + mat_axis_tree = [ + [0 if i == 2 and j == 1 else None for j in range(7)] for i in range(7) + ] + jtu.check_grads( + api.vmap( + custom_unrolled_lower_tri_solve, + in_axes=(mat_axis_tree, None), + out_axes=[0, 0, 0, 0, 0, None, None]), (mat, b), + order=2) + def test_custom_linear_solve_errors(self): solve = lambda f, x: x From 5362ea1d3d5f529ff31ad777e17634db8a5bf18d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 30 Jan 2020 16:17:08 -0500 Subject: [PATCH 0683/1053] Use make_tuple instead of from_pyval to build types. (#2127) --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 1f12b8c317f8..7cfd1dd00875 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -89,7 +89,7 @@ def device_put(x, device=None): device_put_handlers = {} device_put_handlers[core.Unit] = \ - lambda _, device: xc.Buffer.from_pyval( + lambda _, device: xc.Buffer.make_tuple( (), device, backend=xb.get_device_backend(device)) def _device_put_array(x, device): return xc.Buffer.from_pyval(x, device, backend=xb.get_device_backend(device)) From 664a4e123d83fb1d17cd31451fbebc6f1568707a Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Thu, 30 Jan 2020 15:03:00 -0800 Subject: [PATCH 0684/1053] VJP of cond, via partial eval + transpose (#2091) VJP (grad) of lax.cond, via partial eval + transpose Co-authored-by: Matthew Johnson --- CHANGELOG.md | 5 + jax/experimental/loops.py | 10 +- jax/interpreters/partial_eval.py | 4 +- jax/lax/lax_control_flow.py | 223 ++++++++++++++++++++++++++----- tests/api_test.py | 1 + tests/lax_control_flow_test.py | 169 +++++++++++++++++++++++ tests/metadata_test.py | 5 +- 7 files changed, 381 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbcad3a4cb24..547de8f3b1ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ These are the release notes for JAX. * The minimum jaxlib version is now 0.1.38. +### New features + +* Reverse-mode automatic differentiation (e.g. `grad`) of `lax.cond`, making it + now differentiable in both modes (https://github.com/google/jax/pull/2091) + ## jaxlib 0.1.38 (January 29, 2020) * CUDA 9.0 is no longer supported. diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index be3efee17cdc..da9e304135e8 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -507,10 +507,13 @@ def build_output_vals(self, scope, carried_state_names, carried_tree, lax_control_flow._initial_style_jaxpr(lambda *args: args, carried_tree, tuple(init_avals))) + args = list(itertools.chain(body_const_vals, init_vals, + false_body_const_vals, init_vals)) return lax_control_flow.cond_p.bind( - *itertools.chain([self.pred], body_const_vals, - init_vals, false_body_const_vals, init_vals), - true_jaxpr=body_typed_jaxpr, false_jaxpr=false_body_typed_jaxpr) + self.pred, *args, + true_jaxpr=body_typed_jaxpr, + false_jaxpr=false_body_typed_jaxpr, + linear=(False,) * len(args)) class _WhileBuilder(_LoopBuilder): @@ -562,4 +565,3 @@ def cond_func_wrapped(*args): cond_jaxpr=cond_jaxpr, body_nconsts=len(body_const_vals), body_jaxpr=body_typed_jaxpr) - diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index a173aee81ce7..d35db6231f31 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -95,6 +95,9 @@ def process_primitive(self, primitive, tracers, params): if primitive in custom_partial_eval_rules: return custom_partial_eval_rules[primitive](self, *tracers, **params) else: + return self.default_process_primitive(primitive, tracers, params) + + def default_process_primitive(self, primitive, tracers, params): pvs, consts = unzip2(t.pval for t in tracers) if all(pv is None for pv in pvs): return primitive.bind(*consts, **params) @@ -628,4 +631,3 @@ def move_binders_to_front(typed_jaxpr, to_move): def _move_to_front(lst, to_move): return ([elt for elt, move in zip(lst, to_move) if move] + [elt for elt, move in zip(lst, to_move) if not move]) - diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index eb450f351fab..59e8edd9176c 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -417,16 +417,19 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): _check_tree_and_avals("true_fun and false_fun output", true_out_tree, true_jaxpr.out_avals, false_out_tree, false_jaxpr.out_avals) + linear = (False,) * (len(true_consts) + len(true_ops) + len(false_consts) + + len(false_ops)) out = cond_p.bind( *itertools.chain([pred], true_consts, true_ops, false_consts, false_ops), - true_jaxpr=true_jaxpr, false_jaxpr=false_jaxpr) + true_jaxpr=true_jaxpr, false_jaxpr=false_jaxpr, linear=linear) return tree_unflatten(true_out_tree, out) def _cond_abstract_eval(*args, **kwargs): return _map(raise_to_shaped, kwargs["true_jaxpr"].out_avals) def _cond_translation_rule(c, axis_env, name_stack, pred, *args, - true_jaxpr, false_jaxpr, backend=None): + true_jaxpr, false_jaxpr, linear, backend=None): + del linear # Unused. true_ops, false_ops = split_list(args, [len(true_jaxpr.in_avals)]) def make_computation(name, jaxpr, op_shape): @@ -450,7 +453,7 @@ def _cond_pred_bcast_select(pred, x, y): bcast_pred = lax.broadcast_in_dim(pred, onp.shape(x), list(range(onp.ndim(pred)))) return lax.select(bcast_pred, x, y) -def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr): +def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr, linear): # TODO: maybe avoid moving arg axes to front if we're promoting to select? args = [batching.moveaxis(x, d, 0) if d is not batching.not_mapped and d != 0 else x for x, d in zip(args, dims)] @@ -479,10 +482,10 @@ def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr): out_dims = [0 if b else batching.not_mapped for b in out_bat] out = cond_p.bind( *itertools.chain([pred], true_ops, false_ops), - true_jaxpr=true_jaxpr_batched, false_jaxpr=false_jaxpr_batched) + true_jaxpr=true_jaxpr_batched, false_jaxpr=false_jaxpr_batched, linear=linear) return out, out_dims -def _cond_jvp(primals, tangents, true_jaxpr, false_jaxpr): +def _cond_jvp(primals, tangents, true_jaxpr, false_jaxpr, linear): nonzeros = [t is not ad_util.zero for t in tangents] (pred_nz,), t_nz, f_nz = split_list(nonzeros, [1, len(true_jaxpr.in_avals)]) @@ -501,20 +504,186 @@ def _cond_jvp(primals, tangents, true_jaxpr, false_jaxpr): tops_dot = _prune_zeros(tops_dot) fops_dot = _prune_zeros(fops_dot) + tops_lin, fops_lin = _map(tuple, split_list(linear, [len(tops)])) + linear_jvp = (tops_lin + (True,) * len(tops_dot) + + fops_lin + (True,) * len(fops_dot)) out = cond_p.bind( *itertools.chain([pred], tops, tops_dot, fops, fops_dot), - true_jaxpr=true_jvp, false_jaxpr=false_jvp) + true_jaxpr=true_jvp, false_jaxpr=false_jvp, linear=linear_jvp) out_primals, out_tangents = split_list(out, [len(out_nz)]) out_tangents_iter = iter(out_tangents) out_tangents = [ next(out_tangents_iter) if nz else ad_util.zero for nz in out_nz] return out_primals, out_tangents +def _cond_partial_eval(trace, *tracers, true_jaxpr, false_jaxpr, linear): + unknowns = [t.pval[0] is not None for t in tracers] + + (pred_uk,), t_uk, f_uk = split_list(unknowns, [1, len(true_jaxpr.in_avals)]) + + if pred_uk: + # When the predicate is unknown, we stage out the whole cond. + params = dict(true_jaxpr=true_jaxpr, false_jaxpr=false_jaxpr, linear=linear) + return trace.default_process_primitive(cond_p, tracers, params) + + _, _, t_out_uks = pe.partial_eval_jaxpr(true_jaxpr, t_uk, instantiate=False) + _, _, f_out_uks = pe.partial_eval_jaxpr(false_jaxpr, f_uk, instantiate=False) + out_uks = [a or b for a, b in zip(t_out_uks, f_out_uks)] + + true_jaxpr_1, true_jaxpr_2, _ = pe.partial_eval_jaxpr(true_jaxpr, t_uk, + instantiate=out_uks) + false_jaxpr_1, false_jaxpr_2, _ = pe.partial_eval_jaxpr(false_jaxpr, f_uk, + instantiate=out_uks) + + num_t_res = len(true_jaxpr_1.out_avals) - len(out_uks) + num_f_res = len(false_jaxpr_1.out_avals) - len(out_uks) + + move = [False] * len(true_jaxpr.in_avals) + [True] * num_t_res + true_jaxpr_2 = pe.move_binders_to_front(true_jaxpr_2, move) + move = [False] * len(false_jaxpr.in_avals) + [True] * num_f_res + false_jaxpr_2 = pe.move_binders_to_front(false_jaxpr_2, move) + + # TODO(frostig,mattjj): pe.partial_eval_jaxpr should raise to shaped avals + t_res_avals = _map(raise_to_shaped, true_jaxpr_2.in_avals[:num_t_res]) + f_res_avals = _map(raise_to_shaped, false_jaxpr_2.in_avals[:num_f_res]) + + assert len(true_jaxpr_2.out_avals) == len(false_jaxpr_2.out_avals) + num_outs = len(true_jaxpr_2.out_avals) + + true_jaxpr_1 = _join_cond_outputs( + true_jaxpr_1, num_outs, f_res_avals, zeros_on_left=False) + false_jaxpr_1 = _join_cond_outputs( + false_jaxpr_1, num_outs, t_res_avals, zeros_on_left=True) + + # TODO(frostig,mattjj): reinstate this assertion once pe.partial_eval_jaxpr + # raises to shaped avals + # assert true_jaxpr_1.out_avals == false_jaxpr_1.out_avals + num_res = num_t_res + num_f_res + + _, in_consts = unzip2([t.pval for t in tracers]) + out_consts_res = cond_p.bind( + *in_consts, true_jaxpr=true_jaxpr_1, false_jaxpr=false_jaxpr_1, + linear=linear) + out_consts, res = split_list(out_consts_res, [len(out_consts_res) - num_res]) + + # TODO(frostig,mattjj): remove raised_to_shaped of avals once + # pe.partial_eval_jaxpr handles it + out_avals = _map(raise_to_shaped, true_jaxpr_2.out_avals) + out_pvs = [aval if uk else None for aval, uk in zip(out_avals, out_uks)] + + pred_tracer = trace.instantiate_const(tracers[0]) + + ops_tracers = [trace.instantiate_const(t) if uk + else trace.new_instantiated_literal(core.unit) + for uk, t in zip(unknowns[1:], tracers[1:])] + true_ops_tracers, false_ops_tracers = split_list( + ops_tracers, [len(true_jaxpr.in_avals)]) + + res_tracers = _map(trace.new_instantiated_const, res) + true_res_tracers, false_res_tracers = split_list(res_tracers, [num_t_res]) + + out_tracers = [pe.JaxprTracer(trace, pe.PartialVal((pv, const)), None) + for pv, const in zip(out_pvs, out_consts)] + + tops_lin, fops_lin = _map(tuple, split_list(linear, [len(true_jaxpr.in_avals)])) + linear_2 = ((False,) * num_t_res + tops_lin + (False,) * num_f_res + fops_lin) + params = dict(true_jaxpr=true_jaxpr_2, false_jaxpr=false_jaxpr_2, + linear=linear_2) + eqn = pe.new_eqn_recipe([pred_tracer] + + true_res_tracers + true_ops_tracers + + false_res_tracers + false_ops_tracers, + out_tracers, + cond_p, (), params) + for t in out_tracers: t.recipe = eqn + return out_tracers + +def _join_cond_outputs(jaxpr, num_prefix, zeros_avals, zeros_on_left): + @lu.wrap_init + def f_aug(*args): + prefix_and_rest = core.jaxpr_as_fun(jaxpr)(*args) + prefix, rest = split_list(prefix_and_rest, [num_prefix]) + zeros = [ad_util.zeros_like_aval(a) for a in zeros_avals] + if zeros_on_left: + return prefix + zeros + rest + else: + return prefix + rest + zeros + + return _make_typed_jaxpr(f_aug, jaxpr.in_avals) + +def _transpose_cond_jaxpr(jaxpr, num_res): + num_non_res = len(jaxpr.in_avals) - num_res + res_avals, primal_avals = split_list(jaxpr.in_avals, [num_res]) + primal_avals = _map(raise_to_shaped, primal_avals) + + @lu.wrap_init + def transposed(*args): + res, cts_out = split_list(args, [num_res]) + primals = res + [ad.undefined_primal] * num_non_res + _, cts_in = ad.backward_pass( + jaxpr.jaxpr, jaxpr.literals, (), primals, cts_out) + _, cts_in = split_list(cts_in, [num_res]) + return _map(ad.instantiate_zeros_aval, primal_avals, cts_in) + + return _make_typed_jaxpr(transposed, res_avals + jaxpr.out_avals) + +def _cond_transpose(cts, *args, true_jaxpr, false_jaxpr, linear): + (pred,), tops, fops = split_list(args, [1, len(true_jaxpr.in_avals)]) + tops_lin, fops_lin = split_list(linear, [len(true_jaxpr.in_avals)]) + in_avals = _map(raise_to_shaped, true_jaxpr.in_avals + false_jaxpr.in_avals) + + num_t_res = len(tops) - sum(tops_lin) + num_f_res = len(fops) - sum(fops_lin) + + t_jaxpr_trans = _transpose_cond_jaxpr(true_jaxpr, num_t_res) + f_jaxpr_trans = _transpose_cond_jaxpr(false_jaxpr, num_f_res) + lin_in_avals = _map(raise_to_shaped, [a for a, l in zip(in_avals, linear) if l]) + assert t_jaxpr_trans.out_avals + f_jaxpr_trans.out_avals == lin_in_avals + + t_jaxpr_trans_ = _join_cond_outputs( + t_jaxpr_trans, 0, f_jaxpr_trans.out_avals, zeros_on_left=False) + f_jaxpr_trans_ = _join_cond_outputs( + f_jaxpr_trans, 0, t_jaxpr_trans.out_avals, zeros_on_left=True) + assert t_jaxpr_trans_.out_avals == f_jaxpr_trans_.out_avals == lin_in_avals + + t_res, _ = split_list(tops, [num_t_res]) + f_res, _ = split_list(fops, [num_f_res]) + + linear_trans = ((False,) * num_t_res + (True,) * len(cts) + + (False,) * num_f_res + (True,) * len(cts)) + + cts = _map(ad.instantiate_zeros_aval, true_jaxpr.out_avals, cts) + + out = cond_p.bind( + pred, *itertools.chain(t_res, cts, f_res, cts), + true_jaxpr=t_jaxpr_trans_, false_jaxpr=f_jaxpr_trans_, + linear=linear_trans) + assert all(_map(typecheck, lin_in_avals, out)) + + out_iter = iter(out) + out = [next(out_iter) if l else None for l in linear] + assert next(out_iter, None) is None + return [None] + out + +def cond_bind(*args, true_jaxpr, false_jaxpr, linear): + if not core.skip_checks: + assert len(linear) + 1 == len(args) + assert len(args) == 1 + len(true_jaxpr.in_avals) + len(false_jaxpr.in_avals) + (pred,), tops, fops = split_list(args, [1, len(true_jaxpr.in_avals)]) + assert all(_map(typecheck, true_jaxpr.in_avals, tops)) + assert all(_map(typecheck, false_jaxpr.in_avals, fops)) + core.check_jaxpr(true_jaxpr.jaxpr) + core.check_jaxpr(false_jaxpr.jaxpr) + return core.Primitive.bind(cond_p, *args, true_jaxpr=true_jaxpr, + false_jaxpr=false_jaxpr, linear=linear) + cond_p = lax.Primitive('cond') cond_p.multiple_results = True cond_p.def_impl(partial(xla.apply_primitive, cond_p)) cond_p.def_abstract_eval(_cond_abstract_eval) +cond_p.def_custom_bind(cond_bind) ad.primitive_jvps[cond_p] = _cond_jvp +ad.primitive_transposes[cond_p] = _cond_transpose +pe.custom_partial_eval_rules[cond_p] = _cond_partial_eval batching.primitive_batchers[cond_p] = _cond_batching_rule xla.initial_style_translations[cond_p] = _cond_translation_rule @@ -853,7 +1022,8 @@ def _scan_transpose(cts, *args, **kwargs): # jaxpr :: [ires, T d] -> [T c] -> [T a, eres] -> ([T c], [T b]) # jaxpr_trans :: [ires] -> [CT d, CT c] -> [CT b, eres] -> ([CT d, CT c], [CT a]) - jaxpr_trans = _transpose_jaxpr(num_ires, num_consts - num_ires, num_eres, jaxpr) + jaxpr_trans = _transpose_scan_jaxpr( + num_ires, num_consts - num_ires, num_eres, jaxpr) linear_trans = ([False] * num_ires + [True] * (len(ct_consts) + len(ct_carry) + len(ct_ys)) + [False] * num_eres) @@ -865,9 +1035,9 @@ def _scan_transpose(cts, *args, **kwargs): ct_consts, ct_init, ct_xs = split_list(outs, [num_consts - num_ires, num_carry]) return [None] * num_ires + ct_consts + ct_init + ct_xs + [None] * num_eres -# transpose_jaxpr :: ([res1, c, a, res2] -> b) -# -> ([res1, CT c, CT b, res2] -> [CT c, CT a]) -def _transpose_jaxpr(num_res1, num_c, num_res2, jaxpr): +# transpose_scan_jaxpr :: ([res1, c, a, res2] -> b) +# -> ([res1, CT c, CT b, res2] -> [CT c, CT a]) +def _transpose_scan_jaxpr(num_res1, num_c, num_res2, jaxpr): num_a = len(jaxpr.in_avals) - num_res1 - num_c - num_res2 res1_avals, c_avals, a_avals, res2_avals = split_list( jaxpr.in_avals, [num_res1, num_c, num_a]) @@ -892,7 +1062,7 @@ def _make_typed_jaxpr(traceable, in_avals): pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] jaxpr, pvals_out, consts = pe.trace_to_jaxpr(traceable, pvals, instantiate=True) out_avals, _ = unzip2(pvals_out) - return core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) + return core.TypedJaxpr(jaxpr, consts, in_avals, _map(raise_to_shaped, out_avals)) def _scan_batching_rule(args, dims, forward, length, jaxpr, num_consts, @@ -978,25 +1148,18 @@ def masked(*args): const_avals, carry_avals, x_avals = split_list(jaxpr.in_avals, [num_consts, num_carry]) return _make_typed_jaxpr(masked, [aval] + const_avals + [aval] + carry_avals + x_avals) -def scan_bind(*args, **kwargs): - forward, length, num_consts, num_carry, jaxpr, linear = split_dict( - kwargs, ["forward", "length", "num_consts", "num_carry", "jaxpr", "linear"]) - consts, init, xs = split_list(args, [num_consts, num_carry]) - assert len(linear) == len(args) - - # check that args match input types - consts_avals, init_avals, x_avals = split_list(jaxpr.in_avals, [num_consts, num_carry]) - xs_avals = _map(partial(_promote_aval_rank, length), x_avals) - assert all(_map(typecheck, consts_avals, consts)), (consts, consts_avals) - assert all(_map(typecheck, init_avals, init)) - # assert all(_map(typecheck, xs_avals, xs)) - # check that output carry type matches input carry type - carry_avals, _ = split_list(jaxpr.out_avals, [num_carry]) - assert all(_map(typematch, init_avals, carry_avals)) - - # check that the data flow is sensible - core.check_jaxpr(jaxpr.jaxpr) - +def scan_bind(*args, forward, length, num_consts, num_carry, jaxpr, linear): + if not core.skip_checks: + assert len(linear) == len(args) + consts, init, xs = split_list(args, [num_consts, num_carry]) + consts_avals, init_avals, x_avals = split_list(jaxpr.in_avals, [num_consts, num_carry]) + xs_avals = _map(partial(_promote_aval_rank, length), x_avals) + assert all(_map(typecheck, consts_avals, consts)), (consts, consts_avals) + assert all(_map(typecheck, init_avals, init)) + # assert all(_map(typecheck, xs_avals, xs)) + carry_avals, _ = split_list(jaxpr.out_avals, [num_carry]) + assert all(_map(typematch, init_avals, carry_avals)) + core.check_jaxpr(jaxpr.jaxpr) return core.Primitive.bind(scan_p, *args, forward=forward, length=length, jaxpr=jaxpr, num_consts=num_consts, num_carry=num_carry, linear=linear) diff --git a/tests/api_test.py b/tests/api_test.py index 89c37f8a9db6..6ead964667e9 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1697,6 +1697,7 @@ def f(x): e = cond[ false_jaxpr={ lambda ; ; b a. let c = sub a b in [c] } + linear=(False, False, False, False) true_jaxpr={ lambda ; ; b a. let c = add a b in [c] } ] b a c a d diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index ee08e70550af..0b4943d339cf 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -648,9 +648,178 @@ def false_fun(x): ans = api.jvp(fun, (x,), (x,)) expected = api.jvp(fun_ref, (x,), (x,)) self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(fun, (x,), order=2, modes=["fwd"]) + x = 2.72 + ans = api.jvp(fun, (x,), (x,)) + expected = api.jvp(fun_ref, (x,), (x,)) + self.assertAllClose(ans, expected, check_dtypes=False) jtu.check_grads(fun, (x,), order=2, modes=["fwd"]) + def testCondJVP2(self): + def fun_ref(x): + if x < 3: + return 2. + else: + return 2. * x + + def fun(x): + return lax.cond(x < 3, (), lambda _: 2., x, lambda x: 2. * x) + + x = 3.14 + ans = api.jvp(fun, (x,), (x,)) + expected = api.jvp(fun_ref, (x,), (x,)) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(fun, (x,), order=2, modes=["fwd"]) + + x = 2.72 + ans = api.jvp(fun, (x,), (x,)) + expected = api.jvp(fun_ref, (x,), (x,)) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(fun, (x,), order=2, modes=["fwd"]) + + def testCondGrad(self): + def f_ref(x): + return 3. * x if x < 2 else np.sin(x) + + def f(x): + return lax.cond(x < 2, x, lambda x: 3. * x, x, lambda x: np.sin(x)) + + x = 2.14 + ans = api.grad(f)(x) + expected = api.grad(f_ref)(x) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(f, (x,), order=2, modes=["fwd", "rev"]) + + x = 1.72 + ans = api.grad(f)(x) + expected = api.grad(f_ref)(x) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(f, (x,), order=2, modes=["fwd", "rev"]) + + def testCondGrad2(self): + def f_ref(x): + z = np.array([1., 2.]) * x if x[0] < 2 else np.sin(x) + return z.sum() + + def _f(x): + return lax.cond( + x[0] < 2, + x, lambda x: np.array([1., 2.]) * x, + x, lambda x: np.sin(x)) + + f = lambda x: api.jit(_f)(x).sum() + + x = 2.14 * np.ones(2) + ans = api.grad(f)(x) + expected = api.grad(f_ref)(x) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(f, (x,), order=2, modes=["fwd", "rev"]) + + x = 1.72 * np.ones(2) + ans = api.grad(f)(x) + expected = api.grad(f_ref)(x) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(f, (x,), order=2, modes=["fwd", "rev"]) + + def testCondGrad3(self): + def fun_ref(x): + if x < 3: + return 2. + else: + return 2. * x + + def fun(x): + return lax.cond(x < 3, (), lambda _: 2., x, lambda x: 2. * x) + + x = 3.14 + ans = api.grad(fun)(x) + expected = api.grad(fun_ref)(x) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(fun, (x,), order=2, modes=["fwd", "rev"]) + + x = 2.72 + ans = api.grad(fun)(x) + expected = api.grad(fun_ref)(x) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(fun, (x,), order=2, modes=["fwd", "rev"]) + + def testCondGrad4(self): + def fun_ref(x, y): + if x < 3: + return 2. * np.sin(y) + else: + return 2. * np.cos(x) + + def fun(x, y): + return lax.cond( + x < 3, + (), lambda _: 2. * np.sin(y), + x, lambda x: 2. * x) + + y = 5.8 + x = 3.14 + ans = api.grad(fun, 1)(x, y) + expected = api.grad(fun_ref, 1)(x, y) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(fun, (x, y), order=2, modes=["fwd", "rev"]) + + x = 2.72 + ans = api.grad(fun, 1)(x, y) + expected = api.grad(fun_ref, 1)(x, y) + self.assertAllClose(ans, expected, check_dtypes=False) + jtu.check_grads(fun, (x, y), order=2, modes=["fwd", "rev"]) + + def testCondLinearize(self): + def f(x): + return lax.cond(x < 2, x, lambda x: 3. * x, x, lambda x: np.sin(x)) + y, f_lin = api.linearize(f, 1.) + self.assertAllClose(y, 3., check_dtypes=False) + self.assertAllClose(f_lin(2.), 6., check_dtypes=False) + y, f_lin = api.linearize(f, 4.) + self.assertAllClose(y, np.sin(4.), check_dtypes=False) + self.assertAllClose(f_lin(2.), np.cos(4.) * 2., check_dtypes=False) + + def testCondLinearize2(self): + def f_ref(x): + z = np.array([1., 2.]) * x if x[0] < 2 else np.cos(np.sin(x)) + return z.sum() + + def f(x): + return lax.cond( + x[0] < 2, + x, lambda x: np.array([1., 2.]) * x, + x, lambda x: np.cos(np.sin(x))).sum() + + x = 2.14 * np.ones(2) + y, f_lin = api.linearize(f, x) + y_ref, f_lin_ref = api.linearize(f_ref, x) + self.assertAllClose(y, y_ref, check_dtypes=False) + self.assertAllClose(f_lin(x), f_lin_ref(x), check_dtypes=False) + + x = -2.14 * np.ones(2) + y, f_lin = api.linearize(f, x) + y_ref, f_lin_ref = api.linearize(f_ref, x) + self.assertAllClose(y, y_ref, check_dtypes=False) + self.assertAllClose(f_lin(x), f_lin_ref(x), check_dtypes=False) + + f = api.jit(f) + x = 2.14 * np.ones(2) + y, f_lin = api.linearize(f, x) + y_ref, f_lin_ref = api.linearize(f_ref, x) + self.assertAllClose(y, y_ref, check_dtypes=False) + self.assertAllClose(f_lin(x), f_lin_ref(x), check_dtypes=False) + + def testCondJit(self): + def f(x): + return lax.cond(x < 2, x, lambda x: 3. * x, x, lambda x: np.sin(x)) + y = api.jit(f)(1.) + expected = f(1.) + self.assertAllClose(y, expected, check_dtypes=False) + y = api.jit(f)(4.) + expected = f(4.) + self.assertAllClose(y, expected, check_dtypes=False) + def testIssue1263(self): def f(rng, x): cond = random.bernoulli(rng) diff --git a/tests/metadata_test.py b/tests/metadata_test.py index a527c3e0d62f..e1597fbd92ac 100644 --- a/tests/metadata_test.py +++ b/tests/metadata_test.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from unittest import SkipTest from absl.testing import absltest from jax import test_util as jtu @@ -43,6 +44,7 @@ def tearDown(self): del xb._JaxComputationBuilder.SetOpMetadata def test_primitive_metadata(self): + raise SkipTest # TODO(jekbradbury) _ = jnp.sin(1.) assert self.op_types[-1] == 'sin' assert self.op_names[-1] == 'sin' @@ -63,6 +65,7 @@ def foo(x): assert self.op_names[-1] == 'jit(foo)/sin' def test_nested_jit_metadata(self): + raise SkipTest # TODO(jekbradbury) @jax.jit def foo(x): return jnp.sin(x) @@ -102,7 +105,7 @@ def false_fun(x): return jnp.cos(x) _ = jax.lax.cond(True, 1., true_fun, 1., false_fun) assert self.op_types[-3] == 'cond' - assert self.op_names[-3] == 'cond' + assert self.op_names[-3] == 'cond[ linear=(False, False) ]' assert self.op_types[-2] == 'sin' assert self.op_names[-2] == 'cond/true_fun/sin' assert self.op_types[-1] == 'cos' From 01039299304b148b405ef9b9fa5e82bbb527471d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 30 Jan 2020 19:19:41 -0500 Subject: [PATCH 0685/1053] Revert "Use lax.erf_inv to implement ndtri. (#2122)" (#2128) This reverts commit bbcbe23c1ee52cf76542f3a60f8344832a0dd05f. This change appears to cause test failures in TF probability's JAX backend. --- jax/scipy/special.py | 124 ++++++++++++++++++++++++++++++++++++++++--- tests/lax_test.py | 4 +- 2 files changed, 121 insertions(+), 7 deletions(-) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index ae7d577347ea..14a61d2c5f97 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -13,8 +13,6 @@ # limitations under the License. -import math - import numpy as onp import scipy.special as osp_special @@ -147,7 +145,7 @@ def multigammaln(a, d): # Normal distributions -# Functions "ndtr" [... is] derived from calculations made in: +# Functions "ndtr" and "ndtri" are derived from calculations made in: # https://root.cern.ch/doc/v608/SpecFuncCephesInv_8cxx_source.html # In the following email exchange, the author gives his consent to redistribute # derived works under an Apache 2.0 license. @@ -275,7 +273,7 @@ def ndtri(p): This is a based on the implementation in netlib. Args: - p: an array of floating-point type. + p: an array of type `float32`, `float64`. Returns: an array with `dtype=p.dtype`. @@ -283,8 +281,122 @@ def ndtri(p): Raises: TypeError: if `p` is not floating-type. """ - p, = _promote_args_inexact("ndtri", p) - return lax.erf_inv(np.asarray(p) * 2 - 1) * math.sqrt(2) + x = np.asarray(p) + dtype = lax.dtype(p) + if dtype not in (np.float32, np.float64): + raise TypeError( + "x.dtype={} is not supported, see docstring for supported types." + .format(dtype)) + return _ndtri(p) + + +def _ndtri(p): + """Implements ndtri core logic.""" + + # Constants used in piece-wise rational approximations. Taken from the cephes + # library: + # https://root.cern.ch/doc/v608/SpecFuncCephesInv_8cxx_source.html + p0 = list(reversed([-5.99633501014107895267E1, + 9.80010754185999661536E1, + -5.66762857469070293439E1, + 1.39312609387279679503E1, + -1.23916583867381258016E0])) + q0 = list(reversed([1.0, + 1.95448858338141759834E0, + 4.67627912898881538453E0, + 8.63602421390890590575E1, + -2.25462687854119370527E2, + 2.00260212380060660359E2, + -8.20372256168333339912E1, + 1.59056225126211695515E1, + -1.18331621121330003142E0])) + p1 = list(reversed([4.05544892305962419923E0, + 3.15251094599893866154E1, + 5.71628192246421288162E1, + 4.40805073893200834700E1, + 1.46849561928858024014E1, + 2.18663306850790267539E0, + -1.40256079171354495875E-1, + -3.50424626827848203418E-2, + -8.57456785154685413611E-4])) + q1 = list(reversed([1.0, + 1.57799883256466749731E1, + 4.53907635128879210584E1, + 4.13172038254672030440E1, + 1.50425385692907503408E1, + 2.50464946208309415979E0, + -1.42182922854787788574E-1, + -3.80806407691578277194E-2, + -9.33259480895457427372E-4])) + p2 = list(reversed([3.23774891776946035970E0, + 6.91522889068984211695E0, + 3.93881025292474443415E0, + 1.33303460815807542389E0, + 2.01485389549179081538E-1, + 1.23716634817820021358E-2, + 3.01581553508235416007E-4, + 2.65806974686737550832E-6, + 6.23974539184983293730E-9])) + q2 = list(reversed([1.0, + 6.02427039364742014255E0, + 3.67983563856160859403E0, + 1.37702099489081330271E0, + 2.16236993594496635890E-1, + 1.34204006088543189037E-2, + 3.28014464682127739104E-4, + 2.89247864745380683936E-6, + 6.79019408009981274425E-9])) + + dtype = lax.dtype(p).type + shape = np.shape(p) + + def _create_polynomial(var, coeffs): + """Compute n_th order polynomial via Horner's method.""" + coeffs = onp.array(coeffs, dtype) + if not coeffs.size: + return np.zeros_like(var) + return coeffs[0] + _create_polynomial(var, coeffs[1:]) * var + + + maybe_complement_p = np.where(p > dtype(-onp.expm1(-2.)), dtype(1.) - p, p) + # Write in an arbitrary value in place of 0 for p since 0 will cause NaNs + # later on. The result from the computation when p == 0 is not used so any + # number that doesn't result in NaNs is fine. + sanitized_mcp = np.where( + maybe_complement_p <= dtype(0.), + np.full(shape, dtype(0.5)), + maybe_complement_p) + + # Compute x for p > exp(-2): x/sqrt(2pi) = w + w**3 P0(w**2)/Q0(w**2). + w = sanitized_mcp - dtype(0.5) + ww = lax.square(w) + x_for_big_p = w + w * ww * (_create_polynomial(ww, p0) + / _create_polynomial(ww, q0)) + x_for_big_p *= -dtype(onp.sqrt(2. * onp.pi)) + + # Compute x for p <= exp(-2): x = z - log(z)/z - (1/z) P(1/z) / Q(1/z), + # where z = sqrt(-2. * log(p)), and P/Q are chosen between two different + # arrays based on whether p < exp(-32). + z = lax.sqrt(dtype(-2.) * lax.log(sanitized_mcp)) + first_term = z - lax.log(z) / z + second_term_small_p = ( + _create_polynomial(dtype(1.) / z, p2) / + _create_polynomial(dtype(1.) / z, q2) / z) + second_term_otherwise = ( + _create_polynomial(dtype(1.) / z, p1) / + _create_polynomial(dtype(1.) / z, q1) / z) + x_for_small_p = first_term - second_term_small_p + x_otherwise = first_term - second_term_otherwise + + x = np.where(sanitized_mcp > dtype(onp.exp(-2.)), + x_for_big_p, + np.where(z >= dtype(8.0), x_for_small_p, x_otherwise)) + + x = np.where(p > dtype(1. - onp.exp(-2.)), x, -x) + infinity = np.full(shape, dtype(onp.inf)) + x_nan_replaced = np.where( + p <= dtype(0.0), -infinity, np.where(p >= dtype(1.0), infinity, x)) + return x_nan_replaced @custom_transforms diff --git a/tests/lax_test.py b/tests/lax_test.py index c2ece7284c4d..d8101901b894 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -128,8 +128,10 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): jtu.rand_positive, {onp.float64: 1e-14}), op_record("erf", 1, float_dtypes, jtu.rand_small), op_record("erfc", 1, float_dtypes, jtu.rand_small), + # TODO(b/142976030): the approximation of erfinf used by XLA is only + # accurate to float32 precision. op_record("erf_inv", 1, float_dtypes, jtu.rand_small, - {onp.float64: 1e-14}), + {onp.float64: 1e-9}), op_record("bessel_i0e", 1, float_dtypes, jtu.rand_default), op_record("bessel_i1e", 1, float_dtypes, jtu.rand_default), From 4c30c0285c509764f3b1b937b8a6bc9f9b8dd061 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 30 Jan 2020 17:19:01 -0800 Subject: [PATCH 0686/1053] Implement scipy.stats.logistic (#1993) --- jax/scipy/stats/__init__.py | 1 + jax/scipy/stats/logistic.py | 48 ++++++++++++++++++++++++++++++++++ tests/scipy_stats_test.py | 52 +++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 jax/scipy/stats/logistic.py diff --git a/jax/scipy/stats/__init__.py b/jax/scipy/stats/__init__.py index dbd2a32a1041..bf08a2b1d268 100644 --- a/jax/scipy/stats/__init__.py +++ b/jax/scipy/stats/__init__.py @@ -25,3 +25,4 @@ from . import pareto from . import t from . import uniform +from . import logistic diff --git a/jax/scipy/stats/logistic.py b/jax/scipy/stats/logistic.py new file mode 100644 index 000000000000..cac9e33bcc45 --- /dev/null +++ b/jax/scipy/stats/logistic.py @@ -0,0 +1,48 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import scipy.stats as osp_stats +from jax.scipy.special import expit, logit + +from ... import lax +from ...numpy.lax_numpy import _promote_args_inexact, _wraps + + +@_wraps(osp_stats.logistic.logpdf, update_doc=False) +def logpdf(x): + return lax.neg(x) - 2. * lax.log1p(lax.exp(lax.neg(x))) + +@_wraps(osp_stats.logistic.pdf, update_doc=False) +def pdf(x): + return lax.exp(logpdf(x)) + +@_wraps(osp_stats.logistic.ppf, update_doc=False) +def ppf(x): + return logit(x) + +@_wraps(osp_stats.logistic.sf, update_doc=False) +def sf(x): + return expit(lax.neg(x)) + +@_wraps(osp_stats.logistic.isf, update_doc=False) +def isf(x): + return -logit(x) + +@_wraps(osp_stats.logistic.cdf, update_doc=False) +def cdf(x): + return expit(x) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 5c63f1f0999d..36353cb0e065 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -208,6 +208,58 @@ def args_maker(): tol=1e-6) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + @genNamedParametersNArgs(1, jtu.rand_default) + def testLogisticCdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() + scipy_fun = osp_stats.logistic.cdf + lax_fun = lsp_stats.logistic.cdf + + def args_maker(): + return list(map(rng, shapes, dtypes)) + + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, + tol=1e-6) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + + @genNamedParametersNArgs(1, jtu.rand_default) + def testLogisticLogpdf(self, rng_factory, shapes, dtypes): + rng = rng_factory() + scipy_fun = osp_stats.logistic.logpdf + lax_fun = lsp_stats.logistic.logpdf + + def args_maker(): + return list(map(rng, shapes, dtypes)) + + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, + tol=1e-6) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + + @genNamedParametersNArgs(1, jtu.rand_default) + def testLogisticPpf(self, rng_factory, shapes, dtypes): + rng = rng_factory() + scipy_fun = osp_stats.logistic.ppf + lax_fun = lsp_stats.logistic.ppf + + def args_maker(): + return list(map(rng, shapes, dtypes)) + + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, + tol=1e-6) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + + @genNamedParametersNArgs(1, jtu.rand_default) + def testLogisticSf(self, rng_factory, shapes, dtypes): + rng = rng_factory() + scipy_fun = osp_stats.logistic.sf + lax_fun = lsp_stats.logistic.sf + + def args_maker(): + return list(map(rng, shapes, dtypes)) + + self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, + tol=1e-6) + self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) + # TODO: currently it ignores the argument "shapes" and only tests dim=4 @genNamedParametersNArgs(3, jtu.rand_default) def testMultivariateNormalLogPdf(self, rng_factory, shapes, dtypes): From 843e22dd1732d0d537bd6b01656af2978a8e2082 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 31 Jan 2020 10:09:40 -0500 Subject: [PATCH 0687/1053] Support __cuda_array_interface__ on JAX DeviceArrays. (#2133) Allows exporting GPU device-resident arrays to other libraries, e.g., CuPy. --- WORKSPACE | 6 +-- jax/interpreters/xla.py | 4 ++ ...test.py => array_interoperability_test.py} | 44 ++++++++++++++++--- 3 files changed, 44 insertions(+), 10 deletions(-) rename tests/{dlpack_test.py => array_interoperability_test.py} (72%) diff --git a/WORKSPACE b/WORKSPACE index 2615988322ad..97dbe5dc5e16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "46d17ceaae12196c1cb2e99ca0cf040e7cefdc45ae9eede60c3caf3c5aaf5e48", - strip_prefix = "tensorflow-93ccefd6d3b8d32f7afcc43568fc7e872e744767", + sha256 = "4ce0e08aa014fafa7a0e8fb3531bdc914bd8a49828e1f5c31bb8adfb751ad73d", + strip_prefix = "tensorflow-210649dd56d7c4b75e3e8e2a851b61c80ae13dbb", urls = [ - "https://github.com/tensorflow/tensorflow/archive/93ccefd6d3b8d32f7afcc43568fc7e872e744767.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/210649dd56d7c4b75e3e8e2a851b61c80ae13dbb.tar.gz", ], ) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 7cfd1dd00875..01861b139ce2 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -832,6 +832,10 @@ def __format__(self, format_spec): def __array__(self, dtype=None, context=None): return onp.asarray(self._value, dtype=dtype) + @property + def __cuda_array_interface__(self): + return _force(self).device_buffer.__cuda_array_interface__ + __str__ = partialmethod(_forward_to_value, str) __bool__ = __nonzero__ = partialmethod(_forward_to_value, bool) def __float__(self): return self._value.__float__() diff --git a/tests/dlpack_test.py b/tests/array_interoperability_test.py similarity index 72% rename from tests/dlpack_test.py rename to tests/array_interoperability_test.py index 658717d1b470..248e71396458 100644 --- a/tests/dlpack_test.py +++ b/tests/array_interoperability_test.py @@ -31,11 +31,17 @@ except ImportError: torch = None +try: + import cupy +except ImportError: + cupy = None -scalar_types = [jnp.bool_, jnp.int8, jnp.int16, jnp.int32, jnp.int64, - jnp.uint8, jnp.uint16, jnp.uint32, jnp.uint64, - jnp.bfloat16, jnp.float16, jnp.float32, jnp.float64] -torch_types = [jnp.int8, jnp.int16, jnp.int32, jnp.int64, + +standard_dtypes = [jnp.bool_, jnp.int8, jnp.int16, jnp.int32, jnp.int64, + jnp.uint8, jnp.uint16, jnp.uint32, jnp.uint64, + jnp.float16, jnp.float32, jnp.float64] +all_dtypes = standard_dtypes + [jnp.bfloat16] +torch_dtypes = [jnp.int8, jnp.int16, jnp.int32, jnp.int64, jnp.uint8, jnp.float16, jnp.float32, jnp.float64] nonempty_nonscalar_array_shapes = [(4,), (3, 4), (2, 3, 4)] @@ -59,7 +65,7 @@ def setUp(self): jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype} for shape in all_shapes - for dtype in scalar_types)) + for dtype in all_dtypes)) def testJaxRoundTrip(self, shape, dtype): rng = jtu.rand_default() np = rng(shape, dtype) @@ -77,7 +83,7 @@ def testJaxRoundTrip(self, shape, dtype): jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype} for shape in all_shapes - for dtype in torch_types)) + for dtype in torch_dtypes)) @unittest.skipIf(not torch, "Test requires PyTorch") def testTorchToJax(self, shape, dtype): rng = jtu.rand_default() @@ -93,7 +99,7 @@ def testTorchToJax(self, shape, dtype): jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype} for shape in all_shapes - for dtype in torch_types)) + for dtype in torch_dtypes)) @unittest.skipIf(not torch or jax.lib.version <= (0, 1, 38), "Test requires PyTorch and jaxlib >= 0.1.39") # TODO(phawkins): the dlpack destructor issues errors in jaxlib 0.1.38. @@ -106,5 +112,29 @@ def testJaxToTorch(self, shape, dtype): self.assertAllClose(np, y.numpy(), check_dtypes=True) +class CudaArrayInterfaceTest(jtu.JaxTestCase): + + def setUp(self): + if jtu.device_under_test() != "gpu": + self.skipTest("__cuda_array_interface__ is only supported on GPU") + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_{}".format( + jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype} + for shape in all_shapes + for dtype in standard_dtypes)) + @unittest.skipIf(not cupy or jax.lib.version <= (0, 1, 38), + "Test requires CuPy and jaxlib >= 0.1.39") + def testJaxToCuPy(self, shape, dtype): + rng = jtu.rand_default() + x = rng(shape, dtype) + y = jnp.array(x) + z = cupy.asarray(y) + self.assertEqual(y.__cuda_array_interface__["data"][0], + z.__cuda_array_interface__["data"][0]) + self.assertAllClose(x, cupy.asnumpy(z), check_dtypes=True) + + if __name__ == "__main__": absltest.main() From 91cd20b1734112e1005f8a9b00007b0b5a79a527 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 31 Jan 2020 11:15:04 -0500 Subject: [PATCH 0688/1053] Update documentation and changelog to mention DLPack and array interface support. (#2134) --- CHANGELOG.md | 7 +++++++ docs/jax.rst | 1 + 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 547de8f3b1ec..f1517688ae0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,13 @@ These are the release notes for JAX. * Reverse-mode automatic differentiation (e.g. `grad`) of `lax.cond`, making it now differentiable in both modes (https://github.com/google/jax/pull/2091) +* JAX now supports DLPack, which allows sharing CPU and GPU arrays in a + zero-copy way with other libraries, such as PyTorch. +* JAX GPU DeviceArrays now support `__cuda_array_interface__`, which is another + zero-copy protocol for sharing GPU arrays with other libraries such as CuPy + and Numba. +* JAX CPU device buffers now implement the Python buffer protocol, which allows + zero-copy buffer sharing between JAX and NumPy. ## jaxlib 0.1.38 (January 29, 2020) diff --git a/docs/jax.rst b/docs/jax.rst index dc2bf8c389ad..a9d0a49c78c2 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -17,6 +17,7 @@ Subpackages jax.ops jax.random jax.tree_util + jax.dlpack Just-in-time compilation (:code:`jit`) -------------------------------------- From efbdaf66bfa584cc635092919a23b684c7fb2247 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 31 Jan 2020 11:19:55 -0800 Subject: [PATCH 0689/1053] Adjust scipy_stats_test.py tolerance. --- tests/scipy_stats_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 36353cb0e065..0e7cbe608242 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -231,7 +231,7 @@ def args_maker(): return list(map(rng, shapes, dtypes)) self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, - tol=1e-6) + tol=1e-3) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @genNamedParametersNArgs(1, jtu.rand_default) From ae1d6b875fcc2b23909b360c73db00489f32068e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 31 Jan 2020 23:47:30 -0800 Subject: [PATCH 0690/1053] fix remat with nontrivial env (#2136) fixes #2030 --- jax/api.py | 3 ++- jax/interpreters/partial_eval.py | 2 +- tests/api_test.py | 40 ++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/jax/api.py b/jax/api.py index 2f0568dec694..bd193ef9db1b 100644 --- a/jax/api.py +++ b/jax/api.py @@ -2027,7 +2027,8 @@ def checkpoint(fun, concrete=False): def fun_remat(*args, **kwargs): args_flat, in_tree = tree_flatten((args, kwargs)) flat_fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) - out_flat = pe.remat_call(flat_fun, *args_flat, concrete=concrete) + out_flat = pe.remat_call(flat_fun, *args_flat, name=flat_fun.__name__, + concrete=concrete) return tree_unflatten(out_tree(), out_flat) return fun_remat remat = checkpoint diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index d35db6231f31..92edab0d1b65 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -526,7 +526,7 @@ def _remat_partial_eval(trace, f, tracers, params): # Since we traced with everything marked as unknown, but we need to know which # outputs are known/unknown, we use partial_eval_jaxpr to get out_unknowns. jaxpr_converted = convert_freevars_jaxpr(jaxpr) - in_avals = ([raise_to_shaped(t.pval[0]) for t in env] + in_avals = ([raise_to_shaped(partial_val_aval(*t.pval)) for t in env] + [raise_to_shaped(pv) for pv in in_pvs]) out_avals = [raise_to_shaped(pv if pv is not None else abstract_unit if var is unitvar diff --git a/tests/api_test.py b/tests/api_test.py index 6ead964667e9..54b6092299b3 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1600,6 +1600,46 @@ def move(R,i): api.grad(func)(5.0) # doesn't crash + def test_remat_jit2(self): + @api.jit + def f(x): + y = 2 * x + + @api.remat + def g(): + return y + + return g() + + self.assertAllClose(f(3), 6, check_dtypes=False) + + def test_remat_nontrivial_env(self): + # simplified from https://github.com/google/jax/issues/2030 + + @api.remat + def foo(state, dt=0.5, c=1): + u, u_t = state + u_tt = c**2 * u + u_t = u_t + u_tt * dt + return (u, u_t) + + @partial(api.jit, static_argnums=(1,)) + def _multi_step(state, count, dt, c): + f = lambda s, _: (foo(s, dt, c), _) + return lax.scan(f, state, None, count) + + def multi_step(state, count, dt=1/np.sqrt(2), c=1): + return _multi_step(state, count, dt, c) + + def loss(u0, target, steps, dt=1/np.sqrt(2), c=1): + init = (u0, np.zeros_like(u0)) + (uf, _), _ = multi_step(init, steps, dt, c) + return ((uf - target) ** 2).mean() + + target = np.zeros((128, 128)) + u0 = np.ones_like(target) + loss(u0, target, 10) # doesn't crash + def test_trivial_computations(self): x = np.array([1, 2, 3]) y = api.jit(lambda x: x)(x) From 8c7fc3919d3e131da6a2121158084ed480dbec2a Mon Sep 17 00:00:00 2001 From: Ruizhe Zhao Date: Mon, 3 Feb 2020 15:12:40 +0000 Subject: [PATCH 0691/1053] Upgrade bazel from 0.29.1 to 1.2.1 (#2137) --- build/build.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/build.py b/build/build.py index 9eede47b28dd..c06c425fb468 100755 --- a/build/build.py +++ b/build/build.py @@ -57,19 +57,19 @@ def get_python_bin_path(python_bin_path_flag): # Bazel -BAZEL_BASE_URI = "https://github.com/bazelbuild/bazel/releases/download/0.29.1/" +BAZEL_BASE_URI = "https://github.com/bazelbuild/bazel/releases/download/1.2.1/" BazelPackage = collections.namedtuple("BazelPackage", ["file", "sha256"]) bazel_packages = { "Linux": BazelPackage( - file="bazel-0.29.1-linux-x86_64", + file="bazel-1.2.1-linux-x86_64", sha256= - "da3031d811f42f6208d24a87984b5b07e1c75afede184cad86eb02bef6c3b9b0"), + "f5e21d7448419d1596ad0c5bb71fb336a0af08c832587aec394970ea56701d88"), "Darwin": BazelPackage( - file="bazel-0.29.1-darwin-x86_64", + file="bazel-1.2.1-darwin-x86_64", sha256= - "34daae4caafbdb0952415ed6f97f47f03df84df9af146e9eb910ba65c073efdd"), + "6729be5a56e6eadf7a9112afd2d87ce348da8fca22077b882d9bb7a6f5d41d1c"), } From fe041c75900023c1774bc81b59b094f38250f3b8 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 3 Feb 2020 10:13:51 -0500 Subject: [PATCH 0692/1053] Set minimum Bazel version to 1.2.1. --- build/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.py b/build/build.py index c06c425fb468..4d1a4f9309ee 100755 --- a/build/build.py +++ b/build/build.py @@ -304,7 +304,7 @@ def main(): # Find a working Bazel. bazel_path = get_bazel_path(args.bazel_path) - check_bazel_version(bazel_path, min_version="0.26.0", max_version=None) + check_bazel_version(bazel_path, min_version="1.2.1", max_version=None) print("Bazel binary path: {}".format(bazel_path)) python_bin_path = get_python_bin_path(args.python_bin_path) From d6489103f754674eb5f16ded961bbbbc2c5817e5 Mon Sep 17 00:00:00 2001 From: Colin Date: Mon, 3 Feb 2020 10:15:19 -0500 Subject: [PATCH 0693/1053] Bump cell execution timeout (#2147) Looking at the recent [doc failures](https://readthedocs.org/projects/jax/builds/), a few are due to - Cell timeouts (which this tries to fix), - Execution timeout (readthedocs gives 900seconds to build, total -- most of the time for jax is in executing the notebooks), - Other somewhat random/inscrutable errors (and I could imagine a world in which one of the timeouts ends up triggering an inscrutable error in the execution). --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 06268367ea9b..a139d46cadf6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -120,7 +120,7 @@ # Controls when a cell will time out (defaults to 30; use -1 for no timeout): -nbsphinx_timeout = 90 +nbsphinx_timeout = 180 # Default Pygments lexer for syntax highlighting in code cells: #nbsphinx_codecell_lexer = 'ipython3' From 1022573b26a1996db524229de10fb84dbe6e08b3 Mon Sep 17 00:00:00 2001 From: Roman Novak <44512421+romanngg@users.noreply.github.com> Date: Mon, 3 Feb 2020 07:31:12 -0800 Subject: [PATCH 0694/1053] Make stax pooling layers accept `spec=None` (#2145) Currently pooling layers have a default channel-last spec that is explicitly 2D. This change will make this default work for arbitrary input dimensionality. --- jax/experimental/stax.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/jax/experimental/stax.py b/jax/experimental/stax.py index ead852a8ba8a..d2413181c18a 100644 --- a/jax/experimental/stax.py +++ b/jax/experimental/stax.py @@ -163,12 +163,16 @@ def elementwise(fun, **fun_kwargs): def _pooling_layer(reducer, init_val, rescaler=None): - def PoolingLayer(window_shape, strides=None, padding='VALID', spec='NHWC'): + def PoolingLayer(window_shape, strides=None, padding='VALID', spec=None): """Layer construction function for a pooling layer.""" strides = strides or (1,) * len(window_shape) rescale = rescaler(window_shape, strides, padding) if rescaler else None - non_spatial_axes = spec.index('N'), spec.index('C') + if spec is None: + non_spatial_axes = 0, len(window_shape) + 1 + else: + non_spatial_axes = spec.index('N'), spec.index('C') + for i in sorted(non_spatial_axes): window_shape = window_shape[:i] + (1,) + window_shape[i:] strides = strides[:i] + (1,) + strides[i:] @@ -189,7 +193,11 @@ def apply_fun(params, inputs, **kwargs): def _normalize_by_window_size(dims, strides, padding): def rescale(outputs, inputs, spec): - non_spatial_axes = spec.index('N'), spec.index('C') + if spec is None: + non_spatial_axes = 0, inputs.ndim - 1 + else: + non_spatial_axes = spec.index('N'), spec.index('C') + spatial_shape = tuple(inputs.shape[i] for i in range(inputs.ndim) if i not in non_spatial_axes) From 0644f5c56175104d862cf7e03fe6f7cd14cdba88 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 3 Feb 2020 09:27:03 -0800 Subject: [PATCH 0695/1053] Better batching rule for triangular_solve (#2138) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Better batching rule for triangular_solve Now, if only the right hand side argument `b` is batched, we leverage triangular solve's builtin batching for handling multiple right-hand-side vectors. This makes the performance of `vmap` over only the second argument of linear solves equivalent to relying on builtin batching:: rs = onp.random.RandomState(0) a = rs.randn(500, 500) + 0.1 * np.eye(500) b_mat = jax.device_put(rs.randn(500, 10)) solve1 = jax.jit(np.linalg.solve) solve2 = jax.jit(jax.vmap(np.linalg.solve, in_axes=(None, 1), out_axes=1)) Before:: In [6]: %timeit jax.device_get(solve1(a, b_mat)) 3.88 ms ± 293 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) # 8x slower :( In [9]: %timeit jax.device_get(solve2(a, b_mat)) 23.5 ms ± 1.33 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) Now:: In [2]: %timeit jax.device_get(solve1(a, b_mat)) 3.76 ms ± 304 µs per loop (mean ± std. dev. of 7 runs, 1 loop each) # same speed :) In [3]: %timeit jax.device_get(solve2(a, b_mat)) 3.72 ms ± 296 µs per loop (mean ± std. dev. of 7 runs, 1 loop each) * Test failures * Check b.ndim == 2 in triangular solve shape rule --- jax/lax_linalg.py | 32 +++++++++++++++++++++++++------- tests/linalg_test.py | 26 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 61c2c23583f8..ef648f024c49 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -305,6 +305,9 @@ def triangular_solve_shape_rule(a, b, left_side=False, **unused_kwargs): if a.ndim < 2: msg = "triangular_solve requires a.ndim to be at least 2, got {}." raise TypeError(msg.format(a.ndim)) + if b.ndim < 2: + msg = "triangular_solve requires b.ndim to be at least 2, got {}." + raise TypeError(msg.format(b.ndim)) if a.shape[-1] != a.shape[-2]: msg = ("triangular_solve requires the last two dimensions of a to be equal " "in size, got a.shape of {}.") @@ -369,13 +372,28 @@ def triangular_solve_batching_rule(batched_args, batch_dims, left_side, unit_diagonal): x, y = batched_args bx, by = batch_dims - size = next(t.shape[i] for t, i in zip(batched_args, batch_dims) - if i is not None) - x = batching.bdim_at_front(x, bx, size) - y = batching.bdim_at_front(y, by, size) - return triangular_solve(x, y, left_side=left_side, lower=lower, - transpose_a=transpose_a, conjugate_a=conjugate_a, - unit_diagonal=unit_diagonal), 0 + if bx is batching.not_mapped: + if left_side: + y = batching.moveaxis(y, by, -1) + y_flat = y.reshape(y.shape[:-2] + (y.shape[-2] * y.shape[-1],)) + bdim_out = y.ndim - 1 + else: + y = batching.moveaxis(y, by, -2) + y_flat = y.reshape(y.shape[:-3] + (y.shape[-3] * y.shape[-2], y.shape[-1])) + bdim_out = y.ndim - 2 + out_flat = triangular_solve( + x, y_flat, left_side=left_side, lower=lower, + transpose_a=transpose_a, conjugate_a=conjugate_a, + unit_diagonal=unit_diagonal) + return out_flat.reshape(y.shape), bdim_out + else: + size = next(t.shape[i] for t, i in zip(batched_args, batch_dims) + if i is not None) + x = batching.bdim_at_front(x, bx, size) + y = batching.bdim_at_front(y, by, size) + return triangular_solve(x, y, left_side=left_side, lower=lower, + transpose_a=transpose_a, conjugate_a=conjugate_a, + unit_diagonal=unit_diagonal), 0 triangular_solve_p = standard_primitive( triangular_solve_shape_rule, triangular_solve_dtype_rule, diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 0dad7afbee12..0017ef088327 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -938,6 +938,32 @@ def testTriangularSolveGrad( unit_diagonal=unit_diagonal, left_side=left_side) jtu.check_grads(f, (A, B), 2, rtol=4e-2, eps=1e-3) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_A={}_B={}_bdim={}_leftside={}".format( + a_shape, b_shape, bdims, left_side), + "left_side": left_side, "a_shape": a_shape, "b_shape": b_shape, + "bdims": bdims} + for left_side, a_shape, b_shape, bdims in [ + (False, (4, 4), (2, 3, 4,), (None, 0)), + (False, (2, 4, 4), (2, 2, 3, 4,), (None, 0)), + (False, (2, 4, 4), (3, 4,), (0, None)), + (False, (2, 4, 4), (2, 3, 4,), (0, 0)), + (True, (2, 4, 4), (2, 4, 3), (0, 0)), + (True, (2, 4, 4), (2, 2, 4, 3), (None, 0)), + ])) + def testTriangularSolveBatching(self, left_side, a_shape, b_shape, bdims): + rng = jtu.rand_default() + A = np.tril(rng(a_shape, onp.float32) + + 5 * onp.eye(a_shape[-1], dtype=onp.float32)) + B = rng(b_shape, onp.float32) + solve = partial(lax_linalg.triangular_solve, lower=True, + transpose_a=False, conjugate_a=False, + unit_diagonal=False, left_side=left_side) + X = vmap(solve, bdims)(A, B) + Y = A @ X if left_side else X @ A + onp.testing.assert_allclose(Y - B, 0, atol=1e-5) + def testTriangularSolveGradPrecision(self): rng = jtu.rand_default() a = np.tril(rng((3, 3), onp.float32)) From 0b1d2fc3d187f779934cfaeb9188e1fcb208a6fc Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 3 Feb 2020 12:44:46 -0500 Subject: [PATCH 0696/1053] Avoid accidental type promotion in gamma sampler gradient. (#2150) Reformat gamma sampler to use 2 space indent, consistent with the rest of JAX. --- jax/random.py | 186 +++++++++++++++++++++---------------------- tests/random_test.py | 9 +++ 2 files changed, 102 insertions(+), 93 deletions(-) diff --git a/jax/random.py b/jax/random.py index 732392d2ef33..abc9b198416d 100644 --- a/jax/random.py +++ b/jax/random.py @@ -782,99 +782,99 @@ def _next_kxv(kxv): 0.017050642, -0.0021309345, 0.00085092385, -1.5248239e-07]] def _gamma_grad_one(z, alpha): - # Ref 1: Pathwise Derivatives Beyond the Reparameterization Trick, Martin & Fritz - # Ref 2: Case 4 follows https://github.com/fritzo/notebooks/blob/master/gamma-reparameterized.ipynb - - # TODO: use lax.cond instead of lax.while_loop when its batching rule is available - # See https://github.com/google/jax/issues/490 - def _case1(zagf): - z, alpha, _, flag = zagf - - # dz = - dCDF(z; a) / pdf(z; a) - # pdf = z^(a-1) * e^(-z) / Gamma(a) - # CDF(z; a) = IncompleteGamma(a, z) / Gamma(a) - # dCDF(z; a) = (dIncompleteGamma - IncompleteGamma * Digamma(a)) / Gamma(a) - # =: unnormalized_dCDF / Gamma(a) - # IncompleteGamma ~ z^a [ 1/a - z/(a+1) + z^2/2!(a+2) - z^3/3!(a+3) + z^4/4!(a+4) - z^5/5!(a+5) ] - # =: z^a * term1 - # dIncompleteGamma ~ z^a * log(z) * term1 - z^a [1/a^2 - z/(a+1)^2 + z^2/2!(a+2)^2 - # - z^3/3!(a+3)^2 + z^4/4!(a+4)^2 - z^5/5!(a+5)^2 ] - # =: z^a * log(z) * term1 - z^a * term2 - # unnormalized_dCDF = z^a { [log(z) - Digamma(a)] * term1 - term2 } - zi = 1.0 - update = zi / alpha - term1 = update - term2 = update / alpha - for i in range(1, 6): - zi = -zi * z / i - update = zi / (alpha + i) - term1 = term1 + update - term2 = term2 + update / (alpha + i) - - unnormalized_cdf_dot = np.power(z, alpha) * ((np.log(z) - lax.digamma(alpha)) * term1 - term2) - unnormalized_pdf = np.power(z, alpha - 1) * np.exp(-z) - grad = -unnormalized_cdf_dot / unnormalized_pdf - - return z, alpha, grad, ~flag - - def _cond2(zagf): - z, alpha, _, flag = zagf - return (~flag) & (alpha > 8.0) & ((z < 0.9 * alpha) | (z > 1.1 * alpha)) - - def _case2(zagf): - z, alpha, _, flag = zagf - - # Formula 58 of [1] - sqrt_8a = np.sqrt(8 * alpha) - z_minus_a = z - alpha - log_z_div_a = np.log(z / alpha) - sign = np.where(z < alpha, 1.0, -1.0) - term1 = 4 * (z + alpha) / (sqrt_8a * z_minus_a * z_minus_a) - term2 = log_z_div_a * (sqrt_8a / z_minus_a + sign * np.power(z_minus_a - alpha * log_z_div_a, -1.5)) - term3 = z * (1.0 + 1.0 / (12 * alpha) + 1.0 / (288 * alpha * alpha)) / sqrt_8a - grad = (term1 + term2) * term3 - - return z, alpha, grad, ~flag - - def _cond3(zagf): - z, alpha, _, flag = zagf - return (~flag) & (alpha > 8.0) & (z >= 0.9 * alpha) & (z <= 1.1 * alpha) - - def _case3(zagf): - z, alpha, _, flag = zagf - - # Formula 59 of [1] - z_div_a = np.divide(z, alpha) - aa = alpha * alpha - term1 = 1440 * alpha + 6 * z_div_a * (53 - 120 * z) - 65 * z_div_a * z_div_a + 3600 * z + 107 - term2 = 1244160 * alpha * aa - term3 = 1 + 24 * alpha + 288 * aa - grad = term1 * term3 / term2 - - return z, alpha, grad, ~flag - - def _case4(zagf): - z, alpha, _, flag = zagf - - # Ref [2] - u = np.log(z / alpha) - v = np.log(alpha) - c = [] - for i in range(8): - c.append(_bivariate_coef[0][i] + u * (_bivariate_coef[1][i] + u * _bivariate_coef[2][i])) - p = c[0] + v * (c[1] + v * (c[2] + v * c[3])) - q = c[4] + v * (c[5] + v * (c[6] + v * c[7])) - grad = np.exp(p / np.maximum(q, 0.01)) - - return z, alpha, grad, ~flag - - _, _, grad, flag = lax.while_loop(lambda zagf: (~zagf[3]) & (zagf[0] < 0.8), - _case1, - (z, alpha, lax._const(alpha, 0.0), False)) - _, _, grad, flag = lax.while_loop(_cond2, _case2, (z, alpha, grad, flag)) - _, _, grad, flag = lax.while_loop(_cond3, _case3, (z, alpha, grad, flag)) - _, _, grad, flag = lax.while_loop(lambda zagf: ~zagf[3], _case4, (z, alpha, grad, flag)) - return grad + # Ref 1: Pathwise Derivatives Beyond the Reparameterization Trick, Martin & Fritz + # Ref 2: Case 4 follows https://github.com/fritzo/notebooks/blob/master/gamma-reparameterized.ipynb + + # TODO: use lax.cond instead of lax.while_loop when its batching rule is available + # See https://github.com/google/jax/issues/490 + def _case1(zagf): + z, alpha, _, flag = zagf + + # dz = - dCDF(z; a) / pdf(z; a) + # pdf = z^(a-1) * e^(-z) / Gamma(a) + # CDF(z; a) = IncompleteGamma(a, z) / Gamma(a) + # dCDF(z; a) = (dIncompleteGamma - IncompleteGamma * Digamma(a)) / Gamma(a) + # =: unnormalized_dCDF / Gamma(a) + # IncompleteGamma ~ z^a [ 1/a - z/(a+1) + z^2/2!(a+2) - z^3/3!(a+3) + z^4/4!(a+4) - z^5/5!(a+5) ] + # =: z^a * term1 + # dIncompleteGamma ~ z^a * log(z) * term1 - z^a [1/a^2 - z/(a+1)^2 + z^2/2!(a+2)^2 + # - z^3/3!(a+3)^2 + z^4/4!(a+4)^2 - z^5/5!(a+5)^2 ] + # =: z^a * log(z) * term1 - z^a * term2 + # unnormalized_dCDF = z^a { [log(z) - Digamma(a)] * term1 - term2 } + zi = 1.0 + update = zi / alpha + term1 = update + term2 = update / alpha + for i in range(1, 6): + zi = -zi * z / i + update = zi / (alpha + i) + term1 = term1 + update + term2 = term2 + update / (alpha + i) + + unnormalized_cdf_dot = np.power(z, alpha) * ((np.log(z) - lax.digamma(alpha)) * term1 - term2) + unnormalized_pdf = np.power(z, alpha - 1) * np.exp(-z) + grad = -unnormalized_cdf_dot / unnormalized_pdf + + return z, alpha, grad, ~flag + + def _cond2(zagf): + z, alpha, _, flag = zagf + return (~flag) & (alpha > 8.0) & ((z < 0.9 * alpha) | (z > 1.1 * alpha)) + + def _case2(zagf): + z, alpha, _, flag = zagf + + # Formula 58 of [1] + sqrt_8a = np.sqrt(8 * alpha) + z_minus_a = z - alpha + log_z_div_a = np.log(z / alpha) + sign = np.where(z < alpha, lax._const(z, 1.0), lax._const(z, -1.0)) + term1 = 4 * (z + alpha) / (sqrt_8a * z_minus_a * z_minus_a) + term2 = log_z_div_a * (sqrt_8a / z_minus_a + sign * np.power(z_minus_a - alpha * log_z_div_a, -1.5)) + term3 = z * (1.0 + 1.0 / (12 * alpha) + 1.0 / (288 * alpha * alpha)) / sqrt_8a + grad = (term1 + term2) * term3 + + return z, alpha, grad, ~flag + + def _cond3(zagf): + z, alpha, _, flag = zagf + return (~flag) & (alpha > 8.0) & (z >= 0.9 * alpha) & (z <= 1.1 * alpha) + + def _case3(zagf): + z, alpha, _, flag = zagf + + # Formula 59 of [1] + z_div_a = np.divide(z, alpha) + aa = alpha * alpha + term1 = 1440 * alpha + 6 * z_div_a * (53 - 120 * z) - 65 * z_div_a * z_div_a + 3600 * z + 107 + term2 = 1244160 * alpha * aa + term3 = 1 + 24 * alpha + 288 * aa + grad = term1 * term3 / term2 + + return z, alpha, grad, ~flag + + def _case4(zagf): + z, alpha, _, flag = zagf + + # Ref [2] + u = np.log(z / alpha) + v = np.log(alpha) + c = [] + for i in range(8): + c.append(_bivariate_coef[0][i] + u * (_bivariate_coef[1][i] + u * _bivariate_coef[2][i])) + p = c[0] + v * (c[1] + v * (c[2] + v * c[3])) + q = c[4] + v * (c[5] + v * (c[6] + v * c[7])) + grad = np.exp(p / np.maximum(q, 0.01)) + + return z, alpha, grad, ~flag + + _, _, grad, flag = lax.while_loop(lambda zagf: (~zagf[3]) & (zagf[0] < 0.8), + _case1, + (z, alpha, lax._const(alpha, 0.0), False)) + _, _, grad, flag = lax.while_loop(_cond2, _case2, (z, alpha, grad, flag)) + _, _, grad, flag = lax.while_loop(_cond3, _case3, (z, alpha, grad, flag)) + _, _, grad, flag = lax.while_loop(lambda zagf: ~zagf[3], _case4, (z, alpha, grad, flag)) + return grad def _gamma_grad(sample, a): samples = np.reshape(sample, -1) diff --git a/tests/random_test.py b/tests/random_test.py index 69d661d302cf..090d8d247345 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -329,6 +329,15 @@ def testGammaGrad(self, alpha): self.assertAllClose(actual_grad, expected_grad, check_dtypes=True, rtol=2e-2 if jtu.device_under_test() == "tpu" else 5e-4) + def testGammaGradType(self): + # Regression test for https://github.com/google/jax/issues/2130 + key = random.PRNGKey(0) + a = np.array(1., dtype=np.float32) + b = np.array(3., dtype=np.float32) + f = lambda x, y: random.gamma(key=key, a=x, dtype=np.float32) / y + # Should not crash with a type error. + api.vjp(f, a, b) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format(dtype), "dtype": onp.dtype(dtype).name} for dtype in [onp.float32, onp.float64])) From 3c9ae5e221316c82f1dda34aa7f12173b12e3a21 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 3 Feb 2020 12:44:57 -0500 Subject: [PATCH 0697/1053] Add jax.scipy.stats.logistic to documentation. (#2149) --- docs/jax.scipy.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index 6b1b1743861c..e38d68cff77b 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -108,6 +108,19 @@ jax.scipy.stats.laplace logpdf pdf +jax.scipy.stats.logistic +~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: jax.scipy.stats.logistic +.. autosummary:: + :toctree: _autosummary + + cdf + isf + logpdf + pdf + ppf + sf + jax.scipy.stats.norm ~~~~~~~~~~~~~~~~~~~~ .. automodule:: jax.scipy.stats.norm @@ -118,6 +131,7 @@ jax.scipy.stats.norm logcdf logpdf pdf + ppf jax.scipy.stats.uniform ~~~~~~~~~~~~~~~~~~~~~~~ From 4f5987ccd9c4447955d8dc3463613ac3bc44b6a3 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 7 Jan 2020 13:11:32 -0800 Subject: [PATCH 0698/1053] Simplify Jaxpr: remove freevars. Freevars played a very small role, and they can be folded with the invars. This simplifies the Jaxpr data structure.We remove the `freevars` field from Jaxpr and from the bound_subjaxprs. The only non-trivial change is for xla_pmap, where we need to carry one extra parameter `mapped_invars` with a bitmap to encode which invars are mapped and which are broadcast. Previously, the freevars were broadcast. --- jax/api.py | 7 +- jax/core.py | 38 ++++----- jax/interpreters/ad.py | 66 ++++++++-------- jax/interpreters/partial_eval.py | 131 ++++++++++++++++++++++--------- jax/interpreters/pxla.py | 22 ++++-- jax/interpreters/xla.py | 34 ++++---- jax/lax/lax.py | 2 +- jax/lax/lax_control_flow.py | 19 +++-- jax/test_util.py | 2 +- tests/api_test.py | 10 +-- 10 files changed, 195 insertions(+), 136 deletions(-) diff --git a/jax/api.py b/jax/api.py index bd193ef9db1b..96693eeb7e97 100644 --- a/jax/api.py +++ b/jax/api.py @@ -305,7 +305,7 @@ def computation_maker(*args, **kwargs): xla_consts = map(c.Constant, consts) xla_args = xla._xla_callable_args(c, avals, tuple_args) outs = xla.jaxpr_subcomp( - c, jaxpr, backend, axis_env_, xla_consts, (), + c, jaxpr, backend, axis_env_, xla_consts, extend_name_stack(wrap_name(fun_name, 'xla_computation')), *xla_args) return c.Build(c.Tuple(*outs)) return computation_maker @@ -1211,7 +1211,7 @@ def fun(*tangents): "the original primal values.") raise ValueError(msg) dummy = (core.unit,) * len(tangents) - out = eval_jaxpr(jaxpr, consts, (), *(dummy + tangents)) + out = eval_jaxpr(jaxpr, consts, *(dummy + tangents)) tangents_out = out[len(out)//2:] return tuple(map(pe.merge_pvals, tangents_out, out_pvals)) @@ -1491,7 +1491,7 @@ def custom_transforms(fun): def fun_impl(*args, **params): consts, args = split_list(args, [params['num_consts']]) - return core.eval_jaxpr(params['jaxpr'], consts, (), *args) + return core.eval_jaxpr(params['jaxpr'], consts, *args) fun_p.def_impl(fun_impl) def fun_jvp(primals, tangents, **params): @@ -1918,7 +1918,6 @@ def jaxpr_to_graphviz(jaxpr, consts): fragment = [] fragment.extend(map(invar_node, jaxpr.invars, jaxpr.invars)) - fragment.extend(map(freevar_node, jaxpr.freevars, jaxpr.freevars)) fragment.extend(map(constant_node, jaxpr.constvars, consts)) for eqn in jaxpr.eqns: diff --git a/jax/core.py b/jax/core.py index 050e83a6a23f..20b1f8e3e63f 100644 --- a/jax/core.py +++ b/jax/core.py @@ -38,9 +38,18 @@ # -------------------- jaxprs -------------------- class Jaxpr(object): - def __init__(self, constvars, freevars, invars, outvars, eqns): + def __init__(self, constvars, invars, outvars, eqns): + """ + Params: + constvars: list of variables introduced for constants (either literals + in the Python program, or the result of constant folding during the + generation of the Jaxpr). Array constants are replaced with such variables + while scalar constants are kept inline. + invars: list of input variables. Together, `constvars` and `invars` are + the inputs to the Jaxpr. + outvars: list of output variables. + eqns: list of equations.""" self.constvars = list(constvars) - self.freevars = list(freevars) self.invars = list(invars) self.outvars = list(outvars) self.eqns = list(eqns) @@ -56,7 +65,6 @@ def __init__(self, jaxpr, literals, in_avals, out_avals): assert len(in_avals) == len(jaxpr.invars) assert all(isinstance(aval, AbstractValue) for aval in in_avals) assert all(isinstance(aval, AbstractValue) for aval in out_avals) - assert not jaxpr.freevars self.jaxpr = jaxpr self.literals = list(literals) @@ -73,7 +81,7 @@ def __str__(self): @curry def jaxpr_as_fun(typed_jaxpr, *args): - return eval_jaxpr(typed_jaxpr.jaxpr, typed_jaxpr.literals, (), *args) + return eval_jaxpr(typed_jaxpr.jaxpr, typed_jaxpr.literals, *args) JaxprEqn = namedtuple('JaxprEqn', ['invars', 'outvars', 'primitive', @@ -186,7 +194,7 @@ def abstract_eval(self, *args, **kwargs): # -------------------- lifting -------------------- -def eval_jaxpr(jaxpr, consts, freevar_vals, *args): +def eval_jaxpr(jaxpr, consts, *args): def read(v): if type(v) is Literal: return v.val @@ -200,12 +208,10 @@ def write(v, val): write(unitvar, unit) map(write, jaxpr.constvars, consts) map(write, jaxpr.invars, args) - map(write, jaxpr.freevars, freevar_vals) for eqn in jaxpr.eqns: in_vals = map(read, eqn.invars) - subfuns = [partial(eval_jaxpr, subjaxpr, map(read, const_bindings), - map(read, freevar_bindings)) - for subjaxpr, const_bindings, freevar_bindings + subfuns = [partial(eval_jaxpr, subjaxpr, map(read, const_bindings)) + for subjaxpr, const_bindings in eqn.bound_subjaxprs] subfuns = map(lu.wrap_init, subfuns) ans = eqn.primitive.bind(*(subfuns + in_vals), **eqn.params) @@ -638,12 +644,10 @@ def write_env(env, v): write(unitvar) map(write, jaxpr.constvars) - map(write, jaxpr.freevars) map(write, jaxpr.invars) for eqn in jaxpr.eqns: map(read, eqn.invars) - for subjaxpr, constvars, freevars in eqn.bound_subjaxprs: - map(read, freevars) + for subjaxpr, constvars in eqn.bound_subjaxprs: map(read, constvars) check_jaxpr(subjaxpr) map(write, eqn.outvars) @@ -662,19 +666,17 @@ def pp_eqn(eqn): lhs = pp_vars(eqn.outvars) pp_subexpr = pp('') if eqn.bound_subjaxprs: - for subjaxpr, const_vars, bound_vars in eqn.bound_subjaxprs: + for subjaxpr, const_vars in eqn.bound_subjaxprs: pp_subexpr = pp_subexpr + ( pp_jaxpr(subjaxpr).indent(2) - >> pp(' [ {} ; {} ]'.format(pp_vars(const_vars), - pp_vars(bound_vars)))) + >> pp(' [ {} ]'.format(pp_vars(const_vars)))) return (pp('{} = '.format(lhs)) >> pp(eqn.primitive.name) >> pp_kv_pairs(sorted(eqn.params.items())) >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr def pp_jaxpr(jaxpr): - return (pp('{{ lambda {} ; {} ; {}.'.format(pp_vars(jaxpr.constvars), - pp_vars(jaxpr.freevars), - pp_vars(jaxpr.invars))) + + return (pp('{{ lambda {} ; {}.'.format(pp_vars(jaxpr.constvars), + pp_vars(jaxpr.invars))) + ((pp('let ') >> vcat(map(pp_eqn, jaxpr.eqns))) + pp('in {} }}'.format(jaxpr.outvars))).indent(2)) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 07217ae8e6ca..6acec22acd17 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -110,7 +110,7 @@ def vjp_(*cts): cts = tuple(map(ignore_consts, cts, pvals)) dummy_primals_and_cts = (core.unit,) * len(cts) + cts dummy_args = (undefined_primal,) * len(jaxpr.invars) - _, arg_cts = backward_pass(jaxpr, consts, (), dummy_args, dummy_primals_and_cts) + arg_cts = backward_pass(jaxpr, consts, dummy_args, dummy_primals_and_cts) arg_cts = arg_cts[len(primals):] return map(instantiate_zeros, primals, arg_cts) @@ -137,9 +137,9 @@ def unpair_pval(pval): aval_1, aval_2 = aval return (aval_1, const_1), (aval_2, const_2) -def backward_pass(jaxpr, consts, freevar_vals, args, cotangents_in): +def backward_pass(jaxpr: core.Jaxpr, consts, args, cotangents_in): if all(ct is zero for ct in cotangents_in): - return [zero] * len(jaxpr.freevars), [zero] * len(jaxpr.invars) + return [zero] * len(jaxpr.invars) def write_cotangent(v, ct): # assert v not in primal_env @@ -162,7 +162,6 @@ def write_primal(v, val): primal_env = {} write_primal(core.unitvar, core.unit) map(write_primal, jaxpr.constvars, consts) - map(write_primal, jaxpr.freevars, freevar_vals) map(write_primal, jaxpr.invars, args) def is_linear(var): @@ -184,14 +183,14 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs + (subjaxpr, const_vars), = eqn.bound_subjaxprs assert not any(is_linear(v) for v in const_vars) - if any(is_linear(v) for v in it.chain(eqn.invars, bound_vars)): + if any(is_linear(v) for v in eqn.invars): linear_eqns.append(eqn) elif eqn.primitive is not pe.remat_call_p: ans = _eval_subjaxpr_primals( eqn.primitive, subjaxpr, map(read_primal, const_vars), - map(read_primal, bound_vars), map(read_primal, eqn.invars), eqn.params) + map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) # we special-case remat_call here because it can be mixed linear / @@ -199,7 +198,7 @@ def is_linear(var): if eqn.primitive is pe.remat_call_p: ans = _eval_subjaxpr_primals( eqn.primitive, subjaxpr, map(read_primal, const_vars), - map(read_primal, bound_vars), map(read_primal, eqn.invars), eqn.params) + map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) ct_env = {} @@ -211,29 +210,26 @@ def is_linear(var): else: cts_in, = map(read_cotangent, eqn.outvars) if eqn.bound_subjaxprs: - (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs + (subjaxpr, const_vars), = eqn.bound_subjaxprs sub_consts = map(read_primal, const_vars) - sub_freevar_vals = map(read_primal, bound_vars) - ct_free_vars_out, cts_out = get_primitive_transpose(eqn.primitive)( - eqn.params, subjaxpr, sub_consts, sub_freevar_vals, invals, cts_in) - map(write_cotangent, bound_vars, ct_free_vars_out) + cts_out = get_primitive_transpose(eqn.primitive)( + eqn.params, subjaxpr, sub_consts, invals, cts_in) else: cts_out = get_primitive_transpose(eqn.primitive)(cts_in, *invals, **eqn.params) cts_out = [zero] * len(eqn.invars) if cts_out is zero else cts_out map(write_cotangent, eqn.invars, cts_out) - freevar_cts = map(read_cotangent, jaxpr.freevars) cotangents_out = map(read_cotangent, jaxpr.invars) - return freevar_cts, cotangents_out + return cotangents_out -def _eval_subjaxpr_primals(prim, jaxpr, consts, freevar_vals, in_vals, params): - all_args, in_tree_def = tree_flatten((consts, freevar_vals, in_vals)) +def _eval_subjaxpr_primals(prim, jaxpr, consts, in_vals, params): + all_args, in_tree_def = tree_flatten((consts, in_vals)) fun = lu.hashable_partial(lu.wrap_init(_eval_primals), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) out_flat = prim.bind(fun, *all_args, **params) return tree_unflatten(out_tree(), out_flat) -def _eval_primals(jaxpr, consts, freevar_vals, args): +def _eval_primals(jaxpr, consts, args): primal_env = {} def read_primal(v): @@ -254,7 +250,6 @@ def is_linear(var): write_primal(core.unitvar, core.unit) map(write_primal, jaxpr.constvars, consts) - map(write_primal, jaxpr.freevars, freevar_vals) map(write_primal, jaxpr.invars, args) for eqn in jaxpr.eqns: if not eqn.bound_subjaxprs: @@ -266,13 +261,13 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - (subjaxpr, const_vars, bound_vars), = eqn.bound_subjaxprs + (subjaxpr, const_vars), = eqn.bound_subjaxprs assert not any(is_linear(v) for v in const_vars) if (eqn.primitive is pe.remat_call_p or - not any(is_linear(v) for v in it.chain(eqn.invars, bound_vars))): + not any(is_linear(v) for v in eqn.invars)): ans = _eval_subjaxpr_primals( eqn.primitive, subjaxpr, map(read_primal, const_vars), - map(read_primal, bound_vars), map(read_primal, eqn.invars), eqn.params) + map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) return map(read_primal, jaxpr.outvars) @@ -471,7 +466,7 @@ def fun_lin_transpose(cts, *args, **kwargs): num_res, trans_jaxpr = kwargs['num_res'], kwargs['trans_jaxpr'] res, _ = split_list(args, [num_res]) cts = map(instantiate_zeros_aval, kwargs['out_avals'], cts) - outs = core.eval_jaxpr(trans_jaxpr, res, (), *cts) + outs = core.eval_jaxpr(trans_jaxpr, res, *cts) return [None] * num_res + outs primitive_transposes[fun_lin_p] = fun_lin_transpose @@ -544,8 +539,8 @@ def traceable(num_primals, in_tree_def, *primals_and_tangents): yield out_flat, tree_def -def call_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): - all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) +def call_transpose(primitive, params, jaxpr, consts, args, ct): + all_args, in_tree_def = tree_flatten((consts, args, ct)) fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) params = dict(params, name=wrap_name(params['name'], 'transpose')) @@ -554,15 +549,22 @@ def call_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): primitive_transposes[core.call_p] = partial(call_transpose, call_p) primitive_transposes[pe.remat_call_p] = partial(call_transpose, pe.remat_call_p) -def map_transpose(primitive, params, jaxpr, consts, freevar_vals, args, ct): - all_args, in_tree_def = tree_flatten((consts, freevar_vals, args, ct)) +def map_transpose(primitive, params, jaxpr, consts, args, ct): + all_args, in_tree_def = tree_flatten((consts, args, ct)) fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) params = dict(params, name=wrap_name(params['name'], 'transpose')) out_flat = primitive.bind(fun, *all_args, **params) - freevar_cts, arg_cts = tree_unflatten(out_tree(), out_flat) - freevar_cts = [x.sum(0) if x is not zero else x for x in freevar_cts] - return freevar_cts, arg_cts + arg_cts = tree_unflatten(out_tree(), out_flat) + + mapped_invars = params['mapped_invars'] # True for each mapped invar + # The freevars are being fanned out (not mapped). During transpose the + # dual of fan-out is fan-in-sum. We apply it to the unmapped invars. + assert len(mapped_invars) == len(arg_cts) + arg_cts = (arg_ct if arg_mapped or arg_ct is zero else arg_ct.sum(0) + for arg_ct, arg_mapped in zip(arg_cts, mapped_invars)) + + return arg_cts def jvp_jaxpr(jaxpr, nonzeros, instantiate): @@ -588,10 +590,10 @@ def f_jvp_traceable(nonzeros, *primals_and_nztangents): nonzero_tangents_out = [t for t in tangents_out if t is not zero] yield list(primals_out) + nonzero_tangents_out, out_nonzeros -def rearrange_binders(jaxpr, primals_in, tangents_in, primals_out, tangents_out): +def rearrange_binders(jaxpr: core.TypedJaxpr, primals_in, tangents_in, primals_out, tangents_out): new_invars = _perm(primals_in, tangents_in, jaxpr.jaxpr.invars) new_outvars = _perm(primals_out, tangents_out, jaxpr.jaxpr.outvars) - new_jaxpr = core.Jaxpr(jaxpr.jaxpr.constvars, jaxpr.jaxpr.freevars, + new_jaxpr = core.Jaxpr(jaxpr.jaxpr.constvars, new_invars, new_outvars, jaxpr.jaxpr.eqns) new_in_avals = _perm(primals_in, tangents_in, jaxpr.in_avals) new_out_avals = _perm(primals_out, tangents_out, jaxpr.out_avals) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 92edab0d1b65..92448e36bb80 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -107,12 +107,12 @@ def default_process_primitive(self, primitive, tracers, params): if primitive.multiple_results: out_tracers = [JaxprTracer(self, PartialVal((aval, unit)), None) for aval in out_aval] - eqn = new_eqn_recipe(tracers, out_tracers, primitive, (), params) + eqn = new_eqn_recipe(tracers, out_tracers, primitive, params) for t in out_tracers: t.recipe = eqn return out_tracers else: out_tracer = JaxprTracer(self, PartialVal((out_aval, unit)), None) - out_tracer.recipe = new_eqn_recipe(tracers, [out_tracer], primitive, (), params) + out_tracer.recipe = new_eqn_recipe(tracers, [out_tracer], primitive, params) return out_tracer def process_call(self, call_primitive, f, tracers, params): @@ -130,12 +130,16 @@ def process_call(self, call_primitive, f, tracers, params): fun, aux = partial_eval(f, self, in_pvs) out_flat = call_primitive.bind(fun, *in_consts, **params) out_pvs, jaxpr, env = aux() + env_tracers = map(self.full_raise, env) out_pv_consts, consts = split_list(out_flat, [len(out_flat)-len(jaxpr.constvars)]) const_tracers = map(self.new_instantiated_const, consts) - bound_subjaxpr = (jaxpr, const_tracers, map(self.full_raise, env)) out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_eqn_recipe(tracers, out_tracers, call_primitive, (bound_subjaxpr,), params) + # The `jaxpr` already contains the env_vars at start of invars + eqn = new_eqn_recipe(tuple(it.chain(env_tracers, tracers)), + out_tracers, call_primitive, params, + subjaxpr=jaxpr, + subjaxpr_const_tracers=const_tracers) for t in out_tracers: t.recipe = eqn return out_tracers @@ -150,12 +154,19 @@ def process_map(self, map_primitive, f, tracers, params): out_pvs = [None if pv is None else _unmapped_aval(params['axis_size'], pv) for pv in out_pvs_reduced] const_tracers = map(self.new_instantiated_const, consts) + env_tracers = map(self.full_raise, env) lifted_jaxpr = closure_convert_jaxpr(jaxpr) - bound_subjaxpr = (lifted_jaxpr, (), map(self.full_raise, env)) out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_eqn_recipe(tuple(it.chain(const_tracers, tracers)), - out_tracers, map_primitive, (bound_subjaxpr,), params) + # The `jaxpr` already contains the env_vars at start of invars + mapped_invars = tuple([True] * len(const_tracers) + + [False] * len(env_tracers) + + [True] * len(tracers)) + eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers, tracers)), + out_tracers, map_primitive, params, + subjaxpr=lifted_jaxpr, + subjaxpr_const_tracers=(), + mapped_invars=mapped_invars) for t in out_tracers: t.recipe = eqn return out_tracers @@ -174,10 +185,12 @@ def todo(x): trace = JaxprTrace(master, core.cur_sublevel()) const_tracers = map(trace.new_instantiated_const, consts) env_tracers = map(trace.full_raise, env) - bound_subjaxpr = (jaxpr, const_tracers, env_tracers) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_eqn_recipe([], out_tracers, call_primitive, (bound_subjaxpr,), params) + # The `jaxpr` already contains the env_vars at start of invars + eqn = new_eqn_recipe(env_tracers, out_tracers, call_primitive, params, + subjaxpr=jaxpr, + subjaxpr_const_tracers=const_tracers) for t in out_tracers: t.recipe = eqn return out_tracers @@ -196,13 +209,18 @@ def todo(x): out_pv_consts, consts = x[:n], x[n:] trace = JaxprTrace(master, core.cur_sublevel()) const_tracers = map(trace.new_instantiated_const, consts) - env_tracers = map(trace.full_raise, env) + # The `jaxpr` already contains the env_vars at start of invars lifted_jaxpr = closure_convert_jaxpr(jaxpr) - bound_subjaxpr = (lifted_jaxpr, (), env_tracers) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - eqn = new_eqn_recipe(const_tracers, out_tracers, map_primitive, - (bound_subjaxpr,), params) + mapped_invars = tuple([True] * len(const_tracers), + [False] * len(env)) + env_tracers = map(trace.full_raise, env) + eqn = new_eqn_recipe(it.chain(const_tracers, env_tracers), + out_tracers, map_primitive, params, + subjaxpr=lifted_jaxpr, + subjaxpr_const_tracers=(), + mapped_invars=mapped_invars) for t in out_tracers: t.recipe = eqn return out_tracers @@ -369,8 +387,42 @@ def instantiate_const_at(trace, instantiate, tracer): ['eqn_id', 'invars', 'outvars', 'primitive', 'bound_subjaxprs', 'params']) -def new_eqn_recipe(invars, outvars, primitive, bound_subjaxprs, params): - return JaxprEqnRecipe(object(), invars, map(ref, outvars), primitive, + +def new_eqn_recipe(invars, outvars, primitive, params, + subjaxpr=None, + subjaxpr_const_tracers=(), + mapped_invars=()): + """Constructs a new JaxEqnRecipe. + + Params: + invars: the tracers for the primitive inputs. + outvars: the tracers for the primitive outputs. + primitive: the primitive. + params: the primitive params + subjaxpr: (optional) a sub-Jaxpr, used only for `xla_call` or `xla_pmap`. + If present, then `subjaxpr.invars` correspond to `invars. + Also, `subjaxpr.constvars` correspond to `subjaxpr_const_tracers`. + subjaxpr_const_tracers: The constant tracers for `subjaxpr`. Must be () + if not `subjaxpr`. + mapped_invars: for `xla_pmap` only, a list of booleans of length + `len(subjaxpr.invars)`, with the value True when the corresponding invar + is mapped over devices. If present, then `subjaxpr_const_tracers` is + empty (`subjaxpr` is closed). + """ + if subjaxpr is not None: + assert len(subjaxpr.constvars) == len(subjaxpr_const_tracers) + assert len(subjaxpr.invars) == len(tuple(invars)) + bound_subjaxprs = ((subjaxpr, subjaxpr_const_tracers),) + + if mapped_invars: + # Put this in mapped_invars parameter, for xla_pmap + assert not subjaxpr.constvars + params = params.copy() + params['mapped_invars'] = mapped_invars + else: + bound_subjaxprs = () + + return JaxprEqnRecipe(object(), tuple(invars), map(ref, outvars), primitive, bound_subjaxprs, params) def recipe_to_eqn(unused_var, getvar, recipe): @@ -378,11 +430,22 @@ def recipe_to_eqn(unused_var, getvar, recipe): out_tracers = [t_ref() for t_ref in out_tracer_refs] invars = [getvar(t) for t in in_tracers] outvars = [unused_var() if t is None else getvar(t) for t in out_tracers] - new_bound_subjaxprs = [(j, map(getvar, c), map(getvar, f)) - for j, c, f in bound_subjaxprs] + new_bound_subjaxprs = [(j, map(getvar, c)) + for j, c in bound_subjaxprs] return new_jaxpr_eqn(invars, outvars, primitive, new_bound_subjaxprs, params) def tracers_to_jaxpr(in_tracers, out_tracers): + """Constructs Jaxpr given tracers for inputs and outputs. + + Params: + in_tracers: the tracers that were created for the function inputs + out_tracers: the tracers that were output by the function. + + Returns: a triple of a `Jaxpr`, a list of constant values corresponding to + the `constvars` in the returned Jaxps, and a list of environment values. + The vars for the environment values have been pre-pended to the Jaxpr's + `invars`. + """ newvar = core.gensym('') t_to_var = defaultdict(newvar) getvar = lambda t: t_to_var[id(t)] @@ -392,7 +455,6 @@ def tracers_to_jaxpr(in_tracers, out_tracers): env = {} consts = {} const_to_var = defaultdict(newvar) - destructuring_vars = {} processed_eqn_ids = set() for t in sorted_tracers: recipe = t.recipe @@ -417,32 +479,25 @@ def tracers_to_jaxpr(in_tracers, out_tracers): env_vars, env_vals = unzip2(env.items()) const_vars, const_vals = unzip2(consts.items()) - jaxpr = Jaxpr(const_vars, env_vars, invars, list(map(getvar, out_tracers)), eqns) + # The env_vars are pre-pended to the invars + jaxpr = Jaxpr(const_vars, list(it.chain(env_vars, invars)), list(map(getvar, out_tracers)), eqns) core.skip_checks or core.check_jaxpr(jaxpr) return jaxpr, const_vals, env_vals - def eqn_parents(eqn): - subjaxpr_tracers = [it.chain(c, f) for _, c, f in eqn.bound_subjaxprs] + subjaxpr_tracers = [c for _, c in eqn.bound_subjaxprs] return list(it.chain(eqn.invars, *subjaxpr_tracers)) def closure_convert_jaxpr(jaxpr): + """Moves the constvars to the start of invars.""" core.skip_checks or core.check_jaxpr(jaxpr) - lifted_jaxpr = Jaxpr(constvars=(), freevars=jaxpr.freevars, + lifted_jaxpr = Jaxpr(constvars=(), invars=jaxpr.constvars + jaxpr.invars, outvars=jaxpr.outvars, eqns=jaxpr.eqns) core.skip_checks or core.check_jaxpr(lifted_jaxpr) return lifted_jaxpr -def convert_freevars_jaxpr(jaxpr): - core.skip_checks or core.check_jaxpr(jaxpr) - lifted_jaxpr = Jaxpr(constvars=jaxpr.constvars, freevars=(), - invars=jaxpr.freevars + jaxpr.invars, - outvars=jaxpr.outvars, eqns=jaxpr.eqns) - core.skip_checks or core.check_jaxpr(lifted_jaxpr) - return lifted_jaxpr - def partial_eval_jaxpr(jaxpr, unknowns, instantiate): f = lu.wrap_init(core.jaxpr_as_fun(jaxpr)) @@ -525,7 +580,7 @@ def _remat_partial_eval(trace, f, tracers, params): # Since we traced with everything marked as unknown, but we need to know which # outputs are known/unknown, we use partial_eval_jaxpr to get out_unknowns. - jaxpr_converted = convert_freevars_jaxpr(jaxpr) + in_avals = ([raise_to_shaped(partial_val_aval(*t.pval)) for t in env] + [raise_to_shaped(pv) for pv in in_pvs]) out_avals = [raise_to_shaped(pv if pv is not None @@ -533,7 +588,7 @@ def _remat_partial_eval(trace, f, tracers, params): else get_aval(var.val) if type(var) is Literal else get_aval(const)) for var, pv, const in zip(jaxpr.outvars, out_pvs, out_pval_consts1)] - typed_jaxpr = core.TypedJaxpr(jaxpr_converted, consts, in_avals, out_avals) + typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) in_unknowns = [t.pval[0] is not None for t in it.chain(env, tracers)] jaxpr_1, jaxpr_2, out_unknowns = partial_eval_jaxpr(typed_jaxpr, in_unknowns, False) num_res = len(jaxpr_1.out_avals) - len(jaxpr_2.out_avals) @@ -558,10 +613,11 @@ def _remat_partial_eval(trace, f, tracers, params): # Now that we have out_pvals, the rest is just like JaxprTrace.process_call. instantiated_tracers = env + instantiated_tracers const_tracers = map(trace.new_instantiated_const, consts) - bound_subjaxpr = (typed_jaxpr.jaxpr, const_tracers, ()) out_tracers = [JaxprTracer(trace, out_pval, None) for out_pval in out_pvals] eqn = new_eqn_recipe(instantiated_tracers, out_tracers, remat_call_p, - (bound_subjaxpr,), params) + params, + subjaxpr=typed_jaxpr.jaxpr, + subjaxpr_const_tracers=const_tracers) for t in out_tracers: t.recipe = eqn return out_tracers call_partial_eval_rules[remat_call_p] = _remat_partial_eval @@ -583,8 +639,7 @@ def _dce_jaxpr(typed_jaxpr, outputs): new_eqns.append(eqn) needed_vars.update(v for v in eqn.invars if type(v) is not Literal) new_eqns = new_eqns[::-1] - - new_jaxpr = core.Jaxpr(jaxpr.constvars, jaxpr.freevars, jaxpr.invars, + new_jaxpr = core.Jaxpr(jaxpr.constvars, jaxpr.invars, new_outvars, new_eqns) return core.TypedJaxpr(new_jaxpr, typed_jaxpr.literals, typed_jaxpr.in_avals, new_out_avals) @@ -618,10 +673,10 @@ def __init__(self): def move_binders_to_front(typed_jaxpr, to_move): - assert not typed_jaxpr.jaxpr.constvars and not typed_jaxpr.jaxpr.freevars + assert not typed_jaxpr.jaxpr.constvars assert len(typed_jaxpr.in_avals) == len(to_move) new_invars = _move_to_front(typed_jaxpr.jaxpr.invars, to_move) - new_jaxpr = core.Jaxpr((), (), new_invars, typed_jaxpr.jaxpr.outvars, + new_jaxpr = core.Jaxpr((), new_invars, typed_jaxpr.jaxpr.outvars, typed_jaxpr.jaxpr.eqns) new_in_avals = _move_to_front(typed_jaxpr.in_avals, to_move) new_typed_jaxpr = core.TypedJaxpr(new_jaxpr, typed_jaxpr.literals, diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index bf6df6bbe551..3afe502a816f 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -158,7 +158,7 @@ def assign_shards_to_replicas(nrep, size): Returns: A tuple of integers of length nrep in which the elements take on values from - 0 to size-1. Replica n is assgined shard data_array[assignments[n]]. + 0 to size-1. Replica n is assigned shard data_array[assignments[n]]. """ groupsize, ragged = divmod(nrep, size) assert not ragged @@ -267,7 +267,7 @@ def _axis_index_partial_eval(trace, _, **params): # rule except that we don't attempt to lower out of the trace. out_aval = ShapedArray((), onp.int32) out_tracer = pe.JaxprTracer(trace, pe.PartialVal((out_aval, core.unit)), None) - eqn = pe.new_eqn_recipe([], [out_tracer], axis_index_p, (), params) + eqn = pe.new_eqn_recipe([], [out_tracer], axis_index_p, params) out_tracer.recipe = eqn return out_tracer @@ -402,7 +402,7 @@ def __getitem__(self, idx): ### the xla_pmap primitive and its rules are comparable to xla_call in xla.py def xla_pmap_impl(fun, *args, backend, axis_name, axis_size, global_axis_size, - devices, name): + devices, name, mapped_invars=None): abstract_args = map(xla.abstractify, args) compiled_fun = parallel_callable(fun, backend, axis_name, axis_size, global_axis_size, devices, name, *abstract_args) @@ -458,6 +458,7 @@ def dynamic_fun(dummy, *args): avals = tuple(map(partial(shard_aval, axis_size), avals)) pvals = [pe.PartialVal((aval, core.unit)) for aval in avals] + # We add a dummy first invar, to carry the trace details to `dynamic_fun` pval = pe.PartialVal([core.abstract_unit, core.unit]) # dummy value for axis env with core.new_master(pe.StagingJaxprTrace, True) as master: jaxpr, (out_pvals, consts, env) = pe.trace_to_subjaxpr( @@ -500,7 +501,7 @@ def dynamic_fun(dummy, *args): c = xb.make_computation_builder("pmap_{}".format(fun.__name__)) xla_consts = _map(c.Constant, consts) xla_args = xla._xla_callable_args(c, avals, tuple_args) - out_nodes = xla.jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, (), + out_nodes = xla.jaxpr_subcomp(c, jaxpr, backend, axis_env, xla_consts, extend_name_stack(wrap_name(name, 'pmap')), *xla_args) built = c.Build(c.Tuple(*out_nodes)) @@ -644,9 +645,10 @@ def execute_replicated(compiled, backend, in_handler, out_handler, *args): xla_pmap_p.def_custom_bind(xla_pmap) xla_pmap_p.def_impl(xla_pmap_impl) -def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, +def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, in_nodes, name_stack, axis_name, axis_size, - global_axis_size, devices, name, backend=None): + global_axis_size, devices, name, backend=None, + mapped_invars=None): # We in-line here rather than generating a Call HLO as in the xla_call # translation rule just because the extra tuple stuff is a pain. if axis_env.devices is not None or (axis_env.names and devices is not None): @@ -654,9 +656,13 @@ def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, if global_axis_size is None: global_axis_size = axis_size new_env = xla.extend_axis_env(axis_env, axis_name, global_axis_size) - in_nodes_sharded = list(map(partial(_xla_shard, c, new_env), in_nodes)) + # Shard the in_nodes that are mapped + in_nodes_sharded = ( + _xla_shard(c, new_env, in_node) if in_node_mapped else in_node + for in_node, in_node_mapped in zip(in_nodes, mapped_invars)) + sharded_outs = xla.jaxpr_subcomp( - c, jaxpr, backend, new_env, const_nodes, freevar_nodes, + c, jaxpr, backend, new_env, const_nodes, extend_name_stack(name_stack, wrap_name(name, 'pmap')), *in_nodes_sharded) outs = [_xla_unshard(c, new_env, shard) for shard in sharded_outs] return c.Tuple(*outs) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 01861b139ce2..8216ca1b693b 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -269,7 +269,7 @@ def jaxpr_literals(jaxpr): def eqn_literals(eqn): if eqn.bound_subjaxprs: - (subjaxpr, _, _), = eqn.bound_subjaxprs + (subjaxpr, _), = eqn.bound_subjaxprs for literal in jaxpr_literals(subjaxpr): yield literal if eqn.primitive in initial_style_translations: @@ -282,7 +282,7 @@ def eqn_literals(eqn): if type(v) is core.Literal: yield v.val -def jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, freevars, name_stack, *args): +def jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, name_stack, *args): platform = xb.get_backend(backend).platform def read(v): @@ -298,7 +298,6 @@ def write(v, node): env = {} write(core.unitvar, c.Tuple()) _map(write, jaxpr.constvars, consts) - _map(write, jaxpr.freevars, freevars) _map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: c.SetOpMetadata(xc.OpMetadata( @@ -323,11 +322,10 @@ def write(v, node): ans = rule(c, *in_nodes, replica_groups=replica_groups, **new_params) elif eqn.primitive in call_translations: new_params = check_backend_params(eqn.params, backend) - (subjaxpr, const_bindings, freevar_bindings), = eqn.bound_subjaxprs + (subjaxpr, const_bindings), = eqn.bound_subjaxprs const_nodes = _map(read, const_bindings) - freevar_nodes = _map(read, freevar_bindings) rule = call_translations[eqn.primitive] - ans = rule(c, subjaxpr, axis_env, const_nodes, freevar_nodes, in_nodes, + ans = rule(c, subjaxpr, axis_env, const_nodes, in_nodes, name_stack, backend=backend, **new_params) else: msg = "XLA translation rule for primitive '{}' not found" @@ -390,7 +388,7 @@ def jaxpr_replicas(jaxpr): def eqn_replicas(eqn): if eqn.bound_subjaxprs: - (subjaxpr, _, _), = eqn.bound_subjaxprs + (subjaxpr, _), = eqn.bound_subjaxprs return eqn.params.get('axis_size', 1) * jaxpr_replicas(subjaxpr) elif eqn.primitive in initial_style_translations: nums = (jaxpr_replicas(param if type(param) is core.Jaxpr else param.jaxpr) @@ -408,7 +406,7 @@ def jaxpr_has_pmap(jaxpr): def eqn_has_pmap(eqn): if eqn.bound_subjaxprs: - (subjaxpr, _, _), = eqn.bound_subjaxprs + (subjaxpr, _), = eqn.bound_subjaxprs return jaxpr_has_pmap(subjaxpr) elif eqn.primitive in initial_style_translations: return any(jaxpr_has_pmap(param if type(param) is core.Jaxpr else param.jaxpr) @@ -423,7 +421,7 @@ def jaxpr_collectives(jaxpr): def eqn_collectives(eqn): if eqn.bound_subjaxprs: - (subjaxpr, _, _), = eqn.bound_subjaxprs + (subjaxpr, _), = eqn.bound_subjaxprs for c in jaxpr_collectives(subjaxpr): yield c elif eqn.primitive in initial_style_translations: @@ -494,7 +492,7 @@ def _xla_callable(fun, device, backend, name, *arg_specs): xla_consts = _map(c.Constant, consts) xla_args = _xla_callable_args(c, abstract_args, tuple_args) out_nodes = jaxpr_subcomp( - c, jaxpr, backend, AxisEnv(nreps, [], []), xla_consts, (), + c, jaxpr, backend, AxisEnv(nreps, [], []), xla_consts, extend_name_stack(wrap_name(name, 'jit')), *xla_args) built = c.Build(c.Tuple(*out_nodes)) @@ -598,17 +596,16 @@ def _get_device(device, backend): xla_call_p.def_custom_bind(xla_call) xla_call_p.def_impl(_xla_call_impl) -def _xla_call_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, +def _xla_call_translation_rule(c, jaxpr, axis_env, const_nodes, in_nodes, name_stack, backend, name, device=None): del device # Ignored. subc = xb.make_computation_builder("jit_{}".format(name)) consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] - freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, + out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, extend_name_stack(name_stack, wrap_name(name, 'jit')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) - return c.Call(subc, list(const_nodes) + list(freevar_nodes) + list(in_nodes)) + return c.Call(subc, list(const_nodes) + list(in_nodes)) ad.primitive_transposes[xla_call_p] = partial(ad.call_transpose, xla_call_p) @@ -656,7 +653,7 @@ def f(c, *args, **params): jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, params), pvals, instantiate=True) consts = _map(c.Constant, consts) - outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, (), + outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, name_stack, *xla_args) return c.Tuple(*outs) return f @@ -966,20 +963,19 @@ def _device_put_impl(x, device=None): masking.defvectorized(device_put_p) -def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, in_nodes, +def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, in_nodes, name_stack, backend, name, device=None, concrete=None): # This looks a lot like _xla_call_translation_rule, except for a widget we use # to foil CSE. del device, concrete # Unused. subc = xb.make_computation_builder("remat_call_subcomputation") consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] - freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] args = [_foil_cse(subc, x) for x in args] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, + out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, extend_name_stack(name_stack, wrap_name(name, 'remat')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) - return c.Call(subc, list(const_nodes) + list(freevar_nodes) + list(in_nodes)) + return c.Call(subc, list(const_nodes) + list(in_nodes)) call_translations[pe.remat_call_p] = _remat_translation_rule def _foil_cse(c, x): diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 083eaa4d9454..f8263a3d1e36 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3453,7 +3453,7 @@ def _reduction_computation(c, jaxpr, consts, init_value): subc = xla_bridge.make_computation_builder("reduction_computation") consts = [subc.ParameterWithShape(const) for const in consts] args = [subc.ParameterWithShape(shape), subc.ParameterWithShape(shape)] - out, = xla.jaxpr_subcomp(subc, jaxpr, None, axis_env, consts, (), '', *args) + out, = xla.jaxpr_subcomp(subc, jaxpr, None, axis_env, consts, '', *args) return subc.Build(out) def _masking_defreducer(prim, identity): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 59e8edd9176c..e13d7f06750d 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -230,7 +230,7 @@ def _while_loop_translation_rule(c, axis_env, name_stack, *args, **kwargs): cond_carry_elts = [cond_c.GetTupleElement(cond_carry, i) for i in range(len(args))] x, _, z = split_list(cond_carry_elts, [cond_nconsts, body_nconsts]) pred, = xla.jaxpr_subcomp(cond_c, cond_jaxpr.jaxpr, backend, axis_env, - _map(cond_c.Constant, cond_jaxpr.literals), (), + _map(cond_c.Constant, cond_jaxpr.literals), extend_name_stack(name_stack, 'cond'), *(x + z)) if batched: scalar = ShapedArray((), onp.bool_) @@ -243,11 +243,11 @@ def _while_loop_translation_rule(c, axis_env, name_stack, *args, **kwargs): body_carry_elts = [body_c.GetTupleElement(body_carry, i) for i in range(len(args))] x, y, z = split_list(body_carry_elts, [cond_nconsts, body_nconsts]) new_z = xla.jaxpr_subcomp(body_c, body_jaxpr.jaxpr, backend, axis_env, - _map(body_c.Constant, body_jaxpr.literals), (), + _map(body_c.Constant, body_jaxpr.literals), extend_name_stack(name_stack, 'body'), *(y + z)) if batched: body_pred, = xla.jaxpr_subcomp(body_c, cond_jaxpr.jaxpr, backend, axis_env, - _map(body_c.Constant, cond_jaxpr.literals), (), + _map(body_c.Constant, cond_jaxpr.literals), extend_name_stack(name_stack, 'body_pred'), *(x + z)) new_z = _map(partial(_pred_bcast_select, body_c, body_pred), new_z, z) assert _map(body_c.GetShape, new_z) == _map(body_c.GetShape, z) # no broadcast @@ -343,7 +343,6 @@ def _while_loop_jvp(primals, tangents, cond_nconsts, cond_jaxpr, body_nconsts, invars_aug = ( cond_jaxpr.jaxpr.invars + [newvar() for _ in range(len(init_dot))]) cond_jaxpr_augmented = core.Jaxpr(cond_jaxpr.jaxpr.constvars, - cond_jaxpr.jaxpr.freevars, invars_aug, cond_jaxpr.jaxpr.outvars, cond_jaxpr.jaxpr.eqns) @@ -437,7 +436,7 @@ def make_computation(name, jaxpr, op_shape): op = c.ParameterWithShape(op_shape) ops = [c.GetTupleElement(op, i) for i in range(len(jaxpr.in_avals))] outs = xla.jaxpr_subcomp(c, jaxpr.jaxpr, backend, axis_env, - _map(c.Constant, jaxpr.literals), (), + _map(c.Constant, jaxpr.literals), extend_name_stack(name_stack, name + '_fun'), *ops) return c.Build(c.Tuple(*outs)) @@ -593,7 +592,7 @@ def _cond_partial_eval(trace, *tracers, true_jaxpr, false_jaxpr, linear): true_res_tracers + true_ops_tracers + false_res_tracers + false_ops_tracers, out_tracers, - cond_p, (), params) + cond_p, params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -619,8 +618,8 @@ def _transpose_cond_jaxpr(jaxpr, num_res): def transposed(*args): res, cts_out = split_list(args, [num_res]) primals = res + [ad.undefined_primal] * num_non_res - _, cts_in = ad.backward_pass( - jaxpr.jaxpr, jaxpr.literals, (), primals, cts_out) + cts_in = ad.backward_pass( + jaxpr.jaxpr, jaxpr.literals, primals, cts_out) _, cts_in = split_list(cts_in, [num_res]) return _map(ad.instantiate_zeros_aval, primal_avals, cts_in) @@ -979,7 +978,7 @@ def _scan_partial_eval(trace, *tracers, **kwargs): [lin or not uk for uk, lin in zip(unknowns, linear)] + [False] * len(ext_res_tracers)) eqn = pe.new_eqn_recipe(int_res_tracers + new_tracers + ext_res_tracers, - out_tracers, scan_p, (), + out_tracers, scan_p, dict(forward=forward, length=length, jaxpr=jaxpr_2_opt, num_consts=num_consts_2, num_carry=num_carry, linear=linear_2)) @@ -1049,7 +1048,7 @@ def transposed(*res1_cbar_bbar_res2): res1, c_bar, b_bar, res2 = split_list( res1_cbar_bbar_res2, [num_res1, num_c, num_b]) primals = res1 + [ad.undefined_primal] * (num_c + num_a) + res2 - _, cbar_abar = ad.backward_pass(jaxpr.jaxpr, jaxpr.literals, (), primals, + cbar_abar = ad.backward_pass(jaxpr.jaxpr, jaxpr.literals, primals, b_bar) _, new_c_bar, a_bar, _ = split_list(cbar_abar, [num_res1, num_c, num_a]) a_bar = _map(ad.instantiate_zeros_aval, a_avals, a_bar) diff --git a/jax/test_util.py b/jax/test_util.py index 58096bb83a1c..fee9c33b2cfd 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -608,7 +608,7 @@ def check_raises_regexp(thunk, err_type, pattern): def _iter_eqns(jaxpr): for eqn in jaxpr.eqns: yield eqn - for subjaxpr, _, _ in eqn.bound_subjaxprs: + for subjaxpr, _ in eqn.bound_subjaxprs: for sub_eqn in _iter_eqns(subjaxpr): yield sub_eqn diff --git a/tests/api_test.py b/tests/api_test.py index 54b6092299b3..0424ce6ac29d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1683,7 +1683,7 @@ def jaxpr_subcomp_and_collect(c, jaxpr, *args, **kwargs): self.assertLen(outer_jaxpr.eqns, 1) self.assertEqual(outer_jaxpr.eqns[0].primitive.name, 'xla_call') - (subjaxpr_1, _, _), = outer_jaxpr.eqns[0].bound_subjaxprs + (subjaxpr_1, _), = outer_jaxpr.eqns[0].bound_subjaxprs self.assertEqual(str(subjaxpr_1), str(inner_jaxpr)) self.assertLen(inner_jaxpr.eqns, 2) self.assertEqual(inner_jaxpr.eqns[0].primitive.name, 'mul') @@ -1716,7 +1716,7 @@ def fun(x): jaxpr = api.make_jaxpr(fun)(0.) self.assertMultiLineStrippedEqual(str(jaxpr), """ - { lambda b ; ; a. + { lambda b ; a. let in [a, 1.0, b] } """) @@ -1730,15 +1730,15 @@ def f(x): lambda xf: xf - x) jaxpr = api.make_jaxpr(f)(3.) self.assertMultiLineStrippedEqual(str(jaxpr), """ - { lambda ; ; a. + { lambda ; a. let b = ge a 0.0 c = add a 1.0 d = add a 2.0 - e = cond[ false_jaxpr={ lambda ; ; b a. + e = cond[ false_jaxpr={ lambda ; b a. let c = sub a b in [c] } linear=(False, False, False, False) - true_jaxpr={ lambda ; ; b a. + true_jaxpr={ lambda ; b a. let c = add a b in [c] } ] b a c a d in [e] } From a955fd9deee29f6de5023bf4077d678a56084785 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 3 Feb 2020 19:57:08 +0100 Subject: [PATCH 0699/1053] Updated notebook that refered to freevars --- docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb index f5a021dc4440..4d84da3d6f85 100644 --- a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb +++ b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb @@ -148,7 +148,6 @@ "invars: [a]\n", "outvars: [b]\n", "constvars: []\n", - "freevars: []\n", "equation: [a, 1] add [b] {}\n", "\n", "jaxpr: { lambda ; ; a.\n", @@ -161,7 +160,6 @@ "invars: [a, b, c]\n", "outvars: [g, c]\n", "constvars: [f]\n", - "freevars: []\n", "equation: [a, c] dot_general [d] {'dimension_numbers': (((1,), (0,)), ((), ())), 'precision': None}\n", "equation: [d, b] add [e] {}\n", "equation: [e, f] add [g] {}\n", @@ -182,7 +180,6 @@ " print(\"invars:\", jaxpr.invars)\n", " print(\"outvars:\", jaxpr.outvars)\n", " print(\"constvars:\", jaxpr.constvars)\n", - " print(\"freevars:\", jaxpr.freevars)\n", " for eqn in jaxpr.eqns:\n", " print(\"equation:\", eqn.invars, eqn.primitive, eqn.outvars, eqn.params)\n", " print()\n", @@ -213,7 +210,6 @@ "* `jaxpr.invars` - the `invars` of a Jaxpr are a list of the input variables to Jaxpr, analogous to arguments in Python functions\n", "* `jaxpr.outvars` - the `outvars` of a Jaxpr are the variables that are returned by the Jaxpr. Every Jaxpr has multiple outputs.\n", "* `jaxpr.constvars` - the `constvars` are a list of variables that are also inputs to the Jaxpr, but correspond to constants from the trace (we'll go over these in more detail later)\n", - "* `jaxpr.freevars` - these can arise when nesting `jit` and `pmap` transformations; we won't worry about them in this colab.\n", "* `jaxpr.eqns` - a list of equations, which are essentially let-bindings. Each equation is list of input variables, a list of output variables, and a *primitive*, which is used to evaluate inputs to produce outputs. Each equation also has a `params`, a dictionary of parameters.\n", "\n", "All together, a Jaxpr encapsulates a simple program that can be evaluated with inputs to produce an output. We'll go over how exactly to do this later. The important thing to note now is that a Jaxpr is a data structure that can be manipulated and evaluated in whatever way we want." From 2d0b8c2c609829e9745c1a1bc64c0fcf777fc899 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 3 Feb 2020 18:02:45 -0800 Subject: [PATCH 0700/1053] Fix precision in triangular solve batching test for TPUs (#2159) --- tests/linalg_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 0017ef088327..e40b90b729a9 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -961,7 +961,8 @@ def testTriangularSolveBatching(self, left_side, a_shape, b_shape, bdims): transpose_a=False, conjugate_a=False, unit_diagonal=False, left_side=left_side) X = vmap(solve, bdims)(A, B) - Y = A @ X if left_side else X @ A + matmul = partial(np.matmul, precision=lax.Precision.HIGHEST) + Y = matmul(A, X) if left_side else matmul(X, A) onp.testing.assert_allclose(Y - B, 0, atol=1e-5) def testTriangularSolveGradPrecision(self): From 7404e88b358a377cdf8d8e580349311185184af6 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 3 Feb 2020 18:03:54 -0800 Subject: [PATCH 0701/1053] Adjust scipy_stats_test.py tolerance. --- tests/scipy_stats_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 0e7cbe608242..d402e8e17c8b 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -244,7 +244,7 @@ def args_maker(): return list(map(rng, shapes, dtypes)) self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, - tol=1e-6) + tol=1e-4) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) @genNamedParametersNArgs(1, jtu.rand_default) From b19f7e935781bd848525c418c5a093b1d200dca5 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 3 Feb 2020 19:07:05 -0800 Subject: [PATCH 0702/1053] WIP sharded_jit implementation (#2158) --- jax/interpreters/sharded_jit.py | 300 ++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 jax/interpreters/sharded_jit.py diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py new file mode 100644 index 000000000000..a06f15d9f7c4 --- /dev/null +++ b/jax/interpreters/sharded_jit.py @@ -0,0 +1,300 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import partial + +from absl import logging +import numpy as onp + +from .. import core +from ..abstract_arrays import ShapedArray, ConcreteArray, array_types, abstract_token +from . import partial_eval as pe +from . import xla +from .. import linear_util as lu +from ..lib import xla_bridge as xb +from ..lib import xla_client as xc +from ..api_util import flatten_fun +from ..tree_util import tree_flatten, tree_unflatten +from ..util import extend_name_stack, wrap_name + +"""WIP shared_jit""" + +def _map(f, *xs): + return tuple(map(f, *xs)) + + +### arg handling + + +def _spatial_partitioned_args(devices, assignments, partitions, args): + nargs = len(args) + nrep, npar = assignments.shape + # buffers = [[[None] * nargs for _ in range(npar)] for _ in range(nrep)] # TODO + buffers = [[None] * nargs for _ in range(nrep * npar)] + for a, (arg, partition) in enumerate(zip(args, partitions)): + bufs = _partition_array(arg, devices, assignments, + partition) + for r in range(nrep): + for p in range(npar): + # buffers[r][p][a] = bufs[r][p] # TODO update C++ + buffers[r * npar + p][a] = bufs[r][p] + return buffers + + +partition_arg_handlers = {} + + +def _partition_array(x, devices, assignments, partition): + nrep, npar = assignments.shape + assert nrep == 1 # TODO generalize beyond single-replica + shards = [x] + for i, parts in enumerate(partition): + shards = _flatten(onp.split(s, parts, i) for s in shards) + # logging.error("===== shards: %s" % [s.shape for s in shards]) + bufs = [[None] * npar for _ in range(nrep)] + for (r, p), device in onp.ndenumerate(assignments): + bufs[r][p] = xla.device_put(shards[p], devices[device]) + return bufs + + +def _flatten(lst): + return [elt for sublst in lst for elt in sublst] + + +for _t in array_types: + partition_arg_handlers[_t] = _partition_array + +### result handling + + +def _pvals_to_results_handler(nrep, npar, partitions, out_pvals): + nouts = len(out_pvals) + handlers = _map(_pval_to_result_handler, partitions, out_pvals) + + def handler(out_bufs): + buffers = [[[None] * npar for _ in range(nrep)] for _ in range(nouts)] + for raw_idx, tuple_buf in enumerate(out_bufs): + r, p = onp.unravel_index(raw_idx, (nrep, npar)) + for i, buf in enumerate(tuple_buf.destructure()): + buffers[i][r][p] = buf + return [h(bufs) for h, bufs in zip(handlers, buffers)] + + return handler + + +def _pval_to_result_handler(partition, pval): + pv, const = pval + if pv is None: + raise NotImplementedError # TODO handle constant outputs + else: + return _aval_to_result_handler(partition, pv) + + +def _aval_to_result_handler(partition, aval): + return result_handlers[type(aval)](partition, aval) + + +result_handlers = {} + + +def _array_result_handler(partition, aval): + + def handler(bufs): + bufs, = bufs # TODO generalize beyond single replica + shards = [buf.to_py() for buf in bufs] # TODO device persistence + partition = (1,) # TODO (wangtao): revisit this hack. + for i, parts in enumerate(partition): + shards = [onp.concatenate(cs, axis=i) for cs in _chunk(shards, parts)] + result = shards + return result + + return handler + + +def _chunk(lst, sz): + assert not len(lst) % sz + return [lst[i:i + sz] for i in range(0, len(lst), sz)] + + +result_handlers[ShapedArray] = _array_result_handler +result_handlers[ConcreteArray] = _array_result_handler + +### computation building + + +@lu.cache +def _sharded_callable(fun, partitions, name, *abstract_args): + nrep = 1 # TODO generalize + + in_pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] + with core.new_master(pe.JaxprTrace, True) as master: + jaxpr, (out_pvals, consts, + env) = pe.trace_to_subjaxpr(fun, master, + False).call_wrapped(in_pvals) + assert not env # no subtraces here + del master, env + + if not jaxpr.eqns and all(outvar is core.unitvar for outvar in jaxpr.outvars): + return lambda *_: [core.unit] * len(jaxpr.outvars) + + + c = xb.make_computation_builder("spjit_{}".format(fun.__name__)) + xla_consts = _map(c.Constant, consts) + xla_args = _xla_sharded_args(c, abstract_args, partitions[0]) + axis_env = xla.AxisEnv(nrep, [], []) + out_nodes = xla.jaxpr_subcomp( + c, jaxpr, None, axis_env, xla_consts, (), + extend_name_stack(wrap_name(name, "sharded_jit")), + *xla_args) + c._builder.SetSharding(_sharding_to_proto(partitions[1])) + out_tuple = c.Tuple(*out_nodes) + c._builder.ClearSharding() + built = c.Build(out_tuple) + + num_partitions = _get_num_partitions(partitions[0]) + devices = xb.local_devices()[:num_partitions] + assert len(devices) == num_partitions # TODO generalize beyond single-replica + device_assignment = onp.array([[d.id for d in devices]]) + device_assignment = onp.reshape(device_assignment, (-1, num_partitions)) + # device_assignment = None # TODO(skye): replace with default device assignment? + + compiled = built.Compile( + compile_options=xb.get_compile_options(nrep, num_partitions, device_assignment), + backend=xb.get_backend(None)) + + # logging.error("===== hlo:\n%s" % built.GetHloText()) + + handle_args = partial(_spatial_partitioned_args, compiled.local_devices(), + device_assignment, partitions[0]) + handle_outs = _pvals_to_results_handler(nrep, num_partitions, partitions[1], + out_pvals) + return partial(_execute_spatially_partitioned, compiled, handle_args, + handle_outs) + + +def _sharded_jit_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, + in_nodes, name_stack, partitions, backend, name): + subc = xb.make_computation_builder("jaxpr_subcomputation") # TODO(mattjj): name + consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] + freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] + + args = [] + for p, a in zip(partitions[0], in_nodes): + subc._builder.SetSharding(_sharding_to_proto(p)) + args.append(subc.ParameterWithShape(c.GetShape(a))) + subc._builder.ClearSharding() + # args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] + + out_nodes = xla.jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, name_stack, *args) + + subc._builder.SetSharding(_sharding_to_proto(partitions[1])) + out_tuple = subc.Tuple(*out_nodes) + subc._builder.ClearSharding() + + subc = subc.Build(out_tuple) + return c.Call(subc, list(const_nodes) + list(freevar_nodes) + list(in_nodes)) + +def _execute_spatially_partitioned(compiled, in_handler, out_handler, *args): + input_bufs = in_handler(args) + out_bufs = compiled.ExecuteOnLocalDevices(list(input_bufs)) + return out_handler(out_bufs) + + +def _xla_sharded_args(c, avals, partitions): + xla_args = [] + for p, a in zip(partitions, avals): + c._builder.SetSharding(_sharding_to_proto(p)) + # logging.error("===== aval shape: %s" % str(a.shape)) + shape = xc.Shape.array_shape(a.dtype, (4,8)) + xla_args.append(c.ParameterWithShape(xla.aval_to_xla_shape(a))) + c._builder.ClearSharding() + return xla_args + + +def _sharding_to_proto(sharding): + proto = xc.OpSharding() + if isinstance(sharding, tuple): + if sharding[0] is None or isinstance(sharding[0], tuple): + sub_protos = [_sharding_to_proto(s) for s in sharding] + xc.type = xc.OpSharding.Type.TUPLE + xc.tuple_shardings = sub_protos + return proto + + if sharding is None: + proto.type = xc.OpSharding.Type.REPLICATED + else: + proto.type = xc.OpSharding.Type.OTHER + proto.tile_assignment_dimensions = list(sharding) + proto.tile_assignment_devices = list(range(onp.product(sharding))) + return proto + + +def _get_num_partitions(partitions): + num_partitions = onp.prod(onp.max(partitions, axis=0)) + return num_partitions + + +def get_num_partitions(partitions): + num_partitions_set = set(_get_num_partitions(parts) for parts in partitions) + if len(num_partitions_set) > 1: + raise ValueError( + "All partition specs must use the same number of total partitions, " + "got: %s" % partitions) + return num_partitions_set.pop() + + +def jaxpr_partitions(jaxpr): + for eqn in jaxpr.eqns: + if eqn.primitive == sharded_call_p: + # TODO(skye): change API to support different output partitions + return (eqn.params["partitions"][0], (eqn.params["partitions"][1],)) + # TODO(skye): more error checking + # return _get_num_partitions(eqn.params["partitions"][0]) + return None, None + + + +### sharded_call + + +def _sharded_call_impl(fun, *args, **params): + partitions = params.pop("partitions") + name = params.pop("name") + assert not params, params + compiled_fun = _sharded_callable(fun, partitions, name, + *map(xla.abstractify, args)) + return compiled_fun(*args) + + +sharded_call_p = core.Primitive("sharded_call") +sharded_call_p.multiple_results = True +sharded_call = partial(core.call_bind, sharded_call_p) +sharded_call_p.def_custom_bind(sharded_call) +sharded_call_p.def_impl(_sharded_call_impl) +xla.call_translations[sharded_call_p] = _sharded_jit_translation_rule + + +def sharded_jit(fun, partitions): + if xb.get_backend().platform != "tpu": + logging.warning("sharded_jit only works on TPU") + + def wrapped(*args, **kwargs): + f = lu.wrap_init(fun) + args_flat, in_tree = tree_flatten((args, kwargs)) + flat_fun, out_tree = flatten_fun(f, in_tree) + out = sharded_call(flat_fun, *args_flat, partitions=partitions, + name=flat_fun.__name__) + return tree_unflatten(out_tree(), out) + + return wrapped From ffc55ee6008c054a2e58d01f64ba0ced36b36048 Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Tue, 4 Feb 2020 00:48:10 -0800 Subject: [PATCH 0703/1053] Update linspace edgecase to match numpy fix. (#2162) * Update linspace edgecase to match numpy fix. * only test fixed linspace behavior against newer numpy * remove unneeded version pkg --- jax/numpy/lax_numpy.py | 2 +- tests/lax_numpy_test.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 364884f15082..7799194d30a7 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1942,7 +1942,7 @@ def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, reshape(lax.iota(dt, num), iota_shape) * reshape(delta, bounds_shape)) elif num == 1: - delta = nan + delta = nan if endpoint else lax.convert_element_type(stop - start, dt) out = reshape(broadcast_start, bounds_shape) else: # num == 0 degenerate case, match onp behavior empty_shape = list(lax.broadcast_shapes(shape(start), shape(stop))) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 3a31726c4820..c7bb6c3e5b66 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2374,6 +2374,8 @@ def testMeshGrid(self, shapes, dtype, indexing, sparse, rng_factory): for rng_factory in [jtu.rand_default])) def testLinspace(self, start_shape, stop_shape, num, endpoint, retstep, dtype, rng_factory): + if num == 1 and not endpoint and numpy_version < (1, 17, 5): + raise SkipTest("Numpy < 1.17.5 has a linspace bug.") rng = rng_factory() # relax default tolerances slightly tol = jtu.tolerance(dtype if dtype else onp.float32) * 10 From 272620e66cd2f9c686a45306f469df873f535fc7 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 4 Feb 2020 10:22:54 +0100 Subject: [PATCH 0704/1053] Added note to CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1517688ae0f..c7dce33adef4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ These are the release notes for JAX. ### Breaking changes * The minimum jaxlib version is now 0.1.38. +* Simplified `Jaxpr` by removing the `Jaxpr.freevars` and changing the + representation of `Jaxpr.bound_subjaxprs` to drop the environment values. ### New features From 4080a1c2ce95dc4a90f899fe4bf9ad5ac6a7b8b3 Mon Sep 17 00:00:00 2001 From: Jonas Adler Date: Tue, 4 Feb 2020 15:24:10 +0000 Subject: [PATCH 0705/1053] Add np.fft.fftshift/ifftshift (#1850) --- jax/numpy/fft.py | 28 ++++++++++++++++++++++++++++ tests/fft_test.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/jax/numpy/fft.py b/jax/numpy/fft.py index 27f06dae0c4b..ee7b2c0f503b 100644 --- a/jax/numpy/fft.py +++ b/jax/numpy/fft.py @@ -208,6 +208,34 @@ def rfftfreq(n, d=1.0): return k / (d * n) +@_wraps(onp.fft.fftshift) +def fftshift(x, axes=None): + x = np.asarray(x) + if axes is None: + axes = tuple(range(x.ndim)) + shift = [dim // 2 for dim in x.shape] + elif isinstance(axes, int): + shift = x.shape[axes] // 2 + else: + shift = [x.shape[ax] // 2 for ax in axes] + + return np.roll(x, shift, axes) + + +@_wraps(onp.fft.ifftshift) +def ifftshift(x, axes=None): + x = np.asarray(x) + if axes is None: + axes = tuple(range(x.ndim)) + shift = [-(dim // 2) for dim in x.shape] + elif isinstance(axes, int): + shift = -(x.shape[axes] // 2) + else: + shift = [-(x.shape[ax] // 2) for ax in axes] + + return np.roll(x, shift, axes) + + for func in get_module_functions(onp.fft): if func.__name__ not in globals(): globals()[func.__name__] = _not_implemented(func) diff --git a/tests/fft_test.py b/tests/fft_test.py index 35de3160702d..d0c40ce4df11 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -107,7 +107,7 @@ def testFftn(self, inverse, real, shape, dtype, axes, rng_factory): onp_op = _get_fftn_func(onp.fft, inverse, real) np_fn = lambda a: np_op(a, axes=axes) onp_fn = lambda a: onp_op(a, axes=axes) if axes is None or axes else a - # Numpy promotes to complex128 aggressively. + # Numpy promotes to complex128 aggressively. self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=False, tol=1e-4) self._CompileAndCheck(np_fn, args_maker, check_dtypes=True) @@ -350,5 +350,35 @@ def testRfftfreqErrors(self, n): lambda: func(n=10, d=n) ) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "dtype={}_axes={}".format( + jtu.format_shape_dtype_string(shape, dtype), axes), + "dtype": dtype, "shape": shape, "rng_factory": rng_factory, "axes": axes} + for rng_factory in [jtu.rand_default] + for dtype in all_dtypes + for shape in [[9], [10], [101], [102], [3, 5], [3, 17], [5, 7, 11]] + for axes in _get_fftn_test_axes(shape))) + def testFftshift(self, shape, dtype, rng_factory, axes): + rng = rng_factory() + args_maker = lambda: (rng(shape, dtype),) + np_fn = lambda arg: np.fft.fftshift(arg, axes=axes) + onp_fn = lambda arg: onp.fft.fftshift(arg, axes=axes) + self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=True) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "dtype={}_axes={}".format( + jtu.format_shape_dtype_string(shape, dtype), axes), + "dtype": dtype, "shape": shape, "rng_factory": rng_factory, "axes": axes} + for rng_factory in [jtu.rand_default] + for dtype in all_dtypes + for shape in [[9], [10], [101], [102], [3, 5], [3, 17], [5, 7, 11]] + for axes in _get_fftn_test_axes(shape))) + def testIfftshift(self, shape, dtype, rng_factory, axes): + rng = rng_factory() + args_maker = lambda: (rng(shape, dtype),) + np_fn = lambda arg: np.fft.ifftshift(arg, axes=axes) + onp_fn = lambda arg: onp.fft.ifftshift(arg, axes=axes) + self._CheckAgainstNumpy(onp_fn, np_fn, args_maker, check_dtypes=True) + if __name__ == "__main__": absltest.main() From ddc83e093778e227c7688f6ad16888b211a554ef Mon Sep 17 00:00:00 2001 From: Lukas Prediger Date: Tue, 4 Feb 2020 18:38:38 +0200 Subject: [PATCH 0706/1053] Added dtype arg for NN initializer factory methods (#2034) * Added dtype arg for NN initializer factory methods Initializer factories in jax/nn/initializers.py (such as uniform(), normal(), glorot_normal(), etc) now have an optional `dtype` argument. The value passed in that argument becomes the default value for the same `dtype` argument of the initializer function returned by the factory. * fixed failed test for delta_orthogonal in d12cdc47 --- jax/nn/initializers.py | 24 +++++++++++------------ tests/nn_test.py | 43 +++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/jax/nn/initializers.py b/jax/nn/initializers.py index d552ad8ad121..43a79d3b79a0 100644 --- a/jax/nn/initializers.py +++ b/jax/nn/initializers.py @@ -30,13 +30,13 @@ def zeros(key, shape, dtype=np.float32): return np.zeros(shape, dtype) def ones(key, shape, dtype=np.float32): return np.ones(shape, dtype) -def uniform(scale=1e-2): - def init(key, shape, dtype=np.float32): +def uniform(scale=1e-2, dtype=np.float32): + def init(key, shape, dtype=dtype): return random.uniform(key, shape, dtype) * scale return init -def normal(stddev=1e-2): - def init(key, shape, dtype=np.float32): +def normal(stddev=1e-2, dtype=np.float32): + def init(key, shape, dtype=dtype): return random.normal(key, shape, dtype) * stddev return init @@ -46,8 +46,8 @@ def _compute_fans(shape, in_axis=-2, out_axis=-1): fan_out = shape[out_axis] * receptive_field_size return fan_in, fan_out -def variance_scaling(scale, mode, distribution, in_axis=-2, out_axis=-1): - def init(key, shape, dtype=np.float32): +def variance_scaling(scale, mode, distribution, in_axis=-2, out_axis=-1, dtype=np.float32): + def init(key, shape, dtype=dtype): fan_in, fan_out = _compute_fans(shape, in_axis, out_axis) if mode == "fan_in": denominator = fan_in elif mode == "fan_out": denominator = fan_out @@ -75,14 +75,14 @@ def init(key, shape, dtype=np.float32): kaiming_uniform = he_uniform = partial(variance_scaling, 2.0, "fan_in", "uniform") kaiming_normal = he_normal = partial(variance_scaling, 2.0, "fan_in", "truncated_normal") -def orthogonal(scale=1.0, column_axis=-1): +def orthogonal(scale=1.0, column_axis=-1, dtype=np.float32): """ Construct an initializer for uniformly distributed orthogonal matrices. If the shape is not square, the matrices will have orthonormal rows or columns depending on which side is smaller. """ - def init(key, shape, dtype=np.float32): + def init(key, shape, dtype=dtype): if len(shape) < 2: raise ValueError("orthogonal initializer requires at least a 2D shape") n_rows, n_cols = onp.prod(shape) // shape[column_axis], shape[column_axis] @@ -97,21 +97,21 @@ def init(key, shape, dtype=np.float32): return init -def delta_orthogonal(scale=1.0, column_axis=-1): +def delta_orthogonal(scale=1.0, column_axis=-1, dtype=np.float32): """ Construct an initializer for delta orthogonal kernels; see arXiv:1806.05393. The shape must be 3D, 4D or 5D. """ - def init(key, shape, dtype=np.float32): + def init(key, shape, dtype=dtype): if len(shape) not in [3, 4, 5]: raise ValueError("Delta orthogonal initializer requires a 3D, 4D or 5D " "shape.") if shape[-1] < shape[-2]: raise ValueError("`fan_in` must be less or equal than `fan_out`. ") - ortho_init = orthogonal(scale=scale, column_axis=column_axis) + ortho_init = orthogonal(scale=scale, column_axis=column_axis, dtype=dtype) ortho_matrix = ortho_init(key, shape[-2:]) - W = np.zeros(shape) + W = np.zeros(shape, dtype=dtype) if len(shape) == 3: k = shape[0] return ops.index_update(W, ops.index[(k-1)//2, ...], ortho_matrix) diff --git a/tests/nn_test.py b/tests/nn_test.py index e8e5b9c24267..0d6bf3add13e 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -71,16 +71,16 @@ def initializer_record(name, initializer, min_dims=2, max_dims=4): return InitializerRecord(name, initializer, shapes) INITIALIZER_RECS = [ - initializer_record("uniform", nn.initializers.uniform(), 1), - initializer_record("normal", nn.initializers.normal(), 1), - initializer_record("he_normal", nn.initializers.he_normal()), - initializer_record("he_uniform", nn.initializers.he_uniform()), - initializer_record("glorot_normal", nn.initializers.glorot_normal()), - initializer_record("glorot_uniform", nn.initializers.glorot_uniform()), - initializer_record("lecun_normal", nn.initializers.lecun_normal()), - initializer_record("lecun_uniform", nn.initializers.lecun_uniform()), - initializer_record("orthogonal", nn.initializers.orthogonal(), 2, 2), - initializer_record("orthogonal", nn.initializers.delta_orthogonal(), 4, 4) + initializer_record("uniform", nn.initializers.uniform, 1), + initializer_record("normal", nn.initializers.normal, 1), + initializer_record("he_normal", nn.initializers.he_normal), + initializer_record("he_uniform", nn.initializers.he_uniform), + initializer_record("glorot_normal", nn.initializers.glorot_normal), + initializer_record("glorot_uniform", nn.initializers.glorot_uniform), + initializer_record("lecun_normal", nn.initializers.lecun_normal), + initializer_record("lecun_uniform", nn.initializers.lecun_uniform), + initializer_record("orthogonal", nn.initializers.orthogonal, 2, 2), + initializer_record("delta_orthogonal", nn.initializers.delta_orthogonal, 4, 4) ] class NNInitializersTest(jtu.JaxTestCase): @@ -90,7 +90,7 @@ class NNInitializersTest(jtu.JaxTestCase): "_{}_{}".format( rec.name, jtu.format_shape_dtype_string(shape, dtype)), - "initializer": rec.initializer, + "initializer": rec.initializer(), "shape": shape, "dtype": dtype} for rec in INITIALIZER_RECS for shape in rec.shapes @@ -98,6 +98,27 @@ class NNInitializersTest(jtu.JaxTestCase): def testInitializer(self, initializer, shape, dtype): rng = random.PRNGKey(0) val = initializer(rng, shape, dtype) + self.assertEqual(shape, np.shape(val)) + self.assertEqual(jax.dtypes.canonicalize_dtype(dtype), np.dtype(val)) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_{}_{}".format( + rec.name, + jtu.format_shape_dtype_string(shape, dtype)), + "initializer_provider": rec.initializer, + "shape": shape, "dtype": dtype} + for rec in INITIALIZER_RECS + for shape in rec.shapes + for dtype in [onp.float32, onp.float64])) + def testInitializerProvider(self, initializer_provider, shape, dtype): + rng = random.PRNGKey(0) + initializer = initializer_provider(dtype=dtype) + val = initializer(rng, shape) + + self.assertEqual(shape, np.shape(val)) + self.assertEqual(jax.dtypes.canonicalize_dtype(dtype), np.dtype(val)) + if __name__ == "__main__": absltest.main() From 862a1d594b67845f480bba7b342afb134ffc1a14 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 4 Feb 2020 22:27:09 +0100 Subject: [PATCH 0707/1053] Moved the mapped_invars parameter setting to the process_map --- jax/interpreters/partial_eval.py | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 92448e36bb80..d71b1391451b 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -159,14 +159,14 @@ def process_map(self, map_primitive, f, tracers, params): out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] # The `jaxpr` already contains the env_vars at start of invars - mapped_invars = tuple([True] * len(const_tracers) + - [False] * len(env_tracers) + - [True] * len(tracers)) + params = params.copy() + params["mapped_invars"] = tuple([True] * len(const_tracers) + + [False] * len(env_tracers) + + [True] * len(tracers)) eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers, tracers)), out_tracers, map_primitive, params, subjaxpr=lifted_jaxpr, - subjaxpr_const_tracers=(), - mapped_invars=mapped_invars) + subjaxpr_const_tracers=()) for t in out_tracers: t.recipe = eqn return out_tracers @@ -213,14 +213,14 @@ def todo(x): lifted_jaxpr = closure_convert_jaxpr(jaxpr) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - mapped_invars = tuple([True] * len(const_tracers), - [False] * len(env)) + params = params.copy() + params["mapped_invars"] = tuple([True] * len(const_tracers), + [False] * len(env)) env_tracers = map(trace.full_raise, env) eqn = new_eqn_recipe(it.chain(const_tracers, env_tracers), out_tracers, map_primitive, params, subjaxpr=lifted_jaxpr, - subjaxpr_const_tracers=(), - mapped_invars=mapped_invars) + subjaxpr_const_tracers=()) for t in out_tracers: t.recipe = eqn return out_tracers @@ -390,8 +390,7 @@ def instantiate_const_at(trace, instantiate, tracer): def new_eqn_recipe(invars, outvars, primitive, params, subjaxpr=None, - subjaxpr_const_tracers=(), - mapped_invars=()): + subjaxpr_const_tracers=()): """Constructs a new JaxEqnRecipe. Params: @@ -404,21 +403,11 @@ def new_eqn_recipe(invars, outvars, primitive, params, Also, `subjaxpr.constvars` correspond to `subjaxpr_const_tracers`. subjaxpr_const_tracers: The constant tracers for `subjaxpr`. Must be () if not `subjaxpr`. - mapped_invars: for `xla_pmap` only, a list of booleans of length - `len(subjaxpr.invars)`, with the value True when the corresponding invar - is mapped over devices. If present, then `subjaxpr_const_tracers` is - empty (`subjaxpr` is closed). """ if subjaxpr is not None: assert len(subjaxpr.constvars) == len(subjaxpr_const_tracers) assert len(subjaxpr.invars) == len(tuple(invars)) bound_subjaxprs = ((subjaxpr, subjaxpr_const_tracers),) - - if mapped_invars: - # Put this in mapped_invars parameter, for xla_pmap - assert not subjaxpr.constvars - params = params.copy() - params['mapped_invars'] = mapped_invars else: bound_subjaxprs = () From b18a4d8583c0e11e228a0792793d6f6e99292766 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 5 Feb 2020 17:35:46 +0100 Subject: [PATCH 0708/1053] Disabled tests known to fail on Mac, and optionally slow tests. Issue: #2166 Added JAX_SKIP_SLOW_TESTS environment variable to skip tests known to be slow. --- CHANGELOG.md | 1 + docs/developer.rst | 3 +++ jax/test_util.py | 8 ++++++++ tests/lax_control_flow_test.py | 9 +++++++++ tests/lax_test.py | 4 ++++ tests/linalg_test.py | 19 +++++++++++++++++++ tests/nn_test.py | 2 ++ 7 files changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7dce33adef4..071e89b2b59e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ These are the release notes for JAX. and Numba. * JAX CPU device buffers now implement the Python buffer protocol, which allows zero-copy buffer sharing between JAX and NumPy. +* Added JAX_SKIP_SLOW_TESTS environment variable to skip tests known as slow. ## jaxlib 0.1.38 (January 29, 2020) diff --git a/docs/developer.rst b/docs/developer.rst index ea55a9fd6b77..5d47127bd626 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -124,6 +124,9 @@ file directly to see more detailed information about the cases being run: python tests/lax_numpy_test.py --num_generated_cases=5 +You can skip a few tests known as slow, by passing environment variable +JAX_SKIP_SLOW_TESTS=1. + The Colab notebooks are tested for errors as part of the documentation build. Update documentation diff --git a/jax/test_util.py b/jax/test_util.py index fee9c33b2cfd..b6dca099bece 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -14,6 +14,7 @@ from contextlib import contextmanager +from distutils.util import strtobool import functools import re import itertools as it @@ -49,6 +50,13 @@ int(os.getenv('JAX_NUM_GENERATED_CASES', 10)), help='Number of generated cases to test') +flags.DEFINE_bool( + 'jax_skip_slow_tests', + strtobool(os.getenv('JAX_SKIP_SLOW_TESTS', '0')), + help= + 'Skip tests marked as slow (> 5 sec).' +) + EPS = 1e-4 def _dtype(x): diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 0b4943d339cf..fa06b1bcc18b 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -957,6 +957,7 @@ def f(c, a): "jit_scan": jit_scan, "jit_f": jit_f} for jit_scan in [False, True] for jit_f in [False, True]) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testScanGrad(self, jit_scan, jit_f): rng = onp.random.RandomState(0) @@ -987,6 +988,7 @@ def f(c, a): jtu.check_grads(partial(scan, f), (c, as_), order=2, modes=["rev"], atol=1e-3, rtol=2e-3) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testScanRnn(self): r = npr.RandomState(0) @@ -1444,6 +1446,7 @@ def sqrt_cubed(x, tangent_solve=scalar_solve): self.assertAllClose(results, 5.0 ** 1.5, check_dtypes=False, rtol={onp.float64:1e-7}) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def test_custom_root_vector_with_solve_closure(self): def vector_solve(f, y): @@ -1513,6 +1516,7 @@ def dummy_root_usage(x): {"testcase_name": "nonsymmetric", "symmetric": False}, {"testcase_name": "symmetric", "symmetric": True}, ) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def test_custom_linear_solve(self, symmetric): def explicit_jacobian_solve(matvec, b): @@ -1542,6 +1546,7 @@ def linear_solve(a, b): actual = api.vmap(linear_solve, (None, 1), 1)(a, c) self.assertAllClose(expected, actual, check_dtypes=True) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def test_custom_linear_solve_zeros(self): def explicit_jacobian_solve(matvec, b): return lax.stop_gradient(np.linalg.solve(api.jacobian(matvec)(b), b)) @@ -1561,6 +1566,7 @@ def linear_solve(a, b): jtu.check_grads(lambda x: linear_solve(a, x), (b,), order=2, rtol={onp.float32: 5e-3}) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def test_custom_linear_solve_iterative(self): def richardson_iteration(matvec, b, omega=0.1, tolerance=1e-6): @@ -1622,6 +1628,7 @@ def solve(matvec, x): lambda x, y: positive_definite_solve(high_precision_dot(x, x.T), y), (a, b), order=2, rtol=1e-2) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def test_custom_linear_solve_lu(self): # TODO(b/143528110): re-enable when underlying XLA TPU issue is fixed @@ -1652,6 +1659,7 @@ def transpose_solve(vecmat, x): jtu.check_grads(api.jit(linear_solve), (a, b), order=2, rtol={onp.float32: 2e-3}) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def test_custom_linear_solve_without_transpose_solve(self): def explicit_jacobian_solve(matvec, b): @@ -1674,6 +1682,7 @@ def loss(a, b): with self.assertRaisesRegex(TypeError, "transpose_solve required"): api.grad(loss)(a, b) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def test_custom_linear_solve_pytree(self): """Test custom linear solve with inputs and outputs that are pytrees.""" diff --git a/tests/lax_test.py b/tests/lax_test.py index d8101901b894..0ec72acbd851 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -564,6 +564,7 @@ def _transpose_conv_kernel(data, kernel, dimension_numbers): for dspec in [('NHWC', 'HWIO', 'NHWC'),] for rhs_dilation in [None, (2, 2)] for rng_factory in [jtu.rand_small])) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testConvTranspose2DT(self, lhs_shape, rhs_shape, dtype, strides, padding, dspec, rhs_dilation, rng_factory): rng = rng_factory() @@ -602,6 +603,7 @@ def fun_via_grad(lhs, rhs): for dspec in [('NHWC', 'HWIO', 'NHWC'),] for rhs_dilation in [None, (2, 2)] for rng_factory in [jtu.rand_small])) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testConvTranspose2D(self, lhs_shape, rhs_shape, dtype, strides, padding, dspec, rhs_dilation, rng_factory): rng = rng_factory() @@ -2281,6 +2283,7 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng_factory): for dtype in dtypes for padding in ["VALID", "SAME"] for rng_factory in [jtu.rand_default])) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testReduceWindowGrad(self, op, init_val, dtype, padding, rng_factory): rng = rng_factory() tol = {onp.float16: 1e-1, onp.float32: 1e-3} @@ -2970,6 +2973,7 @@ def fun(operand): for dtype in float_dtypes for padding in ["VALID", "SAME"] for rng_factory in [jtu.rand_small])) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testSelectAndGatherAdd(self, dtype, padding, rng_factory): if jtu.device_under_test() == "tpu" and dtype == dtypes.bfloat16: raise SkipTest("bfloat16 _select_and_gather_add doesn't work on tpu") diff --git a/tests/linalg_test.py b/tests/linalg_test.py index e40b90b729a9..48247569ad7a 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -17,6 +17,7 @@ from functools import partial import itertools import unittest +import sys import numpy as onp import scipy as osp @@ -51,6 +52,10 @@ def _skip_if_unsupported_type(dtype): dtype in (onp.dtype('float64'), onp.dtype('complex128'))): raise unittest.SkipTest("--jax_enable_x64 is not set") +# TODO(phawkins): bug https://github.com/google/jax/issues/2166 +def _skip_on_mac_xla_bug(): + if sys.platform == "darwin" and osp.version.version > "1.0.0": + raise unittest.SkipTest("Test fails on Mac with new scipy (issue #2166)") class NumpyLinalgTest(jtu.JaxTestCase): @@ -134,6 +139,7 @@ def testSlogdet(self, shape, dtype, rng_factory): for dtype in float_types for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testSlogdetGrad(self, shape, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) @@ -188,6 +194,8 @@ def norm(x): def testEigvals(self, shape, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) + if shape == (50, 50) and dtype == onp.complex64: + _skip_on_mac_xla_bug() n = shape[-1] args_maker = lambda: [rng(shape, dtype)] a, = args_maker() @@ -565,6 +573,8 @@ def testSolve(self, lhs_shape, rhs_shape, dtype, rng_factory): def testInv(self, shape, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) + if shape == (200, 200) and dtype == onp.float32: + _skip_on_mac_xla_bug() if jtu.device_under_test() == "gpu" and shape == (200, 200): raise unittest.SkipTest("Test is flaky on GPU") @@ -594,6 +604,8 @@ def args_maker(): def testPinv(self, shape, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) + if shape == (7, 10000) and dtype in [onp.complex64, onp.float32]: + _skip_on_mac_xla_bug() args_maker = lambda: [rng(shape, dtype)] self._CheckAgainstNumpy(onp.linalg.pinv, np.linalg.pinv, args_maker, @@ -650,6 +662,7 @@ def test(x): xc = onp.eye(3, dtype=onp.complex) self.assertAllClose(xc, grad_test_jc(xc), check_dtypes=True) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testIssue1151(self): A = np.array(onp.random.randn(100, 3, 3), dtype=np.float32) b = np.array(onp.random.randn(100, 3), dtype=np.float32) @@ -661,6 +674,7 @@ def testIssue1151(self): jac0 = jax.jacobian(np.linalg.solve, argnums=0)(A[0], b[0]) jac1 = jax.jacobian(np.linalg.solve, argnums=1)(A[0], b[0]) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testIssue1383(self): seed = jax.random.PRNGKey(0) tmp = jax.random.uniform(seed, (2,2)) @@ -726,6 +740,7 @@ def testLuOfSingularMatrix(self): for dtype in float_types + complex_types for rng_factory in [jtu.rand_default])) @jtu.skip_on_devices("tpu") # TODO(phawkins): precision problems on TPU. + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testLuGrad(self, shape, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) @@ -764,6 +779,8 @@ def testLuBatching(self, shape, dtype, rng_factory): def testLuFactor(self, n, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) + if n == 200 and dtype == onp.complex64: + _skip_on_mac_xla_bug() args_maker = lambda: [rng((n, n), dtype)] x, = args_maker() @@ -985,6 +1002,8 @@ def testTriangularSolveGradPrecision(self): def testExpm(self, n, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) + if n == 50 and dtype in [onp.complex64, onp.float32]: + _skip_on_mac_xla_bug() args_maker = lambda: [rng((n, n), dtype)] osp_fun = lambda a: osp.linalg.expm(a) diff --git a/tests/nn_test.py b/tests/nn_test.py index 0d6bf3add13e..b621f66307db 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -34,6 +34,7 @@ class NNFunctionsTest(jtu.JaxTestCase): + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testSoftplusGrad(self): check_grads(nn.softplus, (1e-8,), 4, rtol=1e-2 if jtu.device_under_test() == "tpu" else None) @@ -42,6 +43,7 @@ def testSoftplusValue(self): val = nn.softplus(89.) self.assertAllClose(val, 89., check_dtypes=False) + @jtu.skip_on_flag("jax_skip_slow_tests", True) def testEluGrad(self): check_grads(nn.elu, (1e4,), 4, eps=1.) From b2ef5bc09552e8ed39759df4ff49ea97e32db708 Mon Sep 17 00:00:00 2001 From: Pavel Sountsov <43966695+SiegeLordEx@users.noreply.github.com> Date: Wed, 5 Feb 2020 10:10:33 -0800 Subject: [PATCH 0709/1053] Canonicalize the shape in the wrapper functions in random.py. (#2165) * Canonicalize the shape in the wrapper functions in random.py. This lets the user be more sloppy in using numpy arrays and statically known DeviceArrays for shapes, and still hit the jit cache. When they are not, the error is improved. * Fix some errors. * No need for the Poly workaround. * Bypass canonicalization for None shapes in random.py. --- jax/abstract_arrays.py | 25 +++++++++++++++++++++---- jax/lax/lax.py | 36 ++++++------------------------------ jax/random.py | 23 +++++++++++++++++++++++ tests/random_test.py | 2 +- 4 files changed, 51 insertions(+), 35 deletions(-) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index 14e6699bad57..e9b0a7b6e844 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -101,9 +101,26 @@ def _canonicalize_dimension(dim): else: return operator.index(dim) -def _canonicalize_shape(shape): - """Ensure shape is a tuple of int or registered _DIMENSION_TYPES.""" - return tuple(map(_canonicalize_dimension, shape)) +def canonicalize_shape(shape): + """Canonicalizes and checks for errors in a user-provided shape value. + + Args: + shape: a Python value that represents a shape. + + Returns: + A tuple of integers. + """ + try: + return tuple(map(_canonicalize_dimension, shape)) + except TypeError: + pass + msg = ("Shapes must be 1D sequences of concrete values of integer type, " + "got {}.") + if any(isinstance(x, core.Tracer) and isinstance(core.get_aval(x), ShapedArray) + and not isinstance(core.get_aval(x), ConcreteArray) for x in shape): + msg += ("\nIf using `jit`, try using `static_argnums` or applying `jit` to " + "smaller subfunctions.") + raise TypeError(msg.format(shape)) class ShapedArray(UnshapedArray): @@ -112,7 +129,7 @@ class ShapedArray(UnshapedArray): def __init__(self, shape, dtype, weak_type=False): super(ShapedArray, self).__init__(dtype, weak_type=weak_type) - self.shape = _canonicalize_shape(shape) + self.shape = canonicalize_shape(shape) ndim = property(lambda self: len(self.shape)) size = property(lambda self: prod(self.shape)) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index f8263a3d1e36..8c3b4ea4a3fe 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -37,7 +37,7 @@ from ..core import Primitive from ..abstract_arrays import (UnshapedArray, ShapedArray, ConcreteArray, AbstractToken, array_types, make_shaped_array, - raise_to_shaped, abstract_token) + raise_to_shaped, abstract_token, canonicalize_shape) from ..interpreters import partial_eval as pe from ..interpreters import xla from ..interpreters import pxla @@ -72,30 +72,6 @@ def broadcast_shapes(*shapes): .format(tuple(map(tuple, shapes)))) return tuple(result_shape) -def _canonicalize_shape(shape): - """Canonicalizes and checks for errors in a user-provided shape value. - - Args: - shape: a Python value that represents a shape. - - Returns: - A tuple of integers. - """ - # TODO(mattjj): this next check is a temporary workaround for masking - if (type(shape) is tuple and masking.is_polymorphic(shape)): - return shape - try: - return tuple(map(operator.index, shape)) - except TypeError: - pass - msg = ("Shapes must be 1D sequences of concrete values of integer type, " - "got {}.") - if any(isinstance(x, core.Tracer) and isinstance(core.get_aval(x), ShapedArray) - and not isinstance(core.get_aval(x), ConcreteArray) for x in shape): - msg += ("\nIf using `jit`, try using `static_argnums` or applying `jit` to " - "smaller subfunctions.") - raise TypeError(msg.format(shape)) - def _identity(x): return x ### traceables @@ -651,7 +627,7 @@ def reshape(operand, new_sizes, dimensions=None): `_ operator. """ - new_sizes = _canonicalize_shape(new_sizes) # TODO + new_sizes = canonicalize_shape(new_sizes) # TODO new_sizes = tuple(new_sizes) same_shape = onp.shape(operand) == new_sizes same_dims = dimensions is None or tuple(dimensions) == tuple(range(onp.ndim(operand))) @@ -759,7 +735,7 @@ def gather(operand, start_indices, dimension_numbers, slice_sizes): """ return gather_p.bind( operand, start_indices, dimension_numbers=dimension_numbers, - slice_sizes=_canonicalize_shape(slice_sizes), operand_shape=operand.shape) + slice_sizes=canonicalize_shape(slice_sizes), operand_shape=operand.shape) def scatter_add(operand, scatter_indices, updates, dimension_numbers): """Scatter-add operator. @@ -1074,7 +1050,7 @@ def full(shape, fill_value, dtype=None): dtype: the type of the output array, or `None`. If not `None`, `fill_value` will be cast to `dtype`. """ - shape = _canonicalize_shape(shape) + shape = canonicalize_shape(shape) if onp.shape(fill_value): msg = "full must be called with scalar fill_value, got fill_value.shape {}." raise TypeError(msg.format(onp.shape(fill_value))) @@ -1097,7 +1073,7 @@ def iota(dtype, size): def broadcasted_iota(dtype, shape, dimension): """Convenience wrapper around ``iota``.""" dtype = dtypes.canonicalize_dtype(dtype) - shape = _canonicalize_shape(shape) + shape = canonicalize_shape(shape) dimension = int(dimension) return broadcast_in_dim(iota(dtype, shape[dimension]), shape, [dimension]) @@ -1324,7 +1300,7 @@ def full_like(x, fill_value, dtype=None, shape=None): An ndarray with the same shape as `x` with its entries set equal to `fill_value`, similar to the output of np.full. """ - shape = onp.shape(x) if shape is None else _canonicalize_shape(shape) + shape = onp.shape(x) if shape is None else canonicalize_shape(shape) fill_value = tie_in(x, fill_value) return full(shape, fill_value, dtype or _dtype(x)) diff --git a/jax/random.py b/jax/random.py index abc9b198416d..1c633e75b21f 100644 --- a/jax/random.py +++ b/jax/random.py @@ -318,6 +318,7 @@ def uniform(key, shape=(), dtype=onp.float64, minval=0., maxval=1.): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _uniform(key, shape, dtype, minval, maxval) @partial(jit, static_argnums=(1, 2)) @@ -366,6 +367,7 @@ def randint(key, shape, minval, maxval, dtype=onp.int64): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _randint(key, shape, minval, maxval, dtype) @partial(jit, static_argnums=(1, 4)) @@ -464,6 +466,7 @@ def normal(key, shape=(), dtype=onp.float64): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _normal(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -497,6 +500,8 @@ def multivariate_normal(key, mean, cov, shape=None, dtype=onp.float64): ``broadcast_shapes(mean.shape[:-1], cov.shape[:-2]) + mean.shape[-1:]``. """ dtype = dtypes.canonicalize_dtype(dtype) + if shape is not None: + shape = abstract_arrays.canonicalize_shape(shape) return _multivariate_normal(key, mean, cov, shape, dtype) @partial(jit, static_argnums=(3, 4)) @@ -544,6 +549,8 @@ def truncated_normal(key, lower, upper, shape=None, dtype=onp.float64): ``shape`` is not None, or else by broadcasting ``lower`` and ``upper``. """ dtype = dtypes.canonicalize_dtype(dtype) + if shape is not None: + shape = abstract_arrays.canonicalize_shape(shape) return _truncated_normal(key, lower, upper, shape, dtype) @partial(jit, static_argnums=(3, 4)) @@ -578,6 +585,8 @@ def bernoulli(key, p=onp.float32(0.5), shape=None): is not None, or else ``p.shape``. """ dtype = dtypes.canonicalize_dtype(lax.dtype(p)) + if shape is not None: + shape = abstract_arrays.canonicalize_shape(shape) if not np.issubdtype(dtype, onp.floating): msg = "bernoulli probability `p` must have a floating dtype, got {}." raise TypeError(msg.format(dtype)) @@ -614,6 +623,8 @@ def beta(key, a, b, shape=None, dtype=onp.float64): ``shape`` is not None, or else by broadcasting ``a`` and ``b``. """ dtype = dtypes.canonicalize_dtype(dtype) + if shape is not None: + shape = abstract_arrays.canonicalize_shape(shape) return _beta(key, a, b, shape, dtype) def _beta(key, a, b, shape, dtype): @@ -646,6 +657,7 @@ def cauchy(key, shape=(), dtype=onp.float64): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _cauchy(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -677,6 +689,8 @@ def dirichlet(key, alpha, shape=None, dtype=onp.float64): ``alpha.shape``. """ dtype = dtypes.canonicalize_dtype(dtype) + if shape is not None: + shape = abstract_arrays.canonicalize_shape(shape) return _dirichlet(key, alpha, shape, dtype) @partial(jit, static_argnums=(2, 3)) @@ -709,6 +723,7 @@ def exponential(key, shape=(), dtype=onp.float64): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _exponential(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -933,6 +948,8 @@ def gamma(key, a, shape=None, dtype=onp.float64): ``shape`` is not None, or else by ``a.shape``. """ dtype = dtypes.canonicalize_dtype(dtype) + if shape is not None: + shape = abstract_arrays.canonicalize_shape(shape) return _gamma(key, a, shape, dtype) @partial(jit, static_argnums=(2, 3)) @@ -962,6 +979,7 @@ def gumbel(key, shape=(), dtype=onp.float64): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _gumbel(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -1013,6 +1031,7 @@ def laplace(key, shape=(), dtype=onp.float64): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _laplace(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -1037,6 +1056,7 @@ def logistic(key, shape=(), dtype=onp.float64): A random array with the specified shape and dtype. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _logistic(key, shape, dtype) @partial(jit, static_argnums=(1, 2)) @@ -1063,6 +1083,8 @@ def pareto(key, b, shape=None, dtype=onp.float64): ``shape`` is not None, or else by ``b.shape``. """ dtype = dtypes.canonicalize_dtype(dtype) + if shape is not None: + shape = abstract_arrays.canonicalize_shape(shape) return _pareto(key, b, shape, dtype) @partial(jit, static_argnums=(2, 3)) @@ -1095,6 +1117,7 @@ def t(key, df, shape=(), dtype=onp.float64): ``shape`` is not None, or else by ``df.shape``. """ dtype = dtypes.canonicalize_dtype(dtype) + shape = abstract_arrays.canonicalize_shape(shape) return _t(key, df, shape, dtype) @partial(jit, static_argnums=(2, 3)) diff --git a/tests/random_test.py b/tests/random_test.py index 090d8d247345..7b7e1f3f547b 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -494,7 +494,7 @@ def feature_map(n, d, sigma=1.0, seed=123): phi = lambda x, t: np.sqrt(2.0 / d) * np.cos(np.matmul(W, x) + w*t + b) return phi - self.assertRaisesRegex(ValueError, '.*requires a concrete.*', + self.assertRaisesRegex(TypeError, 'Shapes must be 1D.*', lambda: feature_map(5, 3)) def testIssue756(self): From 13316f35705fee2f43376655313e698b52d1965f Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 5 Feb 2020 14:42:47 -0800 Subject: [PATCH 0710/1053] Fix type error in partial_eval.py. (#2171) --- jax/interpreters/partial_eval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index d71b1391451b..e7c21acf3f2c 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -214,8 +214,8 @@ def todo(x): out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] params = params.copy() - params["mapped_invars"] = tuple([True] * len(const_tracers), - [False] * len(env)) + params["mapped_invars"] = tuple(([True] * len(const_tracers) + + [False] * len(env))) env_tracers = map(trace.full_raise, env) eqn = new_eqn_recipe(it.chain(const_tracers, env_tracers), out_tracers, map_primitive, params, From ae3003e9d42a8df41d6d8bbd62c0ba2b4c2c13ce Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 3 Feb 2020 20:58:56 +0100 Subject: [PATCH 0711/1053] Simplify bound_subjaxprs. Before, bound_subjaxprs was a tuple (0 or 1 values) of a pair of a Jaxpr and its constant values. Now we close up all such Jaxprs such that they do not take constvars and their constant values are part of the arguments. We also rename bound_subjaxprs to bound_subjaxpr (an optional Jaxpr) This is first part of a simplification. In a subsequent PR I will move the bound_subjaxpr into params, as for most higher-order primitives. --- jax/core.py | 24 ++++++------ jax/experimental/loops.py | 2 +- jax/interpreters/ad.py | 33 ++++++++--------- jax/interpreters/partial_eval.py | 63 +++++++++++++------------------- jax/interpreters/xla.py | 26 ++++++------- jax/lax/lax_control_flow.py | 4 +- jax/test_util.py | 5 ++- tests/api_test.py | 6 +-- 8 files changed, 73 insertions(+), 90 deletions(-) diff --git a/jax/core.py b/jax/core.py index 20b1f8e3e63f..a03d087b0e3e 100644 --- a/jax/core.py +++ b/jax/core.py @@ -85,7 +85,7 @@ def jaxpr_as_fun(typed_jaxpr, *args): JaxprEqn = namedtuple('JaxprEqn', ['invars', 'outvars', 'primitive', - 'bound_subjaxprs', 'params']) + 'bound_subjaxpr', 'params']) JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn)).rstrip() new_jaxpr_eqn = JaxprEqn @@ -210,10 +210,10 @@ def write(v, val): map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: in_vals = map(read, eqn.invars) - subfuns = [partial(eval_jaxpr, subjaxpr, map(read, const_bindings)) - for subjaxpr, const_bindings - in eqn.bound_subjaxprs] - subfuns = map(lu.wrap_init, subfuns) + if eqn.bound_subjaxpr: + subfuns = [lu.wrap_init(partial(eval_jaxpr, eqn.bound_subjaxpr, ()))] + else: + subfuns = [] ans = eqn.primitive.bind(*(subfuns + in_vals), **eqn.params) if eqn.primitive.multiple_results: map(write, eqn.outvars, ans) @@ -647,9 +647,8 @@ def write_env(env, v): map(write, jaxpr.invars) for eqn in jaxpr.eqns: map(read, eqn.invars) - for subjaxpr, constvars in eqn.bound_subjaxprs: - map(read, constvars) - check_jaxpr(subjaxpr) + if eqn.bound_subjaxpr: + check_jaxpr(eqn.bound_subjaxpr) map(write, eqn.outvars) map(read, jaxpr.outvars) @@ -665,11 +664,10 @@ def pp_eqn_compact(primitive_name, params): def pp_eqn(eqn): lhs = pp_vars(eqn.outvars) pp_subexpr = pp('') - if eqn.bound_subjaxprs: - for subjaxpr, const_vars in eqn.bound_subjaxprs: - pp_subexpr = pp_subexpr + ( - pp_jaxpr(subjaxpr).indent(2) - >> pp(' [ {} ]'.format(pp_vars(const_vars)))) + if eqn.bound_subjaxpr: + pp_subexpr = pp_subexpr + ( + pp_jaxpr(eqn.bound_subjaxpr).indent(2) + >> pp(' [ ]')) return (pp('{} = '.format(lhs)) >> pp(eqn.primitive.name) >> pp_kv_pairs(sorted(eqn.params.items())) >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index da9e304135e8..7dad9b08177e 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -430,7 +430,7 @@ def trace_to_jaxpr_finalize(in_tracers, out_tracers, trace, instantiate=True): in_pvals = [t.pval for t in in_tracers] in_avals = tuple(safe_map(abstract_arrays.raise_to_shaped, unzip2(in_pvals)[0])) - typed_jaxpr = core.TypedJaxpr(pe.closure_convert_jaxpr(jaxpr), + typed_jaxpr = core.TypedJaxpr(pe.convert_constvars_jaxpr(jaxpr), (), const_avals + in_avals, out_avals) return typed_jaxpr, consts diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 6acec22acd17..57750e458e68 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -172,7 +172,7 @@ def is_linear(var): linear_eqns = [] for eqn in jaxpr.eqns: - if not eqn.bound_subjaxprs: + if not eqn.bound_subjaxpr: if any(is_linear(v) for v in eqn.invars): linear_eqns.append(eqn) else: @@ -183,13 +183,12 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - (subjaxpr, const_vars), = eqn.bound_subjaxprs - assert not any(is_linear(v) for v in const_vars) + subjaxpr = eqn.bound_subjaxpr if any(is_linear(v) for v in eqn.invars): linear_eqns.append(eqn) elif eqn.primitive is not pe.remat_call_p: ans = _eval_subjaxpr_primals( - eqn.primitive, subjaxpr, map(read_primal, const_vars), + eqn.primitive, subjaxpr, map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) @@ -197,7 +196,7 @@ def is_linear(var): # nonlinear, so we always evaluate it even if it has a linear part if eqn.primitive is pe.remat_call_p: ans = _eval_subjaxpr_primals( - eqn.primitive, subjaxpr, map(read_primal, const_vars), + eqn.primitive, subjaxpr, map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) @@ -209,11 +208,11 @@ def is_linear(var): cts_in = map(read_cotangent, eqn.outvars) else: cts_in, = map(read_cotangent, eqn.outvars) - if eqn.bound_subjaxprs: - (subjaxpr, const_vars), = eqn.bound_subjaxprs - sub_consts = map(read_primal, const_vars) + if eqn.bound_subjaxpr: + subjaxpr = eqn.bound_subjaxpr + # TODO(necula): clean this transpose cts_out = get_primitive_transpose(eqn.primitive)( - eqn.params, subjaxpr, sub_consts, invals, cts_in) + eqn.params, subjaxpr, (), invals, cts_in) else: cts_out = get_primitive_transpose(eqn.primitive)(cts_in, *invals, **eqn.params) cts_out = [zero] * len(eqn.invars) if cts_out is zero else cts_out @@ -222,14 +221,15 @@ def is_linear(var): cotangents_out = map(read_cotangent, jaxpr.invars) return cotangents_out -def _eval_subjaxpr_primals(prim, jaxpr, consts, in_vals, params): - all_args, in_tree_def = tree_flatten((consts, in_vals)) +def _eval_subjaxpr_primals(prim, jaxpr, in_vals, params): + assert not jaxpr.constvars + all_args, in_tree_def = tree_flatten((in_vals,)) fun = lu.hashable_partial(lu.wrap_init(_eval_primals), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) out_flat = prim.bind(fun, *all_args, **params) return tree_unflatten(out_tree(), out_flat) -def _eval_primals(jaxpr, consts, args): +def _eval_primals(jaxpr, args): primal_env = {} def read_primal(v): @@ -249,10 +249,10 @@ def is_linear(var): return primal_env.get(var, undefined_primal) is undefined_primal write_primal(core.unitvar, core.unit) - map(write_primal, jaxpr.constvars, consts) + assert not jaxpr.constvars map(write_primal, jaxpr.invars, args) for eqn in jaxpr.eqns: - if not eqn.bound_subjaxprs: + if not eqn.bound_subjaxpr: if not any(is_linear(v) for v in eqn.invars): in_vals = map(read_primal, eqn.invars) ans = eqn.primitive.bind(*in_vals, **eqn.params) @@ -261,12 +261,11 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - (subjaxpr, const_vars), = eqn.bound_subjaxprs - assert not any(is_linear(v) for v in const_vars) + subjaxpr = eqn.bound_subjaxpr if (eqn.primitive is pe.remat_call_p or not any(is_linear(v) for v in eqn.invars)): ans = _eval_subjaxpr_primals( - eqn.primitive, subjaxpr, map(read_primal, const_vars), + eqn.primitive, subjaxpr, map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) return map(read_primal, jaxpr.outvars) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index e7c21acf3f2c..75b6c894d376 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -133,13 +133,13 @@ def process_call(self, call_primitive, f, tracers, params): env_tracers = map(self.full_raise, env) out_pv_consts, consts = split_list(out_flat, [len(out_flat)-len(jaxpr.constvars)]) const_tracers = map(self.new_instantiated_const, consts) + lifted_jaxpr = convert_constvars_jaxpr(jaxpr) out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] # The `jaxpr` already contains the env_vars at start of invars - eqn = new_eqn_recipe(tuple(it.chain(env_tracers, tracers)), + eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers, tracers)), out_tracers, call_primitive, params, - subjaxpr=jaxpr, - subjaxpr_const_tracers=const_tracers) + subjaxpr=lifted_jaxpr) for t in out_tracers: t.recipe = eqn return out_tracers @@ -155,7 +155,7 @@ def process_map(self, map_primitive, f, tracers, params): for pv in out_pvs_reduced] const_tracers = map(self.new_instantiated_const, consts) env_tracers = map(self.full_raise, env) - lifted_jaxpr = closure_convert_jaxpr(jaxpr) + lifted_jaxpr = convert_constvars_jaxpr(jaxpr) out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] # The `jaxpr` already contains the env_vars at start of invars @@ -165,8 +165,7 @@ def process_map(self, map_primitive, f, tracers, params): [True] * len(tracers)) eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers, tracers)), out_tracers, map_primitive, params, - subjaxpr=lifted_jaxpr, - subjaxpr_const_tracers=()) + subjaxpr=lifted_jaxpr) for t in out_tracers: t.recipe = eqn return out_tracers @@ -185,12 +184,13 @@ def todo(x): trace = JaxprTrace(master, core.cur_sublevel()) const_tracers = map(trace.new_instantiated_const, consts) env_tracers = map(trace.full_raise, env) + lifted_jaxpr = convert_constvars_jaxpr(jaxpr) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] # The `jaxpr` already contains the env_vars at start of invars - eqn = new_eqn_recipe(env_tracers, out_tracers, call_primitive, params, - subjaxpr=jaxpr, - subjaxpr_const_tracers=const_tracers) + eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers)), + out_tracers, call_primitive, params, + subjaxpr=lifted_jaxpr) for t in out_tracers: t.recipe = eqn return out_tracers @@ -210,7 +210,7 @@ def todo(x): trace = JaxprTrace(master, core.cur_sublevel()) const_tracers = map(trace.new_instantiated_const, consts) # The `jaxpr` already contains the env_vars at start of invars - lifted_jaxpr = closure_convert_jaxpr(jaxpr) + lifted_jaxpr = convert_constvars_jaxpr(jaxpr) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] params = params.copy() @@ -219,8 +219,7 @@ def todo(x): env_tracers = map(trace.full_raise, env) eqn = new_eqn_recipe(it.chain(const_tracers, env_tracers), out_tracers, map_primitive, params, - subjaxpr=lifted_jaxpr, - subjaxpr_const_tracers=()) + subjaxpr=lifted_jaxpr) for t in out_tracers: t.recipe = eqn return out_tracers @@ -301,7 +300,7 @@ def aval(self): @property def parents(self): if isinstance(self.recipe, JaxprEqnRecipe): - return eqn_parents(self.recipe) + return self.recipe.invars else: return [] @@ -385,12 +384,11 @@ def instantiate_const_at(trace, instantiate, tracer): LambdaBinding = namedtuple('LambdaBinding', []) JaxprEqnRecipe = namedtuple('JaxprEqnRecipe', ['eqn_id', 'invars', 'outvars', 'primitive', - 'bound_subjaxprs', 'params']) + 'bound_subjaxpr', 'params']) def new_eqn_recipe(invars, outvars, primitive, params, - subjaxpr=None, - subjaxpr_const_tracers=()): + subjaxpr=None): """Constructs a new JaxEqnRecipe. Params: @@ -400,28 +398,23 @@ def new_eqn_recipe(invars, outvars, primitive, params, params: the primitive params subjaxpr: (optional) a sub-Jaxpr, used only for `xla_call` or `xla_pmap`. If present, then `subjaxpr.invars` correspond to `invars. - Also, `subjaxpr.constvars` correspond to `subjaxpr_const_tracers`. - subjaxpr_const_tracers: The constant tracers for `subjaxpr`. Must be () - if not `subjaxpr`. """ if subjaxpr is not None: - assert len(subjaxpr.constvars) == len(subjaxpr_const_tracers) + assert len(subjaxpr.constvars) == 0 assert len(subjaxpr.invars) == len(tuple(invars)) - bound_subjaxprs = ((subjaxpr, subjaxpr_const_tracers),) + bound_subjaxpr = subjaxpr else: - bound_subjaxprs = () + bound_subjaxpr = None return JaxprEqnRecipe(object(), tuple(invars), map(ref, outvars), primitive, - bound_subjaxprs, params) + bound_subjaxpr, params) def recipe_to_eqn(unused_var, getvar, recipe): - _, in_tracers, out_tracer_refs, primitive, bound_subjaxprs, params = recipe + _, in_tracers, out_tracer_refs, primitive, bound_subjaxpr, params = recipe out_tracers = [t_ref() for t_ref in out_tracer_refs] invars = [getvar(t) for t in in_tracers] outvars = [unused_var() if t is None else getvar(t) for t in out_tracers] - new_bound_subjaxprs = [(j, map(getvar, c)) - for j, c in bound_subjaxprs] - return new_jaxpr_eqn(invars, outvars, primitive, new_bound_subjaxprs, params) + return new_jaxpr_eqn(invars, outvars, primitive, bound_subjaxpr, params) def tracers_to_jaxpr(in_tracers, out_tracers): """Constructs Jaxpr given tracers for inputs and outputs. @@ -473,12 +466,7 @@ def tracers_to_jaxpr(in_tracers, out_tracers): core.skip_checks or core.check_jaxpr(jaxpr) return jaxpr, const_vals, env_vals - -def eqn_parents(eqn): - subjaxpr_tracers = [c for _, c in eqn.bound_subjaxprs] - return list(it.chain(eqn.invars, *subjaxpr_tracers)) - -def closure_convert_jaxpr(jaxpr): +def convert_constvars_jaxpr(jaxpr): """Moves the constvars to the start of invars.""" core.skip_checks or core.check_jaxpr(jaxpr) lifted_jaxpr = Jaxpr(constvars=(), @@ -509,7 +497,7 @@ def fun(*vals): # jaxpr_1 :: a1 -> [b1, res] # jaxpr_2 :: res | a2 -> b2 # jaxpr_2 :: [a2, res] -> b2 - jaxpr_2 = closure_convert_jaxpr(jaxpr_2) + jaxpr_2 = convert_constvars_jaxpr(jaxpr_2) jaxpr_2.invars = jaxpr_2.invars[num_res:] + jaxpr_2.invars[:num_res] uk_out = [pv is not None for pv in out_pvs_2] @@ -602,11 +590,12 @@ def _remat_partial_eval(trace, f, tracers, params): # Now that we have out_pvals, the rest is just like JaxprTrace.process_call. instantiated_tracers = env + instantiated_tracers const_tracers = map(trace.new_instantiated_const, consts) + lifted_jaxpr = convert_constvars_jaxpr(typed_jaxpr.jaxpr) out_tracers = [JaxprTracer(trace, out_pval, None) for out_pval in out_pvals] - eqn = new_eqn_recipe(instantiated_tracers, out_tracers, remat_call_p, + eqn = new_eqn_recipe(tuple(it.chain(const_tracers, instantiated_tracers)), + out_tracers, remat_call_p, params, - subjaxpr=typed_jaxpr.jaxpr, - subjaxpr_const_tracers=const_tracers) + subjaxpr=lifted_jaxpr) for t in out_tracers: t.recipe = eqn return out_tracers call_partial_eval_rules[remat_call_p] = _remat_partial_eval diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 8216ca1b693b..164fa99cb470 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -268,9 +268,8 @@ def jaxpr_literals(jaxpr): return it.chain.from_iterable(eqn_literals(eqn) for eqn in jaxpr.eqns) def eqn_literals(eqn): - if eqn.bound_subjaxprs: - (subjaxpr, _), = eqn.bound_subjaxprs - for literal in jaxpr_literals(subjaxpr): + if eqn.bound_subjaxpr: + for literal in jaxpr_literals(eqn.bound_subjaxpr): yield literal if eqn.primitive in initial_style_translations: for param in eqn.params.values(): @@ -322,10 +321,10 @@ def write(v, node): ans = rule(c, *in_nodes, replica_groups=replica_groups, **new_params) elif eqn.primitive in call_translations: new_params = check_backend_params(eqn.params, backend) - (subjaxpr, const_bindings), = eqn.bound_subjaxprs - const_nodes = _map(read, const_bindings) + const_nodes = () # _map(read, const_bindings) + # TODO(necula): clean this rule = call_translations[eqn.primitive] - ans = rule(c, subjaxpr, axis_env, const_nodes, in_nodes, + ans = rule(c, eqn.bound_subjaxpr, axis_env, const_nodes, in_nodes, name_stack, backend=backend, **new_params) else: msg = "XLA translation rule for primitive '{}' not found" @@ -387,9 +386,8 @@ def jaxpr_replicas(jaxpr): return max(it.chain([1], (eqn_replicas(eqn) for eqn in jaxpr.eqns))) def eqn_replicas(eqn): - if eqn.bound_subjaxprs: - (subjaxpr, _), = eqn.bound_subjaxprs - return eqn.params.get('axis_size', 1) * jaxpr_replicas(subjaxpr) + if eqn.bound_subjaxpr: + return eqn.params.get('axis_size', 1) * jaxpr_replicas(eqn.bound_subjaxpr) elif eqn.primitive in initial_style_translations: nums = (jaxpr_replicas(param if type(param) is core.Jaxpr else param.jaxpr) for param in eqn.params.values() @@ -405,9 +403,8 @@ def jaxpr_has_pmap(jaxpr): return any(eqn_has_pmap(eqn) for eqn in jaxpr.eqns) def eqn_has_pmap(eqn): - if eqn.bound_subjaxprs: - (subjaxpr, _), = eqn.bound_subjaxprs - return jaxpr_has_pmap(subjaxpr) + if eqn.bound_subjaxpr: + return jaxpr_has_pmap(eqn.bound_subjaxpr) elif eqn.primitive in initial_style_translations: return any(jaxpr_has_pmap(param if type(param) is core.Jaxpr else param.jaxpr) for param in eqn.params.values() @@ -420,9 +417,8 @@ def jaxpr_collectives(jaxpr): return it.chain.from_iterable(eqn_collectives(eqn) for eqn in jaxpr.eqns) def eqn_collectives(eqn): - if eqn.bound_subjaxprs: - (subjaxpr, _), = eqn.bound_subjaxprs - for c in jaxpr_collectives(subjaxpr): + if eqn.bound_subjaxpr: + for c in jaxpr_collectives(eqn.bound_subjaxpr): yield c elif eqn.primitive in initial_style_translations: for param in eqn.params.values(): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index e13d7f06750d..08d051ce0543 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -58,7 +58,7 @@ def _initial_style_jaxpr(fun, in_tree, in_avals): stage_out_calls=True) out_avals = _map(raise_to_shaped, unzip2(out_pvals)[0]) const_avals = tuple(raise_to_shaped(core.get_aval(c)) for c in consts) - typed_jaxpr = core.TypedJaxpr(pe.closure_convert_jaxpr(jaxpr), + typed_jaxpr = core.TypedJaxpr(pe.convert_constvars_jaxpr(jaxpr), (), const_avals + in_avals, out_avals) return typed_jaxpr, consts, out_tree() @@ -940,7 +940,7 @@ def _scan_partial_eval(trace, *tracers, **kwargs): const_avals_1 = [raise_to_shaped(core.get_aval(c)) for c in consts_1] in_avals_1 = [core.abstract_unit] * num_consts + jaxpr_1.in_avals[num_consts:] out_avals_1 = [core.abstract_unit if pv is None else pv for pv, c in out_pvals_1] - jaxpr_1_opt = pe.TypedJaxpr(pe.closure_convert_jaxpr(untyped_jaxpr_1), + jaxpr_1_opt = pe.TypedJaxpr(pe.convert_constvars_jaxpr(untyped_jaxpr_1), (), const_avals_1 + in_avals_1, out_avals_1) num_consts_1 = num_consts + len(consts_1) # any now-known residuals are intensive, so we want to revise jaxpr_2 to take diff --git a/jax/test_util.py b/jax/test_util.py index fee9c33b2cfd..c2234047e8fa 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -606,10 +606,11 @@ def check_raises_regexp(thunk, err_type, pattern): def _iter_eqns(jaxpr): + # TODO(necula): why doesn't this search in params? for eqn in jaxpr.eqns: yield eqn - for subjaxpr, _ in eqn.bound_subjaxprs: - for sub_eqn in _iter_eqns(subjaxpr): + if eqn.bound_subjaxpr: + for sub_eqn in _iter_eqns(eqn.bound_subjaxpr): yield sub_eqn def assert_dot_precision(expected_precision, fun, *args): diff --git a/tests/api_test.py b/tests/api_test.py index 0424ce6ac29d..1cb47cc65b83 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1003,8 +1003,8 @@ def f(a, b, c): c = onp.ones((2, 3, 3)) jaxpr = api.make_jaxpr(lambda b, c: f(a, b, c))(b, c) - subjaxpr = next(eqn.bound_subjaxprs[0][0] for eqn in jaxpr.jaxpr.eqns - if eqn.bound_subjaxprs) + subjaxpr = next(eqn.bound_subjaxpr for eqn in jaxpr.jaxpr.eqns + if eqn.bound_subjaxpr) self.assertEqual(len(subjaxpr.eqns), 1) def test_grad_of_int_errors(self): @@ -1683,7 +1683,7 @@ def jaxpr_subcomp_and_collect(c, jaxpr, *args, **kwargs): self.assertLen(outer_jaxpr.eqns, 1) self.assertEqual(outer_jaxpr.eqns[0].primitive.name, 'xla_call') - (subjaxpr_1, _), = outer_jaxpr.eqns[0].bound_subjaxprs + subjaxpr_1 = outer_jaxpr.eqns[0].bound_subjaxpr self.assertEqual(str(subjaxpr_1), str(inner_jaxpr)) self.assertLen(inner_jaxpr.eqns, 2) self.assertEqual(inner_jaxpr.eqns[0].primitive.name, 'mul') From 2d3cde3fdd093cb0654384c46248986c8541347d Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 5 Feb 2020 11:08:21 +0100 Subject: [PATCH 0712/1053] Simplify the translation rules to not take constant values --- jax/interpreters/ad.py | 11 +++++------ jax/interpreters/pxla.py | 4 ++-- jax/interpreters/sharded_jit.py | 7 +++---- jax/interpreters/xla.py | 18 +++++++----------- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 57750e458e68..f6e4b07fc22d 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -210,9 +210,8 @@ def is_linear(var): cts_in, = map(read_cotangent, eqn.outvars) if eqn.bound_subjaxpr: subjaxpr = eqn.bound_subjaxpr - # TODO(necula): clean this transpose cts_out = get_primitive_transpose(eqn.primitive)( - eqn.params, subjaxpr, (), invals, cts_in) + eqn.params, subjaxpr, invals, cts_in) else: cts_out = get_primitive_transpose(eqn.primitive)(cts_in, *invals, **eqn.params) cts_out = [zero] * len(eqn.invars) if cts_out is zero else cts_out @@ -538,8 +537,8 @@ def traceable(num_primals, in_tree_def, *primals_and_tangents): yield out_flat, tree_def -def call_transpose(primitive, params, jaxpr, consts, args, ct): - all_args, in_tree_def = tree_flatten((consts, args, ct)) +def call_transpose(primitive, params, jaxpr, args, ct): + all_args, in_tree_def = tree_flatten(((), args, ct)) # empty consts fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) params = dict(params, name=wrap_name(params['name'], 'transpose')) @@ -548,8 +547,8 @@ def call_transpose(primitive, params, jaxpr, consts, args, ct): primitive_transposes[core.call_p] = partial(call_transpose, call_p) primitive_transposes[pe.remat_call_p] = partial(call_transpose, pe.remat_call_p) -def map_transpose(primitive, params, jaxpr, consts, args, ct): - all_args, in_tree_def = tree_flatten((consts, args, ct)) +def map_transpose(primitive, params, jaxpr, args, ct): + all_args, in_tree_def = tree_flatten(((), args, ct)) # empty consts fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) params = dict(params, name=wrap_name(params['name'], 'transpose')) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 3afe502a816f..e6c2fa942a75 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -645,7 +645,7 @@ def execute_replicated(compiled, backend, in_handler, out_handler, *args): xla_pmap_p.def_custom_bind(xla_pmap) xla_pmap_p.def_impl(xla_pmap_impl) -def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, +def _pmap_translation_rule(c, jaxpr, axis_env, in_nodes, name_stack, axis_name, axis_size, global_axis_size, devices, name, backend=None, mapped_invars=None): @@ -662,7 +662,7 @@ def _pmap_translation_rule(c, jaxpr, axis_env, const_nodes, for in_node, in_node_mapped in zip(in_nodes, mapped_invars)) sharded_outs = xla.jaxpr_subcomp( - c, jaxpr, backend, new_env, const_nodes, + c, jaxpr, backend, new_env, (), extend_name_stack(name_stack, wrap_name(name, 'pmap')), *in_nodes_sharded) outs = [_xla_unshard(c, new_env, shard) for shard in sharded_outs] return c.Tuple(*outs) diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index a06f15d9f7c4..180758535e27 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -183,10 +183,9 @@ def _sharded_callable(fun, partitions, name, *abstract_args): handle_outs) -def _sharded_jit_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes, +def _sharded_jit_translation_rule(c, jaxpr, axis_env, freevar_nodes, in_nodes, name_stack, partitions, backend, name): subc = xb.make_computation_builder("jaxpr_subcomputation") # TODO(mattjj): name - consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] args = [] @@ -196,14 +195,14 @@ def _sharded_jit_translation_rule(c, jaxpr, axis_env, const_nodes, freevar_nodes subc._builder.ClearSharding() # args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - out_nodes = xla.jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, freevars, name_stack, *args) + out_nodes = xla.jaxpr_subcomp(subc, jaxpr, backend, axis_env, (), freevars, name_stack, *args) subc._builder.SetSharding(_sharding_to_proto(partitions[1])) out_tuple = subc.Tuple(*out_nodes) subc._builder.ClearSharding() subc = subc.Build(out_tuple) - return c.Call(subc, list(const_nodes) + list(freevar_nodes) + list(in_nodes)) + return c.Call(subc, list(freevar_nodes) + list(in_nodes)) def _execute_spatially_partitioned(compiled, in_handler, out_handler, *args): input_bufs = in_handler(args) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 164fa99cb470..2e9bfbd642f5 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -321,10 +321,8 @@ def write(v, node): ans = rule(c, *in_nodes, replica_groups=replica_groups, **new_params) elif eqn.primitive in call_translations: new_params = check_backend_params(eqn.params, backend) - const_nodes = () # _map(read, const_bindings) - # TODO(necula): clean this rule = call_translations[eqn.primitive] - ans = rule(c, eqn.bound_subjaxpr, axis_env, const_nodes, in_nodes, + ans = rule(c, eqn.bound_subjaxpr, axis_env, in_nodes, name_stack, backend=backend, **new_params) else: msg = "XLA translation rule for primitive '{}' not found" @@ -592,16 +590,15 @@ def _get_device(device, backend): xla_call_p.def_custom_bind(xla_call) xla_call_p.def_impl(_xla_call_impl) -def _xla_call_translation_rule(c, jaxpr, axis_env, const_nodes, +def _xla_call_translation_rule(c, jaxpr, axis_env, in_nodes, name_stack, backend, name, device=None): del device # Ignored. subc = xb.make_computation_builder("jit_{}".format(name)) - consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, + out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, (), extend_name_stack(name_stack, wrap_name(name, 'jit')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) - return c.Call(subc, list(const_nodes) + list(in_nodes)) + return c.Call(subc, list(in_nodes)) ad.primitive_transposes[xla_call_p] = partial(ad.call_transpose, xla_call_p) @@ -959,19 +956,18 @@ def _device_put_impl(x, device=None): masking.defvectorized(device_put_p) -def _remat_translation_rule(c, jaxpr, axis_env, const_nodes, in_nodes, +def _remat_translation_rule(c, jaxpr, axis_env, in_nodes, name_stack, backend, name, device=None, concrete=None): # This looks a lot like _xla_call_translation_rule, except for a widget we use # to foil CSE. del device, concrete # Unused. subc = xb.make_computation_builder("remat_call_subcomputation") - consts = [subc.ParameterWithShape(c.GetShape(n)) for n in const_nodes] args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] args = [_foil_cse(subc, x) for x in args] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, consts, + out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, (), extend_name_stack(name_stack, wrap_name(name, 'remat')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) - return c.Call(subc, list(const_nodes) + list(in_nodes)) + return c.Call(subc, list(in_nodes)) call_translations[pe.remat_call_p] = _remat_translation_rule def _foil_cse(c, x): From 0045ed671c384b170666b2240529ebaea1f97ba4 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 5 Feb 2020 13:55:59 +0100 Subject: [PATCH 0713/1053] Fix caching bug. This was a very tricky bug. The compilation caching keys depend on many pieces of the transformation state, including among other things, the pointer-value of the Jaxpr. Since in the previous commit I have added a `convert_constvars_jaxpr` call, every time that one ran, it produces the same semantic Jaxpr but a different pointer value, which was breaking caching. The fix is to cache the `convert_constvars_jaxpr`. --- jax/interpreters/partial_eval.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 75b6c894d376..23df9ad4d2c0 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -25,7 +25,7 @@ from .. import linear_util as lu from ..abstract_arrays import ShapedArray, ConcreteArray, raise_to_shaped from ..util import (unzip2, safe_zip, safe_map, toposort, partial, split_list, - wrap_name) + wrap_name, cache) from ..core import (Trace, Tracer, new_master, Jaxpr, Literal, get_aval, AbstractValue, unit, unitvar, abstract_unit, Primitive, call_p, TypedJaxpr, new_jaxpr_eqn) @@ -466,6 +466,7 @@ def tracers_to_jaxpr(in_tracers, out_tracers): core.skip_checks or core.check_jaxpr(jaxpr) return jaxpr, const_vals, env_vals +@cache() def convert_constvars_jaxpr(jaxpr): """Moves the constvars to the start of invars.""" core.skip_checks or core.check_jaxpr(jaxpr) From bbe31335cd3abc253fe4fc793e297d948f9a458f Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 6 Feb 2020 09:44:34 +0100 Subject: [PATCH 0714/1053] Fixed pytype complaint --- jax/interpreters/partial_eval.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 23df9ad4d2c0..89ebb037e030 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -159,12 +159,12 @@ def process_map(self, map_primitive, f, tracers, params): out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] # The `jaxpr` already contains the env_vars at start of invars - params = params.copy() - params["mapped_invars"] = tuple([True] * len(const_tracers) + - [False] * len(env_tracers) + - [True] * len(tracers)) + new_params = dict(params, + mapped_invars=tuple([True] * len(const_tracers) + + [False] * len(env_tracers) + + [True] * len(tracers))) eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers, tracers)), - out_tracers, map_primitive, params, + out_tracers, map_primitive, new_params, subjaxpr=lifted_jaxpr) for t in out_tracers: t.recipe = eqn @@ -213,12 +213,12 @@ def todo(x): lifted_jaxpr = convert_constvars_jaxpr(jaxpr) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] - params = params.copy() - params["mapped_invars"] = tuple(([True] * len(const_tracers) + - [False] * len(env))) + new_params = dict(params, + mapped_invars=tuple([True] * len(const_tracers) + + [False] * len(env))) env_tracers = map(trace.full_raise, env) eqn = new_eqn_recipe(it.chain(const_tracers, env_tracers), - out_tracers, map_primitive, params, + out_tracers, map_primitive, new_params, subjaxpr=lifted_jaxpr) for t in out_tracers: t.recipe = eqn From 4582e4ed8d9a09748f79f32e54c5e5cd85444f61 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 6 Feb 2020 17:13:37 +0100 Subject: [PATCH 0715/1053] Updates based on code reviews --- tests/linalg_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 48247569ad7a..408c2e27017f 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -52,10 +52,10 @@ def _skip_if_unsupported_type(dtype): dtype in (onp.dtype('float64'), onp.dtype('complex128'))): raise unittest.SkipTest("--jax_enable_x64 is not set") -# TODO(phawkins): bug https://github.com/google/jax/issues/2166 +# TODO(phawkins): bug https://github.com/google/jax/issues/432 def _skip_on_mac_xla_bug(): if sys.platform == "darwin" and osp.version.version > "1.0.0": - raise unittest.SkipTest("Test fails on Mac with new scipy (issue #2166)") + raise unittest.SkipTest("Test fails on Mac with new scipy (issue #432)") class NumpyLinalgTest(jtu.JaxTestCase): From b79c7948eeb7152e27ae05cdd563a2c4555af861 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 6 Feb 2020 17:27:46 +0100 Subject: [PATCH 0716/1053] Removed dependency on distutils.strtobool --- jax/api.py | 5 ++--- jax/config.py | 21 +++++++++++++++++++++ jax/interpreters/xla.py | 7 +++---- jax/numpy/lax_numpy.py | 1 - jax/test_util.py | 5 ++--- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/jax/api.py b/jax/api.py index 96693eeb7e97..8c2498621e47 100644 --- a/jax/api.py +++ b/jax/api.py @@ -34,7 +34,6 @@ import numpy as onp from contextlib import contextmanager -from distutils.util import strtobool from . import core from . import linear_util as lu @@ -60,14 +59,14 @@ from .interpreters import parallel from .interpreters import masking from .interpreters.masking import shapecheck, ensure_poly -from .config import flags, config +from .config import flags, config, bool_env map = safe_map zip = safe_zip FLAGS = flags.FLAGS flags.DEFINE_bool("jax_disable_jit", - strtobool(os.getenv("JAX_DISABLE_JIT", "False")), + bool_env("JAX_DISABLE_JIT", False), "Disable JIT compilation and just call original Python.") diff --git a/jax/config.py b/jax/config.py index 706d6f4a8053..67032670d659 100644 --- a/jax/config.py +++ b/jax/config.py @@ -12,8 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import sys +def bool_env(varname: str, default: bool) -> bool: + """Read an environment variable and interpret it as a boolean. + + True values are (case insensitive): 'y', 'yes', 't', 'true', 'on', and '1'; + false values are 'n', 'no', 'f', 'false', 'off', and '0'. + + Args: + varname: the name of the variable + default: the default boolean value + Raises: ValueError if the environment variable is anything else. + """ + val = os.getenv(varname, str(default)) + val = val.lower() + if val in ('y', 'yes', 't', 'true', 'on', '1'): + return True + elif val in ('n', 'no', 'f', 'false', 'off', '0'): + return False + else: + raise ValueError("invalid truth value %r for environment %r" % (val, varname)) + class Config(object): def __init__(self): diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 8216ca1b693b..c25ce165a5c7 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -14,7 +14,6 @@ from collections import namedtuple, defaultdict -from distutils.util import strtobool import itertools as it import operator as op import os @@ -22,7 +21,7 @@ from absl import logging import numpy as onp -from ..config import flags +from ..config import flags, bool_env from .. import core from .. import ad_util from .. import tree_util @@ -44,10 +43,10 @@ FLAGS = flags.FLAGS flags.DEFINE_bool('jax_debug_nans', - strtobool(os.getenv('JAX_DEBUG_NANS', "False")), + bool_env('JAX_DEBUG_NANS', False), 'Add nan checks to every operation.') flags.DEFINE_bool('jax_log_compiles', - strtobool(os.getenv('JAX_LOG_COMPILES', "False")), + bool_env('JAX_LOG_COMPILES', False), 'Print a message each time a `jit` computation is compiled.') def _map(f, *xs): return tuple(map(f, *xs)) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 7799194d30a7..0b26e8e8cee3 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -25,7 +25,6 @@ """ -from distutils.util import strtobool import builtins import collections from collections.abc import Sequence diff --git a/jax/test_util.py b/jax/test_util.py index b6dca099bece..98e03c8569ab 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -14,7 +14,6 @@ from contextlib import contextmanager -from distutils.util import strtobool import functools import re import itertools as it @@ -30,7 +29,7 @@ from . import api from . import dtypes from . import lax -from .config import flags +from .config import flags, bool_env from .util import partial from .tree_util import tree_multimap, tree_all, tree_map, tree_reduce from .lib import xla_bridge @@ -52,7 +51,7 @@ flags.DEFINE_bool( 'jax_skip_slow_tests', - strtobool(os.getenv('JAX_SKIP_SLOW_TESTS', '0')), + bool_env('JAX_SKIP_SLOW_TESTS', False), help= 'Skip tests marked as slow (> 5 sec).' ) From e140520466b9a5081cc304af4f9fa72230579c65 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 6 Feb 2020 17:19:54 -0800 Subject: [PATCH 0717/1053] make pmap inside of eager scan work, fixes #2018 (#2183) * make pmap inside of eager scan work, fixes #2018 Co-authored-by: Sharad Vikram * Ensure AxisEnv is instantiated with tuples (#2186) Co-authored-by: Sharad Vikram --- jax/interpreters/pxla.py | 2 +- jax/interpreters/xla.py | 62 +++++++++++++++++++++++++++---------- jax/lax/lax.py | 2 +- jax/lax/lax_control_flow.py | 37 +++++++++++----------- tests/pmap_test.py | 2 +- 5 files changed, 67 insertions(+), 38 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index e6c2fa942a75..091785854725 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -494,7 +494,7 @@ def dynamic_fun(dummy, *args): jaxpr_replicas = xla.jaxpr_replicas(jaxpr) num_local_replicas = axis_size * jaxpr_replicas num_global_replicas = global_axis_size * jaxpr_replicas - axis_env = xla.AxisEnv(num_global_replicas, [axis_name], [global_axis_size], devices) + axis_env = xla.AxisEnv(num_global_replicas, (axis_name,), (global_axis_size,), devices) tuple_args = len(avals) > 100 # pass long arg lists as tuple for TPU diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index d8fe50f4be58..fc2fdb87f836 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -170,14 +170,23 @@ def xla_primitive_callable(prim, *arg_specs, **params): handlers = tuple(map(partial(aval_to_result_handler, device), aval_out)) handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) tuple_args = len(avals) > 100 - built_c = primitive_computation(prim, backend, tuple_args, *avals, **params) + if prim in initial_style_translations: + nreps = initial_style_primitive_replicas(params) + else: + nreps = 1 + built_c = primitive_computation(prim, AxisEnv(nreps), backend, tuple_args, + *avals, **params) options = xb.get_compile_options( num_replicas=1, num_partitions=1, device_assignment=device and (device.id,)) compiled = built_c.Compile(compile_options=options, backend=backend) - return partial(_execute_compiled_primitive, prim, compiled, backend, - tuple_args, handle_result) + if nreps == 1: + return partial(_execute_compiled_primitive, prim, compiled, backend, + tuple_args, handle_result) + else: + return partial(_execute_replicated_primitive, prim, compiled, backend, + tuple_args, handle_result) def _device_from_arg_devices(devices): """Given devices of inputs, determine where to perform a computation. @@ -198,7 +207,7 @@ def _device_from_arg_devices(devices): raise ValueError(msg.format(", ".join(names))) @cache() -def primitive_computation(prim, backend, tuple_args, *avals, **params): +def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params): c = xb.make_computation_builder("primitive_computation_{}".format(prim.name)) c.SetOpMetadata(xc.OpMetadata( op_type=prim.name, @@ -208,13 +217,13 @@ def primitive_computation(prim, backend, tuple_args, *avals, **params): # return val always set as a side-effect on c if prim in backend_specific_translations[platform]: rule = backend_specific_translations[platform][prim] - rule(c, *xla_args, **params) + rule(c, *xla_args, **params) elif prim in translations: rule = translations[prim] rule(c, *xla_args, **params) elif prim in initial_style_translations: rule = initial_style_translations[prim] - rule(c, AxisEnv(), extend_name_stack(prim.name), *xla_args, backend=backend, **params) + rule(c, axis_env, extend_name_stack(prim.name), *xla_args, backend=backend, **params) else: raise NotImplementedError("XLA translation rule for {} not found".format(prim)) c.ClearOpMetadata() @@ -227,7 +236,7 @@ def primitive_computation(prim, backend, tuple_args, *avals, **params): raise RuntimeError(msg) def primitive_subcomputation(prim, *avals, **params): - return primitive_computation(prim, None, False, *avals, **params) + return primitive_computation(prim, AxisEnv(1), None, False, *avals, **params) def _execute_compiled_primitive(prim, compiled, backend, tuple_args, result_handler, *args): @@ -240,6 +249,17 @@ def _execute_compiled_primitive(prim, compiled, backend, tuple_args, check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) return result_handler(out_buf) +def _execute_replicated_primitive(prim, compiled, backend, tuple_args, + result_handler, *args): + input_bufs = [ + [device_put(x, device) for x in args if x is not token] + for device in compiled.local_devices()] + if tuple_args: + input_bufs = [[make_tuple(bufs, device, backend)] for bufs, device in + zip(input_bufs, compiled.local_devices())] + out_buf = compiled.ExecutePerReplica(input_bufs)[0] + return result_handler(out_buf) + def check_nans(prim, bufs): if prim.multiple_results: for buf in bufs: @@ -350,14 +370,16 @@ def check_backend_params(params, outer_backend): class AxisEnv(object): - def __init__(self, nreps=1, names=None, sizes=None, devices=None): + def __init__(self, nreps, names=(), sizes=(), devices=None): + assert isinstance(names, tuple) + assert isinstance(sizes, tuple) self.nreps = nreps - self.names = names if names else [] - self.sizes = sizes if sizes else [] + self.names = names + self.sizes = sizes self.devices = devices def extend_axis_env(env, name, size): - return AxisEnv(env.nreps, env.names + [name], env.sizes + [size], env.devices) + return AxisEnv(env.nreps, env.names + (name,), env.sizes + (size,), env.devices) def axis_read(axis_env, axis_name): return max(i for i, name in enumerate(axis_env.names) if name == axis_name) @@ -382,17 +404,22 @@ def _axis_groups(nrep, mesh_spec, mesh_axes): def jaxpr_replicas(jaxpr): return max(it.chain([1], (eqn_replicas(eqn) for eqn in jaxpr.eqns))) +# TODO(mattjj): this function assumes that only pmap has a parameter named +# axis_size, and that it corresponds to cross-replica mapping def eqn_replicas(eqn): if eqn.bound_subjaxpr: return eqn.params.get('axis_size', 1) * jaxpr_replicas(eqn.bound_subjaxpr) elif eqn.primitive in initial_style_translations: - nums = (jaxpr_replicas(param if type(param) is core.Jaxpr else param.jaxpr) - for param in eqn.params.values() - if type(param) in (core.Jaxpr, core.TypedJaxpr)) - return max(it.chain([1], nums)) + return initial_style_primitive_replicas(eqn.params) else: return 1 +def initial_style_primitive_replicas(params): + nums = (jaxpr_replicas(param if type(param) is core.Jaxpr else param.jaxpr) + for param in params.values() + if type(param) in (core.Jaxpr, core.TypedJaxpr)) + return max(it.chain([1], nums)) + # TODO(mattjj,skyewm): the functions here are utilities for checking if # not-yet-supported features are used with multi-host programming @@ -485,7 +512,7 @@ def _xla_callable(fun, device, backend, name, *arg_specs): xla_consts = _map(c.Constant, consts) xla_args = _xla_callable_args(c, abstract_args, tuple_args) out_nodes = jaxpr_subcomp( - c, jaxpr, backend, AxisEnv(nreps, [], []), xla_consts, + c, jaxpr, backend, AxisEnv(nreps, (), ()), xla_consts, extend_name_stack(wrap_name(name, 'jit')), *xla_args) built = c.Build(c.Tuple(*out_nodes)) @@ -635,10 +662,11 @@ def lower_fun(fun, instantiate=False, initial_style=False): """Build a translation rule for a traceable function.""" def f(c, *args, **params): backend = params.pop('backend', None) + # TODO(mattjj): revise this 'calling convention' if initial_style: axis_env, name_stack, xla_args = args[0], args[1], args[2:] else: - axis_env, name_stack, xla_args = AxisEnv(), '', args + axis_env, name_stack, xla_args = AxisEnv(1), '', args xla_shapes = tuple(map(c.GetShape, xla_args)) avals = map(_aval_from_xla_shape, xla_shapes) pvals = [pe.PartialVal((a, core.unit)) for a in avals] diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 8c3b4ea4a3fe..4388e424d20c 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3425,7 +3425,7 @@ def _reduce_batch_rule(batched_args, batch_dims, computation, jaxpr, consts, dim def _reduction_computation(c, jaxpr, consts, init_value): shape = c.GetShape(init_value) - axis_env = xla.AxisEnv() # no parallel primitives inside reductions + axis_env = xla.AxisEnv(1) # no parallel primitives inside reductions subc = xla_bridge.make_computation_builder("reduction_computation") consts = [subc.ParameterWithShape(const) for const in consts] args = [subc.ParameterWithShape(shape), subc.ParameterWithShape(shape)] diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 08d051ce0543..0229bd56bf2b 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -803,10 +803,7 @@ def scan(f, init, xs, length=None): linear=(False,) * (len(consts) + len(in_flat))) return tree_unflatten(out_tree, out) -def _scan_impl(*args, **kwargs): - forward, length, num_consts, num_carry, jaxpr, linear = split_dict( - kwargs, ["forward", "length", "num_consts", "num_carry", "jaxpr", "linear"]) - +def _scan_impl(*args, forward, length, num_consts, num_carry, jaxpr, linear): consts, init, xs = split_list(args, [num_consts, num_carry]) _, _, x_avals = split_list(jaxpr.in_avals, [num_consts, num_carry]) _, y_avals = split_list(jaxpr.out_avals, [num_carry]) @@ -841,6 +838,13 @@ def _update_array(i, aval, xs, x): else: return lax.dynamic_update_index_in_dim(xs, x, i, 0) +# TODO(mattjj): make scan a primitive +# def _scan_abstract_eval(*args, forward, length, num_consts, num_carry, jaxpr, linear): +# carry_avals, y_avals = split_list(jaxpr.out_avals, [num_carry]) +# ys_avals = [ShapedArray((length,) + aval.shape, aval.dtype) +# if aval is not core.abstract_unit else aval for aval in y_avals] +# return carry_avals + y_avals + def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, linear): num_xs = len(jaxpr.in_avals) - num_carry - num_consts @@ -879,9 +883,9 @@ def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, [num_carry, num_ys], [len(init_dot), sum(nonzeros_out) - len(init_dot)]) consts_linear, init_linear, xs_linear = split_list(linear, [num_consts, num_carry]) - jaxpr_jvp_linear = (consts_linear + [True] * len(consts_dot) - + init_linear + [True] * len(init_dot) - + xs_linear + [True] * len(xs_dot)) + jaxpr_jvp_linear = tuple(consts_linear + [True] * len(consts_dot) + + init_linear + [True] * len(init_dot) + + xs_linear + [True] * len(xs_dot)) out_flat = scan_p.bind( *(consts + consts_dot + init + init_dot + xs + xs_dot), @@ -899,9 +903,8 @@ def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, def _prune_zeros(ts): return [t for t in ts if t is not ad_util.zero] -def _scan_partial_eval(trace, *tracers, **kwargs): - forward, length, num_consts, num_carry, jaxpr, linear = split_dict( - kwargs, ["forward", "length", "num_consts", "num_carry", "jaxpr", "linear"]) +def _scan_partial_eval(trace, *tracers, forward, length, num_consts, num_carry, + jaxpr, linear): num_xs = len(jaxpr.in_avals) - num_carry - num_consts num_ys = len(jaxpr.out_avals) - num_carry @@ -955,10 +958,11 @@ def _scan_partial_eval(trace, *tracers, **kwargs): [core.unit if uk else t.pval[1] for uk, t in zip(unknowns[num_consts:], tracers[num_consts:])]) linear_1 = ([False] * len(consts_1) + [True] * num_consts + - [lin or uk for uk, lin in zip(unknowns[num_consts:], linear[num_consts:])]) + [lin or uk for uk, lin + in zip(unknowns[num_consts:], linear[num_consts:])]) out_flat = scan_p.bind( *in_consts, forward=forward, length=length, jaxpr=jaxpr_1_opt, - num_consts=num_consts_1, num_carry=num_carry, linear=linear_1) + num_consts=num_consts_1, num_carry=num_carry, linear=tuple(linear_1)) out_carry, ys, res_and_units = split_list(out_flat, [num_carry, num_ys]) extensive_residuals = [r for r, (pv, _) in zip(res_and_units, res_pvals) if pv is not None] @@ -981,7 +985,7 @@ def _scan_partial_eval(trace, *tracers, **kwargs): out_tracers, scan_p, dict(forward=forward, length=length, jaxpr=jaxpr_2_opt, num_consts=num_consts_2, - num_carry=num_carry, linear=linear_2)) + num_carry=num_carry, linear=tuple(linear_2))) for t in out_tracers: t.recipe = eqn return out_tracers @@ -991,10 +995,7 @@ def _promote_aval_rank(sz, aval): else: return ShapedArray((sz,) + aval.shape, aval.dtype) -def _scan_transpose(cts, *args, **kwargs): - forward, length, num_consts, num_carry, jaxpr, linear = split_dict( - kwargs, ["forward", "length", "num_consts", "num_carry", "jaxpr", "linear"]) - +def _scan_transpose(cts, *args, forward, length, num_consts, num_carry, jaxpr, linear): # we've only implemented transposing scans with specific lin/nonlin patterns consts_lin, init_lin, xs_lin = split_list(linear, [num_consts, num_carry]) num_ires = len(consts_lin) - sum(consts_lin) @@ -1030,7 +1031,7 @@ def _scan_transpose(cts, *args, **kwargs): outs = scan_p.bind( *(ires + ct_consts + ct_carry + ct_ys + eres), forward=not forward, length=length, jaxpr=jaxpr_trans, num_consts=num_ires, - num_carry=num_consts-num_ires+num_carry, linear=linear_trans) + num_carry=num_consts-num_ires+num_carry, linear=tuple(linear_trans)) ct_consts, ct_init, ct_xs = split_list(outs, [num_consts - num_ires, num_carry]) return [None] * num_ires + ct_consts + ct_init + ct_xs + [None] * num_eres diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 32755d81f2d5..7beb1f6b5631 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -337,7 +337,7 @@ def sum_and_broadcast(x, axis): self.assertAllClose(ans, expected, check_dtypes=False) def testAxisGroups(self): - axis_env = xla.AxisEnv(8, ['i', 'j'], [4, 2]) + axis_env = xla.AxisEnv(8, ('i', 'j'), (4, 2)) groups = xla.axis_groups(axis_env, 'i') self.assertEqual(groups, ((0, 2, 4, 6), (1, 3, 5, 7))) From 2e8798dd16acfe6373bf66780ae7402f7766854f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 6 Feb 2020 21:29:01 -0500 Subject: [PATCH 0718/1053] Use 64-bit integers for indexing if any tensor dimension exceeds 2^31 elements. (#2182) --- jax/numpy/lax_numpy.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0b26e8e8cee3..516c167901e1 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2901,7 +2901,8 @@ def _index_to_gather(x_shape, idx): collapsed_slice_dims = [] start_index_map = [] - gather_indices = onp.zeros((0,), dtype=int32) # use onp to save a compilation + index_dtype = int64 if max(x_shape) >= (1 << 31) else int32 + gather_indices = onp.zeros((0,), dtype=index_dtype) # use onp to save a compilation # We perform three transformations to y before the scatter op, in order: # First, y is broadcast to slice_shape. In general `y` only need broadcast to @@ -2928,7 +2929,7 @@ def _index_to_gather(x_shape, idx): shape = advanced_indexes[0].shape ndim = len(shape) advanced_indexes = [ - lax.convert_element_type(lax.reshape(a, shape + (1,)), int32) + lax.convert_element_type(lax.reshape(a, shape + (1,)), index_dtype) for a in advanced_indexes] # Broadcast gather_indices from [..., k] to [..., 1, 1, ..., 1, k]. @@ -2956,7 +2957,7 @@ def _index_to_gather(x_shape, idx): if (isinstance(abstract_i, ConcreteArray) or isinstance(abstract_i, ShapedArray)) and _int(abstract_i): i = _normalize_index(i, x_shape[x_axis]) - i = lax.convert_element_type(i, int32) + i = lax.convert_element_type(i, index_dtype) i = broadcast_to(i, tuple(gather_indices.shape[:-1]) + (1,)) gather_indices = concatenate((gather_indices, i), -1) collapsed_slice_dims.append(x_axis) @@ -2988,7 +2989,7 @@ def _index_to_gather(x_shape, idx): if needs_rev: reversed_y_dims.append(collapsed_y_axis) if stride == 1: - i = lax.convert_element_type(start, int32) + i = lax.convert_element_type(start, index_dtype) i = broadcast_to(i, tuple(gather_indices.shape[:-1]) + (1,)) gather_indices = concatenate((gather_indices, i), -1) slice_shape.append(limit - start) @@ -2996,7 +2997,7 @@ def _index_to_gather(x_shape, idx): offset_dims.append(collapsed_y_axis) start_index_map.append(x_axis) else: - i = arange(start, limit, stride, dtype=int32) + i = arange(start, limit, stride, dtype=index_dtype) size = i.shape[0] slice_shape.append(size) gather_slice_shape.append(1) From be5b24fa5d8dc2aa6128772571836949328128d0 Mon Sep 17 00:00:00 2001 From: Du Phan Date: Fri, 7 Feb 2020 12:49:50 -0500 Subject: [PATCH 0719/1053] relax the ndim>=1 condition of tensordot (#2191) * relax the ndim condition of tensordot * add test for scalar input with axes=0 --- jax/numpy/lax_numpy.py | 3 --- tests/lax_numpy_test.py | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 516c167901e1..0151c8a71b39 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2321,9 +2321,6 @@ def tensordot(a, b, axes=2, precision=None): _check_arraylike("tensordot", a, b) a_ndim = ndim(a) b_ndim = ndim(b) - if a_ndim < 1 or b_ndim < 1: - msg = "tensordot requires a.ndim and b.dim to be at least 1, got {} and {}." - raise TypeError(msg.format(ndim(a), ndim(b))) a, b = _promote_dtypes(a, b) if type(axes) is int: diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index c7bb6c3e5b66..614131557f4a 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -785,6 +785,7 @@ def onp_fun(x, y): "axes": axes, "rng_factory": rng_factory} for rng_factory in [jtu.rand_default] for lhs_shape, rhs_shape, axes in [ + [(3,), (), 0], [(2, 3, 4), (5, 6, 7), 0], # from issue #740 [(2, 3, 4), (3, 4, 5, 6), 2], [(2, 3, 4), (5, 4, 3, 6), [1, 2]], From a0e1804e4376a359be6dafdd2aff3a80ed6e117b Mon Sep 17 00:00:00 2001 From: StephenHogg Date: Sat, 8 Feb 2020 07:20:04 +1100 Subject: [PATCH 0720/1053] Implementation of np.linalg.{cond, tensorinv} (#2125) * add np.linalg.cond in a third_party module * remove unnecessary type maps * rename cond.py to linalg.py for consistency * shift LICENSE to correct directory; formatting changes; completed testing * Add implementation and testing for tensorinv * fix tests for tensorinv to stop build stalling * blank __init__.py; add extra testing for cond; remove index assignments * jax.lax.cond is breaking on jax.numpy.linalg.norm * fix control flow issues; update tests to use curried functions * clean up imports; remove commented code * remove control flow from tests; remove unneeded functions --- jax/numpy/linalg.py | 2 +- jax/third_party/__init__.py | 0 jax/third_party/numpy/LICENSE | 30 +++++++++++++ jax/third_party/numpy/__init__.py | 0 jax/third_party/numpy/linalg.py | 70 +++++++++++++++++++++++++++++++ tests/linalg_test.py | 59 ++++++++++++++++++++++++++ 6 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 jax/third_party/__init__.py create mode 100644 jax/third_party/numpy/LICENSE create mode 100644 jax/third_party/numpy/__init__.py create mode 100644 jax/third_party/numpy/linalg.py diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index cbe181940c9a..bb576e1c2ccf 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -30,7 +30,7 @@ from . import lax_numpy as np from ..api import custom_transforms, defjvp from ..util import get_module_functions - +from ..third_party.numpy.linalg import cond, tensorinv _T = lambda x: np.swapaxes(x, -1, -2) diff --git a/jax/third_party/__init__.py b/jax/third_party/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/jax/third_party/numpy/LICENSE b/jax/third_party/numpy/LICENSE new file mode 100644 index 000000000000..f7a64e5174e4 --- /dev/null +++ b/jax/third_party/numpy/LICENSE @@ -0,0 +1,30 @@ +Copyright (c) 2005-2019, NumPy Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the NumPy Developers nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/jax/third_party/numpy/__init__.py b/jax/third_party/numpy/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/jax/third_party/numpy/linalg.py b/jax/third_party/numpy/linalg.py new file mode 100644 index 000000000000..4c04f57a330f --- /dev/null +++ b/jax/third_party/numpy/linalg.py @@ -0,0 +1,70 @@ +import numpy as onp + +from jax.numpy import lax_numpy as np +from jax.numpy import linalg as la +from jax.numpy.lax_numpy import _wraps + + +def _isEmpty2d(arr): + # check size first for efficiency + return arr.size == 0 and np.product(arr.shape[-2:]) == 0 + + +def _assertNoEmpty2d(*arrays): + for a in arrays: + if _isEmpty2d(a): + raise onp.linalg.LinAlgError("Arrays cannot be empty") + + +def _assertRankAtLeast2(*arrays): + for a in arrays: + if a.ndim < 2: + raise onp.linalg.LinAlgError( + '%d-dimensional array given. Array must be ' + 'at least two-dimensional' % a.ndim) + + +def _assertNdSquareness(*arrays): + for a in arrays: + m, n = a.shape[-2:] + if m != n: + raise onp.linalg.LinAlgError( + 'Last 2 dimensions of the array must be square') + + +@_wraps(onp.linalg.cond) +def cond(x, p=None): + _assertNoEmpty2d(x) + if p in (None, 2): + s = la.svd(x, compute_uv=False) + return s[..., 0] / s[..., -1] + elif p == -2: + s = la.svd(x, compute_uv=False) + r = s[..., -1] / s[..., 0] + else: + _assertRankAtLeast2(x) + _assertNdSquareness(x) + invx = la.inv(x) + r = la.norm(x, ord=p, axis=(-2, -1)) * la.norm(invx, ord=p, axis=(-2, -1)) + + # Convert nans to infs unless the original array had nan entries + orig_nan_check = np.full_like(r, ~np.isnan(r).any()) + nan_mask = np.logical_and(np.isnan(r), ~np.isnan(x).any(axis=(-2, -1))) + r = np.where(orig_nan_check, np.where(nan_mask, np.inf, r), r) + return r + + +@_wraps(onp.linalg.tensorinv) +def tensorinv(a, ind=2): + a = np.asarray(a) + oldshape = a.shape + prod = 1 + if ind > 0: + invshape = oldshape[ind:] + oldshape[:ind] + for k in oldshape[ind:]: + prod *= k + else: + raise ValueError("Invalid ind argument.") + a = a.reshape(prod, -1) + ia = la.inv(a) + return ia.reshape(*invshape) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 408c2e27017f..ad9d21a2f057 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -538,6 +538,65 @@ def testQrBatching(self, shape, dtype, rng_factory): qs, rs = vmap(jsp.linalg.qr)(args) self.assertTrue(onp.all(onp.linalg.norm(args - onp.matmul(qs, rs)) < 1e-3)) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_shape={}_pnorm={}".format(jtu.format_shape_dtype_string(shape, dtype), pnorm), + "shape": shape, "pnorm": pnorm, "dtype": dtype} + for shape in [(1, 1), (4, 4), (2, 3, 5), (5, 5, 5), (20, 20), (5, 10)] + for pnorm in [np.inf, -np.inf, 1, -1, 2, -2, 'fro'] + for dtype in float_types + complex_types)) + def testCond(self, shape, pnorm, dtype): + _skip_if_unsupported_type(dtype) + + def gen_mat(): + arr_gen = jtu.rand_some_nan() + res = arr_gen(shape, dtype) + return res + + def args_gen(p): + def _args_gen(): + return [gen_mat(), p] + return _args_gen + + args_maker = args_gen(pnorm) + if pnorm not in [2, -2] and len(set(shape[-2:])) != 1: + with self.assertRaises(onp.linalg.LinAlgError): + np.linalg.cond(*args_maker()) + else: + self._CheckAgainstNumpy(onp.linalg.cond, np.linalg.cond, args_maker, + check_dtypes=False, tol=1e-3) + partial_norm = partial(np.linalg.cond, p=pnorm) + self._CompileAndCheck(partial_norm, lambda: [gen_mat()], + check_dtypes=False, rtol=1e-03, atol=1e-03) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} + for shape in [(1, 1), (4, 4), (200, 200), (7, 7, 7, 7)] + for dtype in float_types + for rng_factory in [jtu.rand_default])) + def testTensorinv(self, shape, dtype, rng_factory): + _skip_if_unsupported_type(dtype) + rng = rng_factory() + + def tensor_maker(): + invertible = False + while not invertible: + a = rng(shape, dtype) + try: + onp.linalg.inv(a) + invertible = True + except onp.linalg.LinAlgError: + pass + return a + + args_maker = lambda: [tensor_maker(), int(onp.floor(len(shape) / 2))] + self._CheckAgainstNumpy(onp.linalg.tensorinv, np.linalg.tensorinv, args_maker, + check_dtypes=False, tol=1e-3) + partial_inv = partial(np.linalg.tensorinv, ind=int(onp.floor(len(shape) / 2))) + self._CompileAndCheck(partial_inv, lambda: [tensor_maker()], check_dtypes=False, rtol=1e-03, atol=1e-03) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_lhs={}_rhs={}".format( From 5c9438864e64c8b02b0e13fce9759d8a8ed3d488 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 7 Feb 2020 14:25:03 -0800 Subject: [PATCH 0721/1053] fix cond batching bug reading axis size (#2193) --- jax/lax/lax_control_flow.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 0229bd56bf2b..7fcabadbea0e 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -454,11 +454,12 @@ def _cond_pred_bcast_select(pred, x, y): def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr, linear): # TODO: maybe avoid moving arg axes to front if we're promoting to select? + size, = {x.shape[d] for x, d in zip(args, dims) if d is not batching.not_mapped} args = [batching.moveaxis(x, d, 0) if d is not batching.not_mapped and d != 0 else x for x, d in zip(args, dims)] - (pred,), true_ops, false_ops = split_list(args, [1, len(true_jaxpr.in_avals)]) - size, = {x.shape[d] for x, d in zip(args, dims) if d is not batching.not_mapped} orig_bat = [d is not batching.not_mapped for d in dims] + del dims + (pred,), true_ops, false_ops = split_list(args, [1, len(true_jaxpr.in_avals)]) (pred_bat,), t_bat, f_bat = split_list(orig_bat, [1, len(true_jaxpr.in_avals)]) _, true_out_bat = batching.batch_jaxpr(true_jaxpr, size, t_bat, False) From 051d7b895658f22e9ca64fc77961d61467e20e05 Mon Sep 17 00:00:00 2001 From: lanctot Date: Sat, 8 Feb 2020 13:11:42 -0500 Subject: [PATCH 0722/1053] Fix broken link in README (#2196) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7285604c2ebc..d686d2e8e77f 100644 --- a/README.md +++ b/README.md @@ -454,7 +454,7 @@ To cite this repository: ``` In the above bibtex entry, names are in alphabetical order, the version number -is intended to be that from [jax/version.py](../blob/master/jax/version.py), and +is intended to be that from [jax/version.py](../master/jax/version.py), and the year corresponds to the project's open-source release. A nascent version of JAX, supporting only automatic differentiation and From baf45f2c7a039ef91b503afc3c8bda8f089a5ab5 Mon Sep 17 00:00:00 2001 From: Jonathan Terhorst Date: Sun, 9 Feb 2020 17:30:54 -0500 Subject: [PATCH 0723/1053] Fix expm(zeros((n, n))) == NaN. (#2131) (#2192) * Fix expm(zeros((n, n)) == NaN. (#2131) * update tests based on @sriharikrishna review --- jax/scipy/linalg.py | 4 ++-- tests/linalg_test.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index eb379e23f412..2d13ab643d1b 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -289,7 +289,7 @@ def _calc_P_Q(A): U7,V7 = _pade7(A) U9,V9 = _pade9(A) maxnorm = 5.371920351148152 - n_squarings = np.maximum(0, np.floor_divide(np.log2(A_L1 / maxnorm),1)) + n_squarings = np.maximum(0, np.floor(np.log2(A_L1 / maxnorm))) A = A / 2**n_squarings U13,V13 = _pade13(A) conds=np.array([1.495585217958292e-002, 2.539398330063230e-001, 9.504178996162932e-001, 2.097847961257068e+000]) @@ -299,7 +299,7 @@ def _calc_P_Q(A): U3,V3 = _pade3(A) U5,V5 = _pade5(A) maxnorm = 3.925724783138660 - n_squarings = np.maximum(0, np.floor_divide(np.log2(A_L1 / maxnorm),1)) + n_squarings = np.maximum(0, np.floor(np.log2(A_L1 / maxnorm))) A = A / 2**n_squarings U7,V7 = _pade7(A) conds=np.array([4.258730016922831e-001, 1.880152677804762e+000]) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index ad9d21a2f057..997eda1cbbee 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -1077,5 +1077,20 @@ def testExpm(self, n, dtype, rng_factory): check_dtypes=True) self._CompileAndCheck(jsp_fun_triu, args_maker_triu, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_n={}".format(jtu.format_shape_dtype_string((n,n), dtype)), + "n": n, "dtype": dtype} + for n in [1, 4, 5, 20, 50, 100] + for dtype in float_types + complex_types + )) + def testIssue2131(self, n, dtype): + args_maker_zeros = lambda: [onp.zeros((n, n), dtype)] + osp_fun = lambda a: osp.linalg.expm(a) + jsp_fun = lambda a: jsp.linalg.expm(a) + self._CheckAgainstNumpy(osp_fun, jsp_fun, args_maker_zeros, + check_dtypes=True) + self._CompileAndCheck(jsp_fun, args_maker_zeros, check_dtypes=True) + if __name__ == "__main__": absltest.main() From aa0ca2706219b258ccef3fdb95f70fa002c5b499 Mon Sep 17 00:00:00 2001 From: Guillem Orellana Trullols Date: Sun, 9 Feb 2020 23:35:09 +0100 Subject: [PATCH 0724/1053] Implementation of np.linalg.tensorsolve. (#2119) * Tensorsolve implementation * Tests working for tensorsolve #1999 * Moved tensorsolve to third party directory --- jax/numpy/linalg.py | 2 +- jax/third_party/numpy/linalg.py | 28 +++++++++++++++++++++++ tests/linalg_test.py | 39 +++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index bb576e1c2ccf..f30a43a3be14 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -30,7 +30,7 @@ from . import lax_numpy as np from ..api import custom_transforms, defjvp from ..util import get_module_functions -from ..third_party.numpy.linalg import cond, tensorinv +from ..third_party.numpy.linalg import cond, tensorinv, tensorsolve _T = lambda x: np.swapaxes(x, -1, -2) diff --git a/jax/third_party/numpy/linalg.py b/jax/third_party/numpy/linalg.py index 4c04f57a330f..e4f969c8ac05 100644 --- a/jax/third_party/numpy/linalg.py +++ b/jax/third_party/numpy/linalg.py @@ -68,3 +68,31 @@ def tensorinv(a, ind=2): a = a.reshape(prod, -1) ia = la.inv(a) return ia.reshape(*invshape) + + +@_wraps(onp.linalg.tensorsolve) +def tensorsolve(a, b, axes=None): + a = np.asarray(a) + b = np.asarray(b) + an = a.ndim + if axes is not None: + allaxes = list(range(0, an)) + for k in axes: + allaxes.remove(k) + allaxes.insert(an, k) + + a = a.transpose(allaxes) + + Q = a.shape[-(an - b.ndim):] + + prod = 1 + for k in Q: + prod *= k + + a = a.reshape(-1, prod) + b = b.ravel() + + res = np.asarray(la.solve(a, b)) + res = res.reshape(Q) + + return res diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 997eda1cbbee..943460ab0983 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -113,6 +113,45 @@ def testDetOfSingularMatrix(self): x = np.array([[-1., 3./2], [2./3, -1.]], dtype=onp.float32) self.assertAllClose(onp.float32(0), jsp.linalg.det(x), check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_m={}_n={}_q={}".format( + jtu.format_shape_dtype_string((m,), dtype), + jtu.format_shape_dtype_string((nq[0],), dtype), + jtu.format_shape_dtype_string(nq[1], dtype)), + "m": m, + "nq": nq, "dtype": dtype, "rng_factory": rng_factory} + for m in [1, 5, 7, 23] + for nq in zip([2, 4, 6, 36], [(1, 2), (2, 2), (1, 2, 3), (3, 3, 1, 4)]) + for dtype in float_types + for rng_factory in [jtu.rand_default])) + def testTensorsolve(self, m, nq, dtype, rng_factory): + rng = rng_factory() + _skip_if_unsupported_type(dtype) + + # According to numpy docs the shapes are as follows: + # Coefficient tensor (a), of shape b.shape + Q. + # And prod(Q) == prod(b.shape) + # Therefore, n = prod(q) + n, q = nq + b_shape = (n, m) + # To accomplish prod(Q) == prod(b.shape) we append the m extra dim + # to Q shape + Q = q + (m,) + args_maker = lambda: [ + rng(b_shape + Q, dtype), # = a + rng(b_shape, dtype)] # = b + a, b = args_maker() + result = np.linalg.tensorsolve(*args_maker()) + self.assertEqual(result.shape, Q) + + self._CheckAgainstNumpy(onp.linalg.tensorsolve, + np.linalg.tensorsolve, args_maker, + check_dtypes=True, tol=1e-3) + self._CompileAndCheck(np.linalg.tensorsolve, + args_maker, check_dtypes=True, + rtol={onp.float64: 1e-13}) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), From 76d77bfc147e0e281d0953260e3aded64e425230 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Sun, 9 Feb 2020 21:06:37 -0800 Subject: [PATCH 0725/1053] Fix inconsistent indentation in `JaxprTrace.default_process_primitive`. --- jax/interpreters/partial_eval.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 89ebb037e030..77cf5e6d05d7 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -98,22 +98,22 @@ def process_primitive(self, primitive, tracers, params): return self.default_process_primitive(primitive, tracers, params) def default_process_primitive(self, primitive, tracers, params): - pvs, consts = unzip2(t.pval for t in tracers) - if all(pv is None for pv in pvs): - return primitive.bind(*consts, **params) - tracers = map(self.instantiate_const, tracers) - avals = [t.aval for t in tracers] - out_aval = primitive.abstract_eval(*avals, **params) - if primitive.multiple_results: - out_tracers = [JaxprTracer(self, PartialVal((aval, unit)), None) - for aval in out_aval] - eqn = new_eqn_recipe(tracers, out_tracers, primitive, params) - for t in out_tracers: t.recipe = eqn - return out_tracers - else: - out_tracer = JaxprTracer(self, PartialVal((out_aval, unit)), None) - out_tracer.recipe = new_eqn_recipe(tracers, [out_tracer], primitive, params) - return out_tracer + pvs, consts = unzip2(t.pval for t in tracers) + if all(pv is None for pv in pvs): + return primitive.bind(*consts, **params) + tracers = map(self.instantiate_const, tracers) + avals = [t.aval for t in tracers] + out_aval = primitive.abstract_eval(*avals, **params) + if primitive.multiple_results: + out_tracers = [JaxprTracer(self, PartialVal((aval, unit)), None) + for aval in out_aval] + eqn = new_eqn_recipe(tracers, out_tracers, primitive, params) + for t in out_tracers: t.recipe = eqn + return out_tracers + else: + out_tracer = JaxprTracer(self, PartialVal((out_aval, unit)), None) + out_tracer.recipe = new_eqn_recipe(tracers, [out_tracer], primitive, params) + return out_tracer def process_call(self, call_primitive, f, tracers, params): name = params.get('name', f.__name__) From 0b31342868232ab38dff0b1f34055970b6ad0f66 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 10 Feb 2020 12:18:39 +0100 Subject: [PATCH 0726/1053] Added License to new files --- jax/third_party/__init__.py | 13 +++++++++++++ jax/third_party/numpy/__init__.py | 13 +++++++++++++ jax/third_party/numpy/linalg.py | 14 ++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/jax/third_party/__init__.py b/jax/third_party/__init__.py index e69de29bb2d1..fbcf9752fa5a 100644 --- a/jax/third_party/__init__.py +++ b/jax/third_party/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020 Google LLC +# # +# # Licensed under the Apache License, Version 2.0 (the "License"); +# # you may not use this file except in compliance with the License. +# # You may obtain a copy of the License at +# # +# # https://www.apache.org/licenses/LICENSE-2.0 +# # +# # Unless required by applicable law or agreed to in writing, software +# # distributed under the License is distributed on an "AS IS" BASIS, +# # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# # See the License for the specific language governing permissions and +# # limitations under the License. diff --git a/jax/third_party/numpy/__init__.py b/jax/third_party/numpy/__init__.py index e69de29bb2d1..30257881ab32 100644 --- a/jax/third_party/numpy/__init__.py +++ b/jax/third_party/numpy/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/jax/third_party/numpy/linalg.py b/jax/third_party/numpy/linalg.py index e4f969c8ac05..d650d4071541 100644 --- a/jax/third_party/numpy/linalg.py +++ b/jax/third_party/numpy/linalg.py @@ -1,3 +1,17 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import numpy as onp from jax.numpy import lax_numpy as np From e81024f5053def119eddb7fb06ff6c4f7b5948a8 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 10 Feb 2020 12:49:58 +0100 Subject: [PATCH 0727/1053] Disable linalg_test.testCond. Issue: 2203 This test was added in #2125 but is failing in internal tests. --- tests/linalg_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 943460ab0983..0f7ebb1e74bd 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -584,6 +584,8 @@ def testQrBatching(self, shape, dtype, rng_factory): for shape in [(1, 1), (4, 4), (2, 3, 5), (5, 5, 5), (20, 20), (5, 10)] for pnorm in [np.inf, -np.inf, 1, -1, 2, -2, 'fro'] for dtype in float_types + complex_types)) + @jtu.skip_on_devices("tpu") # SVD is not implemented on the TPU backend + @jtu.skip_on_devices("gpu") # TODO(#2203): numerical errors def testCond(self, shape, pnorm, dtype): _skip_if_unsupported_type(dtype) From f3e9bef33eb4c118a4bde4c3fb7646c21775c988 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 10 Feb 2020 14:28:41 +0100 Subject: [PATCH 0728/1053] Removed copyright code from third-party/numpy --- jax/third_party/README.md | 4 ++++ jax/third_party/__init__.py | 13 ------------- jax/third_party/numpy/__init__.py | 13 ------------- jax/third_party/numpy/linalg.py | 13 ------------- 4 files changed, 4 insertions(+), 39 deletions(-) create mode 100644 jax/third_party/README.md diff --git a/jax/third_party/README.md b/jax/third_party/README.md new file mode 100644 index 000000000000..575bc9ce02df --- /dev/null +++ b/jax/third_party/README.md @@ -0,0 +1,4 @@ +This sub-directory contains third-party code for which Google does not have +copyright. Each sub-directory should correspond to a third-party library and +must contain the appropriate LICENSE file. +See [instructions](https://g3doc.corp.google.com/company/teams/opensource/releasing/preparing.md?cl=head#third-party-components). \ No newline at end of file diff --git a/jax/third_party/__init__.py b/jax/third_party/__init__.py index fbcf9752fa5a..e69de29bb2d1 100644 --- a/jax/third_party/__init__.py +++ b/jax/third_party/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2020 Google LLC -# # -# # Licensed under the Apache License, Version 2.0 (the "License"); -# # you may not use this file except in compliance with the License. -# # You may obtain a copy of the License at -# # -# # https://www.apache.org/licenses/LICENSE-2.0 -# # -# # Unless required by applicable law or agreed to in writing, software -# # distributed under the License is distributed on an "AS IS" BASIS, -# # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# # See the License for the specific language governing permissions and -# # limitations under the License. diff --git a/jax/third_party/numpy/__init__.py b/jax/third_party/numpy/__init__.py index 30257881ab32..e69de29bb2d1 100644 --- a/jax/third_party/numpy/__init__.py +++ b/jax/third_party/numpy/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/jax/third_party/numpy/linalg.py b/jax/third_party/numpy/linalg.py index d650d4071541..9fc01f15d146 100644 --- a/jax/third_party/numpy/linalg.py +++ b/jax/third_party/numpy/linalg.py @@ -1,16 +1,3 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. import numpy as onp From e9d06ecf53a5227bb324b682fab74b628430ff9d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 10 Feb 2020 11:14:38 -0500 Subject: [PATCH 0729/1053] Reenable convolution gradient tests on TPU that now pass. (#2207) --- tests/lax_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index 0ec72acbd851..920d02a33e88 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1956,7 +1956,6 @@ def testConvWithGeneralPaddingGrad(self, lhs_shape, rhs_shape, dtype, strides, (("NHWC", "OIHW", "NCHW"), ([0, 2, 3, 1], [0, 1, 2, 3]))] for rng_factory in [jtu.rand_default] )) - @jtu.skip_on_devices("tpu") # TODO(phawkins): precision problems on TPU. def testConvGeneralDilatedGrad(self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dil, rhs_dil, dimension_numbers, perms, feature_group_count, rng_factory): From 4c682b46bb05301212b0cfe8affa970e1feccde4 Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Mon, 10 Feb 2020 16:40:36 +0000 Subject: [PATCH 0730/1053] Add missing sources to jax build. (#2208) --- jax/BUILD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jax/BUILD b/jax/BUILD index 3e3c7f1e97b2..6b71ade5ff13 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -34,6 +34,8 @@ pytype_library( "ops/*.py", "scipy/*.py", "scipy/stats/*.py", + "third_party/*.py", + "third_party/numpy/*.py", "nn/*.py", ], exclude = [ From dff64e0297a6bf74a50c66e4168ecfb957a90134 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 10 Feb 2020 19:05:11 +0100 Subject: [PATCH 0731/1053] Fixed link to Google 3rd party OSS components --- jax/third_party/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/third_party/README.md b/jax/third_party/README.md index 575bc9ce02df..0138c544e80f 100644 --- a/jax/third_party/README.md +++ b/jax/third_party/README.md @@ -1,4 +1,4 @@ This sub-directory contains third-party code for which Google does not have copyright. Each sub-directory should correspond to a third-party library and must contain the appropriate LICENSE file. -See [instructions](https://g3doc.corp.google.com/company/teams/opensource/releasing/preparing.md?cl=head#third-party-components). \ No newline at end of file +See [instructions](https://opensource.google/docs/releasing/preparing/#third-party-components). From 28e802c6f15d7ed87fee9bee6270137423b9967c Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Mon, 10 Feb 2020 16:39:27 -0800 Subject: [PATCH 0732/1053] Fix Gotchas notebook regarding control flow differentiation. (#2194) --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index f388fcc419eb..20966f035cfb 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -1101,12 +1101,11 @@ "\n", "There are more options for control flow in JAX. Say you want to avoid re-compilations but still want to use control flow that's traceable, and that avoids un-rolling large loops. Then you can use these 4 structured control flow primitives:\n", "\n", - " - `lax.cond` _will be differentiable soon_\n", - " - `lax.while_loop` __non-differentiable__*\n", - " - `lax.fori_loop` __non-differentiable__*\n", + " - `lax.cond` _differentiable_\n", + " - `lax.while_loop` __fwd-mode-differentiable__\n", + " - `lax.fori_loop` __fwd-mode-differentiable__\n", " - `lax.scan` _differentiable_\n", - "\n", - "*_these can in principle be made to be __forward__-differentiable, but this isn't on the current roadmap._" + "\n" ] }, { @@ -1289,9 +1288,9 @@ "\\textrm{if} & ❌ & ✔ \\\\\n", "\\textrm{for} & ✔* & ✔\\\\\n", "\\textrm{while} & ✔* & ✔\\\\\n", - "\\textrm{lax.cond} & ✔ & \\textrm{soon!}\\\\\n", - "\\textrm{lax.while_loop} & ✔ & ❌\\\\\n", - "\\textrm{lax.fori_loop} & ✔ & ❌\\\\\n", + "\\textrm{lax.cond} & ✔ & ✔\\\\\n", + "\\textrm{lax.while_loop} & ✔ & \\textrm{fwd}\\\\\n", + "\\textrm{lax.fori_loop} & ✔ & \\textrm{fwd}\\\\\n", "\\textrm{lax.scan} & ✔ & ✔\\\\\n", "\\hline\n", "\\end{array}\n", From 20f9230f6e14d6f634a9a02b1185d6bb687905f2 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 5 Feb 2020 15:38:25 +0100 Subject: [PATCH 0733/1053] Simplify Jaxpr: remove the bound_subjaxpr field, all subjaxprs are in params. The goal is to make the Jaxpr language more uniform: all higher-order primitives carry sub-Jaxprs that are part of the parameters, and they are all called xxx_jaxpr. As a side-effect, some code is simplified (e.g., the code that searches for sub-jaxprs). For now the code assumes that all the `call` (final-style) primitives carry exactly one subjaxpr with the parameter name `call_jaxpr`. These primitives are still processed differently in the internal code, but there is no reason any external consumer of a Jaxpr needs to know this. --- CHANGELOG.md | 6 ++- jax/core.py | 62 ++++++++++++++++++---- jax/interpreters/ad.py | 28 +++++----- jax/interpreters/partial_eval.py | 53 +++++++++---------- jax/interpreters/pxla.py | 8 +-- jax/interpreters/sharded_jit.py | 8 +-- jax/interpreters/xla.py | 88 ++++++++++++++------------------ jax/test_util.py | 6 +-- tests/api_test.py | 6 +-- tests/linalg_test.py | 1 + 10 files changed, 147 insertions(+), 119 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 071e89b2b59e..55722cdd0944 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,10 @@ These are the release notes for JAX. ### Breaking changes * The minimum jaxlib version is now 0.1.38. -* Simplified `Jaxpr` by removing the `Jaxpr.freevars` and changing the - representation of `Jaxpr.bound_subjaxprs` to drop the environment values. +* Simplified `Jaxpr` by removing the `Jaxpr.freevars` and + `Jaxpr.bound_subjaxprs`. The call primitives (`xla_call`, `xla_pmap`, + `sharded_call`, and `remat_call`) get a new parameter `call_jaxpr` with a + fully-closed (no `constvars`) JAXPR. ### New features diff --git a/jax/core.py b/jax/core.py index a03d087b0e3e..5cfaadaa8104 100644 --- a/jax/core.py +++ b/jax/core.py @@ -58,6 +58,19 @@ def __str__(self): return str(pp_jaxpr(self)) __repr__ = __str__ + +def subjaxprs(jaxpr): + """Generator for all subjaxprs found in the params of jaxpr.eqns. + Does not descend recursively into the found subjaxprs. + """ + for eqn in jaxpr.eqns: + for param in eqn.params.values(): + if type(param) is Jaxpr: + yield param + elif type(param) is TypedJaxpr: + yield param.jaxpr + + class TypedJaxpr(object): def __init__(self, jaxpr, literals, in_avals, out_avals): assert type(jaxpr) is Jaxpr @@ -84,8 +97,8 @@ def jaxpr_as_fun(typed_jaxpr, *args): return eval_jaxpr(typed_jaxpr.jaxpr, typed_jaxpr.literals, *args) -JaxprEqn = namedtuple('JaxprEqn', ['invars', 'outvars', 'primitive', - 'bound_subjaxpr', 'params']) + +JaxprEqn = namedtuple('JaxprEqn', ['invars', 'outvars', 'primitive', 'params']) JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn)).rstrip() new_jaxpr_eqn = JaxprEqn @@ -149,6 +162,8 @@ def __repr__(self): class Primitive(object): multiple_results = False # override for multi-output primitives + call_primitive = False # override for higher-order primitives that are + # processed in final style. def __init__(self, name): self.name = name @@ -193,6 +208,24 @@ def abstract_eval(self, *args, **kwargs): # -------------------- lifting -------------------- +# TODO(necula): this belongs next to pe.new_eqn_recipe, but is needed in +# core.py. Plan to move all these utilities to jaxpr.py. +def extract_call_jaxpr(primitive, params): + """Extract the call primitive subjaxpr from the params. + + Params: + params: a parameter dictionary for a primitive. + Returns: the subjaxpr and the params without the "jaxpr" value. If this is + not a call primitive then returns (None, params). + """ + if not primitive.call_primitive: + return (None, params) + else: + assert "call_jaxpr" in params + new_params = dict(params) + del new_params["call_jaxpr"] + return (params["call_jaxpr"], new_params) + def eval_jaxpr(jaxpr, consts, *args): def read(v): @@ -210,11 +243,12 @@ def write(v, val): map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: in_vals = map(read, eqn.invars) - if eqn.bound_subjaxpr: - subfuns = [lu.wrap_init(partial(eval_jaxpr, eqn.bound_subjaxpr, ()))] + call_jaxpr, params = extract_call_jaxpr(eqn.primitive, eqn.params) + if call_jaxpr: + subfuns = [lu.wrap_init(partial(eval_jaxpr, call_jaxpr, ()))] else: subfuns = [] - ans = eqn.primitive.bind(*(subfuns + in_vals), **eqn.params) + ans = eqn.primitive.bind(*(subfuns + in_vals), **params) if eqn.primitive.multiple_results: map(write, eqn.outvars, ans) else: @@ -626,6 +660,10 @@ def call_impl(f, *args, **params): # ------------------- Jaxpr printed representation ------------------- def check_jaxpr(jaxpr): + """Checks well-formedness of a jaxpr. + + Specifically it checks that all variabled used are previously defined. + """ def context(): return "\njaxpr:\n{}\n".format(jaxpr) @@ -646,10 +684,16 @@ def write_env(env, v): map(write, jaxpr.constvars) map(write, jaxpr.invars) for eqn in jaxpr.eqns: + if eqn.primitive.call_primitive: + if "call_jaxpr" not in eqn.params: + raise Exception("Call primitive {} should have a 'call_jaxpr' parameter" + .format(eqn.primitive)) map(read, eqn.invars) - if eqn.bound_subjaxpr: - check_jaxpr(eqn.bound_subjaxpr) map(write, eqn.outvars) + + for subjaxpr in subjaxprs(jaxpr): + check_jaxpr(subjaxpr) + map(read, jaxpr.outvars) @@ -664,10 +708,6 @@ def pp_eqn_compact(primitive_name, params): def pp_eqn(eqn): lhs = pp_vars(eqn.outvars) pp_subexpr = pp('') - if eqn.bound_subjaxpr: - pp_subexpr = pp_subexpr + ( - pp_jaxpr(eqn.bound_subjaxpr).indent(2) - >> pp(' [ ]')) return (pp('{} = '.format(lhs)) >> pp(eqn.primitive.name) >> pp_kv_pairs(sorted(eqn.params.items())) >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index f6e4b07fc22d..37c40b5912b4 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -172,7 +172,7 @@ def is_linear(var): linear_eqns = [] for eqn in jaxpr.eqns: - if not eqn.bound_subjaxpr: + if not eqn.primitive.call_primitive: if any(is_linear(v) for v in eqn.invars): linear_eqns.append(eqn) else: @@ -183,12 +183,12 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - subjaxpr = eqn.bound_subjaxpr + call_jaxpr = eqn.params["call_jaxpr"] if any(is_linear(v) for v in eqn.invars): linear_eqns.append(eqn) elif eqn.primitive is not pe.remat_call_p: ans = _eval_subjaxpr_primals( - eqn.primitive, subjaxpr, + eqn.primitive, call_jaxpr, map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) @@ -196,7 +196,7 @@ def is_linear(var): # nonlinear, so we always evaluate it even if it has a linear part if eqn.primitive is pe.remat_call_p: ans = _eval_subjaxpr_primals( - eqn.primitive, subjaxpr, + eqn.primitive, call_jaxpr, map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) @@ -208,10 +208,10 @@ def is_linear(var): cts_in = map(read_cotangent, eqn.outvars) else: cts_in, = map(read_cotangent, eqn.outvars) - if eqn.bound_subjaxpr: - subjaxpr = eqn.bound_subjaxpr + if eqn.primitive.call_primitive: + call_jaxpr, params = core.extract_call_jaxpr(eqn.primitive, eqn.params) cts_out = get_primitive_transpose(eqn.primitive)( - eqn.params, subjaxpr, invals, cts_in) + params, call_jaxpr, invals, cts_in) else: cts_out = get_primitive_transpose(eqn.primitive)(cts_in, *invals, **eqn.params) cts_out = [zero] * len(eqn.invars) if cts_out is zero else cts_out @@ -251,7 +251,7 @@ def is_linear(var): assert not jaxpr.constvars map(write_primal, jaxpr.invars, args) for eqn in jaxpr.eqns: - if not eqn.bound_subjaxpr: + if not eqn.primitive.call_primitive: if not any(is_linear(v) for v in eqn.invars): in_vals = map(read_primal, eqn.invars) ans = eqn.primitive.bind(*in_vals, **eqn.params) @@ -260,11 +260,11 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - subjaxpr = eqn.bound_subjaxpr + call_jaxpr = eqn.params["call_jaxpr"] if (eqn.primitive is pe.remat_call_p or not any(is_linear(v) for v in eqn.invars)): ans = _eval_subjaxpr_primals( - eqn.primitive, subjaxpr, + eqn.primitive, call_jaxpr, map(read_primal, eqn.invars), eqn.params) map(write_primal, eqn.outvars, ans) return map(read_primal, jaxpr.outvars) @@ -537,9 +537,9 @@ def traceable(num_primals, in_tree_def, *primals_and_tangents): yield out_flat, tree_def -def call_transpose(primitive, params, jaxpr, args, ct): +def call_transpose(primitive, params, call_jaxpr, args, ct): all_args, in_tree_def = tree_flatten(((), args, ct)) # empty consts - fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) + fun = lu.hashable_partial(lu.wrap_init(backward_pass), call_jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) params = dict(params, name=wrap_name(params['name'], 'transpose')) out_flat = primitive.bind(fun, *all_args, **params) @@ -547,9 +547,9 @@ def call_transpose(primitive, params, jaxpr, args, ct): primitive_transposes[core.call_p] = partial(call_transpose, call_p) primitive_transposes[pe.remat_call_p] = partial(call_transpose, pe.remat_call_p) -def map_transpose(primitive, params, jaxpr, args, ct): +def map_transpose(primitive, params, call_jaxpr, args, ct): all_args, in_tree_def = tree_flatten(((), args, ct)) # empty consts - fun = lu.hashable_partial(lu.wrap_init(backward_pass), jaxpr) + fun = lu.hashable_partial(lu.wrap_init(backward_pass), call_jaxpr) fun, out_tree = flatten_fun_nokwargs(fun, in_tree_def) params = dict(params, name=wrap_name(params['name'], 'transpose')) out_flat = primitive.bind(fun, *all_args, **params) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 89ebb037e030..d1da7462f99c 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -136,10 +136,10 @@ def process_call(self, call_primitive, f, tracers, params): lifted_jaxpr = convert_constvars_jaxpr(jaxpr) out_tracers = [JaxprTracer(self, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] + new_params = dict(params, call_jaxpr=lifted_jaxpr) # The `jaxpr` already contains the env_vars at start of invars eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers, tracers)), - out_tracers, call_primitive, params, - subjaxpr=lifted_jaxpr) + out_tracers, call_primitive, new_params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -162,10 +162,10 @@ def process_map(self, map_primitive, f, tracers, params): new_params = dict(params, mapped_invars=tuple([True] * len(const_tracers) + [False] * len(env_tracers) + - [True] * len(tracers))) + [True] * len(tracers)), + call_jaxpr=lifted_jaxpr) eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers, tracers)), - out_tracers, map_primitive, new_params, - subjaxpr=lifted_jaxpr) + out_tracers, map_primitive, new_params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -187,10 +187,10 @@ def todo(x): lifted_jaxpr = convert_constvars_jaxpr(jaxpr) out_tracers = [JaxprTracer(trace, PartialVal((out_pv, out_pv_const)), None) for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] + new_params = dict(params, call_jaxpr=lifted_jaxpr) # The `jaxpr` already contains the env_vars at start of invars eqn = new_eqn_recipe(tuple(it.chain(const_tracers, env_tracers)), - out_tracers, call_primitive, params, - subjaxpr=lifted_jaxpr) + out_tracers, call_primitive, new_params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -215,11 +215,11 @@ def todo(x): for out_pv, out_pv_const in zip(out_pvs, out_pv_consts)] new_params = dict(params, mapped_invars=tuple([True] * len(const_tracers) + - [False] * len(env))) + [False] * len(env)), + call_jaxpr=lifted_jaxpr) env_tracers = map(trace.full_raise, env) eqn = new_eqn_recipe(it.chain(const_tracers, env_tracers), - out_tracers, map_primitive, new_params, - subjaxpr=lifted_jaxpr) + out_tracers, map_primitive, new_params) for t in out_tracers: t.recipe = eqn return out_tracers @@ -383,12 +383,9 @@ def instantiate_const_at(trace, instantiate, tracer): ConstVar = namedtuple('ConstVar', ['val']) LambdaBinding = namedtuple('LambdaBinding', []) JaxprEqnRecipe = namedtuple('JaxprEqnRecipe', - ['eqn_id', 'invars', 'outvars', 'primitive', - 'bound_subjaxpr', 'params']) + ['eqn_id', 'invars', 'outvars', 'primitive', 'params']) - -def new_eqn_recipe(invars, outvars, primitive, params, - subjaxpr=None): +def new_eqn_recipe(invars, outvars, primitive, params): """Constructs a new JaxEqnRecipe. Params: @@ -396,25 +393,21 @@ def new_eqn_recipe(invars, outvars, primitive, params, outvars: the tracers for the primitive outputs. primitive: the primitive. params: the primitive params - subjaxpr: (optional) a sub-Jaxpr, used only for `xla_call` or `xla_pmap`. - If present, then `subjaxpr.invars` correspond to `invars. """ - if subjaxpr is not None: - assert len(subjaxpr.constvars) == 0 - assert len(subjaxpr.invars) == len(tuple(invars)) - bound_subjaxpr = subjaxpr - else: - bound_subjaxpr = None - + if primitive.call_primitive: + # TODO(necula): move these checks to core.check_jaxpr, and call it + # in more places. + assert "call_jaxpr" in params return JaxprEqnRecipe(object(), tuple(invars), map(ref, outvars), primitive, - bound_subjaxpr, params) + params) + def recipe_to_eqn(unused_var, getvar, recipe): - _, in_tracers, out_tracer_refs, primitive, bound_subjaxpr, params = recipe + _, in_tracers, out_tracer_refs, primitive, params = recipe out_tracers = [t_ref() for t_ref in out_tracer_refs] invars = [getvar(t) for t in in_tracers] outvars = [unused_var() if t is None else getvar(t) for t in out_tracers] - return new_jaxpr_eqn(invars, outvars, primitive, bound_subjaxpr, params) + return new_jaxpr_eqn(invars, outvars, primitive, params) def tracers_to_jaxpr(in_tracers, out_tracers): """Constructs Jaxpr given tracers for inputs and outputs. @@ -520,6 +513,7 @@ def _split_aval(unknown, aval): remat_call_p = core.Primitive('remat_call') +remat_call_p.call_primitive = True remat_call = partial(core.call_bind, remat_call_p) remat_call_p.def_custom_bind(remat_call) remat_call_p.def_impl(core.call_impl) @@ -593,10 +587,9 @@ def _remat_partial_eval(trace, f, tracers, params): const_tracers = map(trace.new_instantiated_const, consts) lifted_jaxpr = convert_constvars_jaxpr(typed_jaxpr.jaxpr) out_tracers = [JaxprTracer(trace, out_pval, None) for out_pval in out_pvals] + new_params = dict(params, call_jaxpr=lifted_jaxpr) eqn = new_eqn_recipe(tuple(it.chain(const_tracers, instantiated_tracers)), - out_tracers, remat_call_p, - params, - subjaxpr=lifted_jaxpr) + out_tracers, remat_call_p, new_params) for t in out_tracers: t.recipe = eqn return out_tracers call_partial_eval_rules[remat_call_p] = _remat_partial_eval diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 091785854725..57c557f96b20 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -640,14 +640,16 @@ def execute_replicated(compiled, backend, in_handler, out_handler, *args): xla_pmap_p = core.Primitive('xla_pmap') +xla_pmap_p.call_primitive = True xla_pmap_p.multiple_results = True xla_pmap = partial(core.call_bind, xla_pmap_p) xla_pmap_p.def_custom_bind(xla_pmap) xla_pmap_p.def_impl(xla_pmap_impl) -def _pmap_translation_rule(c, jaxpr, axis_env, +def _pmap_translation_rule(c, axis_env, in_nodes, name_stack, axis_name, axis_size, - global_axis_size, devices, name, backend=None, + global_axis_size, devices, name, + call_jaxpr, backend=None, mapped_invars=None): # We in-line here rather than generating a Call HLO as in the xla_call # translation rule just because the extra tuple stuff is a pain. @@ -662,7 +664,7 @@ def _pmap_translation_rule(c, jaxpr, axis_env, for in_node, in_node_mapped in zip(in_nodes, mapped_invars)) sharded_outs = xla.jaxpr_subcomp( - c, jaxpr, backend, new_env, (), + c, call_jaxpr, backend, new_env, (), extend_name_stack(name_stack, wrap_name(name, 'pmap')), *in_nodes_sharded) outs = [_xla_unshard(c, new_env, shard) for shard in sharded_outs] return c.Tuple(*outs) diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index 180758535e27..b4f7d275968b 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -183,8 +183,9 @@ def _sharded_callable(fun, partitions, name, *abstract_args): handle_outs) -def _sharded_jit_translation_rule(c, jaxpr, axis_env, freevar_nodes, - in_nodes, name_stack, partitions, backend, name): +def _sharded_jit_translation_rule(c, axis_env, freevar_nodes, + in_nodes, name_stack, partitions, backend, + name, call_jaxpr): subc = xb.make_computation_builder("jaxpr_subcomputation") # TODO(mattjj): name freevars = [subc.ParameterWithShape(c.GetShape(n)) for n in freevar_nodes] @@ -195,7 +196,7 @@ def _sharded_jit_translation_rule(c, jaxpr, axis_env, freevar_nodes, subc._builder.ClearSharding() # args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - out_nodes = xla.jaxpr_subcomp(subc, jaxpr, backend, axis_env, (), freevars, name_stack, *args) + out_nodes = xla.jaxpr_subcomp(subc, call_jaxpr, backend, axis_env, (), freevars, name_stack, *args) subc._builder.SetSharding(_sharding_to_proto(partitions[1])) out_tuple = subc.Tuple(*out_nodes) @@ -277,6 +278,7 @@ def _sharded_call_impl(fun, *args, **params): sharded_call_p = core.Primitive("sharded_call") +sharded_call_p.call_primitive = True sharded_call_p.multiple_results = True sharded_call = partial(core.call_bind, sharded_call_p) sharded_call_p.def_custom_bind(sharded_call) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index fc2fdb87f836..5fb295f033e2 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -284,21 +284,14 @@ def prefetch(x): return x def jaxpr_literals(jaxpr): - return it.chain.from_iterable(eqn_literals(eqn) for eqn in jaxpr.eqns) - -def eqn_literals(eqn): - if eqn.bound_subjaxpr: - for literal in jaxpr_literals(eqn.bound_subjaxpr): - yield literal - if eqn.primitive in initial_style_translations: - for param in eqn.params.values(): - if type(param) in (core.Jaxpr, core.TypedJaxpr): - subjaxpr = param if type(param) is core.Jaxpr else param.jaxpr - for literal in jaxpr_literals(subjaxpr): - yield literal - for v in eqn.invars: - if type(v) is core.Literal: - yield v.val + """Generates all the literals inside a jaxpr, including nested subjaxprs.""" + for eqn in jaxpr.eqns: + for v in eqn.invars: + if type(v) is core.Literal: + yield v.val + for subjaxpr in core.subjaxprs(jaxpr): + yield from jaxpr_literals(subjaxpr) + def jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, name_stack, *args): platform = xb.get_backend(backend).platform @@ -341,7 +334,7 @@ def write(v, node): elif eqn.primitive in call_translations: new_params = check_backend_params(eqn.params, backend) rule = call_translations[eqn.primitive] - ans = rule(c, eqn.bound_subjaxpr, axis_env, in_nodes, + ans = rule(c, axis_env, in_nodes, name_stack, backend=backend, **new_params) else: msg = "XLA translation rule for primitive '{}' not found" @@ -402,13 +395,19 @@ def _axis_groups(nrep, mesh_spec, mesh_axes): return tuple(map(tuple, groups.T)) def jaxpr_replicas(jaxpr): + """The number of replicas needed for a jaxpr. + + For a eqn, multiply the `axis_size` with the `jaxpr_replicas` of the + subjaxprs. For a list of eqns, take the maximum number of replicas. + """ return max(it.chain([1], (eqn_replicas(eqn) for eqn in jaxpr.eqns))) # TODO(mattjj): this function assumes that only pmap has a parameter named # axis_size, and that it corresponds to cross-replica mapping def eqn_replicas(eqn): - if eqn.bound_subjaxpr: - return eqn.params.get('axis_size', 1) * jaxpr_replicas(eqn.bound_subjaxpr) + call_jaxpr = eqn.params.get("call_jaxpr") + if call_jaxpr: + return eqn.params.get('axis_size', 1) * jaxpr_replicas(call_jaxpr) elif eqn.primitive in initial_style_translations: return initial_style_primitive_replicas(eqn.params) else: @@ -424,37 +423,23 @@ def initial_style_primitive_replicas(params): # not-yet-supported features are used with multi-host programming def jaxpr_has_pmap(jaxpr): - return any(eqn_has_pmap(eqn) for eqn in jaxpr.eqns) - -def eqn_has_pmap(eqn): - if eqn.bound_subjaxpr: - return jaxpr_has_pmap(eqn.bound_subjaxpr) - elif eqn.primitive in initial_style_translations: - return any(jaxpr_has_pmap(param if type(param) is core.Jaxpr else param.jaxpr) - for param in eqn.params.values() - if type(param) in (core.Jaxpr, core.TypedJaxpr)) - else: - return 'pmap' in eqn.primitive.name + """Whether there is an xla_pmap primitive anywhere inside a Jaxpr.""" + for eqn in jaxpr.eqns: + if 'xla_pmap' in eqn.primitive.name: + return True + for subjaxpr in core.subjaxprs(jaxpr): + if jaxpr_has_pmap(subjaxpr): + return True + return False def jaxpr_collectives(jaxpr): - return it.chain.from_iterable(eqn_collectives(eqn) for eqn in jaxpr.eqns) - -def eqn_collectives(eqn): - if eqn.bound_subjaxpr: - for c in jaxpr_collectives(eqn.bound_subjaxpr): - yield c - elif eqn.primitive in initial_style_translations: - for param in eqn.params.values(): - if type(param) is core.Jaxpr: - for c in jaxpr_collectives(param): - yield c - elif type(param) is core.TypedJaxpr: - for c in jaxpr_collectives(param.jaxpr): - yield c - else: + """Generates all the collective primitives anywhere inside a Jaxpr.""" + for eqn in jaxpr.eqns: if eqn.primitive in parallel_translations: yield eqn.primitive + for subjaxpr in core.subjaxprs(jaxpr): + yield from jaxpr_collectives(subjaxpr) ### xla_call underlying jit @@ -611,17 +596,19 @@ def _get_device(device, backend): return out xla_call_p = core.Primitive('xla_call') +xla_call_p.call_primitive = True xla_call_p.multiple_results = True xla_call = partial(core.call_bind, xla_call_p) xla_call_p.def_custom_bind(xla_call) xla_call_p.def_impl(_xla_call_impl) -def _xla_call_translation_rule(c, jaxpr, axis_env, - in_nodes, name_stack, backend, name, device=None): +def _xla_call_translation_rule(c, axis_env, + in_nodes, name_stack, backend, name, + call_jaxpr, device=None): del device # Ignored. subc = xb.make_computation_builder("jit_{}".format(name)) args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, (), + out_nodes = jaxpr_subcomp(subc, call_jaxpr, backend, axis_env, (), extend_name_stack(name_stack, wrap_name(name, 'jit')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) return c.Call(subc, list(in_nodes)) @@ -983,15 +970,16 @@ def _device_put_impl(x, device=None): masking.defvectorized(device_put_p) -def _remat_translation_rule(c, jaxpr, axis_env, in_nodes, - name_stack, backend, name, device=None, concrete=None): +def _remat_translation_rule(c, axis_env, in_nodes, + name_stack, backend, name, call_jaxpr, + device=None, concrete=None): # This looks a lot like _xla_call_translation_rule, except for a widget we use # to foil CSE. del device, concrete # Unused. subc = xb.make_computation_builder("remat_call_subcomputation") args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] args = [_foil_cse(subc, x) for x in args] - out_nodes = jaxpr_subcomp(subc, jaxpr, backend, axis_env, (), + out_nodes = jaxpr_subcomp(subc, call_jaxpr, backend, axis_env, (), extend_name_stack(name_stack, wrap_name(name, 'remat')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) return c.Call(subc, list(in_nodes)) diff --git a/jax/test_util.py b/jax/test_util.py index 0feba64779e4..b41aa2b2b739 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -27,6 +27,7 @@ import numpy.random as npr from . import api +from . import core from . import dtypes from . import lax from .config import flags, bool_env @@ -616,9 +617,8 @@ def _iter_eqns(jaxpr): # TODO(necula): why doesn't this search in params? for eqn in jaxpr.eqns: yield eqn - if eqn.bound_subjaxpr: - for sub_eqn in _iter_eqns(eqn.bound_subjaxpr): - yield sub_eqn + for subjaxpr in core.subjaxprs(jaxpr): + yield from _iter_eqns(subjaxpr) def assert_dot_precision(expected_precision, fun, *args): jaxpr = api.make_jaxpr(fun)(*args) diff --git a/tests/api_test.py b/tests/api_test.py index 1cb47cc65b83..50ef7e38d92f 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1003,8 +1003,8 @@ def f(a, b, c): c = onp.ones((2, 3, 3)) jaxpr = api.make_jaxpr(lambda b, c: f(a, b, c))(b, c) - subjaxpr = next(eqn.bound_subjaxpr for eqn in jaxpr.jaxpr.eqns - if eqn.bound_subjaxpr) + subjaxpr = next(eqn.params["call_jaxpr"] for eqn in jaxpr.jaxpr.eqns + if "call_jaxpr" in eqn.params) self.assertEqual(len(subjaxpr.eqns), 1) def test_grad_of_int_errors(self): @@ -1683,7 +1683,7 @@ def jaxpr_subcomp_and_collect(c, jaxpr, *args, **kwargs): self.assertLen(outer_jaxpr.eqns, 1) self.assertEqual(outer_jaxpr.eqns[0].primitive.name, 'xla_call') - subjaxpr_1 = outer_jaxpr.eqns[0].bound_subjaxpr + subjaxpr_1 = outer_jaxpr.eqns[0].params["call_jaxpr"] self.assertEqual(str(subjaxpr_1), str(inner_jaxpr)) self.assertLen(inner_jaxpr.eqns, 2) self.assertEqual(inner_jaxpr.eqns[0].primitive.name, 'mul') diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 0f7ebb1e74bd..b20e801e105a 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -1126,6 +1126,7 @@ def testExpm(self, n, dtype, rng_factory): for dtype in float_types + complex_types )) def testIssue2131(self, n, dtype): + _skip_on_mac_xla_bug() args_maker_zeros = lambda: [onp.zeros((n, n), dtype)] osp_fun = lambda a: osp.linalg.expm(a) jsp_fun = lambda a: jsp.linalg.expm(a) From c999a482b09712879555522c40db6369a29ecd55 Mon Sep 17 00:00:00 2001 From: Jamie Townsend Date: Mon, 10 Feb 2020 18:23:19 +0000 Subject: [PATCH 0734/1053] Test for PRNG consistency accross JAX versions --- tests/random_test.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/random_test.py b/tests/random_test.py index 7b7e1f3f547b..baca819d1dc6 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -519,6 +519,39 @@ def fail(*args, **kwargs): assert False finally: xla.apply_primitive = apply_primitive + def testPRNGValues(self): + # Test to ensure consistent random values between JAX versions + k = random.PRNGKey(0) + + randints = random.randint(k, (3, 3), 0, 8) + if FLAGS.jax_enable_x64: + self.assertAllClose( + random.randint(k, (3, 3), 0, 8), + onp.array([[7, 2, 6], + [2, 1, 0], + [6, 7, 7]], dtype='int64'), + check_dtypes=True) + else: + self.assertAllClose( + random.randint(k, (3, 3), 0, 8), + onp.array([[2, 1, 3], + [6, 1, 5], + [6, 3, 4]], dtype='int32'), + check_dtypes=True) + + self.assertAllClose( + random.split(k, 4), + onp.array([[2285895361, 1501764800], + [1518642379, 4090693311], + [ 433833334, 4221794875], + [ 839183663, 3740430601]], dtype='uint32'), + check_dtypes=True) + + self.assertAllClose( + random.fold_in(k, 4), + onp.array([2285895361, 433833334], dtype='uint32'), + check_dtypes=True) + if __name__ == "__main__": absltest.main() From 9797ea2485540ac7bf9e0f48cba4a4c7f0a6d8bc Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Tue, 11 Feb 2020 14:11:48 +0000 Subject: [PATCH 0735/1053] Implement size/ndim/__len__/repr/str/eq/hash for ShapeDtypeStruct. (#2206) --- jax/api.py | 24 ++++++++++++++++++++++++ tests/api_test.py | 20 ++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/jax/api.py b/jax/api.py index 8c2498621e47..7858d54eab51 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1955,6 +1955,30 @@ def __init__(self, shape, dtype): self.shape = shape self.dtype = dtype + size = property(lambda self: onp.prod(self.shape)) + ndim = property(lambda self: len(self.shape)) + + def __len__(self): + try: + return self.shape[0] + except IndexError: + raise TypeError("len() of unsized object") # same as numpy error + + def __repr__(self): + return "{}(shape={}, dtype={})".format( + type(self).__name__, self.shape, self.dtype.dtype.name) + + __str__ = __repr__ + + def __eq__(self, other): + if not isinstance(other, ShapeDtypeStruct): + return False + else: + return (other.shape, other.dtype) == (self.shape, self.dtype) + + def __hash__(self): + return hash((self.shape, self.dtype)) + def eval_shape(fun, *args, **kwargs): """Compute the shape/dtype of ``fun(*args, **kwargs)`` without any FLOPs. diff --git a/tests/api_test.py b/tests/api_test.py index 50ef7e38d92f..f93247a7269a 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -891,6 +891,26 @@ def f(pt): g = api.grad(f)(pt) self.assertIsInstance(pt, ZeroPoint) + @parameterized.parameters(1, 2, 3) + def test_shape_dtype_struct(self, i): + s = api.ShapeDtypeStruct(shape=(i, 2, 3), dtype=np.float32) + self.assertEqual(s.shape, (i, 2, 3)) + self.assertEqual(s.dtype, np.float32) + self.assertEqual(s.ndim, 3) + self.assertEqual(s.size, i * 2 * 3) + self.assertLen(s, i) + for f in (str, repr): + self.assertEqual( + f(s), "ShapeDtypeStruct(shape=({}, 2, 3), dtype=float32)".format(i)) + + def test_shape_dtype_struct_scalar(self): + s = api.ShapeDtypeStruct(shape=(), dtype=np.float32) + self.assertEmpty(s.shape) + self.assertEqual(s.size, 1) + self.assertEqual(s.ndim, 0) + with self.assertRaisesRegex(TypeError, "len[(][)] of unsized object"): + _ = len(s) + def test_eval_shape(self): def fun(x, y): return np.tanh(np.dot(x, y) + 3.) From 9e6fe64a66a4fac78ef9c8e57bb0818e4af6b619 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 11 Feb 2020 07:21:17 -0800 Subject: [PATCH 0736/1053] bump version and update changelog for pypi --- CHANGELOG.md | 6 ++++-- jax/version.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55722cdd0944..1eab5c26d7a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ These are the release notes for JAX. -## jax 0.1.59 (unreleased) +## jax 0.1.60 (unreleased) + +## jax 0.1.59 (February 11, 2020) ### Breaking changes @@ -10,7 +12,7 @@ These are the release notes for JAX. * Simplified `Jaxpr` by removing the `Jaxpr.freevars` and `Jaxpr.bound_subjaxprs`. The call primitives (`xla_call`, `xla_pmap`, `sharded_call`, and `remat_call`) get a new parameter `call_jaxpr` with a - fully-closed (no `constvars`) JAXPR. + fully-closed (no `constvars`) JAXPR. ### New features diff --git a/jax/version.py b/jax/version.py index d40ee5e15f5b..8ea3905de59c 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.58" +__version__ = "0.1.59" From e41e24358c4956faa428e9e3a429f8f099811af1 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 11 Feb 2020 13:10:53 -0800 Subject: [PATCH 0737/1053] fix multi-device error messages (#2213) * fix multi-device error messages, travis tests * don't run multi-device tests on travis (segfaults) * fix typo --- .travis.yml | 8 ++++---- jax/interpreters/xla.py | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 920c9b8cf6c6..d63badf8f764 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,14 +31,14 @@ install: - pip install jaxlib==0.1.38 - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - - if [[ "$JAX_ONLY_DOCUMENTATION" != "" ]]; then + - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then conda install --yes -c conda-forge pandoc ipykernel; conda install --yes sphinx sphinx_rtd_theme nbsphinx jupyter_client matplotlib; pip install sklearn; fi script: - - if [[ "$JAX_ONLY_DOCUMENTATION" == "" ]]; then - pytest -n 1 tests examples -W ignore ; + - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then + sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html ; else - sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html; + pytest -n 1 tests examples -W ignore ; fi diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 5fb295f033e2..e95e97195af5 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -203,8 +203,7 @@ def _device_from_arg_devices(devices): return device except ValueError: msg = "primitive arguments must be colocated on the same device, got {}" - names = ("{}({})".format(d[0].__name__, d[1]) for d in devices if d is not None) - raise ValueError(msg.format(", ".join(names))) + raise ValueError(msg.format(", ".join(map(str, devices)))) @cache() def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params): From 5e77789afe6118b80341d341f09b8b390edbf703 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 11 Feb 2020 13:42:11 -0800 Subject: [PATCH 0738/1053] Update Cloud TPU email address to jax-tpu@googlegroups.com --- cloud_tpu_colabs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md index dad523ff4fff..05bf4ce8d0f9 100644 --- a/cloud_tpu_colabs/README.md +++ b/cloud_tpu_colabs/README.md @@ -129,4 +129,4 @@ tracker](https://github.com/google/jax/issues) and we'll triage it appropriately. If you have any other questions or comments regarding JAX on Cloud TPUs, please -email jax-tpu@google.com. We’d like to hear from you! +email jax-tpu@googlegroups.com. We’d like to hear from you! From 7ca43f0ea96a3e2253b346bad8b2c1764290bd50 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 11 Feb 2020 15:56:53 -0800 Subject: [PATCH 0739/1053] more nonlinear evaluation in backward_pass.py (#2214) * more nonlinear evaluation in backward_pass.py fixes #2180 * add tests, fix #1963 by not raising error eagerly --- jax/interpreters/ad.py | 27 ++++++++----------------- jax/lax/lax_control_flow.py | 8 ++++---- tests/api_test.py | 39 +++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 37c40b5912b4..9b3c557ad991 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -183,21 +183,12 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - call_jaxpr = eqn.params["call_jaxpr"] + call_jaxpr, params = core.extract_call_jaxpr(eqn.primitive, eqn.params) if any(is_linear(v) for v in eqn.invars): linear_eqns.append(eqn) - elif eqn.primitive is not pe.remat_call_p: - ans = _eval_subjaxpr_primals( - eqn.primitive, call_jaxpr, - map(read_primal, eqn.invars), eqn.params) - map(write_primal, eqn.outvars, ans) - - # we special-case remat_call here because it can be mixed linear / - # nonlinear, so we always evaluate it even if it has a linear part - if eqn.primitive is pe.remat_call_p: - ans = _eval_subjaxpr_primals( - eqn.primitive, call_jaxpr, - map(read_primal, eqn.invars), eqn.params) + if any(not is_linear(v) for v in eqn.invars): + ans = _eval_subjaxpr_primals(eqn.primitive, call_jaxpr, + map(read_primal, eqn.invars), params) map(write_primal, eqn.outvars, ans) ct_env = {} @@ -260,12 +251,10 @@ def is_linear(var): else: write_primal(eqn.outvars[0], ans) else: - call_jaxpr = eqn.params["call_jaxpr"] - if (eqn.primitive is pe.remat_call_p or - not any(is_linear(v) for v in eqn.invars)): - ans = _eval_subjaxpr_primals( - eqn.primitive, call_jaxpr, - map(read_primal, eqn.invars), eqn.params) + call_jaxpr, params = core.extract_call_jaxpr(eqn.primitive, eqn.params) + if any(not is_linear(v) for v in eqn.invars): + ans = _eval_subjaxpr_primals(eqn.primitive, call_jaxpr, + map(read_primal, eqn.invars), params) map(write_primal, eqn.outvars, ans) return map(read_primal, jaxpr.outvars) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 7fcabadbea0e..bed09a4129ea 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1006,11 +1006,11 @@ def _scan_transpose(cts, *args, forward, length, num_consts, num_carry, jaxpr, l if xs_lin != [True] * (len(xs_lin) - num_eres) + [False] * num_eres: raise NotImplementedError if not all(init_lin): - raise NotImplementedError + pass # TODO(mattjj): error check https://github.com/google/jax/issues/1963 - consts, init, xs = split_list(args, [num_consts, num_carry]) - ires, consts = split_list(consts, [num_ires]) - xs, eres = split_list(xs, [sum(xs_lin)]) + consts, _, xs = split_list(args, [num_consts, num_carry]) + ires, _ = split_list(consts, [num_ires]) + _, eres = split_list(xs, [sum(xs_lin)]) assert not any(r is ad.undefined_primal for r in ires) assert not any(r is ad.undefined_primal for r in eres) diff --git a/tests/api_test.py b/tests/api_test.py index f93247a7269a..4f8169d7e7b6 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1660,6 +1660,45 @@ def loss(u0, target, steps, dt=1/np.sqrt(2), c=1): u0 = np.ones_like(target) loss(u0, target, 10) # doesn't crash + def test_remat_jit3(self): + # https://github.com/google/jax/issues/2180 + def f(w, x): + a = np.dot(x, w) + b = np.einsum("btd,bTd->btT", a, a) + c = np.einsum("btT,btd->btd", b, a) + return np.sum(c) + + w = np.ones([1, 1]) + x = np.ones([1, 1, 1]) + f = api.remat(f) + api.grad(f)(w, x) # doesn't crash + + @api.jit + def mul(a, b): + return a * b + + def f(w, x): + a = mul(w, x) + b = mul(a, a) + return b + + w = 1. + x = 1. + f = api.remat(f) + api.grad(f)(w, x) # doesn't crash + + def test_remat_scan2(self): + # https://github.com/google/jax/issues/1963 + + def scan_bug(x0): + f = lambda x, _: (x + 1, None) + def scanned_f(x, _): + return lax.scan(f, x, xs=None, length=1)[0], None + x, _ = jax.remat(scanned_f)(x0, None) + return x + + jax.grad(scan_bug)(1.0) # doesn't crash + def test_trivial_computations(self): x = np.array([1, 2, 3]) y = api.jit(lambda x: x)(x) From c6b65c0a11db8ffbe1f9bbde6752c1152480a1b1 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 11 Feb 2020 18:58:28 -0800 Subject: [PATCH 0740/1053] Bump jaxlib version to 0.1.39 and update WORKSPACE. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97dbe5dc5e16..6e2712fb92b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "4ce0e08aa014fafa7a0e8fb3531bdc914bd8a49828e1f5c31bb8adfb751ad73d", - strip_prefix = "tensorflow-210649dd56d7c4b75e3e8e2a851b61c80ae13dbb", + sha256 = "fb463ccb1f88f3fc397eac1544b4b827118eadaa37e1e01b50b010bcf80d7db8", + strip_prefix = "tensorflow-0ffde4c85d85e34390285fc9fcfbae766ae5260d", urls = [ - "https://github.com/tensorflow/tensorflow/archive/210649dd56d7c4b75e3e8e2a851b61c80ae13dbb.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/0ffde4c85d85e34390285fc9fcfbae766ae5260d.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index 007fa926a6de..b8f7834d9465 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.38" +__version__ = "0.1.39" From a5c3468c9360fb0644b3cdfe11d359e1be271f36 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 10 Feb 2020 11:40:05 +0100 Subject: [PATCH 0741/1053] Added the first draft of the Jaxpr documentation. This replaces the previous Google Doc version, and is now updated with the latest changes in Jaxpr. --- docs/conf.py | 2 +- docs/index.rst | 2 + docs/jax.dlpack.rst | 6 + docs/jax.rst | 4 +- docs/jax_internal_api.rst | 14 + docs/jaxpr.rst | 491 +++++++++++++++++++++++++++++++++++ docs/modules.rst | 7 - jax/api.py | 3 + jax/core.py | 21 +- jax/interpreters/batching.py | 6 + jax/test_util.py | 2 +- jax/tree_util.py | 1 + tests/api_test.py | 210 +++++++++++++-- 13 files changed, 738 insertions(+), 31 deletions(-) create mode 100644 docs/jax.dlpack.rst create mode 100644 docs/jax_internal_api.rst create mode 100644 docs/jaxpr.rst delete mode 100644 docs/modules.rst diff --git a/docs/conf.py b/docs/conf.py index a139d46cadf6..3c282baf226c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -34,7 +34,7 @@ # -- Project information ----------------------------------------------------- project = 'JAX' -copyright = '2019, Google LLC. NumPy and SciPy documentation are copyright the respective authors.' +copyright = '2020, Google LLC. NumPy and SciPy documentation are copyright the respective authors.' author = 'The JAX authors' # The short X.Y version diff --git a/docs/index.rst b/docs/index.rst index bc61a3e64055..80e67b3bf446 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -34,6 +34,7 @@ For an introduction to JAX, start at the :maxdepth: 1 :caption: Notes + jaxpr async_dispatch concurrency gpu_memory_allocation @@ -46,6 +47,7 @@ For an introduction to JAX, start at the :caption: Developer documentation developer + jax_internal_api .. toctree:: :maxdepth: 3 diff --git a/docs/jax.dlpack.rst b/docs/jax.dlpack.rst new file mode 100644 index 000000000000..3f0dcf4a845e --- /dev/null +++ b/docs/jax.dlpack.rst @@ -0,0 +1,6 @@ +jax.dlpack module +================= + +.. automodule:: jax.dlpack + :members: + :show-inheritance: \ No newline at end of file diff --git a/docs/jax.rst b/docs/jax.rst index a9d0a49c78c2..2ce609d5aee7 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -1,7 +1,7 @@ .. currentmodule:: jax -jax package -=========== +Public API: jax package +======================= Subpackages ----------- diff --git a/docs/jax_internal_api.rst b/docs/jax_internal_api.rst new file mode 100644 index 000000000000..c0945e1e1300 --- /dev/null +++ b/docs/jax_internal_api.rst @@ -0,0 +1,14 @@ +Internal APIs +============= + +core +----- + +.. currentmodule:: jax.core +.. automodule:: jax.core + +.. autosummary:: + :toctree: _autosummary + + Jaxpr + TypedJaxpr diff --git a/docs/jaxpr.rst b/docs/jaxpr.rst new file mode 100644 index 000000000000..bb9d350467d1 --- /dev/null +++ b/docs/jaxpr.rst @@ -0,0 +1,491 @@ +Understanding JAXPR +==================== + +(Note: the code examples in this file can be seed also in +``jax/tests/api_test::JaxprTest.testExamplesJaxprDoc``.) + +Conceptually, one can think of JAX transformations as first tracing the Python +function to be transformed into a small and well-behaved intermediate form, +the JAXPR, that is then transformed accordingly, and ultimately compiled and executed. +One of the reasons JAX can pack so much power into such a small software package +is that it starts with a familiar and flexible programming interface (Python with NumPy) +and it uses the actual Python interpreter to do most of the heavy lifting to distill the +essence of the computation into a simple statically-typed expression language +with limited higher-order features: the JAXPR language. + +Not all Python programs can be processed this way, but it turns out that many +scientific computing and machine learning programs do have this property. + +Before we proceed, it is important to point out that not all JAX transformations +materialize a JAXPR as described above; some, e.g., differentiation, +will apply transformations incrementally during tracing. +Nevertheless, if one wants to understand how JAX works internally, or to +make use of the result of JAX tracing, it is useful to understand JAXPR. + +A JAXPR instance represents a function with one of more typed parameters (input variables) +and one or more typed results. The results depend only on the input +variables; there are no free variables captured from enclosing scopes. +The inputs and outputs have types, which in JAX are represented as abstract +values. There are two related representations in the code for JAXPRs. The main +one is :py:class:`jax.core.TypedJaxpr` and is what you obtain when you +use :py:func:`jax.make_jaxpr` to inspect JAXPRs. It has the following +fields: + + * ``jaxpr``: is the actual computation content of the actual function (described below). + * ``literals`` is a list of constants. For various reasons, during tracing JAX + will collect the non-scalar constants that arise and will replace them with + variables, e.g., constants that appear in the Python program, or the result of + constant folding such constants. The variables that stand for these constants + are mentioned separately in the enclosed ``jaxpr``. + When applying a ``TypedJaxpr`` to some actual + arguments, one must pass first the ``literals`` followed by the actual arguments. + * ``in_avals`` and ``out_avals`` are the types of the input variables + (excluding the ones that correspond to the ``literals``), and of the output values. + These types are called in JAX abstract values, e.g., ``ShapedArray(float32[10,10])``. + +The most interesting part of the TypedJaxpr is the actual execution content, +represented as a :py:class:`jax.core.Jaxpr` as printed using the following +grammar:: + + JAXPR ::= { lambda Var* ; Var+. + let Eqn* + in [Expr+] } + +where: + * The parameter of the JAXPR are shown as two lists of variables separated by + ``;``. The first set of variables are the ones that have been introduced + to stand for constants that have been hoisted out. These are called the + `constvars`. The second list of variables are the real input variables. + * ``Eqn*`` is a list of equations, defining intermediate variables referring to + intermediate expressions. Each equation defines one or more variables as the + result of applying a primitive on some atomic expressions. Each equation uses only + input variables and intermediate variables defined by previous equations. + * ``Expr+``: is a list of output atomic expressions for the JAXPR. + +Equations are printed as follows:: + + Eqn ::= let Var+ = Primitive [ Param* ] Expr+ + +where: + * ``Var+”`` are one or more intermediate variables to be defined as the + output of a primitive invocation (some primitives can return multiple values) + * ``Expr+`` are one or more atomic expressions, each either a variable or a + literal constant. A special form of an atomic expression is the `unit` + expression, printed as ``*`` and standing for a value that is not needed + in the rest of the computation and has been elided. + * ``Param*`` are zero or more named parameters to the primitive, printed in + square brackets. Each parameter is shown as ``Name = Value``. + + +Most JAXPR primitives are first-order (they take just one or more Expr as arguments):: + + Primitive := add | sub | sin | mul | ... + + +The JAXPR primitives are documented in the :py:mod:`jax.lax` module. + +For example, here is the JAXPR produced for the function ``func1`` below:: + + from jax import numpy as jnp + def func1(first, second): + temp = first + jnp.sin(second) * 3. + return jnp.sum(temp) + + print(jax.make_jaxpr(func1)(jnp.zeros(8), jnp.ones(8))) + { lambda ; a b. + let c = sin b + d = mul c 3.0 + e = add a d + f = reduce_sum[ axes=(0,) + input_shape=(8,) ] e + in f } + +Here there are no constvars, ``a`` and ``b`` are the input variables +and they correspond respectively to +``first`` and ``second`` function parameters. The scalar literal ``3.0`` is kept +inline. +The ``reduce_sum`` primitive has named parameters ``axes`` and ``input_shape``, in +addition to the operand ``e``. + +Note that JAX traces through Python-level control-flow and higher-order functions +when it extracts the JAXPR. This means that just because a Python program contains +functions and control-flow, the resulting JAXPR does not have +to contain control-flow or higher-order features. +For example, when tracing the function ``func3`` JAX will inline the call to +``inner`` and the conditional ``if second.shape[0] > 4``, and will produce the same +JAXPR as before:: + + def func2(inner, first, second): + temp = first + inner(second) * 3. + return jnp.sum(temp) + + def inner(second): + if second.shape[0] > 4: + return jnp.sin(second) + else: + assert False + + def func3(first, second): + return func2(inner, first, second) + + print(api.make_jaxpr(func2)(jnp.zeros(8), jnp.ones(8))) + { lambda ; a b. + let c = sin b + d = mul c 3.0 + e = add a d + f = reduce_sum[ axes=(0,) + input_shape=(8,) ] e + in f } + +Handling PyTrees +---------------- + +In JAXPR there are no tuple types; instead primitives take multiple inputs +and produce multiple outputs. When processing a function that has structured +inputs or outputs, JAX will flatten those and in JAXPR they will appear as lists +of inputs and outputs. For more details, please see the documentation for +PyTrees (:doc:`notebooks/JAX_pytrees`). + +For example, the following code produces an identical JAXPR to what we saw +before (with two input vars, one for each element of the input tuple):: + + + def func4(arg): # Arg is a pair + temp = arg[0] + jnp.sin(arg[1]) * 3. + return jnp.sum(temp) + + print(api.make_jaxpr(func4)((jnp.zeros(8), jnp.ones(8)))) + { lambda a b. + let c = sin b + d = mul c 3.0 + e = add a d + f = reduce_sum[ axes=(0,) + input_shape=(8,) ] e + in f } + + + +Constant Vars +-------------- + +ConstVars arise when the computation ontains array constants, either +from the Python program, or from constant-folding. For example, the function +``func6`` below:: + + def func5(first, second): + temp = first + jnp.sin(second) * 3. - jnp.ones(8) + return temp + + def func6(first): + return func5(first, jnp.ones(8)) + + print(api.make_jaxpr(func6)(jnp.ones(8))) + + +JAX produces the following JAXPR:: + + { lambda b d a. + let c = add a b + e = sub c d + in e } + +When tracing ``func6``, the function ``func5`` is invoked with a constant value +(``onp.ones(8)``) for the second argument. As a result, the sub-expression +``jnp.sin(second) * 3.`` is constant-folded. +There are two ConstVars, ``b`` (standing for ``jnp.sin(second) * 3.``) and ``d`` +(standing for ``jnp.ones(8)``). Unfortunately, it is not easy to tell from the +JAXPR notation what constants the constant variables stand for. + +Higher-order primitives +----------------------- + +JAXPR includes several higher-order primitives. They are more complicated because +they include sub-JAXPRs. + +Cond +^^^^ + +JAX traces through normal Python conditionals. To capture a conditional expression +for dynamic execution, one must use the :py:func:`jax.lax.cond` constructor +with the following signature:: + + lax.cond(pred : bool, true_op: A, true_body: A -> B, false_op: C, false_body: C -> B) -> B + +For example:: + + + def func7(arg): + return lax.cond(arg >= 0., + arg, + lambda xtrue: xtrue + 3., + arg, + lambda xfalse: xfalse - 3.) + + print(api.make_jaxpr(func7)(5.)) + { lambda ; a. + let b = ge a 0.0 + c = cond[ false_jaxpr={ lambda ; a. + let b = sub a 3.0 + in b } + linear=(False, False) + true_jaxpr={ lambda ; a. + let b = add a 3.0 + in b } ] b a a + in c } + + +The cond primitive has a number of parameters: + + * `true_jaxpr` and `false_jaxpr` are JAXPRs that correspond to the true + and false branch functionals. In this example, those functionals take each + one input variable, corresponding to ``xtrue`` and ``xfalse`` respectively. + * `linear` is a tuple of booleans that is used internally by the auto-differentiation + machinery to encode which of the input parameters are used linearly in the + conditional. + +The above instance of the cond primitive takes 3 operands. +The first one (``b``) is the predicate, then ``a` is the ``true_op`` (``arg``, to be +passed to ``true_jaxpr``) and also ``a`` is the ``false_op`` +(``arg``, to be passed to ``false_jaxpr``). + +The following example shows a more complicated situation when the input +to the branch functionals is a tuple, and the `false` branch functional +contains a constant ``jnp.ones(1)`` that is hoisted as a `constvar`:: + + def func8(arg1, arg2): # arg2 is a pair + return lax.cond(arg1 >= 0., + arg2, + lambda xtrue: xtrue[0], + arg2, + lambda xfalse: jnp.ones(1) + xfalse[1]) + + print(api.make_jaxpr(func8)(5., (jnp.zeros(1), 2.))) + { lambda e ; a b c. + let d = ge a 0.0 + f = cond[ false_jaxpr={ lambda ; c a b. + let d = add c b + in d } + linear=(False, False, False, False, False) + true_jaxpr={ lambda ; a b. + let + in a } ] d b c e b c + in f } + +The top-level JAXPR has one `constvar` ``e`` (corresponding to ``jnp.ones(1)`` from the +body of the ``false_jaxpr``) and three input variables ``a b c`` (corresponding to ``arg1`` +and the two elements of ``arg2``; note that ``arg2`` has been flattened). +The ``true_jaxpr`` has two input variables (corresponding to the two elements of ``arg2`` +that is passed to ``true_jaxpr``). +The ``false_jaxpr`` has three input variables (``c`` corresponding to the constant for +``jnp.ones(1)``, and ``a b`` for the two elements of ``arg2`` that are passed +to ``false_jaxpr``). + +The actual operands to the cond primitive are: ``d b c e b c``, which correspond in order to: + + * 1 operand for the predicate, + * 2 operands for ``true_jaxpr``, i.e., ``b`` and ``c``, which are input vars, + corresponding to ``arg2`` for the top-level JAXPR, + * 1 constant for ``false_jaxpr``, i.e., ``e``, which is a consvar for the top-level JAXPR, + * 2 operands for ``true_jaxpr``, i.e., ``b`` and ``c``, which are the input vars + corresponding to ``arg2`` for the top-level JAXPR. + +While +^^^^^ + +Just like for conditionals, Python loops are inlined during tracing. +If you want to capture a loop for dynamic execution, you must use one of several +special operations, :py:func:`jax.lax.while_loop` (a primitive) +and :py:func:`jax.lax.fori_loop` +(a helper that generates a while_loop primitive):: + + lax.while_loop(cond_fun: (C -> bool), body_fun: (C -> C), init: C) -> C + lax.fori_loop(start: int, end: int, body: (int -> C -> C), init: C) -> C + + +In the above signature, “C” stands for the type of a the loop “carry” value. +For example, here is an example fori loop:: + + def func10(arg, n): + ones = jnp.ones(arg.shape) # A constant + return lax.fori_loop(0, n, + lambda i, carry: carry + ones * 3. + arg, + arg + ones) + + print(api.make_jaxpr(func10)(onp.ones(16), 5)) + { lambda c d ; a b. + let e = add a d + f g h = while[ body_jaxpr={ lambda ; e g a b c. + let d = add a 1 + f = add c e + h = add f g + in (d, b, h) } + body_nconsts=2 + cond_jaxpr={ lambda ; a b c. + let d = lt a b + in d } + cond_nconsts=0 ] c a 0 b e + in h } + +The top-level JAXPR has two constvars: ``c`` (corresponding to ``ones * 3.`` from the body +of the loop) and ``d`` (corresponding to the use of ``ones`` in the initial carry). +There are also two input variables (``a`` corresponding to ``arg`` and ``b`` corresponding +to ``n``). +The loop carry consists of three values, as seen in the body of ``cond_jaxpr`` +(corresponding to the iteration index, iteration end, and the accumulated value carry). +Note that ``body_jaxpr`` takes 5 input variables. The first two are actually +constvars: ``e`` corresponding to ``ones * 3`` and ``g`` corresponding to the +captures use of ``arg`` in the loop body. +The parameter ``body_nconsts = 2`` specifies that there are 2 constants for the +``body_jaxpr``. +The other 3 input variables for ``body_jaxpr`` correspond to the flattened carry values. + +The while primitive takes 5 arguments: ``c a 0 b e``, as follows: + + * 0 constants for ``cond_jaxpr`` (since ``cond_nconsts`` is 0) + * 2 constants for ``body_jaxpr`` (``c``, and ``a``) + * 3 parameters for the initial value of carry + +Scan +^^^^ + +JAX supports a special form of loop over the elements of an array (with +statically known shape). The fact that there are a fixed number of iterations +makes this form of looping easily reverse-differentiable. Such loops are constructed +with the :py:func:`jax.lax.scan` operator:: + + lax.scan(body_fun: (C -> A -> (C, B)), init_carry: C, in_arr: Array[A]) -> (C, Array[B]) + +Here ``C`` is the type of the scan carry, ``A`` is the element type of the input array(s), +and ``B`` is the element type of the output array(s). + +For the example consider the function ``func11`` below:: + + def func11(arr, extra): + ones = jnp.ones(arr.shape) # A constant + def body(carry, aelems): + # carry: running dot-product of the two arrays + # aelems: a pair with corresponding elements from the two arrays + ae1, ae2 = aelems + return (carry + ae1 * ae2 + extra, carry) + + return lax.scan(body, 0., (arr, ones)) + + print(api.make_jaxpr(func11)(onp.ones(16), 5.)) + { lambda c ; a b. + let d e = scan[ forward=True + jaxpr={ lambda ; a b c d e. + let f = mul c e + g = add b f + h = add g a + in (h, b) } + length=16 + linear=(False, False, False, True, False) + num_carry=1 + num_consts=1 ] b 0.0 a * c + in (d, e) } + +The top-level JAXPR has one constvar ``c`` corresponding to the ``ones`` constant, +and two input variables corresponding to the arguments ``arr`` and ``extra``. +The body of the scan has 5 input variables, of which: + + * one (``a``) is a constant (since ``num_consts = 1``), and stands for the + captured variable ``extra`` used in the loop body, + * one (``b``) is the value of the carry (since ``num_carry = 1``) + * The remaining 3 are the input values. Notice that only ``c`` and ``e`` are used, + and stand respectively for the array element from the first array passed to + lax.scan (``arr``) and to the second array (``ones``). The input variables + (``d``) seems to be an artifact of the translation. + +The ``linear`` parameter describes for each of the input variables whether they +are guaranteed to be used linearly in the body. Here, only the unused input +variable is marked linear. Once the scan goes through linearization, more arguments +will be linear. + +The scan primitive takes 5 arguments: ``b 0.0 a * c``, of which: + + * one is the free variable for the body + * one is the initial value of the carry + * The next 3 are the arrays over which the scan operates. The middle one is not used (*). + +XLA_call +^^^^^^^^ + +The call primitive arises from JIT compilation, and it encapsulates +a sub-JAXPR along with parameters the specify the backend and the device the +computation should run. For example:: + + def func12(arg): + @api.jit + def inner(x): + return x + arg * jnp.ones(1) # Include a constant in the inner function + return arg + inner(arg - 2.) + + print(api.make_jaxpr(func12)(1.)) + { lambda b ; a. + let c = sub a 2.0 + d = xla_call[ backend=None + call_jaxpr={ lambda ; c b a. + let d = mul b c + e = add a d + in e } + device=None + name=inner ] b a c + e = add a d + in e } + +The top-level constvar ``b`` refers to the ``jnp.ones(1)`` constant, and +the top-level input variable `a` refers to the ``arg`` parameter of ``func12``. +The ``xla_call`` primitive stands for a call to the jitted ``inner`` function. +The primitive has the function body in the ``call_jaxpr`` parameter, a JAXPR +with 3 input parameters: + + * ``c`` is a constvar and stands for the ``ones`` constant, + * ``b`` corresponds to the free variable ``arg`` captured in the ``inner`` function, + * ``a`` corresponds to the ``inner`` parameter ``x`. + +The primitive takes three arguments ``b a c``. + +XLA_pmap +^^^^^^^^ + +If you use the :py:func:`jax.pmap` transformation, the function to be +mapped is captured using the ``xla_pmap`` primitive. Consider this +example:: + + def func13(arr, extra): + def inner(x): + # use a free variable "extra" and a constant jnp.ones(1) + return (x + extra + jnp.ones(1)) / lax.psum(x, axis_name='rows') + return api.pmap(inner, axis_name='rows')(arr) + + print(api.make_jaxpr(func13)(jnp.ones((1, 3)), 5.)) + { lambda c ; a b. + let d = xla_pmap[ axis_name=rows + axis_size=1 + backend=None + call_jaxpr={ lambda ; d b a. + let c = add a b + e = add c d + f = psum[ axis_name=rows ] a + g = div e f + in g } + devices=None + global_axis_size=None + mapped_invars=(True, False, True) + name=inner ] c b a + in d } + +The top-level constvar ``c`` refers to the ``jnp.ones(1)`` constant. +The ``xla_pmap`` primitive specifies the name of the axis (parameter ``rows``) +and the body of the function to be mapped as the ``call_jaxpr`` parameter. The +value of this parameter is a Jaxpr with 3 input variables: + + * ``d`` stands for the constant ``jnp.ones(1)``, + * ``b`` stands for the free variable ``extra``, + * ``a`` stands for the parameter ``x`` of ``inner``. + + +The parameter ``mapped_invars`` specify which of the input variables should be +mapped and which should be broadcast. In our example, the value of ``extra`` +is broadcast, the other input values are mapped. + diff --git a/docs/modules.rst b/docs/modules.rst deleted file mode 100644 index c134b0c8b363..000000000000 --- a/docs/modules.rst +++ /dev/null @@ -1,7 +0,0 @@ -jax -=== - -.. toctree:: - :maxdepth: 4 - - jax diff --git a/jax/api.py b/jax/api.py index 7858d54eab51..433735b62fb9 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1154,6 +1154,7 @@ def linearize(fun, *primals): In terms of values computed, `linearize` behaves much like a curried `jvp`, where these two code blocks compute the same values:: + y, out_tangent = jax.jvp(f, (x,), (in_tangent,)) y, f_jvp = jax.linearize(f, x) @@ -1168,8 +1169,10 @@ def linearize(fun, *primals): i.e. to evaluate a pushforward for many different input tangent vectors at the same linearization point. Moreover if all the input tangent vectors are known at once, it can be more efficient to vectorize using `vmap`, as in:: + pushfwd = partial(jvp, f, (x,)) y, out_tangents = vmap(pushfwd, out_axes=(None, 0))((in_tangents,)) + By using `vmap` and `jvp` together like this we avoid the stored-linearization memory cost that scales with the depth of the computation, which is incurred by both `linearize` and `vjp`. diff --git a/jax/core.py b/jax/core.py index 5cfaadaa8104..e13376996a95 100644 --- a/jax/core.py +++ b/jax/core.py @@ -309,6 +309,7 @@ def full_raise(self, val): def pure(self, val): + """Given a concrete value, makes a Tracer for it.""" assert False def lift(self, tracer): @@ -317,6 +318,19 @@ def lift(self, tracer): def sublift(self, tracer): assert False + def process_primitive(self, primitive, tracers, params): + """Processes a primitive + + Args: + primitive: the primitive + tracers: the tracers for the arguments + params: the primitive parameters + + Returns: + either a tracer, or a list of tracers (if primitive.multiple_results) + """ + assert False, "Must override" + def __repr__(self): return '{}(level={}/{})'.format( self.__class__.__name__, self.level, self.sublevel) @@ -713,8 +727,13 @@ def pp_eqn(eqn): >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr def pp_jaxpr(jaxpr): + if len(jaxpr.outvars) > 1: + pp_outvars = str(tuple(jaxpr.outvars)) + else: + pp_outvars = str(jaxpr.outvars[0]) + return (pp('{{ lambda {} ; {}.'.format(pp_vars(jaxpr.constvars), pp_vars(jaxpr.invars))) + ((pp('let ') >> vcat(map(pp_eqn, jaxpr.eqns))) + - pp('in {} }}'.format(jaxpr.outvars))).indent(2)) + pp('in {} }}'.format(pp_outvars))).indent(2)) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index d2cdb3fa9cf3..65144fc29288 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -174,6 +174,12 @@ def defbroadcasting(prim): primitive_batchers[prim] = partial(broadcast_batcher, prim) def broadcast_batcher(prim, args, dims, **params): + """Process a primitive with built-in broadcasting. + + Args: + args: the arguments + dims: for each argument, the dimension that is being batched (or None) + """ shapes = {(x.shape, d) for x, d in zip(args, dims) if onp.ndim(x)} if len(shapes) == 1: # if there's only agreeing batch dims and scalars, just call the primitive diff --git a/jax/test_util.py b/jax/test_util.py index b41aa2b2b739..dc887f177b26 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -699,7 +699,7 @@ def assertMultiLineStrippedEqual(self, expected, what): expected_clean = re.sub(ignore_space_re, '\n', expected.strip()) what_clean = re.sub(ignore_space_re, '\n', what.strip()) self.assertMultiLineEqual(expected_clean, what_clean, - msg="Expecting\n"+expected) + msg="Found\n{}\nExpecting\n{}".format(what, expected)) def _CompileAndCheck(self, fun, args_maker, check_dtypes, rtol=None, atol=None): diff --git a/jax/tree_util.py b/jax/tree_util.py index f56eeaef8fe3..2967bb7bd106 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -174,6 +174,7 @@ def tree_transpose(outer_treedef, inner_treedef, pytree_to_transpose): type(None): _RegistryEntry(lambda z: ((), None), lambda _, xs: None), } def _replace_nones(sentinel, tree): + """Replaces `None` in `tree` with `sentinel`.""" if tree is None: return sentinel else: diff --git a/tests/api_test.py b/tests/api_test.py index f93247a7269a..913b33373f9e 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1735,11 +1735,11 @@ def fun(x): return (x, 1., np.zeros(1)) jaxpr = api.make_jaxpr(fun)(0.) - self.assertMultiLineStrippedEqual(str(jaxpr), """ - { lambda b ; a. - let - in [a, 1.0, b] } - """) + self.assertMultiLineStrippedEqual(""" +{ lambda b ; a. + let + in (a, 1.0, b) } + """, str(jaxpr)) def test_cond(self): def f(x): @@ -1749,21 +1749,193 @@ def f(x): x + 2., lambda xf: xf - x) jaxpr = api.make_jaxpr(f)(3.) - self.assertMultiLineStrippedEqual(str(jaxpr), """ - { lambda ; a. - let b = ge a 0.0 - c = add a 1.0 - d = add a 2.0 - e = cond[ false_jaxpr={ lambda ; b a. - let c = sub a b - in [c] } - linear=(False, False, False, False) - true_jaxpr={ lambda ; b a. + self.assertMultiLineStrippedEqual(""" +{ lambda ; a. + let b = ge a 0.0 + c = add a 1.0 + d = add a 2.0 + e = cond[ false_jaxpr={ lambda ; b a. + let c = sub a b + in c } + linear=(False, False, False, False) + true_jaxpr={ lambda ; b a. + let c = add a b + in c } ] b a c a d + in e } + """, str(jaxpr)) + + def testExamplesJaxprDoc(self): + """Tests examples included in the Understanding JAXPRs doc (docs/jaxpr.rst).""" + from jax import numpy as jnp + def func1(first, second): + temp = first + jnp.sin(second) * 3. + return jnp.sum(temp) + + jaxpr = jax.make_jaxpr(func1)(jnp.zeros(8), jnp.ones(8)) + self.assertMultiLineStrippedEqual(""" +{ lambda ; a b. + let c = sin b + d = mul c 3.0 + e = add a d + f = reduce_sum[ axes=(0,) + input_shape=(8,) ] e + in f } + """, str(jaxpr)) + + def func5(first, second): + temp = first + np.sin(second) * 3. - jnp.ones(8) + return temp + + def func6(first): + return func5(first, jnp.ones(8)) + + jaxpr = api.make_jaxpr(func6)(jnp.ones(8)) + self.assertMultiLineStrippedEqual(""" +{ lambda b d ; a. + let c = add a b + e = sub c d + in e } + """, str(jaxpr)) + + def func7(arg): + return lax.cond(arg >= 0., + arg, + lambda xtrue: xtrue + 3., + arg, + lambda xfalse: xfalse - 3.) + + jaxpr = api.make_jaxpr(func7)(5.) + self.assertMultiLineStrippedEqual(""" +{ lambda ; a. + let b = ge a 0.0 + c = cond[ false_jaxpr={ lambda ; a. + let b = sub a 3.0 + in b } + linear=(False, False) + true_jaxpr={ lambda ; a. + let b = add a 3.0 + in b } ] b a a + in c } + """, str(jaxpr)) + + def func8(arg1, arg2): # arg2 is a pair + return lax.cond(arg1 >= 0., + arg2, + lambda xtrue: xtrue[0], + arg2, + lambda xfalse: jnp.ones(1) + xfalse[1]) + + jaxpr = api.make_jaxpr(func8)(5., (jnp.zeros(1), 2.)) + self.assertMultiLineStrippedEqual(""" +{ lambda e ; a b c. + let d = ge a 0.0 + f = cond[ false_jaxpr={ lambda ; c a b. + let d = add c b + in d } + linear=(False, False, False, False, False) + true_jaxpr={ lambda ; a b. + let + in a } ] d b c e b c + in f } + """, str(jaxpr)) + + def func10(arg, n): + ones = jnp.ones(arg.shape) # A constant + return lax.fori_loop(0, n, + lambda i, carry: carry + ones * 3. + arg, + arg + ones) + + jaxpr = api.make_jaxpr(func10)(onp.ones(16), 5) + self.assertMultiLineStrippedEqual(""" +{ lambda c d ; a b. + let e = add a d + f g h = while[ body_jaxpr={ lambda ; e g a b c. + let d = add a 1 + f = add c e + h = add f g + in (d, b, h) } + body_nconsts=2 + cond_jaxpr={ lambda ; a b c. + let d = lt a b + in d } + cond_nconsts=0 ] c a 0 b e + in h } + """, str(jaxpr)) + + def func11(arr, extra): + ones = jnp.ones(arr.shape) # A constant + + def body(carry, aelems): + # carry: running dot-product of the two arrays + # aelems: a pair with corresponding elements from the two arrays + ae1, ae2 = aelems + return (carry + ae1 * ae2 + extra, carry) + + return lax.scan(body, 0., (arr, ones)) + + jaxpr = api.make_jaxpr(func11)(onp.ones(16), 5.) + self.assertMultiLineStrippedEqual(""" +{ lambda c ; a b. + let d e = scan[ forward=True + jaxpr={ lambda ; a b c d e. + let f = mul c e + g = add b f + h = add g a + in (h, b) } + length=16 + linear=(False, False, False, True, False) + num_carry=1 + num_consts=1 ] b 0.0 a * c + in (d, e) } + """, str(jaxpr)) + + def func12(arg): + @api.jit + def inner(x): + return x + arg * jnp.ones(1) # Include a constant in the inner function + + return arg + inner(arg - 2.) + + jaxpr = api.make_jaxpr(func12)(1.) + self.assertMultiLineStrippedEqual(""" +{ lambda b ; a. + let c = sub a 2.0 + d = xla_call[ backend=None + call_jaxpr={ lambda ; c b a. + let d = mul b c + e = add a d + in e } + device=None + name=inner ] b a c + e = add a d + in e } + """, str(jaxpr)) + + def func13(arr, extra): + def inner(x): + # use a free variable "extra" and a constant jnp.ones(1) + return (x + extra + jnp.ones(1)) / lax.psum(x, axis_name='rows') + + return api.pmap(inner, axis_name='rows')(arr) + + jaxpr = api.make_jaxpr(func13)(jnp.ones((1, 3)), 5.) + self.assertMultiLineStrippedEqual(""" +{ lambda c ; a b. + let d = xla_pmap[ axis_name=rows + axis_size=1 + backend=None + call_jaxpr={ lambda ; d b a. let c = add a b - in [c] } ] b a c a d - in [e] } - """) - + e = add c d + f = psum[ axis_name=rows ] a + g = div e f + in g } + devices=None + global_axis_size=None + mapped_invars=(True, False, True) + name=inner ] c b a + in d } + """, str(jaxpr)) class LazyTest(jtu.JaxTestCase): From 96a65de6c89cb07001120d9681d2d8d5007e2416 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 12 Feb 2020 09:49:33 -0800 Subject: [PATCH 0742/1053] Try downloading bazel before using pre-installed bazel. (#2217) This ensures we're using the right bazel version. --- build/build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/build.py b/build/build.py index 4d1a4f9309ee..8a68d3a904c2 100755 --- a/build/build.py +++ b/build/build.py @@ -125,11 +125,11 @@ def get_bazel_path(bazel_path_flag): if bazel_path_flag: return bazel_path_flag - bazel = which("bazel") + bazel = download_and_verify_bazel() if bazel: return bazel - bazel = download_and_verify_bazel() + bazel = which("bazel") if bazel: return bazel From bf91ebf67a22a139059416b6bf52277b9f90562e Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 12 Feb 2020 09:57:54 -0800 Subject: [PATCH 0743/1053] Return error number in build.py on bad bazel version. (#2218) This prevents our build scripts from continuing on error. --- build/build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/build.py b/build/build.py index 8a68d3a904c2..66902687d34f 100755 --- a/build/build.py +++ b/build/build.py @@ -151,13 +151,13 @@ def check_bazel_version(bazel_path, min_version, max_version): if min_ints > actual_ints: print("Outdated bazel revision (>= {} required, found {})".format( min_version, version)) - sys.exit(0) + sys.exit(-1) if max_version is not None: max_ints = [int(x) for x in max_version.split(".")] if actual_ints >= max_ints: print("Please downgrade your bazel revision to build JAX (>= {} and < {}" " required, found {})".format(min_version, max_version, version)) - sys.exit(0) + sys.exit(-1) BAZELRC_TEMPLATE = """ From 00140f07e2b75ade8ae876103bd29bf682054c8e Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 12 Feb 2020 14:09:37 -0800 Subject: [PATCH 0744/1053] Add jax.numpy.vectorize (#2146) * Add jax.numpy.vectorize This is basically a non-experimental version of the machinery in `jax.experimental.vectorize`, except: - It adds the `excluded` argument from NumPy, which works just like `static_argnums` in `jax.jit`. - It doesn't include the `axis` argument yet (which NumPy doesn't have). Eventually we might want want to consolidate the specification of signatures with signatures used by shape-checking machinery, but it's nice to emulate NumPy's existing interface, and this is already useful (e.g., for writing vectorized linear algebra routines). * Add deprecation warning to jax.experimental.vectorize * improve implementation --- docs/jax.rst | 2 +- jax/experimental/vectorize.py | 9 ++ jax/numpy/__init__.py | 1 + jax/numpy/vectorize.py | 253 ++++++++++++++++++++++++++++++ tests/lax_numpy_vectorize_test.py | 217 +++++++++++++++++++++++++ 5 files changed, 481 insertions(+), 1 deletion(-) create mode 100644 jax/numpy/vectorize.py create mode 100644 tests/lax_numpy_vectorize_test.py diff --git a/docs/jax.rst b/docs/jax.rst index a9d0a49c78c2..717479b501b7 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -51,7 +51,7 @@ Vectorization (:code:`vmap`) ---------------------------- .. autofunction:: vmap - +.. autofunction:: numpy.vectorize Parallelization (:code:`pmap`) ------------------------------ diff --git a/jax/experimental/vectorize.py b/jax/experimental/vectorize.py index b795ce13d3be..4c1762810e01 100644 --- a/jax/experimental/vectorize.py +++ b/jax/experimental/vectorize.py @@ -97,6 +97,15 @@ def center(array): import jax.numpy as jnp import numpy as np import re +import warnings + + +warnings.warn( + "jax.experimental.vectorize is deprecated and will be removed soon. Use " + "jax.numpy.vectorize instead.", + FutureWarning, +) + # See http://docs.scipy.org/doc/numpy/reference/c-api.generalized-ufuncs.html _DIMENSION_NAME = r'\w+' diff --git a/jax/numpy/__init__.py b/jax/numpy/__init__.py index 2a6de18dd131..18c5cc15f41e 100644 --- a/jax/numpy/__init__.py +++ b/jax/numpy/__init__.py @@ -15,3 +15,4 @@ from .lax_numpy import * from . import fft from . import linalg +from .vectorize import vectorize diff --git a/jax/numpy/vectorize.py b/jax/numpy/vectorize.py new file mode 100644 index 000000000000..d297c4c45eb6 --- /dev/null +++ b/jax/numpy/vectorize.py @@ -0,0 +1,253 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import functools +import re +import textwrap +from typing import Any, Callable, Dict, List, Set, Tuple + +import numpy as onp + +from .. import api +from .. import lax +from .. import linear_util as lu +from . import lax_numpy as np +from ..util import safe_map as map, safe_zip as zip +from .lax_numpy import _wraps + + +# See http://docs.scipy.org/doc/numpy/reference/c-api.generalized-ufuncs.html +_DIMENSION_NAME = r'\w+' +_CORE_DIMENSION_LIST = '(?:{0:}(?:,{0:})*)?'.format(_DIMENSION_NAME) +_ARGUMENT = r'\({}\)'.format(_CORE_DIMENSION_LIST) +_ARGUMENT_LIST = '{0:}(?:,{0:})*'.format(_ARGUMENT) +_SIGNATURE = '^{0:}->{0:}$'.format(_ARGUMENT_LIST) + + +CoreDims = Tuple[str, ...] +NDArray = Any + + +def _parse_gufunc_signature( + signature: str, +) -> Tuple[List[CoreDims], List[CoreDims]]: + """Parse string signatures for a generalized universal function. + + Args: + signature: generalized universal function signature, e.g., + ``(m,n),(n,p)->(m,p)`` for ``np.matmul``. + + Returns: + Input and output core dimensions parsed from the signature. + """ + if not re.match(_SIGNATURE, signature): + raise ValueError( + 'not a valid gufunc signature: {}'.format(signature)) + return tuple([tuple(re.findall(_DIMENSION_NAME, arg)) + for arg in re.findall(_ARGUMENT, arg_list)] + for arg_list in signature.split('->')) + + +def _update_dim_sizes( + dim_sizes: Dict[str, int], + shape: Tuple[int, ...], + core_dims: CoreDims, + error_context: str = "", + *, + is_input: bool, +): + """Incrementally check and update core dimension sizes for a single argument. + + Args: + dim_sizes: sizes of existing core dimensions. Will be updated in-place. + shape: shape of this argument. + core_dims: core dimensions for this argument. + error_context: string context for error messages. + is_input: are we parsing input or output arguments? + """ + num_core_dims = len(core_dims) + if is_input: + if len(shape) < num_core_dims: + raise ValueError( + 'input with shape %r does not have enough dimensions for all core ' + 'dimensions %r %s' % (shape, core_dims, error_context)) + else: + if len(shape) != num_core_dims: + raise ValueError( + 'output shape %r does not match core dimensions %r %s' + % (shape, core_dims, error_context)) + + core_shape = shape[-num_core_dims:] if core_dims else () + for dim, size in zip(core_dims, core_shape): + if dim not in dim_sizes: + dim_sizes[dim] = size + elif size != dim_sizes[dim]: + raise ValueError( + 'inconsistent size for core dimension %r: %r vs %r %s' + % (dim, size, dim_sizes[dim], error_context)) + + +def _parse_input_dimensions( + args: Tuple[NDArray, ...], + input_core_dims: List[CoreDims], + error_context: str = "", +) -> Tuple[Tuple[int, ...], Dict[str, int]]: + """Parse broadcast and core dimensions for vectorize with a signature. + + Args: + args: tuple of input arguments to examine. + input_core_dims: list of core dimensions corresponding to each input. + error_context: string context for error messages. + + Returns: + broadcast_shape: common shape to broadcast all non-core dimensions to. + dim_sizes: common sizes for named core dimensions. + """ + if len(args) != len(input_core_dims): + raise TypeError( + 'wrong number of positional arguments: expected %r, got %r %s' + % (len(input_core_dims), len(args), error_context)) + shapes = [] + dim_sizes = {} + for arg, core_dims in zip(args, input_core_dims): + _update_dim_sizes(dim_sizes, arg.shape, core_dims, error_context, + is_input=True) + ndim = arg.ndim - len(core_dims) + shapes.append(arg.shape[:ndim]) + broadcast_shape = lax.broadcast_shapes(*shapes) + return broadcast_shape, dim_sizes + + +def _check_output_dims( + func: Callable, + dim_sizes: Dict[str, int], + expected_output_core_dims: List[CoreDims], + error_context: str = "", +) -> Callable: + """Check that output core dimensions match the signature.""" + def wrapped(*args): + out = func(*args) + out_shapes = map(np.shape, out if isinstance(out, tuple) else [out]) + + if expected_output_core_dims is None: + output_core_dims = [()] * len(out_shapes) + else: + output_core_dims = expected_output_core_dims + if len(output_core_dims) > 1 and not isinstance(out, tuple): + raise TypeError( + "output must be a tuple when multiple outputs are expected, " + "got: {!r}\n{}".format(out, error_context)) + if len(out_shapes) != len(output_core_dims): + raise TypeError( + 'wrong number of output arguments: expected %r, got %r %s' + % (len(output_core_dims), len(out_shapes), error_context)) + + sizes = dict(dim_sizes) + for shape, core_dims in zip(out_shapes, output_core_dims): + _update_dim_sizes(sizes, shape, core_dims, error_context, + is_input=False) + + return out + return wrapped + + +def _apply_excluded(func, excluded, args): + """Partially apply positional arguments in `excluded` to a function.""" + if not excluded: + return func, args + + if max(excluded) >= len(args): + raise ValueError("excluded={!r} is invalid for {!r} argument(s)" + .format(excluded, len(args))) + + dynamic_args = [arg for i, arg in enumerate(args) if i not in excluded] + static_args = [(i, args[i]) for i in sorted(excluded)] + + def new_func(*args): + args = list(args) + for i, arg in static_args: + args.insert(i, arg) + return func(*args) + + return new_func, dynamic_args + + +@_wraps(onp.vectorize, lax_description=textwrap.dedent(""" + JAX's implementation of vectorize should be considerably more efficient + than NumPy's, because it uses a batching transformation rather than an + explicit "for" loop. + + Note that JAX only supports the optional ``excluded`` (integer only) and + ``signature`` arguments, both of which must be specified with keywords. + """)) +def vectorize(pyfunc, *, excluded=frozenset(), signature=None): + + if any(not isinstance(exclude, int) for exclude in excluded): + raise TypeError("jax.numpy.vectorize can only exclude integer arguments, " + "but excluded={!r}".format(excluded)) + if excluded and min(excluded) < 0: + raise ValueError("excluded={!r} contains negative numbers".format(excluded)) + + @functools.wraps(pyfunc) + def wrapped(*args): + error_context = ("on vectorized function with excluded={!r} and " + "signature={!r}".format(excluded, signature)) + excluded_func, args = _apply_excluded(pyfunc, excluded, args) + args = tuple(map(np.asarray, args)) + + if signature is not None: + input_core_dims, output_core_dims = _parse_gufunc_signature(signature) + else: + input_core_dims = [()] * len(args) + output_core_dims = None + + broadcast_shape, dim_sizes = _parse_input_dimensions( + args, input_core_dims, error_context) + + checked_func = _check_output_dims( + excluded_func, dim_sizes, output_core_dims, error_context) + + # Rather than broadcasting all arguments to full broadcast shapes, prefer + # expanding dimensions using vmap when possible. By pushing broadcasting + # into vmap, we can make use of more efficient batching rules for + # primitives where only some arguments are batched (e.g., for + # lax_linalg.triangular_solve). + + vec_args = [] + vmap_counts = [] + + for arg, core_dims in zip(args, input_core_dims): + # Explicitly broadcast the dimensions already found on each argument, + # because these dimensiosns might be of size 1, which vmap doesn't + # handle. + # TODO(shoyer): Consider squeezing out size 1 dimensions instead, and + # doing all vectorization with vmap? This *might* be a little more + # efficient but would require more careful book-keeping. + core_shape = tuple(dim_sizes[dim] for dim in core_dims) + full_shape = broadcast_shape + core_shape + vec_shape = full_shape[-arg.ndim:] if arg.ndim else () + + vec_arg = np.broadcast_to(arg, vec_shape) + vec_args.append(vec_arg) + + vmap_count = len(vec_shape) - len(core_shape) + vmap_counts.append(vmap_count) + + vectorized_func = checked_func + while any(vmap_counts): + in_axes = tuple(0 if c > 0 else None for c in vmap_counts) + vmap_counts = [max(c - 1, 0) for c in vmap_counts] + vectorized_func = api.vmap(vectorized_func, in_axes) + return vectorized_func(*vec_args) + + return wrapped diff --git a/tests/lax_numpy_vectorize_test.py b/tests/lax_numpy_vectorize_test.py new file mode 100644 index 000000000000..2e9fbbfdbcb3 --- /dev/null +++ b/tests/lax_numpy_vectorize_test.py @@ -0,0 +1,217 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import partial +import itertools +import unittest + +import numpy as onp + +from absl.testing import absltest +from absl.testing import parameterized + +import jax +from jax import lax +from jax import numpy as np +from jax import test_util as jtu + +from jax.config import config +config.parse_flags_with_absl() + + +class VectorizeTest(jtu.JaxTestCase): + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_leftshape={}_rightshape={}".format(left_shape, right_shape), + "left_shape": left_shape, "right_shape": right_shape, "result_shape": result_shape} + for left_shape, right_shape, result_shape in [ + ((2, 3), (3, 4), (2, 4)), + ((2, 3), (1, 3, 4), (1, 2, 4)), + ((5, 2, 3), (1, 3, 4), (5, 2, 4)), + ((6, 5, 2, 3), (3, 4), (6, 5, 2, 4)), + ])) + def test_matmat(self, left_shape, right_shape, result_shape): + matmat = np.vectorize(np.dot, signature='(n,m),(m,k)->(n,k)') + self.assertEqual(matmat(np.zeros(left_shape), + np.zeros(right_shape)).shape, result_shape) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_leftshape={}_rightshape={}".format(left_shape, right_shape), + "left_shape": left_shape, "right_shape": right_shape, "result_shape": result_shape} + for left_shape, right_shape, result_shape in [ + ((2, 3), (3,), (2,)), + ((2, 3), (1, 3), (1, 2)), + ((4, 2, 3), (1, 3), (4, 2)), + ((5, 4, 2, 3), (1, 3), (5, 4, 2)), + ])) + def test_matvec(self, left_shape, right_shape, result_shape): + matvec = np.vectorize(np.dot, signature='(n,m),(m)->(n)') + self.assertEqual(matvec(np.zeros(left_shape), + np.zeros(right_shape)).shape, result_shape) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_leftshape={}_rightshape={}".format(left_shape, right_shape), + "left_shape": left_shape, "right_shape": right_shape, "result_shape": result_shape} + for left_shape, right_shape, result_shape in [ + ((3,), (3,), ()), + ((2, 3), (3,), (2,)), + ((4, 2, 3), (3,), (4, 2)), + ])) + def test_vecmat(self, left_shape, right_shape, result_shape): + vecvec = np.vectorize(np.dot, signature='(m),(m)->()') + self.assertEqual(vecvec(np.zeros(left_shape), + np.zeros(right_shape)).shape, result_shape) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format(shape), + "shape": shape, "result_shape": result_shape} + for shape, result_shape in [ + ((3,), ()), + ((2, 3,), (2,)), + ((1, 2, 3,), (1, 2)), + ])) + def test_magnitude(self, shape, result_shape): + size = 1 + for x in shape: + size *= x + inputs = np.arange(size).reshape(shape) + + @partial(np.vectorize, signature='(n)->()') + def magnitude(x): + return np.dot(x, x) + + self.assertEqual(magnitude(inputs).shape, result_shape) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format(shape), + "shape": shape, "result_shape": result_shape} + for shape, result_shape in [ + ((3,), ()), + ((2, 3), (2,)), + ((1, 2, 3, 4), (1, 2, 3)), + ])) + def test_mean(self, shape, result_shape): + mean = np.vectorize(np.mean, signature='(n)->()') + self.assertEqual(mean(np.zeros(shape)).shape, result_shape) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}".format(shape), + "shape": shape, "result_shape": result_shape} + for shape, result_shape in [ + ((), (2,)), + ((3,), (3,2,)), + ])) + def test_stack_plus_minus(self, shape, result_shape): + + @partial(np.vectorize, signature='()->(n)') + def stack_plus_minus(x): + return np.stack([x, -x]) + + self.assertEqual(stack_plus_minus(np.zeros(shape)).shape, result_shape) + + def test_center(self): + + @partial(np.vectorize, signature='(n)->(),(n)') + def center(array): + bias = np.mean(array) + debiased = array - bias + return bias, debiased + + b, a = center(np.arange(3)) + self.assertEqual(a.shape, (3,)) + self.assertEqual(b.shape, ()) + self.assertAllClose(1.0, b, check_dtypes=False) + + b, a = center(np.arange(6).reshape(2, 3)) + self.assertEqual(a.shape, (2, 3)) + self.assertEqual(b.shape, (2,)) + self.assertAllClose(np.array([1.0, 4.0]), b, check_dtypes=False) + + def test_exclude_first(self): + + @partial(np.vectorize, excluded={0}) + def f(x, y): + assert x == 'foo' + assert y.ndim == 0 + return y + + x = np.arange(3) + self.assertAllClose(x, f('foo', x), check_dtypes=True) + self.assertAllClose(x, jax.jit(f, 0)('foo', x), check_dtypes=True) + + def test_exclude_second(self): + + @partial(np.vectorize, excluded={1}) + def f(x, y): + assert x.ndim == 0 + assert y == 'foo' + return x + + x = np.arange(3) + self.assertAllClose(x, f(x, 'foo'), check_dtypes=True) + self.assertAllClose(x, jax.jit(f, 1)(x, 'foo'), check_dtypes=True) + + def test_exclude_errors(self): + with self.assertRaisesRegex( + TypeError, "jax.numpy.vectorize can only exclude"): + np.vectorize(lambda x: x, excluded={'foo'}) + + with self.assertRaisesRegex( + ValueError, r"excluded=\{-1\} contains negative numbers"): + np.vectorize(lambda x: x, excluded={-1}) + + f = np.vectorize(lambda x: x, excluded={1}) + with self.assertRaisesRegex( + ValueError, r"excluded=\{1\} is invalid for 1 argument\(s\)"): + f(1.0) + + def test_bad_inputs(self): + matmat = np.vectorize(np.dot, signature='(n,m),(m,k)->(n,k)') + with self.assertRaisesRegex( + TypeError, "wrong number of positional arguments"): + matmat(np.zeros((3, 2))) + with self.assertRaisesRegex( + ValueError, + r"input with shape \(2,\) does not have enough dimensions"): + matmat(np.zeros((2,)), np.zeros((2, 2))) + with self.assertRaisesRegex( + ValueError, r"inconsistent size for core dimension 'm'"): + matmat(np.zeros((2, 3)), np.zeros((4, 5))) + + def test_wrong_output_type(self): + f = np.vectorize(np.dot, signature='(n,m),(m,k)->(n,k),()') + with self.assertRaisesRegex( + TypeError, "output must be a tuple"): + f(np.zeros((2, 2)), np.zeros((2, 2))) + + def test_wrong_num_outputs(self): + f = np.vectorize(lambda *args: args, signature='(),()->(),(),()') + with self.assertRaisesRegex( + TypeError, "wrong number of output arguments"): + f(1, 2) + + def test_wrong_output_shape(self): + f = np.vectorize(np.dot, signature='(n,m),(m,k)->(n)') + with self.assertRaisesRegex( + ValueError, r"output shape \(2, 2\) does not match"): + f(np.zeros((2, 2)), np.zeros((2, 2))) + + def test_inconsistent_output_size(self): + f = np.vectorize(np.dot, signature='(n,m),(m,k)->(n,n)') + with self.assertRaisesRegex( + ValueError, r"inconsistent size for core dimension 'n'"): + f(np.zeros((2, 3)), np.zeros((3, 4))) + + +if __name__ == "__main__": + absltest.main() From aca7bccefdd822dfa35f6ea1bdf41f790785d1f7 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Wed, 12 Feb 2020 17:05:18 -0800 Subject: [PATCH 0745/1053] Consolidate LU solve logic from scipy/numpy in lax_linalg.lu_solve (#2144) * Consolidate LU solve logic from scipy/numpy in lax_linalg.lu_solve This single implementation supports broadcasting like NumPy in both the NumPy and SciPy interfaces to LU solve, even though only original NumPy supports broadcasting. This change is technical backwards incompatible in the SciPy wrapper, which previously supported adding extra dimensions to the end of `b`, e.g., `b.shape == (8, 4, 2)` when `a.shape == (8, 8)`. There was a testcase for this, but it isn't documented in either JAX or SciPy. * fix recursive import * Use np.vectorize instead of experimental.vectorize --- jax/lax_linalg.py | 58 ++++++++++++++++++++++++++++++++++++++++++++ jax/numpy/linalg.py | 33 +++---------------------- jax/scipy/linalg.py | 37 +--------------------------- tests/linalg_test.py | 2 +- 4 files changed, 64 insertions(+), 66 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index ef648f024c49..54f0f0962a41 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -18,6 +18,7 @@ import numpy as onp from jax.numpy import lax_numpy as np +from jax.numpy.vectorize import vectorize from jax import ad_util from jax import api from jax import api_util @@ -37,6 +38,7 @@ from jax.lib import lapack from jax.lib import cusolver + # traceables def cholesky(x, symmetrize_input=True): @@ -662,6 +664,62 @@ def lu_pivots_to_permutation(swaps, m): return result +@partial(vectorize, excluded={3}, signature='(n,n),(n),(n,k)->(n,k)') +def _lu_solve_core(lu, pivots, b, trans): + m = lu.shape[0] + permutation = lu_pivots_to_permutation(pivots, m) + x = np.reshape(b, (m, -1)) + if trans == 0: + x = x[permutation, :] + x = triangular_solve(lu, x, left_side=True, lower=True, unit_diagonal=True) + x = triangular_solve(lu, x, left_side=True, lower=False) + elif trans == 1 or trans == 2: + conj = trans == 2 + x = triangular_solve(lu, x, left_side=True, lower=False, transpose_a=True, + conjugate_a=conj) + x = triangular_solve(lu, x, left_side=True, lower=True, unit_diagonal=True, + transpose_a=True, conjugate_a=conj) + x = x[np.argsort(permutation), :] + else: + raise ValueError("'trans' value must be 0, 1, or 2, got {}".format(trans)) + return lax.reshape(x, b.shape) + + +@partial(api.jit, static_argnums=(3,)) +def _lu_solve(lu, pivots, b, trans): + if len(lu.shape) < 2 or lu.shape[-1] != lu.shape[-2]: + raise ValueError("last two dimensions of LU decomposition must be equal, " + "got shape {}".format(lu.shape)) + if len(b.shape) < 1: + raise ValueError("b matrix must have rank >= 1, got shape {}" + .format(b.shape)) + # Broadcasting follows NumPy's convention for linalg.solve: the RHS is + # treated as a (batched) vector if the number of dimensions differ by 1. + # Otherwise, broadcasting rules apply. + rhs_vector = lu.ndim == b.ndim + 1 + if rhs_vector: + if b.shape[-1] != lu.shape[-1]: + raise ValueError("When LU decomposition matrix and b have the same " + "number of dimensions, last axis of LU decomposition " + "matrix (shape {}) and b array (shape {}) must match" + .format(lu.shape, b.shape)) + b = b[..., np.newaxis] + else: + if b.shape[-2] != lu.shape[-1]: + raise ValueError("When LU decomposition matrix and b different " + "numbers of dimensions, last axis of LU decomposition " + "matrix (shape {}) and second to last axis of b array " + "(shape {}) must match" + .format(lu.shape, b.shape)) + x = _lu_solve_core(lu, pivots, b, trans) + return x[..., 0] if rhs_vector else x + + +def lu_solve(lu, pivots, b, trans=0): + """LU solve with broadcasting.""" + return _lu_solve(lu, pivots, b, trans) + + # QR decomposition def qr_impl(operand, full_matrices): diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index f30a43a3be14..0ca1c25efb4b 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -21,7 +21,7 @@ import operator from typing import Tuple, Union, cast -from jax import jit, ops +from jax import jit, ops, vmap from .. import lax from .. import lax_linalg from .. import dtypes @@ -332,37 +332,12 @@ def qr(a, mode="reduced"): @jit def solve(a, b): a, b = _promote_arg_dtypes(np.asarray(a), np.asarray(b)) - a_shape = np.shape(a) - b_shape = np.shape(b) - a_ndims = len(a_shape) - b_ndims = len(b_shape) - if not (a_ndims >= 2 and a_shape[-1] == a_shape[-2] and b_ndims >= 1): + if not (a.ndim >= 2 and a.shape[-1] == a.shape[-2] and b.ndim >= 1): msg = ("The arguments to solve must have shapes a=[..., m, m] and " "b=[..., m, k] or b=[..., m]; got a={} and b={}") - raise ValueError(msg.format(a_shape, b_shape)) + raise ValueError(msg.format(a.shape, b.shape)) lu, pivots = lax_linalg.lu(a) - dtype = lax.dtype(a) - - m = a_shape[-1] - - # Numpy treats the RHS as a (batched) vector if the number of dimensions - # differ by 1. Otherwise, broadcasting rules apply. - x = b[..., None] if a_ndims == b_ndims + 1 else b - - batch_dims = lax.broadcast_shapes(lu.shape[:-2], x.shape[:-2]) - x = np.broadcast_to(x, batch_dims + x.shape[-2:]) - lu = np.broadcast_to(lu, batch_dims + lu.shape[-2:]) - - permutation = lax_linalg.lu_pivots_to_permutation(pivots, m) - permutation = np.broadcast_to(permutation, batch_dims + (m,)) - iotas = np.ix_(*(lax.iota(np.int32, b) for b in batch_dims + (1,))) - x = x[iotas[:-1] + (permutation, slice(None))] - - x = lax_linalg.triangular_solve(lu, x, left_side=True, lower=True, - unit_diagonal=True) - x = lax_linalg.triangular_solve(lu, x, left_side=True, lower=False) - - return x[..., 0] if a_ndims == b_ndims + 1 else x + return lax_linalg.lu_solve(lu, pivots, b, trans=0) for func in get_module_functions(onp.linalg): diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index 2d13ab643d1b..7b791afa6d33 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -106,7 +106,6 @@ def eigh(a, b=None, lower=True, eigvals_only=False, overwrite_a=False, return w, v - @_wraps(scipy.linalg.inv) def inv(a, overwrite_a=False, check_finite=True): del overwrite_a, check_finite @@ -119,46 +118,12 @@ def lu_factor(a, overwrite_a=False, check_finite=True): a = np_linalg._promote_arg_dtypes(np.asarray(a)) return lax_linalg.lu(a) -@partial(jit, static_argnums=(3,)) -def _lu_solve(lu, pivots, b, trans): - lu_shape = np.shape(lu) - b_shape = np.shape(b) - if len(lu_shape) != 2 or lu_shape[0] != lu_shape[1]: - raise ValueError("LU decomposition must be a square matrix, got shape {}" - .format(lu_shape)) - if len(b_shape) < 1: - raise ValueError("b matrix must have rank >= 1, got shape {}" - .format(b_shape)) - - if b_shape[0] != lu_shape[0]: - raise ValueError("Dimension of LU decomposition matrix (shape {}) must " - "match leading axis of b array (shape {})" - .format(lu_shape, b_shape)) - m = lu_shape[0] - permutation = lax_linalg.lu_pivots_to_permutation(np.array(pivots), m) - x = np.reshape(b, (m, -1)) - if trans == 0: - x = x[permutation, :] - x = lax_linalg.triangular_solve(lu, x, left_side=True, lower=True, - unit_diagonal=True) - x = lax_linalg.triangular_solve(lu, x, left_side=True, lower=False) - elif trans == 1 or trans == 2: - conj = trans == 2 - x = lax_linalg.triangular_solve(lu, x, left_side=True, lower=False, - transpose_a=True, conjugate_a=conj) - x = lax_linalg.triangular_solve(lu, x, left_side=True, lower=True, - unit_diagonal=True, transpose_a=True, - conjugate_a=conj) - x = x[np.argsort(permutation), :] - else: - raise ValueError("'trans' value must be 0, 1, or 2, got {}".format(trans)) - return lax.reshape(x, b_shape) @_wraps(scipy.linalg.lu_solve) def lu_solve(lu_and_piv, b, trans=0, overwrite_b=False, check_finite=True): del overwrite_b, check_finite lu, pivots = lu_and_piv - return _lu_solve(lu, pivots, b, trans) + return lax_linalg.lu_solve(lu, pivots, b, trans) @partial(jit, static_argnums=(1,)) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index b20e801e105a..65ae83388e76 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -904,7 +904,7 @@ def testLuFactor(self, n, dtype, rng_factory): for lhs_shape, rhs_shape in [ ((1, 1), (1, 1)), ((4, 4), (4,)), - ((8, 8), (8, 4, 2)), + ((8, 8), (8, 4)), ] for trans in [0, 1, 2] for dtype in float_types + complex_types From 20dbc62277001fba23311e550815f5d0a01253ac Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 13 Feb 2020 09:28:01 +0100 Subject: [PATCH 0746/1053] Updated docstrings based on review comments --- docs/conf.py | 2 +- docs/jaxpr.rst | 2 ++ jax/core.py | 17 ++--------------- jax/interpreters/batching.py | 2 +- 4 files changed, 6 insertions(+), 17 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 3c282baf226c..a139d46cadf6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -34,7 +34,7 @@ # -- Project information ----------------------------------------------------- project = 'JAX' -copyright = '2020, Google LLC. NumPy and SciPy documentation are copyright the respective authors.' +copyright = '2019, Google LLC. NumPy and SciPy documentation are copyright the respective authors.' author = 'The JAX authors' # The short X.Y version diff --git a/docs/jaxpr.rst b/docs/jaxpr.rst index bb9d350467d1..62aeb36916fe 100644 --- a/docs/jaxpr.rst +++ b/docs/jaxpr.rst @@ -1,6 +1,8 @@ Understanding JAXPR ==================== +Updated: February 14, 2020 (for commit 9e6fe64). + (Note: the code examples in this file can be seed also in ``jax/tests/api_test::JaxprTest.testExamplesJaxprDoc``.) diff --git a/jax/core.py b/jax/core.py index e13376996a95..fb0cf5f92938 100644 --- a/jax/core.py +++ b/jax/core.py @@ -213,10 +213,8 @@ def abstract_eval(self, *args, **kwargs): def extract_call_jaxpr(primitive, params): """Extract the call primitive subjaxpr from the params. - Params: - params: a parameter dictionary for a primitive. - Returns: the subjaxpr and the params without the "jaxpr" value. If this is - not a call primitive then returns (None, params). + Returns the subjaxpr and the params without the "call_jaxpr" value. If this is + not a call primitive then returns (None, params). """ if not primitive.call_primitive: return (None, params) @@ -309,7 +307,6 @@ def full_raise(self, val): def pure(self, val): - """Given a concrete value, makes a Tracer for it.""" assert False def lift(self, tracer): @@ -319,16 +316,6 @@ def sublift(self, tracer): assert False def process_primitive(self, primitive, tracers, params): - """Processes a primitive - - Args: - primitive: the primitive - tracers: the tracers for the arguments - params: the primitive parameters - - Returns: - either a tracer, or a list of tracers (if primitive.multiple_results) - """ assert False, "Must override" def __repr__(self): diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 65144fc29288..22d4682309d6 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -177,7 +177,7 @@ def broadcast_batcher(prim, args, dims, **params): """Process a primitive with built-in broadcasting. Args: - args: the arguments + args: the possibly-batched arguments dims: for each argument, the dimension that is being batched (or None) """ shapes = {(x.shape, d) for x, d in zip(args, dims) if onp.ndim(x)} From 983f6fe8e5aa6c18d09b0f2b9a32487b60183fac Mon Sep 17 00:00:00 2001 From: Scott Linderman Date: Thu, 13 Feb 2020 07:31:54 -0800 Subject: [PATCH 0747/1053] Fix minor bug in bernoulli.pmf (#2221) np.exp(pmf(...)) -> np.exp(logpmf(...)) --- jax/scipy/stats/bernoulli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/scipy/stats/bernoulli.py b/jax/scipy/stats/bernoulli.py index 87e8ab9897ee..4c36b75b6f99 100644 --- a/jax/scipy/stats/bernoulli.py +++ b/jax/scipy/stats/bernoulli.py @@ -33,4 +33,4 @@ def logpmf(k, p, loc=0): @np._wraps(osp_stats.bernoulli.pmf, update_doc=False) def pmf(k, p, loc=0): - return np.exp(pmf(k, p, loc)) + return np.exp(logpmf(k, p, loc)) From e93697461b1188421d1c6634db6f28d3d8a91a7d Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Thu, 13 Feb 2020 13:55:19 -0800 Subject: [PATCH 0748/1053] Make `core.call_p` a call primitive. (#2223) --- jax/core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/core.py b/jax/core.py index 5cfaadaa8104..8155592b9b7e 100644 --- a/jax/core.py +++ b/jax/core.py @@ -652,6 +652,7 @@ def call_impl(f, *args, **params): call_p = Primitive('call') +call_p.call_primitive = True call = partial(call_bind, call_p) call_p.def_custom_bind(call) call_p.def_impl(call_impl) From 89edd5eaf0672ae1853407996d873e8e57e0f71b Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 13 Feb 2020 16:05:13 -0800 Subject: [PATCH 0749/1053] Update WORKSPACE --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e2712fb92b6..3df43055fda6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "fb463ccb1f88f3fc397eac1544b4b827118eadaa37e1e01b50b010bcf80d7db8", - strip_prefix = "tensorflow-0ffde4c85d85e34390285fc9fcfbae766ae5260d", + sha256 = "27e471653911eaa2503f8a97636e417b4b3fba7d7b679a3af8eca5b6a688f430", + strip_prefix = "tensorflow-dc90dde87528ea974f42a223b57ab2166e78dbb8", urls = [ - "https://github.com/tensorflow/tensorflow/archive/0ffde4c85d85e34390285fc9fcfbae766ae5260d.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/dc90dde87528ea974f42a223b57ab2166e78dbb8.tar.gz", ], ) From 2ff7019923e1027ef13c9170cbd06a22086ba7de Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 13 Feb 2020 18:09:53 -0800 Subject: [PATCH 0750/1053] Update WORKSPACE --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3df43055fda6..eb5ea654d150 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "27e471653911eaa2503f8a97636e417b4b3fba7d7b679a3af8eca5b6a688f430", - strip_prefix = "tensorflow-dc90dde87528ea974f42a223b57ab2166e78dbb8", + sha256 = "001be4590e0c3e0a4f90f6fa19b864ec53ba4946603b03660be7ec637273d831", + strip_prefix = "tensorflow-d8ff7566d1b47be15cc94c61777058e793da93af", urls = [ - "https://github.com/tensorflow/tensorflow/archive/dc90dde87528ea974f42a223b57ab2166e78dbb8.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/d8ff7566d1b47be15cc94c61777058e793da93af.tar.gz", ], ) From 25f8fb0dc5043a2a737565d51407aaed1a79b4b3 Mon Sep 17 00:00:00 2001 From: George Necula Date: Fri, 14 Feb 2020 07:23:09 +0100 Subject: [PATCH 0751/1053] One last small fix to the documentation --- jax/interpreters/batching.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 22d4682309d6..bc7ee5ba4e09 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -178,7 +178,10 @@ def broadcast_batcher(prim, args, dims, **params): Args: args: the possibly-batched arguments - dims: for each argument, the dimension that is being batched (or None) + dims: list or tuple of the same length as `args`, where each + entry indicates the batching state of the corresponding entry to `args`: + either an int indicating the batch dimension, or else `not_mapped` + indicating no batching. """ shapes = {(x.shape, d) for x, d in zip(args, dims) if onp.ndim(x)} if len(shapes) == 1: From 8f538f4e25d039a76d99af97374e7ece8c1c63a3 Mon Sep 17 00:00:00 2001 From: Julius Kunze Date: Fri, 14 Feb 2020 15:59:05 +0100 Subject: [PATCH 0752/1053] Allow shapecheck of PixelCNN++ (#2017) * Allow shapecheck of indexing, slicing, broadcast_to, reshape, random.uniform, iota, simple cases of split * Fix dynamic slicing * Fix issue with float64.__index__() * Fix np.arange with float size, _try_canonicalize_shape * Cleanup: Make methods to create Poly internal (only use in Poly / shape spec parsing) * Fix testReshapeWithUnusualShapes (error message) * Fix syntax for python 3.6 * Remove Poly.__index__ * Fix tests * Split up masking.py * Cleanup masking * Cleanup * Use abstract_eval for shapecheck, remove ShapeCheckTrace(r) * Remove shape_rules, fix test * Remove shapes.py, move code to abstract_arrays.py / api.py * Remove safe_map/zip, is_instance from abstract_arrays, test + fix Poly hash, minimize import diff * Add missing shapecheck_test.py * Cleanup, minimize changes * Minimize import diff * Minor * Allow shapecheck of np.where * Fix np.where * Simplify gather to allow retightening type assertion in ConcreteArray * Remove unused imports * Make import style consistent * Remove is_polymorphic, special cases in sampling, split, where. * Move back Poly, _parse_shape_spec into masking.py to simplify diff * Move back ShapeTest into masking_test.py to simplify diff * Minor reverts to further simplify diff * Fix tests * Minimize diff * Restore copyright, cleanup imports in masking.py * Merge branch 'master' of https://github.com/google/jax into shapecheck-pcnn # Conflicts: # jax/api.py # jax/numpy/lax_numpy.py --- jax/api.py | 26 ++-- jax/interpreters/masking.py | 273 ++++++++++++------------------------ jax/interpreters/xla.py | 1 - jax/lax/lax.py | 11 +- jax/lax/lax_control_flow.py | 2 +- jax/numpy/lax_numpy.py | 30 ++-- jax/random.py | 5 +- tests/masking_test.py | 137 +++++++++++------- 8 files changed, 225 insertions(+), 260 deletions(-) diff --git a/jax/api.py b/jax/api.py index 433735b62fb9..5da4ebc41077 100644 --- a/jax/api.py +++ b/jax/api.py @@ -27,8 +27,8 @@ import collections import functools import itertools as it -import operator as op import os +import string import threading from warnings import warn @@ -51,6 +51,7 @@ from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, host_id, host_ids, host_count) from .abstract_arrays import ConcreteArray, ShapedArray, raise_to_shaped +from .interpreters.masking import eval_polymorphic_shape, Poly, Mon from .interpreters import partial_eval as pe from .interpreters import xla from .interpreters import pxla @@ -58,7 +59,6 @@ from .interpreters import batching from .interpreters import parallel from .interpreters import masking -from .interpreters.masking import shapecheck, ensure_poly from .config import flags, config, bool_env map = safe_map @@ -1038,24 +1038,23 @@ def wrapped_fun(args, logical_env): out_shapes = map(masking.finalize_spec, out_specs, map(onp.shape, outs)) if not out_shapes == list(out_shapes_): raise masking.ShapeError - if not all(onp.shape(out) == masking.eval_shape_expr(padded_env, expr) - for out, expr in zip(outs, out_shapes)): + if not all(onp.shape(out) == eval_polymorphic_shape(shape, padded_env) + for out, shape in zip(outs, out_shapes)): raise masking.ShapeError return tree_unflatten(out_tree(), outs) return wrapped_fun def _remap_ids(names, shape_spec): - ShapeSpec, Poly, Mon = masking.ShapeSpec, masking.Poly, masking.Mon - mdim = masking.monomorphic_dim - return ShapeSpec(Poly({Mon({names[id] : deg for id, deg in mon.items()}) + return masking.ShapeSpec(Poly({Mon({names[id] : deg for id, deg in mon.items()}) : coeff for mon, coeff in poly.items()}) - if poly is not mdim else mdim for poly in shape_spec) + if poly is not masking._monomorphic_dim else + masking._monomorphic_dim for poly in shape_spec) def _bind_shapes(shape_exprs, shapes): env = {} for shape_expr, shape in zip(shape_exprs, shapes): for poly, d in zip(shape_expr, shape): - if ensure_poly(poly).is_constant: + if type(poly) is not Poly or poly.is_constant: continue else: (binder,), = poly # TODO generalize to handle striding @@ -1070,16 +1069,13 @@ def shapecheck(in_shapes, out_shape, fun): out_shapes, out_tree = tree_flatten(out_shape) out_shapes = map(masking.parse_spec, out_shapes) flat_fun, out_tree_ = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) - out_shapes_ = masking.shapecheck(flat_fun, in_shapes) + avals = map(partial(ShapedArray, dtype=onp.float32), in_shapes) + out_shapes_ = [o.shape for o in pe.abstract_eval_fun(flat_fun.call_wrapped, *avals)] if out_tree != out_tree_(): raise TypeError("pytree mismatch") - if not all(map(_shape_spec_consistent, out_shapes, out_shapes_)): + if not all(map(masking._shape_spec_consistent, out_shapes, out_shapes_)): raise masking.ShapeError return fun -def _shape_spec_consistent(spec, expr): - return all(a == b for a, b in zip(spec, expr) if a is not masking.monomorphic_dim) - - def jvp(fun, primals, tangents): """Computes a (forward-mode) Jacobian-vector product of `fun`. diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 50b318ca1b88..d253b8b08f54 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -12,12 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. - from contextlib import contextmanager -from collections import defaultdict, Counter, namedtuple -import functools -from functools import partial, wraps -import itertools as it +from collections import Counter, namedtuple +from functools import partial +from itertools import chain, product import operator as op import string @@ -26,19 +24,30 @@ from .. import abstract_arrays from .. import core from ..core import Trace, Tracer -from ..util import unzip2, safe_map, safe_zip, curry +from ..util import safe_map, safe_zip, unzip2, prod from ..abstract_arrays import ShapedArray from .. import linear_util as lu map = safe_map zip = safe_zip -def prod(xs): - xs = list(xs) - return functools.reduce(op.mul, xs) if xs else 1 +shape_parameterized_primitive_rules = {} +masking_rules = {} + +def defvectorized(prim): + masking_rules[prim] = partial(vectorized_masking_rule, prim) +def defnaryop(prim): + masking_rules[prim] = partial(naryop_masking_rule, prim) + +def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): + del logical_shapes # Unused. + padded_val, = padded_vals + return prim.bind(padded_val, **params) -### main transformation functions +def naryop_masking_rule(prim, padded_vals, logical_shapes): + del logical_shapes # Unused. + return prim.bind(*padded_vals) ShapeEnvs = namedtuple("ShapeEnvs", ["logical", "padded"]) shape_envs = ShapeEnvs({}, {}) # TODO(mattjj): make this a stack for efficiency @@ -46,29 +55,17 @@ def prod(xs): @contextmanager def extend_shape_envs(logical_env, padded_env): global shape_envs - new_logical = dict(it.chain(shape_envs.logical.items(), logical_env.items())) - new_padded = dict(it.chain(shape_envs.padded.items(), padded_env.items())) + new_logical = dict(chain(shape_envs.logical.items(), logical_env.items())) + new_padded = dict(chain(shape_envs.padded.items(), padded_env.items())) shape_envs, prev = ShapeEnvs(new_logical, new_padded), shape_envs yield shape_envs = prev -def is_polymorphic(shape): - return any(map(lambda d: isinstance(d, Poly), shape)) - -def shape_as_value(expr): - if type(expr) is tuple and is_polymorphic(expr): - return tuple(eval_dim_expr(shape_envs.logical, d) if type(d) is Poly else d - for d in expr) - else: - return expr - -def padded_shape_as_value(expr): - if type(expr) is tuple and is_polymorphic(expr): - return tuple(eval_dim_expr(shape_envs.padded, d) if type(d) is Poly else d - for d in expr) - else: - return expr +def shape_as_value(shape): + return eval_polymorphic_shape(shape, shape_envs.logical) +def padded_shape_as_value(shape): + return eval_polymorphic_shape(shape, shape_envs.padded) def mask_fun(fun, logical_env, padded_env, in_vals, shape_exprs): with core.new_master(MaskTrace) as master: @@ -88,29 +85,39 @@ def mask_subtrace(master, in_vals, shape_exprs): out_vals, out_shapes = unzip2((t.val, t.shape_expr) for t in out_tracers) yield out_vals, out_shapes -def ensure_poly(p): - if isinstance(p, Poly): +def to_index(x): + """Like operator.index, but allowing polymorphic dimensions. + Not implemented as `Poly.__index__`, since operator.index only allows ints.""" + return x if type(x) is Poly else op.index(x) + +def eval_polymorphic_shape(shape, values_dict): + return tuple(dim.evaluate(values_dict) if type(dim) is Poly else dim + for dim in shape) + +def _ensure_poly(p): + if type(p) is Poly: return p - return constant_poly(int(p)) + return Poly({Mon(): p}) -class Poly(Counter): +class Poly(dict): """Polynomial with integer coefficients, usable as element in a polymorphic shape. type Poly = Map Mon Int -- monomials to coeffs type Mon = Map Str Int """ + def __init__(self, coeffs): # Makes sure Polynomials are always in canonical form to simplify operators: - coeffs = {mon: coeff for mon, coeff in coeffs.items() if coeff != 0} + coeffs = {mon: op.index(coeff) for mon, coeff in coeffs.items() if coeff != 0} coeffs = {Mon(): 0} if len(coeffs) == 0 else coeffs super().__init__(coeffs) def __add__(self, other): coeffs = self.copy() - for mon, coeff in ensure_poly(other).items(): + for mon, coeff in _ensure_poly(other).items(): coeffs[mon] = coeffs.get(mon, 0) + coeff return Poly(coeffs) @@ -124,10 +131,9 @@ def __neg__(self): def __mul__(self, other): coeffs = dict() for (mon1, coeff1), (mon2, coeff2) \ - in it.product(self.items(), ensure_poly(other).items()): - mon = Mon(mon1 + mon2) # add monomials' id degrees - coeff = coeff1 * coeff2 # multiply integer coeffs - coeffs[mon] = coeffs.get(mon, 0) + coeff # accumulate coeffs + in product(self.items(), _ensure_poly(other).items()): + mon = mon1 * mon2 + coeffs[mon] = coeffs.get(mon, 0) + coeff1 * coeff2 return Poly(coeffs) @@ -150,9 +156,7 @@ def __mod__(self, divisor): def __divmod__(self, divisor): if self.is_constant: - q, r = divmod(int(self), divisor) - - return constant_poly(q), r + return divmod(int(self), divisor) def divided(count): q, r = divmod(count, divisor) @@ -163,29 +167,29 @@ def divided(count): return Poly( {k: coeff // divisor if k.degree == 0 else divided(coeff) - for k, coeff in self.items()}), self[Mon()] % divisor + for k, coeff in self.items()}), self.get(Mon(), 0) % divisor def __hash__(self): - return hash(super()) + return hash(tuple(sorted(self.items()))) def __eq__(self, other): - return super().__eq__(ensure_poly(other)) + return dict.__eq__(self, _ensure_poly(other)) def __ne__(self, other): return not self == other def __ge__(self, other): - other = ensure_poly(other) + other = _ensure_poly(other) if other.is_constant and self.is_constant: return int(self) >= int(other) if other.is_constant and int(other) <= 1: - # Assume polynomials > 0, allowing to use shape rules of binops, conv: - return True + # Assume polynomials > 0, allowing to use shape rules of binops, conv: + return True if self.is_constant and int(self) <= 0: - return False # See above. + return False # See above. if self == other: return True @@ -194,22 +198,27 @@ def __ge__(self, other): .format(self, other)) def __le__(self, other): - return ensure_poly(other) >= self + return _ensure_poly(other) >= self def __lt__(self, other): return not (self >= other) def __gt__(self, other): - return not (ensure_poly(other) >= self) + return not (_ensure_poly(other) >= self) def __str__(self): - return ' + '.join('{} {}'.format(v, k) if (v != 1 or k.degree == 0) else str(k) + return ' + '.join('{} {}'.format(v, k) + if (v != 1 or k.degree == 0) else str(k) for k, v in sorted(self.items())).strip() def __int__(self): assert self.is_constant - return int(next(iter(self.values()))) + return op.index(next(iter(self.values()))) + + def evaluate(self, values_dict): + return sum(coeff * prod([values_dict[id] ** deg for id, deg in mon.items()]) + for mon, coeff in self.items()) @property def is_constant(self): @@ -218,7 +227,7 @@ def is_constant(self): abstract_arrays._DIMENSION_TYPES.add(Poly) -class Mon(Counter): # type Mon = Map Id Int -- ids to degrees +class Mon(dict): # type Mon = Map Id Int -- ids to degrees def __hash__(self): return hash(tuple(self.items())) @@ -232,34 +241,13 @@ def __lt__(self, other): other_key = other.degree, tuple(sorted(other)) return self_key < other_key + def __mul__(self, other): + return Mon(Counter(self) + Counter(other)) + @property def degree(self): return sum(self.values()) -def eval_shape_expr(env, expr): - return tuple(eval_dim_expr(env, poly) for poly in expr) - -def eval_dim_expr(env, poly): - terms = [mul(coeff, prod([pow(env[id], deg) for id, deg in mon.items()])) - for mon, coeff in poly.items()] - return sum(terms) if len(terms) > 1 else terms[0] - -def pow(x, deg): - try: - deg = int(deg) - except: - return x ** deg - else: - return 1 if deg == 0 else x if deg == 1 else x ** deg - -def mul(coeff, mon): - try: - coeff = int(coeff) - except: - return coeff * mon - else: - return 0 if coeff == 0 else mon if coeff == 1 else coeff * mon - class ShapeError(Exception): pass class ShapeSyntaxError(Exception): pass @@ -279,7 +267,7 @@ class ShapeSyntaxError(Exception): pass # dims ::= dim ',' dims | '' # dim ::= str | int | dim '*' dim | dim '+' dim | '_' # -# ShapeSpecs encode ShapeExprs but can have some monomorphic dims inside them, +# ShapeSpecs can have some monomorphic dims inside them, # which must be replaced with concrete shapes when known. class ShapeSpec(tuple): @@ -287,7 +275,7 @@ def __str__(self): return 'ShapeSpec({})'.format(', '.join(map(str, self))) def finalize_spec(spec, shape): - return tuple(parse_lit(d) if e is monomorphic_dim else e + return tuple(_parse_lit(d) if e is _monomorphic_dim else e for e, d in zip(spec, shape)) def parse_spec(spec=''): @@ -296,35 +284,33 @@ def parse_spec(spec=''): if spec[0] == '(': if spec[-1] != ')': raise ShapeSyntaxError(spec) spec = spec[1:-1] - dims = map(parse_dim, spec.replace(' ', '').strip(',').split(',')) + dims = map(_parse_dim, spec.replace(' ', '').strip(',').split(',')) return ShapeSpec(dims) -def parse_dim(spec): +def _parse_dim(spec): if '+' in spec: - terms = map(parse_dim, spec.split('+')) - return functools.reduce(op.add, terms) + return onp.sum(map(_parse_dim, spec.split('+'))) elif '*' in spec: - terms = map(parse_dim, spec.split('*')) - return functools.reduce(op.mul, terms) + return prod(map(_parse_dim, spec.split('*'))) elif spec.isdigit() or spec.startswith('-') and spec[1:].isdigit(): - return parse_lit(spec) - elif spec in identifiers: - return parse_id(spec) + return _parse_lit(spec) + elif spec in _identifiers: + return _parse_id(spec) elif spec == '_': - return monomorphic_dim + return _monomorphic_dim else: raise ShapeSyntaxError(spec) -digits = frozenset(string.digits) -identifiers = frozenset(string.ascii_lowercase) -def parse_id(name): return Poly({Mon({name: 1}): 1}) -def parse_lit(val_str): return constant_poly(int(val_str)) -def constant_poly(val): return Poly({Mon(): val}) +_identifiers = frozenset(string.ascii_lowercase) + +def _parse_id(name): return Poly({Mon({name: 1}): 1}) + +def _parse_lit(val_str): return Poly({Mon(): int(val_str)}) class MonomorphicDim(object): def __str__(self): return '_' -monomorphic_dim = MonomorphicDim() +_monomorphic_dim = MonomorphicDim() # Two convenient ways to provide shape annotations: # 1. '(m, n)' @@ -332,14 +318,13 @@ def __str__(self): return '_' class S_(object): def __getitem__(self, idx): - if type(idx) is tuple: - return parse_spec('(' + ','.join(map(str, idx)) + ')') - else: - return parse_spec(str(idx)) -s_ = S_() + return parse_spec(('(' + ','.join(map(str, idx)) + ')') + if type(idx) is tuple else str(idx)) +s_ = S_() -### automasking tracer machinery +def _shape_spec_consistent(spec, expr): + return all(a == b for a, b in zip(spec, expr) if a is not _monomorphic_dim) class MaskTracer(Tracer): __slots__ = ["val", "shape_expr"] @@ -354,7 +339,7 @@ def aval(self): return ShapedArray(self.shape_expr, self.val.dtype) def is_pure(self): - return all(ensure_poly(poly).is_constant for poly in self.shape_expr) + return all(type(poly) is not Poly or poly.is_constant for poly in self.shape_expr) def full_lower(self): if self.is_pure(): @@ -362,6 +347,7 @@ def full_lower(self): else: return self + class MaskTrace(Trace): def pure(self, val): return MaskTracer(self, val, onp.shape(val)) @@ -378,8 +364,10 @@ def process_primitive(self, primitive, tracers, params): rule = shape_parameterized_primitive_rules[primitive] out, out_shape = rule(shape_envs, vals, shape_exprs, **params) else: - out_shape = shape_rules[primitive](*(t.aval for t in tracers), **params) - logical_shapes = map(partial(eval_shape_expr, shape_envs.logical), shape_exprs) + avals = [t.aval for t in tracers] + out = primitive.abstract_eval(*avals, **params) + out_shape = [o.shape for o in out] if primitive.multiple_results else out.shape + logical_shapes = map(partial(eval_polymorphic_shape, values_dict=shape_envs.logical), shape_exprs) out = masking_rules[primitive](vals, logical_shapes, **params) if not primitive.multiple_results: return MaskTracer(self, out, out_shape) @@ -387,79 +375,4 @@ def process_primitive(self, primitive, tracers, params): return map(partial(MaskTracer, self), out, out_shape) def process_call(self, call_primitive, f, tracers, params): - raise NotImplementedError # TODO mask-of-jit - -shape_parameterized_primitive_rules = {} -masking_rules = {} -shape_rules = {} - -def defvectorized(prim): - masking_rules[prim] = partial(vectorized_masking_rule, prim) - -def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): - del logical_shapes # Unused. - padded_val, = padded_vals - return prim.bind(padded_val, **params) - - -def defnaryop(prim): - masking_rules[prim] = partial(naryop_masking_rule, prim) - -def naryop_masking_rule(prim, padded_vals, logical_shapes): - del logical_shapes # Unused. - return prim.bind(*padded_vals) - - -### definition-time (import-time) shape checker tracer machinery - -def shapecheck(fun, in_shapes): - with core.new_master(ShapeCheckTrace) as master: - out_shapes = check_subtrace(fun, master).call_wrapped(in_shapes) - del master - return out_shapes - -@lu.transformation -def check_subtrace(master, in_shapes): - trace = ShapeCheckTrace(master, core.cur_sublevel()) - in_tracers = map(partial(ShapeCheckTracer, trace), in_shapes) - outs = yield in_tracers, {} - out_tracers = map(trace.full_raise, outs) - yield [t.shape_expr for t in out_tracers] - - -# TODO(mattjj): add dtypes? -class ShapeCheckTracer(Tracer): - __slots__ = ["shape_expr"] - - def __init__(self, trace, shape_expr): - self._trace = trace - self.shape_expr = shape_expr - - @property - def aval(self): - return ShapedArray(self.shape_expr, None) - - def full_lower(self): - return self - -class ShapeCheckTrace(Trace): - def pure(self, val): - return ShapeCheckTracer(self, onp.shape(val)) - - def lift(self, val): - return ShapeCheckTracer(self, onp.shape(val)) - - def sublift(self, val): - return ShapeCheckTracer(self, val.shape_expr) - - def process_primitive(self, primitive, tracers, params): - avals = [t.aval for t in tracers] - shape_rule = shape_rules.get(primitive) - if shape_rule is None: - raise NotImplementedError('Shape rule for {} not implemented yet.'.format(primitive)) - out_shape = shape_rule(*avals, **params) - return ShapeCheckTracer(self, out_shape) - - def process_call(self, call_primitive, f, tracers, params): - # TODO apply proper subtrace: - return map(self.full_raise, f.call_wrapped(*tracers)) + raise NotImplementedError # TODO mask-of-jit \ No newline at end of file diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index e95e97195af5..6fecfa834c18 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -965,7 +965,6 @@ def _device_put_impl(x, device=None): device_put_p.def_impl(_device_put_impl) pe.custom_partial_eval_rules[device_put_p] = lambda trace, x, **params: x ad.deflinear(device_put_p, lambda cotangent, **kwargs: [cotangent]) -masking.shape_rules[device_put_p] = lambda x, **_: x.shape masking.defvectorized(device_put_p) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 4388e424d20c..b3f25b10aecb 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -38,6 +38,7 @@ from ..abstract_arrays import (UnshapedArray, ShapedArray, ConcreteArray, AbstractToken, array_types, make_shaped_array, raise_to_shaped, abstract_token, canonicalize_shape) +from ..interpreters.masking import to_index from ..interpreters import partial_eval as pe from ..interpreters import xla from ..interpreters import pxla @@ -1064,7 +1065,7 @@ def iota(dtype, size): `_ operator. """ - size = int(size) + size = to_index(size) dtype = dtypes.canonicalize_dtype(dtype) lazy_expr = lazy.iota(dtype, size) aval = ShapedArray((size,), dtype) @@ -1505,7 +1506,6 @@ def standard_primitive(shape_rule, dtype_rule, name, translation_rule=None): prim.def_impl(partial(xla.apply_primitive, prim)) prim.def_abstract_eval(partial(standard_abstract_eval, prim, shape_rule, dtype_rule)) xla.translations[prim] = translation_rule or partial(standard_translate, name) - masking.shape_rules[prim] = shape_rule return prim @@ -4118,7 +4118,6 @@ def _tie_in_batch_rule(batched_args, batch_dims): xla.translations[tie_in_p] = lambda c, x, y: y ad.deflinear(tie_in_p, _tie_in_transpose_rule) batching.primitive_batchers[tie_in_p] = _tie_in_batch_rule -masking.shape_rules[tie_in_p] = lambda x, y: y.shape masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] @@ -4392,8 +4391,6 @@ def conv_transpose_shape_tuple(lhs_shape, rhs_shape, window_strides, padding, def _check_shapelike(fun_name, arg_name, obj): """Check that `obj` is a shape-like value (e.g. tuple of nonnegative ints).""" - if (type(obj) is tuple and masking.is_polymorphic(obj)): - return obj if not isinstance(obj, (tuple, list, onp.ndarray)): msg = "{} {} must be of type tuple/list/ndarray, got {}." raise TypeError(msg.format(fun_name, arg_name, type(obj))) @@ -4404,7 +4401,9 @@ def _check_shapelike(fun_name, arg_name, obj): if obj_arr.ndim != 1: msg = "{} {} must be rank 1, got {}." raise TypeError(msg.format(obj_arr.ndim)) - if not dtypes.issubdtype(obj_arr.dtype, onp.integer): + try: + canonicalize_shape(obj_arr) + except TypeError: msg = "{} {} must have every element be an integer type, got {}." raise TypeError(msg.format(fun_name, arg_name, tuple(map(type, obj)))) if not (obj_arr >= 0).all(): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index bed09a4129ea..11298ba9170d 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1120,7 +1120,7 @@ def _scan_masking_rule(shape_envs, padded_vals, shape_exprs, forward, length, jaxpr, num_consts, num_carry, linear): out_shape = _scan_shape_rule(shape_exprs, forward, length, jaxpr, num_consts, num_carry, linear) - dynamic_length = masking.eval_dim_expr(shape_envs.logical, length) + dynamic_length = length.evaluate(shape_envs.logical) masked_jaxpr = _masked_scan_jaxpr(jaxpr, num_consts, num_carry) consts, init, xs = split_list(padded_vals, [num_consts, num_carry]) max_length, = {x.shape[0] for x in xs} diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0151c8a71b39..968ebf1659de 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -44,6 +44,7 @@ from ..abstract_arrays import UnshapedArray, ShapedArray, ConcreteArray from ..config import flags from ..interpreters.xla import DeviceArray +from ..interpreters.masking import Poly, to_index from .. import lax from ..util import partial, get_module_functions, unzip2, prod as _prod, subvals from ..lib import pytree @@ -1100,7 +1101,7 @@ def broadcast_arrays(*args): def broadcast_to(arr, shape): """Like Numpy's broadcast_to but doesn't necessarily return views.""" arr = arr if isinstance(arr, ndarray) else array(arr) - shape = tuple(map(int, shape)) # check that shape is concrete + shape = tuple(map(to_index, shape)) # check that shape is concrete arr_shape = _shape(arr) if arr_shape == shape: return arr @@ -1903,7 +1904,8 @@ def arange(start, stop=None, step=None, dtype=None): lax._check_user_dtype_supported(dtype, "arange") if stop is None and step is None: dtype = dtype or _dtype(start) - return lax.iota(dtype, start) # avoids materializing + size = start if type(start) is Poly else lax.convert_element_type(start, onp.uint64) + return lax.iota(dtype, size) # avoids materializing else: return array(onp.arange(start, stop=stop, step=step, dtype=dtype)) @@ -2685,6 +2687,9 @@ def take(a, indices, axis=None, out=None, mode=None): def _normalize_index(index, axis_size): """Normalizes an index value in the range [-N, N) to the range [0, N).""" + if type(axis_size) is Poly: + return index + axis_size if index < 0 else index + return lax.select( lax.lt(index, _constant_like(index, 0)), lax.add(index, _constant_like(index, axis_size)), @@ -2898,7 +2903,7 @@ def _index_to_gather(x_shape, idx): collapsed_slice_dims = [] start_index_map = [] - index_dtype = int64 if max(x_shape) >= (1 << 31) else int32 + index_dtype = int64 if any([type(dim) is Poly or dim >= (1 << 31) for dim in x_shape]) else int32 gather_indices = onp.zeros((0,), dtype=index_dtype) # use onp to save a compilation # We perform three transformations to y before the scatter op, in order: @@ -2954,7 +2959,8 @@ def _index_to_gather(x_shape, idx): if (isinstance(abstract_i, ConcreteArray) or isinstance(abstract_i, ShapedArray)) and _int(abstract_i): i = _normalize_index(i, x_shape[x_axis]) - i = lax.convert_element_type(i, index_dtype) + # dummy index if is polynomial, doesn't matter for shape inference: + i = 0 if type(i) is Poly else lax.convert_element_type(i, index_dtype) i = broadcast_to(i, tuple(gather_indices.shape[:-1]) + (1,)) gather_indices = concatenate((gather_indices, i), -1) collapsed_slice_dims.append(x_axis) @@ -2976,7 +2982,7 @@ def _index_to_gather(x_shape, idx): x_axis += 1 # Handle slice index (only static, otherwise an error is raised) elif isinstance(i, slice): - if not _all(elt is None or type(core.get_aval(elt)) is ConcreteArray + if not _all(elt is None or type(elt) is Poly or type(core.get_aval(elt)) is ConcreteArray for elt in (i.start, i.stop, i.step)): msg = ("Array slice indices must have static start/stop/step to be used " "with Numpy indexing syntax. Try lax.dynamic_slice/" @@ -3126,12 +3132,20 @@ def _canonicalize_tuple_index(arr_ndim, idx): idx = tuple(idx) + colons return idx +def _slice_indices(idx, size): + # like idx.indices(size), but allows for polymorphic slice and size + assert isinstance(idx, slice) + + step = 1 if idx.step is None else idx.step + start = (size - 1 if step < 0 else 0) if idx.start is None else idx.start + (size if idx.start < 0 else 0) + stop = (-1 if step < 0 else size) if idx.stop is None else idx.stop + (size if idx.stop < 0 else 0) + return start, stop, step def _static_idx(idx, size): """Helper function to compute the static slice start/limit/stride values.""" - assert isinstance(idx, slice) - start, stop, step = idx.indices(size) - if (step < 0 and stop >= start) or (step > 0 and start >= stop): + start, stop, step = _slice_indices(idx, size) + if (type(start) is not Poly and type(stop) is not Poly and + ((step < 0 and stop >= start) or (step > 0 and start >= stop))): return 0, 0, 1, False # sliced to size zero if step > 0: diff --git a/jax/random.py b/jax/random.py index 1c633e75b21f..c55e9160d472 100644 --- a/jax/random.py +++ b/jax/random.py @@ -43,6 +43,7 @@ from jax.interpreters import partial_eval as pe from jax.interpreters import xla from jax.util import prod +from jax.interpreters.masking import to_index def PRNGKey(seed): @@ -276,7 +277,7 @@ def _random_bits(key, bit_width, shape): # TODO(mattjj): just split the key here raise TypeError("requesting more random bits than a single call provides.") - counts = lax.tie_in(key, lax.iota(onp.uint32, max_count)) + counts = lax.tie_in(key, lax.iota(onp.uint32, max_count.astype(onp.uint32))) bits = threefry_2x32(key, counts) if bit_width == 64: bits = [lax.convert_element_type(x, onp.uint64) for x in np.split(bits, 2)] @@ -289,7 +290,7 @@ def _random_bits(key, bit_width, shape): def _check_shape(name, shape, *param_shapes): try: - shape = tuple(map(int, shape)) + shape = tuple(map(to_index, shape)) except TypeError: msg = "{} requires a concrete tuple of integers as shape argument, got {}." raise ValueError(msg.format(name, shape)) diff --git a/tests/masking_test.py b/tests/masking_test.py index 6ff0aec54e7d..8d30d58b823c 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -17,24 +17,24 @@ from unittest import SkipTest import numpy as onp -from absl.testing import absltest -from absl.testing import parameterized - -from jax import test_util as jtu, core as jc, api -from jax.interpreters.masking import ShapeError, shape_as_value, parse_spec, \ - constant_poly, Mon, Poly, parse_id -from jax import mask, vmap, jit, grad, shapecheck -from jax import lax -import jax.numpy as np - +from absl.testing import absltest, parameterized +from jax.interpreters.masking import shape_as_value, ShapeError, \ + parse_spec, Poly, Mon +from jax import numpy as np, test_util as jtu, mask, vmap, jit, grad, lax, \ + shapecheck, api from jax.config import config +from jax.scipy.special import expit + config.parse_flags_with_absl() -# These are 'manual' tests for masking and shape checking. The more exhaustive, +# These are 'manual' tests for masking. The more exhaustive, # more systematic tests should live in lax_test.py. -class MaskingTest(jtu.JaxTestCase): +def constant_poly(c): + return Poly({Mon(): c}) + +class ShapesTest(jtu.JaxTestCase): @parameterized.parameters([ ['(m, n)', 'ShapeSpec(m, n)'], @@ -53,10 +53,10 @@ class MaskingTest(jtu.JaxTestCase): ['', 'ShapeSpec()'], ['_', 'ShapeSpec(_)'], ]) - def test_shape_parsing(self, spec, ans): + def test_parse_spec(self, spec, ans): self.assertEqual(str(parse_spec(spec)), ans) - def test_poly_equal(self): + def test_Poly_equal(self): assert constant_poly(3) == 3 assert onp.array(3, onp.int64) == constant_poly(3) assert onp.array(3, onp.int64)[()] == constant_poly(3) @@ -70,7 +70,11 @@ def test_poly_equal(self): assert Poly({Mon(): 3, Mon({'n': 1}): 4}) != Poly({Mon(): 3, Mon({'n': 2}): 4}) assert Poly({Mon(): 3, Mon({'m': 1}): 4}) != Poly({Mon(): 3, Mon({'n': 1}): 4}) - def test_poly_compare(self): + def test_Poly_hash(self): + assert not len(set(hash(Poly({Mon(): i})) for i in range(10))) == 1 + assert hash(Poly({Mon(): 3, Mon({'n': 1}): 4})) == hash(Poly({Mon({'n': 1}): 4, Mon(): 3})) + + def test_Poly_compare(self): poly = Poly({Mon(): 3, Mon({'n': 1}): 4}) # Assume poly > 0 to make various shape rules work with polymorphic shapes: assert poly >= 0 @@ -84,39 +88,39 @@ def test_poly_compare(self): self.assertRaisesRegex(ValueError, "", lambda: poly >= 2) self.assertRaisesRegex(ValueError, "", lambda: poly > 1) - def test_poly_divmod(self): - n = parse_id('n') + def test_Poly_divmod(self): + n = Poly({Mon({'n': 1}): 1}) assert (n, 1) == divmod(2*n+1, 2) assert (2*n, 0) == divmod(10*n, 5) assert (2*n+4, 3) == divmod(10*n+23, 5) - def test_shapecheck_add_broadcast(self): - @shapecheck(['(m, n)', 'n'], '(m, n)') - @shapecheck(['n', ''], 'n') - def add(a, b): - return a + b + def test_add_broadcast(self): + @shapecheck(['(m, n)', 'n'], '(m, n)') + @shapecheck(['n', ''], 'n') + def add(a, b): + return a + b - def test_shapecheck_sum(self): + def test_sum(self): @shapecheck(['(m, n)'], '') def sum(x): return np.sum(x) - def test_shapecheck_prod(self): + def test_prod(self): @shapecheck(['(m, n)'], '') def prod(x): return np.prod(x) - def test_shapecheck_max(self): + def test_max(self): @shapecheck(['(m, n)'], '') def prod(x): return np.max(x) - def test_shapecheck_min(self): + def test_min(self): @shapecheck(['(m, n)'], '') def prod(x): return np.min(x) - def test_shapecheck_dot(self): + def test_dot(self): @shapecheck(['(m, n)', 'n'], 'm') def matvec(A, b): return np.dot(A, b) @@ -127,12 +131,12 @@ def matvec(A, b): return lax.dot_general(A, b, [((0,), (0,)), ((), ())]) self.assertRaisesRegex(TypeError, "", thunk) - def test_shapecheck_flatten(self): + def test_flatten(self): @shapecheck(['(m, n)'], 'm * n') def flatten(x): return lax.reshape(x, (x.shape[0] * x.shape[1],)) - def test_shapecheck_concatenate(self): + def test_concatenate(self): @shapecheck(['m', 'n', 'm'], '3*m + n') def cat(x, y, z): return lax.concatenate([x, y, x, z], 0) @@ -143,30 +147,37 @@ def cat(x, y, z): return lax.concatenate([x, y, x], 0) self.assertRaisesRegex(ShapeError, "", thunk) - def test_shapecheck_device_put(self): + def test_device_put(self): @shapecheck(['n'], 'n') def d_put(x): return api.device_put(x) - def test_shapecheck_broadcast_in_dim(self): + def test_broadcast_in_dim(self): x = np.zeros((7, 1)) lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) @shapecheck(['(n, 1)'], '(3, n, 4)') def broadcast_in_dim(x): return lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) - def test_shapecheck_jit(self): + def test_jit(self): @shapecheck(['n'], '2*n') @jit def concat(x): return lax.concatenate([x, x], 0) - def test_shapecheck_pad(self): + # TODO: + # @shapecheck(['n'], 'n') + # @jit + # @grad + # def sum_square(x): + # return np.sum(x ** 2) + + def test_pad(self): @shapecheck(['n'], '2*n+1') def p(x): - return lax.pad(x, 0, [(1, 1, 1)]) + return lax.pad(x, np.array(0., x.dtype), [(1, 1, 1)]) - def test_shapecheck_numpy_pad(self): + def test_numpy_pad(self): @shapecheck(['n'], 'n+1') def p(x): return np.pad(x, (0, 1)) @@ -191,8 +202,8 @@ def p(x): if (lhs_dilation is None or not isinstance(padding, str)) and # only test strides with same padding: (strides[0] == 1 or padding == 'SAME'))) - def test_shapecheck_conv(self, strides, padding, lhs_dilation, - dimension_numbers, lhs_perm, rhs_perm, out_perm): + def test_conv(self, strides, padding, lhs_dilation, + dimension_numbers, lhs_perm, rhs_perm, out_perm): valid = padding == 'VALID' is_strided = strides[0] != 1 lhs_shape = '({}, {}, {}, {})'.format(*onp.take(['n', 'i', '2*h' if is_strided else 'h', 'w'], lhs_perm)) @@ -207,8 +218,22 @@ def conv(lhs, rhs): lhs, rhs, strides, padding, lhs_dilation=lhs_dilation, dimension_numbers=dimension_numbers) - # TODO: - def DISABLED_shapecheck_slicing(self): + def test_indexing(self): + @shapecheck(['n'], '') + def first(x): + return x[0] + + @shapecheck(['n'], '') + def last(x): + return x[-1] + + @shapecheck(['(n,m,a)'], 'n,m') + @vmap + @shapecheck(['(n,a)'], 'n') + def last_column(x): + return x[..., -1] + + def test_slicing(self): @shapecheck(['n'], 'n+-1') def slice(x): return x[1:] @@ -217,16 +242,34 @@ def slice(x): def slice(x): return x[:-1] - def test_shapecheck_unsupported_op(self): - p = jc.Primitive('unsupported_op') - p.def_impl(lambda x: x) + def test_iota(self): + @shapecheck(['n'], 'n') + def range_like(x): + return lax.iota(np.int32, x.shape[0]) - def thunk(): - @shapecheck(['n'], 'n') - def identity(x): - return p.bind(x) + def test_arange(self): + @shapecheck(['n'], 'n') + def arange_like(x): + return np.arange(x.shape[0], dtype=np.int32) + + def test_expit(self): + @shapecheck(['n'], 'n') + def expit_(x): + return expit(x) + + def test_reshape(self): + @shapecheck(['n, a, b'], 'n, a*b') + def flatten(x): + return np.reshape(x, (x.shape[0], x.shape[1] * x.shape[2])) - self.assertRaisesRegex(NotImplementedError, "Shape rule for unsupported_op not implemented yet.", thunk) + def test_ravel(self): + a = np.array(1) + + @shapecheck(['n'], '') + def thunk(n): + return -(a + n.ravel()[0] * 0) + +class MaskingTest(jtu.JaxTestCase): def test_sum(self): @partial(mask, in_shapes=['n'], out_shape='') From 43ee917511d0ec87dcb4a323bcfc214e3c8b7736 Mon Sep 17 00:00:00 2001 From: Alexander Botev Date: Fri, 14 Feb 2020 15:45:26 +0000 Subject: [PATCH 0753/1053] =?UTF-8?q?Adding=20`broadcast=5Fargnums`=20to?= =?UTF-8?q?=20`pmap`=20for=20allowing=20similar=20behaviour=20t=E2=80=A6?= =?UTF-8?q?=20(#1786)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding `static_argnums` to `pmap` for similar behaviour to `static_argnums` of `jit`. * Removed check for ShardedDeviceArray * Final clean up and rename. --- CHANGELOG.md | 7 +++++++ jax/api.py | 19 +++++++++++++++++-- tests/pmap_test.py | 12 ++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eab5c26d7a7..8091ac03a545 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ These are the release notes for JAX. ## jax 0.1.60 (unreleased) +### New features + +* `pmap` has `static_broadcast_argnums` argument which allows the user to + specify arguments that should be treated as compile-time constants and + should be broadcasted to all devices. It works analogously to + `static_argnums` in `jit`. + ## jax 0.1.59 (February 11, 2020) ### Breaking changes diff --git a/jax/api.py b/jax/api.py index 5da4ebc41077..485c381deade 100644 --- a/jax/api.py +++ b/jax/api.py @@ -715,7 +715,7 @@ def _flatten_axes(treedef, axis_tree): return axes -def pmap(fun, axis_name=None, devices=None, backend=None, axis_size=None): +def pmap(fun, axis_name=None, static_broadcasted_argnums=(), devices=None, backend=None, axis_size=None): """Parallel map with support for collectives. The purpose of ``pmap`` is to express single-program multiple-data (SPMD) @@ -758,6 +758,14 @@ def pmap(fun, axis_name=None, devices=None, backend=None, axis_size=None): (tuple/list/dict) thereof. axis_name: Optional, a hashable Python object used to identify the mapped axis so that parallel collectives can be applied. + static_broadcasted_argnums: A tuple of ints specifying which positional + arguments to treat as static (compile-time constant). Operations that + only depend on static arguments will be constant-folded. Calling the + pmaped function with different values for these constants will trigger + recompilation. If the pmaped function is called with fewer positional + arguments than indicated by `static_argnums` then an error is raised. + Each of the static arguments will be broadcasted to all devices. + Defaults to (). devices: This is an experimental feature and the API is likely to change. Optional, a sequence of Devices to map over. (Available devices can be retrieved via jax.devices()). If specified, the size of the mapped axis @@ -866,6 +874,8 @@ def pmap(fun, axis_name=None, devices=None, backend=None, axis_size=None): """ _check_callable(fun) axis_name = _TempAxisName(fun) if axis_name is None else axis_name + if isinstance(static_broadcasted_argnums, int): + static_broadcasted_argnums = (static_broadcasted_argnums,) # axis_size is an optional integer representing the global axis size. # The aggregate size (across all hosts) size of the mapped axis must match @@ -877,7 +887,12 @@ def pmap(fun, axis_name=None, devices=None, backend=None, axis_size=None): @wraps(fun) def f_pmapped(*args, **kwargs): f = lu.wrap_init(fun) - args, in_tree = tree_flatten((args, kwargs)) + if static_broadcasted_argnums: + dyn_argnums = [i for i in range(len(args)) if i not in static_broadcasted_argnums] + f, dyn_args = _argnums_partial(f, dyn_argnums, args) + else: + dyn_args = args + args, in_tree = tree_flatten((dyn_args, kwargs)) local_axis_size = _pmap_axis_size(args) _check_args(args) flat_fun, out_tree = flatten_fun(f, in_tree) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 7beb1f6b5631..5b478a553806 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -1063,6 +1063,18 @@ def f(x): expected = grad(lambda x: np.sum(f(x)))(x) self.assertAllClose(ans, expected, check_dtypes=False) + def testPmapStaticArgnums(self): + @partial(pmap, axis_name='i', static_broadcasted_argnums=1) + def f(x, y): + return np.sin(x + y) + shape = (xla_bridge.device_count(), 4) + x = onp.arange(prod(shape), dtype=onp.float32).reshape(shape) + y = onp.arange(4, dtype=onp.float32) + + ans = f(x, y) + expected = onp.sin(x + y[None]) + self.assertAllClose(ans, expected, check_dtypes=False) + if __name__ == '__main__': absltest.main() From 6d0d6fd6c79647a85ec6b89081f94ca82f21f626 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 14 Feb 2020 11:04:20 -0500 Subject: [PATCH 0754/1053] Docstring typo (#2228) --- jax/random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/random.py b/jax/random.py index c55e9160d472..360aeaf45c28 100644 --- a/jax/random.py +++ b/jax/random.py @@ -670,7 +670,7 @@ def _cauchy(key, shape, dtype): def dirichlet(key, alpha, shape=None, dtype=onp.float64): - """Sample Cauchy random values with given shape and float dtype. + """Sample Dirichlet random values with given shape and float dtype. Args: key: a PRNGKey used as the random key. From 2a6e60fd50f7779641302f7643ed57eec27e403e Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 14 Feb 2020 10:06:27 -0800 Subject: [PATCH 0755/1053] Bump jaxlib version in README to 0.1.39 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d686d2e8e77f..617847d0d282 100644 --- a/README.md +++ b/README.md @@ -410,7 +410,7 @@ PYTHON_VERSION=cp37 # alternatives: cp35, cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda92, cuda100, cuda101, cuda102 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.38-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.39-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` From 33f8600acfd7c429adf98f3f6a5fd9525ab8cd95 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 14 Feb 2020 15:14:38 -0500 Subject: [PATCH 0756/1053] Disable PRED dlpack test. (#2227) --- tests/array_interoperability_test.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/array_interoperability_test.py b/tests/array_interoperability_test.py index 248e71396458..fba9d50bb239 100644 --- a/tests/array_interoperability_test.py +++ b/tests/array_interoperability_test.py @@ -37,12 +37,12 @@ cupy = None -standard_dtypes = [jnp.bool_, jnp.int8, jnp.int16, jnp.int32, jnp.int64, +dlpack_dtypes = [jnp.int8, jnp.int16, jnp.int32, jnp.int64, jnp.uint8, jnp.uint16, jnp.uint32, jnp.uint64, jnp.float16, jnp.float32, jnp.float64] -all_dtypes = standard_dtypes + [jnp.bfloat16] +all_dtypes = dlpack_dtypes + [jnp.bool_, jnp.bfloat16] torch_dtypes = [jnp.int8, jnp.int16, jnp.int32, jnp.int64, - jnp.uint8, jnp.float16, jnp.float32, jnp.float64] + jnp.uint8, jnp.float16, jnp.float32, jnp.float64] nonempty_nonscalar_array_shapes = [(4,), (3, 4), (2, 3, 4)] empty_array_shapes = [] @@ -65,7 +65,7 @@ def setUp(self): jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype} for shape in all_shapes - for dtype in all_dtypes)) + for dtype in dlpack_dtypes)) def testJaxRoundTrip(self, shape, dtype): rng = jtu.rand_default() np = rng(shape, dtype) @@ -123,7 +123,7 @@ def setUp(self): jtu.format_shape_dtype_string(shape, dtype)), "shape": shape, "dtype": dtype} for shape in all_shapes - for dtype in standard_dtypes)) + for dtype in dlpack_dtypes)) @unittest.skipIf(not cupy or jax.lib.version <= (0, 1, 38), "Test requires CuPy and jaxlib >= 0.1.39") def testJaxToCuPy(self, shape, dtype): From 71adf8cf7cda2644e25440d79a9b5899beffa970 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 14 Feb 2020 15:20:06 -0500 Subject: [PATCH 0757/1053] Update XLA. (#2229) . --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb5ea654d150..697550d34f80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "001be4590e0c3e0a4f90f6fa19b864ec53ba4946603b03660be7ec637273d831", - strip_prefix = "tensorflow-d8ff7566d1b47be15cc94c61777058e793da93af", + sha256 = "ae5214a4091fee4efdf88b3f8585495116276da249b4d7d6779ee67a099b6e74", + strip_prefix = "tensorflow-c25692039b954bb5aa891a26ff1744aab137eee7", urls = [ - "https://github.com/tensorflow/tensorflow/archive/d8ff7566d1b47be15cc94c61777058e793da93af.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/c25692039b954bb5aa891a26ff1744aab137eee7.tar.gz", ], ) From 9b362380039ba6eaa72ec4122c9544b71c5b5665 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 14 Feb 2020 15:33:20 -0500 Subject: [PATCH 0758/1053] Fix sha256 sum for XLA release. (#2230) --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index 697550d34f80..83a28b59f3d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,7 +28,7 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "ae5214a4091fee4efdf88b3f8585495116276da249b4d7d6779ee67a099b6e74", + sha256 = "c0b31150dfdc9495e2a953024bd86dea7c6f786f655ac2ebbbb04ae0029962b2", strip_prefix = "tensorflow-c25692039b954bb5aa891a26ff1744aab137eee7", urls = [ "https://github.com/tensorflow/tensorflow/archive/c25692039b954bb5aa891a26ff1744aab137eee7.tar.gz", From 18420936c4ce5aca7349766de66c21ea8efdec53 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 14 Feb 2020 18:09:52 -0800 Subject: [PATCH 0759/1053] _scatter_jvp bug fix (#2231) --- jax/interpreters/masking.py | 2 +- jax/lax/lax.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index d253b8b08f54..0cf89d12447a 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -375,4 +375,4 @@ def process_primitive(self, primitive, tracers, params): return map(partial(MaskTracer, self), out, out_shape) def process_call(self, call_primitive, f, tracers, params): - raise NotImplementedError # TODO mask-of-jit \ No newline at end of file + raise NotImplementedError # TODO mask-of-jit diff --git a/jax/lax/lax.py b/jax/lax/lax.py index b3f25b10aecb..2e2e776309f8 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3341,7 +3341,9 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, new_operand = pad(new_operand, _zero(operand), ((0, 1, 0),) + tuple((0, 0, 0) for _ in operand_shape)) - ids_shape = onp.array(updates_shape) + # We specify the dtype here in case `updates_shape` is an empty tuple, in + # which case numpy defaults to float64. + ids_shape = onp.array(updates_shape, dtype=onp.int32) ids_shape[dnums.update_window_dims,] = 1 num_ids = onp.prod(ids_shape) update_ids = add(reshape(iota(updates_dtype, num_ids), ids_shape), From deb21ef15d43cdc8fb00aae200573dab0fe75d8c Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 15 Feb 2020 06:35:49 +0100 Subject: [PATCH 0760/1053] Expanded the error messages due to re-using tracers saved in global state. Previously these errors were raising Exception (as other internal errors), but these errors may arise out of mis-use of tracers. --- jax/core.py | 24 +++++++----- jax/experimental/loops.py | 4 +- jax/interpreters/partial_eval.py | 8 ++-- tests/api_test.py | 64 ++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 14 deletions(-) diff --git a/jax/core.py b/jax/core.py index 6cf8c818be7c..5eed64adb6ef 100644 --- a/jax/core.py +++ b/jax/core.py @@ -280,6 +280,13 @@ def __init__(self, master, sublevel): self.level = master.level self.sublevel = sublevel + def escaped_tracer_error(self, detail): + msg = ("Encountered an unexpected tracer. Perhaps this tracer escaped " + "through global state from a previously traced function.\n" + "The functions being transformed should not save traced values to " + "global state.\nDetails: {}.") + raise ValueError(msg.format(detail)) + def full_raise(self, val): if not isinstance(val, Tracer): return self.pure(val) @@ -291,19 +298,18 @@ def full_raise(self, val): elif val._trace.sublevel < sublevel: return self.sublift(val) else: - raise Exception("Can't lift sublevels {} to {}" - .format(val._trace.sublevel, sublevel)) + self.escaped_tracer_error( + "Can't lift sublevels {} to {}".format(val._trace.sublevel, sublevel)) elif val._trace.level < level: if val._trace.sublevel > sublevel: - raise Exception("Incompatible sublevel: {}, {}" - .format(val._trace, (level, sublevel))) + self.escaped_tracer_error( + "Incompatible sublevel: {}, {}".format(val._trace, (level, sublevel))) return self.lift(val) elif val._trace.level > level: - raise Exception("Can't lift {} to {}".format(val, self)) - elif val._trace.level == self.level: - raise Exception("Different traces at same level: {}, {}".format(val, self)) - else: - raise Exception("Can't lift {} to {}".format(val, self)) + self.escaped_tracer_error( + "Can't lift level {} to {}".format(val, self)) + else: # val._trace.level == self.level: + self.escaped_tracer_error("Different traces at same level: {}, {}".format(val, self)) def pure(self, val): diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index 7dad9b08177e..8a0b4580f6c8 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -370,8 +370,8 @@ def end_tracing_body(self): in_tracers=in_tracers, out_tracers=body_out_tracers, trace=self.trace) - except AssertionError as e: - if "Encountered unexpected tracer" == str(e): + except ValueError as e: + if "Tracer not among input tracers" in str(e): raise ValueError("Body of cond_range or while_range should not use the " "index variable returned by iterator.") raise diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 95189795a07f..5beb2c003554 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -283,8 +283,9 @@ class JaxprTracer(Tracer): def __init__(self, trace, pval, recipe): assert isinstance(pval, PartialVal) pv, const = pval - if isinstance(const, Tracer): - assert const._trace.level < trace.level + if isinstance(const, Tracer) and const._trace.level >= trace.level: + trace.escaped_tracer_error( + "Tracer from a higher level: {} in trace {}".format(const, trace)) self._trace = trace self.pval = pval self.recipe = recipe @@ -438,7 +439,8 @@ def tracers_to_jaxpr(in_tracers, out_tracers): eqns.append(recipe_to_eqn(newvar, getvar, recipe)) processed_eqn_ids.add(recipe.eqn_id) elif isinstance(recipe, LambdaBinding): - assert any(t is in_tracer for in_tracer in in_tracers), "Encountered unexpected tracer" + if not any(t is in_tracer for in_tracer in in_tracers): + t._trace.escaped_tracer_error("Tracer not among input tracers {}".format(t)) assert in_tracers, "Lambda binding with no args" elif isinstance(recipe, FreeVar): env[getvar(t)] = recipe.val diff --git a/tests/api_test.py b/tests/api_test.py index 3814d2598652..98c505f1560d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -17,6 +17,7 @@ from contextlib import contextmanager import copy from functools import partial +import re import unittest import warnings import weakref @@ -1762,6 +1763,69 @@ def fun(x): jit(fun)(np.array([0, 1, 2], dtype=np.int32)) # doesn't crash + def helper_save_tracer(self, x): + self._saved_tracer = x + return x + + def test_escaped_tracers_diffent_top_level_traces(self): + api.jit(self.helper_save_tracer)(0.) + with self.assertRaisesRegex( + ValueError, + re.compile( + "Encountered an unexpected tracer.*Different traces at same level", + re.DOTALL)): + api.jit(lambda x: self._saved_tracer)(0.) + + def test_escaped_tracers_cant_lift_sublevels(self): + api.jit(self.helper_save_tracer)(0.) + with self.assertRaisesRegex( + ValueError, + re.compile( + "Encountered an unexpected tracer.*Can't lift sublevels 1 to 0", + re.DOTALL)): + api.jit(lambda x: x)(self._saved_tracer) + + def test_escaped_tracers_tracer_from_higher_level(self): + api.grad(self.helper_save_tracer)(0.) + with self.assertRaisesRegex( + ValueError, + re.compile( + "Encountered an unexpected tracer.*Tracer from a higher level", + re.DOTALL)): + api.grad(lambda x: x)(self._saved_tracer) + + def test_escaped_tracers_incompatible_sublevel(self): + def func1(x): + api.jit(self.helper_save_tracer)(0.) + # Use the tracer + return x + self._saved_tracer + with self.assertRaisesRegex( + ValueError, + re.compile("Encountered an unexpected tracer.*Incompatible sublevel", + re.DOTALL)): + api.jit(func1)(2.) + + def test_escaped_tracers_cant_lift(self): + def func1(x): + api.grad(self.helper_save_tracer)(0.) + return x + self._saved_tracer + with self.assertRaisesRegex( + ValueError, re.compile("Encountered an unexpected tracer.*Can't lift", + re.DOTALL)): + api.grad(func1)(2.) + + def test_escaped_tracers_not_among_input_tracers(self): + def func1(x): + api.grad(self.helper_save_tracer)(x) + # Use the tracer + return x + self._saved_tracer + + with self.assertRaisesRegex( + ValueError, re.compile( + "Encountered an unexpected tracer.*Tracer not among input tracers", + re.DOTALL)): + api.jit(func1)(2.) + class JaxprTest(jtu.JaxTestCase): From b92656db8b379cff5ba843a136827989c1dfe758 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Fri, 14 Feb 2020 23:29:33 -0800 Subject: [PATCH 0761/1053] Set `call_p.multiple_results` to True. --- jax/core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/core.py b/jax/core.py index 6cf8c818be7c..66fd03661d0d 100644 --- a/jax/core.py +++ b/jax/core.py @@ -653,6 +653,7 @@ def call_impl(f, *args, **params): call_p = Primitive('call') +call_p.multiple_results = True call_p.call_primitive = True call = partial(call_bind, call_p) call_p.def_custom_bind(call) From 370558def3c481de520c60a9506d2a7a54187f10 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 15 Feb 2020 11:43:10 +0100 Subject: [PATCH 0762/1053] Removed a couple of slow notebooks from RTD auto-rendering. Trying to address the timeouts in RTD rendering. Also fixed bad itemized list in autodiff cookbook, and a few minor warnings: Issue: #2092 --- docs/conf.py | 2 ++ docs/developer.rst | 3 ++- docs/jaxpr.rst | 2 +- docs/notebooks/autodiff_cookbook.ipynb | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index a139d46cadf6..b248f1c6cac5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -94,6 +94,8 @@ 'notebooks/neural_network_with_tfds_data.ipynb', # Slow notebook 'notebooks/Neural_Network_and_Data_Loading.ipynb', + 'notebooks/score_matching.ipynb', + 'notebooks/maml.ipynb', ] # The name of the Pygments (syntax highlighting) style to use. diff --git a/docs/developer.rst b/docs/developer.rst index 5d47127bd626..e5bbde67f7e8 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -157,7 +157,8 @@ You can then see the generated documentation in Update notebooks ---------------- -Open the notebook with http://colab.research.google.com, update it, ``Run all cells`` then +Open the notebook with http://colab.research.google.com (then `Upload` from your +local repo), update it as needed, ``Run all cells`` then ``Download ipynb``. You may want to test that it executes properly, using ``sphinx-build`` as explained above. diff --git a/docs/jaxpr.rst b/docs/jaxpr.rst index 62aeb36916fe..b189ed507c60 100644 --- a/docs/jaxpr.rst +++ b/docs/jaxpr.rst @@ -443,7 +443,7 @@ with 3 input parameters: * ``c`` is a constvar and stands for the ``ones`` constant, * ``b`` corresponds to the free variable ``arg`` captured in the ``inner`` function, - * ``a`` corresponds to the ``inner`` parameter ``x`. + * ``a`` corresponds to the ``inner`` parameter ``x``. The primitive takes three arguments ``b a c``. diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index f2c3b82d1142..a90c3b863c3f 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -672,6 +672,7 @@ }, "source": [ "This shape makes sense: if we start with a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$, then at a point $x \\in \\mathbb{R}^n$ we expect to get the shapes\n", + "\n", "* $f(x) \\in \\mathbb{R}^m$, the value of $f$ at $x$,\n", "* $\\partial f(x) \\in \\mathbb{R}^{m \\times n}$, the Jacobian matrix at $x$,\n", "* $\\partial^2 f(x) \\in \\mathbb{R}^{m \\times n \\times n}$, the Hessian at $x$,\n", From 1c6cd2541772a0dbd92b24f37f9567c638f5b8ee Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 15 Feb 2020 12:03:40 +0100 Subject: [PATCH 0763/1053] Temporarily disable XLA_in_Python notebook, pending fixing of bug Issue: #2236 --- docs/conf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index b248f1c6cac5..36db9c2722b4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -96,6 +96,8 @@ 'notebooks/Neural_Network_and_Data_Loading.ipynb', 'notebooks/score_matching.ipynb', 'notebooks/maml.ipynb', + # Fails with shape error in XL + 'notebooks/XLA_in_Python.ipnb' ] # The name of the Pygments (syntax highlighting) style to use. From 42bf313fa148a6d744e0fda94d32f45dd39bc317 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 15 Feb 2020 12:10:30 +0100 Subject: [PATCH 0764/1053] Fixed the name of the excluded notebook Issue: #2236 --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 36db9c2722b4..90f8a92390a5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -97,7 +97,7 @@ 'notebooks/score_matching.ipynb', 'notebooks/maml.ipynb', # Fails with shape error in XL - 'notebooks/XLA_in_Python.ipnb' + 'notebooks/XLA_in_Python.ipynb' ] # The name of the Pygments (syntax highlighting) style to use. From ca6df306aa0f3389e06fb27abb38f0c87e77145a Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Sat, 15 Feb 2020 18:32:00 +0000 Subject: [PATCH 0765/1053] Add `jax.nn.one_hot(x, num_classes, dtype)`. (#2240) --- jax/nn/functions.py | 29 +++++++++++++++++++++++++++++ tests/nn_test.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index 16d5761e3a3a..dbb19f0a3e2f 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -17,6 +17,7 @@ import numpy as onp +from jax import dtypes from jax import lax from jax import random from jax.scipy.special import expit @@ -235,3 +236,31 @@ def normalize(x, axis=-1, mean=None, variance=None, epsilon=1e-5): # when used in neural network normalization layers variance = np.mean(x**2, axis, keepdims=True) - mean**2 return (x - mean) * lax.rsqrt(variance + epsilon) + +def one_hot(x, num_classes, *, dtype=np.float64): + """One-hot encodes the given indicies. + + Each index in the input ``x`` is encoded as a vector of zeros of length + ``num_classes`` with the element at ``index`` set to one:: + + >>> jax.nn.one_hot(np.array([0, 1, 2]), 3) + DeviceArray([[1., 0., 0.], + [0., 1., 0.], + [0., 0., 1.]], dtype=float32) + + Indicies outside the range [0, num_classes) will be encoded as zeros:: + + >>> jax.nn.one_hot(np.array([-1, 3]), 3) + DeviceArray([[0., 0., 0.], + [0., 0., 0.]], dtype=float32) + + Args: + x: A tensor of indices. + num_classes: Number of classes in the one-hot dimension. + dtype: optional, a float dtype for the returned values (default float64 if + jax_enable_x64 is true, otherwise float32). + """ + dtype = dtypes.canonicalize_dtype(dtype) + x = np.asarray(x) + return np.array(x[..., np.newaxis] == np.arange(num_classes, dtype=x.dtype), + dtype=dtype) diff --git a/tests/nn_test.py b/tests/nn_test.py index b621f66307db..6537de52e375 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -61,6 +61,39 @@ def testHardTanhMemory(self): # see https://github.com/google/jax/pull/1640 jax.make_jaxpr(nn.hard_tanh)(np.ones((10 ** 12,))) # don't oom + def testOneHot(self): + actual = nn.one_hot(np.array([0, 1, 2]), 3) + expected = np.array([[1., 0., 0.], + [0., 1., 0.], + [0., 0., 1.]]) + self.assertAllClose(actual, expected, check_dtypes=True) + + actual = nn.one_hot(np.array([1, 2, 0]), 3) + expected = np.array([[0., 1., 0.], + [0., 0., 1.], + [1., 0., 0.]]) + self.assertAllClose(actual, expected, check_dtypes=True) + + def testOneHotOutOfBound(self): + actual = nn.one_hot(np.array([-1, 3]), 3) + expected = np.array([[0., 0., 0.], + [0., 0., 0.]]) + self.assertAllClose(actual, expected, check_dtypes=True) + + def testOneHotNonArrayInput(self): + actual = nn.one_hot([0, 1, 2], 3) + expected = np.array([[1., 0., 0.], + [0., 1., 0.], + [0., 0., 1.]]) + self.assertAllClose(actual, expected, check_dtypes=True) + + def testOneHotCustomDtype(self): + actual = nn.one_hot(np.array([0, 1, 2]), 3, dtype=np.bool_) + expected = np.array([[True, False, False], + [False, True, False], + [False, False, True]]) + self.assertAllClose(actual, expected, check_dtypes=True) + InitializerRecord = collections.namedtuple( "InitializerRecord", ["name", "initializer", "shapes"]) From 3a0690fa11d303e988ddb8cc05bfcb8ea0cf0e04 Mon Sep 17 00:00:00 2001 From: Mathis Gerdes Date: Mon, 17 Feb 2020 14:28:56 +0100 Subject: [PATCH 0766/1053] Correct sign mistake in complex autodiff docs. --- docs/notebooks/autodiff_cookbook.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index a90c3b863c3f..629467eef5f7 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -1378,7 +1378,7 @@ "source": [ "def grad_f(z):\n", " x, y = real(z), imag(z)\n", - " return grad(u, 0)(x, y) + grad(u, 1)(x, y) * 1j" + " return grad(u, 0)(x, y) - grad(u, 1)(x, y) * 1j" ] }, { @@ -1388,7 +1388,7 @@ "id": "4j0F28bB8bgK" }, "source": [ - "In math symbols, that means we define $\\partial f(z) \\triangleq \\partial_0 u(x, y) + \\partial_1 u(x, y)$. So we throw out $v$, ignoring the complex component function of $f$ entirely!" + "In math symbols, that means we define $\\partial f(z) \\triangleq \\partial_0 u(x, y) - \\partial_1 u(x, y) i$. So we throw out $v$, ignoring the complex component function of $f$ entirely!" ] }, { From fcd949b695018bede6bc2c3c16f3947c3e326760 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 17 Feb 2020 16:01:10 +0100 Subject: [PATCH 0767/1053] Added blank line to autodiff cookbook to trigger an enumeration --- docs/notebooks/autodiff_cookbook.ipynb | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index 629467eef5f7..e508d5c94734 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -1399,6 +1399,7 @@ }, "source": [ "This convention covers three important cases:\n", + "\n", "1. If `f` evaluates a holomorphic function, then we get the usual complex derivative, since $\\partial_0 u = \\partial_1 v$ and $\\partial_1 u = - \\partial_0 v$.\n", "2. If `f` is evaluates the real-valued loss function of a complex parameter `x`, then we get a result that we can use in gradient-based optimization by taking steps in the direction of the conjugate of `grad(f)(x)`.\n", "3. If `f` evaluates a real-to-real function, but its implementation uses complex primitives internally (some of which must be non-holomorphic, e.g. FFTs used in convolutions) then we get the same result that an implementation that only used real primitives would have given.\n", From ceab1e3edf1e2395035173dc50f24ce6a27475f6 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 17 Feb 2020 17:43:29 +0100 Subject: [PATCH 0768/1053] Revert "Allow shapecheck of PixelCNN++ (#2017)" This reverts commit 8f538f4e25d039a76d99af97374e7ece8c1c63a3. Issue: #2245 --- jax/api.py | 26 ++-- jax/interpreters/masking.py | 272 ++++++++++++++++++++++++------------ jax/interpreters/xla.py | 1 + jax/lax/lax.py | 11 +- jax/lax/lax_control_flow.py | 2 +- jax/numpy/lax_numpy.py | 30 ++-- jax/random.py | 5 +- tests/masking_test.py | 137 +++++++----------- 8 files changed, 260 insertions(+), 224 deletions(-) diff --git a/jax/api.py b/jax/api.py index 485c381deade..7ef5dff07ca1 100644 --- a/jax/api.py +++ b/jax/api.py @@ -27,8 +27,8 @@ import collections import functools import itertools as it +import operator as op import os -import string import threading from warnings import warn @@ -51,7 +51,6 @@ from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, host_id, host_ids, host_count) from .abstract_arrays import ConcreteArray, ShapedArray, raise_to_shaped -from .interpreters.masking import eval_polymorphic_shape, Poly, Mon from .interpreters import partial_eval as pe from .interpreters import xla from .interpreters import pxla @@ -59,6 +58,7 @@ from .interpreters import batching from .interpreters import parallel from .interpreters import masking +from .interpreters.masking import shapecheck, ensure_poly from .config import flags, config, bool_env map = safe_map @@ -1053,23 +1053,24 @@ def wrapped_fun(args, logical_env): out_shapes = map(masking.finalize_spec, out_specs, map(onp.shape, outs)) if not out_shapes == list(out_shapes_): raise masking.ShapeError - if not all(onp.shape(out) == eval_polymorphic_shape(shape, padded_env) - for out, shape in zip(outs, out_shapes)): + if not all(onp.shape(out) == masking.eval_shape_expr(padded_env, expr) + for out, expr in zip(outs, out_shapes)): raise masking.ShapeError return tree_unflatten(out_tree(), outs) return wrapped_fun def _remap_ids(names, shape_spec): - return masking.ShapeSpec(Poly({Mon({names[id] : deg for id, deg in mon.items()}) + ShapeSpec, Poly, Mon = masking.ShapeSpec, masking.Poly, masking.Mon + mdim = masking.monomorphic_dim + return ShapeSpec(Poly({Mon({names[id] : deg for id, deg in mon.items()}) : coeff for mon, coeff in poly.items()}) - if poly is not masking._monomorphic_dim else - masking._monomorphic_dim for poly in shape_spec) + if poly is not mdim else mdim for poly in shape_spec) def _bind_shapes(shape_exprs, shapes): env = {} for shape_expr, shape in zip(shape_exprs, shapes): for poly, d in zip(shape_expr, shape): - if type(poly) is not Poly or poly.is_constant: + if ensure_poly(poly).is_constant: continue else: (binder,), = poly # TODO generalize to handle striding @@ -1084,13 +1085,16 @@ def shapecheck(in_shapes, out_shape, fun): out_shapes, out_tree = tree_flatten(out_shape) out_shapes = map(masking.parse_spec, out_shapes) flat_fun, out_tree_ = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) - avals = map(partial(ShapedArray, dtype=onp.float32), in_shapes) - out_shapes_ = [o.shape for o in pe.abstract_eval_fun(flat_fun.call_wrapped, *avals)] + out_shapes_ = masking.shapecheck(flat_fun, in_shapes) if out_tree != out_tree_(): raise TypeError("pytree mismatch") - if not all(map(masking._shape_spec_consistent, out_shapes, out_shapes_)): + if not all(map(_shape_spec_consistent, out_shapes, out_shapes_)): raise masking.ShapeError return fun +def _shape_spec_consistent(spec, expr): + return all(a == b for a, b in zip(spec, expr) if a is not masking.monomorphic_dim) + + def jvp(fun, primals, tangents): """Computes a (forward-mode) Jacobian-vector product of `fun`. diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 0cf89d12447a..096584c5b564 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -12,10 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. + from contextlib import contextmanager -from collections import Counter, namedtuple -from functools import partial -from itertools import chain, product +from collections import defaultdict, Counter, namedtuple +import functools +from functools import partial, wraps +import itertools as it import operator as op import string @@ -24,30 +26,19 @@ from .. import abstract_arrays from .. import core from ..core import Trace, Tracer -from ..util import safe_map, safe_zip, unzip2, prod +from ..util import unzip2, safe_map, safe_zip, curry from ..abstract_arrays import ShapedArray from .. import linear_util as lu map = safe_map zip = safe_zip -shape_parameterized_primitive_rules = {} -masking_rules = {} - -def defvectorized(prim): - masking_rules[prim] = partial(vectorized_masking_rule, prim) +def prod(xs): + xs = list(xs) + return functools.reduce(op.mul, xs) if xs else 1 -def defnaryop(prim): - masking_rules[prim] = partial(naryop_masking_rule, prim) - -def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): - del logical_shapes # Unused. - padded_val, = padded_vals - return prim.bind(padded_val, **params) -def naryop_masking_rule(prim, padded_vals, logical_shapes): - del logical_shapes # Unused. - return prim.bind(*padded_vals) +### main transformation functions ShapeEnvs = namedtuple("ShapeEnvs", ["logical", "padded"]) shape_envs = ShapeEnvs({}, {}) # TODO(mattjj): make this a stack for efficiency @@ -55,17 +46,29 @@ def naryop_masking_rule(prim, padded_vals, logical_shapes): @contextmanager def extend_shape_envs(logical_env, padded_env): global shape_envs - new_logical = dict(chain(shape_envs.logical.items(), logical_env.items())) - new_padded = dict(chain(shape_envs.padded.items(), padded_env.items())) + new_logical = dict(it.chain(shape_envs.logical.items(), logical_env.items())) + new_padded = dict(it.chain(shape_envs.padded.items(), padded_env.items())) shape_envs, prev = ShapeEnvs(new_logical, new_padded), shape_envs yield shape_envs = prev -def shape_as_value(shape): - return eval_polymorphic_shape(shape, shape_envs.logical) +def is_polymorphic(shape): + return any(map(lambda d: isinstance(d, Poly), shape)) + +def shape_as_value(expr): + if type(expr) is tuple and is_polymorphic(expr): + return tuple(eval_dim_expr(shape_envs.logical, d) if type(d) is Poly else d + for d in expr) + else: + return expr + +def padded_shape_as_value(expr): + if type(expr) is tuple and is_polymorphic(expr): + return tuple(eval_dim_expr(shape_envs.padded, d) if type(d) is Poly else d + for d in expr) + else: + return expr -def padded_shape_as_value(shape): - return eval_polymorphic_shape(shape, shape_envs.padded) def mask_fun(fun, logical_env, padded_env, in_vals, shape_exprs): with core.new_master(MaskTrace) as master: @@ -85,39 +88,29 @@ def mask_subtrace(master, in_vals, shape_exprs): out_vals, out_shapes = unzip2((t.val, t.shape_expr) for t in out_tracers) yield out_vals, out_shapes -def to_index(x): - """Like operator.index, but allowing polymorphic dimensions. - Not implemented as `Poly.__index__`, since operator.index only allows ints.""" - return x if type(x) is Poly else op.index(x) - -def eval_polymorphic_shape(shape, values_dict): - return tuple(dim.evaluate(values_dict) if type(dim) is Poly else dim - for dim in shape) - -def _ensure_poly(p): - if type(p) is Poly: +def ensure_poly(p): + if isinstance(p, Poly): return p - return Poly({Mon(): p}) + return constant_poly(int(p)) -class Poly(dict): +class Poly(Counter): """Polynomial with integer coefficients, usable as element in a polymorphic shape. type Poly = Map Mon Int -- monomials to coeffs type Mon = Map Str Int """ - def __init__(self, coeffs): # Makes sure Polynomials are always in canonical form to simplify operators: - coeffs = {mon: op.index(coeff) for mon, coeff in coeffs.items() if coeff != 0} + coeffs = {mon: coeff for mon, coeff in coeffs.items() if coeff != 0} coeffs = {Mon(): 0} if len(coeffs) == 0 else coeffs super().__init__(coeffs) def __add__(self, other): coeffs = self.copy() - for mon, coeff in _ensure_poly(other).items(): + for mon, coeff in ensure_poly(other).items(): coeffs[mon] = coeffs.get(mon, 0) + coeff return Poly(coeffs) @@ -131,9 +124,10 @@ def __neg__(self): def __mul__(self, other): coeffs = dict() for (mon1, coeff1), (mon2, coeff2) \ - in product(self.items(), _ensure_poly(other).items()): - mon = mon1 * mon2 - coeffs[mon] = coeffs.get(mon, 0) + coeff1 * coeff2 + in it.product(self.items(), ensure_poly(other).items()): + mon = Mon(mon1 + mon2) # add monomials' id degrees + coeff = coeff1 * coeff2 # multiply integer coeffs + coeffs[mon] = coeffs.get(mon, 0) + coeff # accumulate coeffs return Poly(coeffs) @@ -156,7 +150,9 @@ def __mod__(self, divisor): def __divmod__(self, divisor): if self.is_constant: - return divmod(int(self), divisor) + q, r = divmod(int(self), divisor) + + return constant_poly(q), r def divided(count): q, r = divmod(count, divisor) @@ -167,29 +163,29 @@ def divided(count): return Poly( {k: coeff // divisor if k.degree == 0 else divided(coeff) - for k, coeff in self.items()}), self.get(Mon(), 0) % divisor + for k, coeff in self.items()}), self[Mon()] % divisor def __hash__(self): - return hash(tuple(sorted(self.items()))) + return hash(super()) def __eq__(self, other): - return dict.__eq__(self, _ensure_poly(other)) + return super().__eq__(ensure_poly(other)) def __ne__(self, other): return not self == other def __ge__(self, other): - other = _ensure_poly(other) + other = ensure_poly(other) if other.is_constant and self.is_constant: return int(self) >= int(other) if other.is_constant and int(other) <= 1: - # Assume polynomials > 0, allowing to use shape rules of binops, conv: - return True + # Assume polynomials > 0, allowing to use shape rules of binops, conv: + return True if self.is_constant and int(self) <= 0: - return False # See above. + return False # See above. if self == other: return True @@ -198,27 +194,22 @@ def __ge__(self, other): .format(self, other)) def __le__(self, other): - return _ensure_poly(other) >= self + return ensure_poly(other) >= self def __lt__(self, other): return not (self >= other) def __gt__(self, other): - return not (_ensure_poly(other) >= self) + return not (ensure_poly(other) >= self) def __str__(self): - return ' + '.join('{} {}'.format(v, k) - if (v != 1 or k.degree == 0) else str(k) + return ' + '.join('{} {}'.format(v, k) if (v != 1 or k.degree == 0) else str(k) for k, v in sorted(self.items())).strip() def __int__(self): assert self.is_constant - return op.index(next(iter(self.values()))) - - def evaluate(self, values_dict): - return sum(coeff * prod([values_dict[id] ** deg for id, deg in mon.items()]) - for mon, coeff in self.items()) + return int(next(iter(self.values()))) @property def is_constant(self): @@ -227,7 +218,7 @@ def is_constant(self): abstract_arrays._DIMENSION_TYPES.add(Poly) -class Mon(dict): # type Mon = Map Id Int -- ids to degrees +class Mon(Counter): # type Mon = Map Id Int -- ids to degrees def __hash__(self): return hash(tuple(self.items())) @@ -241,13 +232,34 @@ def __lt__(self, other): other_key = other.degree, tuple(sorted(other)) return self_key < other_key - def __mul__(self, other): - return Mon(Counter(self) + Counter(other)) - @property def degree(self): return sum(self.values()) +def eval_shape_expr(env, expr): + return tuple(eval_dim_expr(env, poly) for poly in expr) + +def eval_dim_expr(env, poly): + terms = [mul(coeff, prod([pow(env[id], deg) for id, deg in mon.items()])) + for mon, coeff in poly.items()] + return sum(terms) if len(terms) > 1 else terms[0] + +def pow(x, deg): + try: + deg = int(deg) + except: + return x ** deg + else: + return 1 if deg == 0 else x if deg == 1 else x ** deg + +def mul(coeff, mon): + try: + coeff = int(coeff) + except: + return coeff * mon + else: + return 0 if coeff == 0 else mon if coeff == 1 else coeff * mon + class ShapeError(Exception): pass class ShapeSyntaxError(Exception): pass @@ -267,7 +279,7 @@ class ShapeSyntaxError(Exception): pass # dims ::= dim ',' dims | '' # dim ::= str | int | dim '*' dim | dim '+' dim | '_' # -# ShapeSpecs can have some monomorphic dims inside them, +# ShapeSpecs encode ShapeExprs but can have some monomorphic dims inside them, # which must be replaced with concrete shapes when known. class ShapeSpec(tuple): @@ -275,7 +287,7 @@ def __str__(self): return 'ShapeSpec({})'.format(', '.join(map(str, self))) def finalize_spec(spec, shape): - return tuple(_parse_lit(d) if e is _monomorphic_dim else e + return tuple(parse_lit(d) if e is monomorphic_dim else e for e, d in zip(spec, shape)) def parse_spec(spec=''): @@ -284,33 +296,35 @@ def parse_spec(spec=''): if spec[0] == '(': if spec[-1] != ')': raise ShapeSyntaxError(spec) spec = spec[1:-1] - dims = map(_parse_dim, spec.replace(' ', '').strip(',').split(',')) + dims = map(parse_dim, spec.replace(' ', '').strip(',').split(',')) return ShapeSpec(dims) -def _parse_dim(spec): +def parse_dim(spec): if '+' in spec: - return onp.sum(map(_parse_dim, spec.split('+'))) + terms = map(parse_dim, spec.split('+')) + return functools.reduce(op.add, terms) elif '*' in spec: - return prod(map(_parse_dim, spec.split('*'))) + terms = map(parse_dim, spec.split('*')) + return functools.reduce(op.mul, terms) elif spec.isdigit() or spec.startswith('-') and spec[1:].isdigit(): - return _parse_lit(spec) - elif spec in _identifiers: - return _parse_id(spec) + return parse_lit(spec) + elif spec in identifiers: + return parse_id(spec) elif spec == '_': - return _monomorphic_dim + return monomorphic_dim else: raise ShapeSyntaxError(spec) +digits = frozenset(string.digits) +identifiers = frozenset(string.ascii_lowercase) -_identifiers = frozenset(string.ascii_lowercase) - -def _parse_id(name): return Poly({Mon({name: 1}): 1}) - -def _parse_lit(val_str): return Poly({Mon(): int(val_str)}) +def parse_id(name): return Poly({Mon({name: 1}): 1}) +def parse_lit(val_str): return constant_poly(int(val_str)) +def constant_poly(val): return Poly({Mon(): val}) class MonomorphicDim(object): def __str__(self): return '_' +monomorphic_dim = MonomorphicDim() -_monomorphic_dim = MonomorphicDim() # Two convenient ways to provide shape annotations: # 1. '(m, n)' @@ -318,13 +332,14 @@ def __str__(self): return '_' class S_(object): def __getitem__(self, idx): - return parse_spec(('(' + ','.join(map(str, idx)) + ')') - if type(idx) is tuple else str(idx)) - + if type(idx) is tuple: + return parse_spec('(' + ','.join(map(str, idx)) + ')') + else: + return parse_spec(str(idx)) s_ = S_() -def _shape_spec_consistent(spec, expr): - return all(a == b for a, b in zip(spec, expr) if a is not _monomorphic_dim) + +### automasking tracer machinery class MaskTracer(Tracer): __slots__ = ["val", "shape_expr"] @@ -339,7 +354,7 @@ def aval(self): return ShapedArray(self.shape_expr, self.val.dtype) def is_pure(self): - return all(type(poly) is not Poly or poly.is_constant for poly in self.shape_expr) + return all(ensure_poly(poly).is_constant for poly in self.shape_expr) def full_lower(self): if self.is_pure(): @@ -347,7 +362,6 @@ def full_lower(self): else: return self - class MaskTrace(Trace): def pure(self, val): return MaskTracer(self, val, onp.shape(val)) @@ -364,10 +378,8 @@ def process_primitive(self, primitive, tracers, params): rule = shape_parameterized_primitive_rules[primitive] out, out_shape = rule(shape_envs, vals, shape_exprs, **params) else: - avals = [t.aval for t in tracers] - out = primitive.abstract_eval(*avals, **params) - out_shape = [o.shape for o in out] if primitive.multiple_results else out.shape - logical_shapes = map(partial(eval_polymorphic_shape, values_dict=shape_envs.logical), shape_exprs) + out_shape = shape_rules[primitive](*(t.aval for t in tracers), **params) + logical_shapes = map(partial(eval_shape_expr, shape_envs.logical), shape_exprs) out = masking_rules[primitive](vals, logical_shapes, **params) if not primitive.multiple_results: return MaskTracer(self, out, out_shape) @@ -376,3 +388,79 @@ def process_primitive(self, primitive, tracers, params): def process_call(self, call_primitive, f, tracers, params): raise NotImplementedError # TODO mask-of-jit + +shape_parameterized_primitive_rules = {} +masking_rules = {} +shape_rules = {} + +def defvectorized(prim): + masking_rules[prim] = partial(vectorized_masking_rule, prim) + +def vectorized_masking_rule(prim, padded_vals, logical_shapes, **params): + del logical_shapes # Unused. + padded_val, = padded_vals + return prim.bind(padded_val, **params) + + +def defnaryop(prim): + masking_rules[prim] = partial(naryop_masking_rule, prim) + +def naryop_masking_rule(prim, padded_vals, logical_shapes): + del logical_shapes # Unused. + return prim.bind(*padded_vals) + + +### definition-time (import-time) shape checker tracer machinery + +def shapecheck(fun, in_shapes): + with core.new_master(ShapeCheckTrace) as master: + out_shapes = check_subtrace(fun, master).call_wrapped(in_shapes) + del master + return out_shapes + +@lu.transformation +def check_subtrace(master, in_shapes): + trace = ShapeCheckTrace(master, core.cur_sublevel()) + in_tracers = map(partial(ShapeCheckTracer, trace), in_shapes) + outs = yield in_tracers, {} + out_tracers = map(trace.full_raise, outs) + yield [t.shape_expr for t in out_tracers] + + +# TODO(mattjj): add dtypes? +class ShapeCheckTracer(Tracer): + __slots__ = ["shape_expr"] + + def __init__(self, trace, shape_expr): + self._trace = trace + self.shape_expr = shape_expr + + @property + def aval(self): + return ShapedArray(self.shape_expr, None) + + def full_lower(self): + return self + +class ShapeCheckTrace(Trace): + def pure(self, val): + return ShapeCheckTracer(self, onp.shape(val)) + + def lift(self, val): + return ShapeCheckTracer(self, onp.shape(val)) + + def sublift(self, val): + return ShapeCheckTracer(self, val.shape_expr) + + def process_primitive(self, primitive, tracers, params): + avals = [t.aval for t in tracers] + shape_rule = shape_rules.get(primitive) + if shape_rule is None: + raise NotImplementedError('Shape rule for {} not implemented yet.'.format(primitive)) + out_shape = shape_rule(*avals, **params) + return ShapeCheckTracer(self, out_shape) + + def process_call(self, call_primitive, f, tracers, params): + # TODO apply proper subtrace: + return map(self.full_raise, f.call_wrapped(*tracers)) + diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 6fecfa834c18..e95e97195af5 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -965,6 +965,7 @@ def _device_put_impl(x, device=None): device_put_p.def_impl(_device_put_impl) pe.custom_partial_eval_rules[device_put_p] = lambda trace, x, **params: x ad.deflinear(device_put_p, lambda cotangent, **kwargs: [cotangent]) +masking.shape_rules[device_put_p] = lambda x, **_: x.shape masking.defvectorized(device_put_p) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2e2e776309f8..b05609ff6de9 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -38,7 +38,6 @@ from ..abstract_arrays import (UnshapedArray, ShapedArray, ConcreteArray, AbstractToken, array_types, make_shaped_array, raise_to_shaped, abstract_token, canonicalize_shape) -from ..interpreters.masking import to_index from ..interpreters import partial_eval as pe from ..interpreters import xla from ..interpreters import pxla @@ -1065,7 +1064,7 @@ def iota(dtype, size): `_ operator. """ - size = to_index(size) + size = int(size) dtype = dtypes.canonicalize_dtype(dtype) lazy_expr = lazy.iota(dtype, size) aval = ShapedArray((size,), dtype) @@ -1506,6 +1505,7 @@ def standard_primitive(shape_rule, dtype_rule, name, translation_rule=None): prim.def_impl(partial(xla.apply_primitive, prim)) prim.def_abstract_eval(partial(standard_abstract_eval, prim, shape_rule, dtype_rule)) xla.translations[prim] = translation_rule or partial(standard_translate, name) + masking.shape_rules[prim] = shape_rule return prim @@ -4120,6 +4120,7 @@ def _tie_in_batch_rule(batched_args, batch_dims): xla.translations[tie_in_p] = lambda c, x, y: y ad.deflinear(tie_in_p, _tie_in_transpose_rule) batching.primitive_batchers[tie_in_p] = _tie_in_batch_rule +masking.shape_rules[tie_in_p] = lambda x, y: y.shape masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] @@ -4393,6 +4394,8 @@ def conv_transpose_shape_tuple(lhs_shape, rhs_shape, window_strides, padding, def _check_shapelike(fun_name, arg_name, obj): """Check that `obj` is a shape-like value (e.g. tuple of nonnegative ints).""" + if (type(obj) is tuple and masking.is_polymorphic(obj)): + return obj if not isinstance(obj, (tuple, list, onp.ndarray)): msg = "{} {} must be of type tuple/list/ndarray, got {}." raise TypeError(msg.format(fun_name, arg_name, type(obj))) @@ -4403,9 +4406,7 @@ def _check_shapelike(fun_name, arg_name, obj): if obj_arr.ndim != 1: msg = "{} {} must be rank 1, got {}." raise TypeError(msg.format(obj_arr.ndim)) - try: - canonicalize_shape(obj_arr) - except TypeError: + if not dtypes.issubdtype(obj_arr.dtype, onp.integer): msg = "{} {} must have every element be an integer type, got {}." raise TypeError(msg.format(fun_name, arg_name, tuple(map(type, obj)))) if not (obj_arr >= 0).all(): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 11298ba9170d..bed09a4129ea 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1120,7 +1120,7 @@ def _scan_masking_rule(shape_envs, padded_vals, shape_exprs, forward, length, jaxpr, num_consts, num_carry, linear): out_shape = _scan_shape_rule(shape_exprs, forward, length, jaxpr, num_consts, num_carry, linear) - dynamic_length = length.evaluate(shape_envs.logical) + dynamic_length = masking.eval_dim_expr(shape_envs.logical, length) masked_jaxpr = _masked_scan_jaxpr(jaxpr, num_consts, num_carry) consts, init, xs = split_list(padded_vals, [num_consts, num_carry]) max_length, = {x.shape[0] for x in xs} diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 968ebf1659de..0151c8a71b39 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -44,7 +44,6 @@ from ..abstract_arrays import UnshapedArray, ShapedArray, ConcreteArray from ..config import flags from ..interpreters.xla import DeviceArray -from ..interpreters.masking import Poly, to_index from .. import lax from ..util import partial, get_module_functions, unzip2, prod as _prod, subvals from ..lib import pytree @@ -1101,7 +1100,7 @@ def broadcast_arrays(*args): def broadcast_to(arr, shape): """Like Numpy's broadcast_to but doesn't necessarily return views.""" arr = arr if isinstance(arr, ndarray) else array(arr) - shape = tuple(map(to_index, shape)) # check that shape is concrete + shape = tuple(map(int, shape)) # check that shape is concrete arr_shape = _shape(arr) if arr_shape == shape: return arr @@ -1904,8 +1903,7 @@ def arange(start, stop=None, step=None, dtype=None): lax._check_user_dtype_supported(dtype, "arange") if stop is None and step is None: dtype = dtype or _dtype(start) - size = start if type(start) is Poly else lax.convert_element_type(start, onp.uint64) - return lax.iota(dtype, size) # avoids materializing + return lax.iota(dtype, start) # avoids materializing else: return array(onp.arange(start, stop=stop, step=step, dtype=dtype)) @@ -2687,9 +2685,6 @@ def take(a, indices, axis=None, out=None, mode=None): def _normalize_index(index, axis_size): """Normalizes an index value in the range [-N, N) to the range [0, N).""" - if type(axis_size) is Poly: - return index + axis_size if index < 0 else index - return lax.select( lax.lt(index, _constant_like(index, 0)), lax.add(index, _constant_like(index, axis_size)), @@ -2903,7 +2898,7 @@ def _index_to_gather(x_shape, idx): collapsed_slice_dims = [] start_index_map = [] - index_dtype = int64 if any([type(dim) is Poly or dim >= (1 << 31) for dim in x_shape]) else int32 + index_dtype = int64 if max(x_shape) >= (1 << 31) else int32 gather_indices = onp.zeros((0,), dtype=index_dtype) # use onp to save a compilation # We perform three transformations to y before the scatter op, in order: @@ -2959,8 +2954,7 @@ def _index_to_gather(x_shape, idx): if (isinstance(abstract_i, ConcreteArray) or isinstance(abstract_i, ShapedArray)) and _int(abstract_i): i = _normalize_index(i, x_shape[x_axis]) - # dummy index if is polynomial, doesn't matter for shape inference: - i = 0 if type(i) is Poly else lax.convert_element_type(i, index_dtype) + i = lax.convert_element_type(i, index_dtype) i = broadcast_to(i, tuple(gather_indices.shape[:-1]) + (1,)) gather_indices = concatenate((gather_indices, i), -1) collapsed_slice_dims.append(x_axis) @@ -2982,7 +2976,7 @@ def _index_to_gather(x_shape, idx): x_axis += 1 # Handle slice index (only static, otherwise an error is raised) elif isinstance(i, slice): - if not _all(elt is None or type(elt) is Poly or type(core.get_aval(elt)) is ConcreteArray + if not _all(elt is None or type(core.get_aval(elt)) is ConcreteArray for elt in (i.start, i.stop, i.step)): msg = ("Array slice indices must have static start/stop/step to be used " "with Numpy indexing syntax. Try lax.dynamic_slice/" @@ -3132,20 +3126,12 @@ def _canonicalize_tuple_index(arr_ndim, idx): idx = tuple(idx) + colons return idx -def _slice_indices(idx, size): - # like idx.indices(size), but allows for polymorphic slice and size - assert isinstance(idx, slice) - - step = 1 if idx.step is None else idx.step - start = (size - 1 if step < 0 else 0) if idx.start is None else idx.start + (size if idx.start < 0 else 0) - stop = (-1 if step < 0 else size) if idx.stop is None else idx.stop + (size if idx.stop < 0 else 0) - return start, stop, step def _static_idx(idx, size): """Helper function to compute the static slice start/limit/stride values.""" - start, stop, step = _slice_indices(idx, size) - if (type(start) is not Poly and type(stop) is not Poly and - ((step < 0 and stop >= start) or (step > 0 and start >= stop))): + assert isinstance(idx, slice) + start, stop, step = idx.indices(size) + if (step < 0 and stop >= start) or (step > 0 and start >= stop): return 0, 0, 1, False # sliced to size zero if step > 0: diff --git a/jax/random.py b/jax/random.py index 360aeaf45c28..2f64a088b38a 100644 --- a/jax/random.py +++ b/jax/random.py @@ -43,7 +43,6 @@ from jax.interpreters import partial_eval as pe from jax.interpreters import xla from jax.util import prod -from jax.interpreters.masking import to_index def PRNGKey(seed): @@ -277,7 +276,7 @@ def _random_bits(key, bit_width, shape): # TODO(mattjj): just split the key here raise TypeError("requesting more random bits than a single call provides.") - counts = lax.tie_in(key, lax.iota(onp.uint32, max_count.astype(onp.uint32))) + counts = lax.tie_in(key, lax.iota(onp.uint32, max_count)) bits = threefry_2x32(key, counts) if bit_width == 64: bits = [lax.convert_element_type(x, onp.uint64) for x in np.split(bits, 2)] @@ -290,7 +289,7 @@ def _random_bits(key, bit_width, shape): def _check_shape(name, shape, *param_shapes): try: - shape = tuple(map(to_index, shape)) + shape = tuple(map(int, shape)) except TypeError: msg = "{} requires a concrete tuple of integers as shape argument, got {}." raise ValueError(msg.format(name, shape)) diff --git a/tests/masking_test.py b/tests/masking_test.py index 8d30d58b823c..6ff0aec54e7d 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -17,24 +17,24 @@ from unittest import SkipTest import numpy as onp -from absl.testing import absltest, parameterized -from jax.interpreters.masking import shape_as_value, ShapeError, \ - parse_spec, Poly, Mon -from jax import numpy as np, test_util as jtu, mask, vmap, jit, grad, lax, \ - shapecheck, api -from jax.config import config -from jax.scipy.special import expit +from absl.testing import absltest +from absl.testing import parameterized + +from jax import test_util as jtu, core as jc, api +from jax.interpreters.masking import ShapeError, shape_as_value, parse_spec, \ + constant_poly, Mon, Poly, parse_id +from jax import mask, vmap, jit, grad, shapecheck +from jax import lax +import jax.numpy as np +from jax.config import config config.parse_flags_with_absl() -# These are 'manual' tests for masking. The more exhaustive, +# These are 'manual' tests for masking and shape checking. The more exhaustive, # more systematic tests should live in lax_test.py. -def constant_poly(c): - return Poly({Mon(): c}) - -class ShapesTest(jtu.JaxTestCase): +class MaskingTest(jtu.JaxTestCase): @parameterized.parameters([ ['(m, n)', 'ShapeSpec(m, n)'], @@ -53,10 +53,10 @@ class ShapesTest(jtu.JaxTestCase): ['', 'ShapeSpec()'], ['_', 'ShapeSpec(_)'], ]) - def test_parse_spec(self, spec, ans): + def test_shape_parsing(self, spec, ans): self.assertEqual(str(parse_spec(spec)), ans) - def test_Poly_equal(self): + def test_poly_equal(self): assert constant_poly(3) == 3 assert onp.array(3, onp.int64) == constant_poly(3) assert onp.array(3, onp.int64)[()] == constant_poly(3) @@ -70,11 +70,7 @@ def test_Poly_equal(self): assert Poly({Mon(): 3, Mon({'n': 1}): 4}) != Poly({Mon(): 3, Mon({'n': 2}): 4}) assert Poly({Mon(): 3, Mon({'m': 1}): 4}) != Poly({Mon(): 3, Mon({'n': 1}): 4}) - def test_Poly_hash(self): - assert not len(set(hash(Poly({Mon(): i})) for i in range(10))) == 1 - assert hash(Poly({Mon(): 3, Mon({'n': 1}): 4})) == hash(Poly({Mon({'n': 1}): 4, Mon(): 3})) - - def test_Poly_compare(self): + def test_poly_compare(self): poly = Poly({Mon(): 3, Mon({'n': 1}): 4}) # Assume poly > 0 to make various shape rules work with polymorphic shapes: assert poly >= 0 @@ -88,39 +84,39 @@ def test_Poly_compare(self): self.assertRaisesRegex(ValueError, "", lambda: poly >= 2) self.assertRaisesRegex(ValueError, "", lambda: poly > 1) - def test_Poly_divmod(self): - n = Poly({Mon({'n': 1}): 1}) + def test_poly_divmod(self): + n = parse_id('n') assert (n, 1) == divmod(2*n+1, 2) assert (2*n, 0) == divmod(10*n, 5) assert (2*n+4, 3) == divmod(10*n+23, 5) - def test_add_broadcast(self): - @shapecheck(['(m, n)', 'n'], '(m, n)') - @shapecheck(['n', ''], 'n') - def add(a, b): - return a + b + def test_shapecheck_add_broadcast(self): + @shapecheck(['(m, n)', 'n'], '(m, n)') + @shapecheck(['n', ''], 'n') + def add(a, b): + return a + b - def test_sum(self): + def test_shapecheck_sum(self): @shapecheck(['(m, n)'], '') def sum(x): return np.sum(x) - def test_prod(self): + def test_shapecheck_prod(self): @shapecheck(['(m, n)'], '') def prod(x): return np.prod(x) - def test_max(self): + def test_shapecheck_max(self): @shapecheck(['(m, n)'], '') def prod(x): return np.max(x) - def test_min(self): + def test_shapecheck_min(self): @shapecheck(['(m, n)'], '') def prod(x): return np.min(x) - def test_dot(self): + def test_shapecheck_dot(self): @shapecheck(['(m, n)', 'n'], 'm') def matvec(A, b): return np.dot(A, b) @@ -131,12 +127,12 @@ def matvec(A, b): return lax.dot_general(A, b, [((0,), (0,)), ((), ())]) self.assertRaisesRegex(TypeError, "", thunk) - def test_flatten(self): + def test_shapecheck_flatten(self): @shapecheck(['(m, n)'], 'm * n') def flatten(x): return lax.reshape(x, (x.shape[0] * x.shape[1],)) - def test_concatenate(self): + def test_shapecheck_concatenate(self): @shapecheck(['m', 'n', 'm'], '3*m + n') def cat(x, y, z): return lax.concatenate([x, y, x, z], 0) @@ -147,37 +143,30 @@ def cat(x, y, z): return lax.concatenate([x, y, x], 0) self.assertRaisesRegex(ShapeError, "", thunk) - def test_device_put(self): + def test_shapecheck_device_put(self): @shapecheck(['n'], 'n') def d_put(x): return api.device_put(x) - def test_broadcast_in_dim(self): + def test_shapecheck_broadcast_in_dim(self): x = np.zeros((7, 1)) lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) @shapecheck(['(n, 1)'], '(3, n, 4)') def broadcast_in_dim(x): return lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) - def test_jit(self): + def test_shapecheck_jit(self): @shapecheck(['n'], '2*n') @jit def concat(x): return lax.concatenate([x, x], 0) - # TODO: - # @shapecheck(['n'], 'n') - # @jit - # @grad - # def sum_square(x): - # return np.sum(x ** 2) - - def test_pad(self): + def test_shapecheck_pad(self): @shapecheck(['n'], '2*n+1') def p(x): - return lax.pad(x, np.array(0., x.dtype), [(1, 1, 1)]) + return lax.pad(x, 0, [(1, 1, 1)]) - def test_numpy_pad(self): + def test_shapecheck_numpy_pad(self): @shapecheck(['n'], 'n+1') def p(x): return np.pad(x, (0, 1)) @@ -202,8 +191,8 @@ def p(x): if (lhs_dilation is None or not isinstance(padding, str)) and # only test strides with same padding: (strides[0] == 1 or padding == 'SAME'))) - def test_conv(self, strides, padding, lhs_dilation, - dimension_numbers, lhs_perm, rhs_perm, out_perm): + def test_shapecheck_conv(self, strides, padding, lhs_dilation, + dimension_numbers, lhs_perm, rhs_perm, out_perm): valid = padding == 'VALID' is_strided = strides[0] != 1 lhs_shape = '({}, {}, {}, {})'.format(*onp.take(['n', 'i', '2*h' if is_strided else 'h', 'w'], lhs_perm)) @@ -218,22 +207,8 @@ def conv(lhs, rhs): lhs, rhs, strides, padding, lhs_dilation=lhs_dilation, dimension_numbers=dimension_numbers) - def test_indexing(self): - @shapecheck(['n'], '') - def first(x): - return x[0] - - @shapecheck(['n'], '') - def last(x): - return x[-1] - - @shapecheck(['(n,m,a)'], 'n,m') - @vmap - @shapecheck(['(n,a)'], 'n') - def last_column(x): - return x[..., -1] - - def test_slicing(self): + # TODO: + def DISABLED_shapecheck_slicing(self): @shapecheck(['n'], 'n+-1') def slice(x): return x[1:] @@ -242,34 +217,16 @@ def slice(x): def slice(x): return x[:-1] - def test_iota(self): - @shapecheck(['n'], 'n') - def range_like(x): - return lax.iota(np.int32, x.shape[0]) - - def test_arange(self): - @shapecheck(['n'], 'n') - def arange_like(x): - return np.arange(x.shape[0], dtype=np.int32) - - def test_expit(self): - @shapecheck(['n'], 'n') - def expit_(x): - return expit(x) - - def test_reshape(self): - @shapecheck(['n, a, b'], 'n, a*b') - def flatten(x): - return np.reshape(x, (x.shape[0], x.shape[1] * x.shape[2])) + def test_shapecheck_unsupported_op(self): + p = jc.Primitive('unsupported_op') + p.def_impl(lambda x: x) - def test_ravel(self): - a = np.array(1) - - @shapecheck(['n'], '') - def thunk(n): - return -(a + n.ravel()[0] * 0) + def thunk(): + @shapecheck(['n'], 'n') + def identity(x): + return p.bind(x) -class MaskingTest(jtu.JaxTestCase): + self.assertRaisesRegex(NotImplementedError, "Shape rule for unsupported_op not implemented yet.", thunk) def test_sum(self): @partial(mask, in_shapes=['n'], out_shape='') From 161a7822bacc5905f5fe0dfcc936ef5b1538e07b Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 17 Feb 2020 18:25:07 +0100 Subject: [PATCH 0769/1053] Added test case for indexing out of bounds --- tests/lax_numpy_indexing_test.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 27e2c0788bdf..823c4cdbb4e2 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -757,6 +757,11 @@ def testFloatIndexingError(self): x = lnp.array([1, 2, 3]) self.assertRaises(TypeError, lambda: x[3.5]) + def testIndexOutOfBounds(self): # https://github.com/google/jax/issues/2245 + array = lnp.ones(5) + self.assertAllClose(array, array[:10], check_dtypes=True) + + def _broadcastable_shapes(shape): """Returns all shapes that broadcast to `shape`.""" def f(rshape): From b6e834117616977c85dae1e166124e3254304ca4 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 17 Feb 2020 11:24:03 -0800 Subject: [PATCH 0770/1053] Improve developer documentation. (#2247) Add Python version test to build.py. --- build/build.py | 17 +++++++++++++++++ docs/developer.rst | 11 ++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/build/build.py b/build/build.py index 66902687d34f..02597ddbcfdb 100755 --- a/build/build.py +++ b/build/build.py @@ -55,6 +55,20 @@ def get_python_bin_path(python_bin_path_flag): return python_bin_path_flag or sys.executable +def get_python_version(python_bin_path): + version_output = shell( + [python_bin_path, "-c", + "import sys; print(\"{}.{}\".format(sys.version_info[0], " + "sys.version_info[1]))"]) + major, minor = map(int, version_output.split(".")) + return major, minor + +def check_python_version(python_version): + if python_version < (3, 5): + print("JAX requires Python 3.5 or newer.") + sys.exit(-1) + + # Bazel BAZEL_BASE_URI = "https://github.com/bazelbuild/bazel/releases/download/1.2.1/" @@ -309,6 +323,9 @@ def main(): python_bin_path = get_python_bin_path(args.python_bin_path) print("Python binary path: {}".format(python_bin_path)) + python_version = get_python_version(python_bin_path) + print("Python version: {}".format(".".join(map(str, python_version)))) + check_python_version(python_version) print("MKL-DNN enabled: {}".format("yes" if args.enable_mkl_dnn else "no")) print("-march=native: {}".format("yes" if args.enable_march_native else "no")) diff --git a/docs/developer.rst b/docs/developer.rst index e5bbde67f7e8..29e0842cca37 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -36,12 +36,13 @@ To build ``jaxlib`` from source, you must also install some prerequisites: * Numpy * Scipy * Cython +* six (required for during the jaxlib build only, not required at install time) On Ubuntu 18.04 or Debian you can install the necessary prerequisites with: .. code-block:: shell - sudo apt-get install g++ python python3-dev python3-numpy python3-scipy cython3 + sudo apt-get install g++ python python3-dev python3-numpy python3-scipy cython3 python3-six If you are building on a Mac, make sure XCode and the XCode command line tools @@ -51,7 +52,7 @@ You can also install the necessary Python dependencies using ``pip``: .. code-block:: shell - pip install numpy scipy cython + pip install numpy scipy cython six To build ``jaxlib`` with CUDA support, you can run @@ -63,9 +64,9 @@ To build ``jaxlib`` with CUDA support, you can run See ``python build/build.py --help`` for configuration options, including ways to -specify the paths to CUDA and CUDNN, which you must have installed. The build -also depends on NumPy, and a compiler toolchain corresponding to that of -Ubuntu 16.04 or newer. +specify the paths to CUDA and CUDNN, which you must have installed. Here +``python`` should be the name of your Python 3 interpreter; on some systems, you +may need to use ``python3`` instead. To build ``jaxlib`` without CUDA GPU support (CPU only), drop the ``--enable_cuda``: From ae1214de74e9ec42da8ff813dab8577c6bd9231d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 18 Feb 2020 12:39:03 -0800 Subject: [PATCH 0771/1053] add np.copy method to abstract arrays (#2257) * add np.copy method to abstract arrays fixes #2248 * make device_get use onp.asarray, not .copy() --- jax/api.py | 3 +-- jax/numpy/lax_numpy.py | 7 ++++++- tests/api_test.py | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index 7ef5dff07ca1..a9c144c5e038 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1383,11 +1383,10 @@ def device_put(x, device=None): return tree_map(lambda y: xla.device_put_p.bind(y, device=device), x) -# TODO(mattjj): consider revising def _device_get(x): if isinstance(x, core.Tracer): return x - return x.copy() + return onp.asarray(x) def device_get(x): for y in tree_leaves(x): diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0151c8a71b39..d3e51af38f50 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1816,6 +1816,10 @@ def asarray(a, dtype=None, order=None): lax._check_user_dtype_supported(dtype, "asarray") return array(a, dtype=dtype, copy=False, order=order) +@_wraps(onp.copy) +def copy(a, order='K'): + return array(a, copy=True, order=order) + @_wraps(onp.zeros_like) def zeros_like(x, dtype=None): @@ -3436,7 +3440,8 @@ def _operator_round(number, ndigits=None): _diff_methods = ["clip", "compress", "conj", "conjugate", "cumprod", "cumsum", "diagonal", "dot", "max", "mean", "min", "prod", "ptp", "ravel", "repeat", "sort", "squeeze", "std", "sum", - "swapaxes", "take", "tile", "trace", "transpose", "var"] + "swapaxes", "take", "tile", "trace", "transpose", "var", + "copy"] # Set up operator, method, and property forwarding on Tracer instances containing diff --git a/tests/api_test.py b/tests/api_test.py index 98c505f1560d..33360781c7f1 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1826,6 +1826,9 @@ def func1(x): re.DOTALL)): api.jit(func1)(2.) + def test_array_tracer_copy(self): + api.value_and_grad(lambda x: x.copy().sum())(np.ones(2)) # doesn't crash + class JaxprTest(jtu.JaxTestCase): From 6cceb2c778f94f67902caf1ae253b17a463f9c3e Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Tue, 18 Feb 2020 17:41:38 -0800 Subject: [PATCH 0772/1053] Faster gradient rules for {numpy,scipy}.linalg.solve (#2220) Fixes GH1747 The implicit function theorem (via `lax.custom_linear_solve`) lets us _directly_ define gradients for linear solves, in contrast to the current implementations of gradient for `solve` which rely upon differentiating matrix factorization. In **theory**, JVPs of `cholesky` and `lu` involve the equivalent of ~3 dense matrix-matrix multiplications, which makes them rather expensive: time `O(n**3)`. In contrast, with `custom_linear_solve` we don't need to differentiate the factorization. The JVP and VJP rules for linear solve (for a single right-hand-side vector) now only use matrix-vector products and triangular solves, which is time `O(n**2)`. We should also have reduced memory usage, because we don't need to save any intermediate outputs. In **practice**, these new gradient rules seem to make solves with large arrays ~3x faster: from functools import partial import jax.scipy as jsp from jax import lax import jax.numpy as np import numpy as onp import jax def loss(solve): def f(a, b): return solve(a, b).sum() return f rs = onp.random.RandomState(0) N = 500 K = 1 a = rs.randn(N, N) a = jax.device_put(a.T @ a + 0.1 * np.eye(N)) b = jax.device_put(rs.randn(N, K)) # general matrix solve grad = jax.jit(jax.grad(loss(np.linalg.solve))) grad(a, b).block_until_ready() %timeit grad(a, b).block_until_ready() # N=500, K=1: 11.4 ms -> 3.63 ms # positive definite solve grad = jax.jit(jax.grad(loss(partial(jsp.linalg.solve, sym_pos=True)))) grad(a, b).block_until_ready() %timeit grad(a, b).block_until_ready() # N=500, K=1: 9.22 ms -> 2.83 ms --- jax/numpy/linalg.py | 35 +++++++++++++++++++++++++++++------ jax/scipy/linalg.py | 37 +++++++++++++++++++++++-------------- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 0ca1c25efb4b..58f0a4b1c5f2 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -27,6 +27,7 @@ from .. import dtypes from .lax_numpy import _not_implemented from .lax_numpy import _wraps +from .vectorize import vectorize from . import lax_numpy as np from ..api import custom_transforms, defjvp from ..util import get_module_functions @@ -328,16 +329,38 @@ def qr(a, mode="reduced"): return q, r -@_wraps(onp.linalg.solve) -@jit -def solve(a, b): - a, b = _promote_arg_dtypes(np.asarray(a), np.asarray(b)) +def _check_solve_shapes(a, b): if not (a.ndim >= 2 and a.shape[-1] == a.shape[-2] and b.ndim >= 1): msg = ("The arguments to solve must have shapes a=[..., m, m] and " "b=[..., m, k] or b=[..., m]; got a={} and b={}") raise ValueError(msg.format(a.shape, b.shape)) - lu, pivots = lax_linalg.lu(a) - return lax_linalg.lu_solve(lu, pivots, b, trans=0) + + +@partial(vectorize, signature='(n,m),(m)->(n)') +def _matvec_multiply(a, b): + return np.dot(a, b, precision=lax.Precision.HIGHEST) + + +@_wraps(onp.linalg.solve) +@jit +def solve(a, b): + a, b = _promote_arg_dtypes(np.asarray(a), np.asarray(b)) + _check_solve_shapes(a, b) + + # With custom_linear_solve, we can reuse the same factorization when + # computing sensitivities. This is considerably faster. + lu, pivots = lax.stop_gradient(lax_linalg.lu)(a) + custom_solve = partial( + lax.custom_linear_solve, + lambda x: _matvec_multiply(a, x), + solve=lambda _, x: lax_linalg.lu_solve(lu, pivots, x, trans=0), + transpose_solve=lambda _, x: lax_linalg.lu_solve(lu, pivots, x, trans=1)) + if a.ndim == b.ndim + 1: + # b.shape == [..., m] + return custom_solve(b) + else: + # b.shape == [..., m, k] + return vmap(custom_solve, b.ndim - 1, max(a.ndim, b.ndim) - 1)(b) for func in get_module_functions(onp.linalg): diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index 7b791afa6d33..d1fd8f19a32b 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -18,7 +18,7 @@ import scipy.linalg import textwrap -from jax import jit +from jax import jit, vmap from .. import lax from .. import lax_linalg from ..numpy.lax_numpy import _wraps @@ -45,24 +45,16 @@ def cho_factor(a, lower=False, overwrite_a=False, check_finite=True): @partial(jit, static_argnums=(2,)) def _cho_solve(c, b, lower): c, b = np_linalg._promote_arg_dtypes(np.asarray(c), np.asarray(b)) - c_shape = np.shape(c) - b_shape = np.shape(b) - c_ndims = len(c_shape) - b_ndims = len(b_shape) - if not (c_ndims >= 2 and c_shape[-1] == c_shape[-2] and - (c_ndims == b_ndims or c_ndims == b_ndims + 1)): - msg = ("The arguments to solve must have shapes a=[..., m, m] and " - "b=[..., m, k] or b=[..., m]; got a={} and b={}") - raise ValueError(msg.format(c_shape, b_shape)) - + np_linalg._check_solve_shapes(c, b) # TODO(phawkins): triangular_solve only supports matrices on the RHS, so we # add a dummy dimension. Extend it to support vectors and simplify this. - b = b if c_ndims == b_ndims else b[..., None] + rhs_vector = c.ndim == b.ndim + 1 + b = b[..., np.newaxis] if rhs_vector else b b = lax_linalg.triangular_solve(c, b, left_side=True, lower=lower, transpose_a=not lower, conjugate_a=not lower) b = lax_linalg.triangular_solve(c, b, left_side=True, lower=lower, transpose_a=lower, conjugate_a=lower) - return b[..., 0] if c_ndims != b_ndims else b + return b[..., 0] if rhs_vector else b @_wraps(scipy.linalg.cho_solve, update_doc=False) def cho_solve(c_and_lower, b, overwrite_b=False, check_finite=True): @@ -170,13 +162,30 @@ def qr(a, overwrite_a=False, lwork=None, mode="full", pivoting=False, del overwrite_a, lwork, check_finite return _qr(a, mode, pivoting) + @partial(jit, static_argnums=(2, 3)) def _solve(a, b, sym_pos, lower): if not sym_pos: return np_linalg.solve(a, b) a, b = np_linalg._promote_arg_dtypes(np.asarray(a), np.asarray(b)) - return cho_solve(cho_factor(a, lower=lower), b) + np_linalg._check_solve_shapes(a, b) + + # With custom_linear_solve, we can reuse the same factorization when + # computing sensitivities. This is considerably faster. + factors = lax.stop_gradient(cho_factor)(a, lower=lower) + custom_solve = partial( + lax.custom_linear_solve, + lambda x: np_linalg._matvec_multiply(a, x), + solve=lambda _, x: cho_solve(factors, x), + symmetric=True) + if a.ndim == b.ndim + 1: + # b.shape == [..., m] + return custom_solve(b) + else: + # b.shape == [..., m, k] + return vmap(custom_solve, b.ndim - 1, max(a.ndim, b.ndim) - 1)(b) + @_wraps(scipy.linalg.solve) def solve(a, b, sym_pos=False, lower=False, overwrite_a=False, overwrite_b=False, From eda91a048b508c608d44c2f073429b9bfb26878d Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Wed, 19 Feb 2020 06:04:20 +0000 Subject: [PATCH 0773/1053] Use input dtype for constants in jax.nn.gelu (#2259) --- jax/nn/functions.py | 3 ++- tests/nn_test.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index dbb19f0a3e2f..b97321b8b276 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -180,7 +180,8 @@ def gelu(x): speed. For more information, see `Gaussian Error Linear Units (GELUs) `_, section 2. """ - cdf = 0.5 * (1.0 + np.tanh((np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))) + sqrt_2_over_pi = onp.sqrt(2 / onp.pi).astype(x.dtype) + cdf = 0.5 * (1.0 + np.tanh(sqrt_2_over_pi * (x + 0.044715 * x**3))) return x * cdf def glu(x, axis=-1): diff --git a/tests/nn_test.py b/tests/nn_test.py index 6537de52e375..3d853ff2942c 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -51,6 +51,14 @@ def testEluValue(self): val = nn.elu(1e4) self.assertAllClose(val, 1e4, check_dtypes=False) + @parameterized.parameters(*itertools.product( + (np.float32, np.bfloat16, np.float16), + (nn.gelu, nn.relu, nn.softplus, nn.sigmoid))) + def testDtypeMatchesInput(self, dtype, fn): + x = np.zeros((), dtype=dtype) + out = fn(x) + self.assertEqual(out.dtype, dtype) + @jtu.skip_on_devices("gpu", "tpu") def testEluMemory(self): # see https://github.com/google/jax/pull/1640 From 08eb0ee030cf4fe41eb719dffccd835a25e2e8a9 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 19 Feb 2020 16:03:10 +0100 Subject: [PATCH 0774/1053] Disable newly added test on TPU (no float16) (#2262) Added in #2259 --- tests/nn_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/nn_test.py b/tests/nn_test.py index 3d853ff2942c..f3448ae9b989 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -55,6 +55,8 @@ def testEluValue(self): (np.float32, np.bfloat16, np.float16), (nn.gelu, nn.relu, nn.softplus, nn.sigmoid))) def testDtypeMatchesInput(self, dtype, fn): + if dtype is np.float16 and jtu.device_under_test() == "tpu": + self.skipTest("float16 not supported on TPU") x = np.zeros((), dtype=dtype) out = fn(x) self.assertEqual(out.dtype, dtype) From 96b66ac9762225da4d3977e82dfd35c1160827bc Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 19 Feb 2020 12:37:59 -0800 Subject: [PATCH 0775/1053] fix typo in autodiff cookbook --- docs/notebooks/autodiff_cookbook.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index e508d5c94734..1cfc92290eb2 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -705,7 +705,7 @@ "\n", "#### JVPs in math\n", "\n", - "Mathematically, given a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$, the Jacobian matrix of $f$ evaluated at an input point $x \\in \\mathbb{R}^n$, denoted $\\partial f(x)$, is often thought of as a matrix in $\\mathbb{R}^m \\times \\mathbb{R}^n$:\n", + "Mathematically, given a function $f : \\mathbb{R}^n \\to \\mathbb{R}^m$, the Jacobian of $f$ evaluated at an input point $x \\in \\mathbb{R}^n$, denoted $\\partial f(x)$, is often thought of as a matrix in $\\mathbb{R}^m \\times \\mathbb{R}^n$:\n", "\n", "$\\qquad \\partial f(x) \\in \\mathbb{R}^{m \\times n}$.\n", "\n", From 485c7b21afcd6cf8cc0ef1a5e17f7e277e300748 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 8 Oct 2019 16:23:49 -0700 Subject: [PATCH 0776/1053] trajectory unrolling for control benchmark --- benchmarks/__init__.py | 13 +++++ benchmarks/benchmarks_test.py | 95 +++++++++++++++++++++++++++++++++++ benchmarks/control.py | 43 ++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 benchmarks/__init__.py create mode 100644 benchmarks/benchmarks_test.py create mode 100644 benchmarks/control.py diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py new file mode 100644 index 000000000000..086a24e64eb4 --- /dev/null +++ b/benchmarks/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/benchmarks/benchmarks_test.py b/benchmarks/benchmarks_test.py new file mode 100644 index 000000000000..cbb01385e6a7 --- /dev/null +++ b/benchmarks/benchmarks_test.py @@ -0,0 +1,95 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +from benchmarks import control + +import numpy as onp + +from jax import lax +from jax import test_util as jtu +import jax.numpy as np + +from jax.config import config +config.parse_flags_with_absl() +FLAGS = config.FLAGS + + +class ControlBenchmarkTest(jtu.JaxTestCase): + + def testTrajectoryCyclicIntegerCounter(self): + num_states = 3 + + def dynamics(t, x, u): + return (x + u) % num_states + + T = 10 + + U = np.ones((T, 1)) + X = control.trajectory(dynamics, U, np.zeros(1)) + expected = np.arange(T + 1) % num_states + expected = np.reshape(expected, (T + 1, 1)) + self.assertAllClose(X, expected, check_dtypes=True) + + U = 2 * np.ones((T, 1)) + X = control.trajectory(dynamics, U, np.zeros(1)) + expected = np.cumsum(2 * np.ones(T)) % num_states + expected = np.concatenate((np.zeros(1), expected)) + expected = np.reshape(expected, (T + 1, 1)) + self.assertAllClose(X, expected, check_dtypes=True) + + def testTrajectoryTimeVarying(self): + T = 6 + + def clip(x, lo, hi): + return np.minimum(hi, np.maximum(lo, x)) + + def dynamics(t, x, u): + return (x + u) * clip(t - T, 0, 1) + + U = np.ones((2 * T, 1)) + X = control.trajectory(dynamics, U, np.zeros(1)) + expected = np.concatenate((np.zeros(T + 1), np.arange(T))) + expected = np.reshape(expected, (2 * T + 1, 1)) + self.assertAllClose(X, expected, check_dtypes=True) + + + def testTrajectoryCyclicIndicator(self): + num_states = 3 + + def position(x): + '''finds the index of a standard basis vector, e.g. [0, 1, 0] -> 1''' + x = np.cumsum(x) + x = 1 - x + return np.sum(x, dtype=np.int32) + + def dynamics(t, x, u): + '''moves the next standard basis vector''' + idx = (position(x) + u[0]) % num_states + return lax.dynamic_slice_in_dim(np.eye(num_states), idx, 1)[0] + + T = 8 + + U = np.ones((T, 1), dtype=np.int32) + X = control.trajectory(dynamics, U, np.eye(num_states, dtype=np.int32)[0]) + expected = np.vstack((np.eye(num_states),) * 3) + self.assertAllClose(X, expected, check_dtypes=True) + + +if __name__ == '__main__': + absltest.main() diff --git a/benchmarks/control.py b/benchmarks/control.py new file mode 100644 index 000000000000..e4b242c1b770 --- /dev/null +++ b/benchmarks/control.py @@ -0,0 +1,43 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Benchmarks for model-predictive linear control +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections + +import jax +from jax import lax +import jax.numpy as np +import jax.ops as jo + + +def trajectory(dynamics, U, x0): + '''Unrolls `X[t+1] = dynamics(t, X[t], U[t])`, where `X[0] = x0`.''' + T, _ = U.shape + d, = x0.shape + + X = np.zeros((T + 1, d)) + X = jo.index_update(X, jo.index[0], x0) + + def loop(t, X): + x = dynamics(t, X[t], U[t]) + X = jo.index_update(X, jo.index[t + 1], x) + return X + + return lax.fori_loop(0, T, loop, X) From 8be270d3e1d4cf3e243789ee623b01e80461e478 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 8 Oct 2019 17:18:28 -0700 Subject: [PATCH 0777/1053] LQR solver and unrolling for control benchmark --- benchmarks/benchmarks_test.py | 32 ++++++++++++++ benchmarks/control.py | 79 +++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) diff --git a/benchmarks/benchmarks_test.py b/benchmarks/benchmarks_test.py index cbb01385e6a7..c7d87ee16cfd 100644 --- a/benchmarks/benchmarks_test.py +++ b/benchmarks/benchmarks_test.py @@ -30,6 +30,17 @@ FLAGS = config.FLAGS +def one_step_lqr(dim, T): + Q = np.stack(T * (np.eye(dim),)) + q = np.zeros((T, dim)) + R = np.zeros((T, dim, dim)) + r = np.zeros((T, dim)) + M = np.zeros((T, dim, dim)) + A = np.stack(T * (np.eye(dim),)) + B = np.stack(T * (np.eye(dim),)) + return control.LqrSpec(Q, q, R, r, M, A, B) + + class ControlBenchmarkTest(jtu.JaxTestCase): def testTrajectoryCyclicIntegerCounter(self): @@ -91,5 +102,26 @@ def dynamics(t, x, u): self.assertAllClose(X, expected, check_dtypes=True) + def testLqrSolve(self): + dim, T = 2, 10 + p = one_step_lqr(dim, T) + K, k = control.lqr_solve(p) + K_ = -np.stack(T * (np.eye(dim),)) + self.assertAllClose(K, K_, check_dtypes=True) + self.assertAllClose(k, np.zeros((T, dim)), check_dtypes=True) + + + def testLqrPredict(self): + randn = onp.random.RandomState(0).randn + dim, T = 2, 10 + p = one_step_lqr(dim, T) + x0 = randn(dim) + X, U = control.lqr_predict(p, x0) + self.assertAllClose(X[0], x0, check_dtypes=True) + self.assertAllClose(U[0], -x0, check_dtypes=True) + self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) + self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + + if __name__ == '__main__': absltest.main() diff --git a/benchmarks/control.py b/benchmarks/control.py index e4b242c1b770..86e9765cfc70 100644 --- a/benchmarks/control.py +++ b/benchmarks/control.py @@ -27,6 +27,28 @@ import jax.ops as jo +# Finite-horizon, time-varying LQR problem. Notation is: +# +# cost(t, x, u) = sum( +# dot(x.T, Q[t], x) + dot(q[t], x) + +# dot(u.T, R[t], u) + dot(r[t], u) + +# dot(x.T, M[t], u) +# +# dynamics(t, x, u) = dot(A[t], x) + dot(B[t], u) +# +LqrSpec = collections.namedtuple('LqrSpec', 'Q q R r M A B') + + +dot = np.dot +mm = np.matmul + + +def mv(mat, vec): + assert mat.ndim == 2 + assert vec.ndim == 1 + return dot(mat, vec) + + def trajectory(dynamics, U, x0): '''Unrolls `X[t+1] = dynamics(t, X[t], U[t])`, where `X[0] = x0`.''' T, _ = U.shape @@ -41,3 +63,60 @@ def loop(t, X): return X return lax.fori_loop(0, T, loop, X) + + +def lqr_solve(spec): + EPS = 1e-7 + T, control_dim, _ = spec.R.shape + _, state_dim, _ = spec.Q.shape + + K = np.zeros((T, control_dim, state_dim)) + k = np.zeros((T, control_dim)) + + def rev_loop(t_, (P, p, K, k)): + t = T - t_ - 1 + + Q, q = spec.Q[t], spec.q[t] + R, r = spec.R[t], spec.r[t] + M = spec.M[t] + A, B = spec.A[t], spec.B[t] + + AtP = mm(A.T, P) + BtP = mm(B.T, P) + G = R + mm(BtP, B) + H = mm(BtP, A) + M.T + h = r + mv(B.T, p) + K_ = -np.linalg.solve(G + EPS * np.eye(G.shape[0]), H) + k_ = -np.linalg.solve(G + EPS * np.eye(G.shape[0]), h) + P_ = Q + mm(AtP, A) + mm(K_.T, H) + p_ = q + mv(A.T, p) + mv(K_.T, h) + + K = jo.index_update(K, jo.index[t], K_) + k = jo.index_update(k, jo.index[t], k_) + return P_, p_, K, k + + P, p, K, k = lax.fori_loop( + 0, T, rev_loop, + (spec.Q[T + 1], spec.q[T + 1], K, k)) + + return K, k + + +def lqr_predict(spec, x0): + T, control_dim, _ = spec.R.shape + _, state_dim, _ = spec.Q.shape + + K, k = lqr_solve(spec) + + def fwd_loop(t, (X, U)): + A, B = spec.A[t], spec.B[t] + u = mv(K[t], X[t]) + k[t] + x = mv(A, X[t]) + mv(B, u) + X = jo.index_update(X, jo.index[t + 1], x) + U = jo.index_update(U, jo.index[t], u) + return X, U + + U = np.zeros((T, control_dim)) + X = np.zeros((T + 1, state_dim)) + X = jo.index_update(X, jo.index[0], x0) + return lax.fori_loop(0, T, fwd_loop, (X, U)) From d560a06b8a44f49bcef56e5cb715705454f732d0 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Fri, 18 Oct 2019 15:33:33 -0700 Subject: [PATCH 0778/1053] non-linear solver by iterative local LQR approximation --- benchmarks/benchmarks_test.py | 78 ++++++++++++++++++++++++++++++++++- benchmarks/control.py | 75 +++++++++++++++++++++++++++++---- 2 files changed, 143 insertions(+), 10 deletions(-) diff --git a/benchmarks/benchmarks_test.py b/benchmarks/benchmarks_test.py index c7d87ee16cfd..74d8bffeeeaf 100644 --- a/benchmarks/benchmarks_test.py +++ b/benchmarks/benchmarks_test.py @@ -16,15 +16,17 @@ from __future__ import division from __future__ import print_function -from absl.testing import absltest -from benchmarks import control +from functools import partial +from absl.testing import absltest import numpy as onp from jax import lax from jax import test_util as jtu import jax.numpy as np +from benchmarks import control + from jax.config import config config.parse_flags_with_absl() FLAGS = config.FLAGS @@ -41,6 +43,33 @@ def one_step_lqr(dim, T): return control.LqrSpec(Q, q, R, r, M, A, B) +def control_from_lqr(lqr): + T, dim, _ = lqr.Q.shape + dot = np.dot + + def cost(t, x, u): + return ( + dot(dot(lqr.Q[t], x), x) + dot(lqr.q[t], x) + + dot(dot(lqr.R[t], u), u) + dot(lqr.r[t], u) + + dot(dot(lqr.M[t], u), x)) + + def dynamics(t, x, u): + return dot(lqr.A[t], x) + dot(lqr.B[t], u) + + return control.ControlSpec(cost, dynamics, T, dim, dim) + + +def one_step_control(dim, T): + + def cost(t, x, u): + return np.dot(x, x) + + def dynamics(t, x, u): + return x + u + + return control.ControlSpec(cost, dynamics, T, dim, dim) + + class ControlBenchmarkTest(jtu.JaxTestCase): def testTrajectoryCyclicIntegerCounter(self): @@ -71,6 +100,7 @@ def clip(x, lo, hi): return np.minimum(hi, np.maximum(lo, x)) def dynamics(t, x, u): + # computes `(x + u) if t > T else 0` return (x + u) * clip(t - T, 0, 1) U = np.ones((2 * T, 1)) @@ -123,5 +153,49 @@ def testLqrPredict(self): self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + def testIlqrWithLqrProblem(self): + randn = onp.random.RandomState(0).randn + dim, T, num_iters = 2, 10, 3 + lqr = one_step_lqr(dim, T) + p = control_from_lqr(lqr) + x0 = randn(dim) + X, U = control.ilqr(p, num_iters, x0, np.zeros((T, dim))) + self.assertAllClose(X[0], x0, check_dtypes=True) + self.assertAllClose(U[0], -x0, check_dtypes=True) + self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) + self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + + + def testIlqrWithLqrProblemSpecifiedGenerally(self): + randn = onp.random.RandomState(0).randn + dim, T, num_iters = 2, 10, 3 + p = one_step_control(dim, T) + x0 = randn(dim) + X, U = control.ilqr(p, num_iters, x0, np.zeros((T, dim))) + self.assertAllClose(X[0], x0, check_dtypes=True) + self.assertAllClose(U[0], -x0, check_dtypes=True) + self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) + self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + + + def testIlqrWithNonlinearProblem(self): + def cost(t, x, u): + return (x[0] ** 2. + 1e-3 * u[0] ** 2.) / (t + 1.) + + def dynamics(t, x, u): + return (x ** 2. - u ** 2.) / (t + 1.) + + T, num_iters, d = 10, 7, 1 + p = control.ControlSpec(cost, dynamics, T, d, d) + + x0 = np.array([0.2]) + X, U = control.ilqr(p, num_iters, x0, 1e-5 * np.ones((T, d))) + assert_close = partial(self.assertAllClose, atol=1e-2, check_dtypes=True) + assert_close(X[0], x0) + assert_close(U[0] ** 2., x0 ** 2.) + assert_close(X[1:], np.zeros((T, d))) + assert_close(U[1:], np.zeros((T - 1, d))) + + if __name__ == '__main__': absltest.main() diff --git a/benchmarks/control.py b/benchmarks/control.py index 86e9765cfc70..7cf1c6341361 100644 --- a/benchmarks/control.py +++ b/benchmarks/control.py @@ -25,9 +25,28 @@ from jax import lax import jax.numpy as np import jax.ops as jo +from jax import grad, hessian, jacfwd, jacobian, jacrev, vmap -# Finite-horizon, time-varying LQR problem. Notation is: +# Specifies a general finite-horizon, time-varying control problem. Given cost +# function `c`, transition function `f`, and initial state `x0`, the goal is to +# compute: +# +# argmin(lambda U, U: c(T, X[T]) + sum(c(t, X[t], U[t]) for t in range(T))) +# +# subject to the constraints that `X[0] == x0` and that: +# +# all(X[t + 1] == f(X[t], U[t]) for t in range(T)) . +# +# The special case in which `c` is quadratic and `f` is linear is the +# linear-quadratic regulator (LQR) problem, and can be specified explicity +# further below. +# +ControlSpec = collections.namedtuple( + 'ControlSpec', 'cost dynamics horizon state_dim control_dim') + + +# Specifies a finite-horizon, time-varying LQR problem. Notation: # # cost(t, x, u) = sum( # dot(x.T, Q[t], x) + dot(q[t], x) + @@ -65,6 +84,28 @@ def loop(t, X): return lax.fori_loop(0, T, loop, X) +def make_lqr_approx(p): + T = p.horizon + + def approx_timestep(t, x, u): + M = jacfwd(grad(p.cost, argnums=2), argnums=1)(t, x, u).T + Q = jacfwd(grad(p.cost, argnums=1), argnums=1)(t, x, u) + R = jacfwd(grad(p.cost, argnums=2), argnums=2)(t, x, u) + q, r = grad(p.cost, argnums=(1, 2))(t, x, u) + A, B = jacobian(p.dynamics, argnums=(1, 2))(t, x, u) + return Q, q, R, r, M, A, B + + _approx = vmap(approx_timestep) + + def approx(X, U): + assert X.shape[0] == T + 1 and U.shape[0] == T + U_pad = np.vstack((U, np.zeros((1,) + U.shape[1:]))) + Q, q, R, r, M, A, B = _approx(np.arange(T + 1), X, U_pad) + return LqrSpec(Q, q, R[:T], r[:T], M[:T], A[:T], B[:T]) + + return approx + + def lqr_solve(spec): EPS = 1e-7 T, control_dim, _ = spec.R.shape @@ -73,7 +114,7 @@ def lqr_solve(spec): K = np.zeros((T, control_dim, state_dim)) k = np.zeros((T, control_dim)) - def rev_loop(t_, (P, p, K, k)): + def rev_loop(t_, (spec, P, p, K, k)): t = T - t_ - 1 Q, q = spec.Q[t], spec.q[t] @@ -93,11 +134,11 @@ def rev_loop(t_, (P, p, K, k)): K = jo.index_update(K, jo.index[t], K_) k = jo.index_update(k, jo.index[t], k_) - return P_, p_, K, k + return spec, P_, p_, K, k - P, p, K, k = lax.fori_loop( + _, P, p, K, k = lax.fori_loop( 0, T, rev_loop, - (spec.Q[T + 1], spec.q[T + 1], K, k)) + (spec, spec.Q[T + 1], spec.q[T + 1], K, k)) return K, k @@ -108,15 +149,33 @@ def lqr_predict(spec, x0): K, k = lqr_solve(spec) - def fwd_loop(t, (X, U)): + def fwd_loop(t, (spec, X, U)): A, B = spec.A[t], spec.B[t] u = mv(K[t], X[t]) + k[t] x = mv(A, X[t]) + mv(B, u) X = jo.index_update(X, jo.index[t + 1], x) U = jo.index_update(U, jo.index[t], u) - return X, U + return spec, X, U U = np.zeros((T, control_dim)) X = np.zeros((T + 1, state_dim)) X = jo.index_update(X, jo.index[0], x0) - return lax.fori_loop(0, T, fwd_loop, (X, U)) + _, X, U = lax.fori_loop(0, T, fwd_loop, (spec, X, U)) + return X, U + + +def ilqr(p, iterations, x0, U): + assert x0.ndim == 1 and x0.shape[0] == p.state_dim, x0.shape + assert U.ndim > 0 and U.shape[0] == p.horizon, (U.shape, p.horizon) + + lqr_approx = make_lqr_approx(p) + + def loop(_, (X, U)): + p_lqr = lqr_approx(X, U) + dX, dU = lqr_predict(p_lqr, np.zeros_like(x0)) + U = U + dU + X = trajectory(p.dynamics, U, X[0] + dX[0]) + return X, U + + X = trajectory(p.dynamics, U, x0) + return lax.fori_loop(0, iterations, loop, (X, U)) From 3a9ed6e09cc0edc8a4e4b93b342e5b4ede976252 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Mon, 11 Nov 2019 17:25:52 -0800 Subject: [PATCH 0779/1053] model-predictive control trajectory optimizer --- benchmarks/benchmarks_test.py | 53 +++++++++++++++++++++++++++++++++-- benchmarks/control.py | 29 ++++++++++++++++++- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/benchmarks/benchmarks_test.py b/benchmarks/benchmarks_test.py index 74d8bffeeeaf..2dabe2ed1811 100644 --- a/benchmarks/benchmarks_test.py +++ b/benchmarks/benchmarks_test.py @@ -159,7 +159,7 @@ def testIlqrWithLqrProblem(self): lqr = one_step_lqr(dim, T) p = control_from_lqr(lqr) x0 = randn(dim) - X, U = control.ilqr(p, num_iters, x0, np.zeros((T, dim))) + X, U = control.ilqr(num_iters, p, x0, np.zeros((T, dim))) self.assertAllClose(X[0], x0, check_dtypes=True) self.assertAllClose(U[0], -x0, check_dtypes=True) self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) @@ -171,7 +171,7 @@ def testIlqrWithLqrProblemSpecifiedGenerally(self): dim, T, num_iters = 2, 10, 3 p = one_step_control(dim, T) x0 = randn(dim) - X, U = control.ilqr(p, num_iters, x0, np.zeros((T, dim))) + X, U = control.ilqr(num_iters, p, x0, np.zeros((T, dim))) self.assertAllClose(X[0], x0, check_dtypes=True) self.assertAllClose(U[0], -x0, check_dtypes=True) self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) @@ -189,7 +189,54 @@ def dynamics(t, x, u): p = control.ControlSpec(cost, dynamics, T, d, d) x0 = np.array([0.2]) - X, U = control.ilqr(p, num_iters, x0, 1e-5 * np.ones((T, d))) + X, U = control.ilqr(num_iters, p, x0, 1e-5 * np.ones((T, d))) + assert_close = partial(self.assertAllClose, atol=1e-2, check_dtypes=True) + assert_close(X[0], x0) + assert_close(U[0] ** 2., x0 ** 2.) + assert_close(X[1:], np.zeros((T, d))) + assert_close(U[1:], np.zeros((T - 1, d))) + + + def testMpcWithLqrProblem(self): + randn = onp.random.RandomState(0).randn + dim, T, num_iters = 2, 10, 3 + lqr = one_step_lqr(dim, T) + p = control_from_lqr(lqr) + x0 = randn(dim) + solver = partial(control.ilqr, num_iters) + X, U = control.mpc_predict(solver, p, x0, np.zeros((T, dim))) + self.assertAllClose(X[0], x0, check_dtypes=True) + self.assertAllClose(U[0], -x0, check_dtypes=True) + self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) + self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + + + def testMpcWithLqrProblemSpecifiedGenerally(self): + randn = onp.random.RandomState(0).randn + dim, T, num_iters = 2, 10, 3 + p = one_step_control(dim, T) + x0 = randn(dim) + solver = partial(control.ilqr, num_iters) + X, U = control.mpc_predict(solver, p, x0, np.zeros((T, dim))) + self.assertAllClose(X[0], x0, check_dtypes=True) + self.assertAllClose(U[0], -x0, check_dtypes=True) + self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) + self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + + + def testMpcWithNonlinearProblem(self): + def cost(t, x, u): + return (x[0] ** 2. + 1e-3 * u[0] ** 2.) / (t + 1.) + + def dynamics(t, x, u): + return (x ** 2. - u ** 2.) / (t + 1.) + + T, num_iters, d = 10, 7, 1 + p = control.ControlSpec(cost, dynamics, T, d, d) + + x0 = np.array([0.2]) + solver = partial(control.ilqr, num_iters) + X, U = control.mpc_predict(solver, p, x0, 1e-5 * np.ones((T, d))) assert_close = partial(self.assertAllClose, atol=1e-2, check_dtypes=True) assert_close(X[0], x0) assert_close(U[0] ** 2., x0 ** 2.) diff --git a/benchmarks/control.py b/benchmarks/control.py index 7cf1c6341361..09ce399a2452 100644 --- a/benchmarks/control.py +++ b/benchmarks/control.py @@ -164,7 +164,7 @@ def fwd_loop(t, (spec, X, U)): return X, U -def ilqr(p, iterations, x0, U): +def ilqr(iterations, p, x0, U): assert x0.ndim == 1 and x0.shape[0] == p.state_dim, x0.shape assert U.ndim > 0 and U.shape[0] == p.horizon, (U.shape, p.horizon) @@ -179,3 +179,30 @@ def loop(_, (X, U)): X = trajectory(p.dynamics, U, x0) return lax.fori_loop(0, iterations, loop, (X, U)) + + +def mpc_predict(solver, p, x0, U): + assert x0.ndim == 1 and x0.shape[0] == p.state_dim + T = p.horizon + + def zero_padded_controls_window(U, t): + U_pad = np.vstack((U, np.zeros(U.shape))) + return lax.dynamic_slice_in_dim(U_pad, t, T, axis=0) + + def loop(t, (X, U)): + cost = lambda t_, x, u: p.cost(t + t_, x, u) + dyns = lambda t_, x, u: p.dynamics(t + t_, x, u) + + p_ = ControlSpec(cost, dyns, T, p.state_dim, p.control_dim) + xt = X[t] + U_rem = zero_padded_controls_window(U, t) + _, U_ = solver(p_, xt, U_rem) + ut = U_[0] + x = p.dynamics(t, xt, ut) + X = jo.index_update(X, jo.index[t + 1], x) + U = jo.index_update(U, jo.index[t], ut) + return X, U + + X = np.zeros((T + 1, p.state_dim)) + X = jo.index_update(X, jo.index[0], x0) + return lax.fori_loop(0, T, loop, (X, U)) From a86e73d2598e6dc3ae56c1911e2c2c5bebc0334b Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 18 Feb 2020 18:08:19 -0800 Subject: [PATCH 0780/1053] python3-compatible argument unpacking in MPC/LQR example --- benchmarks/control.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/benchmarks/control.py b/benchmarks/control.py index 09ce399a2452..db83d29fa96a 100644 --- a/benchmarks/control.py +++ b/benchmarks/control.py @@ -114,8 +114,9 @@ def lqr_solve(spec): K = np.zeros((T, control_dim, state_dim)) k = np.zeros((T, control_dim)) - def rev_loop(t_, (spec, P, p, K, k)): + def rev_loop(t_, state): t = T - t_ - 1 + spec, P, p, K, k = state Q, q = spec.Q[t], spec.q[t] R, r = spec.R[t], spec.r[t] @@ -149,7 +150,8 @@ def lqr_predict(spec, x0): K, k = lqr_solve(spec) - def fwd_loop(t, (spec, X, U)): + def fwd_loop(t, state): + spec, X, U = state A, B = spec.A[t], spec.B[t] u = mv(K[t], X[t]) + k[t] x = mv(A, X[t]) + mv(B, u) @@ -170,7 +172,8 @@ def ilqr(iterations, p, x0, U): lqr_approx = make_lqr_approx(p) - def loop(_, (X, U)): + def loop(_, state): + X, U = state p_lqr = lqr_approx(X, U) dX, dU = lqr_predict(p_lqr, np.zeros_like(x0)) U = U + dU @@ -189,10 +192,11 @@ def zero_padded_controls_window(U, t): U_pad = np.vstack((U, np.zeros(U.shape))) return lax.dynamic_slice_in_dim(U_pad, t, T, axis=0) - def loop(t, (X, U)): + def loop(t, state): cost = lambda t_, x, u: p.cost(t + t_, x, u) dyns = lambda t_, x, u: p.dynamics(t + t_, x, u) + X, U = state p_ = ControlSpec(cost, dyns, T, p.state_dim, p.control_dim) xt = X[t] U_rem = zero_padded_controls_window(U, t) From e8a41eb1f839a5ea29165eb8f9874986a2cdd537 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 18 Feb 2020 18:09:10 -0800 Subject: [PATCH 0781/1053] guarded looping via lax.scan in MPC/LQR example --- benchmarks/control.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/benchmarks/control.py b/benchmarks/control.py index db83d29fa96a..00b73fe98e2b 100644 --- a/benchmarks/control.py +++ b/benchmarks/control.py @@ -68,6 +68,23 @@ def mv(mat, vec): return dot(mat, vec) +LOOP_VIA_SCAN = False + + +def fori_loop(lo, hi, loop, init): + if LOOP_VIA_SCAN: + return scan_fori_loop(lo, hi, loop, init) + else: + return lax.fori_loop(lo, hi, loop, init) + + +def scan_fori_loop(lo, hi, loop, init): + def scan_f(x, t): + return loop(t, x), () + x, _ = lax.scan(scan_f, init, np.arange(lo, hi)) + return x + + def trajectory(dynamics, U, x0): '''Unrolls `X[t+1] = dynamics(t, X[t], U[t])`, where `X[0] = x0`.''' T, _ = U.shape @@ -81,7 +98,7 @@ def loop(t, X): X = jo.index_update(X, jo.index[t + 1], x) return X - return lax.fori_loop(0, T, loop, X) + return fori_loop(0, T, loop, X) def make_lqr_approx(p): @@ -137,7 +154,7 @@ def rev_loop(t_, state): k = jo.index_update(k, jo.index[t], k_) return spec, P_, p_, K, k - _, P, p, K, k = lax.fori_loop( + _, P, p, K, k = fori_loop( 0, T, rev_loop, (spec, spec.Q[T + 1], spec.q[T + 1], K, k)) @@ -162,7 +179,7 @@ def fwd_loop(t, state): U = np.zeros((T, control_dim)) X = np.zeros((T + 1, state_dim)) X = jo.index_update(X, jo.index[0], x0) - _, X, U = lax.fori_loop(0, T, fwd_loop, (spec, X, U)) + _, X, U = fori_loop(0, T, fwd_loop, (spec, X, U)) return X, U @@ -181,7 +198,7 @@ def loop(_, state): return X, U X = trajectory(p.dynamics, U, x0) - return lax.fori_loop(0, iterations, loop, (X, U)) + return fori_loop(0, iterations, loop, (X, U)) def mpc_predict(solver, p, x0, U): @@ -209,4 +226,4 @@ def loop(t, state): X = np.zeros((T + 1, p.state_dim)) X = jo.index_update(X, jo.index[0], x0) - return lax.fori_loop(0, T, loop, (X, U)) + return fori_loop(0, T, loop, (X, U)) From f1af9893a46fce9de899bf8b7cd76f99509702b0 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 18 Feb 2020 18:14:46 -0800 Subject: [PATCH 0782/1053] move MPC/LQR example to examples directory --- benchmarks/__init__.py | 13 ------------- {benchmarks => examples}/control.py | 2 +- .../benchmarks_test.py => examples/control_test.py | 4 ++-- 3 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 benchmarks/__init__.py rename {benchmarks => examples}/control.py (99%) rename benchmarks/benchmarks_test.py => examples/control_test.py (99%) diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py deleted file mode 100644 index 086a24e64eb4..000000000000 --- a/benchmarks/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/benchmarks/control.py b/examples/control.py similarity index 99% rename from benchmarks/control.py rename to examples/control.py index 00b73fe98e2b..e053e02fa782 100644 --- a/benchmarks/control.py +++ b/examples/control.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. """ -Benchmarks for model-predictive linear control +Model-predictive non-linear control example. """ from __future__ import absolute_import diff --git a/benchmarks/benchmarks_test.py b/examples/control_test.py similarity index 99% rename from benchmarks/benchmarks_test.py rename to examples/control_test.py index 2dabe2ed1811..455edca0da86 100644 --- a/benchmarks/benchmarks_test.py +++ b/examples/control_test.py @@ -25,7 +25,7 @@ from jax import test_util as jtu import jax.numpy as np -from benchmarks import control +from examples import control from jax.config import config config.parse_flags_with_absl() @@ -70,7 +70,7 @@ def dynamics(t, x, u): return control.ControlSpec(cost, dynamics, T, dim, dim) -class ControlBenchmarkTest(jtu.JaxTestCase): +class ControlExampleTest(jtu.JaxTestCase): def testTrajectoryCyclicIntegerCounter(self): num_states = 3 From cfb5666ac1ac9889625ddc10d02ed64914a883e7 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 19 Feb 2020 14:58:26 -0800 Subject: [PATCH 0783/1053] Update WORKSPACE to setup upstream dependencies. (#2267) This is necessary as of https://github.com/tensorflow/tensorflow/commit/f396035891b0938364ea247a7dd243a147930c6e. Many thanks to @lezh for this fix! --- WORKSPACE | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/WORKSPACE b/WORKSPACE index 83a28b59f3d2..94b3e3eb7d23 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -49,3 +49,27 @@ tf_workspace( ) tf_bind() + +# Required for TensorFlow dependency on @com_github_grpc_grpc + +load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps") + +grpc_deps() + +load( + "@build_bazel_rules_apple//apple:repositories.bzl", + "apple_rules_dependencies", +) + +apple_rules_dependencies() + +load( + "@build_bazel_apple_support//lib:repositories.bzl", + "apple_support_dependencies", +) + +apple_support_dependencies() + +load("@upb//bazel:repository_defs.bzl", "bazel_version_repository") + +bazel_version_repository(name = "bazel_version") From f02578ea9e0a2887cbe216c85cf31840e52eb71c Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Wed, 19 Feb 2020 19:55:47 -0800 Subject: [PATCH 0784/1053] set tolerances and toggle dtype checks in MPC/LQR example tests --- examples/control_test.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/examples/control_test.py b/examples/control_test.py index 455edca0da86..86e72db94e59 100644 --- a/examples/control_test.py +++ b/examples/control_test.py @@ -84,14 +84,14 @@ def dynamics(t, x, u): X = control.trajectory(dynamics, U, np.zeros(1)) expected = np.arange(T + 1) % num_states expected = np.reshape(expected, (T + 1, 1)) - self.assertAllClose(X, expected, check_dtypes=True) + self.assertAllClose(X, expected, check_dtypes=False) U = 2 * np.ones((T, 1)) X = control.trajectory(dynamics, U, np.zeros(1)) expected = np.cumsum(2 * np.ones(T)) % num_states expected = np.concatenate((np.zeros(1), expected)) expected = np.reshape(expected, (T + 1, 1)) - self.assertAllClose(X, expected, check_dtypes=True) + self.assertAllClose(X, expected, check_dtypes=False) def testTrajectoryTimeVarying(self): T = 6 @@ -137,7 +137,7 @@ def testLqrSolve(self): p = one_step_lqr(dim, T) K, k = control.lqr_solve(p) K_ = -np.stack(T * (np.eye(dim),)) - self.assertAllClose(K, K_, check_dtypes=True) + self.assertAllClose(K, K_, check_dtypes=True, atol=1e-6, rtol=1e-6) self.assertAllClose(k, np.zeros((T, dim)), check_dtypes=True) @@ -148,9 +148,12 @@ def testLqrPredict(self): x0 = randn(dim) X, U = control.lqr_predict(p, x0) self.assertAllClose(X[0], x0, check_dtypes=True) - self.assertAllClose(U[0], -x0, check_dtypes=True) - self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True) - self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + self.assertAllClose(U[0], -x0, check_dtypes=True, + atol=1e-6, rtol=1e-6) + self.assertAllClose(X[1:], np.zeros((T, 2)), check_dtypes=True, + atol=1e-6, rtol=1e-6) + self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True, + atol=1e-6, rtol=1e-6) def testIlqrWithLqrProblem(self): From ab327acab0303c1b6dd47c25515125ccb216a1f3 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 19 Feb 2020 21:57:04 -0800 Subject: [PATCH 0785/1053] fix unit handling in vmap of cond, fixes #2264 (#2268) --- jax/lax/lax_control_flow.py | 7 +++++-- tests/lax_control_flow_test.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index bed09a4129ea..45fa07aee6fa 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -449,8 +449,11 @@ def make_computation(name, jaxpr, op_shape): return c.Conditional(pred, true_op, true_c, false_op, false_c) def _cond_pred_bcast_select(pred, x, y): - bcast_pred = lax.broadcast_in_dim(pred, onp.shape(x), list(range(onp.ndim(pred)))) - return lax.select(bcast_pred, x, y) + if core.get_aval(x) is core.get_aval(y) is core.abstract_unit: + return x + else: + bcast_pred = lax.broadcast_in_dim(pred, onp.shape(x), list(range(onp.ndim(pred)))) + return lax.select(bcast_pred, x, y) def _cond_batching_rule(args, dims, true_jaxpr, false_jaxpr, linear): # TODO: maybe avoid moving arg axes to front if we're promoting to select? diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index fa06b1bcc18b..111baab784ba 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -820,6 +820,19 @@ def f(x): expected = f(4.) self.assertAllClose(y, expected, check_dtypes=False) + def testCondVmapGrad(self): + # https://github.com/google/jax/issues/2264 + def f_1(x): return x ** 2 + def f_2(x): return x ** 3 + + def f(x): return lax.cond(x > 0, x, f_1, x, f_2) + def g(x): return np.where(x > 0, f_1(x), f_2(x)) + + x = np.linspace(-1, 1, 20) + ans = api.vmap(api.grad(f))(x) + expected = api.vmap(api.grad(g))(x) + self.assertAllClose(ans, expected, check_dtypes=False) + def testIssue1263(self): def f(rng, x): cond = random.bernoulli(rng) From b995787cc35b4bcb70680a45bc4443fb2e38cb87 Mon Sep 17 00:00:00 2001 From: David Alexander Date: Wed, 19 Feb 2020 22:33:42 -0800 Subject: [PATCH 0786/1053] Add "edge" support for pad (#2265) * Internal refactoring of jax.numpy.pad for greater readability. * Implement "edge" mode for pad * Remove unneeded comment per discussion --- jax/numpy/lax_numpy.py | 147 +++++++++++++++++++++++++--------------- tests/lax_numpy_test.py | 1 + 2 files changed, 95 insertions(+), 53 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index d3e51af38f50..e3aca2360c7b 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1570,6 +1570,91 @@ def _check_no_padding(axis_padding, mode): raise ValueError(msg.format(mode)) +def _pad_constant(array, pad_width, constant_values): + nd = ndim(array) + constant_values = broadcast_to(asarray(constant_values), (nd, 2)) + constant_values = lax.convert_element_type(constant_values, array.dtype) + for i in range(nd): + widths = [(0, 0, 0)] * nd + widths[i] = (pad_width[i, 0], 0, 0) + array = lax.pad(array, constant_values[i, 0], widths) + widths[i] = (0, pad_width[i, 1], 0) + array = lax.pad(array, constant_values[i, 1], widths) + return array + + +def _pad_wrap(array, pad_width): + for i in range(ndim(array)): + if array.shape[i] == 0: + _check_no_padding(pad_width[i], "wrap") + continue + size = array.shape[i] + repeats, (left_remainder, right_remainder) = _divmod(pad_width[i], size) + total_repeats = repeats.sum() + 1 + parts = [] + if left_remainder: + parts += [lax.slice_in_dim(array, size - left_remainder, size, axis=i)] + parts += total_repeats * [array] + if right_remainder: + parts += [lax.slice_in_dim(array, 0, right_remainder, axis=i)] + array = lax.concatenate(parts, dimension=i) + return array + + +def _pad_symmetric_or_reflect(array, pad_width, mode): + assert mode in ("symmetric", "reflect") + + for i in range(ndim(array)): + if array.shape[i] == 0: + _check_no_padding(pad_width[i], mode) + continue + + n = array.shape[i] + rarray = lax.rev(array, dimensions=(i,)) + offset = 1 if (mode == "reflect" and n > 1) else 0 + + def build_padding(padding, forward): + xs = [] + delta = n - offset + while padding > delta: + padding -= delta + p = array if forward else rarray + xs.append(lax.slice_in_dim(p, offset, n, axis=i)) + forward = not forward + if padding > 0: + x = lax.slice_in_dim(array if forward else rarray, offset, + padding + offset, axis=i) + xs.append(x) + return xs + + parts = reversed(build_padding(pad_width[i, 0], forward=True)) + parts = [lax.rev(x, dimensions=(i,)) for x in parts] + parts += [array] + parts += build_padding(pad_width[i, 1], forward=False) + array = lax.concatenate(parts, dimension=i) + return array + + +def _pad_edge(array, pad_width): + nd = ndim(array) + for i in range(nd): + if array.shape[i] == 0: + _check_no_padding(pad_width[i], mode) + continue + + n = array.shape[i] + npad_before, npad_after = pad_width[i] + + edge_before = lax.slice_in_dim(array, 0, 1, axis=i) + pad_before = repeat(edge_before, npad_before, axis=i) + + edge_after = lax.slice_in_dim(array, n-1, n, axis=i) + pad_after = repeat(edge_after, npad_after, axis=i) + + array = lax.concatenate([pad_before, array, pad_after], dimension=i) + return array + + @partial(jit, static_argnums=(1, 2)) def _pad(array, pad_width, mode, constant_values): array = asarray(array) @@ -1579,61 +1664,17 @@ def _pad(array, pad_width, mode, constant_values): raise ValueError("index can't contain negative values") if mode == "constant": - constant_values = broadcast_to(asarray(constant_values), (nd, 2)) - constant_values = lax.convert_element_type(constant_values, array.dtype) - for i in range(nd): - widths = [(0, 0, 0)] * nd - widths[i] = (pad_width[i, 0], 0, 0) - array = lax.pad(array, constant_values[i, 0], widths) - widths[i] = (0, pad_width[i, 1], 0) - array = lax.pad(array, constant_values[i, 1], widths) - return array + return _pad_constant(array, pad_width, constant_values) + elif mode == "wrap": - for i in range(nd): - if array.shape[i] == 0: - _check_no_padding(pad_width[i], mode) - continue - size = array.shape[i] - repeats, (left_remainder, right_remainder) = _divmod(pad_width[i], size) - total_repeats = repeats.sum() + 1 - parts = [] - if left_remainder: - parts += [lax.slice_in_dim(array, size - left_remainder, size, axis=i)] - parts += total_repeats * [array] - if right_remainder: - parts += [lax.slice_in_dim(array, 0, right_remainder, axis=i)] - array = lax.concatenate(parts, dimension=i) - return array + return _pad_wrap(array, pad_width) + elif mode in ("symmetric", "reflect"): - for i in range(nd): - if array.shape[i] == 0: - _check_no_padding(pad_width[i], mode) - continue - - n = array.shape[i] - rarray = lax.rev(array, dimensions=(i,)) - offset = 1 if (mode == "reflect" and n > 1) else 0 - - def build_padding(padding, forward): - xs = [] - delta = n - offset - while padding > delta: - padding -= delta - p = array if forward else rarray - xs.append(lax.slice_in_dim(p, offset, n, axis=i)) - forward = not forward - if padding > 0: - x = lax.slice_in_dim(array if forward else rarray, offset, - padding + offset, axis=i) - xs.append(x) - return xs - - parts = reversed(build_padding(pad_width[i, 0], forward=True)) - parts = [lax.rev(x, dimensions=(i,)) for x in parts] - parts += [array] - parts += build_padding(pad_width[i, 1], forward=False) - array = lax.concatenate(parts, dimension=i) - return array + return _pad_symmetric_or_reflect(array, pad_width, mode) + + elif mode == "edge": + return _pad_edge(array, pad_width) + else: msg = "Unimplemented padding mode '{}' for np.pad." raise NotImplementedError(msg.format(mode)) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 614131557f4a..b274cbff96c7 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -921,6 +921,7 @@ def testOperatorRound(self): ('symmetric', None, nonempty_shapes), ('reflect', None, nonempty_shapes), ('wrap', None, nonempty_shapes), + ('edge', None, nonempty_shapes), ] for shape, dtype in _shape_and_dtypes(shapes, all_dtypes) for pad_width_rank in range(3))) From 4978e3c285bbf052364b499c6ca9386ecae47629 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 20 Feb 2020 09:41:08 +0100 Subject: [PATCH 0787/1053] Disable linalg_test:testMatrix power on TPU (#2269) Due to internal test failures (b/149870255) --- tests/linalg_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 65ae83388e76..0551cd6a320b 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -721,6 +721,7 @@ def testPinv(self, shape, dtype, rng_factory): for dtype in float_types + complex_types for n in [-5, -2, -1, 0, 1, 2, 3, 4, 5, 10] for rng_factory in [jtu.rand_default])) + @jtu.skip_on_devices("tpu") # TODO(b/149870255): Bug in XLA:TPU?. def testMatrixPower(self, shape, dtype, n, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) From 6e4ea4f70ddb4cf98660aa30ddc713322eab869f Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 20 Feb 2020 13:43:53 +0100 Subject: [PATCH 0788/1053] Revert "add np.copy method to abstract arrays (#2257)" (#2272) This reverts commit ae1214de74e9ec42da8ff813dab8577c6bd9231d. This is only to test the internal pre-submits. --- jax/api.py | 3 ++- jax/numpy/lax_numpy.py | 7 +------ tests/api_test.py | 3 --- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/jax/api.py b/jax/api.py index a9c144c5e038..7ef5dff07ca1 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1383,10 +1383,11 @@ def device_put(x, device=None): return tree_map(lambda y: xla.device_put_p.bind(y, device=device), x) +# TODO(mattjj): consider revising def _device_get(x): if isinstance(x, core.Tracer): return x - return onp.asarray(x) + return x.copy() def device_get(x): for y in tree_leaves(x): diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e3aca2360c7b..9e3213d71e04 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1857,10 +1857,6 @@ def asarray(a, dtype=None, order=None): lax._check_user_dtype_supported(dtype, "asarray") return array(a, dtype=dtype, copy=False, order=order) -@_wraps(onp.copy) -def copy(a, order='K'): - return array(a, copy=True, order=order) - @_wraps(onp.zeros_like) def zeros_like(x, dtype=None): @@ -3481,8 +3477,7 @@ def _operator_round(number, ndigits=None): _diff_methods = ["clip", "compress", "conj", "conjugate", "cumprod", "cumsum", "diagonal", "dot", "max", "mean", "min", "prod", "ptp", "ravel", "repeat", "sort", "squeeze", "std", "sum", - "swapaxes", "take", "tile", "trace", "transpose", "var", - "copy"] + "swapaxes", "take", "tile", "trace", "transpose", "var"] # Set up operator, method, and property forwarding on Tracer instances containing diff --git a/tests/api_test.py b/tests/api_test.py index 33360781c7f1..98c505f1560d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1826,9 +1826,6 @@ def func1(x): re.DOTALL)): api.jit(func1)(2.) - def test_array_tracer_copy(self): - api.value_and_grad(lambda x: x.copy().sum())(np.ones(2)) # doesn't crash - class JaxprTest(jtu.JaxTestCase): From 0a78c8c3015b7a628b3f5e157e4d952e58d55aef Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 20 Feb 2020 09:09:32 -0800 Subject: [PATCH 0789/1053] Update WORKSPACE to pick up TF grpc upgrade and cleanup. --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 94b3e3eb7d23..7c289d3aa70a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "c0b31150dfdc9495e2a953024bd86dea7c6f786f655ac2ebbbb04ae0029962b2", - strip_prefix = "tensorflow-c25692039b954bb5aa891a26ff1744aab137eee7", + sha256 = "adfcf173f5e5f9af0d8a6f14a7b80c7997be320c57c1d59cadbcbf0949096a56", + strip_prefix = "tensorflow-446566f97c01c12116bafde8de9631fe8e029ab9", urls = [ - "https://github.com/tensorflow/tensorflow/archive/c25692039b954bb5aa891a26ff1744aab137eee7.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/446566f97c01c12116bafde8de9631fe8e029ab9.tar.gz", ], ) From 9cb8171fa726a517096035dbc96222f4627f1312 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Thu, 20 Feb 2020 11:07:06 -0800 Subject: [PATCH 0790/1053] remove unused imports in MPC/LQR example --- examples/control.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/control.py b/examples/control.py index e053e02fa782..74df5864e252 100644 --- a/examples/control.py +++ b/examples/control.py @@ -21,11 +21,9 @@ import collections -import jax -from jax import lax +from jax import lax, grad, jacfwd, jacobian, vmap import jax.numpy as np import jax.ops as jo -from jax import grad, hessian, jacfwd, jacobian, jacrev, vmap # Specifies a general finite-horizon, time-varying control problem. Given cost From 218a1711d2f0d8624f606a2e259f9e8d1a0fc374 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Thu, 20 Feb 2020 16:10:09 -0800 Subject: [PATCH 0791/1053] Add a jit around lax_linalg.lu_pivots_to_permutation (#2277) I think this is almost always called inside a jit already, but adding this results in more interprettable JAXprs. --- jax/lax_linalg.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 54f0f0962a41..a9e8dc84e3d2 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -641,6 +641,8 @@ def _lu_pivots_body_fn(i, permutation_and_swaps): permutation = ops.index_update(permutation, ops.index[..., i], y) return ops.index_update(permutation, ops.index[iotas + (j,)], x), swaps + +@partial(api.jit, static_argnums=(1,)) def lu_pivots_to_permutation(swaps, m): """Converts the pivots (row swaps) returned by LU to a permutation. From 8372a70079698f3d602a1c52d5123d390da2010b Mon Sep 17 00:00:00 2001 From: brett koonce Date: Thu, 20 Feb 2020 18:44:21 -0600 Subject: [PATCH 0792/1053] tweak readme pmap imports (#2276) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 617847d0d282..132401363919 100644 --- a/README.md +++ b/README.md @@ -272,7 +272,8 @@ replicated and executed in parallel accross devices. Here's an example on an 8-GPU machine: ```python -from jax import random +from jax import random, pmap +import jax.numpy as np # Create 8 random 5000 x 6000 matrices, one per GPU keys = random.split(random.PRNGKey(0), 8) From af0967fdbf1960d4f830c888103aa8624479c23d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 20 Feb 2020 17:15:25 -0800 Subject: [PATCH 0793/1053] Add an experimental lax.top_k operator. (#2280) --- jax/lax/lax.py | 19 ++++++++++++++++++- tests/lax_test.py | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index b05609ff6de9..93271779a71d 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1036,6 +1036,11 @@ def sort_key_val(keys, values, dimension=-1): sorted_keys, sorted_values = result return sorted_keys, sorted_values +def top_k(operand, k): + k = int(k) + if k < 0: + raise ValueError("k argument to top_k must be nonnegative, got {}".format(k)) + return top_k_p.bind(operand, k=k) def tie_in(x, y): return tie_in_p.bind(x, y) @@ -4034,7 +4039,6 @@ def _sort_batch_rule(batched_args, batch_dims, dimension): ad.defjvp(sort_p, _sort_jvp_rule) batching.primitive_batchers[sort_p] = _sort_batch_rule - def _sort_key_val_abstract_eval(keys, values, dimension): return raise_to_shaped(keys), raise_to_shaped(values) @@ -4106,6 +4110,19 @@ def _sort_key_val_batch_rule(batched_args, batch_dims, dimension): batching.primitive_batchers[sort_key_val_p] = _sort_key_val_batch_rule +def _top_k_abstract_eval(operand, k): + if len(operand.shape) == 0: + raise TypeError("top_k operand must have >= 1 dimension, got {}" + .format(operand.shape)) + return raise_to_shaped(operand), ShapedArray(operand.shape, onp.int32) + +top_k_p = Primitive('top_k') +top_k_p.multiple_results = True +top_k_p.def_impl(partial(xla.apply_primitive, top_k_p)) +top_k_p.def_abstract_eval(_top_k_abstract_eval) +xla.translations[top_k_p] = partial(standard_translate, 'top_k') + + def _tie_in_transpose_rule(t): return [ad_util.zero, t] diff --git a/tests/lax_test.py b/tests/lax_test.py index 920d02a33e88..b9259f9ed57d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -18,6 +18,7 @@ from functools import partial import itertools from typing import Optional, cast +import unittest from unittest import skip, SkipTest from absl.testing import absltest @@ -1319,6 +1320,29 @@ def args_maker(): numpy_op = lambda ks, vs: lax_reference.sort_key_val(ks, vs, axis) self._CheckAgainstNumpy(op, numpy_op, args_maker) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_shape={}_k={}".format( + jtu.format_shape_dtype_string(shape, dtype), k), + "rng_factory": rng_factory, "shape": shape, "dtype": dtype, "k": k} + for dtype in [onp.float32, onp.int32, onp.uint32] + for shape in [(3,), (5, 3)] + for k in [1, 3] + for rng_factory in [jtu.rand_default])) + @unittest.skipIf(jax.lib.version <= (0, 1, 40), "Test requires jaxlib 0.1.40") + def testTopK(self, shape, dtype, k, rng_factory): + rng = rng_factory() + perm_rng = onp.random.RandomState(0) + def args_maker(): + flat_values = onp.arange(onp.prod(shape, dtype=int), dtype=dtype) + values = perm_rng.permutation(flat_values).reshape(shape) + return [values] + def reference_top_k(x): + bcast_idxs = onp.broadcast_to(onp.arange(shape[-1]), shape) + sorted_vals, sorted_idxs = lax_reference.sort_key_val(x, bcast_idxs) + return sorted_vals[..., :-k-1:-1], sorted_idxs[..., :-k-1:-1] + op = lambda vs: lax.top_k(vs, k=k) + self._CheckAgainstNumpy(op, reference_top_k, args_maker) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_lhs_shape={}_rhs_shape={}" .format(jtu.format_shape_dtype_string(lhs_shape, dtype), From 8c3e3b2dae0e4e9b7f6064499317349da3e57a70 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 21 Feb 2020 14:34:23 -0800 Subject: [PATCH 0794/1053] Always jit scipy.ndimage.map_coordinates (#2286) Fixes GH2282 --- jax/scipy/ndimage.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/jax/scipy/ndimage.py b/jax/scipy/ndimage.py index a2ff0203eb0f..733253c3b053 100644 --- a/jax/scipy/ndimage.py +++ b/jax/scipy/ndimage.py @@ -20,6 +20,7 @@ import scipy.ndimage +from .. import api from ..numpy import lax_numpy as np from ..numpy.lax_numpy import _wraps from ..util import safe_zip as zip @@ -52,17 +53,8 @@ def _linear_indices_and_weights(coordinate): return [(l_index, l_weight), (u_index, u_weight)] -@_wraps(scipy.ndimage.map_coordinates, lax_description=textwrap.dedent("""\ - Only linear interpolation (``order=1``) and modes ``'constant'``, - ``'nearest'`` and ``'wrap'`` are currently supported. Note that - interpolation near boundaries differs from the scipy function, because we - fixed an outstanding bug (https://github.com/scipy/scipy/issues/2640); - this function interprets the ``mode`` argument as documented by SciPy, but - not as implemented by SciPy. - """)) -def map_coordinates( - input, coordinates, order, mode='constant', cval=0.0, -): +@functools.partial(api.jit, static_argnums=(2, 3, 4)) +def _map_coordinates(input, coordinates, order, mode, cval): input = np.asarray(input) coordinates = [np.asarray(c, input.dtype) for c in coordinates] cval = np.asarray(cval, input.dtype) @@ -111,3 +103,17 @@ def map_coordinates( outputs.append(_nonempty_prod(weights) * contribution) result = _nonempty_sum(outputs) return result + + +@_wraps(scipy.ndimage.map_coordinates, lax_description=textwrap.dedent("""\ + Only linear interpolation (``order=1``) and modes ``'constant'``, + ``'nearest'`` and ``'wrap'`` are currently supported. Note that + interpolation near boundaries differs from the scipy function, because we + fixed an outstanding bug (https://github.com/scipy/scipy/issues/2640); + this function interprets the ``mode`` argument as documented by SciPy, but + not as implemented by SciPy. + """)) +def map_coordinates( + input, coordinates, order, mode='constant', cval=0.0, +): + return _map_coordinates(input, coordinates, order, mode, cval) From 80abdf0c5307f4b917c281428009e32c66f9f1a9 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 22 Feb 2020 09:45:24 -0800 Subject: [PATCH 0795/1053] Unbreak build and update XLA. (#2289) * raise minimum Bazel version to 2.0.0 to match TensorFlow. * set --experimental_repo_remote_exec since it is required by the TF build. * bump TF/XLA version. * use the --config=short_logs trick from TF to suppress build warnings. --- WORKSPACE | 6 +++--- build/build.py | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c289d3aa70a..1651a651213c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "adfcf173f5e5f9af0d8a6f14a7b80c7997be320c57c1d59cadbcbf0949096a56", - strip_prefix = "tensorflow-446566f97c01c12116bafde8de9631fe8e029ab9", + sha256 = "c1f4c6dddb07f3af6d7b20e8e4337a4d3dbc6baab49d84e96d71614f691e211f", + strip_prefix = "tensorflow-7f065c74b6583d1f0674a5e0ef23d0b4d80671ab", urls = [ - "https://github.com/tensorflow/tensorflow/archive/446566f97c01c12116bafde8de9631fe8e029ab9.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/7f065c74b6583d1f0674a5e0ef23d0b4d80671ab.tar.gz", ], ) diff --git a/build/build.py b/build/build.py index 02597ddbcfdb..1d225e525c8b 100755 --- a/build/build.py +++ b/build/build.py @@ -71,19 +71,19 @@ def check_python_version(python_version): # Bazel -BAZEL_BASE_URI = "https://github.com/bazelbuild/bazel/releases/download/1.2.1/" +BAZEL_BASE_URI = "https://github.com/bazelbuild/bazel/releases/download/2.0.0/" BazelPackage = collections.namedtuple("BazelPackage", ["file", "sha256"]) bazel_packages = { "Linux": BazelPackage( - file="bazel-1.2.1-linux-x86_64", + file="bazel-2.0.0-linux-x86_64", sha256= - "f5e21d7448419d1596ad0c5bb71fb336a0af08c832587aec394970ea56701d88"), + "4df79462c6c3ecdeeee7af99fc269b52ab1aa4828ef3bc359c1837d3fafeeee7"), "Darwin": BazelPackage( - file="bazel-1.2.1-darwin-x86_64", + file="bazel-2.0.0-darwin-x86_64", sha256= - "6729be5a56e6eadf7a9112afd2d87ce348da8fca22077b882d9bb7a6f5d41d1c"), + "3eca4c96cfda97a9d5f8d3d0dec4155a5cc5ff339b10d3f35213c398bf13881e"), } @@ -175,6 +175,9 @@ def check_bazel_version(bazel_path, min_version, max_version): BAZELRC_TEMPLATE = """ +# Flag to enable remote config +common --experimental_repo_remote_exec + build --repo_env PYTHON_BIN_PATH="{python_bin_path}" build --python_path="{python_bin_path}" build --repo_env TF_NEED_CUDA="{tf_need_cuda}" @@ -208,6 +211,9 @@ def check_bazel_version(bazel_path, min_version, max_version): build --cxxopt=-std=c++14 build --host_cxxopt=-std=c++14 + +# Suppress all warning messages. +build:short_logs --output_filter=DONT_MATCH_ANYTHING """ @@ -318,7 +324,7 @@ def main(): # Find a working Bazel. bazel_path = get_bazel_path(args.bazel_path) - check_bazel_version(bazel_path, min_version="1.2.1", max_version=None) + check_bazel_version(bazel_path, min_version="2.0.0", max_version=None) print("Bazel binary path: {}".format(bazel_path)) python_bin_path = get_python_bin_path(args.python_bin_path) @@ -346,6 +352,7 @@ def main(): print("\nBuilding XLA and installing it in the jaxlib source tree...") config_args = args.bazel_options + config_args += ["--config=short_logs"] if args.enable_march_native: config_args += ["--config=opt"] if args.enable_mkl_dnn: From 7885b1d03482490d1ebb75587b38106b10037dfa Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Sat, 22 Feb 2020 23:04:34 -0800 Subject: [PATCH 0796/1053] Add nested pmap image to demo notebook. (#2292) --- cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb | 12 +++++++++++- cloud_tpu_colabs/images/nested_pmap.png | Bin 0 -> 23866 bytes 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 cloud_tpu_colabs/images/nested_pmap.png diff --git a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb index 403b0bb25b26..31cd28ebabc8 100644 --- a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb +++ b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb @@ -876,6 +876,16 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "metadata": { + "id": "f-FBsWeo1AXE", + "colab_type": "text" + }, + "source": [ + "![nested pmap example](https://raw.githubusercontent.com/google/jax/master/cloud_tpu_colabs/images/nested_pmap.png)" + ] + }, { "cell_type": "markdown", "metadata": { @@ -1001,4 +1011,4 @@ "outputs": [] } ] -} \ No newline at end of file +} diff --git a/cloud_tpu_colabs/images/nested_pmap.png b/cloud_tpu_colabs/images/nested_pmap.png new file mode 100644 index 0000000000000000000000000000000000000000..8567e8d57f6aa663f83e6af47767bfea10e8c890 GIT binary patch literal 23866 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≥Qmf$V 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 literal 0 HcmV?d00001 From f6d483739a4b02636301206f77bfefbcc35cd6d5 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Sat, 22 Feb 2020 23:10:13 -0800 Subject: [PATCH 0797/1053] Shrink nested pmap image in demo notebook. (#2293) --- cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb index 31cd28ebabc8..790c37fa9e83 100644 --- a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb +++ b/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb @@ -883,7 +883,7 @@ "colab_type": "text" }, "source": [ - "![nested pmap example](https://raw.githubusercontent.com/google/jax/master/cloud_tpu_colabs/images/nested_pmap.png)" + "" ] }, { From 48f2a414533a3efea05575c5057f53c7590444e1 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 23 Feb 2020 10:10:39 -0800 Subject: [PATCH 0798/1053] Minor fixes to docs related to jax.numpy.vectorize (#2278) - Show `numpy.jax.vectorize` explicitly in the JAX docs, rather than the original `numpy.vectorize. - Updated regex for identifying function signatures in NumPy. This now correctly parses `np.vectorize` and `np.einsum`. - Removed docs for `jax.experimental.vectorize`. There's still some good narrative content in the docstring but it should go somewhere else. --- docs/jax.experimental.rst | 1 - docs/jax.experimental.vectorize.rst | 6 ------ docs/jax.rst | 2 +- jax/numpy/lax_numpy.py | 2 +- 4 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 docs/jax.experimental.vectorize.rst diff --git a/docs/jax.experimental.rst b/docs/jax.experimental.rst index 5ccc7ddeb683..be269ef852cc 100644 --- a/docs/jax.experimental.rst +++ b/docs/jax.experimental.rst @@ -7,6 +7,5 @@ jax.experimental package jax.experimental.loops jax.experimental.optimizers jax.experimental.stax - jax.experimental.vectorize .. automodule:: jax.experimental diff --git a/docs/jax.experimental.vectorize.rst b/docs/jax.experimental.vectorize.rst deleted file mode 100644 index 58c1a3d68115..000000000000 --- a/docs/jax.experimental.vectorize.rst +++ /dev/null @@ -1,6 +0,0 @@ -jax.experimental.vectorize module -================================= - -.. automodule:: jax.experimental.vectorize - :members: - :show-inheritance: diff --git a/docs/jax.rst b/docs/jax.rst index d888d2253f0d..ff2359a7edb3 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -51,7 +51,7 @@ Vectorization (:code:`vmap`) ---------------------------- .. autofunction:: vmap -.. autofunction:: numpy.vectorize +.. autofunction:: jax.numpy.vectorize Parallelization (:code:`pmap`) ------------------------------ diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 9e3213d71e04..ce5aa4ace3d9 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -303,7 +303,7 @@ def update_numpydoc(docstr, fun, op): parameters = '\n'.join(param_list).replace('@@', '\n ') return docstr[:begin_idx + 1] + parameters + docstr[end_idx - 2:] -_numpy_signature_re = re.compile(r'^([\w., ]+=)?\s*[\w\.]+\(.*\)$') +_numpy_signature_re = re.compile(r'^([\w., ]+=)?\s*[\w\.]+\([\w\W]*\)$') def _wraps(fun, update_doc=True, lax_description=""): """Like functools.wraps but works with numpy.ufuncs. From 89514f9278fb3705ca5ecab2fb4656a285ad2da4 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 23 Feb 2020 19:18:06 +0100 Subject: [PATCH 0799/1053] Moved CHANGELOG to docs (#2252) * Moved CHANGELOG to docs This puts the documentation also on RTD, with TOC. Also changed its format to .rst, for consistency. Added GitHub links to the change log. * Actually add the CHANGELOG.rst * Added reminder comments to the CHANGELOG.rst --- CHANGELOG.md | 75 +------------------------------------- README.md | 3 +- docs/CHANGELOG.rst | 91 ++++++++++++++++++++++++++++++++++++++++++++++ docs/index.rst | 1 + 4 files changed, 96 insertions(+), 74 deletions(-) create mode 100644 docs/CHANGELOG.rst diff --git a/CHANGELOG.md b/CHANGELOG.md index 8091ac03a545..ac24553bbc7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,74 +1,3 @@ -# Changelog +# Change Log -These are the release notes for JAX. - -## jax 0.1.60 (unreleased) - -### New features - -* `pmap` has `static_broadcast_argnums` argument which allows the user to - specify arguments that should be treated as compile-time constants and - should be broadcasted to all devices. It works analogously to - `static_argnums` in `jit`. - -## jax 0.1.59 (February 11, 2020) - -### Breaking changes - -* The minimum jaxlib version is now 0.1.38. -* Simplified `Jaxpr` by removing the `Jaxpr.freevars` and - `Jaxpr.bound_subjaxprs`. The call primitives (`xla_call`, `xla_pmap`, - `sharded_call`, and `remat_call`) get a new parameter `call_jaxpr` with a - fully-closed (no `constvars`) JAXPR. - -### New features - -* Reverse-mode automatic differentiation (e.g. `grad`) of `lax.cond`, making it - now differentiable in both modes (https://github.com/google/jax/pull/2091) -* JAX now supports DLPack, which allows sharing CPU and GPU arrays in a - zero-copy way with other libraries, such as PyTorch. -* JAX GPU DeviceArrays now support `__cuda_array_interface__`, which is another - zero-copy protocol for sharing GPU arrays with other libraries such as CuPy - and Numba. -* JAX CPU device buffers now implement the Python buffer protocol, which allows - zero-copy buffer sharing between JAX and NumPy. -* Added JAX_SKIP_SLOW_TESTS environment variable to skip tests known as slow. - -## jaxlib 0.1.38 (January 29, 2020) - -* CUDA 9.0 is no longer supported. -* CUDA 10.2 wheels are now built by default. - -## jax 0.1.58 (January 28, 2020) - -### Breaking changes - -* JAX has dropped Python 2 support, because Python 2 reached its end of life on - January 1, 2020. Please update to Python 3.5 or newer. - -### New features - -* Forward-mode automatic differentiation (`jvp`) of while loop - (https://github.com/google/jax/pull/1980) -* New NumPy and SciPy functions: - * `jax.numpy.fft.fft2` - * `jax.numpy.fft.ifft2` - * `jax.numpy.fft.rfft` - * `jax.numpy.fft.irfft` - * `jax.numpy.fft.rfft2` - * `jax.numpy.fft.irfft2` - * `jax.numpy.fft.rfftn` - * `jax.numpy.fft.irfftn` - * `jax.numpy.fft.fftfreq` - * `jax.numpy.fft.rfftfreq` - * `jax.numpy.linalg.matrix_rank` - * `jax.numpy.linalg.matrix_power` - * `jax.scipy.special.betainc` -* Batched Cholesky decomposition on GPU now uses a more efficient batched - kernel. - - -### Notable bug fixes - -* With the Python 3 upgrade, JAX no longer depends on `fastcache`, which should - help with installation. +See [docs/CHANGELOG.rst](https://jax.readthedocs.io/en/latest/CHANGELOG.html). \ No newline at end of file diff --git a/README.md b/README.md index 132401363919..4670b9dcd3ca 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,10 @@ [**Quickstart**](#quickstart-colab-in-the-cloud) | [**Transformations**](#transformations) | [**Install guide**](#installation) +| [**Change logs**](https://jax.readthedocs.io/en/latest/CHANGELOG.html) | [**Reference docs**](https://jax.readthedocs.io/en/latest/) -**Announcement:** JAX 0.1.58 has dropped Python 2 support, and requires Python 3.5 or newer. See [CHANGELOG.md](https://github.com/google/jax/blob/master/CHANGELOG.md). +**Announcement:** JAX 0.1.58 has dropped Python 2 support, and requires Python 3.5 or newer. See [docs/CHANGELOG.rst](https://jax.readthedocs.io/en/latest/CHANGELOG.html). ## What is JAX? diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst new file mode 100644 index 000000000000..6f2578b61ad5 --- /dev/null +++ b/docs/CHANGELOG.rst @@ -0,0 +1,91 @@ +Change Log +========== + +.. This is a comment. + Remember to leave an empty line before the start of an itemized list, + and to align the itemized text with the first line of an item. + +These are the release notes for JAX. + +jax 0.1.60 (unreleased) +----------------------- + +.. PLEASE REMEMBER TO CHANGE THE '..master' WITH AN ACTUAL TAG in GITHUB LINK. + +* `GitHub commits `_. +* New features: + + * :py:func:`jax.pmap` has ``static_broadcast_argnums`` argument which allows the user to + specify arguments that should be treated as compile-time constants and + should be broadcasted to all devices. It works analogously to + ``static_argnums`` in :py:func:`jax.jit`. + * Improved error messages for when tracers are mistakenly saved in global state. + * Added :py:func:`jax.nn.one_hot` utility function. + +jax 0.1.59 (February 11, 2020) +------------------------------ + +* `GitHub commits `_. +* Breaking changes + + * The minimum jaxlib version is now 0.1.38. + * Simplified :py:class:`Jaxpr` by removing the ``Jaxpr.freevars`` and + ``Jaxpr.bound_subjaxprs``. The call primitives (``xla_call``, ``xla_pmap``, + ``sharded_call``, and ``remat_call``) get a new parameter ``call_jaxpr`` with a + fully-closed (no ``constvars``) JAXPR. Also, added a new field ``call_primitive`` + to primitives. +* New features: + + * Reverse-mode automatic differentiation (e.g. ``grad``) of ``lax.cond``, making it + now differentiable in both modes (https://github.com/google/jax/pull/2091) + * JAX now supports DLPack, which allows sharing CPU and GPU arrays in a + zero-copy way with other libraries, such as PyTorch. + * JAX GPU DeviceArrays now support ``__cuda_array_interface__``, which is another + zero-copy protocol for sharing GPU arrays with other libraries such as CuPy + and Numba. + * JAX CPU device buffers now implement the Python buffer protocol, which allows + zero-copy buffer sharing between JAX and NumPy. + * Added JAX_SKIP_SLOW_TESTS environment variable to skip tests known as slow. + +jaxlib 0.1.38 (January 29, 2020) +-------------------------------- + +* CUDA 9.0 is no longer supported. +* CUDA 10.2 wheels are now built by default. + +jax 0.1.58 (January 28, 2020) +----------------------------- + +* `GitHub commits `_. +* Breaking changes + + * JAX has dropped Python 2 support, because Python 2 reached its end of life on + January 1, 2020. Please update to Python 3.5 or newer. +* New features + + * Forward-mode automatic differentiation (`jvp`) of while loop + (https://github.com/google/jax/pull/1980) + * New NumPy and SciPy functions: + + * :py:func:`jax.numpy.fft.fft2` + * :py:func:`jax.numpy.fft.ifft2` + * :py:func:`jax.numpy.fft.rfft` + * :py:func:`jax.numpy.fft.irfft` + * :py:func:`jax.numpy.fft.rfft2` + * :py:func:`jax.numpy.fft.irfft2` + * :py:func:`jax.numpy.fft.rfftn` + * :py:func:`jax.numpy.fft.irfftn` + * :py:func:`jax.numpy.fft.fftfreq` + * :py:func:`jax.numpy.fft.rfftfreq` + * :py:func:`jax.numpy.linalg.matrix_rank` + * :py:func:`jax.numpy.linalg.matrix_power` + * :py:func:`jax.scipy.special.betainc` + * Batched Cholesky decomposition on GPU now uses a more efficient batched + kernel. + + +Notable bug fixes +^^^^^^^^^^^^^^^^^ + +* With the Python 3 upgrade, JAX no longer depends on ``fastcache``, which should + help with installation. diff --git a/docs/index.rst b/docs/index.rst index 80e67b3bf446..d148479c0d23 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -34,6 +34,7 @@ For an introduction to JAX, start at the :maxdepth: 1 :caption: Notes + CHANGELOG jaxpr async_dispatch concurrency From cd5bcb3618c7d8ecc3301be005c053b2fad925b4 Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Sun, 23 Feb 2020 18:19:23 +0000 Subject: [PATCH 0800/1053] Use int32 counters in optix. (#2239) --- jax/experimental/optix.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index e9ef600fdd30..de44e4d46d09 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -226,7 +226,7 @@ def scale_by_adam(b1=0.9, b2=0.999, eps=1e-8): def init_fn(params): mu = tree_multimap(jnp.zeros_like, params) # First moment nu = tree_multimap(jnp.zeros_like, params) # Second moment - return ScaleByAdamState(count=jnp.zeros([]), mu=mu, nu=nu) + return ScaleByAdamState(count=jnp.zeros([], jnp.int32), mu=mu, nu=nu) def update_fn(updates, state): mu = _update_moment(updates, state.mu, b1, 1) @@ -278,7 +278,7 @@ def scale_by_schedule(step_size_fn): """ def init_fn(_): - return ScaleByScheduleState(count=jnp.zeros([])) + return ScaleByScheduleState(count=jnp.zeros([], jnp.int32)) def update_fn(updates, state): updates = tree_multimap(lambda g: step_size_fn(state.count) * g, updates) @@ -306,7 +306,8 @@ def add_noise(eta, gamma, seed): """ def init_fn(_): - return AddNoiseState(count=jnp.zeros([]), rng_key=jrandom.PRNGKey(seed)) + return AddNoiseState(count=jnp.zeros([], jnp.int32), + rng_key=jrandom.PRNGKey(seed)) def update_fn(updates, state): # pylint: disable=missing-docstring num_vars = len(tree_leaves(updates)) From f6e1d01f94936c992d9e63810eae5db69c06a026 Mon Sep 17 00:00:00 2001 From: joao guilherme Date: Mon, 24 Feb 2020 06:04:02 +0900 Subject: [PATCH 0801/1053] JIT differentiate -> JIT compile (#2279) --- docs/notebooks/How_JAX_primitives_work.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 27988545c9ad..246018122577 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -757,7 +757,7 @@ "colab_type": "text" }, "source": [ - "Below is another use of `jit` where we differentiate only\n", + "Below is another use of `jit` where we compile only\n", "with respect to the first argument. Notice how the second argument to `square_add_prim` is concrete, which leads\n", "in the third argument to `multiply_add_abstract_eval` being \n", "`ConcreteArray`. We see that `multiply_add_abstract_eval` may be used with\n", From 0416d2a5f2fb4bc59c22ebb60973aeede089401a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 24 Feb 2020 07:31:46 -0800 Subject: [PATCH 0802/1053] Fix abstract evaluation rule for lax.top_k. (#2290) --- jax/lax/lax.py | 11 +++++++++-- tests/lax_test.py | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 93271779a71d..8e9c286d0dd5 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4109,12 +4109,19 @@ def _sort_key_val_batch_rule(batched_args, batch_dims, dimension): ad.primitive_transposes[sort_key_val_p] = _sort_key_val_transpose_rule batching.primitive_batchers[sort_key_val_p] = _sort_key_val_batch_rule - def _top_k_abstract_eval(operand, k): + if k < 0: + raise ValueError("k argument to top_k must be nonnegative, got {}".format(k)) if len(operand.shape) == 0: raise TypeError("top_k operand must have >= 1 dimension, got {}" .format(operand.shape)) - return raise_to_shaped(operand), ShapedArray(operand.shape, onp.int32) + shape = list(operand.shape) + if shape[-1] < k: + msg = "k argument to top_k must be no larger than minor dimension; {} vs {}" + raise ValueError(msg.format(k, shape)) + shape[-1] = k + return (ShapedArray(shape, operand.dtype), + ShapedArray(shape, onp.dtype(onp.int32))) top_k_p = Primitive('top_k') top_k_p.multiple_results = True diff --git a/tests/lax_test.py b/tests/lax_test.py index b9259f9ed57d..a6ba3c7396b6 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1328,7 +1328,7 @@ def args_maker(): for shape in [(3,), (5, 3)] for k in [1, 3] for rng_factory in [jtu.rand_default])) - @unittest.skipIf(jax.lib.version <= (0, 1, 40), "Test requires jaxlib 0.1.40") + @unittest.skipIf(jax.lib.version < (0, 1, 40), "Test requires jaxlib 0.1.40") def testTopK(self, shape, dtype, k, rng_factory): rng = rng_factory() perm_rng = onp.random.RandomState(0) @@ -1342,6 +1342,7 @@ def reference_top_k(x): return sorted_vals[..., :-k-1:-1], sorted_idxs[..., :-k-1:-1] op = lambda vs: lax.top_k(vs, k=k) self._CheckAgainstNumpy(op, reference_top_k, args_maker) + self._CompileAndCheck(op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_lhs_shape={}_rhs_shape={}" From 8028e4b570679a38d0e4a9b69a658af35feed43b Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Mon, 24 Feb 2020 21:20:41 +0000 Subject: [PATCH 0803/1053] Minor dedupe xla/pxla tracing code. (#2258) --- jax/interpreters/partial_eval.py | 4 ++-- jax/interpreters/pxla.py | 10 ++++------ jax/interpreters/sharded_jit.py | 7 +------ jax/interpreters/xla.py | 7 +++---- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 5beb2c003554..cf1437c872f2 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -347,10 +347,10 @@ def partial_val_aval(pv, const): else: raise TypeError(pv) -def trace_to_jaxpr(fun, pvals, instantiate=False, stage_out_calls=False): +def trace_to_jaxpr(fun, pvals, instantiate=False, stage_out_calls=False, bottom=False): """Traces a function, given abstract inputs, to a jaxpr.""" trace_type = StagingJaxprTrace if stage_out_calls else JaxprTrace - with new_master(trace_type) as master: + with new_master(trace_type, bottom=bottom) as master: fun = trace_to_subjaxpr(fun, master, instantiate) jaxpr, (out_pvals, consts, env) = fun.call_wrapped(pvals) assert not env diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 57c557f96b20..f82c3c5d1634 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -460,12 +460,10 @@ def dynamic_fun(dummy, *args): pvals = [pe.PartialVal((aval, core.unit)) for aval in avals] # We add a dummy first invar, to carry the trace details to `dynamic_fun` pval = pe.PartialVal([core.abstract_unit, core.unit]) # dummy value for axis env - with core.new_master(pe.StagingJaxprTrace, True) as master: - jaxpr, (out_pvals, consts, env) = pe.trace_to_subjaxpr( - dynamic_fun, master, False).call_wrapped([pval] + pvals) - jaxpr.invars = jaxpr.invars[1:] # ignore dummy - assert not env - del master + jaxpr, out_pvals, consts = pe.trace_to_jaxpr( + dynamic_fun, [pval] + pvals, instantiate=False, stage_out_calls=True, bottom=True) + jaxpr.invars = jaxpr.invars[1:] # ignore dummy + out_pvs, out_consts = unzip2(out_pvals) # TODO(skye,mattjj): allow more collectives on multi-host as we test them, but diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index b4f7d275968b..955b8235dad6 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -138,12 +138,7 @@ def _sharded_callable(fun, partitions, name, *abstract_args): nrep = 1 # TODO generalize in_pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] - with core.new_master(pe.JaxprTrace, True) as master: - jaxpr, (out_pvals, consts, - env) = pe.trace_to_subjaxpr(fun, master, - False).call_wrapped(in_pvals) - assert not env # no subtraces here - del master, env + jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=False, bottom=True) if not jaxpr.eqns and all(outvar is core.unitvar for outvar in jaxpr.outvars): return lambda *_: [core.unit] * len(jaxpr.outvars) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index e95e97195af5..0410c0e2ccb1 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -460,10 +460,9 @@ def _xla_callable(fun, device, backend, name, *arg_specs): abstract_args, arg_devices = unzip2(arg_specs) pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] - with core.new_master(pe.StagingJaxprTrace, True) as master: - jaxpr, (pvals, consts, env) = pe.trace_to_subjaxpr(fun, master, False).call_wrapped(pvals) - assert not env # no subtraces here - del master, env + jaxpr, pvals, consts = pe.trace_to_jaxpr( + fun, pvals, instantiate=False, stage_out_calls=True, bottom=True) + _map(prefetch, it.chain(consts, jaxpr_literals(jaxpr))) nreps = jaxpr_replicas(jaxpr) From 80630c03801dafc94dbc93cf094a8d8bd1c35758 Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 26 Feb 2020 09:25:23 +0100 Subject: [PATCH 0804/1053] Added .pytype cache to .gitignore (#2309) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 983e7049ab0d..0634eefb195f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ build/ dist/ .mypy_cache/ +.pytype/ docs/notebooks/.ipynb_checkpoints/ docs/_autosummary .idea From 6da6df0ae18f273c8efdaf3b7697a8fcf88ec9f1 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Wed, 26 Feb 2020 08:00:27 -0800 Subject: [PATCH 0805/1053] fix comment typo in MPC/LQR example --- examples/control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/control.py b/examples/control.py index 74df5864e252..3d8e00df1d33 100644 --- a/examples/control.py +++ b/examples/control.py @@ -30,7 +30,7 @@ # function `c`, transition function `f`, and initial state `x0`, the goal is to # compute: # -# argmin(lambda U, U: c(T, X[T]) + sum(c(t, X[t], U[t]) for t in range(T))) +# argmin(lambda X, U: c(T, X[T]) + sum(c(t, X[t], U[t]) for t in range(T))) # # subject to the constraints that `X[0] == x0` and that: # From b21e7530f329ccc6ba6c73bd85f5d03dbec9be8d Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 26 Feb 2020 21:30:21 +0100 Subject: [PATCH 0806/1053] Added the optix.py documentation to RTD (#2312) Issue: #2297 --- docs/developer.rst | 5 +++-- docs/jax.experimental.optix.rst | 7 +++++++ docs/jax.experimental.rst | 1 + jax/experimental/optix.py | 14 +++++++------- 4 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 docs/jax.experimental.optix.rst diff --git a/docs/developer.rst b/docs/developer.rst index 29e0842cca37..309937ecaf2f 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -140,8 +140,9 @@ To rebuild the documentation, install several packages: pip install -r docs/requirements.txt You must also install ``pandoc`` in order to regenerate the notebooks. -See `Install Pandoc `_. On Mac, I had success with -the miniconda installer, then ``conda install -c conda-forge pandoc``. +See `Install Pandoc`_, +or using `Miniconda`_ which +I have used successfully on the Mac: ``conda install -c conda-forge pandoc``. If you do not want to install ``pandoc`` then you should regenerate the documentation without the notebooks. diff --git a/docs/jax.experimental.optix.rst b/docs/jax.experimental.optix.rst new file mode 100644 index 000000000000..9094a8681cb7 --- /dev/null +++ b/docs/jax.experimental.optix.rst @@ -0,0 +1,7 @@ +jax.experimental.optix module +============================== + +.. automodule:: jax.experimental.optix + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/jax.experimental.rst b/docs/jax.experimental.rst index be269ef852cc..14267925e26b 100644 --- a/docs/jax.experimental.rst +++ b/docs/jax.experimental.rst @@ -6,6 +6,7 @@ jax.experimental package jax.experimental.loops jax.experimental.optimizers + jax.experimental.optix jax.experimental.stax .. automodule:: jax.experimental diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index de44e4d46d09..6dec4a313a7c 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -14,19 +14,19 @@ """A composable gradient processing and optimization library for JAX. -The `optix` module implements a number of composable gradient transformations, +The ``optix`` module implements a number of composable gradient transformations, typically used in the context of optimizing neural nets. Each transformation defines: -* an `init_fn`, to initialize a (possibly empty) set of statistics, or `state`. -* an `update_fn` to transform an input gradient and update the state. +* an ``init_fn``, to initialize a (possibly empty) set of statistics, or ``state``. +* an ``update_fn`` to transform an input gradient and update the state. -An (optional) `chain` utility can be used to build custom optimizers by +An (optional) ``chain`` utility can be used to build custom optimizers by chaining arbitrary sequences of transformations. For any sequence of -transformations `chain` returns a single `init_fn` and `update_fn`. +transformations ``chain`` returns a single ``init_fn`` and ``update_fn``. -An (optional) `apply_updates` function can be used to eventually apply the +An (optional) ``apply_updates`` function can be used to eventually apply the transformed gradients to the set of parameters of interest. Separating gradient transformations from the parameter update allows to flexibly @@ -34,7 +34,7 @@ multiple updates to the same parameters (e.g. in multi-task settings where the different tasks may benefit from different sets of gradient transformations). -Many popular optimizers can be implemented using `optix` as one-liners, and, +Many popular optimizers can be implemented using ``optix`` as one-liners, and, for convenience, we provide aliases for some of the most popular ones. """ From a473e5b6bb3be5aa032d30ed023abb6b121af0e0 Mon Sep 17 00:00:00 2001 From: Ron Weiss Date: Thu, 27 Feb 2020 10:20:02 -0500 Subject: [PATCH 0807/1053] Reference deduped precision issue. (#2319) --- cloud_tpu_colabs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md index 05bf4ce8d0f9..1b3111d242e1 100644 --- a/cloud_tpu_colabs/README.md +++ b/cloud_tpu_colabs/README.md @@ -46,7 +46,7 @@ By default\*, matrix multiplication in JAX on TPUs [uses bfloat16](https://cloud JAX also adds the `bfloat16` dtype, which you can use to explicitly cast arrays to bfloat16, e.g., `jax.numpy.array(x, dtype=jax.numpy.bfloat16)`. -\* We might change the default precision in the future, since it is arguably surprising. Please comment/vote on [this issue](https://github.com/google/jax/issues/1856) if it affects you! +\* We might change the default precision in the future, since it is arguably surprising. Please comment/vote on [this issue](https://github.com/google/jax/issues/2161) if it affects you! ## Running JAX on a Cloud TPU from a GCE VM From ce9b03866cf04a378d6cc44a5ce5f99700f0148c Mon Sep 17 00:00:00 2001 From: Daniel Suo Date: Thu, 27 Feb 2020 14:43:55 -0500 Subject: [PATCH 0808/1053] Remove check comparing shift/axis and input dimensions in np.roll (#2327) --- jax/numpy/lax_numpy.py | 2 -- tests/lax_numpy_test.py | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ce5aa4ace3d9..b35e3206a7e2 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2678,8 +2678,6 @@ def roll(a, shift, axis=None): if len(b_shape) != 1: msg = "'shift' and 'axis' arguments to roll must be scalars or 1D arrays" raise ValueError(msg) - if b_shape[0] > a_ndim: - raise ValueError("More shifts/axes than dimensions of input to roll.") for x, i in zip(broadcast_to(shift, b_shape), onp.broadcast_to(axis, b_shape)): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index b274cbff96c7..485754898bd2 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1802,7 +1802,9 @@ def testArgsortManually(self): (1, 1), ((3,), (0,)), ((-2,), (-2,)), - ((1, 2), (0, -1)) + ((1, 2), (0, -1)), + ((4, 2, 5, 5, 2, 4), None), + (100, None), ] for rng_factory in [jtu.rand_default])) def testRoll(self, shape, dtype, shifts, axis, rng_factory): From 0dfa9ef5e4eb77acf4b2156687b8cf673a2d25b2 Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Fri, 28 Feb 2020 12:05:38 -0500 Subject: [PATCH 0809/1053] fix vjp odeint (#2321) --- jax/experimental/ode.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index f90c5b9b40cf..719c0dad5397 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -362,8 +362,8 @@ def vjp_all(g, yt, t): time_vjp_list = jax.ops.index_update(result[-1], -1, result[-3]) vjp_times = np.hstack(time_vjp_list)[::-1] - - return tuple([result[-4], vjp_times] + list(result[-2])) + vjp_args = unravel_args(result[-2]) + return (result[-4], vjp_times, *vjp_args) primals_out = odeint(flat_func, y0, t, flat_args, rtol=rtol, atol=atol, mxstep=mxstep) vjp_fun = lambda g: vjp_all(g, primals_out, t) From 61a76014fd4036438687a7822b53c5853e70529a Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 28 Feb 2020 10:40:18 -0800 Subject: [PATCH 0810/1053] Recommend using pip for jaxlib more strongly in the dev guide (#2333) Right now our developer guide suggests that it "may" work but it actually is almost always the recommended choice. --- docs/developer.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/developer.rst b/docs/developer.rst index 309937ecaf2f..0d65964c4875 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -19,13 +19,15 @@ Building or installing ``jaxlib`` Installing ``jaxlib`` with pip .............................. -If you're only modifying Python portions of JAX, you may be able to install -``jaxlib`` from pip (or a prebuilt wheel). You can install with pip by running: +If you're only modifying Python portions of JAX, we recommend installing +``jaxlib`` from a prebuilt wheel using pip: .. code-block:: shell pip install jaxlib +See the `JAX readme `_ for full +guidance on pip installation (e.g., for GPU support). Building ``jaxlib`` from source ............................... From c1b0cfbac01929f483cc8c37259609dd82ff297e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 28 Feb 2020 15:08:53 -0500 Subject: [PATCH 0811/1053] Fix LaxVmap test tolerances. (#2335) The per-op tolerances weren't being used in the vmap tests. --- tests/lax_test.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index a6ba3c7396b6..86d9e3c72da1 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -2594,16 +2594,17 @@ def _CheckBatching(self, op, bdim_size, bdims, shapes, dtypes, rng, jtu.format_test_name_suffix(rec.op, shapes, itertools.repeat(dtype)), bdims), "op_name": rec.op, "rng_factory": rec.rng_factory, "shapes": shapes, - "dtype": dtype, "bdims": bdims} + "dtype": dtype, "bdims": bdims, "tol": rec.tol} for shape_group in compatible_shapes for shapes in CombosWithReplacement(shape_group, rec.nargs) for bdims in all_bdims(*shapes) for dtype in rec.dtypes) for rec in LAX_OPS)) - def testOp(self, op_name, rng_factory, shapes, dtype, bdims): + def testOp(self, op_name, rng_factory, shapes, dtype, bdims, tol): rng = rng_factory() op = getattr(lax, op_name) - self._CheckBatching(op, 10, bdims, shapes, [dtype] * len(shapes), rng) + self._CheckBatching(op, 10, bdims, shapes, [dtype] * len(shapes), rng, + atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": From 2d9caba3169c7280fd09cb26d97ff8ef82626a30 Mon Sep 17 00:00:00 2001 From: msbauer <15681485+msbauer@users.noreply.github.com> Date: Sat, 29 Feb 2020 00:06:38 +0000 Subject: [PATCH 0812/1053] Address Issue 2330 (#2331) * fix issue 2330 * Update lax_numpy_test.py * Update lax_numpy_test.py * Update lax_numpy_test.py Fixed error in naming convention jnp -> lnp; np -> onp --- jax/numpy/lax_numpy.py | 11 +++++++---- tests/lax_numpy_test.py | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index b35e3206a7e2..0f8228acb206 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1721,10 +1721,13 @@ def concatenate(arrays, axis=0): # tree of concatenations as a workaround especially for op-by-op mode. # (https://github.com/google/jax/issues/653). k = 16 - while len(arrays) > 1: - arrays = [lax.concatenate(arrays[i:i+k], axis) - for i in range(0, len(arrays), k)] - return arrays[0] + if len(arrays) == 1: + return array(arrays[0]) + else: + while len(arrays) > 1: + arrays = [lax.concatenate(arrays[i:i+k], axis) + for i in range(0, len(arrays), k)] + return arrays[0] @_wraps(onp.vstack) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 485754898bd2..67fb1180633d 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1072,6 +1072,29 @@ def test_single(m, args_maker, repeats, axis): for repeats in [2, [1,3,2], [2], lnp.array([1,3,2]), lnp.array([2])]: test_single(m_rect, args_maker, repeats, axis=1) + def testIssue2330(self): + ''' + Make sure return value of jnp.concatenate is a jax.ndarray and is side-effect save + ''' + def attempt_sideeffect(x): + x = [x] + x = lnp.concatenate(x) + x -= 1. + return x + + onp_input = onp.ones((1)) + lnp_input = lnp.ones((1)) + expected_onp_input_after_call = onp.ones((1)) + expected_lnp_input_after_call = lnp.ones((1)) + + self.assertTrue(type(lnp.concatenate([onp_input])) is lnp.DeviceArray) + + attempt_sideeffect(onp_input) + attempt_sideeffect(lnp_input) + + self.assertAllClose(onp_input, expected_onp_input_after_call, check_dtypes=True) + self.assertAllClose(lnp_input, expected_lnp_input_after_call, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "op={}_shape=[{}]_axis={}_out_dtype={}".format( op, jtu.format_shape_dtype_string(shape, dtype), axis, out_dtype), From e7debd732f1e8ea3fe76d0bd054da7ef59217544 Mon Sep 17 00:00:00 2001 From: hadovanhasselt Date: Sun, 1 Mar 2020 02:34:33 +0000 Subject: [PATCH 0813/1053] Replace jnp.clip_by_value with jnp.clip (#2339) jnp.clip_by_value does not exist --- jax/experimental/optix.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 6dec4a313a7c..242d0fa58941 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -58,10 +58,10 @@ def clip(max_delta): - """Clip updates element-wise. + """Clip updates element-wise, to be between -max_delta and +max_delta. Args: - max_delta: the maximum size of an update, for each variable + max_delta: the maximum absolute value for each element in the update. Returns: An (init_fn, update_fn) tuple. @@ -72,7 +72,7 @@ def init_fn(_): def update_fn(updates, state): updates = tree_multimap( - lambda g: jnp.clip_by_value(g, -max_delta, max_delta), updates) + lambda g: jnp.clip(g, -max_delta, max_delta), updates) return updates, state return InitUpdate(init_fn, update_fn) From 1e61ba429d950629d2f04ca569e2621f8419d344 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 3 Mar 2020 16:27:53 -0800 Subject: [PATCH 0814/1053] improve jax.nn.relu differentiation (#2342) --- jax/nn/functions.py | 4 +++- tests/nn_test.py | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index b97321b8b276..f385eb3660b8 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -18,14 +18,15 @@ import numpy as onp from jax import dtypes +from jax import custom_transforms, defjvp from jax import lax from jax import random from jax.scipy.special import expit import jax.numpy as np -from jax import jarrett # activations +@custom_transforms def relu(x): r"""Rectified linear unit activation function. @@ -35,6 +36,7 @@ def relu(x): \mathrm{relu}(x) = \max(x, 0) """ return np.maximum(x, 0) +defjvp(relu, lambda g, ans, x: lax.select(x > 0, g, lax.full_like(g, 0))) def softplus(x): r"""Softplus activation function. diff --git a/tests/nn_test.py b/tests/nn_test.py index f3448ae9b989..94475acf02d1 100644 --- a/tests/nn_test.py +++ b/tests/nn_test.py @@ -36,16 +36,23 @@ class NNFunctionsTest(jtu.JaxTestCase): @jtu.skip_on_flag("jax_skip_slow_tests", True) def testSoftplusGrad(self): - check_grads(nn.softplus, (1e-8,), 4, + check_grads(nn.softplus, (1e-8,), order=4, rtol=1e-2 if jtu.device_under_test() == "tpu" else None) + def testReluGrad(self): + rtol = 1e-2 if jtu.device_under_test() == "tpu" else None + check_grads(nn.relu, (1.,), order=3, rtol=rtol) + check_grads(nn.relu, (-1.,), order=3, rtol=rtol) + jaxpr = jax.make_jaxpr(jax.grad(nn.relu))(0.) + self.assertEqual(len(jaxpr.jaxpr.eqns), 2) + def testSoftplusValue(self): val = nn.softplus(89.) self.assertAllClose(val, 89., check_dtypes=False) @jtu.skip_on_flag("jax_skip_slow_tests", True) def testEluGrad(self): - check_grads(nn.elu, (1e4,), 4, eps=1.) + check_grads(nn.elu, (1e4,), order=4, eps=1.) def testEluValue(self): val = nn.elu(1e4) From 52a41311c5666d0188c9f6966e3ef7e31ccb4e81 Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Wed, 4 Mar 2020 17:08:52 +0200 Subject: [PATCH 0815/1053] Fix exception causes in api.py (#2336) --- jax/api.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/jax/api.py b/jax/api.py index 7ef5dff07ca1..70bdb358400f 100644 --- a/jax/api.py +++ b/jax/api.py @@ -427,8 +427,8 @@ def _check_scalar(x): msg = "Gradient only defined for scalar-output functions. Output {}.".format try: aval = core.get_aval(x) - except TypeError: - raise TypeError(msg("was {}".format(x))) + except TypeError as e: + raise TypeError(msg("was {}".format(x))) from e else: if isinstance(aval, ShapedArray): if aval.shape != (): @@ -655,7 +655,7 @@ def _check_axis_sizes(tree, vals, dims): mapped_axis_sizes = {x.shape[d] for x, d in zip(vals, dims) if d is not None} try: sizes, = mapped_axis_sizes - except ValueError: + except ValueError as e: msg = "vmap got inconsistent sizes for array axes to be mapped:\n{}" # we switch the error message based on whether args is a tuple of arrays, # in which case we can produce an error message based on argument indices, @@ -675,11 +675,11 @@ def _check_axis_sizes(tree, vals, dims): "axes" if len(idxs) > 1 else "an axis", size) for size, idxs in sizes.items()] - raise ValueError(msg.format("\n".join(lines1 + ["so"] + lines2))) + raise ValueError(msg.format("\n".join(lines1 + ["so"] + lines2))) from e else: sizes = [x.shape[d] if d is not None else None for x, d in zip(vals, dims)] sizes = tree_unflatten(tree, sizes) - raise ValueError(msg.format("the tree of axis sizes is:\n{}".format(sizes))) + raise ValueError(msg.format("the tree of axis sizes is:\n{}".format(sizes))) from e @wraps(fun, docstr=docstr) def batched_fun(*args): @@ -706,10 +706,10 @@ def _flatten_axes(treedef, axis_tree): add_leaves = lambda i, x: axes.extend([i] * len(tree_flatten(x)[0])) try: tree_multimap(add_leaves, _replace_nones(proxy, axis_tree), dummy) - except ValueError: + except ValueError as e: msg = ("axes specification must be a tree prefix of the corresponding " "value, got specification {} for value {}.") - raise ValueError(msg.format(axis_tree, treedef)) + raise ValueError(msg.format(axis_tree, treedef)) from e axes = [None if a is proxy else a for a in axes] assert len(axes) == treedef.num_leaves return axes @@ -1223,10 +1223,10 @@ def fun(*tangents): for primal_aval, tangent_aval in zip(primal_avals, tangent_avals): try: core.lattice_join(primal_aval, tangent_aval) - except TypeError: + except TypeError as e: msg = ("linearized function called on tangent values inconsistent with " "the original primal values.") - raise ValueError(msg) + raise ValueError(msg) from e dummy = (core.unit,) * len(tangents) out = eval_jaxpr(jaxpr, consts, *(dummy + tangents)) tangents_out = out[len(out)//2:] @@ -1979,8 +1979,8 @@ def __init__(self, shape, dtype): def __len__(self): try: return self.shape[0] - except IndexError: - raise TypeError("len() of unsized object") # same as numpy error + except IndexError as e: + raise TypeError("len() of unsized object") from e # same as numpy error def __repr__(self): return "{}(shape={}, dtype={})".format( From 013c01e6a810a3a685075019b59aa10a0f0c6d21 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 4 Mar 2020 11:35:52 -0500 Subject: [PATCH 0816/1053] =?UTF-8?q?Change=20psum=20to=20perform=20a=20si?= =?UTF-8?q?ngle=20tuple=20AllReduce,=20rather=20than=20one=20AllR=E2=80=A6?= =?UTF-8?q?=20(#2337)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Change psum to perform a single tuple AllReduce, rather than one AllReduce per PyTree element. * Fix papply tests by calling collective wrapper rather than calling bind directly. * Add test for collectives with multiple different dtypes. --- jax/interpreters/pxla.py | 10 ++++- jax/interpreters/xla.py | 3 +- jax/lax/lax_parallel.py | 91 +++++++++++++++++++++++++++++----------- tests/pmap_test.py | 16 +++++++ 4 files changed, 93 insertions(+), 27 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index f82c3c5d1634..51555b19b7b5 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -800,11 +800,17 @@ def process_primitive(self, primitive, tracers, params): which_mapped = [n is not not_mapped for n in names_in] val_out, is_mapped = rule(vals_in, which_mapped, **params) name_out = name if is_mapped else not_mapped - return SplitAxisTracer(self, name_out, val_out) + if primitive.multiple_results: + return [SplitAxisTracer(self, name_out, v) for v in val_out] + else: + return SplitAxisTracer(self, name_out, val_out) else: # if not, bind the primitive without any processing val_out = primitive.bind(*vals_in, **params) - return SplitAxisTracer(self, name, val_out) + if primitive.multiple_results: + return [SplitAxisTracer(self, name, v) for v in val_out] + else: + return SplitAxisTracer(self, name, val_out) else: # if it's not a pmap collective primitive, act just like batching rule = batching.get_primitive_batcher(primitive) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 0410c0e2ccb1..5117dd955abe 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -329,7 +329,8 @@ def write(v, node): replica_groups = axis_groups(axis_env, eqn.params['axis_name']) new_params = {k: v for k, v in eqn.params.items() if k != 'axis_name'} rule = parallel_translations[eqn.primitive] - ans = rule(c, *in_nodes, replica_groups=replica_groups, **new_params) + ans = rule(c, *in_nodes, replica_groups=replica_groups, platform=platform, + **new_params) elif eqn.primitive in call_translations: new_params = check_backend_params(eqn.params, backend) rule = call_translations[eqn.primitive] diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 746782e7db9e..89afa9002e7d 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -15,6 +15,7 @@ Parallelization primitives. """ +import collections import numpy as onp @@ -23,7 +24,7 @@ from jax import dtypes from jax import tree_util from jax.lax import lax -from jax.abstract_arrays import ShapedArray +from jax.abstract_arrays import ShapedArray, raise_to_shaped from jax.interpreters import ad from jax.interpreters import parallel from jax.interpreters import xla @@ -61,7 +62,8 @@ def psum(x, axis_name): >>> print(y) [ 0. 0.16666667 0.33333334 0.5 ] """ - return tree_util.tree_map(partial(psum_p.bind, axis_name=axis_name), x) + leaves, treedef = tree_util.tree_flatten(x) + return treedef.unflatten(psum_p.bind(*leaves, axis_name=axis_name)) def pmean(x, axis_name): """Compute an all-reduce mean on ``x`` over the pmapped axis ``axis_name``. @@ -247,8 +249,9 @@ def bind(x): ### parallel primitives -def standard_pmap_primitive(name): +def standard_pmap_primitive(name, multiple_results=False): prim = core.Primitive(name) + prim.multiple_results = multiple_results prim.def_impl(partial(pxla.apply_parallel_primitive, prim)) prim.def_abstract_eval(lambda x, *args, **params: x) return prim @@ -256,31 +259,70 @@ def standard_pmap_primitive(name): def _allreduce_split_axis_rule(prim, reducer, vals, which_mapped, axis_name): assert tuple(which_mapped) == (True,) - x, = vals - return prim.bind(reducer(x, [0]), axis_name=axis_name), False + vals = (reducer(x, [0]) for x in vals) + return prim.bind(*vals, axis_name=axis_name), False -def _allreduce_translation_rule(prim, c, val, replica_groups): +def _allreduce_translation_rule(prim, c, val, replica_groups, platform=None): dtype = c.GetShape(val).numpy_dtype() scalar = ShapedArray((), dtype) computation = xla.primitive_subcomputation(prim, scalar, scalar) return c.AllReduce(val, computation, replica_groups=replica_groups) # psum translation rule has special handling for complex dtypes -def _psum_translation_rule(c, val, replica_groups): - psum = partial(_allreduce_translation_rule, lax.add_p, c, - replica_groups=replica_groups) - dtype = c.GetShape(val).numpy_dtype() - if dtypes.issubdtype(dtype, onp.complexfloating): - return c.Complex(psum(c.Real(val)), psum(c.Imag(val))) - else: - return psum(val) +def _psum_translation_rule(c, *args, replica_groups=None, platform=None): + if platform == "cpu": + return _cpu_psum_translation_rule(c, *args, replica_groups=replica_groups) + + # XLA's tuple all-reduce doesn't support different dtypes in the same + # allreduce. Instead, we perform once all-reduce for each argument input type. + args_by_type = collections.defaultdict(lambda: ([], [])) + for i, arg in enumerate(args): + indices, dtype_args = args_by_type[c.GetShape(arg).numpy_dtype()] + indices.append(i) + dtype_args.append(arg) + + # The outputs, in the original argument order. + out = [None] * len(args) + for dtype, (indices, dtype_args) in sorted(args_by_type.items()): + is_complex = dtypes.issubdtype(dtype, onp.complexfloating) + n = len(dtype_args) + if is_complex: + dtype_args = ([c.Real(x) for x in dtype_args] + + [c.Imag(x) for x in dtype_args]) + scalar = ShapedArray((), c.GetShape(dtype_args[0]).numpy_dtype()) + computation = xla.primitive_subcomputation(lax.add_p, scalar, scalar) + all_reduce = c.AllReduce(c.Tuple(*dtype_args), computation, + replica_groups=replica_groups) + if is_complex: + xs = [c.Complex(c.GetTupleElement(all_reduce, i), + c.GetTupleElement(all_reduce, n + i)) for i in range(n)] + else: + xs = [c.GetTupleElement(all_reduce, i) for i in range(n)] + for i, x in zip(indices, xs): + out[i] = x + return c.Tuple(*out) + +# TODO(b/150476027): CPU doesn't support tuple all-reduce correctly. But +# fortunately we don't really need it in that case because CPU doesn't support +# cross-task communication either. +def _cpu_psum_translation_rule(c, *args, replica_groups): + def _translate(val): + psum = partial(_allreduce_translation_rule, lax.add_p, c, + replica_groups=replica_groups) + dtype = c.GetShape(val).numpy_dtype() + if dtypes.issubdtype(dtype, onp.complexfloating): + return c.Complex(psum(c.Real(val)), psum(c.Imag(val))) + else: + return psum(val) + return c.Tuple(*map(_translate, args)) -psum_p = standard_pmap_primitive('psum') +psum_p = standard_pmap_primitive('psum', multiple_results=True) +psum_p.def_abstract_eval(lambda *args, **params: map(raise_to_shaped, args)) pxla.split_axis_rules[psum_p] = \ partial(_allreduce_split_axis_rule, psum_p, lax._reduce_sum) xla.parallel_translations[psum_p] = _psum_translation_rule -pxla.parallel_pure_rules[psum_p] = lambda x, shape: x * prod(shape) -ad.deflinear(psum_p, lambda t, axis_name: [psum(t, axis_name)]) +pxla.parallel_pure_rules[psum_p] = lambda *args, shape: (x * prod(shape) for x in args) +ad.deflinear(psum_p, lambda *ts, axis_name: psum(*ts, axis_name)) pxla.multi_host_supported_collectives.add(psum_p) @@ -298,7 +340,7 @@ def _psum_translation_rule(c, val, replica_groups): partial(_allreduce_split_axis_rule, pmin_p, lax._reduce_min) -def _ppermute_translation_rule(c, x, replica_groups, perm): +def _ppermute_translation_rule(c, x, replica_groups, perm, platform=None): group_size = len(replica_groups[0]) srcs, dsts = unzip2((src % group_size, dst % group_size) for src, dst in perm) if not (len(srcs) == len(set(srcs)) and len(dsts) == len(set(dsts))): @@ -322,7 +364,8 @@ def _ppermute_transpose_rule(t, perm, axis_name): pxla.multi_host_supported_collectives.add(ppermute_p) -def _all_to_all_translation_rule(c, x, split_axis, concat_axis, replica_groups): +def _all_to_all_translation_rule(c, x, split_axis, concat_axis, replica_groups, + platform=None): return c.AllToAll(x, split_axis, concat_axis, replica_groups) def _all_to_all_split_axis_rule(vals, which_mapped, split_axis, concat_axis, @@ -411,7 +454,7 @@ def _defvectorized(prim): parallel.papply_primitive_rules[prim] = partial(_vectorized_papply, prim) -def _reducer_papply(prim, cprim, name, size, vals, papply_axes, axes, **kwargs): +def _reducer_papply(prim, collective, name, size, vals, papply_axes, axes, **kwargs): operand, = vals papply_axis, = papply_axes @@ -427,7 +470,7 @@ def _reducer_papply(prim, cprim, name, size, vals, papply_axes, axes, **kwargs): result = operand if not axes or papply_axis in axes: - return cprim.bind(result, axis_name=name), None + return collective(result, axis_name=name), None else: new_papply_axis = papply_axis - onp.sum(onp.less(other_axes, papply_axis)) return result, new_papply_axis @@ -487,9 +530,9 @@ def _defidentity(prim, argnum=0): _defidentity(lax.tie_in_p) -_defreducer(lax.reduce_sum_p, psum_p) -_defreducer(lax.reduce_max_p, pmax_p) -_defreducer(lax.reduce_min_p, pmin_p) +_defreducer(lax.reduce_sum_p, psum) +_defreducer(lax.reduce_max_p, pmax) +_defreducer(lax.reduce_min_p, pmin) def _dot_general_papply_rule(name, size, vals, dims, dimension_numbers, diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 5b478a553806..56d872f31996 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -126,6 +126,22 @@ def protate(x, axis_name): assert_allclose(jax_f(ptranspose)(x), onp_transpose(x)) assert_allclose(jax_f(protate)(x), onp_rotate(x)) + def testCollectivesWithTreesOfDifferentDtypes(self): + n = len(jax.devices()) + x = {'a': onp.arange(1 * n * n, 2 * n * n, dtype=onp.float32).reshape([n, n]), + 'b': onp.arange(2 * n * n, 3 * n * n, dtype=onp.int32).reshape([n, n]), + 'c': onp.arange(4 * n * n, 5 * n * n, dtype=onp.float32).reshape([n, n]), + 'd': onp.arange(6 * n * n, 7 * n * n, dtype=onp.int32).reshape([n, n])} + tree_f = lambda f: partial(tree_util.tree_map, f) + jax_f = lambda p: pmap(lambda x: p(x, 'i'), 'i') + onp_f = lambda p: tree_f(lambda x: onp.broadcast_to(p(x, 0), x.shape)) + assert_allclose = partial(tree_util.tree_multimap, + partial(self.assertAllClose, check_dtypes=False)) + assert_allclose(jax_f(lax.pmax)(x), onp_f(onp.max)(x)) + assert_allclose(jax_f(lax.pmin)(x), onp_f(onp.min)(x)) + assert_allclose(jax_f(lax.psum)(x), onp_f(onp.sum)(x)) + assert_allclose(jax_f(lax.pmean)(x), onp_f(onp.mean)(x)) + def testComplexPsum(self): f = pmap(lambda x: x - lax.psum(x, 'i'), axis_name='i') From 9d61d4b61622fac679f7217a7bc2a47a0ea156f8 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 4 Mar 2020 14:49:11 -0500 Subject: [PATCH 0817/1053] Bump jaxlib version to 0.1.40. (#2352) Update XLA version. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1651a651213c..9d209936fbd5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "c1f4c6dddb07f3af6d7b20e8e4337a4d3dbc6baab49d84e96d71614f691e211f", - strip_prefix = "tensorflow-7f065c74b6583d1f0674a5e0ef23d0b4d80671ab", + sha256 = "32f919d5f153cc98d162711c856a7c1858341b0ebbe91b61d7486f134cd37db1", + strip_prefix = "tensorflow-0b0432ae2d7519aa3f8f9e9569429685024fa823", urls = [ - "https://github.com/tensorflow/tensorflow/archive/7f065c74b6583d1f0674a5e0ef23d0b4d80671ab.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/0b0432ae2d7519aa3f8f9e9569429685024fa823.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index b8f7834d9465..a8da27b3f95c 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.39" +__version__ = "0.1.40" From 7243ddf05c392e80071f0138bcb6b6aea14d5b17 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 4 Mar 2020 16:23:48 -0500 Subject: [PATCH 0818/1053] Bump XLA version. (#2353) --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d209936fbd5..fbcd20fc26b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "32f919d5f153cc98d162711c856a7c1858341b0ebbe91b61d7486f134cd37db1", - strip_prefix = "tensorflow-0b0432ae2d7519aa3f8f9e9569429685024fa823", + sha256 = "9699d5c26fdeb8d57b701b7edb1dd1c127849765f7880d767b0ae8c06c38d601", + strip_prefix = "tensorflow-ca8d8fbf7bba22415b675a5cb88b7393bfaadf1f", urls = [ - "https://github.com/tensorflow/tensorflow/archive/0b0432ae2d7519aa3f8f9e9569429685024fa823.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/ca8d8fbf7bba22415b675a5cb88b7393bfaadf1f.tar.gz", ], ) From 73443d28d8fa9ebd0197537fcc3704236a0ee337 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 5 Mar 2020 08:41:07 -0500 Subject: [PATCH 0819/1053] Update release notes for jaxlib 0.1.40. (#2359) --- README.md | 2 +- docs/CHANGELOG.rst | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4670b9dcd3ca..aa087a215091 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,7 @@ PYTHON_VERSION=cp37 # alternatives: cp35, cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda92, cuda100, cuda101, cuda102 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.39-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.40-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 6f2578b61ad5..1136d735a57e 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -7,6 +7,7 @@ Change Log These are the release notes for JAX. + jax 0.1.60 (unreleased) ----------------------- @@ -22,6 +23,18 @@ jax 0.1.60 (unreleased) * Improved error messages for when tracers are mistakenly saved in global state. * Added :py:func:`jax.nn.one_hot` utility function. +jaxlib 0.1.40 (March 4, 2020) +-------------------------------- + +* Adds experimental support in Jaxlib for TensorFlow profiler, which allows + tracing of CPU and GPU computations from TensorBoard. +* Includes prototype support for multihost GPU computations that communicate via + NCCL. +* Improves performance of NCCL collectives on GPU. +* Adds TopK, CustomCallWithoutLayout, CustomCallWithLayout, IGammaGradA and + RandomGamma implementations. +* Supports device assignments known at XLA compilation time. + jax 0.1.59 (February 11, 2020) ------------------------------ @@ -47,6 +60,12 @@ jax 0.1.59 (February 11, 2020) zero-copy buffer sharing between JAX and NumPy. * Added JAX_SKIP_SLOW_TESTS environment variable to skip tests known as slow. +jaxlib 0.1.39 (February 11, 2020) +-------------------------------- + +* Updates XLA. + + jaxlib 0.1.38 (January 29, 2020) -------------------------------- From 1006758b943191133e1ffb4dd5003deb594b2f9a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 5 Mar 2020 09:25:16 -0500 Subject: [PATCH 0820/1053] Bump minimum jaxlib version to 0.1.40. (#2360) --- .travis.yml | 2 +- jax/lib/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d63badf8f764..cbb265733817 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ install: # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. - - pip install jaxlib==0.1.38 + - pip install jaxlib==0.1.40 - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 790f9383f841..db2ed8f89c53 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 38) +_minimum_jaxlib_version = (0, 1, 40) try: from jaxlib import version as jaxlib_version except: From ddd76b803bc4f55305cac96a377d3c9efe572cba Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 5 Mar 2020 12:07:57 -0500 Subject: [PATCH 0821/1053] =?UTF-8?q?Add=20a=20jax.profiler=20module=20tha?= =?UTF-8?q?t=20exposes=20the=20new=20TensorFlow=20profiler=20in=E2=80=A6?= =?UTF-8?q?=20(#2354)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add a jax.profiler module that exposes the new TensorFlow profiler integration. * Fix documentation. --- docs/jax.rst | 1 + jax/profiler.py | 88 ++++++++++++++++++++++++++++++++++++++++++ tests/profiler_test.py | 65 +++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 jax/profiler.py create mode 100644 tests/profiler_test.py diff --git a/docs/jax.rst b/docs/jax.rst index ff2359a7edb3..bfbacbd3b79f 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -18,6 +18,7 @@ Subpackages jax.random jax.tree_util jax.dlpack + jax.profiler Just-in-time compilation (:code:`jit`) -------------------------------------- diff --git a/jax/profiler.py b/jax/profiler.py new file mode 100644 index 000000000000..96a20cf3638c --- /dev/null +++ b/jax/profiler.py @@ -0,0 +1,88 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import wraps +from typing import Callable + +from .lib import xla_client + + +def start_server(port: int): + """Starts a profiler server on port `port`. + + Using the "TensorFlow profiler" feature in `TensorBoard + `_ 2.2 or newer, you can + connect to the profiler server and sample execution traces that show CPU and + GPU device activity. + + Returns a profiler server object. The server remains alive and listening until + the server object is destroyed. + """ + return xla_client.profiler.start_server(port) + + +class TraceContext(xla_client.profiler.TraceMe): + """Context manager generates a trace event in the profiler. + + The trace event spans the duration of the code enclosed by the context. + + For example: + + >>> import jax, jax.numpy as jnp + >>> x = jnp.ones((1000, 1000)) + >>> with jax.profiler.TraceContext("acontext"): + ... jnp.dot(x, x.T).block_until_ready() + + This will cause an "acontext" event to show up on the trace timeline if the + event occurs while the process is being traced by TensorBoard. + """ + pass + + +def trace_function(func: Callable, name: str = None, **kwargs): + """Decorator that generates a trace event for the execution of a function. + + For example: + + >>> import jax, jax.numpy as jnp + >>> + >>> @jax.profiler.trace_function + >>> def f(x): + ... return jnp.dot(x, x.T).block_until_ready() + >>> + >>> f(jnp.ones((1000, 1000)) + + This will cause an "f" event to show up on the trace timeline if the + function execution occurs while the process is being traced by TensorBoard. + + Arguments can be passed to the decorator via :py:func:`functools.partial`. + + >>> import jax, jax.numpy as jnp + >>> from functools import partial + >>> + >>> @partial(jax.profiler.trace_function, name="event_name") + >>> def f(x): + ... return jnp.dot(x, x.T).block_until_ready() + >>> + >>> f(jnp.ones((1000, 1000)) + """ + + name = name or getattr(func, '__qualname__', None) + name = name or func.__name__ + @wraps(func) + def wrapper(*args, **kwargs): + with TraceContext(name, **kwargs): + return func(*args, **kwargs) + return wrapper + return wrapper diff --git a/tests/profiler_test.py b/tests/profiler_test.py new file mode 100644 index 000000000000..6cecf397819c --- /dev/null +++ b/tests/profiler_test.py @@ -0,0 +1,65 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import partial +import unittest + +from absl.testing import absltest + +import jax +import jax.profiler +from jax.config import config + +try: + import portpicker +except ImportError: + portpicker = None + +config.parse_flags_with_absl() + + +class ProfilerTest(unittest.TestCase): + # These tests simply test that the profiler API does not crash; they do not + # check functional correctness. + + @unittest.skipIf(not portpicker, "Test requires portpicker") + def testStartServer(self): + port = portpicker.pick_unused_port() + jax.profiler.start_server(port=port) + del port + + def testTraceContext(self): + x = 3 + with jax.profiler.TraceContext("mycontext"): + x = x + 2 + + def testTraceFunction(self): + @jax.profiler.trace_function + def f(x): + return x + 2 + self.assertEqual(f(7), 9) + + @partial(jax.profiler.trace_function, name="aname") + def g(x): + return x + 2 + self.assertEqual(g(7), 9) + + @partial(jax.profiler.trace_function, name="aname", akwarg="hello") + def h(x): + return x + 2 + self.assertEqual(h(7), 9) + + +if __name__ == "__main__": + absltest.main() From 64b1da9d4877b504ee353d03417368c351aeadc1 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 5 Mar 2020 13:10:20 -0500 Subject: [PATCH 0822/1053] =?UTF-8?q?Updates=20to=20jax=20that=20were=20de?= =?UTF-8?q?ferred=20until=20after=20jaxlib=200.1.40=20became=20th=E2=80=A6?= =?UTF-8?q?=20(#2362)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updates to jax that were deferred until after jaxlib 0.1.40 became the minimum version. * Remove backward compatibility code. * Use CustomCallWithLayout instead of CustomCall. * Mention jaxlib version bump in changelog. --- docs/CHANGELOG.rst | 1 + jaxlib/cuda_prng.py | 2 +- jaxlib/cusolver.py | 18 +++++++++--------- jaxlib/lapack.pyx | 18 +++++++++--------- tests/array_interoperability_test.py | 13 ++++--------- tests/lax_test.py | 1 - 6 files changed, 24 insertions(+), 29 deletions(-) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 1136d735a57e..80e8b62a9c64 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -22,6 +22,7 @@ jax 0.1.60 (unreleased) ``static_argnums`` in :py:func:`jax.jit`. * Improved error messages for when tracers are mistakenly saved in global state. * Added :py:func:`jax.nn.one_hot` utility function. +* The minimum jaxlib version is now 0.1.40. jaxlib 0.1.40 (March 4, 2020) -------------------------------- diff --git a/jaxlib/cuda_prng.py b/jaxlib/cuda_prng.py index a28c4b310a44..5f244bdf20a1 100644 --- a/jaxlib/cuda_prng.py +++ b/jaxlib/cuda_prng.py @@ -46,7 +46,7 @@ def threefry2x32(c, keys, data): opaque = cuda_prng_kernels.cuda_threefry2x32_descriptor(_prod(dims)) layout = tuple(range(ndims - 1, -1, -1)) shape = xla_client.Shape.array_shape(dtype, dims, layout) - return c.CustomCall( + return c.CustomCallWithLayout( b"cuda_threefry2x32", operands=(keys[0], keys[1], data[0], data[1]), shape_with_layout=xla_client.Shape.tuple_shape([shape, shape]), diff --git a/jaxlib/cusolver.py b/jaxlib/cusolver.py index 4517a85c9bea..970f0928caa7 100644 --- a/jaxlib/cusolver.py +++ b/jaxlib/cusolver.py @@ -81,7 +81,7 @@ def trsm(c, a, b, left_side=False, lower=False, trans_a=False, conj_a=False, lwork, opaque = cublas_kernels.build_trsm_batched_descriptor( np.dtype(dtype), batch, m, n, left_side, lower, trans_a, conj_a, diag) layout = (num_bd, num_bd + 1) + tuple(range(num_bd - 1, -1, -1)) - out = c.CustomCall( + out = c.CustomCallWithLayout( b"cublas_trsm_batched", operands=(a, b), shape_with_layout=_Shape.tuple_shape(( @@ -111,7 +111,7 @@ def potrf(c, a, lower): np.dtype(dtype), lower, batch, n) kernel = b"cusolver_potrf" - out = c.CustomCall( + out = c.CustomCallWithLayout( kernel, operands=(a,), shape_with_layout=_Shape.tuple_shape(( @@ -151,7 +151,7 @@ def getrf(c, a): workspace = _Shape.array_shape(dtype, (lwork,), (0,)) kernel = b"cusolver_getrf" - out = c.CustomCall( + out = c.CustomCallWithLayout( kernel, operands=(a,), shape_with_layout=_Shape.tuple_shape(( @@ -188,7 +188,7 @@ def geqrf(c, a): workspace = _Shape.array_shape(dtype, (lwork,), (0,)) kernel = b"cusolver_geqrf" - out = c.CustomCall( + out = c.CustomCallWithLayout( kernel, operands=(a,), shape_with_layout=_Shape.tuple_shape(( @@ -229,7 +229,7 @@ def orgqr(c, a, tau): workspace = _Shape.array_shape(dtype, (lwork,), (0,)) kernel = b"cusolver_orgqr" - out = c.CustomCall( + out = c.CustomCallWithLayout( kernel, operands=(a, tau), shape_with_layout=_Shape.tuple_shape(( @@ -276,7 +276,7 @@ def syevd(c, a, lower=False): np.dtype(dtype), lower, batch, n) eigvals_type = _real_type(dtype) - out = c.CustomCall( + out = c.CustomCallWithLayout( kernel, operands=(a,), shape_with_layout=_Shape.tuple_shape(( @@ -316,7 +316,7 @@ def gesvd(c, a, full_matrices=True, compute_uv=True): scalar_layout = tuple(range(num_bd - 1, -1, -1)) vector_layout = (num_bd,) + scalar_layout matrix_layout = (num_bd, num_bd + 1) + scalar_layout - out = c.CustomCall( + out = c.CustomCallWithLayout( b"cusolver_gesvdj", operands=(a,), shape_with_layout=_Shape.tuple_shape(( @@ -345,7 +345,7 @@ def gesvd(c, a, full_matrices=True, compute_uv=True): scalar_layout = tuple(range(num_bd - 1, -1, -1)) vector_layout = (num_bd,) + scalar_layout matrix_layout = (num_bd + 1, num_bd) + scalar_layout - out = c.CustomCall( + out = c.CustomCallWithLayout( b"cusolver_gesvd", operands=(a,), shape_with_layout=_Shape.tuple_shape(( @@ -372,7 +372,7 @@ def gesvd(c, a, full_matrices=True, compute_uv=True): scalar_layout = tuple(range(num_bd - 1, -1, -1)) vector_layout = (num_bd,) + scalar_layout matrix_layout = (num_bd, num_bd + 1) + scalar_layout - out = c.CustomCall( + out = c.CustomCallWithLayout( b"cusolver_gesvd", operands=(a,), shape_with_layout=_Shape.tuple_shape(( diff --git a/jaxlib/lapack.pyx b/jaxlib/lapack.pyx index bc54d93c851c..25a65c966c34 100644 --- a/jaxlib/lapack.pyx +++ b/jaxlib/lapack.pyx @@ -16,7 +16,7 @@ # distutils: language = c++ # Shims that allow the XLA CPU backend to call scipy-provided LAPACK kernels -# via CustomCall. +# via CustomCallWithLayout. from __future__ import print_function @@ -240,7 +240,7 @@ def trsm(c, alpha, a, b, left_side=False, lower=False, trans_a=False, raise NotImplementedError("Conjugation without transposition not supported") layout = (num_bd, num_bd + 1) + tuple(range(num_bd - 1, -1, -1)) - return c.CustomCall( + return c.CustomCallWithLayout( fn, operands=( c.ConstantS32Scalar(int(left_side)), @@ -384,7 +384,7 @@ def getrf(c, a): else: raise NotImplementedError("Unsupported dtype {}".format(dtype)) - out = c.CustomCall( + out = c.CustomCallWithLayout( fn, operands=( c.ConstantS32Scalar(b), @@ -576,7 +576,7 @@ def geqrf(c, a): else: raise NotImplementedError("Unsupported dtype {}".format(dtype)) - out = c.CustomCall( + out = c.CustomCallWithLayout( fn, operands=( c.ConstantS32Scalar(b), @@ -777,7 +777,7 @@ def orgqr(c, a, tau): else: raise NotImplementedError("Unsupported dtype {}".format(dtype)) - out = c.CustomCall( + out = c.CustomCallWithLayout( fn, operands=( c.ConstantS32Scalar(b), @@ -929,7 +929,7 @@ def potrf(c, a, lower=False): b *= d layout = (num_bd, num_bd + 1) + tuple(range(num_bd - 1, -1, -1)) - out = c.CustomCall( + out = c.CustomCallWithLayout( fn, operands=(c.ConstantS32Scalar(int(lower)), c.ConstantS32Scalar(b), c.ConstantS32Scalar(n), a), @@ -1234,7 +1234,7 @@ def gesdd(c, a, full_matrices=True, compute_uv=True): scalar_layout = tuple(range(num_bd - 1, -1, -1)) vector_layout = (num_bd,) + scalar_layout matrix_layout = (num_bd, num_bd + 1) + scalar_layout - out = c.CustomCall( + out = c.CustomCallWithLayout( fn, operands=(c.ConstantS32Scalar(int(full_matrices)), c.ConstantS32Scalar(int(compute_uv)), @@ -1458,7 +1458,7 @@ def syevd(c, a, lower=False): else: raise NotImplementedError("Unsupported dtype {}".format(dtype)) - out = c.CustomCall( + out = c.CustomCallWithLayout( fn, operands=(c.ConstantS32Scalar(1 if lower else 0), c.ConstantS32Scalar(b), @@ -1750,7 +1750,7 @@ def geev(c, a): else: raise NotImplementedError("Unsupported dtype {}".format(dtype)) - out = c.CustomCall( + out = c.CustomCallWithLayout( fn, operands=(c.ConstantS32Scalar(b), c.ConstantS32Scalar(n), a), shape_with_layout=Shape.tuple_shape(workspaces + eigvals + ( diff --git a/tests/array_interoperability_test.py b/tests/array_interoperability_test.py index fba9d50bb239..04ccc1e76ebb 100644 --- a/tests/array_interoperability_test.py +++ b/tests/array_interoperability_test.py @@ -46,11 +46,8 @@ nonempty_nonscalar_array_shapes = [(4,), (3, 4), (2, 3, 4)] empty_array_shapes = [] -# TODO(phawkins): size 0 and 1 dimensions are mishandled (with an error) when -# being imported to JAX in jaxlib 0.1.38. -if jax.lib.version > (0, 1, 38): - empty_array_shapes += [(0,), (0, 4), (3, 0),] - nonempty_nonscalar_array_shapes += [(3, 1), (1, 4), (2, 1, 4)] +empty_array_shapes += [(0,), (0, 4), (3, 0),] +nonempty_nonscalar_array_shapes += [(3, 1), (1, 4), (2, 1, 4)] nonempty_array_shapes = [()] + nonempty_nonscalar_array_shapes all_shapes = nonempty_array_shapes + empty_array_shapes @@ -100,8 +97,7 @@ def testTorchToJax(self, shape, dtype): "shape": shape, "dtype": dtype} for shape in all_shapes for dtype in torch_dtypes)) - @unittest.skipIf(not torch or jax.lib.version <= (0, 1, 38), - "Test requires PyTorch and jaxlib >= 0.1.39") + @unittest.skipIf(not torch, "Test requires PyTorch") # TODO(phawkins): the dlpack destructor issues errors in jaxlib 0.1.38. def testJaxToTorch(self, shape, dtype): rng = jtu.rand_default() @@ -124,8 +120,7 @@ def setUp(self): "shape": shape, "dtype": dtype} for shape in all_shapes for dtype in dlpack_dtypes)) - @unittest.skipIf(not cupy or jax.lib.version <= (0, 1, 38), - "Test requires CuPy and jaxlib >= 0.1.39") + @unittest.skipIf(not cupy, "Test requires CuPy") def testJaxToCuPy(self, shape, dtype): rng = jtu.rand_default() x = rng(shape, dtype) diff --git a/tests/lax_test.py b/tests/lax_test.py index 86d9e3c72da1..b985fbccd3a8 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1328,7 +1328,6 @@ def args_maker(): for shape in [(3,), (5, 3)] for k in [1, 3] for rng_factory in [jtu.rand_default])) - @unittest.skipIf(jax.lib.version < (0, 1, 40), "Test requires jaxlib 0.1.40") def testTopK(self, shape, dtype, k, rng_factory): rng = rng_factory() perm_rng = onp.random.RandomState(0) From eeffbca45e6ab67f9fe782a1ce183a794d0a785b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 5 Mar 2020 16:07:17 -0500 Subject: [PATCH 0823/1053] Add profiler documentation. (#2365) --- docs/jax.profiler.rst | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/jax.profiler.rst diff --git a/docs/jax.profiler.rst b/docs/jax.profiler.rst new file mode 100644 index 000000000000..3f97311f8c64 --- /dev/null +++ b/docs/jax.profiler.rst @@ -0,0 +1,6 @@ +jax.profiler module +=================== + +.. automodule:: jax.profiler + :members: + :show-inheritance: \ No newline at end of file From a1fa6296cc0d2b55b754f73029985b3fef5f7258 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 5 Mar 2020 14:45:01 -0800 Subject: [PATCH 0824/1053] Document jax.device_put (#2366) --- docs/jax.rst | 1 + jax/api.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/docs/jax.rst b/docs/jax.rst index bfbacbd3b79f..0d3f53c6f6cc 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -28,6 +28,7 @@ Just-in-time compilation (:code:`jit`) .. autofunction:: xla_computation .. autofunction:: make_jaxpr .. autofunction:: eval_shape +.. autofunction:: device_put Automatic differentiation ------------------------- diff --git a/jax/api.py b/jax/api.py index 70bdb358400f..b5f224ac7f1b 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1380,6 +1380,16 @@ def jaxpr_maker(*args, **kwargs): def device_put(x, device=None): + """Transfers ``x`` to ``device``. + + Args: + ``x``: An array, scalar, or (nested) standard Python container thereof. + ``device``: The ``Device`` to transfer ``x`` to. + + Returns: + A copy of ``x`` that resides on ``device``. If ``x`` is already on + ``device``, returns ``x``. + """ return tree_map(lambda y: xla.device_put_p.bind(y, device=device), x) From efa0315c8f2d86d6aa5bf898c2ae9f722d4b76d5 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 5 Mar 2020 16:21:19 -0800 Subject: [PATCH 0825/1053] [docs] Add docstring for jax.lax.tie_in (#2364) --- jax/lax/lax.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 8e9c286d0dd5..c086fa11bc53 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1043,6 +1043,17 @@ def top_k(operand, k): return top_k_p.bind(operand, k=k) def tie_in(x, y): + """Gives ``y`` a fake data dependence on ``x``. + + When staging to XLA (e.g. running under jit or pmap), values that don't depend + on computation inputs are computed op-by-op, and folded into the XLA + computation as constants. + + ``tie_in`` provides a way to explicitly stage values into the computation. + When staging to XLA and ``x`` is already staged, then the result of ``tie_in`` + is ``y``, but staged to XLA. Downstream use of the result will also be staged + to XLA. + """ return tie_in_p.bind(x, y) From 8e251e1f8d0f412a0e447971d64f6dce5dcffa7b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 6 Mar 2020 10:56:29 -0500 Subject: [PATCH 0826/1053] Add pytype annotations to JAX API. (#2368) --- jax/api.py | 52 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/jax/api.py b/jax/api.py index b5f224ac7f1b..0e0a4cca1a6f 100644 --- a/jax/api.py +++ b/jax/api.py @@ -30,6 +30,7 @@ import operator as op import os import threading +from typing import Any, Callable, List, Optional, Tuple, Union from warnings import warn import numpy as onp @@ -80,7 +81,8 @@ def __init__(self): _thread_local_state = _ThreadLocalState() -def jit(fun, static_argnums=(), device=None, backend=None): +def jit(fun: Callable, static_argnums: Tuple[int] = (), device=None, + backend: Optional[str] = None): """Sets up `fun` for just-in-time compilation with XLA. Args: @@ -193,8 +195,11 @@ def disable_jit(): _thread_local_state.jit_is_disabled = prev_val -def xla_computation(fun, static_argnums=(), axis_env=None, backend=None, - tuple_args=False, instantiate_const_outputs=True): +def xla_computation(fun: Callable, static_argnums: Tuple[int] = (), + axis_env: Optional[List[Tuple[Any, int]]] = None, + backend: Optional[str] = None, + tuple_args: bool = False, + instantiate_const_outputs: bool = True): """Creates a function that produces its XLA computation given example args. Args: @@ -309,7 +314,8 @@ def computation_maker(*args, **kwargs): return c.Build(c.Tuple(*outs)) return computation_maker -def grad(fun, argnums=0, has_aux=False, holomorphic=False): +def grad(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, + has_aux: bool = False, holomorphic: bool = False): """Creates a function which evaluates the gradient of `fun`. Args: @@ -359,7 +365,8 @@ def grad_f_aux(*args, **kwargs): return grad_f_aux if has_aux else grad_f -def value_and_grad(fun, argnums=0, has_aux=False, holomorphic=False): +def value_and_grad(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, + has_aux: bool = False, holomorphic: bool = False): """Creates a function which evaluates both `fun` and the gradient of `fun`. Args: @@ -437,7 +444,8 @@ def _check_scalar(x): raise TypeError(msg("had abstract value {}".format(aval))) -def jacfwd(fun, argnums=0, holomorphic=False): +def jacfwd(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, + holomorphic: bool = False): """Jacobian of `fun` evaluated column-by-column using forward-mode AD. Args: @@ -482,7 +490,8 @@ def _check_real_input_jacfwd(x): raise TypeError(msg.format(aval.dtype.name)) -def jacrev(fun, argnums=0, holomorphic=False): +def jacrev(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, + holomorphic: bool = False): """Jacobian of `fun` evaluated row-by-row using reverse-mode AD. Args: @@ -529,7 +538,8 @@ def _check_real_output_jacrev(x): raise TypeError(msg.format(aval.dtype.name)) -def hessian(fun, argnums=0, holomorphic=False): +def hessian(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, + holomorphic: bool = False): """Hessian of `fun`. Args: @@ -576,7 +586,7 @@ def _dtype(x): return dtypes.canonicalize_dtype(dtypes.result_type(x)) -def vmap(fun, in_axes=0, out_axes=0): +def vmap(fun: Callable, in_axes=0, out_axes=0): """Vectorizing map. Creates a function which maps `fun` over argument axes. Args: @@ -715,7 +725,10 @@ def _flatten_axes(treedef, axis_tree): return axes -def pmap(fun, axis_name=None, static_broadcasted_argnums=(), devices=None, backend=None, axis_size=None): +def pmap(fun: Callable, axis_name: Any = None, + static_broadcasted_argnums: Tuple[int] = (), + devices=None, backend: Optional[str] = None, + axis_size: Optional[int] = None): """Parallel map with support for collectives. The purpose of ``pmap`` is to express single-program multiple-data (SPMD) @@ -932,7 +945,8 @@ def __eq__(self, other): return self.obj is other.obj -def soft_pmap(fun, axis_name=None, backend=None): +def soft_pmap(fun: Callable, axis_name: Optional[Any] = None, + backend: Optional[str] = None): warn("soft_pmap is an experimental feature and probably has bugs!") _check_callable(fun) axis_name = _TempAxisName(fun) if axis_name is None else axis_name @@ -947,7 +961,7 @@ def f_pmapped(*args, **kwargs): chunk_size, leftover = divmod(axis_size, pxla.unmapped_device_count(backend)) if chunk_size == 0 and leftover: - return pmap(fun, axis_name, backend)(*args) # can map directly onto hardware + return pmap(fun, axis_name, backend=backend)(*args) # can map directly onto hardware elif leftover: msg = ("soft_pmap mapped axis size must be divisible by the number of " "XLA devices (or be less than or equal to that number), but got " @@ -1028,7 +1042,7 @@ def pfun(*args): return pfun -def mask(fun, in_shapes, out_shape): +def mask(fun: Callable, in_shapes, out_shape): in_specs, in_shapes_tree = tree_flatten(in_shapes) out_specs, out_shapes_tree = tree_flatten(out_shape) @@ -1095,7 +1109,7 @@ def _shape_spec_consistent(spec, expr): return all(a == b for a, b in zip(spec, expr) if a is not masking.monomorphic_dim) -def jvp(fun, primals, tangents): +def jvp(fun: Callable, primals, tangents): """Computes a (forward-mode) Jacobian-vector product of `fun`. Args: @@ -1149,7 +1163,7 @@ def jvp(fun, primals, tangents): return (tree_unflatten(out_tree(), out_primals), tree_unflatten(out_tree(), out_tangents)) -def linearize(fun, *primals): +def linearize(fun: Callable, *primals): """Produce a linear approximation to `fun` using `jvp` and partial evaluation. Args: @@ -1257,7 +1271,7 @@ def _vjp_pullback_wrapper(fun, cotangent_dtypes, io_tree, py_args): return tree_unflatten(out_tree, ans) -def vjp(fun, *primals, **kwargs): +def vjp(fun: Callable, *primals, **kwargs): """Compute a (reverse-mode) vector-Jacobian product of `fun`. `grad` is implemented as a special case of `vjp`. @@ -1315,7 +1329,7 @@ def vjp(fun, *primals, **kwargs): return out_primal_py, vjp_py, tree_unflatten(aux_tree, aux) -def make_jaxpr(fun): +def make_jaxpr(fun: Callable): """Creates a function that produces its jaxpr given example args. Args: @@ -2007,7 +2021,7 @@ def __eq__(self, other): def __hash__(self): return hash((self.shape, self.dtype)) -def eval_shape(fun, *args, **kwargs): +def eval_shape(fun: Callable, *args, **kwargs): """Compute the shape/dtype of ``fun(*args, **kwargs)`` without any FLOPs. This utility function is useful for performing shape inference. Its @@ -2072,7 +2086,7 @@ def abstractify(x): return tree_unflatten(out_tree(), out) -def checkpoint(fun, concrete=False): +def checkpoint(fun: Callable, concrete: bool = False): @wraps(fun) def fun_remat(*args, **kwargs): args_flat, in_tree = tree_flatten((args, kwargs)) From 74faef18bfa9a102fe3a533e808fabb59ce3487e Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 6 Mar 2020 10:32:15 -0800 Subject: [PATCH 0827/1053] Rename "NeurIPS 2019 JAX demo" to "JAX demo", as it's been presented elsewhere. (#2372) --- .../{NeurIPS_2019_JAX_demo.ipynb => JAX_demo.ipynb} | 2 +- cloud_tpu_colabs/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename cloud_tpu_colabs/{NeurIPS_2019_JAX_demo.ipynb => JAX_demo.ipynb} (99%) diff --git a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb b/cloud_tpu_colabs/JAX_demo.ipynb similarity index 99% rename from cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb rename to cloud_tpu_colabs/JAX_demo.ipynb index 790c37fa9e83..6c210477294d 100644 --- a/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb +++ b/cloud_tpu_colabs/JAX_demo.ipynb @@ -3,7 +3,7 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "NeurIPS 2019 JAX demo.ipynb", + "name": "JAX demo.ipynb", "provenance": [], "collapsed_sections": [ "AvXl1WDPKjmV" diff --git a/cloud_tpu_colabs/README.md b/cloud_tpu_colabs/README.md index 1b3111d242e1..abbc13372820 100644 --- a/cloud_tpu_colabs/README.md +++ b/cloud_tpu_colabs/README.md @@ -24,8 +24,8 @@ Solve the wave equation with `pmap`, and make cool movies! The spatial domain is ![](https://raw.githubusercontent.com/google/jax/master/cloud_tpu_colabs/images/wave_movie.gif) -### [JAX Demo](https://colab.research.google.com/github/google/jax/blob/master/cloud_tpu_colabs/NeurIPS_2019_JAX_demo.ipynb) -An overview of JAX presented at the [Program Transformations for ML workshop at NeurIPS 2019](https://program-transformations.github.io/). Covers basic numpy usage, `grad`, `jit`, `vmap`, and `pmap`. +### [JAX Demo](https://colab.research.google.com/github/google/jax/blob/master/cloud_tpu_colabs/JAX_demo.ipynb) +An overview of JAX presented at the [Program Transformations for ML workshop at NeurIPS 2019](https://program-transformations.github.io/) and the [Compilers for ML workshop at CGO 2020](https://www.c4ml.org/). Covers basic numpy usage, `grad`, `jit`, `vmap`, and `pmap`. ## Performance notes From 61fca0d3ad66327e9ccc239a2e9ad61516846509 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 6 Mar 2020 14:59:51 -0500 Subject: [PATCH 0828/1053] Rename `lnp` to `jnp` in tests. (#2369) `jnp` is the preferred alias for jax.numpy, and we should be consistent. --- tests/lax_numpy_indexing_test.py | 24 +- tests/lax_numpy_test.py | 826 +++++++++++++++---------------- 2 files changed, 425 insertions(+), 425 deletions(-) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 823c4cdbb4e2..0a11933ba1cb 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -26,7 +26,7 @@ from jax import api from jax import lax -from jax import numpy as lnp +from jax import numpy as jnp from jax import ops from jax import test_util as jtu from jax import util @@ -412,7 +412,7 @@ def testStaticIndexing(self, shape, dtype, rng_factory, indexer): for rng_factory in [jtu.rand_default]) def testStaticIndexingGrads(self, shape, dtype, rng_factory, indexer): rng = rng_factory() - tol = 1e-2 if lnp.finfo(dtype).bits == 32 else None + tol = 1e-2 if jnp.finfo(dtype).bits == 32 else None arg = rng(shape, dtype) fun = lambda x: x[indexer]**2 check_grads(fun, (arg,), 2, tol, tol, tol) @@ -526,7 +526,7 @@ def fun(x, unpacked_indexer): for rng_factory in [jtu.rand_default]) def testDynamicIndexingWithIntegersGrads(self, shape, dtype, rng_factory, indexer): rng = rng_factory() - tol = 1e-2 if lnp.finfo(dtype).bits == 32 else None + tol = 1e-2 if jnp.finfo(dtype).bits == 32 else None unpacked_indexer, pack_indexer = self._ReplaceSlicesWithTuples(indexer) @api.jit @@ -606,7 +606,7 @@ def testAdvancedIntegerIndexing(self, shape, dtype, rng_factory, indexer): for rng_factory in [jtu.rand_default]) def testAdvancedIntegerIndexingGrads(self, shape, dtype, rng_factory, indexer): rng = rng_factory() - tol = 1e-2 if lnp.finfo(dtype).bits == 32 else None + tol = 1e-2 if jnp.finfo(dtype).bits == 32 else None arg = rng(shape, dtype) fun = lambda x: x[indexer]**2 check_grads(fun, (arg,), 2, tol, tol, tol) @@ -718,7 +718,7 @@ def testBooleanIndexingDynamicShapeError(self): self.assertRaises(IndexError, lambda: api.jit(lambda x, i: x[i])(x, i)) def testIssue187(self): - x = lnp.ones((5, 5)) + x = jnp.ones((5, 5)) x[[0, 2, 4], [0, 2, 4]] # doesn't crash x = onp.arange(25).reshape((5, 5)) @@ -729,9 +729,9 @@ def testIssue187(self): def testJVPOfGradOfIndexing(self): # Should return a value, even though we didn't pass a symbolic zero as the # index tangent. - x = lnp.ones((3, 4), lnp.float32) - i = lnp.ones((3,), lnp.int32) - f = lambda x, i: lnp.sum(x[i]) + x = jnp.ones((3, 4), jnp.float32) + i = jnp.ones((3,), jnp.int32) + f = lambda x, i: jnp.sum(x[i]) primals, tangents = api.jvp(api.grad(f), (x, i), (x, onp.zeros_like(i))) expected = onp.broadcast_to( onp.array([0, 3, 0], dtype=onp.float32)[:, None], (3, 4)) @@ -746,19 +746,19 @@ def testTrivialGatherIsntGenerated(self): def testBooleanIndexingWithEmptyResult(self): # based on a TensorFlow Probability test that started failing after #1622 - x = lnp.array([-1]) - mask = lnp.array([False]) + x = jnp.array([-1]) + mask = jnp.array([False]) ans = x[mask] # doesn't crash expected = onp.array([-1])[onp.array([False])] self.assertAllClose(ans, expected, check_dtypes=False) def testFloatIndexingError(self): - x = lnp.array([1, 2, 3]) + x = jnp.array([1, 2, 3]) self.assertRaises(TypeError, lambda: x[3.5]) def testIndexOutOfBounds(self): # https://github.com/google/jax/issues/2245 - array = lnp.ones(5) + array = jnp.ones(5) self.assertAllClose(array, array[:10], check_dtypes=True) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 67fb1180633d..b2ff24bf07c1 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -33,7 +33,7 @@ from jax import api from jax import lax from jax import linear_util -from jax import numpy as lnp +from jax import numpy as jnp from jax import test_util as jtu from jax import dtypes from jax import tree_util @@ -55,7 +55,7 @@ all_shapes = scalar_shapes + array_shapes float_dtypes = list(jtu.supported_dtypes().intersection( - {lnp.bfloat16, onp.float16, onp.float32, onp.float64})) + {jnp.bfloat16, onp.float16, onp.float32, onp.float64})) complex_dtypes = [onp.complex64, onp.complex128] int_dtypes = [onp.int32, onp.int64] uint_dtypes = [onp.uint32, onp.uint64] @@ -67,7 +67,7 @@ all_dtypes = number_dtypes + bool_dtypes -python_scalar_dtypes = [lnp.bool_, lnp.int_, lnp.float_, lnp.complex_] +python_scalar_dtypes = [jnp.bool_, jnp.int_, jnp.float_, jnp.complex_] def _valid_dtypes_for_shape(shape, dtypes): # Not all (shape, dtype) pairs are valid. In particular, Python scalars only @@ -103,7 +103,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("fabs", 1, float_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("float_power", 2, inexact_dtypes, all_shapes, partial(jtu.rand_default, scale=1), ["rev"], - tolerance={lnp.bfloat16: 1e-2, onp.float32: 1e-3, + tolerance={jnp.bfloat16: 1e-2, onp.float32: 1e-3, onp.float64: 1e-12, onp.complex64: 2e-4, onp.complex128: 1e-12}, check_dtypes=False), op_record("floor", 1, float_dtypes, all_shapes, jtu.rand_default, []), @@ -121,7 +121,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("minimum", 2, all_dtypes, all_shapes, jtu.rand_some_inf, []), op_record("multiply", 2, all_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("negative", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), - op_record("nextafter", 2, [f for f in float_dtypes if f != lnp.bfloat16], + op_record("nextafter", 2, [f for f in float_dtypes if f != jnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], inexact=True, tolerance=0), op_record("not_equal", 2, all_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), op_record("array_equal", 2, number_dtypes, all_shapes, jtu.rand_some_equal, ["rev"]), @@ -177,7 +177,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("divmod", 2, int_dtypes + float_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("exp2", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], - tolerance={lnp.bfloat16: 2e-2, onp.float16: 1e-2}, inexact=True), + tolerance={jnp.bfloat16: 2e-2, onp.float16: 1e-2}, inexact=True), # TODO(b/142975473): on CPU, expm1 for float64 is only accurate to ~float32 # precision. op_record("expm1", 1, number_dtypes, all_shapes, jtu.rand_positive, [], @@ -233,7 +233,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("sign", 1, number_dtypes + uint_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), - op_record("sinc", 1, [t for t in number_dtypes if t != lnp.bfloat16], + op_record("sinc", 1, [t for t in number_dtypes if t != jnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], tolerance={onp.complex64: 1e-5}, inexact=True, check_dtypes=False), @@ -352,7 +352,7 @@ class _OverrideNothing(object): numpy_version = tuple(map(int, onp.version.version.split('.'))) if numpy_version >= (1, 15): JAX_COMPOUND_OP_RECORDS += [ - op_record("isclose", 2, [t for t in all_dtypes if t != lnp.bfloat16], + op_record("isclose", 2, [t for t in all_dtypes if t != jnp.bfloat16], all_shapes, jtu.rand_small_positive, []), op_record("gcd", 2, int_dtypes, all_shapes, jtu.rand_default, []), op_record("lcm", 2, int_dtypes, all_shapes, jtu.rand_default, []), @@ -367,8 +367,8 @@ class _OverrideNothing(object): def _dtypes_are_compatible_for_bitwise_ops(args): if len(args) <= 1: return True - is_signed = lambda dtype: lnp.issubdtype(dtype, onp.signedinteger) - width = lambda dtype: lnp.iinfo(dtype).bits + is_signed = lambda dtype: jnp.issubdtype(dtype, onp.signedinteger) + width = lambda dtype: jnp.iinfo(dtype).bits x, y = args if width(x) > width(y): x, y = y, x @@ -392,20 +392,20 @@ def _shapes_are_equal_length(shapes): return all(len(shape) == len(shapes[0]) for shape in shapes[1:]) -def _promote_like_lnp(fun, inexact=False): - """Decorator that promotes the arguments of `fun` to `lnp.result_type(*args)`. +def _promote_like_jnp(fun, inexact=False): + """Decorator that promotes the arguments of `fun` to `jnp.result_type(*args)`. - lnp and onp have different type promotion semantics; this decorator allows - tests make an onp reference implementation act more like an lnp + jnp and onp have different type promotion semantics; this decorator allows + tests make an onp reference implementation act more like an jnp implementation. """ def wrapper(*args, **kw): flat_args = tree_util.tree_leaves(args) - if inexact and not any(lnp.issubdtype(lnp.result_type(x), lnp.inexact) + if inexact and not any(jnp.issubdtype(jnp.result_type(x), jnp.inexact) for x in flat_args): - dtype = lnp.result_type(lnp.float_, *flat_args) + dtype = jnp.result_type(jnp.float_, *flat_args) else: - dtype = lnp.result_type(*flat_args) + dtype = jnp.result_type(*flat_args) args = tree_util.tree_map(lambda a: onp.asarray(a, dtype), args) return fun(*args, **kw) return wrapper @@ -416,11 +416,11 @@ class LaxBackedNumpyTests(jtu.JaxTestCase): def _GetArgsMaker(self, rng, shapes, dtypes, onp_arrays=True): def f(): - out = [rng(shape, dtype or lnp.float_) + out = [rng(shape, dtype or jnp.float_) for shape, dtype in zip(shapes, dtypes)] if onp_arrays: return out - return [lnp.asarray(a) if isinstance(a, (onp.ndarray, onp.generic)) else a + return [jnp.asarray(a) if isinstance(a, (onp.ndarray, onp.generic)) else a for a in out] return f @@ -429,7 +429,7 @@ def f(): {"testcase_name": jtu.format_test_name_suffix(rec.test_name, shapes, dtypes), "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, - "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), + "onp_op": getattr(onp, rec.name), "jnp_op": getattr(jnp, rec.name), "check_dtypes": rec.check_dtypes, "tolerance": rec.tolerance, "inexact": rec.inexact} for shapes in filter( @@ -439,16 +439,16 @@ def f(): *(_valid_dtypes_for_shape(s, rec.dtypes) for s in shapes))) for rec in itertools.chain(JAX_ONE_TO_ONE_OP_RECORDS, JAX_COMPOUND_OP_RECORDS))) - def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, + def testOp(self, onp_op, jnp_op, rng_factory, shapes, dtypes, check_dtypes, tolerance, inexact): rng = rng_factory() args_maker = self._GetArgsMaker(rng, shapes, dtypes, onp_arrays=False) tol = max(jtu.tolerance(dtype, tolerance) for dtype in dtypes) tol = functools.reduce(jtu.join_tolerance, [tolerance, tol, jtu.default_tolerance()]) - self._CheckAgainstNumpy(_promote_like_lnp(onp_op, inexact), lnp_op, + self._CheckAgainstNumpy(_promote_like_jnp(onp_op, inexact), jnp_op, args_maker, check_dtypes=check_dtypes, tol=tol) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=check_dtypes, + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=check_dtypes, atol=tol, rtol=tol) @parameterized.named_parameters(itertools.chain.from_iterable( @@ -465,8 +465,8 @@ def testOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes, check_dtypes, for rec in JAX_OPERATOR_OVERLOADS)) def testOperatorOverload(self, name, rng_factory, shapes, dtypes, tol): rng = rng_factory() - # onp and lnp arrays have different type promotion rules; force the use of - # lnp arrays. + # onp and jnp arrays have different type promotion rules; force the use of + # jnp arrays. args_maker = self._GetArgsMaker(rng, shapes, dtypes, onp_arrays=False) fun = lambda *xs: getattr(operator, name.strip('_'))(*xs) scalar_arg = (jtu.PYTHON_SCALAR_SHAPE in shapes or @@ -538,7 +538,7 @@ def testBinaryOperatorDefers(self, op_name, rng_factory, dtype): {"testcase_name": jtu.format_test_name_suffix( rec.test_name, shapes, dtypes), "rng_factory": rec.rng_factory, "shapes": shapes, "dtypes": dtypes, - "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name)} + "onp_op": getattr(onp, rec.name), "jnp_op": getattr(jnp, rec.name)} for shapes in filter( _shapes_are_broadcast_compatible, CombosWithReplacement(rec.shapes, rec.nargs)) @@ -546,15 +546,15 @@ def testBinaryOperatorDefers(self, op_name, rng_factory, dtype): _dtypes_are_compatible_for_bitwise_ops, CombosWithReplacement(rec.dtypes, rec.nargs))) for rec in JAX_BITWISE_OP_RECORDS)) - def testBitwiseOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes): + def testBitwiseOp(self, onp_op, jnp_op, rng_factory, shapes, dtypes): rng = rng_factory() if not FLAGS.jax_enable_x64 and any( - lnp.iinfo(dtype).bits == 64 for dtype in dtypes): + jnp.iinfo(dtype).bits == 64 for dtype in dtypes): self.skipTest("x64 types are disabled by jax_enable_x64") args_maker = self._GetArgsMaker(rng, shapes, dtypes) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=jtu.PYTHON_SCALAR_SHAPE not in shapes) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(itertools.chain.from_iterable( jtu.cases_from_list( @@ -563,31 +563,31 @@ def testBitwiseOp(self, onp_op, lnp_op, rng_factory, shapes, dtypes): jtu.format_shape_dtype_string(shape, dtype), axis, "None" if out_dtype is None else onp.dtype(out_dtype).name, keepdims), "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, - "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), + "onp_op": getattr(onp, rec.name), "jnp_op": getattr(jnp, rec.name), "axis": axis, "keepdims": keepdims, "inexact": rec.inexact} for shape in rec.shapes for dtype in rec.dtypes for out_dtype in [None] + rec.dtypes for axis in set(range(-len(shape), len(shape))) | set([None]) for keepdims in [False, True]) for rec in JAX_REDUCER_RECORDS)) - def testReducer(self, onp_op, lnp_op, rng_factory, shape, dtype, out_dtype, + def testReducer(self, onp_op, jnp_op, rng_factory, shape, dtype, out_dtype, axis, keepdims, inexact): rng = rng_factory() def onp_fun(x): - x_cast = x if dtype != lnp.bfloat16 else x.astype(onp.float32) - t = out_dtype if out_dtype != lnp.bfloat16 else onp.float32 + x_cast = x if dtype != jnp.bfloat16 else x.astype(onp.float32) + t = out_dtype if out_dtype != jnp.bfloat16 else onp.float32 return onp_op(x_cast, axis, dtype=t, keepdims=keepdims) - onp_fun = _promote_like_lnp(onp_fun, inexact) - lnp_fun = lambda x: lnp_op(x, axis, dtype=out_dtype, keepdims=keepdims) + onp_fun = _promote_like_jnp(onp_fun, inexact) + jnp_fun = lambda x: jnp_op(x, axis, dtype=out_dtype, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] tol_spec = {onp.float16: 1e-2, onp.float32: 1e-3, onp.complex64: 1e-3, onp.float64: 1e-5, onp.complex128: 1e-5} tol = jtu.tolerance(dtype, tol_spec) tol = max(tol, jtu.tolerance(out_dtype, tol_spec)) if out_dtype else tol - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, - check_dtypes=lnp.bfloat16 not in (dtype, out_dtype), + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, + check_dtypes=jnp.bfloat16 not in (dtype, out_dtype), tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( @@ -595,21 +595,21 @@ def onp_fun(x): rec.test_name.capitalize(), jtu.format_shape_dtype_string(shape, dtype), axis, keepdims), "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, - "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), + "onp_op": getattr(onp, rec.name), "jnp_op": getattr(jnp, rec.name), "axis": axis, "keepdims": keepdims, "inexact": rec.inexact} for rec in JAX_REDUCER_NO_DTYPE_RECORDS for shape in rec.shapes for dtype in rec.dtypes for axis in set(range(-len(shape), len(shape))) | set([None]) for keepdims in [False, True])) - def testReducerNoDtype(self, onp_op, lnp_op, rng_factory, shape, dtype, axis, + def testReducerNoDtype(self, onp_op, jnp_op, rng_factory, shape, dtype, axis, keepdims, inexact): rng = rng_factory() onp_fun = lambda x: onp_op(x, axis, keepdims=keepdims) - onp_fun = _promote_like_lnp(onp_fun, inexact) - lnp_fun = lambda x: lnp_op(x, axis, keepdims=keepdims) + onp_fun = _promote_like_jnp(onp_fun, inexact) + jnp_fun = lambda x: jnp_op(x, axis, keepdims=keepdims) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}".format( @@ -620,10 +620,10 @@ def testReducerNoDtype(self, onp_op, lnp_op, rng_factory, shape, dtype, axis, def testCountNonzero(self, shape, dtype, axis): rng = jtu.rand_some_zero() onp_fun = lambda x: onp.count_nonzero(x, axis) - lnp_fun = lambda x: lnp.count_nonzero(x, axis) + jnp_fun = lambda x: jnp.count_nonzero(x, axis) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format( @@ -633,34 +633,34 @@ def testCountNonzero(self, shape, dtype, axis): def testNonzero(self, shape, dtype): rng = jtu.rand_some_zero() onp_fun = lambda x: onp.nonzero(x) - lnp_fun = lambda x: lnp.nonzero(x) + jnp_fun = lambda x: jnp.nonzero(x) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "{}_inshape={}_axis={}".format( rec.test_name.capitalize(), jtu.format_shape_dtype_string(shape, dtype), axis), "rng_factory": rec.rng_factory, "shape": shape, "dtype": dtype, - "onp_op": getattr(onp, rec.name), "lnp_op": getattr(lnp, rec.name), + "onp_op": getattr(onp, rec.name), "jnp_op": getattr(jnp, rec.name), "axis": axis} for rec in JAX_ARGMINMAX_RECORDS for shape, dtype in _shape_and_dtypes(rec.shapes, rec.dtypes) for axis in range(-len(shape), len(shape)))) - def testArgMinMax(self, onp_op, lnp_op, rng_factory, shape, dtype, axis): + def testArgMinMax(self, onp_op, jnp_op, rng_factory, shape, dtype, axis): rng = rng_factory() if dtype == onp.complex128 and jtu.device_under_test() == "gpu": raise unittest.SkipTest("complex128 reductions not supported on GPU") def onp_fun(array_to_reduce): - return onp_op(array_to_reduce, axis).astype(lnp.int_) + return onp_op(array_to_reduce, axis).astype(jnp.int_) - def lnp_fun(array_to_reduce): - return lnp_op(array_to_reduce, axis) + def jnp_fun(array_to_reduce): + return jnp_op(array_to_reduce, axis) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_{}_{}".format( @@ -688,18 +688,18 @@ def testCross(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factor rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] axisa, axisb, axisc, axis = axes - lnp_fun = lambda a, b: lnp.cross(a, b, axisa, axisb, axisc, axis) + jnp_fun = lambda a, b: jnp.cross(a, b, axisa, axisb, axisc, axis) def onp_fun(a, b): - a = a.astype(onp.float32) if lhs_dtype == lnp.bfloat16 else a - b = b.astype(onp.float32) if rhs_dtype == lnp.bfloat16 else b + a = a.astype(onp.float32) if lhs_dtype == jnp.bfloat16 else a + b = b.astype(onp.float32) if rhs_dtype == jnp.bfloat16 else b out = onp.cross(a, b, axisa, axisb, axisc, axis) - return out.astype(lnp.promote_types(lhs_dtype, rhs_dtype)) + return out.astype(jnp.promote_types(lhs_dtype, rhs_dtype)) tol_spec = {dtypes.bfloat16: 3e-1, onp.float16: 0.15} tol = max(jtu.tolerance(lhs_dtype, tol_spec), jtu.tolerance(rhs_dtype, tol_spec)) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( @@ -731,12 +731,12 @@ def testDot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): if jtu.device_under_test() == "tpu": tol[onp.float32] = tol[onp.complex64] = 2e-1 def onp_dot(x, y): - x = x.astype(onp.float32) if lhs_dtype == lnp.bfloat16 else x - y = y.astype(onp.float32) if rhs_dtype == lnp.bfloat16 else y - return onp.dot(x, y).astype(lnp.promote_types(lhs_dtype, rhs_dtype)) - self._CheckAgainstNumpy(onp_dot, lnp.dot, args_maker, check_dtypes=True, + x = x.astype(onp.float32) if lhs_dtype == jnp.bfloat16 else x + y = y.astype(onp.float32) if rhs_dtype == jnp.bfloat16 else y + return onp.dot(x, y).astype(jnp.promote_types(lhs_dtype, rhs_dtype)) + self._CheckAgainstNumpy(onp_dot, jnp.dot, args_maker, check_dtypes=True, tol=tol) - self._CompileAndCheck(lnp.dot, args_maker, check_dtypes=True, atol=tol, + self._CompileAndCheck(jnp.dot, args_maker, check_dtypes=True, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( @@ -763,16 +763,16 @@ def onp_dot(x, y): def testMatmul(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() def onp_fun(x, y): - dtype = lnp.promote_types(lhs_dtype, rhs_dtype) + dtype = jnp.promote_types(lhs_dtype, rhs_dtype) return onp.matmul(x, y).astype(dtype) args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] tol = {onp.float16: 1e-2, onp.float32: 2e-2, onp.float64: 1e-12, onp.complex128: 1e-12} if jtu.device_under_test() == "tpu": tol[onp.float32] = tol[onp.complex64] = 4e-2 - self._CheckAgainstNumpy(onp_fun, lnp.matmul, args_maker, + self._CheckAgainstNumpy(onp_fun, jnp.matmul, args_maker, check_dtypes=True, tol=tol) - self._CompileAndCheck(lnp.matmul, args_maker, check_dtypes=True, atol=tol, + self._CompileAndCheck(jnp.matmul, args_maker, check_dtypes=True, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( @@ -796,26 +796,26 @@ def onp_fun(x, y): def testTensordot(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, axes, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] - lnp_fun = lambda a, b: lnp.tensordot(a, b, axes) + jnp_fun = lambda a, b: jnp.tensordot(a, b, axes) def onp_fun(a, b): - a = a if lhs_dtype != lnp.bfloat16 else a.astype(onp.float32) - b = b if rhs_dtype != lnp.bfloat16 else b.astype(onp.float32) - dtype = lnp.promote_types(lhs_dtype, rhs_dtype) + a = a if lhs_dtype != jnp.bfloat16 else a.astype(onp.float32) + b = b if rhs_dtype != jnp.bfloat16 else b.astype(onp.float32) + dtype = jnp.promote_types(lhs_dtype, rhs_dtype) return onp.tensordot(a, b, axes).astype(dtype) tol = {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-12, onp.complex64: 1e-3, onp.complex128: 1e-12} if jtu.device_under_test() == "tpu": tol[onp.float32] = tol[onp.complex64] = 2e-1 - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) def testTensordotErrors(self): a = onp.random.random((3, 2, 2)) b = onp.random.random((2,)) self.assertRaisesRegex( TypeError, "Number of tensordot axes.*exceeds input ranks.*", - lambda: lnp.tensordot(a, b, axes=2)) + lambda: jnp.tensordot(a, b, axes=2)) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_{}".format( @@ -834,20 +834,20 @@ def testInner(self, lhs_shape, lhs_dtype, rhs_shape, rhs_dtype, rng_factory): rng = rng_factory() args_maker = lambda: [rng(lhs_shape, lhs_dtype), rng(rhs_shape, rhs_dtype)] def onp_fun(lhs, rhs): - lhs = lhs if lhs_dtype != lnp.bfloat16 else lhs.astype(onp.float32) - rhs = rhs if rhs_dtype != lnp.bfloat16 else rhs.astype(onp.float32) - dtype = lnp.promote_types(lhs_dtype, rhs_dtype) + lhs = lhs if lhs_dtype != jnp.bfloat16 else lhs.astype(onp.float32) + rhs = rhs if rhs_dtype != jnp.bfloat16 else rhs.astype(onp.float32) + dtype = jnp.promote_types(lhs_dtype, rhs_dtype) return onp.inner(lhs, rhs).astype(dtype) - lnp_fun = lambda lhs, rhs: lnp.inner(lhs, rhs) + jnp_fun = lambda lhs, rhs: jnp.inner(lhs, rhs) tol_spec = {onp.float16: 1e-2, onp.float32: 1e-5, onp.float64: 1e-13} if jtu.device_under_test() == "tpu": tol_spec[onp.float32] = tol_spec[onp.complex64] = 2e-1 tol = max(jtu.tolerance(lhs_dtype, tol_spec), jtu.tolerance(rhs_dtype, tol_spec)) # TODO(phawkins): there are float32/float64 disagreements for some inputs. - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=False, atol=tol, + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=False, atol=tol, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( @@ -863,11 +863,11 @@ def onp_fun(lhs, rhs): def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.clip(x, a_min=a_min, a_max=a_max) - lnp_fun = lambda x: lnp.clip(x, a_min=a_min, a_max=a_max) + jnp_fun = lambda x: jnp.clip(x, a_min=a_min, a_max=a_max) args_maker = lambda: [rng(shape, dtype)] # TODO(phawkins): the promotion behavior changed in Numpy 1.17. - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_decimals={}".format( @@ -878,31 +878,31 @@ def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng_factory): for decimals in [0, 1, -2])) def testRoundStaticDecimals(self, shape, dtype, decimals, rng_factory): rng = rng_factory() - if lnp.issubdtype(dtype, onp.integer) and decimals < 0: + if jnp.issubdtype(dtype, onp.integer) and decimals < 0: self.skipTest("Integer rounding with decimals < 0 not implemented") onp_fun = lambda x: onp.round(x, decimals=decimals) - lnp_fun = lambda x: lnp.round(x, decimals=decimals) + jnp_fun = lambda x: jnp.round(x, decimals=decimals) args_maker = lambda: [rng(shape, dtype)] - tol = {lnp.bfloat16: 5e-2, onp.float16: 1e-2} + tol = {jnp.bfloat16: 5e-2, onp.float16: 1e-2} check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=check_dtypes, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=check_dtypes, + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=check_dtypes, atol=tol, rtol=tol) def testOperatorRound(self): self.assertAllClose(round(onp.float32(7.532), 1), - round(lnp.float32(7.5), 1), check_dtypes=True) + round(jnp.float32(7.5), 1), check_dtypes=True) self.assertAllClose(round(onp.float32(1.234), 2), - round(lnp.float32(1.234), 2), check_dtypes=True) + round(jnp.float32(1.234), 2), check_dtypes=True) self.assertAllClose(round(onp.float32(1.234)), - round(lnp.float32(1.234)), check_dtypes=False) + round(jnp.float32(1.234)), check_dtypes=False) self.assertAllClose(round(onp.float32(7.532), 1), - round(lnp.array(7.5, lnp.float32), 1), check_dtypes=True) + round(jnp.array(7.5, jnp.float32), 1), check_dtypes=True) self.assertAllClose(round(onp.float32(1.234), 2), - round(lnp.array(1.234, lnp.float32), 2), check_dtypes=True) + round(jnp.array(1.234, jnp.float32), 2), check_dtypes=True) self.assertAllClose(round(onp.float32(1.234)), - round(lnp.array(1.234, lnp.float32)), + round(jnp.array(1.234, jnp.float32)), check_dtypes=False) @parameterized.named_parameters(jtu.cases_from_list( @@ -934,8 +934,8 @@ def onp_fun(x, kwargs): if pad_width.size == 0: return x return onp.pad(x, pad_width, mode=mode, **kwargs) - def lnp_fun(x, kwargs): - return lnp.pad(x, pad_width, mode=mode, **kwargs) + def jnp_fun(x, kwargs): + return jnp.pad(x, pad_width, mode=mode, **kwargs) def args_maker(): kwargs = {} @@ -944,9 +944,9 @@ def args_maker(): [len(shape), 2][2 - constant_values_rank:], dtype) return rng(shape, dtype), kwargs - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=shape is not jtu.PYTHON_SCALAR_SHAPE) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape=[{}]_reps={}".format( @@ -959,13 +959,13 @@ def args_maker(): def testTile(self, shape, dtype, reps, rng_factory): rng = rng_factory() onp_fun = lambda arg: onp.tile(arg, reps) - lnp_fun = lambda arg: lnp.tile(arg, reps) + jnp_fun = lambda arg: jnp.tile(arg, reps) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=shape is not jtu.PYTHON_SCALAR_SHAPE) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_axis={}_baseshape=[{}]_dtypes=[{}]".format( @@ -983,17 +983,17 @@ def testConcatenate(self, axis, base_shape, arg_dtypes, rng_factory): shapes = [base_shape[:wrapped_axis] + (size,) + base_shape[wrapped_axis+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), arg_dtypes)] def onp_fun(*args): - args = [x if x.dtype != lnp.bfloat16 else x.astype(onp.float32) + args = [x if x.dtype != jnp.bfloat16 else x.astype(onp.float32) for x in args] - dtype = functools.reduce(lnp.promote_types, arg_dtypes) + dtype = functools.reduce(jnp.promote_types, arg_dtypes) return onp.concatenate(args, axis=axis).astype(dtype) - lnp_fun = lambda *args: lnp.concatenate(args, axis=axis) + jnp_fun = lambda *args: jnp.concatenate(args, axis=axis) def args_maker(): return [rng(shape, dtype) for shape, dtype in zip(shapes, arg_dtypes)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_axis={}_baseshape=[{}]_dtypes=[{}]".format( @@ -1010,18 +1010,18 @@ def testAppend(self, axis, base_shape, arg_dtypes, rng_factory): shapes = [base_shape[:wrapped_axis] + (size,) + base_shape[wrapped_axis+1:] for size, _ in zip(itertools.cycle([3, 1, 4]), arg_dtypes)] def onp_fun(arr, values): - arr = arr.astype(onp.float32) if arr.dtype == lnp.bfloat16 else arr - values = (values.astype(onp.float32) if values.dtype == lnp.bfloat16 + arr = arr.astype(onp.float32) if arr.dtype == jnp.bfloat16 else arr + values = (values.astype(onp.float32) if values.dtype == jnp.bfloat16 else values) out = onp.append(arr, values, axis=axis) - return out.astype(lnp.promote_types(*arg_dtypes)) - lnp_fun = lambda arr, values: lnp.append(arr, values, axis=axis) + return out.astype(jnp.promote_types(*arg_dtypes)) + jnp_fun = lambda arr, values: jnp.append(arr, values, axis=axis) def args_maker(): return [rng(shape, dtype) for shape, dtype in zip(shapes, arg_dtypes)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape=[{}]_axis={}_repeats={}".format( @@ -1034,13 +1034,13 @@ def args_maker(): def testRepeat(self, axis, shape, dtype, repeats, rng_factory): rng = rng_factory() onp_fun = lambda arg: onp.repeat(arg, repeats=repeats, axis=axis) - onp_fun = _promote_like_lnp(onp_fun) - lnp_fun = lambda arg: lnp.repeat(arg, repeats=repeats, axis=axis) + onp_fun = _promote_like_jnp(onp_fun) + jnp_fun = lambda arg: jnp.repeat(arg, repeats=repeats, axis=axis) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) def testIssue1233(self): ''' @@ -1049,27 +1049,27 @@ def testIssue1233(self): tol = 1e-5 def test_single(m, args_maker, repeats, axis): - lax_ans = lnp.repeat(m, repeats, axis) + lax_ans = jnp.repeat(m, repeats, axis) numpy_ans = onp.repeat(m, repeats, axis) self.assertAllClose(lax_ans, numpy_ans, check_dtypes=True, rtol=tol, atol=tol) - lnp_fun = lambda arg: lnp.repeat(arg, repeats = repeats, axis=axis) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + jnp_fun = lambda arg: jnp.repeat(arg, repeats = repeats, axis=axis) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) - m = lnp.array([1,2,3,4,5,6]) + m = jnp.array([1,2,3,4,5,6]) args_maker = lambda: [m] - for repeats in [2, [1,3,2,1,1,2], [1,3,0,1,1,2], [2], lnp.array([1,3,2,1,1,2]), lnp.array([2])]: + for repeats in [2, [1,3,2,1,1,2], [1,3,0,1,1,2], [2], jnp.array([1,3,2,1,1,2]), jnp.array([2])]: test_single(m, args_maker, repeats, None) m_rect = m.reshape((2,3)) args_maker = lambda: [m_rect] - for repeats in [2, [2,1], [2], lnp.array([2,1]), lnp.array([2])]: + for repeats in [2, [2,1], [2], jnp.array([2,1]), jnp.array([2])]: test_single(m_rect, args_maker, repeats, axis=0) - for repeats in [2, [1,3,2], [2], lnp.array([1,3,2]), lnp.array([2])]: + for repeats in [2, [1,3,2], [2], jnp.array([1,3,2]), jnp.array([2])]: test_single(m_rect, args_maker, repeats, axis=1) def testIssue2330(self): @@ -1078,45 +1078,45 @@ def testIssue2330(self): ''' def attempt_sideeffect(x): x = [x] - x = lnp.concatenate(x) + x = jnp.concatenate(x) x -= 1. return x onp_input = onp.ones((1)) - lnp_input = lnp.ones((1)) + jnp_input = jnp.ones((1)) expected_onp_input_after_call = onp.ones((1)) - expected_lnp_input_after_call = lnp.ones((1)) + expected_jnp_input_after_call = jnp.ones((1)) - self.assertTrue(type(lnp.concatenate([onp_input])) is lnp.DeviceArray) + self.assertTrue(type(jnp.concatenate([onp_input])) is jnp.DeviceArray) attempt_sideeffect(onp_input) - attempt_sideeffect(lnp_input) + attempt_sideeffect(jnp_input) self.assertAllClose(onp_input, expected_onp_input_after_call, check_dtypes=True) - self.assertAllClose(lnp_input, expected_lnp_input_after_call, check_dtypes=True) + self.assertAllClose(jnp_input, expected_jnp_input_after_call, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "op={}_shape=[{}]_axis={}_out_dtype={}".format( op, jtu.format_shape_dtype_string(shape, dtype), axis, out_dtype), "axis": axis, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, - "rng_factory": jtu.rand_default, "lnp_op": getattr(lnp, op), + "rng_factory": jtu.rand_default, "jnp_op": getattr(jnp, op), "onp_op": getattr(onp, op)} for op in ["cumsum", "cumprod"] for dtype in all_dtypes for out_dtype in default_dtypes for shape in all_shapes for axis in [None] + list(range(-len(shape), len(shape))))) - def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, lnp_op, rng_factory): + def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, jnp_op, rng_factory): rng = rng_factory() onp_fun = lambda arg: onp_op(arg, axis=axis, dtype=out_dtype) - lnp_fun = lambda arg: lnp_op(arg, axis=axis, dtype=out_dtype) + jnp_fun = lambda arg: jnp_op(arg, axis=axis, dtype=out_dtype) args_maker = lambda: [rng(shape, dtype)] tol = max(jtu.tolerance(dtype), jtu.tolerance(out_dtype)) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_dtype={}_m={}_n={}_k={}".format( @@ -1129,10 +1129,10 @@ def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, lnp_op, rng_fact def testTri(self, m, n, k, dtype, rng_factory): rng = rng_factory() onp_fun = lambda: onp.tri(n, M=m, k=k, dtype=dtype) - lnp_fun = lambda: lnp.tri(n, M=m, k=k, dtype=dtype) + jnp_fun = lambda: jnp.tri(n, M=m, k=k, dtype=dtype) args_maker = lambda: [] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_shape={}_k={}".format( @@ -1146,10 +1146,10 @@ def testTri(self, m, n, k, dtype, rng_factory): def testTriLU(self, dtype, shape, op, k, rng_factory): rng = rng_factory() onp_fun = lambda arg: getattr(onp, op)(arg, k=k) - lnp_fun = lambda arg: getattr(lnp, op)(arg, k=k) + jnp_fun = lambda arg: getattr(jnp, op)(arg, k=k) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_ndim={}_n={}".format(ndim, n), @@ -1158,7 +1158,7 @@ def testTriLU(self, dtype, shape, op, k, rng_factory): for n in [0, 1, 7])) def testDiagIndices(self, ndim, n): onp.testing.assert_equal(onp.diag_indices(n, ndim), - lnp.diag_indices(n, ndim)) + jnp.diag_indices(n, ndim)) @parameterized.named_parameters(jtu.cases_from_list( @@ -1171,10 +1171,10 @@ def testDiagIndices(self, ndim, n): def testDiag(self, shape, dtype, k, rng_factory): rng = rng_factory() onp_fun = lambda arg: onp.diag(arg, k) - lnp_fun = lambda arg: lnp.diag(arg, k) + jnp_fun = lambda arg: jnp.diag(arg, k) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_offset={}_axis1={}_axis2={}".format( @@ -1190,10 +1190,10 @@ def testDiag(self, shape, dtype, k, rng_factory): def testDiagonal(self, shape, dtype, offset, axis1, axis2, rng_factory): rng = rng_factory() onp_fun = lambda arg: onp.diagonal(arg, offset, axis1, axis2) - lnp_fun = lambda arg: lnp.diagonal(arg, offset, axis1, axis2) + jnp_fun = lambda arg: jnp.diagonal(arg, offset, axis1, axis2) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_n={}".format(onp.dtype(dtype).name, n), @@ -1202,10 +1202,10 @@ def testDiagonal(self, shape, dtype, offset, axis1, axis2, rng_factory): for n in list(range(4)))) def testIdentity(self, n, dtype): onp_fun = lambda: onp.identity(n, dtype) - lnp_fun = lambda: lnp.identity(n, dtype) + jnp_fun = lambda: jnp.identity(n, dtype) args_maker = lambda: [] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_dtype_{}_offset={}_axis1={}_axis2={}".format( @@ -1223,14 +1223,14 @@ def testIdentity(self, n, dtype): def testTrace(self, shape, dtype, out_dtype, offset, axis1, axis2, rng_factory): rng = rng_factory() def onp_fun(arg): - if out_dtype == lnp.bfloat16: - return onp.trace(arg, offset, axis1, axis2, onp.float32).astype(lnp.bfloat16) + if out_dtype == jnp.bfloat16: + return onp.trace(arg, offset, axis1, axis2, onp.float32).astype(jnp.bfloat16) else: return onp.trace(arg, offset, axis1, axis2, out_dtype) - lnp_fun = lambda arg: lnp.trace(arg, offset, axis1, axis2, out_dtype) + jnp_fun = lambda arg: jnp.trace(arg, offset, axis1, axis2, out_dtype) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_axis={}".format( @@ -1249,9 +1249,9 @@ def onp_fun(arg): def testStack(self, shape, axis, dtypes, rng_factory): rng = rng_factory() args_maker = lambda: [[rng(shape, dtype) for dtype in dtypes]] - onp_fun = _promote_like_lnp(partial(onp.stack, axis=axis)) - lnp_fun = partial(lnp.stack, axis=axis) - self._CheckAgainstNumpy(lnp_fun, onp_fun, args_maker, check_dtypes=True) + onp_fun = _promote_like_jnp(partial(onp.stack, axis=axis)) + jnp_fun = partial(jnp.stack, axis=axis) + self._CheckAgainstNumpy(jnp_fun, onp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -1271,9 +1271,9 @@ def testStack(self, shape, axis, dtypes, rng_factory): def testHVDStack(self, shape, op, dtypes, rng_factory): rng = rng_factory() args_maker = lambda: [[rng(shape, dtype) for dtype in dtypes]] - onp_fun = _promote_like_lnp(getattr(onp, op)) - lnp_fun = getattr(lnp, op) - self._CheckAgainstNumpy(lnp_fun, onp_fun, args_maker, check_dtypes=True) + onp_fun = _promote_like_jnp(getattr(onp, op)) + jnp_fun = getattr(jnp, op) + self._CheckAgainstNumpy(jnp_fun, onp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outdtype={}".format( @@ -1287,27 +1287,27 @@ def testHVDStack(self, shape, op, dtypes, rng_factory): def testFull(self, shape, fill_value_dtype, out_dtype, rng_factory): rng = rng_factory() onp_fun = lambda fill_value: onp.full(shape, fill_value, dtype=out_dtype) - lnp_fun = lambda fill_value: lnp.full(shape, fill_value, dtype=out_dtype) + jnp_fun = lambda fill_value: jnp.full(shape, fill_value, dtype=out_dtype) args_maker = lambda: [rng((), fill_value_dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters( jtu.cases_from_list( {"testcase_name": ("_op={}_shape={}_dtype={}").format(op, shape, dtype), - "onp_op": getattr(onp, op), "lnp_op": getattr(lnp, op), + "onp_op": getattr(onp, op), "jnp_op": getattr(jnp, op), "shape": shape, "dtype": dtype} for op in ["zeros", "ones"] for shape in [2, (), (2,), (3, 0), onp.array((4, 5, 6), dtype=onp.int32), onp.array(4, dtype=onp.int32)] for dtype in all_dtypes)) - def testZerosOnes(self, onp_op, lnp_op, shape, dtype): + def testZerosOnes(self, onp_op, jnp_op, shape, dtype): rng = jtu.rand_default() def args_maker(): return [] onp_op = partial(onp_op, shape, dtype) - lnp_op = partial(lnp_op, shape, dtype) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + jnp_op = partial(jnp_op, shape, dtype) + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_filldtype={}_outdtype={}".format( @@ -1324,10 +1324,10 @@ def args_maker(): return [] def testFullLike(self, shape, in_dtype, fill_value_dtype, out_dtype, rng_factory): rng = rng_factory() onp_fun = lambda x, fill_value: onp.full_like(x, fill_value, dtype=out_dtype) - lnp_fun = lambda x, fill_value: lnp.full_like(x, fill_value, dtype=out_dtype) + jnp_fun = lambda x, fill_value: jnp.full_like(x, fill_value, dtype=out_dtype) args_maker = lambda: [rng(shape, in_dtype), rng((), fill_value_dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_axis={}_{}sections".format( @@ -1341,10 +1341,10 @@ def testFullLike(self, shape, in_dtype, fill_value_dtype, out_dtype, rng_factory def testSplitStaticInt(self, shape, num_sections, axis, dtype, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.split(x, num_sections, axis=axis) - lnp_fun = lambda x: lnp.split(x, num_sections, axis=axis) + jnp_fun = lambda x: jnp.split(x, num_sections, axis=axis) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_axis={}_{}sections".format( @@ -1367,10 +1367,10 @@ def fn(module, axis): return module.dsplit onp_fun = lambda x: fn(onp, axis)(x, num_sections) - lnp_fun = lambda x: fn(lnp, axis)(x, num_sections) + jnp_fun = lambda x: fn(jnp, axis)(x, num_sections) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_order={}".format( @@ -1394,10 +1394,10 @@ def fn(module, axis): def testReshape(self, arg_shape, out_shape, dtype, order, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.reshape(x, out_shape, order=order) - lnp_fun = lambda x: lnp.reshape(x, out_shape, order=order) + jnp_fun = lambda x: jnp.reshape(x, out_shape, order=order) args_maker = lambda: [rng(arg_shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}".format( @@ -1414,10 +1414,10 @@ def testReshape(self, arg_shape, out_shape, dtype, order, rng_factory): def testReshapeMethod(self, arg_shape, out_shape, dtype, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.reshape(x, out_shape) - lnp_fun = lambda x: x.reshape(*out_shape) + jnp_fun = lambda x: x.reshape(*out_shape) args_maker = lambda: [rng(arg_shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_expanddim={}".format( @@ -1430,10 +1430,10 @@ def testReshapeMethod(self, arg_shape, out_shape, dtype, rng_factory): def testExpandDimsStaticDim(self, arg_shape, dtype, dim, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.expand_dims(x, dim) - lnp_fun = lambda x: lnp.expand_dims(x, dim) + jnp_fun = lambda x: jnp.expand_dims(x, dim) args_maker = lambda: [rng(arg_shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_axes=({},{})".format( @@ -1447,10 +1447,10 @@ def testExpandDimsStaticDim(self, arg_shape, dtype, dim, rng_factory): def testSwapAxesStaticAxes(self, arg_shape, dtype, ax1, ax2, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.swapaxes(x, ax1, ax2) - lnp_fun = lambda x: lnp.swapaxes(x, ax1, ax2) + jnp_fun = lambda x: jnp.swapaxes(x, ax1, ax2) args_maker = lambda: [rng(arg_shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_axis={}".format( @@ -1466,10 +1466,10 @@ def testSwapAxesStaticAxes(self, arg_shape, dtype, ax1, ax2, rng_factory): def testSqueeze(self, arg_shape, dtype, ax, rng_factory): rng = rng_factory() onp_fun = lambda x: onp.squeeze(x, ax) - lnp_fun = lambda x: lnp.squeeze(x, ax) + jnp_fun = lambda x: jnp.squeeze(x, ax) args_maker = lambda: [rng(arg_shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}_weights={}_returned={}".format( @@ -1490,37 +1490,37 @@ def testAverage(self, shape, dtype, axis, weights_shape, returned, rng_factory): rng = rng_factory() if weights_shape is None: onp_fun = lambda x: onp.average(x, axis, returned=returned) - lnp_fun = lambda x: lnp.average(x, axis, returned=returned) + jnp_fun = lambda x: jnp.average(x, axis, returned=returned) args_maker = lambda: [rng(shape, dtype)] else: onp_fun = lambda x, weights: onp.average(x, axis, weights, returned) - lnp_fun = lambda x, weights: lnp.average(x, axis, weights, returned) + jnp_fun = lambda x, weights: jnp.average(x, axis, weights, returned) args_maker = lambda: [rng(shape, dtype), rng(weights_shape, dtype)] - onp_fun = _promote_like_lnp(onp_fun, inexact=True) - tol = {lnp.bfloat16: 1e-1, onp.float16: 1e-1, onp.float32: 1e-3, + onp_fun = _promote_like_jnp(onp_fun, inexact=True) + tol = {jnp.bfloat16: 1e-1, onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-10, onp.complex64: 1e-3, onp.complex128: 1e-10} check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE try: - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=check_dtypes, tol=tol) except ZeroDivisionError: self.skipTest("don't support checking for ZeroDivisionError") - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=check_dtypes, + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=check_dtypes, rtol=tol, atol=tol) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_arg{}_ndmin={}".format(i, ndmin), "arg": arg, "ndmin": ndmin, "dtype": dtype} for i, (arg, dtype) in enumerate([ - ([True, False, True], lnp.bool_), - (3., lnp.float_), - ([1, 2, 3], lnp.int_), - ([1., 2., 3.], lnp.float_), - ([[1, 2], [3, 4], [5, 6]], lnp.int_), - ([[1, 2.], [3, 4], [5, 6]], lnp.float_), - ([[1., 2j], [3., 4.], [5., 6.]], lnp.complex_), - ([[3, onp.array(2, dtype=lnp.float_), 1], - onp.arange(3., dtype=lnp.float_)], lnp.float_), + ([True, False, True], jnp.bool_), + (3., jnp.float_), + ([1, 2, 3], jnp.int_), + ([1., 2., 3.], jnp.float_), + ([[1, 2], [3, 4], [5, 6]], jnp.int_), + ([[1, 2.], [3, 4], [5, 6]], jnp.float_), + ([[1., 2j], [3., 4.], [5., 6.]], jnp.complex_), + ([[3, onp.array(2, dtype=jnp.float_), 1], + onp.arange(3., dtype=jnp.float_)], jnp.float_), ]) for ndmin in [None, onp.ndim(arg), onp.ndim(arg) + 1, onp.ndim(arg) + 2])) def testArray(self, arg, ndmin, dtype): @@ -1528,15 +1528,15 @@ def testArray(self, arg, ndmin, dtype): dtype = dtypes.canonicalize_dtype(dtype) if ndmin is not None: onp_fun = partial(onp.array, ndmin=ndmin, dtype=dtype) - lnp_fun = partial(lnp.array, ndmin=ndmin) + jnp_fun = partial(jnp.array, ndmin=ndmin) else: onp_fun = partial(onp.array, dtype=dtype) - lnp_fun = lnp.array - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + jnp_fun = jnp.array + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) def testIssue121(self): - assert not onp.isscalar(lnp.array(3)) + assert not onp.isscalar(jnp.array(3)) def testArrayMethod(self): class arraylike(object): @@ -1544,12 +1544,12 @@ class arraylike(object): def __array__(self, dtype=None): return 3. a = arraylike() - ans = lnp.array(a) + ans = jnp.array(a) assert ans == 3. @jtu.skip_on_devices("tpu") # TODO(b/32368900): TPUs don't support uint8 yet. def testMemoryView(self): - ans = lnp.array(bytearray(b'\x2a')) + ans = jnp.array(bytearray(b'\x2a')) self.assertAllClose( ans, onp.array([0x2a], dtype=onp.uint8), @@ -1561,9 +1561,9 @@ def testAllClose(self): y = rng.randn(2) def same(list1, list2): - allclose = functools.partial(lnp.allclose, atol=1e-3, rtol=1e-3) + allclose = functools.partial(jnp.allclose, atol=1e-3, rtol=1e-3) elements_close = list(map(allclose, list1, list2)) - return lnp.all(lnp.array(elements_close)) + return jnp.all(jnp.array(elements_close)) csame = api.jit(same) @@ -1581,7 +1581,7 @@ def testOnesBroadcastingConstantHandler(self): self.skipTest("test needs jax3 update") def fun(x): - ones = lnp.ones((3, 4)) + ones = jnp.ones((3, 4)) assert isinstance(ones, onp.ndarray) and ones.strides == (0, 0) # To check that the constant handler generates a Broadcast for stride-zero @@ -1598,7 +1598,7 @@ def fun(x): return out fun = api.jit(fun) - out_val = fun(lnp.ones(4)) + out_val = fun(jnp.ones(4)) self.assertAllClose(out_val, onp.full((3, 4), 2.), check_dtypes=False) def testZeroStridesConstantHandler(self): @@ -1617,8 +1617,8 @@ def testIsInstanceNdarrayDuringTracing(self): @api.jit def f(x): - self.assertIsInstance(x, lnp.ndarray) - return lnp.sum(x) + self.assertIsInstance(x, jnp.ndarray) + return jnp.sum(x) f(arr) @@ -1627,10 +1627,10 @@ def testNonArrayErrorMessage(self): y = onp.array([3., 4.]) def g(x, y): - return lnp.add(x, y) + return jnp.add(x, y) def f(x, y): - return lnp.dot(x, y) + return jnp.dot(x, y) self.assertRaises(TypeError, lambda: g(x, y)) self.assertRaises(TypeError, lambda: f(x, y)) @@ -1659,7 +1659,7 @@ def g(x): def testTracingPrimitiveWithNoTranslationErrorMessage(self): # TODO(mattjj): update this for jax3 self.skipTest("test needs jax3 update") - foo = lnp._not_implemented(lambda x: x) + foo = jnp._not_implemented(lambda x: x) # No error if there's no tracing. foo(onp.arange(3)) @@ -1678,10 +1678,10 @@ def testTracingPrimitiveWithNoTranslationErrorMessage(self): def testFlip(self, shape, dtype, axis, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) - lnp_op = lambda x: lnp.flip(x, axis) + jnp_op = lambda x: jnp.flip(x, axis) onp_op = lambda x: onp.flip(x, axis) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format( @@ -1693,10 +1693,10 @@ def testFlip(self, shape, dtype, axis, rng_factory): def testFlipud(self, shape, dtype, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) - lnp_op = lambda x: lnp.flipud(x) + jnp_op = lambda x: jnp.flipud(x) onp_op = lambda x: onp.flipud(x) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -1709,10 +1709,10 @@ def testFlipud(self, shape, dtype, rng_factory): def testFliplr(self, shape, dtype, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) - lnp_op = lambda x: lnp.fliplr(x) + jnp_op = lambda x: jnp.fliplr(x) onp_op = lambda x: onp.fliplr(x) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( @@ -1731,10 +1731,10 @@ def testFliplr(self, shape, dtype, rng_factory): def testRot90(self, shape, dtype, k, axes, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) - lnp_op = lambda x: lnp.rot90(x, k, axes) + jnp_op = lambda x: jnp.rot90(x, k, axes) onp_op = lambda x: onp.rot90(x, k, axes) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) # TODO(mattjj): test infix operator overrides @@ -1746,7 +1746,7 @@ def testRavel(self): def testAstype(self): rng = onp.random.RandomState(0) args_maker = lambda: [rng.randn(3, 4).astype("float32")] - op = lambda x: x.astype(lnp.int32) + op = lambda x: x.astype(jnp.int32) self._CheckAgainstNumpy(op, op, args_maker, check_dtypes=True) self._CompileAndCheck(op, args_maker, check_dtypes=True) @@ -1754,61 +1754,61 @@ def testAstype(self): def testOnpMean(self): # from https://github.com/google/jax/issues/125 - x = lax.add(lnp.eye(3, dtype=lnp.float_), 0.) + x = lax.add(jnp.eye(3, dtype=jnp.float_), 0.) ans = onp.mean(x) self.assertAllClose(ans, onp.array(1./3), check_dtypes=False) def testArangeOnFloats(self): # from https://github.com/google/jax/issues/145 - expected = onp.arange(0.0, 1.0, 0.1, dtype=lnp.float_) - ans = lnp.arange(0.0, 1.0, 0.1) + expected = onp.arange(0.0, 1.0, 0.1, dtype=jnp.float_) + ans = jnp.arange(0.0, 1.0, 0.1) self.assertAllClose(expected, ans, check_dtypes=True) def testSortManually(self): # manual tests for sort are nice because we don't have to worry about ties. # lax.sort is tested combinatorially. - ans = lnp.sort(onp.array([16, 15, 23, 42, 8, 4])) + ans = jnp.sort(onp.array([16, 15, 23, 42, 8, 4])) expected = onp.array([4, 8, 15, 16, 23, 42]) self.assertAllClose(expected, ans, check_dtypes=True) a = onp.array([[1, 4], [3, 1]]) - ans = lnp.sort(a, axis=None) + ans = jnp.sort(a, axis=None) expected = onp.array([1, 1, 3, 4]) self.assertAllClose(expected, ans, check_dtypes=True) a = onp.array([[1, 4], [3, 1]]) - ans = lnp.sort(a) # last axis + ans = jnp.sort(a) # last axis expected = onp.array([[1, 4], [1, 3]]) self.assertAllClose(expected, ans, check_dtypes=True) a = onp.array([[1, 4], [3, 1]]) - ans = lnp.sort(a, axis=0) + ans = jnp.sort(a, axis=0) expected = onp.array([[1, 1], [3, 4]]) self.assertAllClose(expected, ans, check_dtypes=True) def testArgsortManually(self): x = onp.array([16, 15, 23, 42, 8, 4]) - ans = lnp.argsort(x) + ans = jnp.argsort(x) expected = onp.argsort(x) self.assertAllClose(expected, ans, check_dtypes=False) x = onp.array([[16, 15, 23], [42, 8, 4]]) - ans = lnp.argsort(x, axis=0) + ans = jnp.argsort(x, axis=0) expected = onp.argsort(x, axis=0) self.assertAllClose(expected, ans, check_dtypes=False) x = onp.array([[16, 15, 23], [42, 8, 4]]) - ans = lnp.argsort(x, axis=1) + ans = jnp.argsort(x, axis=1) expected = onp.argsort(x, axis=1) self.assertAllClose(expected, ans, check_dtypes=False) x = onp.array([[16, 15, 23], [42, 8, 4]]) - ans = lnp.argsort(x, axis=None) + ans = jnp.argsort(x, axis=None) expected = onp.argsort(x, axis=None) self.assertAllClose(expected, ans, check_dtypes=False) x = onp.array([[16, 15, 23], [42, 8, 4]]) - ans = lnp.argsort(x) + ans = jnp.argsort(x) expected = onp.argsort(x) self.assertAllClose(expected, ans, check_dtypes=False) @@ -1833,10 +1833,10 @@ def testArgsortManually(self): def testRoll(self, shape, dtype, shifts, axis, rng_factory): rng = rng_factory() args_maker = lambda: [rng(shape, dtype), onp.array(shifts)] - lnp_op = partial(lnp.roll, axis=axis) + jnp_op = partial(jnp.roll, axis=axis) onp_op = partial(onp.roll, axis=axis) - self._CheckAgainstNumpy(lnp_op, onp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(jnp_op, onp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_index={}_axis={}_mode={}".format( @@ -1864,10 +1864,10 @@ def args_maker(): rng = rng_factory() rng_indices = rng_indices_factory() - lnp_op = lambda x, i: lnp.take(x, i, axis=axis, mode=mode) + jnp_op = lambda x, i: jnp.take(x, i, axis=axis, mode=mode) onp_op = lambda x, i: onp.take(x, i, axis=axis, mode=mode) - self._CheckAgainstNumpy(lnp_op, onp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(jnp_op, onp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_ishape={}_axis={}".format( @@ -1897,12 +1897,12 @@ def args_maker(): i = rng(i_shape, onp.int32) % (2 * n - 1) - (n - 1) return x, i - lnp_op = lambda x, i: lnp.take_along_axis(x, i, axis=axis) + jnp_op = lambda x, i: jnp.take_along_axis(x, i, axis=axis) if hasattr(onp, "take_along_axis"): onp_op = lambda x, i: onp.take_along_axis(x, i, axis=axis) - self._CheckAgainstNumpy(lnp_op, onp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(jnp_op, onp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_n={}_increasing={}".format( @@ -1917,15 +1917,15 @@ def args_maker(): def testVander(self, shape, dtype, n, increasing, rng_factory): rng = rng_factory() def onp_fun(arg): - arg = arg.astype(onp.float32) if dtype == lnp.bfloat16 else arg + arg = arg.astype(onp.float32) if dtype == jnp.bfloat16 else arg return onp.vander(arg, N=n, increasing=increasing) - lnp_fun = lambda arg: lnp.vander(arg, N=n, increasing=increasing) + jnp_fun = lambda arg: jnp.vander(arg, N=n, increasing=increasing) args_maker = lambda: [rng([shape], dtype)] # np.vander seems to return float64 for all floating types. We could obey # those semantics, but they seem like a bug. - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False, tol={onp.float32: 1e-3}) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=False) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=False) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": jtu.format_test_name_suffix("nan_to_num", [shape], @@ -1938,19 +1938,19 @@ def testNanToNum(self, rng_factory, shape, dtype): rng = rng_factory() dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)).type def onp_fun(x): - if dtype == lnp.bfloat16: + if dtype == jnp.bfloat16: x = onp.where(onp.isnan(x), dtype(0), x) - x = onp.where(onp.isposinf(x), lnp.finfo(dtype).max, x) - x = onp.where(onp.isneginf(x), lnp.finfo(dtype).min, x) + x = onp.where(onp.isposinf(x), jnp.finfo(dtype).max, x) + x = onp.where(onp.isneginf(x), jnp.finfo(dtype).min, x) return x else: return onp.nan_to_num(x).astype(dtype) args_maker = lambda: [rng(shape, dtype)] check_dtypes = shape is not jtu.PYTHON_SCALAR_SHAPE - self._CheckAgainstNumpy(onp_fun, lnp.nan_to_num, args_maker, + self._CheckAgainstNumpy(onp_fun, jnp.nan_to_num, args_maker, check_dtypes=check_dtypes) - self._CompileAndCheck(lnp.nan_to_num, args_maker, + self._CompileAndCheck(jnp.nan_to_num, args_maker, check_dtypes=check_dtypes) @parameterized.named_parameters(jtu.cases_from_list( @@ -1966,9 +1966,9 @@ def testIx_(self, rng_factory, shapes, dtypes): rng = rng_factory() args_maker = lambda: [rng(shape, dtype) for shape, dtype in zip(shapes, dtypes)] - self._CheckAgainstNumpy(onp.ix_, lnp.ix_, args_maker, + self._CheckAgainstNumpy(onp.ix_, jnp.ix_, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp.ix_, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp.ix_, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": @@ -2004,19 +2004,19 @@ def testQuantile(self, op, a_rng, q_rng, a_shape, a_dtype, q_shape, q_dtype, else: args_maker = lambda: [a_rng(a_shape, a_dtype), q_rng(q_shape, q_dtype)] def onp_fun(*args): - args = [x if lnp.result_type(x) != lnp.bfloat16 else + args = [x if jnp.result_type(x) != jnp.bfloat16 else onp.asarray(x, onp.float32) for x in args] return getattr(onp, op)(*args, axis=axis, keepdims=keepdims) - lnp_fun = partial(getattr(lnp, op), axis=axis, keepdims=keepdims) + jnp_fun = partial(getattr(jnp, op), axis=axis, keepdims=keepdims) # TODO(phawkins): we currently set dtype=False because we aren't as # aggressive about promoting to float64. It's not clear we want to mimic # Numpy here. tol_spec = {onp.float32: 2e-4, onp.float64: 5e-6} tol = max(jtu.tolerance(a_dtype, tol_spec), jtu.tolerance(q_dtype, tol_spec)) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True, rtol=tol) @parameterized.named_parameters(jtu.cases_from_list( @@ -2027,9 +2027,9 @@ def onp_fun(*args): def testWhereOneArgument(self, shape, dtype): rng = jtu.rand_some_zero() onp_fun = lambda x: onp.where(x) - lnp_fun = lambda x: lnp.where(x) + jnp_fun = lambda x: jnp.where(x) args_maker = lambda: [rng(shape, dtype)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=False) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}".format("_".join( @@ -2043,14 +2043,14 @@ def testWhereThreeArgument(self, rng_factory, shapes, dtypes): rng = rng_factory() args_maker = self._GetArgsMaker(rng_factory(), shapes, dtypes) def onp_fun(cond, x, y): - return _promote_like_lnp(partial(onp.where, cond))(x, y) - self._CheckAgainstNumpy(onp_fun, lnp.where, args_maker, + return _promote_like_jnp(partial(onp.where, cond))(x, y) + self._CheckAgainstNumpy(onp_fun, jnp.where, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp.where, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp.where, args_maker, check_dtypes=True) def testWhereScalarPromotion(self): - x = lnp.where(lnp.array([True, False]), 3, - lnp.ones((2,), dtype=lnp.float32)) + x = jnp.where(jnp.array([True, False]), 3, + jnp.ones((2,), dtype=jnp.float32)) self.assertEqual(x.dtype, onp.dtype(onp.float32)) @parameterized.named_parameters(jtu.cases_from_list( @@ -2073,67 +2073,67 @@ def args_maker(): return condlist, choicelist, default # TODO(phawkins): float32/float64 type mismatches def onp_fun(condlist, choicelist, default): - choicelist = [x if lnp.result_type(x) != lnp.bfloat16 + choicelist = [x if jnp.result_type(x) != jnp.bfloat16 else x.astype(onp.float32) for x in choicelist] - dtype = lnp.result_type(default, *choicelist) + dtype = jnp.result_type(default, *choicelist) return onp.select(condlist, [onp.asarray(x, dtype=dtype) for x in choicelist], onp.asarray(default, dtype=dtype)) - self._CheckAgainstNumpy(onp_fun, lnp.select, args_maker, + self._CheckAgainstNumpy(onp_fun, jnp.select, args_maker, check_dtypes=False) - self._CompileAndCheck(lnp.select, args_maker, check_dtypes=True, + self._CompileAndCheck(jnp.select, args_maker, check_dtypes=True, rtol={onp.float64: 1e-7, onp.complex128: 1e-7}) def testIssue330(self): - x = lnp.full((1, 1), lnp.array([1])[0]) # doesn't crash + x = jnp.full((1, 1), jnp.array([1])[0]) # doesn't crash self.assertEqual(x[0, 0], 1) def testScalarDtypePromotion(self): orig_numpy_result = (1 + onp.eye(1, dtype=onp.float32)).dtype - jax_numpy_result = (1 + lnp.eye(1, dtype=lnp.float32)).dtype + jax_numpy_result = (1 + jnp.eye(1, dtype=jnp.float32)).dtype self.assertEqual(orig_numpy_result, jax_numpy_result) def testSymmetrizeDtypePromotion(self): x = onp.eye(3, dtype=onp.float32) orig_numpy_result = ((x + x.T) / 2).dtype - x = lnp.eye(3, dtype=lnp.float32) + x = jnp.eye(3, dtype=jnp.float32) jax_numpy_result = ((x + x.T) / 2).dtype self.assertEqual(orig_numpy_result, jax_numpy_result) def testIssue347(self): # https://github.com/google/jax/issues/347 def test_fail(x): - x = lnp.sqrt(lnp.sum(x ** 2, axis=1)) - ones = lnp.ones_like(x) - x = lnp.where(x > 0.5, x, ones) - return lnp.sum(x) + x = jnp.sqrt(jnp.sum(x ** 2, axis=1)) + ones = jnp.ones_like(x) + x = jnp.where(x > 0.5, x, ones) + return jnp.sum(x) - x = lnp.array([[1, 2], [3, 4], [0, 0]], dtype=lnp.float64) + x = jnp.array([[1, 2], [3, 4], [0, 0]], dtype=jnp.float64) result = api.grad(test_fail)(x) assert not onp.any(onp.isnan(result)) def testIssue453(self): # https://github.com/google/jax/issues/453 a = onp.arange(6) + 1 - ans = lnp.reshape(a, (3, 2), order='F') + ans = jnp.reshape(a, (3, 2), order='F') expected = onp.reshape(a, (3, 2), order='F') self.assertAllClose(ans, expected, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_dtype={}".format(op, pytype.__name__), "pytype": pytype, "dtype": dtype, "op": op} - for pytype, dtype in [(int, lnp.int_), (float, lnp.float_), - (bool, lnp.bool_), (complex, lnp.complex_)] + for pytype, dtype in [(int, jnp.int_), (float, jnp.float_), + (bool, jnp.bool_), (complex, jnp.complex_)] for op in ["atleast_1d", "atleast_2d", "atleast_3d"])) def testAtLeastNdLiterals(self, pytype, dtype, op): # Fixes: https://github.com/google/jax/issues/634 onp_fun = lambda arg: getattr(onp, op)(arg).astype(dtype) - lnp_fun = lambda arg: getattr(lnp, op)(arg) + jnp_fun = lambda arg: getattr(jnp, op)(arg) args_maker = lambda: [pytype(2)] - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters(*jtu.cases_from_list( {"testcase_name": "_case={}".format(i), @@ -2156,8 +2156,8 @@ def testAtLeastNdLiterals(self, pytype, dtype, op): ]))) def testBlock(self, input): args_maker = lambda: [input] - self._CheckAgainstNumpy(onp.block, lnp.block, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp.block, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(onp.block, jnp.block, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp.block, args_maker, check_dtypes=True) def testLongLong(self): self.assertAllClose(onp.int64(7), api.jit(lambda x: x)(onp.longlong(7)), @@ -2166,53 +2166,53 @@ def testLongLong(self): def testArange(self): # test cases inspired by dask tests at # https://github.com/dask/dask/blob/master/dask/array/tests/test_creation.py#L92 - self.assertAllClose(lnp.arange(77), - onp.arange(77, dtype=lnp.int_), check_dtypes=True) - self.assertAllClose(lnp.arange(2, 13), - onp.arange(2, 13, dtype=lnp.int_), check_dtypes=True) - self.assertAllClose(lnp.arange(4, 21, 9), - onp.arange(4, 21, 9, dtype=lnp.int_), check_dtypes=True) - self.assertAllClose(lnp.arange(53, 5, -3), - onp.arange(53, 5, -3, dtype=lnp.int_), + self.assertAllClose(jnp.arange(77), + onp.arange(77, dtype=jnp.int_), check_dtypes=True) + self.assertAllClose(jnp.arange(2, 13), + onp.arange(2, 13, dtype=jnp.int_), check_dtypes=True) + self.assertAllClose(jnp.arange(4, 21, 9), + onp.arange(4, 21, 9, dtype=jnp.int_), check_dtypes=True) + self.assertAllClose(jnp.arange(53, 5, -3), + onp.arange(53, 5, -3, dtype=jnp.int_), check_dtypes=True) - self.assertAllClose(lnp.arange(77, dtype=float), + self.assertAllClose(jnp.arange(77, dtype=float), onp.arange(77, dtype=float), check_dtypes=True) - self.assertAllClose(lnp.arange(2, 13, dtype=int), + self.assertAllClose(jnp.arange(2, 13, dtype=int), onp.arange(2, 13, dtype=int), check_dtypes=True) - self.assertAllClose(lnp.arange(0, 1, -0.5), - onp.arange(0, 1, -0.5, dtype=lnp.float_), + self.assertAllClose(jnp.arange(0, 1, -0.5), + onp.arange(0, 1, -0.5, dtype=jnp.float_), check_dtypes=True) - self.assertRaises(TypeError, lambda: lnp.arange()) + self.assertRaises(TypeError, lambda: jnp.arange()) - # test that lnp.arange(N) doesn't instantiate an ndarray - self.assertFalse(type(lnp.arange(77)) == type(onp.arange(77))) - self.assertTrue(type(lnp.arange(77)) == type(lax.iota(onp.int32, 77))) + # test that jnp.arange(N) doesn't instantiate an ndarray + self.assertFalse(type(jnp.arange(77)) == type(onp.arange(77))) + self.assertTrue(type(jnp.arange(77)) == type(lax.iota(onp.int32, 77))) - # test that lnp.arange(N, dtype=int32) doesn't instantiate an ndarray - self.assertFalse(type(lnp.arange(77, dtype=lnp.int32)) == + # test that jnp.arange(N, dtype=int32) doesn't instantiate an ndarray + self.assertFalse(type(jnp.arange(77, dtype=jnp.int32)) == type(onp.arange(77, dtype=onp.int32))) - self.assertTrue(type(lnp.arange(77, dtype=lnp.int32)) == + self.assertTrue(type(jnp.arange(77, dtype=jnp.int32)) == type(lax.iota(onp.int32, 77))) # test laziness for int dtypes - self.assertTrue(xla.is_device_constant(lnp.arange(77))) - self.assertTrue(xla.is_device_constant(lnp.arange(77, dtype=lnp.int32))) + self.assertTrue(xla.is_device_constant(jnp.arange(77))) + self.assertTrue(xla.is_device_constant(jnp.arange(77, dtype=jnp.int32))) def testIssue830(self): - a = lnp.arange(4, dtype=lnp.complex64) - self.assertEqual(a.dtype, lnp.complex64) + a = jnp.arange(4, dtype=jnp.complex64) + self.assertEqual(a.dtype, jnp.complex64) def testIssue728(self): - assert lnp.allclose(lnp.eye(5000), onp.eye(5000)) - self.assertEqual(0, onp.sum(lnp.eye(1050) - onp.eye(1050))) + assert jnp.allclose(jnp.eye(5000), onp.eye(5000)) + self.assertEqual(0, onp.sum(jnp.eye(1050) - onp.eye(1050))) def testIssue746(self): - lnp.arange(12).reshape(3, 4) # doesn't crash + jnp.arange(12).reshape(3, 4) # doesn't crash def testIssue764(self): - x = lnp.linspace(190, 200, 4) - f = api.grad(lambda x: lnp.sum(lnp.tanh(x))) + x = jnp.linspace(190, 200, 4) + f = api.grad(lambda x: jnp.sum(jnp.tanh(x))) # Expected values computed with autograd in float64 precision. expected = onp.array([3.71669453e-165, 4.72999108e-168, 6.01954653e-171, 7.66067839e-174], onp.float64) @@ -2230,8 +2230,8 @@ def f(u): check_dtypes=True) def testIssue777(self): - x = lnp.linspace(-200, 0, 4, dtype=onp.float32) - f = api.grad(lambda x: lnp.sum(1 / (1 + lnp.exp(-x)))) + x = jnp.linspace(-200, 0, 4, dtype=onp.float32) + f = api.grad(lambda x: jnp.sum(1 / (1 + jnp.exp(-x)))) self.assertAllClose(f(x), onp.array([0., 0., 0., 0.25], dtype=onp.float32), check_dtypes=True) @@ -2245,11 +2245,11 @@ def testIssue777(self): "log", "expm1", "log1p"))) def testMathSpecialFloatValues(self, op, dtype): onp_op = getattr(onp, op) - lnp_op = getattr(lnp, op) + jnp_op = getattr(jnp, op) dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)).type for x in (onp.nan, -onp.inf, -100., -2., -1., 0., 1., 2., 100., onp.inf, - lnp.finfo(dtype).max, onp.sqrt(lnp.finfo(dtype).max), - onp.sqrt(lnp.finfo(dtype).max) * 2.): + jnp.finfo(dtype).max, onp.sqrt(jnp.finfo(dtype).max), + onp.sqrt(jnp.finfo(dtype).max) * 2.): if onp.isnan(x) and op in ("sinh", "cosh", "expm1", "exp"): # TODO(b/133842876, b/133842870): these return wrong outputs on CPU for # NaN inputs. @@ -2259,7 +2259,7 @@ def testMathSpecialFloatValues(self, op, dtype): continue # TODO(b/132196789, b/134175194): fix and reenable. x = dtype(x) expected = onp_op(x) - actual = lnp_op(x) + actual = jnp_op(x) tol = jtu.tolerance(dtype, {onp.float32: 1e-3, onp.float64: 1e-7}) self.assertAllClose(expected, actual, check_dtypes=True, atol=tol, rtol=tol) @@ -2271,17 +2271,17 @@ def testIssue883(self): def f(x, v): return x - x = lnp.ones((10, 10)) - v = lnp.array([1, 2, 3]) + x = jnp.ones((10, 10)) + v = jnp.array([1, 2, 3]) first_call = f(x, v) second_call = f(x, v) # doesn't crash def testReductionOfOutOfBoundsAxis(self): # Issue 888 - x = lnp.ones((3, 4)) - self.assertRaises(ValueError, lambda: lnp.sum(x, axis=2)) + x = jnp.ones((3, 4)) + self.assertRaises(ValueError, lambda: jnp.sum(x, axis=2)) def testIssue956(self): - self.assertRaises(TypeError, lambda: lnp.ndarray((1, 1))) + self.assertRaises(TypeError, lambda: jnp.ndarray((1, 1))) @parameterized.named_parameters( jtu.cases_from_list( @@ -2301,15 +2301,15 @@ def testVar(self, shape, dtype, out_dtype, axis, ddof, keepdims, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) def onp_fun(x): - out = onp.var(x.astype(lnp.promote_types(onp.float32, dtype)), + out = onp.var(x.astype(jnp.promote_types(onp.float32, dtype)), axis=axis, ddof=ddof, keepdims=keepdims) return out.astype(out_dtype) - lnp_fun = partial(lnp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) + jnp_fun = partial(jnp.var, dtype=out_dtype, axis=axis, ddof=ddof, keepdims=keepdims) tol = jtu.tolerance(out_dtype, {onp.float16: 1e-1, onp.float32: 1e-3, onp.float64: 1e-3, onp.complex128: 1e-6}) - self._CheckAgainstNumpy(onp_fun, lnp_fun, args_maker, check_dtypes=True, + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, rtol=tol, + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True, rtol=tol, atol=tol) @parameterized.named_parameters( @@ -2329,17 +2329,17 @@ def testCov(self, shape, dtype, rowvar, ddof, bias, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) onp_fun = partial(onp.cov, rowvar=rowvar, ddof=ddof, bias=bias) - lnp_fun = partial(lnp.cov, rowvar=rowvar, ddof=ddof, bias=bias) + jnp_fun = partial(jnp.cov, rowvar=rowvar, ddof=ddof, bias=bias) tol = {onp.float32: 1e-5, onp.float64: 1e-13, onp.complex128: 1e-13} tol = 7e-2 if jtu.device_under_test() == "tpu" else tol tol = jtu.join_tolerance(tol, jtu.tolerance(dtype)) self._CheckAgainstNumpy( - onp_fun, lnp_fun, args_maker, check_dtypes=False, tol=tol) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True, atol=tol, + onp_fun, jnp_fun, args_maker, check_dtypes=False, tol=tol) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True, atol=tol, rtol=tol) def testIssue967(self): - self.assertRaises(TypeError, lambda: lnp.zeros(1.5)) + self.assertRaises(TypeError, lambda: jnp.zeros(1.5)) @parameterized.named_parameters( jtu.cases_from_list( @@ -2358,12 +2358,12 @@ def testCorrCoef(self, shape, dtype, rowvar, ddof, bias, rng_factory): args_maker = self._GetArgsMaker(rng, [shape], [dtype]) mat = onp.asarray([rng(shape, dtype)]) onp_fun = partial(onp.corrcoef, rowvar=rowvar, ddof=ddof, bias=bias) - lnp_fun = partial(lnp.corrcoef, rowvar=rowvar, ddof=ddof, bias=bias) + jnp_fun = partial(jnp.corrcoef, rowvar=rowvar, ddof=ddof, bias=bias) if not onp.any(onp.isclose(onp.std(mat), 0.0)): self._CheckAgainstNumpy( - onp_fun, lnp_fun, args_maker, check_dtypes=False, + onp_fun, jnp_fun, args_maker, check_dtypes=False, tol=1e-2 if jtu.device_under_test() == "tpu" else None) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters( jtu.cases_from_list( @@ -2381,8 +2381,8 @@ def testMeshGrid(self, shapes, dtype, indexing, sparse, rng_factory): args_maker = self._GetArgsMaker(rng, [(x,) for x in shapes], [dtype] * len(shapes)) onp_fun = partial(onp.meshgrid, indexing=indexing, sparse=sparse) - lnp_fun = partial(lnp.meshgrid, indexing=indexing, sparse=sparse) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + jnp_fun = partial(jnp.meshgrid, indexing=indexing, sparse=sparse) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) @parameterized.named_parameters( jtu.cases_from_list( @@ -2412,18 +2412,18 @@ def testLinspace(self, start_shape, stop_shape, num, endpoint, start, stop = args_maker() ndim = len(onp.shape(start + stop)) for axis in range(-ndim, ndim): - lnp_op = lambda start, stop: lnp.linspace( + jnp_op = lambda start, stop: jnp.linspace( start, stop, num, endpoint=endpoint, retstep=retstep, dtype=dtype, axis=axis) onp_op = lambda start, stop: onp.linspace( start, stop, num, endpoint=endpoint, retstep=retstep, dtype=dtype, axis=axis) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=False, tol=tol) # floating-point compute between jitted platforms and non-jit + rounding # cause unavoidable variation in integer truncation for some inputs. if dtype in (inexact_dtypes + [None,]): - self._CompileAndCheck(lnp_op, args_maker, + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=False, atol=tol, rtol=tol) @parameterized.named_parameters( @@ -2460,17 +2460,17 @@ def testLogspace(self, start_shape, stop_shape, num, start, stop = args_maker() ndim = len(onp.shape(start + stop)) for axis in range(-ndim, ndim): - lnp_op = lambda start, stop: lnp.logspace( + jnp_op = lambda start, stop: jnp.logspace( start, stop, num, endpoint=endpoint, base=base, dtype=dtype, axis=axis) onp_op = lambda start, stop: onp.logspace( start, stop, num, endpoint=endpoint, base=base, dtype=dtype, axis=axis) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=False, tol=tol) if dtype in (inexact_dtypes + [None,]): # Why do compiled and op-by-op float16 np.power numbers differ # slightly more than expected? atol = {onp.float16: 1e-2} - self._CompileAndCheck(lnp_op, args_maker, + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=False, atol=atol, rtol=tol) @parameterized.named_parameters( @@ -2501,44 +2501,44 @@ def args_maker(): [dtype, dtype])() # onp.geomspace can't handle differently ranked tensors # w. negative numbers! - start, stop = lnp.broadcast_arrays(start, stop) + start, stop = jnp.broadcast_arrays(start, stop) if dtype in complex_dtypes: return start, stop # to avoid NaNs, non-complex start and stop cannot # differ in sign, elementwise - start = start * lnp.sign(start) * lnp.sign(stop) + start = start * jnp.sign(start) * jnp.sign(stop) return start, stop start, stop = args_maker() ndim = len(onp.shape(start + stop)) for axis in range(-ndim, ndim): - def lnp_op(start, stop): - return lnp.geomspace(start, stop, num, endpoint=endpoint, dtype=dtype, + def jnp_op(start, stop): + return jnp.geomspace(start, stop, num, endpoint=endpoint, dtype=dtype, axis=axis) def onp_op(start, stop): - start = start.astype(onp.float32) if dtype == lnp.bfloat16 else start - stop = stop.astype(onp.float32) if dtype == lnp.bfloat16 else stop + start = start.astype(onp.float32) if dtype == jnp.bfloat16 else start + stop = stop.astype(onp.float32) if dtype == jnp.bfloat16 else stop return onp.geomspace( start, stop, num, endpoint=endpoint, - dtype=dtype if dtype != lnp.bfloat16 else onp.float32, + dtype=dtype if dtype != jnp.bfloat16 else onp.float32, axis=axis).astype(dtype) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=False, tol=tol) if dtype in (inexact_dtypes + [None,]): - self._CompileAndCheck(lnp_op, args_maker, + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=False, atol=tol, rtol=tol) def testDisableNumpyRankPromotionBroadcasting(self): try: prev_flag = FLAGS.jax_numpy_rank_promotion FLAGS.jax_numpy_rank_promotion = "allow" - lnp.ones(2) + lnp.ones((1, 2)) # works just fine + jnp.ones(2) + jnp.ones((1, 2)) # works just fine finally: FLAGS.jax_numpy_rank_promotion = prev_flag try: prev_flag = FLAGS.jax_numpy_rank_promotion FLAGS.jax_numpy_rank_promotion = "raise" - self.assertRaises(ValueError, lambda: lnp.ones(2) + lnp.ones((1, 2))) + self.assertRaises(ValueError, lambda: jnp.ones(2) + jnp.ones((1, 2))) finally: FLAGS.jax_numpy_rank_promotion = prev_flag @@ -2547,7 +2547,7 @@ def testDisableNumpyRankPromotionBroadcasting(self): FLAGS.jax_numpy_rank_promotion = "warn" with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") - lnp.ones(2) + lnp.ones((1, 2)) + jnp.ones(2) + jnp.ones((1, 2)) assert len(w) > 0 msg = str(w[-1].message) expected_msg = ("Following NumPy automatic rank promotion for add on " @@ -2555,7 +2555,7 @@ def testDisableNumpyRankPromotionBroadcasting(self): self.assertEqual(msg[:len(expected_msg)], expected_msg) prev_len = len(w) - lnp.ones(2) + 3 + jnp.ones(2) + 3 self.assertEqual(len(w), prev_len) # don't want to warn for scalars finally: FLAGS.jax_numpy_rank_promotion = prev_flag @@ -2564,12 +2564,12 @@ def testStackArrayArgument(self): # tests https://github.com/google/jax/issues/1271 @api.jit def foo(x): - return lnp.stack(x) + return jnp.stack(x) foo(onp.zeros(2)) # doesn't crash @api.jit def foo(x): - return lnp.concatenate(x) + return jnp.concatenate(x) foo(onp.zeros((2, 2))) # doesn't crash def testReluGradientConstants(self): @@ -2579,7 +2579,7 @@ def testReluGradientConstants(self): # every relu activation in a model. def body(i, xy): x, y = xy - y = y + jax.grad(lambda z: lnp.sum(lnp.maximum(z, 0.)))(x) + y = y + jax.grad(lambda z: jnp.sum(jnp.maximum(z, 0.)))(x) return x, y f = lambda y: lax.fori_loop(0, 5, body, (y, y)) @@ -2605,21 +2605,21 @@ def testBroadcastTo(self, from_shape, to_shape, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [from_shape], [onp.float32]) onp_op = lambda x: onp.broadcast_to(x, to_shape) - lnp_op = lambda x: lnp.broadcast_to(x, to_shape) - self._CheckAgainstNumpy(onp_op, lnp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + jnp_op = lambda x: jnp.broadcast_to(x, to_shape) + self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) def testBroadcastToIssue1522(self): self.assertRaisesRegex( ValueError, "Incompatible shapes for broadcasting: .*", - lambda: lnp.broadcast_to(onp.ones((2, 3)), (1, 3))) + lambda: jnp.broadcast_to(onp.ones((2, 3)), (1, 3))) def testBroadcastToIntIssue1548(self): - self.assertAllClose(lnp.broadcast_to(1, (3, 2)), onp.ones((3, 2)), + self.assertAllClose(jnp.broadcast_to(1, (3, 2)), onp.ones((3, 2)), check_dtypes=False) def testBroadcastToOnScalar(self): - self.assertIsInstance(lnp.broadcast_to(10.0, ()), lnp.ndarray) + self.assertIsInstance(jnp.broadcast_to(10.0, ()), jnp.ndarray) self.assertIsInstance(onp.broadcast_to(10.0, ()), onp.ndarray) def testPrecision(self): @@ -2629,46 +2629,46 @@ def testPrecision(self): ones_3d = onp.ones((2, 2, 2)) HIGHEST = lax.Precision.HIGHEST - jtu.assert_dot_precision(None, lnp.dot, ones_1d, ones_1d) + jtu.assert_dot_precision(None, jnp.dot, ones_1d, ones_1d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.dot, precision=HIGHEST), + partial(jnp.dot, precision=HIGHEST), ones_1d, ones_1d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.dot, precision=HIGHEST), + partial(jnp.dot, precision=HIGHEST), ones_3d, ones_3d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.matmul, precision=HIGHEST), + partial(jnp.matmul, precision=HIGHEST), ones_2d, ones_2d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.vdot, precision=HIGHEST), + partial(jnp.vdot, precision=HIGHEST), ones_1d, ones_1d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.tensordot, axes=2, precision=HIGHEST), + partial(jnp.tensordot, axes=2, precision=HIGHEST), ones_2d, ones_2d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.tensordot, axes=(0, 0), precision=HIGHEST), + partial(jnp.tensordot, axes=(0, 0), precision=HIGHEST), ones_1d, ones_1d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.tensordot, axes=((0,), (0,)), precision=HIGHEST), + partial(jnp.tensordot, axes=((0,), (0,)), precision=HIGHEST), ones_1d, ones_1d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.einsum, 'i,i', precision=HIGHEST), + partial(jnp.einsum, 'i,i', precision=HIGHEST), ones_1d, ones_1d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.einsum, 'ij,ij', precision=HIGHEST), + partial(jnp.einsum, 'ij,ij', precision=HIGHEST), ones_2d, ones_2d) jtu.assert_dot_precision( HIGHEST, - partial(lnp.inner, precision=HIGHEST), + partial(jnp.inner, precision=HIGHEST), ones_1d, ones_1d) @parameterized.named_parameters( @@ -2685,27 +2685,27 @@ def testPrecision(self): def testGradient(self, shape, axis, dtype, rng_factory): rng = rng_factory() args_maker = self._GetArgsMaker(rng, [shape], [dtype]) - lnp_fun = lambda y: lnp.gradient(y, axis=axis) + jnp_fun = lambda y: jnp.gradient(y, axis=axis) onp_fun = lambda y: onp.gradient(y, axis=axis) self._CheckAgainstNumpy( - onp_fun, lnp_fun, args_maker, check_dtypes=False) - self._CompileAndCheck(lnp_fun, args_maker, check_dtypes=True) + onp_fun, jnp_fun, args_maker, check_dtypes=False) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) def testZerosShapeErrors(self): # see https://github.com/google/jax/issues/1822 self.assertRaisesRegex( TypeError, "Shapes must be 1D sequences of concrete values of integer type.*", - lambda: lnp.zeros(1.)) + lambda: jnp.zeros(1.)) self.assertRaisesRegex( TypeError, "Shapes must be 1D sequences of concrete values of integer type.*\n" "If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions.", - lambda: api.jit(lnp.zeros)(2)) + lambda: api.jit(jnp.zeros)(2)) def testTraceMethod(self): - x = onp.random.randn(3, 4).astype(lnp.float_) - self.assertAllClose(x.trace(), lnp.array(x).trace(), check_dtypes=True) + x = onp.random.randn(3, 4).astype(jnp.float_) + self.assertAllClose(x.trace(), jnp.array(x).trace(), check_dtypes=True) self.assertAllClose(x.trace(), api.jit(lambda y: y.trace())(x), check_dtypes=True) @@ -2720,13 +2720,13 @@ def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): op, nargs, order, rng_factory, dtypes, name or op.__name__, tol) GRAD_TEST_RECORDS = [ - grad_test_spec(lnp.arcsinh, nargs=1, order=2, + grad_test_spec(jnp.arcsinh, nargs=1, order=2, rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64], tol=1e-4), - grad_test_spec(lnp.arccosh, nargs=1, order=2, + grad_test_spec(jnp.arccosh, nargs=1, order=2, rng_factory=jtu.rand_positive, dtypes=[onp.float64, onp.complex64], tol=1e-4), - grad_test_spec(lnp.arctanh, nargs=1, order=2, + grad_test_spec(jnp.arctanh, nargs=1, order=2, rng_factory=partial(jtu.rand_uniform, -0.9, 0.9), dtypes=[onp.float64, onp.complex64], tol=1e-4), ] @@ -2735,14 +2735,14 @@ def grad_test_spec(op, nargs, order, rng_factory, dtypes, name=None, tol=None): "GradSpecialValuesTestSpec", ["op", "values", "order"]) GRAD_SPECIAL_VALUE_TEST_RECORDS = [ - GradSpecialValuesTestSpec(lnp.arcsinh, [0., 1000.], 2), - GradSpecialValuesTestSpec(lnp.arccosh, [1000.], 2), - GradSpecialValuesTestSpec(lnp.arctanh, [0.], 2), - GradSpecialValuesTestSpec(lnp.sinc, [0.], 1) + GradSpecialValuesTestSpec(jnp.arcsinh, [0., 1000.], 2), + GradSpecialValuesTestSpec(jnp.arccosh, [1000.], 2), + GradSpecialValuesTestSpec(jnp.arctanh, [0.], 2), + GradSpecialValuesTestSpec(jnp.sinc, [0.], 1) ] def num_float_bits(dtype): - return lnp.finfo(dtypes.canonicalize_dtype(dtype)).bits + return jnp.finfo(dtypes.canonicalize_dtype(dtype)).bits class NumpyGradTests(jtu.JaxTestCase): @parameterized.named_parameters(itertools.chain.from_iterable( @@ -2772,11 +2772,11 @@ def testOpGradSpecialValue(self, op, special_value, order): def testTakeAlongAxisIssue1521(self): # https://github.com/google/jax/issues/1521 - idx = lnp.repeat(lnp.arange(3), 10).reshape((30, 1)) + idx = jnp.repeat(jnp.arange(3), 10).reshape((30, 1)) def f(x): - y = x * lnp.arange(3.).reshape((1, 3)) - return lnp.take_along_axis(y, idx, -1).sum() + y = x * jnp.arange(3.).reshape((1, 3)) + return jnp.take_along_axis(y, idx, -1).sum() check_grads(f, (1.,), order=1) From c953ca2d83099c20121e09168d1c51b01c931557 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Sat, 7 Mar 2020 10:43:51 -0500 Subject: [PATCH 0829/1053] =?UTF-8?q?Rename=20np=20->=20jnp=20and=20onp=20?= =?UTF-8?q?->=20np=20in=20jax/scipy=20to=20match=20the=20standard=20JAX?= =?UTF-8?q?=E2=80=A6=20(#2370)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rename np -> jnp and onp -> np in jax/scipy to match the standard JAX import convention. * Fix missed `np` in norm.py. --- jax/scipy/special.py | 94 +++++++++++++------------- jax/scipy/stats/bernoulli.py | 19 +++--- jax/scipy/stats/beta.py | 2 - jax/scipy/stats/cauchy.py | 4 +- jax/scipy/stats/dirichlet.py | 22 +++--- jax/scipy/stats/expon.py | 2 - jax/scipy/stats/gamma.py | 2 - jax/scipy/stats/laplace.py | 2 - jax/scipy/stats/multivariate_normal.py | 4 +- jax/scipy/stats/norm.py | 8 +-- jax/scipy/stats/pareto.py | 1 - jax/scipy/stats/t.py | 4 +- 12 files changed, 77 insertions(+), 87 deletions(-) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index 14a61d2c5f97..efee2ea2c33a 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -13,13 +13,13 @@ # limitations under the License. -import numpy as onp +import numpy as np import scipy.special as osp_special from .. import lax from .. import util from ..api import custom_transforms, defjvp -from ..numpy import lax_numpy as np +from ..numpy import lax_numpy as jnp from ..numpy.lax_numpy import (_wraps, asarray, _reduction_dims, _constant_like, _promote_args_inexact) @@ -100,9 +100,9 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False): if b is not None or return_sign: raise NotImplementedError("Only implemented for b=None, return_sign=False") dims = _reduction_dims(a, axis) - shape = util.subvals(onp.shape(a), zip(dims, (1,) * len(dims))) + shape = util.subvals(np.shape(a), zip(dims, (1,) * len(dims))) dimadd = lambda x: lax.reshape(x, shape) - amax = lax.reduce(a, _constant_like(a, -onp.inf), lax.max, dims) + amax = lax.reduce(a, _constant_like(a, -np.inf), lax.max, dims) amax = lax.select(lax.is_finite(amax), amax, lax.full_like(amax, 0)) amax_singletons = dimadd(amax) out = lax.add(lax.log(lax.reduce(lax.exp(lax.sub(a, amax_singletons)), @@ -126,7 +126,7 @@ def xlog1py(x, y): def entr(x): x, = _promote_args_inexact("entr", x) return lax.select(lax.lt(x, _constant_like(x, 0)), - lax.full_like(x, -onp.inf), + lax.full_like(x, -np.inf), lax.neg(xlogy(x, x))) @@ -136,9 +136,9 @@ def multigammaln(a, d): d = lax.convert_element_type(d, lax.dtype(a)) constant = lax.mul(lax.mul(lax.mul(_constant_like(a, 0.25), d), lax.sub(d, _constant_like(a, 1))), - lax.log(_constant_like(a, onp.pi))) - res = np.sum(gammaln(np.expand_dims(a, axis=-1) - - lax.div(np.arange(d), _constant_like(a, 2))), + lax.log(_constant_like(a, np.pi))) + res = jnp.sum(gammaln(jnp.expand_dims(a, axis=-1) - + lax.div(jnp.arange(d), _constant_like(a, 2))), axis=-1) return res + constant @@ -206,15 +206,15 @@ def multigammaln(a, d): # appears to be zero, relative to scipy's (which is always 64bit). They were # then made more conservative just to be safe. (Conservative means use the # expansion more than we probably need to.) -_LOGNDTR_FLOAT64_LOWER = onp.array(-20, onp.float64) -_LOGNDTR_FLOAT32_LOWER = onp.array(-10, onp.float32) +_LOGNDTR_FLOAT64_LOWER = np.array(-20, np.float64) +_LOGNDTR_FLOAT32_LOWER = np.array(-10, np.float32) # Upper bound values were chosen by examining for which values of 'x' # Log[cdf(x)] is 0, after which point we need to use the approximation # Log[cdf(x)] = Log[1 - cdf(-x)] approx -cdf(-x). We chose a value slightly # conservative, meaning we use the approximation earlier than needed. -_LOGNDTR_FLOAT64_UPPER = onp.array(8, onp.float64) -_LOGNDTR_FLOAT32_UPPER = onp.array(5, onp.float32) +_LOGNDTR_FLOAT64_UPPER = np.array(8, np.float64) +_LOGNDTR_FLOAT32_UPPER = np.array(5, np.float32) def ndtr(x): @@ -240,9 +240,9 @@ def ndtr(x): Raises: TypeError: if `x` is not floating-type. """ - x = np.asarray(x) + x = jnp.asarray(x) dtype = lax.dtype(x) - if dtype not in (np.float32, np.float64): + if dtype not in (jnp.float32, jnp.float64): raise TypeError( "x.dtype={} is not supported, see docstring for supported types." .format(dtype)) @@ -252,7 +252,7 @@ def ndtr(x): def _ndtr(x): """Implements ndtr core logic.""" dtype = lax.dtype(x).type - half_sqrt_2 = dtype(0.5) * onp.sqrt(2., dtype=dtype) + half_sqrt_2 = dtype(0.5) * np.sqrt(2., dtype=dtype) w = x * half_sqrt_2 z = lax.abs(w) y = lax.select(lax.lt(z, half_sqrt_2), @@ -281,9 +281,9 @@ def ndtri(p): Raises: TypeError: if `p` is not floating-type. """ - x = np.asarray(p) + x = jnp.asarray(p) dtype = lax.dtype(p) - if dtype not in (np.float32, np.float64): + if dtype not in (jnp.float32, jnp.float64): raise TypeError( "x.dtype={} is not supported, see docstring for supported types." .format(dtype)) @@ -348,23 +348,23 @@ def _ndtri(p): 6.79019408009981274425E-9])) dtype = lax.dtype(p).type - shape = np.shape(p) + shape = jnp.shape(p) def _create_polynomial(var, coeffs): """Compute n_th order polynomial via Horner's method.""" - coeffs = onp.array(coeffs, dtype) + coeffs = np.array(coeffs, dtype) if not coeffs.size: - return np.zeros_like(var) + return jnp.zeros_like(var) return coeffs[0] + _create_polynomial(var, coeffs[1:]) * var - maybe_complement_p = np.where(p > dtype(-onp.expm1(-2.)), dtype(1.) - p, p) + maybe_complement_p = jnp.where(p > dtype(-np.expm1(-2.)), dtype(1.) - p, p) # Write in an arbitrary value in place of 0 for p since 0 will cause NaNs # later on. The result from the computation when p == 0 is not used so any # number that doesn't result in NaNs is fine. - sanitized_mcp = np.where( + sanitized_mcp = jnp.where( maybe_complement_p <= dtype(0.), - np.full(shape, dtype(0.5)), + jnp.full(shape, dtype(0.5)), maybe_complement_p) # Compute x for p > exp(-2): x/sqrt(2pi) = w + w**3 P0(w**2)/Q0(w**2). @@ -372,7 +372,7 @@ def _create_polynomial(var, coeffs): ww = lax.square(w) x_for_big_p = w + w * ww * (_create_polynomial(ww, p0) / _create_polynomial(ww, q0)) - x_for_big_p *= -dtype(onp.sqrt(2. * onp.pi)) + x_for_big_p *= -dtype(np.sqrt(2. * np.pi)) # Compute x for p <= exp(-2): x = z - log(z)/z - (1/z) P(1/z) / Q(1/z), # where z = sqrt(-2. * log(p)), and P/Q are chosen between two different @@ -388,14 +388,14 @@ def _create_polynomial(var, coeffs): x_for_small_p = first_term - second_term_small_p x_otherwise = first_term - second_term_otherwise - x = np.where(sanitized_mcp > dtype(onp.exp(-2.)), - x_for_big_p, - np.where(z >= dtype(8.0), x_for_small_p, x_otherwise)) + x = jnp.where(sanitized_mcp > dtype(np.exp(-2.)), + x_for_big_p, + jnp.where(z >= dtype(8.0), x_for_small_p, x_otherwise)) - x = np.where(p > dtype(1. - onp.exp(-2.)), x, -x) - infinity = np.full(shape, dtype(onp.inf)) - x_nan_replaced = np.where( - p <= dtype(0.0), -infinity, np.where(p >= dtype(1.0), infinity, x)) + x = jnp.where(p > dtype(1. - np.exp(-2.)), x, -x) + infinity = jnp.full(shape, dtype(np.inf)) + x_nan_replaced = jnp.where( + p <= dtype(0.0), -infinity, jnp.where(p >= dtype(1.0), infinity, x)) return x_nan_replaced @@ -467,17 +467,17 @@ def log_ndtr(x, series_order=3): if series_order > 30: raise ValueError("series_order must be <= 30.") - x = np.asarray(x) + x = jnp.asarray(x) dtype = lax.dtype(x) - if dtype == np.float64: + if dtype == jnp.float64: lower_segment = _LOGNDTR_FLOAT64_LOWER upper_segment = _LOGNDTR_FLOAT64_UPPER - elif dtype == np.float32: + elif dtype == jnp.float32: lower_segment = _LOGNDTR_FLOAT32_LOWER upper_segment = _LOGNDTR_FLOAT32_UPPER else: - raise TypeError("x.dtype={} is not supported.".format(onp.dtype(dtype))) + raise TypeError("x.dtype={} is not supported.".format(np.dtype(dtype))) # The basic idea here was ported from: # https://root.cern.ch/doc/v608/SpecFuncCephesInv_8cxx_source.html @@ -493,13 +493,13 @@ def log_ndtr(x, series_order=3): # the gradient of a select involves the calculation 1*dy+0*(-inf)=nan # regardless of whether dy is finite. Note that the minimum is a NOP if # the branch is chosen. - return np.where( + return jnp.where( lax.gt(x, upper_segment), -_ndtr(-x), # log(1-x) ~= -x, x << 1 - np.where(lax.gt(x, lower_segment), - lax.log(_ndtr(lax.max(x, lower_segment))), - _log_ndtr_lower(lax.min(x, lower_segment), - series_order))) + jnp.where(lax.gt(x, lower_segment), + lax.log(_ndtr(lax.max(x, lower_segment))), + _log_ndtr_lower(lax.min(x, lower_segment), + series_order))) def _log_ndtr_lower(x, series_order): @@ -507,7 +507,7 @@ def _log_ndtr_lower(x, series_order): dtype = lax.dtype(x).type x_2 = lax.square(x) # Log of the term multiplying (1 + sum) - log_scale = -dtype(0.5) * x_2 - lax.log(-x) - dtype(0.5 * onp.log(2. * onp.pi)) + log_scale = -dtype(0.5) * x_2 - lax.log(-x) - dtype(0.5 * np.log(2. * np.pi)) return log_scale + lax.log(_log_ndtr_asymptotic_series(x, series_order)) @@ -515,13 +515,13 @@ def _log_ndtr_asymptotic_series(x, series_order): """Calculates the asymptotic series used in log_ndtr.""" dtype = lax.dtype(x).type if series_order <= 0: - return onp.array(1, dtype) + return np.array(1, dtype) x_2 = lax.square(x) - even_sum = np.zeros_like(x) - odd_sum = np.zeros_like(x) + even_sum = jnp.zeros_like(x) + odd_sum = jnp.zeros_like(x) x_2n = x_2 # Start with x^{2*1} = x^{2*n} with n = 1. for n in range(1, series_order + 1): - y = onp.array(_double_factorial(2 * n - 1), dtype) / x_2n + y = np.array(_double_factorial(2 * n - 1), dtype) / x_2n if n % 2: odd_sum += y else: @@ -532,10 +532,10 @@ def _log_ndtr_asymptotic_series(x, series_order): def _double_factorial(n): """The double factorial function for small Python integer `n`.""" - return onp.prod(onp.arange(n, 1, -2)) + return np.prod(np.arange(n, 1, -2)) -_norm_logpdf_constant = onp.log(onp.sqrt(2 * onp.pi)) +_norm_logpdf_constant = np.log(np.sqrt(2 * np.pi)) def _norm_logpdf(x): neg_half = _constant_like(x, -0.5) diff --git a/jax/scipy/stats/bernoulli.py b/jax/scipy/stats/bernoulli.py index 4c36b75b6f99..9a406fd643e2 100644 --- a/jax/scipy/stats/bernoulli.py +++ b/jax/scipy/stats/bernoulli.py @@ -13,24 +13,23 @@ # limitations under the License. -import numpy as onp import scipy.stats as osp_stats from ... import lax -from ...numpy import lax_numpy as np +from ...numpy import lax_numpy as jnp from ..special import xlogy, xlog1py -@np._wraps(osp_stats.bernoulli.logpmf, update_doc=False) +@jnp._wraps(osp_stats.bernoulli.logpmf, update_doc=False) def logpmf(k, p, loc=0): - k, p, loc = np._promote_args_inexact("bernoulli.logpmf", k, p, loc) - zero = np._constant_like(k, 0) - one = np._constant_like(k, 1) + k, p, loc = jnp._promote_args_inexact("bernoulli.logpmf", k, p, loc) + zero = jnp._constant_like(k, 0) + one = jnp._constant_like(k, 1) x = lax.sub(k, loc) log_probs = xlogy(x, p) + xlog1py(lax.sub(one, x), -p) - return np.where(np.logical_or(lax.lt(x, zero), lax.gt(x, one)), - -np.inf, log_probs) + return jnp.where(jnp.logical_or(lax.lt(x, zero), lax.gt(x, one)), + -jnp.inf, log_probs) -@np._wraps(osp_stats.bernoulli.pmf, update_doc=False) +@jnp._wraps(osp_stats.bernoulli.pmf, update_doc=False) def pmf(k, p, loc=0): - return np.exp(logpmf(k, p, loc)) + return jnp.exp(logpmf(k, p, loc)) diff --git a/jax/scipy/stats/beta.py b/jax/scipy/stats/beta.py index 2194115b1f4e..210c90b6b679 100644 --- a/jax/scipy/stats/beta.py +++ b/jax/scipy/stats/beta.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - -import numpy as onp import scipy.stats as osp_stats from ... import lax diff --git a/jax/scipy/stats/cauchy.py b/jax/scipy/stats/cauchy.py index 3f99a05cc01f..a57c59f960b0 100644 --- a/jax/scipy/stats/cauchy.py +++ b/jax/scipy/stats/cauchy.py @@ -13,7 +13,7 @@ # limitations under the License. -import numpy as onp +import numpy as np import scipy.stats as osp_stats from ... import lax @@ -24,7 +24,7 @@ def logpdf(x, loc=0, scale=1): x, loc, scale = _promote_args_inexact("cauchy.logpdf", x, loc, scale) one = _constant_like(x, 1) - pi = _constant_like(x, onp.pi) + pi = _constant_like(x, np.pi) scaled_x = lax.div(lax.sub(x, loc), scale) normalize_term = lax.log(lax.mul(pi, scale)) return lax.neg(lax.add(normalize_term, lax.log1p(lax.mul(scaled_x, scaled_x)))) diff --git a/jax/scipy/stats/dirichlet.py b/jax/scipy/stats/dirichlet.py index 998ef0e14647..1287d396cd12 100644 --- a/jax/scipy/stats/dirichlet.py +++ b/jax/scipy/stats/dirichlet.py @@ -13,30 +13,30 @@ # limitations under the License. -import numpy as onp +import numpy as np import scipy.stats as osp_stats from ... import lax -from ...numpy import lax_numpy as np +from ...numpy import lax_numpy as jnp from ..special import gammaln, xlogy def _is_simplex(x): - x_sum = np.sum(x, axis=-1) - return np.all(x > 0, axis=-1) & (x_sum <= 1) & (x_sum > 1 - 1e-6) + x_sum = jnp.sum(x, axis=-1) + return jnp.all(x > 0, axis=-1) & (x_sum <= 1) & (x_sum > 1 - 1e-6) -@np._wraps(osp_stats.dirichlet.logpdf, update_doc=False) +@jnp._wraps(osp_stats.dirichlet.logpdf, update_doc=False) def logpdf(x, alpha): - args = (onp.ones((0,), lax.dtype(x)), onp.ones((1,), lax.dtype(alpha))) + args = (np.ones((0,), lax.dtype(x)), np.ones((1,), lax.dtype(alpha))) to_dtype = lax.dtype(osp_stats.dirichlet.logpdf(*args)) x, alpha = [lax.convert_element_type(arg, to_dtype) for arg in (x, alpha)] - one = np._constant_like(x, 1) - normalize_term = np.sum(gammaln(alpha), axis=-1) - gammaln(np.sum(alpha, axis=-1)) - log_probs = lax.sub(np.sum(xlogy(lax.sub(alpha, one), x), axis=-1), normalize_term) - return np.where(_is_simplex(x), log_probs, -np.inf) + one = jnp._constant_like(x, 1) + normalize_term = jnp.sum(gammaln(alpha), axis=-1) - gammaln(jnp.sum(alpha, axis=-1)) + log_probs = lax.sub(jnp.sum(xlogy(lax.sub(alpha, one), x), axis=-1), normalize_term) + return jnp.where(_is_simplex(x), log_probs, -jnp.inf) -@np._wraps(osp_stats.dirichlet.pdf, update_doc=False) +@jnp._wraps(osp_stats.dirichlet.pdf, update_doc=False) def pdf(x, alpha): return lax.exp(logpdf(x, alpha)) diff --git a/jax/scipy/stats/expon.py b/jax/scipy/stats/expon.py index edf22f89d22d..dd4be664f784 100644 --- a/jax/scipy/stats/expon.py +++ b/jax/scipy/stats/expon.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - -import numpy as onp import scipy.stats as osp_stats from ... import lax diff --git a/jax/scipy/stats/gamma.py b/jax/scipy/stats/gamma.py index f63a88689fcd..dff9b55cccfd 100644 --- a/jax/scipy/stats/gamma.py +++ b/jax/scipy/stats/gamma.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - -import numpy as onp import scipy.stats as osp_stats from ... import lax diff --git a/jax/scipy/stats/laplace.py b/jax/scipy/stats/laplace.py index c8609e09f881..145d8fa68ee3 100644 --- a/jax/scipy/stats/laplace.py +++ b/jax/scipy/stats/laplace.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - -import numpy as onp import scipy.stats as osp_stats from ... import lax diff --git a/jax/scipy/stats/multivariate_normal.py b/jax/scipy/stats/multivariate_normal.py index 02865bcf0851..7e7bf535fe5c 100644 --- a/jax/scipy/stats/multivariate_normal.py +++ b/jax/scipy/stats/multivariate_normal.py @@ -13,7 +13,7 @@ # limitations under the License. -import numpy as onp +import numpy as np import scipy.stats as osp_stats from ... import lax @@ -28,7 +28,7 @@ def logpdf(x, mean, cov): two = _constant_like(x, 2) dim = _constant_like(x, mean.shape[0]) det_sig = det(cov).astype(cov.dtype) - log_normalizer = lax.log(lax.mul(lax.pow(_constant_like(x, 2 * onp.pi), dim), + log_normalizer = lax.log(lax.mul(lax.pow(_constant_like(x, 2 * np.pi), dim), det_sig)) x_shape = x.shape[:-1] if x_shape: diff --git a/jax/scipy/stats/norm.py b/jax/scipy/stats/norm.py index 1746d2fc4af6..5de14085d82e 100644 --- a/jax/scipy/stats/norm.py +++ b/jax/scipy/stats/norm.py @@ -13,11 +13,11 @@ # limitations under the License. -import numpy as onp +import numpy as np import scipy.stats as osp_stats from ... import lax -from ... import numpy as np +from ...numpy import lax_numpy as jnp from ...numpy.lax_numpy import _promote_args_inexact, _constant_like, _wraps from .. import special @@ -26,7 +26,7 @@ def logpdf(x, loc=0, scale=1): x, loc, scale = _promote_args_inexact("norm.logpdf", x, loc, scale) two = _constant_like(x, 2) scale_sqrd = lax.pow(scale, two) - log_normalizer = lax.log(lax.mul(_constant_like(x, 2 * onp.pi), scale_sqrd)) + log_normalizer = lax.log(lax.mul(_constant_like(x, 2 * np.pi), scale_sqrd)) quadratic = lax.div(lax.pow(lax.sub(x, loc), two), scale_sqrd) return lax.div(lax.neg(lax.add(log_normalizer, quadratic)), two) @@ -50,4 +50,4 @@ def logcdf(x, loc=0, scale=1): @_wraps(osp_stats.norm.ppf, update_doc=False) def ppf(q, loc=0, scale=1): - return np.array(special.ndtri(q) * scale + loc, 'float64') \ No newline at end of file + return jnp.array(special.ndtri(q) * scale + loc, 'float64') diff --git a/jax/scipy/stats/pareto.py b/jax/scipy/stats/pareto.py index 17508471e8f1..38e412a9afe7 100644 --- a/jax/scipy/stats/pareto.py +++ b/jax/scipy/stats/pareto.py @@ -13,7 +13,6 @@ # limitations under the License. -import numpy as onp import scipy.stats as osp_stats from ... import lax diff --git a/jax/scipy/stats/t.py b/jax/scipy/stats/t.py index 648841e11bd7..d8434b4a8fc6 100644 --- a/jax/scipy/stats/t.py +++ b/jax/scipy/stats/t.py @@ -13,7 +13,7 @@ # limitations under the License. -import numpy as onp +import numpy as np import scipy.stats as osp_stats from ... import lax @@ -27,7 +27,7 @@ def logpdf(x, df, loc=0, scale=1): scaled_x = lax.div(lax.sub(x, loc), scale) df_over_two = lax.div(df, two) df_plus_one_over_two = lax.add(df_over_two, _constant_like(x, 0.5)) - normalize_term_const = lax.mul(lax.mul(scale, scale), _constant_like(x, onp.pi)) + normalize_term_const = lax.mul(lax.mul(scale, scale), _constant_like(x, np.pi)) normalize_term_tmp = lax.div(lax.log(lax.mul(normalize_term_const, df)), two) normalize_term = lax.sub(lax.add(lax.lgamma(df_over_two), normalize_term_tmp), lax.lgamma(df_plus_one_over_two)) From 04a027b85309b87e92d8b77f7d425838bc8de593 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 9 Mar 2020 10:01:09 +0100 Subject: [PATCH 0830/1053] Replaced self.assertTrue(...===...) with assertEquals (#2383) This was caught in internal presubmit tests --- tests/lax_numpy_test.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index b2ff24bf07c1..3875336380c4 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1087,7 +1087,7 @@ def attempt_sideeffect(x): expected_onp_input_after_call = onp.ones((1)) expected_jnp_input_after_call = jnp.ones((1)) - self.assertTrue(type(jnp.concatenate([onp_input])) is jnp.DeviceArray) + self.assertIs(type(jnp.concatenate([onp_input])), jnp.DeviceArray) attempt_sideeffect(onp_input) attempt_sideeffect(jnp_input) @@ -2186,14 +2186,14 @@ def testArange(self): self.assertRaises(TypeError, lambda: jnp.arange()) # test that jnp.arange(N) doesn't instantiate an ndarray - self.assertFalse(type(jnp.arange(77)) == type(onp.arange(77))) - self.assertTrue(type(jnp.arange(77)) == type(lax.iota(onp.int32, 77))) + self.assertNotEquals(type(jnp.arange(77)), type(onp.arange(77))) + self.assertEquals(type(jnp.arange(77)), type(lax.iota(onp.int32, 77))) # test that jnp.arange(N, dtype=int32) doesn't instantiate an ndarray - self.assertFalse(type(jnp.arange(77, dtype=jnp.int32)) == - type(onp.arange(77, dtype=onp.int32))) - self.assertTrue(type(jnp.arange(77, dtype=jnp.int32)) == - type(lax.iota(onp.int32, 77))) + self.assertNotEquals(type(jnp.arange(77, dtype=jnp.int32)), + type(onp.arange(77, dtype=onp.int32))) + self.assertEquals(type(jnp.arange(77, dtype=jnp.int32)), + type(lax.iota(onp.int32, 77))) # test laziness for int dtypes self.assertTrue(xla.is_device_constant(jnp.arange(77))) From 89dcfe67c0a1356f310683b3222551a8bd04be67 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 9 Mar 2020 10:08:56 +0100 Subject: [PATCH 0831/1053] Replace assertEquals with assertEqual (#2384) --- tests/lax_numpy_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 3875336380c4..f5af83cddc72 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2186,13 +2186,13 @@ def testArange(self): self.assertRaises(TypeError, lambda: jnp.arange()) # test that jnp.arange(N) doesn't instantiate an ndarray - self.assertNotEquals(type(jnp.arange(77)), type(onp.arange(77))) - self.assertEquals(type(jnp.arange(77)), type(lax.iota(onp.int32, 77))) + self.assertNotEqual(type(jnp.arange(77)), type(onp.arange(77))) + self.assertEqual(type(jnp.arange(77)), type(lax.iota(onp.int32, 77))) # test that jnp.arange(N, dtype=int32) doesn't instantiate an ndarray - self.assertNotEquals(type(jnp.arange(77, dtype=jnp.int32)), + self.assertNotEqual(type(jnp.arange(77, dtype=jnp.int32)), type(onp.arange(77, dtype=onp.int32))) - self.assertEquals(type(jnp.arange(77, dtype=jnp.int32)), + self.assertEqual(type(jnp.arange(77, dtype=jnp.int32)), type(lax.iota(onp.int32, 77))) # test laziness for int dtypes From 1e7d13b5f944f011effa46c2ac0876c21bd37b98 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Mon, 9 Mar 2020 09:14:23 +0000 Subject: [PATCH 0832/1053] Give `Var`s an `aval`. (#2299) --- jax/abstract_arrays.py | 230 ++--------------------------- jax/core.py | 243 ++++++++++++++++++++++++++++++- jax/interpreters/partial_eval.py | 25 +++- jax/lax/lax_control_flow.py | 8 +- tests/core_test.py | 20 +-- 5 files changed, 288 insertions(+), 238 deletions(-) diff --git a/jax/abstract_arrays.py b/jax/abstract_arrays.py index e9b0a7b6e844..5bd9d573c432 100644 --- a/jax/abstract_arrays.py +++ b/jax/abstract_arrays.py @@ -12,222 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. - -import operator - import numpy as onp -from . import core from . import ad_util +from . import core from . import dtypes -from . util import prod, partialmethod - - -def concretization_err_msg(fun, context=None): - fname = getattr(fun, "__name__", fun) - if context is None: - context = ("The function to be transformed can't be traced at the required level " - "of abstraction. If using `jit`, try using `static_argnums` or " - "applying `jit` to smaller subfunctions instead.") - msg = "Abstract value passed to `{}`, which requires a concrete value. {}" - return msg.format(fname, context) - -def concretization_function_error(fun, context=None): - def error(self, *args): - raise TypeError(concretization_err_msg(fun, context)) - return error - - -class UnshapedArray(core.AbstractValue): - __slots__ = ['dtype', 'weak_type'] - array_abstraction_level = 2 - - def __init__(self, dtype, weak_type=False): - self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)) - self.weak_type = weak_type - - def __eq__(self, other): - return (type(self) is type(other) and self.dtype == other.dtype and - self.weak_type == other.weak_type) - - def __ne__(self, other): - return not self == other - - def __hash__(self): - # can use hash(self.dtype) and rely on the fact that numpy reuses base dtype - # objects, e.g. `onp.zeros(3).dtype is onp.zeros(4).dtype`, or we can use - # the unique character code via hash(self.dtype.char) - return hash((self.dtype, self.weak_type)) - - def __repr__(self): - return '{}({}{})'.format(self.__class__.__name__, self.str_short(), - ", weak_type=True" if self.weak_type else "") - - _bool = _nonzero = concretization_function_error(bool) - _float = concretization_function_error( - float, "Try using `value.astype(float)` instead.") - _int = concretization_function_error( - int, "Try using `value.astype(int)` instead.") - _complex = concretization_function_error( - complex, "Try using `value.astype(complex)` instead.") - _hex = concretization_function_error(hex) - _oct = concretization_function_error(oct) - - def at_least_vspace(self): - return self - - def join(self, other): - if self.dtype == other.dtype: - if self.weak_type == other.weak_type: - return self - else: - return UnshapedArray(self.dtype, weak_type=False) - else: - raise TypeError(self, other) - - def str_short(self): - return self.dtype.name - - def strip_weak_type(self): - """Returns a copy of the aval with weak_type=False.""" - return UnshapedArray(self.dtype) if self.weak_type else self - -# Registry for valid dimension types. This is used by masking.Poly. -_DIMENSION_TYPES = {int} - -def _canonicalize_dimension(dim): - if type(dim) in _DIMENSION_TYPES: - return dim - else: - return operator.index(dim) - -def canonicalize_shape(shape): - """Canonicalizes and checks for errors in a user-provided shape value. - - Args: - shape: a Python value that represents a shape. - - Returns: - A tuple of integers. - """ - try: - return tuple(map(_canonicalize_dimension, shape)) - except TypeError: - pass - msg = ("Shapes must be 1D sequences of concrete values of integer type, " - "got {}.") - if any(isinstance(x, core.Tracer) and isinstance(core.get_aval(x), ShapedArray) - and not isinstance(core.get_aval(x), ConcreteArray) for x in shape): - msg += ("\nIf using `jit`, try using `static_argnums` or applying `jit` to " - "smaller subfunctions.") - raise TypeError(msg.format(shape)) +_DIMENSION_TYPES = core._DIMENSION_TYPES -class ShapedArray(UnshapedArray): - __slots__ = ['shape'] - array_abstraction_level = 1 - - def __init__(self, shape, dtype, weak_type=False): - super(ShapedArray, self).__init__(dtype, weak_type=weak_type) - self.shape = canonicalize_shape(shape) - - ndim = property(lambda self: len(self.shape)) - size = property(lambda self: prod(self.shape)) - - def __eq__(self, other): - return (type(self) is type(other) - and self.dtype == other.dtype and self.shape == other.shape - and self.weak_type == other.weak_type) - - def __hash__(self): - # can use hash(self.dtype) and rely on the fact that numpy reuses base dtype - # objects, e.g. `onp.zeros(3).dtype is onp.zeros(4).dtype`, or we can use - # the unique character code via hash(self.dtype.char) - return hash((self.shape, self.dtype, self.weak_type)) - - def at_least_vspace(self): - return self - - def join(self, other): - if self.shape == other.shape and self.dtype == other.dtype: - if self.weak_type == other.weak_type: - return self - else: - return ShapedArray(self.shape, self.dtype, weak_type=False) - elif self.dtype == other.dtype: - return UnshapedArray(self.dtype) - else: - raise TypeError(self, other) - - def str_short(self): - shapestr = ','.join(map(str, self.shape)) - return '{}[{}]'.format(self.dtype.name, shapestr) - - def __len__(self): - try: - return self.shape[0] - except IndexError: - raise TypeError("len() of unsized object") # same as numpy error - - def _len(self, ignored_tracer): - return len(self) - - def strip_weak_type(self): - return ShapedArray(self.shape, self.dtype) if self.weak_type else self - -def _forward_to_value(self, fun, ignored_tracer, *args): - return fun(self.val, *args) - -class ConcreteArray(ShapedArray): - __slots__ = ['val'] - array_abstraction_level = 0 - - def __init__(self, val, weak_type=False): - super(ConcreteArray, self).__init__(onp.shape(val), onp.result_type(val), - weak_type=weak_type) - # Note: canonicalized self.dtype doesn't necessarily match self.val - self.val = val - assert self.dtype != onp.dtype('O') - - def __eq__(self, other): - return (type(self) is type(other) and self.dtype == other.dtype - and self.shape == other.shape and self.weak_type == other.weak_type - and onp.all(self.val == other.val)) - - def __hash__(self): - return id(self.val) - - def at_least_vspace(self): - return ShapedArray(self.shape, self.dtype, weak_type=self.weak_type) - - def join(self, other): - if self == other: - return self - elif self.shape == other.shape and self.dtype == other.dtype: - return ShapedArray(self.shape, self.dtype, - weak_type=self.weak_type and other.weak_type) - elif self.dtype == other.dtype: - return UnshapedArray(self.dtype, - weak_type=self.weak_type and other.weak_type) - else: - raise TypeError(self, other) - - def str_short(self): - return str(self.val) - - def strip_weak_type(self): - return ConcreteArray(self.val) if self.weak_type else self - - _bool = _nonzero = partialmethod(_forward_to_value, bool) - _float = partialmethod(_forward_to_value, float) - _int = partialmethod(_forward_to_value, int) - _complex = partialmethod(_forward_to_value, complex) - _hex = partialmethod(_forward_to_value, hex) - _oct = partialmethod(_forward_to_value, oct) - -class AbstractToken(core.AbstractValue): pass - -abstract_token = AbstractToken() +UnshapedArray = core.UnshapedArray +ShapedArray = core.ShapedArray +ConcreteArray = core.ConcreteArray +AbstractToken = core.AbstractToken +abstract_token = core.abstract_token +canonicalize_shape = core.canonicalize_shape +concretization_err_msg = core.concretization_err_msg +raise_to_shaped = core.raise_to_shaped def make_shaped_array(x): @@ -256,16 +56,6 @@ def zeros_like_shaped_array(aval): ad_util.aval_zeros_likers[ShapedArray] = zeros_like_shaped_array -def raise_to_shaped(aval, weak_type=False): - if isinstance(aval, ShapedArray): - return ShapedArray(aval.shape, aval.dtype, weak_type=weak_type) - elif aval is core.abstract_unit: - return core.abstract_unit - elif aval is abstract_token: - return abstract_token - else: - raise TypeError(type(aval)) - core.literalable_types.update(array_types) def _zeros_like_python_scalar(x): diff --git a/jax/core.py b/jax/core.py index 3ea23a67ba0e..871772886f5d 100644 --- a/jax/core.py +++ b/jax/core.py @@ -13,6 +13,7 @@ # limitations under the License. +import operator from operator import attrgetter from contextlib import contextmanager from collections import namedtuple, Counter, defaultdict @@ -22,8 +23,11 @@ import threading import types +import numpy as onp + +from . import dtypes from . import linear_util as lu -from .util import safe_zip, safe_map, partial, curry +from .util import safe_zip, safe_map, partial, curry, prod, partialmethod from .pprint_util import pp, vcat, hcat, pp_kv_pairs # TODO(dougalm): the trace cache breaks the leak detector. Consisder solving. @@ -79,6 +83,14 @@ def __init__(self, jaxpr, literals, in_avals, out_avals): assert all(isinstance(aval, AbstractValue) for aval in in_avals) assert all(isinstance(aval, AbstractValue) for aval in out_avals) + if not skip_checks: + in_avals_raised = [raise_to_shaped(v) for v in in_avals] + out_avals_raised = [raise_to_shaped(v) for v in out_avals] + exp_in_avals = [v.aval for v in jaxpr.invars] + exp_out_avals = [v.aval for v in jaxpr.outvars] + assert in_avals_raised == exp_in_avals, f"expected: {exp_in_avals}, got: {in_avals_raised}" + assert out_avals_raised == exp_out_avals, f"expected: {exp_out_avals}, got: {out_avals_raised}" + self.jaxpr = jaxpr self.literals = list(literals) self.in_avals = list(in_avals) @@ -108,9 +120,10 @@ class Var(object): # TODO(frostig,mattjj): We don't override __eq__ or __hash__, so comparison is # by object id, but pretty printing might collide. - def __init__(self, count, suffix): + def __init__(self, count, suffix, aval): self.count = count self.suffix = suffix + self.aval = raise_to_shaped(aval) def __lt__(self, other): if not isinstance(other, Var): @@ -130,7 +143,7 @@ def __repr__(self): def gensym(suffix): counter = it.count() - return lambda: Var(next(counter), suffix) + return lambda aval: Var(next(counter), suffix, aval) class Literal(object): __slots__ = ["val", "hash"] @@ -146,6 +159,10 @@ def __init__(self, val): except (TypeError, AttributeError): self.hash = None + @property + def aval(self): + return raise_to_shaped(get_aval(self.val)) + def __hash__(self): assert False @@ -604,6 +621,8 @@ def __repr__(self): return '*' literalable_types.add(Unit) class UnitVar(object): + @property + def aval(self): return abstract_unit def __repr__(self): return '*' unitvar = UnitVar() @@ -613,6 +632,224 @@ def __repr__(self): return '*' identity_p.def_impl(lambda x: x) identity_p.def_custom_bind(lambda x: x) +def concretization_err_msg(fun, context=None): + fname = getattr(fun, "__name__", fun) + if context is None: + context = ("The function to be transformed can't be traced at the required level " + "of abstraction. If using `jit`, try using `static_argnums` or " + "applying `jit` to smaller subfunctions instead.") + msg = "Abstract value passed to `{}`, which requires a concrete value. {}" + return msg.format(fname, context) + +def concretization_function_error(fun, context=None): + def error(self, *args): + raise TypeError(concretization_err_msg(fun, context)) + return error + + +class UnshapedArray(AbstractValue): + __slots__ = ['dtype', 'weak_type'] + array_abstraction_level = 2 + + def __init__(self, dtype, weak_type=False): + self.dtype = onp.dtype(dtypes.canonicalize_dtype(dtype)) + self.weak_type = weak_type + + def __eq__(self, other): + return (type(self) is type(other) and self.dtype == other.dtype and + self.weak_type == other.weak_type) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + # can use hash(self.dtype) and rely on the fact that numpy reuses base dtype + # objects, e.g. `onp.zeros(3).dtype is onp.zeros(4).dtype`, or we can use + # the unique character code via hash(self.dtype.char) + return hash((self.dtype, self.weak_type)) + + def __repr__(self): + return '{}({}{})'.format(self.__class__.__name__, self.str_short(), + ", weak_type=True" if self.weak_type else "") + + _bool = _nonzero = concretization_function_error(bool) + _float = concretization_function_error( + float, "Try using `value.astype(float)` instead.") + _int = concretization_function_error( + int, "Try using `value.astype(int)` instead.") + _complex = concretization_function_error( + complex, "Try using `value.astype(complex)` instead.") + _hex = concretization_function_error(hex) + _oct = concretization_function_error(oct) + + def at_least_vspace(self): + return self + + def join(self, other): + if self.dtype == other.dtype: + if self.weak_type == other.weak_type: + return self + else: + return UnshapedArray(self.dtype, weak_type=False) + else: + raise TypeError(self, other) + + def str_short(self): + return self.dtype.name + + def strip_weak_type(self): + """Returns a copy of the aval with weak_type=False.""" + return UnshapedArray(self.dtype) if self.weak_type else self + +class ShapedArray(UnshapedArray): + __slots__ = ['shape'] + array_abstraction_level = 1 + + def __init__(self, shape, dtype, weak_type=False): + super(ShapedArray, self).__init__(dtype, weak_type=weak_type) + self.shape = canonicalize_shape(shape) + + ndim = property(lambda self: len(self.shape)) + size = property(lambda self: prod(self.shape)) + + def __eq__(self, other): + return (type(self) is type(other) + and self.dtype == other.dtype and self.shape == other.shape + and self.weak_type == other.weak_type) + + def __hash__(self): + # can use hash(self.dtype) and rely on the fact that numpy reuses base dtype + # objects, e.g. `onp.zeros(3).dtype is onp.zeros(4).dtype`, or we can use + # the unique character code via hash(self.dtype.char) + return hash((self.shape, self.dtype, self.weak_type)) + + def at_least_vspace(self): + return self + + def join(self, other): + if self.shape == other.shape and self.dtype == other.dtype: + if self.weak_type == other.weak_type: + return self + else: + return ShapedArray(self.shape, self.dtype, weak_type=False) + elif self.dtype == other.dtype: + return UnshapedArray(self.dtype) + else: + raise TypeError(self, other) + + def str_short(self): + shapestr = ','.join(map(str, self.shape)) + return '{}[{}]'.format(self.dtype.name, shapestr) + + def __len__(self): + try: + return self.shape[0] + except IndexError: + raise TypeError("len() of unsized object") # same as numpy error + + def _len(self, ignored_tracer): + return len(self) + + def strip_weak_type(self): + return ShapedArray(self.shape, self.dtype) if self.weak_type else self + + +def _forward_to_value(self, fun, ignored_tracer, *args): + return fun(self.val, *args) + +class ConcreteArray(ShapedArray): + __slots__ = ['val'] + array_abstraction_level = 0 + + def __init__(self, val, weak_type=False): + super(ConcreteArray, self).__init__(onp.shape(val), onp.result_type(val), + weak_type=weak_type) + # Note: canonicalized self.dtype doesn't necessarily match self.val + self.val = val + assert self.dtype != onp.dtype('O') + + def __eq__(self, other): + return (type(self) is type(other) and self.dtype == other.dtype + and self.shape == other.shape and self.weak_type == other.weak_type + and onp.all(self.val == other.val)) + + def __hash__(self): + return id(self.val) + + def at_least_vspace(self): + return ShapedArray(self.shape, self.dtype, weak_type=self.weak_type) + + def join(self, other): + if self == other: + return self + elif self.shape == other.shape and self.dtype == other.dtype: + return ShapedArray(self.shape, self.dtype, + weak_type=self.weak_type and other.weak_type) + elif self.dtype == other.dtype: + return UnshapedArray(self.dtype, + weak_type=self.weak_type and other.weak_type) + else: + raise TypeError(self, other) + + def str_short(self): + return str(self.val) + + def strip_weak_type(self): + return ConcreteArray(self.val) if self.weak_type else self + + _bool = _nonzero = partialmethod(_forward_to_value, bool) + _float = partialmethod(_forward_to_value, float) + _int = partialmethod(_forward_to_value, int) + _complex = partialmethod(_forward_to_value, complex) + _hex = partialmethod(_forward_to_value, hex) + _oct = partialmethod(_forward_to_value, oct) + + +class AbstractToken(AbstractValue): pass + +abstract_token = AbstractToken() + + +def raise_to_shaped(aval, weak_type=False): + if isinstance(aval, ShapedArray): + return ShapedArray(aval.shape, aval.dtype, weak_type=weak_type) + elif aval is abstract_unit: + return abstract_unit + elif aval is abstract_token: + return abstract_token + else: + raise TypeError(type(aval)) + +# Registry for valid dimension types. This is used by masking.Poly. +_DIMENSION_TYPES = {int} + +def _canonicalize_dimension(dim): + if type(dim) in _DIMENSION_TYPES: + return dim + else: + return operator.index(dim) + +def canonicalize_shape(shape): + """Canonicalizes and checks for errors in a user-provided shape value. + + Args: + shape: a Python value that represents a shape. + + Returns: + A tuple of integers. + """ + try: + return tuple(map(_canonicalize_dimension, shape)) + except TypeError: + pass + msg = ("Shapes must be 1D sequences of concrete values of integer type, " + "got {}.") + if any(isinstance(x, Tracer) and isinstance(get_aval(x), ShapedArray) + and not isinstance(get_aval(x), ConcreteArray) for x in shape): + msg += ("\nIf using `jit`, try using `static_argnums` or applying `jit` to " + "smaller subfunctions.") + raise TypeError(msg.format(shape)) + # ------------------- Call ------------------- diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index cf1437c872f2..0ab35401fdfc 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -423,20 +423,31 @@ def tracers_to_jaxpr(in_tracers, out_tracers): `invars`. """ newvar = core.gensym('') - t_to_var = defaultdict(newvar) - getvar = lambda t: t_to_var[id(t)] + t_to_var = {} + def getvar(t): + var = t_to_var.get(id(t)) + if var is None: + var = newvar(partial_val_aval(*t.pval)) + t_to_var[id(t)] = var + return var sorted_tracers = toposort(out_tracers) invars = map(getvar, in_tracers) eqns = [] env = {} consts = {} - const_to_var = defaultdict(newvar) + const_to_var = {} + def getconstvar(c): + var = const_to_var.get(id(c)) + if var is None: + var = newvar(get_aval(c)) + const_to_var[id(c)] = var + return var processed_eqn_ids = set() for t in sorted_tracers: recipe = t.recipe if isinstance(recipe, JaxprEqnRecipe): if recipe.eqn_id not in processed_eqn_ids: - eqns.append(recipe_to_eqn(newvar, getvar, recipe)) + eqns.append(recipe_to_eqn(lambda: newvar(core.abstract_unit), getvar, recipe)) processed_eqn_ids.add(recipe.eqn_id) elif isinstance(recipe, LambdaBinding): if not any(t is in_tracer for in_tracer in in_tracers): @@ -445,7 +456,7 @@ def tracers_to_jaxpr(in_tracers, out_tracers): elif isinstance(recipe, FreeVar): env[getvar(t)] = recipe.val elif isinstance(recipe, ConstVar): - v = t_to_var[id(t)] = const_to_var[id(recipe.val)] + v = t_to_var[id(t)] = getconstvar(recipe.val) consts[v] = recipe.val elif isinstance(recipe, Literal): t_to_var[id(t)] = recipe @@ -495,6 +506,10 @@ def fun(*vals): # jaxpr_2 :: [a2, res] -> b2 jaxpr_2 = convert_constvars_jaxpr(jaxpr_2) jaxpr_2.invars = jaxpr_2.invars[num_res:] + jaxpr_2.invars[:num_res] + for var, unknown in zip(jaxpr_2.invars[:len(unknowns)], unknowns): + if not unknown: + var.aval = abstract_unit + uk_out = [pv is not None for pv in out_pvs_2] in_avals_1, in_avals_2 = unzip2(map(_split_aval, unknowns, jaxpr.in_avals)) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 45fa07aee6fa..bbfa60e757ad 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -32,6 +32,7 @@ from jax import linear_util as lu from jax.abstract_arrays import ShapedArray, raise_to_shaped from jax.api_util import flatten_fun_nokwargs, apply_flat_fun_nokwargs +from jax.core import get_aval from jax.interpreters import ad from jax.interpreters import partial_eval as pe from jax.interpreters import xla @@ -341,7 +342,7 @@ def _while_loop_jvp(primals, tangents, cond_nconsts, cond_jaxpr, body_nconsts, newvar = core.gensym('') invars_aug = ( - cond_jaxpr.jaxpr.invars + [newvar() for _ in range(len(init_dot))]) + cond_jaxpr.jaxpr.invars + [newvar(get_aval(x)) for x in init_dot]) cond_jaxpr_augmented = core.Jaxpr(cond_jaxpr.jaxpr.constvars, invars_aug, cond_jaxpr.jaxpr.outvars, @@ -947,6 +948,11 @@ def _scan_partial_eval(trace, *tracers, forward, length, num_consts, num_carry, const_avals_1 = [raise_to_shaped(core.get_aval(c)) for c in consts_1] in_avals_1 = [core.abstract_unit] * num_consts + jaxpr_1.in_avals[num_consts:] out_avals_1 = [core.abstract_unit if pv is None else pv for pv, c in out_pvals_1] + + # TODO(cjfj): Explain the need for the code below. + for var in untyped_jaxpr_1.invars[:num_consts]: + var.aval = core.abstract_unit + jaxpr_1_opt = pe.TypedJaxpr(pe.convert_constvars_jaxpr(untyped_jaxpr_1), (), const_avals_1 + in_avals_1, out_avals_1) num_consts_1 = num_consts + len(consts_1) diff --git a/tests/core_test.py b/tests/core_test.py index 53ef0609bd7a..8d7ea8007c31 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -275,30 +275,32 @@ def f(x): def test_comparing_var(self): newsym = core.gensym('') - a = newsym() - b = newsym() - c = newsym() + a = newsym(core.abstract_unit) + b = newsym(core.abstract_unit) + c = newsym(core.abstract_unit) assert a < b < c assert c > b > a assert a != b and b != c and a != c def test_var_ordering(self): newsym = core.gensym('') - a = newsym() - b = newsym() - c = newsym() + a = newsym(core.abstract_unit) + b = newsym(core.abstract_unit) + c = newsym(core.abstract_unit) for ordering in it.permutations([a, b, c]): assert sorted(list(ordering)) == [a, b, c] def test_var_compared_by_identity(self): - a1 = core.gensym('')() - a2 = core.gensym('')() + a1 = core.gensym('')(core.abstract_unit) + a2 = core.gensym('')(core.abstract_unit) assert str(a1) == str(a2) assert a1 != a2 def test_var_tree_flatten(self): newsym = core.gensym('') - a, b, c, d = newsym(), newsym(), newsym(), newsym() + a, b, c, d = ( + newsym(core.abstract_unit), newsym(core.abstract_unit), + newsym(core.abstract_unit), newsym(core.abstract_unit)) syms = {c: d, a: b} assert 'bd' == ''.join(map(str, tree_leaves(syms))) From 05e5ccfdd57877fafbb828f9d59782af6bec2c27 Mon Sep 17 00:00:00 2001 From: Lucas Theis Date: Mon, 9 Mar 2020 14:08:32 +0100 Subject: [PATCH 0833/1053] Minor fix to docs which mentioned IOHW where it should be OIHW (#2381) --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 20966f035cfb..f9717342c39c 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -1440,7 +1440,7 @@ "source": [ "These are the simple convenience functions for convolutions\n", "\n", - "️⚠️ The convenience `lax.conv`, `lax.conv_with_general_padding` helper function assume __NCHW__ images and __IOHW__ kernels." + "️⚠️ The convenience `lax.conv`, `lax.conv_with_general_padding` helper function assume __NCHW__ images and __OIHW__ kernels." ] }, { @@ -1479,7 +1479,7 @@ ], "source": [ "out = lax.conv(np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", - " np.transpose(kernel,[2,3,0,1]), # rhs = IOHW conv kernel tensor\n", + " np.transpose(kernel,[3,2,0,1]), # rhs = OIHW conv kernel tensor\n", " (1, 1), # window strides\n", " 'SAME') # padding mode\n", "print(\"out shape: \", out.shape)\n", From 0080c89548ff032cd1cc00e9fbc647028c1ec8fc Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Mon, 9 Mar 2020 13:35:21 +0000 Subject: [PATCH 0834/1053] Fix a few type annotations in `api.py`. (#2387) --- jax/api.py | 83 +++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/jax/api.py b/jax/api.py index 0e0a4cca1a6f..d432d10f9dc7 100644 --- a/jax/api.py +++ b/jax/api.py @@ -30,7 +30,7 @@ import operator as op import os import threading -from typing import Any, Callable, List, Optional, Tuple, Union +from typing import Any, Callable, Collection, Optional, Sequence, Tuple, Union from warnings import warn import numpy as onp @@ -62,6 +62,8 @@ from .interpreters.masking import shapecheck, ensure_poly from .config import flags, config, bool_env +AxisName = Any + map = safe_map zip = safe_zip @@ -81,8 +83,8 @@ def __init__(self): _thread_local_state = _ThreadLocalState() -def jit(fun: Callable, static_argnums: Tuple[int] = (), device=None, - backend: Optional[str] = None): +def jit(fun: Callable, static_argnums: Union[int, Collection[int]] = (), + device=None, backend: Optional[str] = None): """Sets up `fun` for just-in-time compilation with XLA. Args: @@ -94,12 +96,13 @@ def jit(fun: Callable, static_argnums: Tuple[int] = (), device=None, provided they are hashable and have an equality operation defined. Static arguments are included as part of a compilation cache key, which is why hash and equality operators must be defined. - static_argnums: A tuple of ints specifying which positional arguments to - treat as static (compile-time constant). Operations that only depend on - static arguments will be constant-folded. Calling the jitted function with - different values for these constants will trigger recompilation. If the - jitted function is called with fewer positional arguments than indicated - by `static_argnums` then an error is raised. Defaults to (). + static_argnums: An int or collection of ints specifying which positional + arguments to treat as static (compile-time constant). Operations that only + depend on static arguments will be constant-folded. Calling the jitted + function with different values for these constants will trigger + recompilation. If the jitted function is called with fewer positional + arguments than indicated by `static_argnums` then an error is raised. + Defaults to (). device: This is an experimental feature and the API is likely to change. Optional, the Device the jitted function will run on. (Available devices can be retrieved via ``jax.devices()``.) The default is inherited from @@ -195,8 +198,9 @@ def disable_jit(): _thread_local_state.jit_is_disabled = prev_val -def xla_computation(fun: Callable, static_argnums: Tuple[int] = (), - axis_env: Optional[List[Tuple[Any, int]]] = None, +def xla_computation(fun: Callable, + static_argnums: Union[int, Collection[int]] = (), + axis_env: Optional[Sequence[Tuple[AxisName, int]]] = None, backend: Optional[str] = None, tuple_args: bool = False, instantiate_const_outputs: bool = True): @@ -205,9 +209,9 @@ def xla_computation(fun: Callable, static_argnums: Tuple[int] = (), Args: fun: Function from which to form XLA computations. static_argnums: See the ``jax.jit`` docstring. - axis_env: Optional, a list of pairs where the first element is an axis name - and the second element is a positive integer representing the size of the - mapped axis with that name. This parameter is useful when lowering + axis_env: Optional, a sequence of pairs where the first element is an axis + name and the second element is a positive integer representing the size of + the mapped axis with that name. This parameter is useful when lowering functions that involve parallel communication collectives, and it specifies the axis name/size environment that would be set up by applications of ``jax.pmap``. See the examples below. @@ -284,6 +288,7 @@ def xla_computation(fun: Callable, static_argnums: Tuple[int] = (), ROOT tuple.18 = (f32[], f32[], f32[]) tuple(all-reduce.7, all-reduce.12, all-reduce.17) } """ + del static_argnums # Unused. _check_callable(fun) fun_name = getattr(fun, '__name__', 'unknown') @@ -314,7 +319,7 @@ def computation_maker(*args, **kwargs): return c.Build(c.Tuple(*outs)) return computation_maker -def grad(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, +def grad(fun: Callable, argnums: Union[int, Sequence[int]] = 0, has_aux: bool = False, holomorphic: bool = False): """Creates a function which evaluates the gradient of `fun`. @@ -323,8 +328,8 @@ def grad(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, `argnums` should be arrays, scalars, or standard Python containers. It should return a scalar (which includes arrays with shape `()` but not arrays with shape `(1,)` etc.) - argnums: Optional, integer or tuple of integers. Specifies which positional - argument(s) to differentiate with respect to (default 0). + argnums: Optional, integer or sequence of integers. Specifies which + positional argument(s) to differentiate with respect to (default 0). has_aux: Optional, bool. Indicates whether `fun` returns a pair where the first element is considered the output of the mathematical function to be differentiated and the second element is auxiliary data. Default False. @@ -365,7 +370,7 @@ def grad_f_aux(*args, **kwargs): return grad_f_aux if has_aux else grad_f -def value_and_grad(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, +def value_and_grad(fun: Callable, argnums: Union[int, Sequence[int]] = 0, has_aux: bool = False, holomorphic: bool = False): """Creates a function which evaluates both `fun` and the gradient of `fun`. @@ -374,8 +379,8 @@ def value_and_grad(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, `argnums` should be arrays, scalars, or standard Python containers. It should return a scalar (which includes arrays with shape `()` but not arrays with shape `(1,)` etc.) - argnums: Optional, integer or tuple of integers. Specifies which positional - argument(s) to differentiate with respect to (default 0). + argnums: Optional, integer or sequence of integers. Specifies which + positional argument(s) to differentiate with respect to (default 0). has_aux: Optional, bool. Indicates whether `fun` returns a pair where the first element is considered the output of the mathematical function to be differentiated and the second element is auxiliary data. Default False. @@ -386,7 +391,7 @@ def value_and_grad(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, A function with the same arguments as `fun` that evaluates both `fun` and the gradient of `fun` and returns them as a pair (a two-element tuple). If `argnums` is an integer then the gradient has the same shape and type as the - positional argument indicated by that integer. If argnums is a tuple of + positional argument indicated by that integer. If argnums is a sequence of integers, the gradient is a tuple of values with the same shapes and types as the corresponding arguments. """ @@ -444,14 +449,14 @@ def _check_scalar(x): raise TypeError(msg("had abstract value {}".format(aval))) -def jacfwd(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, +def jacfwd(fun: Callable, argnums: Union[int, Sequence[int]] = 0, holomorphic: bool = False): """Jacobian of `fun` evaluated column-by-column using forward-mode AD. Args: fun: Function whose Jacobian is to be computed. - argnums: Optional, integer or tuple of integers. Specifies which positional - argument(s) to differentiate with respect to (default `0`). + argnums: Optional, integer or sequence of integers. Specifies which + positional argument(s) to differentiate with respect to (default `0`). holomorphic: Optional, bool. Indicates whether `fun` is promised to be holomorphic. Default False. @@ -490,13 +495,13 @@ def _check_real_input_jacfwd(x): raise TypeError(msg.format(aval.dtype.name)) -def jacrev(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, +def jacrev(fun: Callable, argnums: Union[int, Sequence[int]] = 0, holomorphic: bool = False): """Jacobian of `fun` evaluated row-by-row using reverse-mode AD. Args: fun: Function whose Jacobian is to be computed. - argnums: Optional, integer or tuple of integers. Specifies which positional + argnums: Optional, integer or sequence of integers. Specifies which positional argument(s) to differentiate with respect to (default `0`). holomorphic: Optional, bool. Indicates whether `fun` is promised to be holomorphic. Default False. @@ -538,14 +543,14 @@ def _check_real_output_jacrev(x): raise TypeError(msg.format(aval.dtype.name)) -def hessian(fun: Callable, argnums: Union[int, Tuple[int, ...]] = 0, +def hessian(fun: Callable, argnums: Union[int, Sequence[int]] = 0, holomorphic: bool = False): """Hessian of `fun`. Args: fun: Function whose Hessian is to be computed. - argnums: Optional, integer or tuple of integers. Specifies which positional - argument(s) to differentiate with respect to (default `0`). + argnums: Optional, integer or sequence of integers. Specifies which + positional argument(s) to differentiate with respect to (default `0`). holomorphic: Optional, bool. Indicates whether `fun` is promised to be holomorphic. Default False. @@ -725,8 +730,8 @@ def _flatten_axes(treedef, axis_tree): return axes -def pmap(fun: Callable, axis_name: Any = None, - static_broadcasted_argnums: Tuple[int] = (), +def pmap(fun: Callable, axis_name: Optional[AxisName] = None, + static_broadcasted_argnums: Union[int, Collection[int]] = (), devices=None, backend: Optional[str] = None, axis_size: Optional[int] = None): """Parallel map with support for collectives. @@ -771,13 +776,13 @@ def pmap(fun: Callable, axis_name: Any = None, (tuple/list/dict) thereof. axis_name: Optional, a hashable Python object used to identify the mapped axis so that parallel collectives can be applied. - static_broadcasted_argnums: A tuple of ints specifying which positional - arguments to treat as static (compile-time constant). Operations that - only depend on static arguments will be constant-folded. Calling the - pmaped function with different values for these constants will trigger - recompilation. If the pmaped function is called with fewer positional - arguments than indicated by `static_argnums` then an error is raised. - Each of the static arguments will be broadcasted to all devices. + static_broadcasted_argnums: An int or collection of ints specifying which + positional arguments to treat as static (compile-time constant). + Operations that only depend on static arguments will be constant-folded. + Calling the pmaped function with different values for these constants will + trigger recompilation. If the pmaped function is called with fewer + positional arguments than indicated by `static_argnums` then an error is + raised. Each of the static arguments will be broadcasted to all devices. Defaults to (). devices: This is an experimental feature and the API is likely to change. Optional, a sequence of Devices to map over. (Available devices can be @@ -945,7 +950,7 @@ def __eq__(self, other): return self.obj is other.obj -def soft_pmap(fun: Callable, axis_name: Optional[Any] = None, +def soft_pmap(fun: Callable, axis_name: Optional[AxisName] = None, backend: Optional[str] = None): warn("soft_pmap is an experimental feature and probably has bugs!") _check_callable(fun) From a5daafd31d409d531dcf7e67f5fd82dc3c98f602 Mon Sep 17 00:00:00 2001 From: Winnie Xu Date: Mon, 9 Mar 2020 10:04:23 -0400 Subject: [PATCH 0835/1053] update gitignore (#2361) --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0634eefb195f..4bb1fed81704 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,4 @@ dist/ docs/notebooks/.ipynb_checkpoints/ docs/_autosummary .idea - +.vscode From 25dd419c2c6225695e83df4e69d0704aaa6f82f4 Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Mon, 9 Mar 2020 14:05:40 +0000 Subject: [PATCH 0836/1053] share rng and predicate between all foiled args (#2375) This doesn't appear to be a performance disadvantage, and it makes reading the HLO infinitely easier, as there's now only one pair of RNG/constants per remat call. --- jax/interpreters/xla.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 5117dd955abe..643d6e69fd94 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -977,23 +977,26 @@ def _remat_translation_rule(c, axis_env, in_nodes, del device, concrete # Unused. subc = xb.make_computation_builder("remat_call_subcomputation") args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - args = [_foil_cse(subc, x) for x in args] + args = _foil_cse(subc, args) out_nodes = jaxpr_subcomp(subc, call_jaxpr, backend, axis_env, (), extend_name_stack(name_stack, wrap_name(name, 'remat')), *args) subc = subc.Build(subc.Tuple(*out_nodes)) return c.Call(subc, list(in_nodes)) call_translations[pe.remat_call_p] = _remat_translation_rule -def _foil_cse(c, x): - xla_shape = c.GetShape(x) - if xla_shape.is_tuple(): - assert not xla_shape.tuple_shapes() - return x - else: - rng = c.RngUniform(c.Constant(onp.array(0, dtype=onp.float32)), - c.Constant(onp.array(1, dtype=onp.float32)), - []) - pred = c.Lt(rng, c.Constant(onp.array(2, dtype=onp.float32))) - shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() - zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) - return c.Select(pred, x, zero) +def _foil_cse(c, args): + rng = c.RngUniform(c.Constant(onp.array(0, dtype=onp.float32)), + c.Constant(onp.array(1, dtype=onp.float32)), + []) + pred = c.Lt(rng, c.Constant(onp.array(2, dtype=onp.float32))) + outs = [] + for x in args: + xla_shape = c.GetShape(x) + if xla_shape.is_tuple(): + assert not xla_shape.tuple_shapes() + outs.append(x) + else: + shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() + zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) + outs.append(c.Select(pred, x, zero)) + return outs From 8339511eb50891b66536b03330e844c415e3e86b Mon Sep 17 00:00:00 2001 From: us <22618852+us@users.noreply.github.com> Date: Mon, 9 Mar 2020 17:07:12 +0300 Subject: [PATCH 0837/1053] Implement NumPy sorting routines. (#2318) Implement `np.msort`. Related issue: #2079 --- docs/jax.numpy.rst | 1 + jax/numpy/lax_numpy.py | 5 +++++ tests/lax_numpy_test.py | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index f23219da4a95..b7f049fb4049 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -170,6 +170,7 @@ Not every function in NumPy is implemented; contributions are welcome! minimum mod moveaxis + msort multiply nan_to_num nancumprod diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0f8228acb206..cc8359326989 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2667,6 +2667,11 @@ def argsort(a, axis=-1, kind='quicksort', order=None): return perm +@_wraps(onp.msort) +def msort(a): + return sort(a, axis=0) + + @_wraps(onp.roll) def roll(a, shift, axis=None): a = asarray(a) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index f5af83cddc72..77f8d974dcb1 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1812,6 +1812,13 @@ def testArgsortManually(self): expected = onp.argsort(x) self.assertAllClose(expected, ans, check_dtypes=False) + def testMsortManually(self): + args_maker = lambda: [onp.random.randint(50, size=(5 ,5))] + lnp_op = lambda x: lnp.msort(x) + onp_op = lambda x: onp.msort(x) + self._CheckAgainstNumpy(lnp_op, onp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_shifts={}_axis={}".format( jtu.format_shape_dtype_string(shape, dtype), From 411c8a4bda1b99d43e0119bcb317657c954856dd Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 9 Mar 2020 10:17:42 -0400 Subject: [PATCH 0838/1053] Update lnp -> jnp to fix test failure after merge. (#2389) --- tests/lax_numpy_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 77f8d974dcb1..8213578f6914 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1814,10 +1814,10 @@ def testArgsortManually(self): def testMsortManually(self): args_maker = lambda: [onp.random.randint(50, size=(5 ,5))] - lnp_op = lambda x: lnp.msort(x) + jnp_op = lambda x: jnp.msort(x) onp_op = lambda x: onp.msort(x) - self._CheckAgainstNumpy(lnp_op, onp_op, args_maker, check_dtypes=True) - self._CompileAndCheck(lnp_op, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(jnp_op, onp_op, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_shifts={}_axis={}".format( From c53ae2c47706d3c6cae5c50b88e8b1f2ef392700 Mon Sep 17 00:00:00 2001 From: JL2718 Date: Mon, 9 Mar 2020 11:43:45 -0700 Subject: [PATCH 0839/1053] automatic detection of wheel version (#2373) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index aa087a215091..a9fc2d59c20b 100644 --- a/README.md +++ b/README.md @@ -433,6 +433,12 @@ for Python 3.5, 3.6, 3.7, and 3.8; for anything else, you must build from source. Jax requires Python 3.5 or above. Jax does not support Python 2 any more. +To try automatic detection of the correct version for your system, you can run: + +```bash +pip install --upgrade https://storage.googleapis.com/jax-releases/`nvcc -V | sed -En "s/.* release ([0-9]*)\.([0-9]*),.*/cuda\1\2/p"`/jaxlib-0.1.40-`python3 -V | sed -En "s/Python ([0-9]*)\.([0-9]*).*/cp\1\2/p"`-none-linux_x86_64.whl jax +``` + Please let us know on [the issue tracker](https://github.com/google/jax/issues) if you run into any errors or problems with the prebuilt wheels. From 282225f676a4dddd170047de377f831f44ea2304 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 9 Mar 2020 20:41:01 +0100 Subject: [PATCH 0840/1053] Added some pytype annotations (#2386) Tried to catch all uses of linear_util.WrappedFun --- jax/api.py | 2 +- jax/core.py | 4 ++-- jax/interpreters/ad.py | 4 ++-- jax/interpreters/batching.py | 8 ++++---- jax/interpreters/masking.py | 6 +++--- jax/interpreters/parallel.py | 4 ++-- jax/interpreters/partial_eval.py | 6 +++--- jax/interpreters/pxla.py | 4 ++-- jax/interpreters/sharded_jit.py | 4 ++-- jax/interpreters/xla.py | 4 ++-- jax/lax/lax_control_flow.py | 5 +++-- jax/linear_util.py | 12 ++++++------ 12 files changed, 32 insertions(+), 31 deletions(-) diff --git a/jax/api.py b/jax/api.py index d432d10f9dc7..7772596c7e37 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1427,7 +1427,7 @@ def device_get(x): return tree_map(_device_get, x) -def _argnums_partial(f, dyn_argnums, args): +def _argnums_partial(f: lu.WrappedFun, dyn_argnums, args): if isinstance(dyn_argnums, int): dyn_argnums = (dyn_argnums,) else: diff --git a/jax/core.py b/jax/core.py index 871772886f5d..43865c70c685 100644 --- a/jax/core.py +++ b/jax/core.py @@ -876,7 +876,7 @@ def process_env_traces(primitive, level, params_tuple, *args): todo.append(cur_todo) yield outs, tuple(todo) # Ensure the aux output is immutable -def call_bind(primitive, f, *args, **params): +def call_bind(primitive, f: lu.WrappedFun, *args, **params): top_trace = find_top_trace(args) level = trace_state.trace_stack.next_level(True) if top_trace is None else top_trace.level params_tuple = tuple(params.items()) @@ -890,7 +890,7 @@ def call_bind(primitive, f, *args, **params): return apply_todos(env_trace_todo(), outs) -def call_impl(f, *args, **params): +def call_impl(f: lu.WrappedFun, *args, **params): del params # params parameterize the call primitive, not the function return f.call_wrapped(*args) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 9b3c557ad991..9679f6dc3db4 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -34,7 +34,7 @@ def identity(x): return x -def jvp(fun, has_aux=False, instantiate=True) -> Any: +def jvp(fun: lu.WrappedFun, has_aux=False, instantiate=True) -> Any: if not has_aux: return jvpfun(jvp_subtrace(fun), instantiate) else: @@ -297,7 +297,7 @@ def process_primitive(self, primitive, tracers, params): else: return JVPTracer(self, primal_out, tangent_out) - def process_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): assert call_primitive.multiple_results primals = [t.primal for t in tracers] tangents = [t.tangent for t in tracers] diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index bc7ee5ba4e09..64928aafb500 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -32,12 +32,12 @@ map = safe_map -def batch(fun, in_vals, in_dims, out_dim_dests): +def batch(fun: lu.WrappedFun, in_vals, in_dims, out_dim_dests): size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} out_vals, out_dims = batch_fun(fun, in_vals, in_dims) return map(partial(matchaxis, size), out_dims, out_dim_dests(), out_vals) -def batch_fun(fun, in_vals, in_dims): +def batch_fun(fun: lu.WrappedFun, in_vals, in_dims): with new_master(BatchTrace) as master: fun, out_dims = batch_subtrace(fun, master, in_dims) out_vals = fun.call_wrapped(*in_vals) @@ -114,7 +114,7 @@ def process_primitive(self, primitive, tracers, params): else: return BatchTracer(self, val_out, dim_out) - def process_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): assert call_primitive.multiple_results name = params.get('name', f.__name__) params = dict(params, name=wrap_name(name, 'vmap')) @@ -128,7 +128,7 @@ def process_call(self, call_primitive, f, tracers, params): vals_out = call_primitive.bind(f, *vals, **params) return [BatchTracer(self, v, d) for v, d in zip(vals_out, dims_out())] - def process_map(self, map_primitive, f, tracers, params): + def process_map(self, map_primitive, f: lu.WrappedFun, tracers, params): vals, dims = unzip2((t.val, t.batch_dim) for t in tracers) if all(dim is not_mapped for dim in dims): return map_primitive.bind(f, *vals, **params) diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 096584c5b564..8081ed2e7d0e 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -386,7 +386,7 @@ def process_primitive(self, primitive, tracers, params): else: return map(partial(MaskTracer, self), out, out_shape) - def process_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): raise NotImplementedError # TODO mask-of-jit shape_parameterized_primitive_rules = {} @@ -412,7 +412,7 @@ def naryop_masking_rule(prim, padded_vals, logical_shapes): ### definition-time (import-time) shape checker tracer machinery -def shapecheck(fun, in_shapes): +def shapecheck(fun: lu.WrappedFun, in_shapes): with core.new_master(ShapeCheckTrace) as master: out_shapes = check_subtrace(fun, master).call_wrapped(in_shapes) del master @@ -460,7 +460,7 @@ def process_primitive(self, primitive, tracers, params): out_shape = shape_rule(*avals, **params) return ShapeCheckTracer(self, out_shape) - def process_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): # TODO apply proper subtrace: return map(self.full_raise, f.call_wrapped(*tracers)) diff --git a/jax/interpreters/parallel.py b/jax/interpreters/parallel.py index 634c67aa0002..edf03df845d1 100644 --- a/jax/interpreters/parallel.py +++ b/jax/interpreters/parallel.py @@ -115,7 +115,7 @@ def process_primitive(self, primitive, tracers, params): val_out, axis_out = rule(name, size, vals, axes, **params) return PapplyTracer(self, name, size, val_out, axis_out) - def process_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): if call_primitive in pe.map_primitives: return self.process_map(call_primitive, f, tracers, params) names, vals, axes = unzip3((t.name, t.val, t.axis) for t in tracers) @@ -138,7 +138,7 @@ def todo(x): return PapplyTracer(trace, name, size, x, axis) return val, todo - def process_map(self, map_primitive, f, tracers, params): + def process_map(self, map_primitive, f :lu.WrappedFun, tracers, params): raise NotImplementedError # TODO(mattjj,frostig) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 0ab35401fdfc..d9cb69fe832f 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -115,7 +115,7 @@ def default_process_primitive(self, primitive, tracers, params): out_tracer.recipe = new_eqn_recipe(tracers, [out_tracer], primitive, params) return out_tracer - def process_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): name = params.get('name', f.__name__) if self.master.trace_type is StagingJaxprTrace: tracers = map(self.instantiate_const_abstracted, tracers) @@ -144,7 +144,7 @@ def process_call(self, call_primitive, f, tracers, params): t.recipe = eqn return out_tracers - def process_map(self, map_primitive, f, tracers, params): + def process_map(self, map_primitive, f: lu.WrappedFun, tracers, params): in_pvs, in_consts = unzip2([t.pval for t in tracers]) reduced_pvs = [None if pv is None else _mapped_aval(pv) for pv in in_pvs] fun, aux = partial_eval(f, self, reduced_pvs) @@ -347,7 +347,7 @@ def partial_val_aval(pv, const): else: raise TypeError(pv) -def trace_to_jaxpr(fun, pvals, instantiate=False, stage_out_calls=False, bottom=False): +def trace_to_jaxpr(fun: lu.WrappedFun, pvals, instantiate=False, stage_out_calls=False, bottom=False): """Traces a function, given abstract inputs, to a jaxpr.""" trace_type = StagingJaxprTrace if stage_out_calls else JaxprTrace with new_master(trace_type, bottom=bottom) as master: diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 51555b19b7b5..e8aaffa9ab43 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -826,7 +826,7 @@ def new_tracer(x, a): else: return new_tracer(val_out, axis_out) - def process_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): assert call_primitive.multiple_results if call_primitive in pe.map_primitives: return self.process_map(call_primitive, f, tracers, params) @@ -839,7 +839,7 @@ def process_call(self, call_primitive, f, tracers, params): vals_out = call_primitive.bind(f, *vals, **params) return [SplitAxisTracer(self, a, x) for a, x in zip(names_out(), vals_out)] - def process_map(self, map_primitive, f, tracers, params): + def process_map(self, map_primitive, f: lu.WrappedFun, tracers, params): vals, names = unzip2((t.val, t.axis_name) for t in tracers) if all(name is not_mapped for name in names): return map_primitive.bind(f, *vals, **params) diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index 955b8235dad6..8dfcf27dd114 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -134,7 +134,7 @@ def _chunk(lst, sz): @lu.cache -def _sharded_callable(fun, partitions, name, *abstract_args): +def _sharded_callable(fun: lu.WrappedFun, partitions, name, *abstract_args): nrep = 1 # TODO generalize in_pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] @@ -263,7 +263,7 @@ def jaxpr_partitions(jaxpr): ### sharded_call -def _sharded_call_impl(fun, *args, **params): +def _sharded_call_impl(fun: lu.WrappedFun, *args, **params): partitions = params.pop("partitions") name = params.pop("name") assert not params, params diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 643d6e69fd94..74ade6a8c2c3 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -444,7 +444,7 @@ def jaxpr_collectives(jaxpr): ### xla_call underlying jit -def _xla_call_impl(fun, *args, device, backend, name): +def _xla_call_impl(fun: lu.WrappedFun, *args, device, backend, name): compiled_fun = _xla_callable(fun, device, backend, name, *map(arg_spec, args)) try: return compiled_fun(*args) @@ -454,7 +454,7 @@ def _xla_call_impl(fun, *args, device, backend, name): return fun.call_wrapped(*args) # probably won't return @lu.cache -def _xla_callable(fun, device, backend, name, *arg_specs): +def _xla_callable(fun: lu.WrappedFun, device, backend, name, *arg_specs): if device is not None and backend is not None: raise ValueError("can't specify both a device and a backend for jit, " "got device={} and backend={}".format(device, backend)) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index bbfa60e757ad..b365fc01c373 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -22,6 +22,7 @@ import itertools import operator import threading +from typing import Callable import numpy as onp @@ -52,7 +53,7 @@ @cache() -def _initial_style_jaxpr(fun, in_tree, in_avals): +def _initial_style_jaxpr(fun: Callable, in_tree, in_avals): in_pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=True, @@ -1068,7 +1069,7 @@ def transposed(*res1_cbar_bbar_res2): return c_bar + a_bar return _make_typed_jaxpr(transposed, res1_avals + c_avals + b_avals + res2_avals) -def _make_typed_jaxpr(traceable, in_avals): +def _make_typed_jaxpr(traceable: lu.WrappedFun, in_avals): pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] jaxpr, pvals_out, consts = pe.trace_to_jaxpr(traceable, pvals, instantiate=True) out_avals, _ = unzip2(pvals_out) diff --git a/jax/linear_util.py b/jax/linear_util.py index ac2ad1c5eb4e..534eebafbbcc 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -62,7 +62,7 @@ def trans1(static_arg, *dynamic_args, **kwargs): data must be immutable, because it will be stored in function memoization tables. """ - +from typing import Any, Tuple import weakref from .util import curry @@ -122,7 +122,7 @@ def __init__(self, f, transforms, stores, params): def __name__(self): return getattr(self.f, '__name__', '') - def wrap(self, gen, gen_static_args, out_store): + def wrap(self, gen, gen_static_args, out_store) -> 'WrappedFun': """Add another transform and its store.""" return WrappedFun(self.f, ((gen, gen_static_args),) + self.transforms, (out_store,) + self.stores, self.params) @@ -172,7 +172,7 @@ def __eq__(self, other): self.params == other.params) @curry -def transformation(gen, fun: WrappedFun, *gen_static_args): +def transformation(gen, fun: WrappedFun, *gen_static_args) -> WrappedFun: """Adds one more transformation to a WrappedFun. Args: gen: the transformation generator function @@ -182,7 +182,7 @@ def transformation(gen, fun: WrappedFun, *gen_static_args): return fun.wrap(gen, gen_static_args, None) @curry -def transformation_with_aux(gen, fun: WrappedFun, *gen_static_args): +def transformation_with_aux(gen, fun: WrappedFun, *gen_static_args) -> Tuple[WrappedFun, Any]: """Adds one more transformation with auxiliary output to a WrappedFun.""" out_store = Store() out_thunk = lambda: out_store.val @@ -194,7 +194,7 @@ def fun_name(f): except: return str(f) -def wrap_init(f, params={}): +def wrap_init(f, params={}) -> WrappedFun: """Wraps function `f` as a `WrappedFun`, suitable for transformation.""" return WrappedFun(f, (), (), tuple(sorted(params.items()))) @@ -209,7 +209,7 @@ def cache(call): """ fun_caches = weakref.WeakKeyDictionary() - def memoized_fun(fun, *args): + def memoized_fun(fun: WrappedFun, *args): cache = fun_caches.setdefault(fun.f, {}) key = (fun.transforms, fun.params, args) result = cache.get(key, None) From c52f32b59d5c9d9d4d221ecaf520f9eb5cbaefd2 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 9 Mar 2020 20:42:08 +0100 Subject: [PATCH 0841/1053] Removed unused imports (#2385) Also disabled a couple more linalg tests that crash on my Mac --- jax/ad_util.py | 2 +- jax/api.py | 4 +--- jax/core.py | 2 +- jax/interpreters/batching.py | 6 +----- jax/interpreters/masking.py | 6 +++--- jax/interpreters/parallel.py | 9 ++------- jax/interpreters/partial_eval.py | 2 +- jax/interpreters/pxla.py | 6 ++---- jax/interpreters/sharded_jit.py | 2 +- jax/interpreters/xla.py | 6 ++---- jax/lax_linalg.py | 3 --- jax/nn/functions.py | 1 - jax/numpy/linalg.py | 1 - jax/numpy/vectorize.py | 1 - jax/ops/scatter.py | 6 ------ jax/util.py | 1 - tests/linalg_test.py | 4 ++++ 17 files changed, 19 insertions(+), 43 deletions(-) diff --git a/jax/ad_util.py b/jax/ad_util.py index 8c94a0e5ad5e..76aaea0d3940 100644 --- a/jax/ad_util.py +++ b/jax/ad_util.py @@ -13,7 +13,7 @@ # limitations under the License. -from .core import lattice_join, Primitive, Unit, unit, AbstractUnit, abstract_unit +from .core import lattice_join, Primitive, Unit, unit, AbstractUnit from .tree_util import register_pytree_node from .util import safe_map diff --git a/jax/api.py b/jax/api.py index 7772596c7e37..e8492db51d70 100644 --- a/jax/api.py +++ b/jax/api.py @@ -27,8 +27,6 @@ import collections import functools import itertools as it -import operator as op -import os import threading from typing import Any, Callable, Collection, Optional, Sequence, Tuple, Union from warnings import warn @@ -46,7 +44,7 @@ from .tree_util import (tree_map, tree_flatten, tree_unflatten, tree_structure, tree_transpose, tree_leaves, tree_multimap, _replace_nones) -from .util import (unzip2, unzip3, curry, partial, safe_map, safe_zip, +from .util import (unzip2, curry, partial, safe_map, safe_zip, WrapHashably, Hashable, prod, split_list, extend_name_stack, wrap_name) from .lib import xla_bridge as xb from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, diff --git a/jax/core.py b/jax/core.py index 43865c70c685..fa36f60fcbe0 100644 --- a/jax/core.py +++ b/jax/core.py @@ -16,7 +16,7 @@ import operator from operator import attrgetter from contextlib import contextmanager -from collections import namedtuple, Counter, defaultdict +from collections import namedtuple from functools import total_ordering import itertools as it from weakref import ref diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 64928aafb500..cfb484ba0322 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -13,16 +13,12 @@ # limitations under the License. -from collections import namedtuple - -import itertools as it - import numpy as onp from .. import core from .. import dtypes from ..core import Trace, Tracer, new_master -from ..abstract_arrays import ShapedArray, make_shaped_array, array_types, raise_to_shaped +from ..abstract_arrays import ShapedArray, raise_to_shaped from ..ad_util import add_jaxvals, add_jaxvals_p, zeros_like_jaxval, zeros_like_p from .. import linear_util as lu from ..util import unzip2, partial, safe_map, wrap_name diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 8081ed2e7d0e..54d165f9b288 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -14,9 +14,9 @@ from contextlib import contextmanager -from collections import defaultdict, Counter, namedtuple +from collections import Counter, namedtuple import functools -from functools import partial, wraps +from functools import partial import itertools as it import operator as op import string @@ -26,7 +26,7 @@ from .. import abstract_arrays from .. import core from ..core import Trace, Tracer -from ..util import unzip2, safe_map, safe_zip, curry +from ..util import unzip2, safe_map, safe_zip from ..abstract_arrays import ShapedArray from .. import linear_util as lu diff --git a/jax/interpreters/parallel.py b/jax/interpreters/parallel.py index edf03df845d1..bd079b4835a4 100644 --- a/jax/interpreters/parallel.py +++ b/jax/interpreters/parallel.py @@ -14,19 +14,14 @@ from functools import partial -import warnings -import numpy as onp from .. import core from .. import linear_util as lu from ..core import Trace, Tracer, Primitive, new_master -from ..abstract_arrays import ShapedArray, ConcreteArray, raise_to_shaped -from ..util import safe_map, safe_zip, unzip2, unzip3, partialmethod, prod -from ..lib import xla_bridge as xb +from ..abstract_arrays import ShapedArray, raise_to_shaped +from ..util import safe_map, safe_zip, unzip2, unzip3 from . import partial_eval as pe -from . import batching -from . import pxla map = safe_map zip = safe_zip diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index d9cb69fe832f..963b3c742943 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -14,7 +14,7 @@ import itertools as it -from collections import namedtuple, Counter, defaultdict +from collections import namedtuple import contextlib import threading from weakref import ref diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index e8aaffa9ab43..112ab4e9f8ef 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -13,9 +13,8 @@ # limitations under the License. -from collections import namedtuple, defaultdict +from collections import defaultdict from contextlib import contextmanager -import itertools as it import operator as op import threading @@ -28,10 +27,9 @@ from .. import lazy from ..abstract_arrays import (ConcreteArray, ShapedArray, array_types, raise_to_shaped) -from ..util import (partial, unzip2, concatenate, prod, safe_map, +from ..util import (partial, unzip2, prod, safe_map, extend_name_stack, wrap_name) from ..lib import xla_bridge as xb -from .xla import aval_to_xla_shape, xla_destructure from .batching import broadcast, not_mapped from . import batching from . import partial_eval as pe diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index 8dfcf27dd114..bd6e2b32c2f0 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -18,7 +18,7 @@ import numpy as onp from .. import core -from ..abstract_arrays import ShapedArray, ConcreteArray, array_types, abstract_token +from ..abstract_arrays import ShapedArray, ConcreteArray, array_types from . import partial_eval as pe from . import xla from .. import linear_util as lu diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 74ade6a8c2c3..c579ab1e8fa4 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -13,10 +13,9 @@ # limitations under the License. -from collections import namedtuple, defaultdict +from collections import defaultdict import itertools as it import operator as op -import os from absl import logging import numpy as onp @@ -24,14 +23,13 @@ from ..config import flags, bool_env from .. import core from .. import ad_util -from .. import tree_util from .. import dtypes from .. import lazy from .. import linear_util as lu from ..abstract_arrays import (ConcreteArray, ShapedArray, AbstractToken, make_shaped_array, array_types, raise_to_shaped, abstract_token) -from ..core import valid_jaxtype, Literal, pp_eqn_compact +from ..core import Literal, pp_eqn_compact from ..pprint_util import pp from ..util import (partial, partialmethod, cache, safe_map, prod, unzip2, memoize, extend_name_stack, wrap_name) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index a9e8dc84e3d2..e0039424c1c0 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -21,8 +21,6 @@ from jax.numpy.vectorize import vectorize from jax import ad_util from jax import api -from jax import api_util -from jax import core from jax import lax from jax import ops from jax import dtypes @@ -34,7 +32,6 @@ from jax.core import Primitive from jax.lax import (standard_primitive, standard_unop, naryop_dtype_rule, _float, _complex, _input_dtype, _broadcasting_select) -from jax.lib import xla_client from jax.lib import lapack from jax.lib import cusolver diff --git a/jax/nn/functions.py b/jax/nn/functions.py index f385eb3660b8..051d7f6d1b52 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -20,7 +20,6 @@ from jax import dtypes from jax import custom_transforms, defjvp from jax import lax -from jax import random from jax.scipy.special import expit import jax.numpy as np diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 58f0a4b1c5f2..512adb35af6a 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -16,7 +16,6 @@ from functools import partial import numpy as onp -import warnings import textwrap import operator from typing import Tuple, Union, cast diff --git a/jax/numpy/vectorize.py b/jax/numpy/vectorize.py index d297c4c45eb6..f2278b3c6ecd 100644 --- a/jax/numpy/vectorize.py +++ b/jax/numpy/vectorize.py @@ -20,7 +20,6 @@ from .. import api from .. import lax -from .. import linear_util as lu from . import lax_numpy as np from ..util import safe_map as map, safe_zip as zip from .lax_numpy import _wraps diff --git a/jax/ops/scatter.py b/jax/ops/scatter.py index d75784470acf..f097d3aad9d6 100644 --- a/jax/ops/scatter.py +++ b/jax/ops/scatter.py @@ -15,13 +15,7 @@ # Helpers for indexed updates. -import collections -from functools import partial - -import numpy as onp - from .. import lax -from ..api import jit from ..numpy import lax_numpy as np diff --git a/jax/util.py b/jax/util.py index 489080ae1ce5..0d76f100f87f 100644 --- a/jax/util.py +++ b/jax/util.py @@ -13,7 +13,6 @@ # limitations under the License. -import collections import functools import itertools as it import types diff --git a/tests/linalg_test.py b/tests/linalg_test.py index 0551cd6a320b..cd7d66ce95bb 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -128,6 +128,8 @@ def testDetOfSingularMatrix(self): def testTensorsolve(self, m, nq, dtype, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) + if m == 23: + _skip_on_mac_xla_bug() # According to numpy docs the shapes are as follows: # Coefficient tensor (a), of shape b.shape + Q. @@ -619,6 +621,8 @@ def _args_gen(): for rng_factory in [jtu.rand_default])) def testTensorinv(self, shape, dtype, rng_factory): _skip_if_unsupported_type(dtype) + if shape[0] > 100: + _skip_on_mac_xla_bug() rng = rng_factory() def tensor_maker(): From ac6a313cfc6c4b753bf88f7a533f8d57304ece86 Mon Sep 17 00:00:00 2001 From: bddppq Date: Mon, 9 Mar 2020 13:04:59 -0700 Subject: [PATCH 0842/1053] Fix ONNX mnist example (#2374) * Fix ONNX mnist example * use np to compute the shape; rename jax.numpy as jnp --- examples/onnx2xla.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/examples/onnx2xla.py b/examples/onnx2xla.py index 1ef915035086..5950593d66ed 100644 --- a/examples/onnx2xla.py +++ b/examples/onnx2xla.py @@ -14,17 +14,18 @@ """An ONNX to XLA compiler by JAX-tracing a Numpy-backed ONNX interpreter.""" -from cStringIO import StringIO +from io import BytesIO from functools import partial import hashlib +import urllib.request import sys +import numpy as np import onnx from onnx import numpy_helper -from onnx import onnx_pb2 -import urllib -import jax.numpy as np +import jax.numpy as jnp +import jax.ops from jax import jit, grad from jax import lax @@ -33,7 +34,7 @@ def _asarray(proto): return numpy_helper.to_array(proto).reshape(tuple(proto.dims)) -attr_types = dict(onnx_pb2.AttributeProto.AttributeType.items()) +attr_types = dict(onnx.AttributeProto.AttributeType.items()) attribute_handlers = { attr_types['FLOAT']: lambda a: a.f, attr_types['INT']: lambda a: a.i, @@ -52,7 +53,7 @@ def onnx_maxpool(x, kernel_shape, pads=None, strides=None): dims = prefix + tuple(kernel_shape) pads = tuple(pads) if pads else [0] * len(kernel_shape) strides = (prefix + tuple(strides)) if strides else [1] * len(kernel_shape) - return [lax.reduce_window(x, -np.inf, lax.max, dims, strides, 'VALID')] + return [lax.reduce_window(x, -jnp.inf, lax.max, dims, strides, 'VALID')] def onnx_conv(x, w, b=0, group=1, kernel_shape=None, pads=None, strides=None, @@ -62,7 +63,7 @@ def onnx_conv(x, w, b=0, group=1, kernel_shape=None, pads=None, strides=None, kernel_shape = kernel_shape or w.shape strides = strides or [1] * (w.ndim - 2) if auto_pad: - auto_pad = 'SAME' if auto_pad.startswith('SAME') else 'VALID' + auto_pad = 'SAME' if auto_pad.startswith(b'SAME') else 'VALID' pads = lax.padtype_to_pads(x.shape[2:], w.shape[2:], strides, auto_pad) else: pads = pads or [0] * (w.ndim - 2) @@ -77,9 +78,9 @@ def onnx_add(a, b, axis=None, broadcast=True): if broadcast: axis = (a.dim - b.ndim) if axis is None else axis % a.ndim assert a.shape[axis:][:b.ndim] == b.shape - b_shape = np.ones(a.ndim, dtype='int64').copy() + b_shape = np.ones(a.ndim, dtype='int64') b_shape[axis:axis + b.ndim] = b.shape - b = np.reshape(b, b_shape) + b = jnp.reshape(b, b_shape) return [a + b] @@ -87,10 +88,10 @@ def onnx_add(a, b, axis=None, broadcast=True): 'Add': onnx_add, 'Constant': lambda value: [value], 'Conv': onnx_conv, - 'MatMul': lambda x, y: [np.matmul(x, y)], + 'MatMul': lambda x, y: [jnp.matmul(x, y)], 'MaxPool': onnx_maxpool, - 'Relu': lambda x: [np.maximum(x, 0)], - 'Reshape': lambda x, shape: [np.reshape(x, shape)], + 'Relu': lambda x: [jnp.maximum(x, 0)], + 'Reshape': lambda x, shape: [jnp.reshape(x, shape)], } @@ -116,21 +117,21 @@ def interpret_onnx(graph, *args): if hashlib.md5(download).hexdigest() != 'bc8ad9bd19c5a058055dc18d0f089dad': print("onnx file checksum mismatch") sys.exit(1) - model = onnx.load(StringIO(download)) + model = onnx.load(BytesIO(download)) predict = lambda inputs: interpret_onnx(model.graph, inputs)[0] # Run inference in Numpy-backed interpreter print("interpreted:") - print(predict(np.ones((1, 1, 28, 28)))) + print(predict(jnp.ones((1, 1, 28, 28)))) # JIT compile to XLA device, run inference on device compiled_predict = jit(predict) print("compiled:") - print(compiled_predict(np.ones((1, 1, 28, 28)))) + print(compiled_predict(jnp.ones((1, 1, 28, 28)))) # The interpreter is differentiable too! Even the compiled one: - fun = lambda inputs: np.sum(compiled_predict(inputs)) + fun = lambda inputs: jnp.sum(compiled_predict(inputs)) print("a derivative with respect to inputs:") - print(grad(fun)(np.ones((1, 1, 28, 28)))[..., :3, :3]) + print(grad(fun)(jnp.ones((1, 1, 28, 28)))[..., :3, :3]) From f3f0abb53e94fd4a1f7f4cdd75e51dc490f85d6d Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Mon, 9 Mar 2020 22:06:12 +0200 Subject: [PATCH 0843/1053] Fix exception causes all over the codebase (#2376) Co-authored-by: Peter Hawkins --- jax/core.py | 9 +++++---- jax/experimental/loops.py | 6 +++--- jax/interpreters/ad.py | 9 +++++---- jax/interpreters/batching.py | 4 ++-- jax/interpreters/pxla.py | 14 ++++++++------ jax/interpreters/xla.py | 29 ++++++++++++++++------------- jax/lax/lax.py | 4 ++-- jax/lax/lax_control_flow.py | 11 ++++++----- jax/lib/__init__.py | 5 +++-- jax/random.py | 4 ++-- tests/parallel_test.py | 2 +- tests/pmap_test.py | 4 ++-- 12 files changed, 55 insertions(+), 46 deletions(-) diff --git a/jax/core.py b/jax/core.py index fa36f60fcbe0..947383cb582d 100644 --- a/jax/core.py +++ b/jax/core.py @@ -424,9 +424,10 @@ def __getattr__(self, name): try: attr = getattr(self.aval, name) - except KeyError: + except KeyError as err: raise AttributeError( - "{} has no attribute {}".format(self.__class__.__name__, name)) + "{} has no attribute {}".format(self.__class__.__name__, name) + ) from err else: t = type(attr) if t is aval_property: @@ -601,8 +602,8 @@ def valid_jaxtype(x): def concrete_aval(x): try: return pytype_aval_mappings[type(x)](x) - except KeyError: - raise TypeError("{} is not a valid Jax type".format(type(x))) + except KeyError as err: + raise TypeError("{} is not a valid Jax type".format(type(x))) from err def get_aval(x): diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index 8a0b4580f6c8..f21394abc335 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -184,9 +184,9 @@ def cond_range(self, pred): try: pred_dtype = onp.result_type(pred) - except TypeError: + except TypeError as err: msg = ("Pred type must be either boolean or number, got {}.") - raise TypeError(msg.format(pred)) + raise TypeError(msg.format(pred)) from err if pred_dtype.kind != 'b': if pred_dtype.kind in 'iuf': @@ -373,7 +373,7 @@ def end_tracing_body(self): except ValueError as e: if "Tracer not among input tracers" in str(e): raise ValueError("Body of cond_range or while_range should not use the " - "index variable returned by iterator.") + "index variable returned by iterator.") from e raise # End the subtrace for the loop body, before we trace the condition _BodyTracer.end_subtrace() diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 9679f6dc3db4..759e8baf324c 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -268,9 +268,10 @@ def __repr__(self): return '_' def get_primitive_transpose(p): try: return primitive_transposes[p] - except KeyError: + except KeyError as err: raise NotImplementedError( - "Reverse-mode differentiation rule for '{}' not implemented".format(p)) + "Reverse-mode differentiation rule for '{}' not implemented".format(p) + ) from err class JVPTrace(Trace): @@ -287,10 +288,10 @@ def process_primitive(self, primitive, tracers, params): primals_in, tangents_in = unzip2((t.primal, t.tangent) for t in tracers) try: jvp = primitive_jvps[primitive] - except KeyError: + except KeyError as err: raise NotImplementedError( "Forward-mode differentiation rule for '{}' not implemented" - .format(primitive)) + .format(primitive)) from err primal_out, tangent_out = jvp(primals_in, tangents_in, **params) if primitive.multiple_results: return [JVPTracer(self, x, t) for x, t in zip(primal_out, tangent_out)] diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index cfb484ba0322..197dcc08ac34 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -155,9 +155,9 @@ def todo(x): def get_primitive_batcher(p): try: return primitive_batchers[p] - except KeyError: + except KeyError as err: msg = "Batching rule for '{}' not implemented" - raise NotImplementedError(msg.format(p)) + raise NotImplementedError(msg.format(p)) from err def defvectorized(prim): primitive_batchers[prim] = partial(vectorized_batcher, prim) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 112ab4e9f8ef..74908f9502dc 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -122,8 +122,9 @@ def _shard_device_array(x, devices, assignments): def shard_aval(size, aval): try: return shard_aval_handlers[type(aval)](size, aval) - except KeyError: - raise TypeError("No shard_aval handler for type: {}".format(type(aval))) + except KeyError as err: + raise TypeError("No shard_aval handler for type: {}".format(type(aval)) + ) from err shard_aval_handlers = {} shard_aval_handlers[core.AbstractUnit] = lambda size, x: x def _shard_abstract_array(size, x): @@ -136,8 +137,9 @@ def _shard_abstract_array(size, x): def aval_to_result_handler(size, nrep, aval): try: return pxla_result_handlers[type(aval)](size, nrep, aval) - except KeyError: - raise TypeError("No pxla_result_handler for type: {}".format(type(aval))) + except KeyError as err: + raise TypeError("No pxla_result_handler for type: {}".format(type(aval)) + ) from err pxla_result_handlers = {} pxla_result_handlers[core.AbstractUnit] = lambda *_: lambda _: core.unit def array_result_handler(size, nrep, aval): @@ -792,9 +794,9 @@ def process_primitive(self, primitive, tracers, params): # if the name matches this tracer's name, apply the split_axis rule try: rule = split_axis_rules[primitive] - except KeyError: + except KeyError as err: msg = "split_axis for {} not implemented. Open a feature request!" - raise NotImplementedError(msg.format(primitive)) + raise NotImplementedError(msg.format(primitive)) from err which_mapped = [n is not not_mapped for n in names_in] val_out, is_mapped = rule(vals_in, which_mapped, **params) name_out = name if is_mapped else not_mapped diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index c579ab1e8fa4..50aaf721750d 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -58,8 +58,9 @@ def identity(x): return x def aval_to_xla_shape(aval): try: return xla_shape_handlers[type(aval)](aval) - except KeyError: - raise TypeError("No xla_shape_handler for type: {}".format(type(aval))) + except KeyError as err: + raise TypeError("No xla_shape_handler for type: {}".format(type(aval)) + ) from err xla_shape_handlers = {} xla_shape_handlers[core.AbstractUnit] = lambda _: xc.Shape.tuple_shape(()) xla_shape_handlers[ShapedArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) @@ -68,8 +69,9 @@ def aval_to_xla_shape(aval): def aval_to_result_handler(device, aval): try: return xla_result_handlers[type(aval)](device, aval) - except KeyError: - raise TypeError("No xla_result_handler for type: {}".format(type(aval))) + except KeyError as err: + raise TypeError("No xla_result_handler for type: {}".format(type(aval)) + ) from err xla_result_handlers = {} xla_result_handlers[core.AbstractUnit] = lambda _, __: lambda _: core.unit def array_result_handler(device, aval): @@ -81,8 +83,9 @@ def device_put(x, device=None): x = canonicalize_dtype(x) try: return device_put_handlers[type(x)](x, device) - except KeyError: - raise TypeError("No device_put handler for type: {}".format(type(x))) + except KeyError as err: + raise TypeError("No device_put handler for type: {}".format(type(x)) + ) from err device_put_handlers = {} device_put_handlers[core.Unit] = \ @@ -199,9 +202,9 @@ def _device_from_arg_devices(devices): try: device, = set(d for d in devices if d is not None) or (None,) return device - except ValueError: + except ValueError as err: msg = "primitive arguments must be colocated on the same device, got {}" - raise ValueError(msg.format(", ".join(map(str, devices)))) + raise ValueError(msg.format(", ".join(map(str, devices)))) from err @cache() def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params): @@ -230,7 +233,7 @@ def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params) msg = (" ".join(map(str, e.args)) + "\n" "This is a bug in JAX's shape-checking rules; please report it!\n" "https://github.com/google/jax/issues\n") - raise RuntimeError(msg) + raise RuntimeError(msg) from e def primitive_subcomputation(prim, *avals, **params): return primitive_computation(prim, AxisEnv(1), None, False, *avals, **params) @@ -808,8 +811,8 @@ def item(self): def __len__(self): try: return self.aval.shape[0] - except IndexError: - raise TypeError("len() of unsized object") # same as numpy error + except IndexError as err: + raise TypeError("len() of unsized object") from err # same as numpy error def __iter__(self): if self.ndim == 0: @@ -953,9 +956,9 @@ def _device_put_impl(x, device=None): try: a = abstractify(x) - except TypeError: + except TypeError as err: raise TypeError("Argument '{}' of type {} is not a valid JAX type" - .format(x, type(x))) + .format(x, type(x))) from err handler = aval_to_result_handler(device, a) return handler(device_put(x, device)) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index c086fa11bc53..2dfe238b95c1 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4327,9 +4327,9 @@ def padtype_to_pads(in_shape, window_shape, window_strides, padding): mapping = {'VALID': PaddingType.VALID, 'SAME': PaddingType.SAME} try: padding = mapping[padding.upper()] - except KeyError: + except KeyError as err: msg = "Unrecognized padding type: expected 'VALID' or 'SAME', got {}." - raise RuntimeError(msg.format(padding)) + raise RuntimeError(msg.format(padding)) from err if padding == PaddingType.SAME: out_shape = _ceil_divide(in_shape, window_strides) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index b365fc01c373..4a11c169e526 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -399,9 +399,9 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): try: pred_dtype = dtypes.result_type(pred) - except TypeError: + except TypeError as err: msg = ("Pred type must be either boolean or number, got {}.") - raise TypeError(msg.format(pred)) + raise TypeError(msg.format(pred)) from err if pred_dtype.kind != 'b': if pred_dtype.kind in 'iuf': @@ -767,10 +767,11 @@ def scan(f, init, xs, length=None): try: lengths = [x.shape[0] for x in xs_flat] - except AttributeError: + except AttributeError as err: msg = "scan got value with no leading axis to scan over: {}." - raise ValueError(msg.format(', '.join(str(x) for x in xs_flat - if not hasattr(x, 'shape')))) + raise ValueError( + msg.format(', '.join(str(x) for x in xs_flat + if not hasattr(x, 'shape')))) from err if length is not None: length = int(length) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index db2ed8f89c53..ecf0daa4841f 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -20,10 +20,11 @@ _minimum_jaxlib_version = (0, 1, 40) try: from jaxlib import version as jaxlib_version -except: +except Exception as err: # jaxlib is too old to have version number. msg = 'This version of jax requires jaxlib version >= {}.' - raise ImportError(msg.format('.'.join(map(str, _minimum_jaxlib_version)))) + raise ImportError(msg.format('.'.join(map(str, _minimum_jaxlib_version))) + ) from err version = tuple(int(x) for x in jaxlib_version.__version__.split('.')) diff --git a/jax/random.py b/jax/random.py index 2f64a088b38a..03f7d62c2448 100644 --- a/jax/random.py +++ b/jax/random.py @@ -290,9 +290,9 @@ def _random_bits(key, bit_width, shape): def _check_shape(name, shape, *param_shapes): try: shape = tuple(map(int, shape)) - except TypeError: + except TypeError as err: msg = "{} requires a concrete tuple of integers as shape argument, got {}." - raise ValueError(msg.format(name, shape)) + raise ValueError(msg.format(name, shape)) from err if param_shapes: shape_ = lax.broadcast_shapes(shape, *param_shapes) if shape != shape_: diff --git a/tests/parallel_test.py b/tests/parallel_test.py index ff2bc4f40959..7c8df34fb9ac 100644 --- a/tests/parallel_test.py +++ b/tests/parallel_test.py @@ -306,7 +306,7 @@ def f(x, y): pfun, axis_name = _papply(fun) ans = soft_pmap(pfun, axis_name)(x, y) except (NotImplementedError, TypeError) as e: - raise SkipTest(str(e)) + raise SkipTest(str(e)) from e ans = self.dedup(ans, expected.ndim) self.assertAllClose(ans, expected, check_dtypes=False) diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 56d872f31996..28870ad9281f 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -68,9 +68,9 @@ def _getMeshShape(self, device_mesh_shape): if any(size == -1 for size in device_mesh_shape): try: return onp.arange(device_count).reshape(device_mesh_shape).shape - except ValueError: + except ValueError as err: msg = "device mesh shape {} not compatible with device count {}" - raise SkipTest(msg.format(device_mesh_shape, device_count)) + raise SkipTest(msg.format(device_mesh_shape, device_count)) from err else: if device_count % prod(device_mesh_shape): msg = "device mesh size {} does not divide available device count {}" From 863576c5c173eb7522acd957a03c2e660e0eb6c0 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 9 Mar 2020 13:21:30 -0700 Subject: [PATCH 0844/1053] jit lax_numpy.roll (#2392) This was making tracing slow for code with lots of rolls. --- jax/numpy/lax_numpy.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index cc8359326989..00bce0a2a5c9 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2672,8 +2672,8 @@ def msort(a): return sort(a, axis=0) -@_wraps(onp.roll) -def roll(a, shift, axis=None): +@partial(jit, static_argnums=(2,)) +def _roll(a, shift, axis): a = asarray(a) a_shape = shape(a) if axis is None: @@ -2696,6 +2696,11 @@ def roll(a, shift, axis=None): return a +@_wraps(onp.roll) +def roll(a, shift, axis=None): + return _roll(a, shift, axis) + + @_wraps(onp.take) def take(a, indices, axis=None, out=None, mode=None): if out: From 5c3b4786b2bd71fccecc5617de7a1d9f4269f2cb Mon Sep 17 00:00:00 2001 From: perolat Date: Tue, 10 Mar 2020 14:40:38 +0100 Subject: [PATCH 0845/1053] Add a module to apply updates every k steps (and accumulate them otherwise) (#2350) --- jax/experimental/optix.py | 30 ++++++++++++++++++++++++++++++ tests/optix_test.py | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 242d0fa58941..112d8d4b4256 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -324,6 +324,36 @@ def update_fn(updates, state): # pylint: disable=missing-docstring return InitUpdate(init_fn, update_fn) +ApplyEvery = collections.namedtuple("ApplyEvery", "count grad_acc") + + +def apply_every(k=1): + """accumulate gradients and apply them every k steps. + + Args: + k: apply the update every k steps otherwise accumulate the gradients. + + Returns: + An (init_fn, update_fn) tuple. + """ + + def init_fn(params): + grad_acc = tree_multimap(jnp.zeros_like, params) + return ApplyEvery(count=jnp.zeros([], jnp.int32), grad_acc=grad_acc) + + def update_fn(updates, state): + + c = state.count % k + acc = c != 0 + grad_acc = tree_multimap( + lambda g, ga: acc * ga + g, updates, state.grad_acc) + emit = c == (k - 1) + updates = tree_multimap(lambda ga: emit * ga, grad_acc) + return updates, ApplyEvery(count=state.count + 1, grad_acc=grad_acc) + + return InitUpdate(init_fn, update_fn) + + ### Utilities for building and using custom optimizers. ### diff --git a/tests/optix_test.py b/tests/optix_test.py index 6624554ed722..a4bae03f96f0 100644 --- a/tests/optix_test.py +++ b/tests/optix_test.py @@ -60,6 +60,45 @@ def test_sgd(self): for x, y in zip(tree_leaves(jax_params), tree_leaves(optix_params)): onp.testing.assert_allclose(x, y, rtol=1e-5) + def test_apply_every(self): + # The frequency of the application of sgd + k = 4 + zero_update = (jnp.array([0., 0.]), jnp.array([0., 0.])) + + # experimental/optix.py sgd + optix_sgd_params = self.init_params + sgd = optix.sgd(LR, 0.0) + state_sgd = sgd.init(optix_sgd_params) + + # experimental/optix.py sgd apply every + optix_sgd_apply_every_params = self.init_params + sgd_apply_every = optix.chain(optix.apply_every(k=k), + optix.trace(decay=0, nesterov=False), + optix.scale(-LR)) + state_sgd_apply_every = sgd_apply_every.init(optix_sgd_apply_every_params) + for i in range(STEPS): + # Apply a step of sgd + updates_sgd, state_sgd = sgd.update(self.per_step_updates, state_sgd) + optix_sgd_params = optix.apply_updates(optix_sgd_params, updates_sgd) + + # Apply a step of sgd_apply_every + updates_sgd_apply_every, state_sgd_apply_every = sgd_apply_every.update( + self.per_step_updates, state_sgd_apply_every) + optix_sgd_apply_every_params = optix.apply_updates( + optix_sgd_apply_every_params, updates_sgd_apply_every) + if i % k == k-1: + # Check equivalence. + for x, y in zip( + tree_leaves(optix_sgd_apply_every_params), + tree_leaves(optix_sgd_params)): + onp.testing.assert_allclose(x, y, atol=1e-6, rtol=100) + else: + # Check updaue is zero. + for x, y in zip( + tree_leaves(updates_sgd_apply_every), + tree_leaves(zero_update)): + onp.testing.assert_allclose(x, y, atol=1e-10, rtol=1e-5) + def test_adam(self): b1, b2, eps = 0.9, 0.999, 1e-8 From cc53aa956b0571efb3b0237dd87d92d509f8b1fd Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 10 Mar 2020 06:59:54 -0700 Subject: [PATCH 0846/1053] skip new optix test on tpu (cf. #2350) --- tests/optix_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/optix_test.py b/tests/optix_test.py index a4bae03f96f0..ff86d02375d2 100644 --- a/tests/optix_test.py +++ b/tests/optix_test.py @@ -19,7 +19,7 @@ from jax import numpy as jnp from jax.experimental import optimizers from jax.experimental import optix -import jax.test_util # imported only for flags +import jax.test_util from jax.tree_util import tree_leaves import numpy as onp @@ -60,6 +60,7 @@ def test_sgd(self): for x, y in zip(tree_leaves(jax_params), tree_leaves(optix_params)): onp.testing.assert_allclose(x, y, rtol=1e-5) + jax.test_util.skip_on_devices("tpu") def test_apply_every(self): # The frequency of the application of sgd k = 4 From 9fd69a04ea6072479513ce45391d4fbe37998715 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 10 Mar 2020 10:51:09 -0400 Subject: [PATCH 0847/1053] Replace uses of ExecutePerReplica with ExecuteOnLocalDevices. (#2394) ExecutePerReplica is deprecated, and ExecuteOnLocalDevices is now available via the minimum jaxlib version. --- jax/interpreters/pxla.py | 2 +- jax/interpreters/xla.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 74908f9502dc..ff7808584f6e 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -633,7 +633,7 @@ def _pval_to_result_handler(axis_size, nrep, pval, devices, backend): def execute_replicated(compiled, backend, in_handler, out_handler, *args): input_bufs = in_handler(args) - out_bufs = compiled.ExecutePerReplica(list(input_bufs)) + out_bufs = compiled.ExecuteOnLocalDevices(list(input_bufs)) return out_handler(out_bufs) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 50aaf721750d..4e1dd65fdcf8 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -257,7 +257,7 @@ def _execute_replicated_primitive(prim, compiled, backend, tuple_args, if tuple_args: input_bufs = [[make_tuple(bufs, device, backend)] for bufs, device in zip(input_bufs, compiled.local_devices())] - out_buf = compiled.ExecutePerReplica(input_bufs)[0] + out_buf = compiled.ExecuteOnLocalDevices(input_bufs)[0] return result_handler(out_buf) def check_nans(prim, bufs): @@ -566,7 +566,7 @@ def _execute_replicated(compiled, backend, handlers, tuple_args, *args): if tuple_args: input_bufs = [[make_tuple(bufs, device, backend)] for bufs, device in zip(input_bufs, compiled.local_devices())] - out_bufs = compiled.ExecutePerReplica(input_bufs)[0].destructure() + out_bufs = compiled.ExecuteOnLocalDevices(input_bufs)[0].destructure() if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] From ebbcbad547e56357e600cd8c19232d4b91cf4f00 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 10 Mar 2020 08:29:46 -0700 Subject: [PATCH 0848/1053] allow vmap in_axes to be a list, fixes #2367 (#2395) --- jax/api.py | 8 ++++++++ tests/api_test.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/jax/api.py b/jax/api.py index e8492db51d70..2b9b7859e4d4 100644 --- a/jax/api.py +++ b/jax/api.py @@ -657,6 +657,14 @@ def vmap(fun: Callable, in_axes=0, out_axes=0): docstr = ("Vectorized version of {fun}. Takes similar arguments as {fun} " "but with additional array axes over which {fun} is mapped.") + if isinstance(in_axes, list): + # To be a tree prefix of the positional args tuple, in_axes can never be a + # list: if in_axes is not a leaf, it must be a tuple of trees. However, + # in cases like these users expect tuples and lists to be treated + # essentially interchangeably, so we canonicalize lists to tuples here + # rather than raising an error. https://github.com/google/jax/issues/2367 + in_axes = tuple(in_axes) + _check_callable(fun) if (not isinstance(in_axes, (list, tuple, type(None), int)) or not isinstance(out_axes, (list, tuple, type(None), int))): diff --git a/tests/api_test.py b/tests/api_test.py index 98c505f1560d..23d7d5b49f17 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1229,6 +1229,20 @@ def vjp(x_tangent): b = np.dot(a + np.eye(a.shape[0]), real_x) print(gf(a, b)) # doesn't crash + def test_vmap_in_axes_list(self): + # https://github.com/google/jax/issues/2367 + dictionary = {'a': 5., 'b': np.ones(2)} + x = np.zeros(3) + y = np.arange(3.) + + + def f(dct, x, y): + return dct['a'] + dct['b'] + x + y + + out1 = api.vmap(f, (None, 0, 0))(dictionary, x, y) + out2 = api.vmap(f, [None, 0, 0])(dictionary, x, y) + self.assertAllClose(out1, out2, check_dtypes=True) + def test_vmap_in_axes_tree_prefix_error(self): # https://github.com/google/jax/issues/795 self.assertRaisesRegex( From cfbdb65ad8637e883679a0d0516acdc28dd9e8ea Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 10 Mar 2020 15:01:18 -0700 Subject: [PATCH 0849/1053] add register_pytree_node_class, fixes #2396 (#2400) Co-authored-by: Stephan Hoyer Co-authored-by: Stephan Hoyer --- jax/tree_util.py | 21 +++++++++++++++++++++ tests/tree_util_tests.py | 21 ++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/jax/tree_util.py b/jax/tree_util.py index 2967bb7bd106..ea19aaa6638c 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -38,6 +38,7 @@ import functools import collections +import operator as op from .lib import pytree @@ -105,6 +106,26 @@ def register_pytree_node(nodetype, flatten_func, unflatten_func): pytree.register_node(nodetype, flatten_func, unflatten_func) _registry[nodetype] = _RegistryEntry(flatten_func, unflatten_func) +def register_pytree_node_class(cls): + """Extends the set of types that are considered internal nodes in pytrees. + + This function is a thin wrapper around ``register_pytree_node``, and provides + a class-oriented interface: + + @register_pytree_node_class + class Special: + def __init__(self, x, y): + self.x = x + self.y = y + def tree_flatten(self): + return ((self.x, self.y), None) + @classmethod + def tree_unflatten(cls, aux_data, children): + return cls(*children) + """ + register_pytree_node(cls, op.methodcaller('tree_flatten'), cls.tree_unflatten) + return cls + def tree_map(f, tree): """Maps a function over a pytree to produce a new pytree. diff --git a/tests/tree_util_tests.py b/tests/tree_util_tests.py index 709fed56a9ea..77d7a87b5717 100644 --- a/tests/tree_util_tests.py +++ b/tests/tree_util_tests.py @@ -47,10 +47,28 @@ def __hash__(self): def __repr__(self): return "AnObject({},{},{})".format(self.x, self.y, self.z) - tree_util.register_pytree_node(AnObject, lambda o: ((o.x, o.y), o.z), lambda z, xy: AnObject(xy[0], xy[1], z)) +@tree_util.register_pytree_node_class +class Special: + def __init__(self, x, y): + self.x = x + self.y = y + + def __repr__(self): + return "Special(x={}, y={})".format(self.x, self.y) + + def tree_flatten(self): + return ((self.x, self.y), None) + + @classmethod + def tree_unflatten(cls, aux_data, children): + return cls(*children) + + def __eq__(self, other): + return type(self) is type(other) and (self.x, self.y) == (other.x, other.y) + PYTREES = [ ("foo",), ((),), @@ -60,6 +78,7 @@ def __repr__(self): ([3],), ([3, ATuple(foo=(3, ATuple(foo=3, bar=None)), bar={"baz": 34})],), ([AnObject(3, None, [4, "foo"])],), + (Special(2, 3.),), ({"a": 1, "b": 2},), (collections.OrderedDict([("foo", 34), ("baz", 101), ("something", -42)]),), (collections.defaultdict(dict, From ffa03403c9c6d9f071125cdc793c9b88e421cf13 Mon Sep 17 00:00:00 2001 From: Jordan Hoffmann Date: Wed, 11 Mar 2020 00:53:43 +0000 Subject: [PATCH 0850/1053] Add jnp vs np out of bounds indexing to Sharp Bits nb (#2378) --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 64 +++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index f9717342c39c..2a8e6311dc74 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -133,7 +133,7 @@ "id": "2AxeCufq4wAp", "outputId": "7013374b-041f-4270-db19-cfb4ab992f52", "tags": [ - "raises-exception" + "raises-exception" ] }, "outputs": [ @@ -313,6 +313,68 @@ "print(new_jax_array)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🔪 Out-of-Bounds Indexing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Numpy, you are used to errors being thrown when you index an array outside of its bounds, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "index 11 is out of bounds for axis 0 with size 10", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0monp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m11\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: index 11 is out of bounds for axis 0 with size 10" + ] + } + ], + "source": [ + "onp.arange(10)[11]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, raising an error on other accelerators can be more difficult. Therefore, JAX does not raise an error and instead returns the last value in the array. " + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DeviceArray(9, dtype=int32)" + ] + }, + "execution_count": 0, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.arange(10)[11]" + ] + }, { "cell_type": "markdown", "metadata": { From 419961f9dd1365f741c68bd88daee3c6f89b43d7 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 11 Mar 2020 09:57:04 -0400 Subject: [PATCH 0851/1053] Check for invalid shapes in broadcast_in_dim and fail gracefully. --- jax/lax/lax.py | 1 + tests/lax_numpy_test.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2dfe238b95c1..15620b5f8232 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2356,6 +2356,7 @@ def _broadcast_batch_rule(batched_args, batch_dims, sizes): def _broadcast_in_dim_impl(operand, shape, broadcast_dimensions): if type(operand) is xla.DeviceArray: + shape = _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions) aval = ShapedArray(shape, _dtype(operand)) lazy_expr = lazy.broadcast(operand._lazy_expr, shape, broadcast_dimensions) return xla.DeviceArray(aval, None, lazy_expr, operand.device_buffer) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 8213578f6914..c30dd10b8496 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1309,6 +1309,10 @@ def args_maker(): return [] self._CheckAgainstNumpy(onp_op, jnp_op, args_maker, check_dtypes=True) self._CompileAndCheck(jnp_op, args_maker, check_dtypes=True) + def testOnesWithInvalidShape(self): + with self.assertRaises(TypeError): + jnp.ones((-1, 1)) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_filldtype={}_outdtype={}".format( jtu.format_shape_dtype_string(shape, in_dtype), From cdf188af2fd4f256c2c5c390ec0d09ed321212d0 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 11 Mar 2020 09:42:25 -0700 Subject: [PATCH 0852/1053] add raises-exception notebook cell metadata (#2402) --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 2a8e6311dc74..21fa3fc45fd7 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -330,7 +330,11 @@ { "cell_type": "code", "execution_count": 0, - "metadata": {}, + "metadata": { + "tags": [ + "raises-exception" + ] + }, "outputs": [ { "ename": "IndexError", From 2dfeaeb63fa9e884ef5b76bc43cf99b2c5a5c04f Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Wed, 11 Mar 2020 16:19:46 -0400 Subject: [PATCH 0853/1053] Allow zero tolerance for jax.test_util.tolerance (#2393) Currently, if a user passes any falsy value to jax.test_util.tolerance, it is changed to the default value. This makes sense when the value passed is None, but not when the value passed is 0 (which indicates a desired tolerance of exactly 0). Disables failing tests for now. --- jax/test_util.py | 2 +- tests/lax_test.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/jax/test_util.py b/jax/test_util.py index dc887f177b26..e080e5cfe223 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -116,7 +116,7 @@ def _assert_numpy_allclose(a, b, atol=None, rtol=None): onp.testing.assert_allclose(a, b, **kw) def tolerance(dtype, tol=None): - tol = tol or {} + tol = {} if tol is None else tol if not isinstance(tol, dict): return tol tol = {onp.dtype(key): value for key, value in tol.items()} diff --git a/tests/lax_test.py b/tests/lax_test.py index b985fbccd3a8..2ae2c705a970 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -199,6 +199,9 @@ def testOp(self, op_name, rng_factory, shapes, dtype): for dtype in rec.dtypes) for rec in LAX_OPS)) def testOpAgainstNumpy(self, op_name, rng_factory, shapes, dtype, tol): + if op_name == "nextafter" and dtype == onp.float64: + raise SkipTest("nextafter inconsistent for float64: " + "https://github.com/google/jax/issues/2403") rng = rng_factory() args_maker = lambda: [rng(shape, dtype) for shape in shapes] op = getattr(lax, op_name) From 620bf4300b74c298a5e0133e08f60f76700cf37f Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Wed, 11 Mar 2020 20:36:07 +0000 Subject: [PATCH 0854/1053] [remat] Change remat lowering to XLA::Conditional (#2391) * [remat] Change remat lowering to XLA::Conditional `jax.remat` creates rematerializing passes that don't have data dependencies on the actual loss-computing forward pass. This means that the XLA scheduler was free to schedule the remat forward pass before the loss-computing pass, defeating the goal of saving accelerator memory with `jax.remat`. In practice, it sometimes did for my workloads. This change expresses the lowering of remat_call(f) as: Conditional(true, inputs, f, inputs, dummy_f). In the common case of `jax.grad(jax.remat(f))`, the content of the lowered remat_call are both the forwards & backwards; that is, the incoming cotangents are part of the args. Additionally, Conditional (AFAIK) is un-inlineable in the sense that it doesn't execute until all its inputs (e.g. cotangents!) are available. Downsides: - AFAICT, we can no longer interleave computation in/outside the rematerialized block. - Potentially, lower performance. I do not observe this in my tests. * provide no replication info for subcomputation params --- jax/interpreters/xla.py | 53 +++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 4e1dd65fdcf8..cef1a6e22627 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -973,31 +973,38 @@ def _device_put_impl(x, device=None): def _remat_translation_rule(c, axis_env, in_nodes, name_stack, backend, name, call_jaxpr, device=None, concrete=None): - # This looks a lot like _xla_call_translation_rule, except for a widget we use - # to foil CSE. + """Lower remat to a Conditional which always returns true. This: + 1. Circumvents common subexpression elimination. + 2. In common case of `jax.grad(jax.remat(f))`, ensures the remat blocks + occur after the primal blocks, because cotangent is an input to the + Conditional.""" del device, concrete # Unused. - subc = xb.make_computation_builder("remat_call_subcomputation") - args = [subc.ParameterWithShape(c.GetShape(n)) for n in in_nodes] - args = _foil_cse(subc, args) - out_nodes = jaxpr_subcomp(subc, call_jaxpr, backend, axis_env, (), - extend_name_stack(name_stack, wrap_name(name, 'remat')), *args) - subc = subc.Build(subc.Tuple(*out_nodes)) - return c.Call(subc, list(in_nodes)) -call_translations[pe.remat_call_p] = _remat_translation_rule - -def _foil_cse(c, args): + # Fake condition which always selects True branch. rng = c.RngUniform(c.Constant(onp.array(0, dtype=onp.float32)), c.Constant(onp.array(1, dtype=onp.float32)), []) pred = c.Lt(rng, c.Constant(onp.array(2, dtype=onp.float32))) - outs = [] - for x in args: - xla_shape = c.GetShape(x) - if xla_shape.is_tuple(): - assert not xla_shape.tuple_shapes() - outs.append(x) - else: - shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() - zero = c.Broadcast(c.Constant(onp.array(0, dtype=dtype)), shape) - outs.append(c.Select(pred, x, zero)) - return outs + + true_op = c.Tuple(*in_nodes) + remat_subc = xb.make_computation_builder("remat_call_subcomputation") + input_op = remat_subc.ParameterWithShape(c.GetShape(true_op), replicated=[]) + args = [remat_subc.GetTupleElement(input_op, i) for i in range(len(in_nodes))] + out_nodes = jaxpr_subcomp(remat_subc, call_jaxpr, backend, axis_env, (), + extend_name_stack(name_stack, wrap_name(name, 'remat')), + *args) + out_node_shapes = [remat_subc.GetShape(o) for o in out_nodes] + remat_subc = remat_subc.Build(remat_subc.Tuple(*out_nodes)) + + false_op = true_op + dummy_subc = xb.make_computation_builder("remat_call_dummy_subcomputation") + dummy_subc.ParameterWithShape(c.GetShape(false_op), replicated=[]) + + def zeros(xla_shape): + shape, dtype = xla_shape.dimensions(), xla_shape.numpy_dtype() + zero = dummy_subc.Constant(onp.array(0, dtype=dtype)) + return dummy_subc.Broadcast(zero, shape) + out_nodes = [zeros(s) for s in out_node_shapes] + dummy_subc = dummy_subc.Build(dummy_subc.Tuple(*out_nodes)) + + return c.Conditional(pred, true_op, remat_subc, false_op, dummy_subc) +call_translations[pe.remat_call_p] = _remat_translation_rule From 61b430eeb40aeef3254f50dbcb79271e7ab3db96 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 12 Mar 2020 10:59:30 +0100 Subject: [PATCH 0855/1053] Added more documentation for how to fix notebook build failures (#2404) --- docs/developer.rst | 10 ++++++++++ docs/notebooks/README.md | 2 ++ 2 files changed, 12 insertions(+) create mode 100644 docs/notebooks/README.md diff --git a/docs/developer.rst b/docs/developer.rst index 0d65964c4875..0d85f323f1de 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -166,6 +166,16 @@ local repo), update it as needed, ``Run all cells`` then ``Download ipynb``. You may want to test that it executes properly, using ``sphinx-build`` as explained above. +Some of the notebooks are built automatically as part of the Travis pre-submit checks and +as part of the [Read the docs](https://jax.readthedocs.io/en/latest) build. +The build will fail if cells raise errors. If the errors are intentional, you can either catch them, +or tag the cell with `raises-exceptions` metadata ([example PR](https://github.com/google/jax/pull/2402/files)). +You have to add this metadata by hand in the `.ipynb` file. It will be preserved when somebody else +re-saves the notebook. + +We exclude some notebooks from the build, e.g., because they contain long computations. +See `exclude_patterns` in [conf.py](https://github.com/google/jax/blob/master/docs/conf.py). + Documentation building on readthedocs.io ---------------------------------------- diff --git a/docs/notebooks/README.md b/docs/notebooks/README.md new file mode 100644 index 000000000000..07be4441ade8 --- /dev/null +++ b/docs/notebooks/README.md @@ -0,0 +1,2 @@ +For instructions on how to change and test notebooks, see +[Update Documentation](https://jax.readthedocs.io/en/latest/developer.html#update-documentation). From cf41f7682fef099fe1810bd49e64c9439e2d4f3d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 12 Mar 2020 15:05:59 -0400 Subject: [PATCH 0856/1053] Add np.linalg and np.fft functions to documentation. (#2407) --- docs/jax.numpy.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index b7f049fb4049..ba005e0d793e 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -272,6 +272,8 @@ jax.numpy.fft irfftn fftfreq rfftfreq + fftshift + ifftshift jax.numpy.linalg ---------------- @@ -285,10 +287,13 @@ jax.numpy.linalg det eig eigh + eigvals + eigvalsh inv matrix_power matrix_rank norm + pinv qr slogdet solve From 58feed2bcb6802d2b560712648d11a441c82909e Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 12 Mar 2020 15:53:47 -0700 Subject: [PATCH 0857/1053] jax.lax.nextafter test fix. (#2408) Fixes #2403. --- tests/lax_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index 2ae2c705a970..8faef6a504b7 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -199,9 +199,9 @@ def testOp(self, op_name, rng_factory, shapes, dtype): for dtype in rec.dtypes) for rec in LAX_OPS)) def testOpAgainstNumpy(self, op_name, rng_factory, shapes, dtype, tol): - if op_name == "nextafter" and dtype == onp.float64: - raise SkipTest("nextafter inconsistent for float64: " - "https://github.com/google/jax/issues/2403") + if (not FLAGS.jax_enable_x64 and op_name == "nextafter" + and dtype == onp.float64): + raise SkipTest("64-bit mode disabled") rng = rng_factory() args_maker = lambda: [rng(shape, dtype) for shape in shapes] op = getattr(lax, op_name) From 7f0463e2c9d7dfbe9c451baabb7c603eac6a4b3d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 13 Mar 2020 07:13:29 -0700 Subject: [PATCH 0858/1053] remove input shapes from params of some primitives (#2410) Long, long ago, when JAX was first born, we realized that we couldn't transpose this jaxpr: { lambda ; a. let b = reduce_sum[ axes=(0,) ] a in b } The problem was that the transpose of a reduce-sum is a broadcast, but because jaxprs didn't have shape information available, we didn't know what input shape to broadcast to! Our hack was to have the primitives that required shape information for transposition to acquire it into their parameters, so that we'd produce jaxprs like this one: { lambda ; a. let b = reduce_sum[ axes=(0,) input_shape=(3,) ] a in b } That's not only aesthetically unpleasant, but also it meant we were limiting an (unused) capability of the system: ideally we should be able to trace a reduce-sum jaxpr without specializing on shape information (e.g. at the Unshaped level) and only require shape specialization for transposition. (Good thing no one actually traces at Unshaped...) But at long last @chr1sj0nes in #2299 added avals to jaxprs, so that shape information (or whatever information with which the jaxpr was specialized out of Python) is in the jaxpr itself. So we could finally remove these shapes-in-params warts! That's exactly what this commit does! Co-authored-by: Roy Frostig Co-authored-by: Roy Frostig --- docs/notebooks/How_JAX_primitives_work.ipynb | 8 +- jax/interpreters/ad.py | 43 ++- jax/lax/lax.py | 279 +++++++++---------- jax/lax/lax_control_flow.py | 14 +- jax/lax/lax_parallel.py | 4 +- jax/lax_linalg.py | 2 +- tests/api_test.py | 3 +- 7 files changed, 174 insertions(+), 179 deletions(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 246018122577..924dffe8425c 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -1270,20 +1270,20 @@ " Args:\n", " ct: the cotangent of the output of the primitive.\n", " x, y, z: values of the arguments. The arguments that are used linearly\n", - " get the value ad_undefined_primal. The other arguments get a constant\n", + " get an ad.UndefinedPrimal value. The other arguments get a constant\n", " value.\n", " Returns:\n", " a tuple with the cotangent of the inputs, with the value None\n", " corresponding to the constant arguments.\n", " \"\"\"\n", - " if x is not ad.undefined_primal:\n", + " if not ad.is_undefined_primal(x):\n", " # This use of multiply_add is with a constant \"x\"\n", - " assert y is ad.undefined_primal\n", + " assert ad.is_undefined_primal(y)\n", " ct_y = ad.zero if ct is ad.zero else multiply_add_prim(x, ct, lax.zeros_like_array(x))\n", " res = None, ct_y, ct\n", " else:\n", " # This use of multiply_add is with a constant \"y\"\n", - " assert x is ad.undefined_primal\n", + " assert ad.is_undefined_primal(x)\n", " ct_x = ad.zero if ct is ad.zero else multiply_add_prim(ct, y, lax.zeros_like_array(y))\n", " res = ct_x, None, ct\n", " return res\n", diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 759e8baf324c..01460f942df2 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -109,7 +109,7 @@ def vjp(traceable, primals, has_aux=False): def vjp_(*cts): cts = tuple(map(ignore_consts, cts, pvals)) dummy_primals_and_cts = (core.unit,) * len(cts) + cts - dummy_args = (undefined_primal,) * len(jaxpr.invars) + dummy_args = [UndefinedPrimal(v.aval) for v in jaxpr.invars] arg_cts = backward_pass(jaxpr, consts, dummy_args, dummy_primals_and_cts) arg_cts = arg_cts[len(primals):] return map(instantiate_zeros, primals, arg_cts) @@ -153,10 +153,10 @@ def read_primal(v): if type(v) is Literal: return v.val else: - return primal_env.get(v, undefined_primal) + return primal_env.get(v, UndefinedPrimal(v.aval)) def write_primal(v, val): - if val is not undefined_primal: + if not is_undefined_primal(val): primal_env[v] = val primal_env = {} @@ -168,7 +168,7 @@ def is_linear(var): if type(var) is Literal: return False else: - return primal_env.get(var, undefined_primal) is undefined_primal + return var not in primal_env linear_eqns = [] for eqn in jaxpr.eqns: @@ -226,17 +226,17 @@ def read_primal(v): if type(v) is Literal: return v.val else: - return primal_env.get(v, undefined_primal) + return primal_env.get(v, UndefinedPrimal(v.aval)) def write_primal(v, val): - if val is not undefined_primal: + if not is_undefined_primal(val): primal_env[v] = val def is_linear(var): if type(var) is Literal: return False else: - return primal_env.get(var, undefined_primal) is undefined_primal + return var not in primal_env write_primal(core.unitvar, core.unit) assert not jaxpr.constvars @@ -258,12 +258,19 @@ def is_linear(var): map(write_primal, eqn.outvars, ans) return map(read_primal, jaxpr.outvars) -class UndefinedPrimal(object): - def __repr__(self): return '_' -undefined_primal = UndefinedPrimal() +class UndefinedPrimal: + __slots__ = ['aval'] + def __init__(self, aval): + self.aval = aval + def __repr__(self): + return 'UndefinedPrimal({})'.format(self.aval) + +def is_undefined_primal(x): + return type(x) is UndefinedPrimal + register_pytree_node(UndefinedPrimal, - lambda z: ((), None), - lambda *_: undefined_primal) + lambda z: ((), z.aval), + lambda aval, _: UndefinedPrimal(aval)) def get_primitive_transpose(p): try: @@ -386,6 +393,14 @@ def linear_transpose(transpose_rule, cotangent, *args, **kwargs): return zero if cotangent is zero else transpose_rule(cotangent, **kwargs) +def deflinear2(primitive, transpose_rule): + primitive_jvps[primitive] = partial(linear_jvp, primitive) + primitive_transposes[primitive] = partial(linear_transpose2, transpose_rule) + +def linear_transpose2(transpose_rule, cotangent, *args, **kwargs): + return zero if cotangent is zero else transpose_rule(cotangent, *args, **kwargs) + + def defjvp(primitive, *jvprules): assert isinstance(primitive, Primitive) primitive_jvps[primitive] = partial(standard_jvp, jvprules, primitive) @@ -484,8 +499,8 @@ def defbilinear_broadcasting(bcast, prim, lhs_rule, rhs_rule): defbilinear = partial(defbilinear_broadcasting, lambda g, x: g) def bilinear_transpose(lhs_rule, rhs_rule, cotangent, x, y, **kwargs): - assert (x is undefined_primal) ^ (y is undefined_primal) - if x is undefined_primal: + assert is_undefined_primal(x) ^ is_undefined_primal(y) + if is_undefined_primal(x): out = zero if cotangent is zero else lhs_rule(cotangent, y, **kwargs) return out, None else: diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2dfe238b95c1..7e9a69b255fe 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -428,8 +428,7 @@ def concatenate(operands, dimension): Returns: An array containing the concatenation. """ - return concatenate_p.bind(*operands, dimension=dimension, - operand_shapes=tuple(o.shape for o in operands)) + return concatenate_p.bind(*operands, dimension=dimension) Precision = xla_client.PrecisionConfig.Precision Precision.__str__ = lambda precision: precision.name @@ -634,10 +633,8 @@ def reshape(operand, new_sizes, dimensions=None): if onp.shape(operand) and same_shape and same_dims: return operand else: - return reshape_p.bind( - operand, new_sizes=new_sizes, - dimensions=None if same_dims else tuple(dimensions), - old_sizes=onp.shape(operand)) + return reshape_p.bind( operand, new_sizes=new_sizes, + dimensions=None if same_dims else tuple(dimensions)) def pad(operand, padding_value, padding_config): """Wraps XLA's `Pad @@ -672,8 +669,7 @@ def slice(operand: Any, start_indices, limit_indices, strides=None): else: return slice_p.bind(operand, start_indices=tuple(start_indices), limit_indices=tuple(limit_indices), - strides=None if strides is None else tuple(strides), - operand_shape=operand.shape) + strides=None if strides is None else tuple(strides)) def dynamic_slice(operand, start_indices, slice_sizes): """Wraps XLA's `DynamicSlice @@ -690,9 +686,8 @@ def dynamic_slice(operand, start_indices, slice_sizes): An array containing the slice. """ start_indices = _dynamic_slice_indices(operand, start_indices) - return dynamic_slice_p.bind( - operand, *start_indices, slice_sizes=tuple(slice_sizes), - operand_shape=operand.shape) + return dynamic_slice_p.bind(operand, *start_indices, + slice_sizes=tuple(slice_sizes)) def dynamic_update_slice(operand, update, start_indices): """Wraps XLA's `DynamicUpdateSlice @@ -708,8 +703,7 @@ def dynamic_update_slice(operand, update, start_indices): An array containing the slice. """ start_indices = _dynamic_slice_indices(operand, start_indices) - return dynamic_update_slice_p.bind(operand, update, *start_indices, - update_shape=update.shape) + return dynamic_update_slice_p.bind(operand, update, *start_indices) def gather(operand, start_indices, dimension_numbers, slice_sizes): """Gather operator. @@ -735,7 +729,7 @@ def gather(operand, start_indices, dimension_numbers, slice_sizes): """ return gather_p.bind( operand, start_indices, dimension_numbers=dimension_numbers, - slice_sizes=canonicalize_shape(slice_sizes), operand_shape=operand.shape) + slice_sizes=canonicalize_shape(slice_sizes)) def scatter_add(operand, scatter_indices, updates, dimension_numbers): """Scatter-add operator. @@ -761,8 +755,7 @@ def scatter_add(operand, scatter_indices, updates, dimension_numbers): jaxpr, consts = _reduction_jaxpr(add, _abstractify(_const(operand, 0))) return scatter_add_p.bind( operand, scatter_indices, updates, update_jaxpr=jaxpr, - update_consts=consts, dimension_numbers=dimension_numbers, - updates_shape=updates.shape) + update_consts=consts, dimension_numbers=dimension_numbers) def scatter_min(operand, scatter_indices, updates, dimension_numbers): """Scatter-min operator. @@ -788,8 +781,7 @@ def scatter_min(operand, scatter_indices, updates, dimension_numbers): jaxpr, consts = _reduction_jaxpr(min, _abstractify(_const(operand, 0))) return scatter_min_p.bind( operand, scatter_indices, updates, update_jaxpr=jaxpr, - update_consts=consts, dimension_numbers=dimension_numbers, - updates_shape=updates.shape) + update_consts=consts, dimension_numbers=dimension_numbers) def scatter_max(operand, scatter_indices, updates, dimension_numbers): """Scatter-max operator. @@ -815,8 +807,7 @@ def scatter_max(operand, scatter_indices, updates, dimension_numbers): jaxpr, consts = _reduction_jaxpr(max, _abstractify(_const(operand, 0))) return scatter_max_p.bind( operand, scatter_indices, updates, update_jaxpr=jaxpr, - update_consts=consts, dimension_numbers=dimension_numbers, - updates_shape=updates.shape) + update_consts=consts, dimension_numbers=dimension_numbers) # Define this outside of scatter to ensure cache hits. _scatter_reduction_computation = lambda x, y: y @@ -849,8 +840,7 @@ def scatter(operand, scatter_indices, updates, dimension_numbers): _abstractify(_const(operand, 0))) return scatter_p.bind( operand, scatter_indices, updates, update_jaxpr=jaxpr, - update_consts=consts, dimension_numbers=dimension_numbers, - updates_shape=updates.shape) + update_consts=consts, dimension_numbers=dimension_numbers) def index_take(src, idxs, axes): indices = concatenate([reshape(i, [i.shape[0], 1]) for i in idxs], 1) @@ -931,8 +921,7 @@ def _get_min_identity(dtype): return onp.array(True, onp.bool_) def _reduce_sum(operand, axes): - return reduce_sum_p.bind(operand, axes=tuple(axes), - input_shape=onp.shape(operand)) + return reduce_sum_p.bind(operand, axes=tuple(axes)) def _reduce_prod(operand, axes): return reduce_prod_p.bind(operand, axes=tuple(axes)) @@ -978,8 +967,7 @@ def _get_monoid_window_reducer(monoid_op, x): def _reduce_window_sum(operand, window_dimensions, window_strides, padding): return reduce_window_sum_p.bind( operand, window_dimensions=tuple(window_dimensions), - window_strides=tuple(window_strides), padding=padding, - input_shape=operand.shape) + window_strides=tuple(window_strides), padding=padding) def _reduce_window_prod(operand, window_dimensions, window_strides, padding): init_value = _const(operand, 1) @@ -1788,7 +1776,7 @@ def _bessel_i1e_jvp(g, y, x): conj_p = unop(_complex_dtype, _complex_elem_types | _complex, 'conj') def _conj_transpose_rule(t, x, input_dtype): - assert x is ad.undefined_primal + assert ad.is_undefined_primal(x) if dtypes.issubdtype(input_dtype, onp.complexfloating): return [conj(t)] else: @@ -1845,7 +1833,7 @@ def _pow_jvp_rhs(g, ans, x, y): ad.defjvp_zero(xor_p) def _add_transpose(t, x, y): - # assert x is ad.undefined_primal and y is ad.undefined_primal # not affine + # assert ad.is_undefined_primal(x) and ad.is_undefined_primal(y) # not affine return [t, t] add_p = standard_naryop([_num, _num], 'add') @@ -1854,7 +1842,7 @@ def _add_transpose(t, x, y): def _sub_transpose(t, x, y): - assert x is ad.undefined_primal and y is ad.undefined_primal # not affine + assert ad.is_undefined_primal(x) and ad.is_undefined_primal(y) return [t, neg(t) if t is not ad_util.zero else ad_util.zero] sub_p = standard_naryop([_num, _num], 'sub') @@ -1882,7 +1870,7 @@ def _safe_mul_translation_rule(c, x, y): def _div_transpose_rule(cotangent, x, y): - assert x is ad.undefined_primal and y is not ad.undefined_primal + assert ad.is_undefined_primal(x) and not ad.is_undefined_primal(y) res = ad_util.zero if cotangent is ad_util.zero else div(cotangent, y) return res, None div_p = standard_naryop([_num, _num], 'div') @@ -2459,12 +2447,11 @@ def _concatenate_translation_rule(c, *operands, **kwargs): dimension = kwargs.pop('dimension') return c.Concatenate(operands, dimension=dimension) -def _concatenate_transpose_rule(t, *operands, **kwargs): - dimension = kwargs.pop('dimension') - operand_shapes = kwargs.pop('operand_shapes') - +def _concatenate_transpose_rule(t, *operands, dimension): + operand_shapes = [o.aval.shape if ad.is_undefined_primal(o) else o.shape + for o in operands] if t is ad_util.zero: - return [ad_util.zero if o is ad.undefined_primal else None for o in operands] + return [ad_util.zero if ad.is_undefined_primal(o) else None for o in operands] else: limit_points = onp.cumsum([shape[dimension] for shape in operand_shapes]) starts = onp.zeros((len(operands), t.ndim), dtype=int) @@ -2472,10 +2459,10 @@ def _concatenate_transpose_rule(t, *operands, **kwargs): limits = onp.tile(t.shape, (len(operands), 1)) limits[:, dimension] = limit_points - return [slice(t, start, limit) if o is ad.undefined_primal else None + return [slice(t, start, limit) if ad.is_undefined_primal(o) else None for o, start, limit in zip(operands, starts, limits)] -def _concatenate_batch_rule(batched_args, batch_dims, dimension, operand_shapes): +def _concatenate_batch_rule(batched_args, batch_dims, dimension): size = next(op.shape[bdim] for op, bdim in zip(batched_args, batch_dims) if bdim is not None) operands = [batching.moveaxis(op, bdim, 0) if bdim is not None @@ -2509,8 +2496,8 @@ def _pad_shape_rule(operand, padding_value, padding_config): def _pad_transpose(t, operand, padding_value, padding_config): if t is ad_util.zero: - return [ad_util.zero if operand is ad.undefined_primal else None, - ad_util.zero if padding_value is ad.undefined_primal else None] + return [ad_util.zero if ad.is_undefined_primal(operand) else None, + ad_util.zero if ad.is_undefined_primal(padding_value) else None] lo, hi, interior = zip(*padding_config) total = lambda x: _reduce_sum(x, list(range(t.ndim))) @@ -2520,8 +2507,8 @@ def t_op(): unpadded = pad(t, onp.array(0., t.dtype), unpad_config) return slice(unpadded, onp.zeros_like(lo), unpadded.shape, onp.add(interior, 1)) - t_operand = t_op() if operand is ad.undefined_primal else None - t_padv = sub(total(t), total(t_operand)) if padding_value is ad.undefined_primal else None + t_operand = t_op() if ad.is_undefined_primal(operand) else None + t_padv = sub(total(t), total(t_operand)) if ad.is_undefined_primal(padding_value) else None return [t_operand, t_padv] @@ -2543,7 +2530,8 @@ def _pad_batch_rule(batched_args, batch_dims, padding_config): # We have a nonstandard reshape impl so that we can be lazy about data movement. -def _reshape_impl(operand, new_sizes, dimensions, old_sizes): +def _reshape_impl(operand, new_sizes, dimensions): + old_sizes = onp.shape(operand) if type(operand) is xla.DeviceArray and dimensions is None: bcast_dims = _is_singleton_reshape(old_sizes, new_sizes) if bcast_dims is not None: @@ -2561,7 +2549,7 @@ def _reshape_impl(operand, new_sizes, dimensions, old_sizes): return pxla.ShardedDeviceArray(aval, operand.device_buffers) else: return xla.apply_primitive(reshape_p, operand, new_sizes=new_sizes, - dimensions=dimensions, old_sizes=old_sizes) + dimensions=dimensions) def _is_singleton_reshape(old, new): # A singleton reshape is one where only singleton dimensions are added. We @@ -2606,15 +2594,15 @@ def _reshape_shape_rule(operand, new_sizes, dimensions, **unused_kwargs): def _reshape_dtype_rule(operand, new_sizes, dimensions, **unused_kwargs): return operand.dtype -def _reshape_translation_rule(c, operand, new_sizes, dimensions, old_sizes): - del old_sizes # Unused. +def _reshape_translation_rule(c, operand, new_sizes, dimensions): return c.Reshape(operand, new_sizes=new_sizes, dimensions=dimensions) -def _reshape_transpose_rule(t, new_sizes, dimensions, old_sizes): +def _reshape_transpose_rule(t, operand, new_sizes, dimensions): + assert ad.is_undefined_primal(operand) if dimensions is None: - return [reshape(t, old_sizes)] + return [reshape(t, operand.aval.shape)] else: - return [transpose(reshape(t, onp.take(old_sizes, dimensions)), + return [transpose(reshape(t, onp.take(operand.aval.shape, dimensions)), onp.argsort(dimensions))] def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unused): @@ -2628,7 +2616,7 @@ def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unuse reshape_p = standard_primitive(_reshape_shape_rule, _reshape_dtype_rule, 'reshape', _reshape_translation_rule) reshape_p.def_impl(_reshape_impl) -ad.deflinear(reshape_p, _reshape_transpose_rule) +ad.deflinear2(reshape_p, _reshape_transpose_rule) batching.primitive_batchers[reshape_p] = _reshape_batch_rule @@ -2704,16 +2692,16 @@ def _select_dtype_rule(pred, on_true, on_false): return on_true.dtype def _select_transpose_rule(t, pred, on_true, on_false): - assert pred is not ad.undefined_primal + assert not ad.is_undefined_primal(pred) if t is ad_util.zero: return [None, - ad_util.zero if on_true is ad.undefined_primal else None, - ad_util.zero if on_false is ad.undefined_primal else None] + ad_util.zero if ad.is_undefined_primal(on_true) else None, + ad_util.zero if ad.is_undefined_primal(on_false) else None] else: zeros = full_like(t, 0) return [None, - select(pred, t, zeros) if on_true is ad.undefined_primal else None, - select(pred, zeros, t) if on_false is ad.undefined_primal else None] + select(pred, t, zeros) if ad.is_undefined_primal(on_true) else None, + select(pred, zeros, t) if ad.is_undefined_primal(on_false) else None] def _select_batch_rule(batched_args, batch_dims, **unused_kwargs): pred, on_true, on_false, = batched_args @@ -2761,8 +2749,7 @@ def _select_batch_rule(batched_args, batch_dims, **unused_kwargs): batching.primitive_batchers[select_p] = _select_batch_rule -def _slice_shape_rule(operand, start_indices, limit_indices, strides, - operand_shape): +def _slice_shape_rule(operand, start_indices, limit_indices, strides): _check_shapelike("slice", "start_indices", start_indices) _check_shapelike("slice", "limit_indices", limit_indices) if operand.ndim != len(start_indices): @@ -2801,12 +2788,12 @@ def _slice_shape_rule(operand, start_indices, limit_indices, strides, onp.add(onp.subtract(limit_indices, start_indices), strides) - 1, strides) return tuple(result_shape) -def _slice_translation_rule(c, operand, start_indices, limit_indices, strides, - operand_shape): +def _slice_translation_rule(c, operand, start_indices, limit_indices, strides): return c.Slice(operand, start_indices, limit_indices, strides) -def _slice_transpose_rule(t, start_indices, limit_indices, strides, - operand_shape): +def _slice_transpose_rule(t, operand, start_indices, limit_indices, strides): + assert ad.is_undefined_primal(operand) + operand_shape = operand.aval.shape if strides is None or onp.all(onp.equal(strides, 1)): pads = zip(start_indices, onp.subtract(operand_shape, limit_indices), (0,) * len(start_indices)) @@ -2820,7 +2807,7 @@ def _slice_transpose_rule(t, start_indices, limit_indices, strides, return [result] def _slice_batching_rule(batched_args, batch_dims, start_indices, limit_indices, - strides, **unused_kwargs): + strides): operand, = batched_args bdim, = batch_dims @@ -2841,12 +2828,11 @@ def _slice_batching_rule(batched_args, batch_dims, start_indices, limit_indices, slice_p = standard_primitive(_slice_shape_rule, _input_dtype, 'slice', _slice_translation_rule) -ad.deflinear(slice_p, _slice_transpose_rule) +ad.deflinear2(slice_p, _slice_transpose_rule) batching.primitive_batchers[slice_p] = _slice_batching_rule -def _dynamic_slice_shape_rule(operand, *start_indices, **kwargs): - slice_sizes = kwargs["slice_sizes"] +def _dynamic_slice_shape_rule(operand, *start_indices, slice_sizes): if operand.ndim != len(start_indices): msg = ("dynamic_slice start_indices must have length equal to the number " "of dimensions of the operand, got indices {} for operand shape {}.") @@ -2865,7 +2851,7 @@ def _dynamic_slice_shape_rule(operand, *start_indices, **kwargs): raise TypeError(msg.format(slice_sizes)) return tuple(slice_sizes) -def _dynamic_slice_dtype_rule(operand, *start_indices, **kw): +def _dynamic_slice_dtype_rule(operand, *start_indices, slice_sizes): if any(i.dtype != start_indices[0].dtype or not dtypes.issubdtype(i.dtype, onp.integer) for i in start_indices): msg = ("index arguments to dynamic_slice must be integers of the same " @@ -2873,20 +2859,19 @@ def _dynamic_slice_dtype_rule(operand, *start_indices, **kw): raise TypeError(msg.format(", ".join(i.dtype.name for i in start_indices))) return operand.dtype -def _dynamic_slice_translation_rule(c, operand, *start_indices, **kwargs): - slice_sizes = kwargs["slice_sizes"] +def _dynamic_slice_translation_rule(c, operand, *start_indices, slice_sizes): return c.DynamicSlice(operand, start_indices, slice_sizes) -def _dynamic_slice_jvp(primals, tangents, slice_sizes, operand_shape): +def _dynamic_slice_jvp(primals, tangents, slice_sizes): tangent_out = ad_util.zero if tangents[0] is not ad_util.zero: tangent_out = dynamic_slice(tangents[0], primals[1:], slice_sizes) return dynamic_slice(primals[0], primals[1:], slice_sizes), tangent_out -def _dynamic_slice_transpose_rule(t, operand, *start_indices, **kwargs): - operand_shape = kwargs["operand_shape"] - assert operand is ad.undefined_primal - assert all(s is not ad.undefined_primal for s in start_indices) +def _dynamic_slice_transpose_rule(t, operand, *start_indices, slice_sizes): + assert ad.is_undefined_primal(operand) + assert all(not ad.is_undefined_primal(s) for s in start_indices) + operand_shape = operand.aval.shape zeros = full(operand_shape, tie_in(t, _zero(t))) return ([dynamic_update_slice(zeros, t, start_indices)] + [None] * len(start_indices)) @@ -2902,26 +2887,27 @@ def _batch_dynamic_slice_indices(indices, bdims): dimension=1) return indices, 0 -def _dynamic_slice_batching_rule(batched_args, batch_dims, slice_sizes, - operand_shape): +def _dynamic_slice_batching_rule(batched_args, batch_dims, slice_sizes): # A dynamic slice is a special case of gather; we can delegate to the gather # batching rule. # TODO(phawkins): consider removing dynamic_slice entirely and using gather # always. + operand, *start_indices = batched_args + operand_bd, *start_idx_bds = batch_dims + operand_shape = (operand.shape if operand_bd is batching.not_mapped + else tuple(onp.delete(operand.shape, operand_bd))) dims = tuple(range(len(operand_shape))) dnums = GatherDimensionNumbers(offset_dims=dims, collapsed_slice_dims=(), start_index_map=dims) - index, index_bdim = _batch_dynamic_slice_indices(batched_args[1:], - batch_dims[1:]) + index, index_bdim = _batch_dynamic_slice_indices(start_indices, start_idx_bds) return _gather_batching_rule( - [batched_args[0], index], [batch_dims[0], index_bdim], dnums, slice_sizes, - operand_shape) + [operand, index], [operand_bd, index_bdim], dnums, slice_sizes) dynamic_slice_p = standard_primitive( _dynamic_slice_shape_rule, _dynamic_slice_dtype_rule, 'dynamic_slice', _dynamic_slice_translation_rule) -ad.primitive_jvps[dynamic_slice_p] = _dynamic_slice_jvp +ad.primitive_jvps[dynamic_slice_p] = _dynamic_slice_jvp # TODO ad.primitive_transposes[dynamic_slice_p] = _dynamic_slice_transpose_rule batching.primitive_batchers[dynamic_slice_p] = _dynamic_slice_batching_rule @@ -2950,7 +2936,7 @@ def _dynamic_update_slice_dtype_rule(operand, update, *start_indices, **kwargs): raise TypeError(msg.format(", ".join(i.dtype.name for i in start_indices))) return operand.dtype -def _dynamic_update_slice_jvp(primals, tangents, update_shape): +def _dynamic_update_slice_jvp(primals, tangents): operand, update = primals[:2] start_indices = primals[2:] g_operand, g_update = tangents[:2] @@ -2963,38 +2949,40 @@ def _dynamic_update_slice_jvp(primals, tangents, update_shape): tangent_out = dynamic_update_slice(g_operand, g_update, start_indices) return val_out, tangent_out -def _dynamic_update_slice_transpose_rule(t, operand, update, *start_indices, - **kwargs): - update_shape = kwargs["update_shape"] - assert all(x is not ad.undefined_primal for x in start_indices) +def _dynamic_update_slice_transpose_rule(t, operand, update, *start_indices): + assert all(not ad.is_undefined_primal(x) for x in start_indices) + if ad.is_undefined_primal(update): + update_shape = update.aval.shape + else: + update_shape = update.shape dus = dynamic_update_slice ds = dynamic_slice zeros = _zeros(t, shape=update_shape) - operand_t = dus(t, zeros, start_indices) if operand is ad.undefined_primal else None - update_t = ds(t, start_indices, update_shape) if update is ad.undefined_primal else None + operand_t = dus(t, zeros, start_indices) if ad.is_undefined_primal(operand) else None + update_t = ds(t, start_indices, update_shape) if ad.is_undefined_primal(update) else None return [operand_t, update_t] + [None] * len(start_indices) def _dynamic_update_slice_translation_rule(c, operand, update, *start_indices, **kwargs): return c.DynamicUpdateSlice(operand, update, start_indices) -def _dynamic_update_slice_batching_rule(batched_args, batch_dims, update_shape): +def _dynamic_update_slice_batching_rule(batched_args, batch_dims): # A dynamic update slice is a special case of scatter; we can delegate to the # scatter batching rule. # TODO(phawkins): consider removing dynamic_update_slice entirely and using # scatter always. - operand, update = batched_args[:2] - operand_bdims, update_bdims = batch_dims[:2] + operand, update, *start_idx = batched_args + operand_bd, update_bd, *start_idx_bd = batch_dims + update_shape = (update.shape if update_bd is batching.not_mapped + else tuple(onp.delete(update.shape, update_bd))) dims = tuple(range(len(update_shape))) dnums = ScatterDimensionNumbers(update_window_dims=dims, inserted_window_dims=(), scatter_dims_to_operand_dims=dims) - index, index_bdim = _batch_dynamic_slice_indices(batched_args[2:], - batch_dims[2:]) + index, index_bdim = _batch_dynamic_slice_indices(start_idx, start_idx_bd) return _scatter_batching_rule( - scatter, - (operand, index, update), (operand_bdims, index_bdim, update_bdims), - None, None, dnums, update_shape) + scatter, (operand, index, update), + (operand_bd, index_bdim, update_bd), None, None, dnums) dynamic_update_slice_p = standard_primitive( @@ -3047,12 +3035,10 @@ def _gather_dtype_rule(operand, start_indices, **kwargs): raise ValueError("start_indices must have an integer type") return dtypes.canonicalize_dtype(operand.dtype) -def _gather_shape_rule(operand, start_indices, dimension_numbers, slice_sizes, - operand_shape): - assert operand.shape == operand_shape - if len(operand_shape) != len(slice_sizes): +def _gather_shape_rule(operand, start_indices, dimension_numbers, slice_sizes): + if len(operand.shape) != len(slice_sizes): msg = ("slice_sizes must have rank equal to the gather operand; " - "operand.shape={}, slice_sizes={}".format(operand_shape, slice_sizes)) + "operand.shape={}, slice_sizes={}".format(operand.shape, slice_sizes)) raise ValueError(msg) result_rank = len(dimension_numbers.offset_dims) + start_indices.ndim - 1 start_indices_shape = iter(start_indices.shape[:-1]) @@ -3061,19 +3047,19 @@ def _gather_shape_rule(operand, start_indices, dimension_numbers, slice_sizes, else next(start_indices_shape) for i in range(result_rank)) def _gather_translation_rule(c, operand, start_indices, dimension_numbers, - slice_sizes, operand_shape): + slice_sizes): indices_shape = c.GetShape(start_indices) return c.Gather( operand, start_indices, _gather_dimensions_proto(indices_shape, dimension_numbers), slice_sizes) -def _gather_jvp_rule(g, operand, start_indices, dimension_numbers, slice_sizes, - operand_shape): +def _gather_jvp_rule(g, operand, start_indices, dimension_numbers, slice_sizes): return gather(g, start_indices, dimension_numbers, slice_sizes) def _gather_transpose_rule(t, operand, start_indices, dimension_numbers, - slice_sizes, operand_shape): - assert operand is ad.undefined_primal + slice_sizes): + assert ad.is_undefined_primal(operand) + operand_shape = operand.aval.shape if t is ad_util.zero: return [ad_util.zero, ad_util.zero] zeros = full(operand_shape, tie_in(t, _zero(t))) @@ -3084,7 +3070,7 @@ def _gather_transpose_rule(t, operand, start_indices, dimension_numbers, return [scatter_add(zeros, start_indices, t, scatter_dnums), ad_util.zero] def _gather_batching_rule(batched_args, batch_dims, dimension_numbers, - slice_sizes, operand_shape): + slice_sizes): operand, start_indices = batched_args operand_bdim, start_indices_bdim = batch_dims @@ -3192,8 +3178,7 @@ def _scatter_shape_rule(operand, scatter_indices, updates, **kwargs): return operand.shape def _scatter_translation_rule(c, operand, scatter_indices, updates, - update_jaxpr, update_consts, dimension_numbers, - updates_shape): + update_jaxpr, update_consts, dimension_numbers): dtype = c.GetShape(operand).numpy_dtype() init_value = c.Constant(onp.array(0, dtype)) update_computation = _reduction_computation( @@ -3202,14 +3187,12 @@ def _scatter_translation_rule(c, operand, scatter_indices, updates, return c.Scatter(operand, scatter_indices, updates, update_computation, _scatter_dimensions_proto(indices_shape, dimension_numbers)) -def _scatter_add_jvp(primals, tangents, update_jaxpr, update_consts, - dimension_numbers, updates_shape): +def _scatter_add_jvp(primals, tangents, update_jaxpr, update_consts, dimension_numbers): operand, scatter_indices, updates = primals g_operand, g_scatter_indices, g_updates = tangents val_out = scatter_add_p.bind( operand, scatter_indices, updates, update_jaxpr=update_jaxpr, - update_consts=update_consts, dimension_numbers=dimension_numbers, - updates_shape=updates_shape) + update_consts=update_consts, dimension_numbers=dimension_numbers) if g_operand is ad_util.zero and g_updates is ad_util.zero: tangent_out = ad_util.zero else: @@ -3217,22 +3200,24 @@ def _scatter_add_jvp(primals, tangents, update_jaxpr, update_consts, g_updates = ad.instantiate_zeros(updates, g_updates) tangent_out = scatter_add_p.bind( g_operand, scatter_indices, g_updates, update_jaxpr=update_jaxpr, - update_consts=update_consts, dimension_numbers=dimension_numbers, - updates_shape=updates_shape) + update_consts=update_consts, dimension_numbers=dimension_numbers) return val_out, tangent_out def _scatter_add_transpose_rule(t, operand, scatter_indices, updates, - update_jaxpr, update_consts, dimension_numbers, - updates_shape): - assert scatter_indices is not ad.undefined_primal + update_jaxpr, update_consts, dimension_numbers): + assert not ad.is_undefined_primal(scatter_indices) + if ad.is_undefined_primal(updates): + updates_shape = updates.aval.shape + else: + updates_shape = updates.shape if t is ad_util.zero: return [ad_util.zero, None, ad_util.zero] operand_t = update_t = None - if operand is ad.undefined_primal: + if ad.is_undefined_primal(operand): operand_t = t - if updates is ad.undefined_primal: + if ad.is_undefined_primal(updates): gather_dnums = GatherDimensionNumbers( offset_dims=dimension_numbers.update_window_dims, collapsed_slice_dims=dimension_numbers.inserted_window_dims, @@ -3249,12 +3234,11 @@ def _scatter_add_transpose_rule(t, operand, scatter_indices, updates, slice_sizes=slice_sizes) return [operand_t, None, update_t] -def _scatter_batching_rule( - scatter_op, batched_args, batch_dims, update_jaxpr, update_consts, - dimension_numbers, updates_shape): +def _scatter_batching_rule(scatter_op, batched_args, batch_dims, update_jaxpr, + update_consts, dimension_numbers): operand, scatter_indices, updates = batched_args operand_bdim, scatter_indices_bdim, updates_bdim = batch_dims - del update_jaxpr, update_consts, updates_shape # Unused. + del update_jaxpr, update_consts # Unused. # move the operand batch dim to the front if it is not None, otherwise create # it at the front (so that we can scatter into it) @@ -3319,8 +3303,7 @@ def _scatter_batching_rule( partial(_scatter_batching_rule, scatter_max)) -def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, - dimension_numbers, updates_shape): +def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, dimension_numbers): operand, scatter_indices, updates = primals g_operand, g_scatter_indices, g_updates = tangents dnums = dimension_numbers @@ -3328,8 +3311,7 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, if g_operand is ad_util.zero and g_updates is ad_util.zero: val_out = scatter_p.bind( operand, scatter_indices, updates, update_jaxpr=update_jaxpr, - update_consts=update_consts, dimension_numbers=dnums, - updates_shape=updates_shape) + update_consts=update_consts, dimension_numbers=dnums) tangent_out = ad_util.zero return val_out, tangent_out @@ -3381,8 +3363,7 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, scatter_dims_to_operand_dims=tuple(d + 1 for d in dnums.scatter_dims_to_operand_dims)) outputs = scatter_p.bind( new_operand, scatter_indices, updates_and_ids, update_jaxpr=update_jaxpr, - update_consts=update_consts, dimension_numbers=new_dnums, - updates_shape=updates_shape) + update_consts=update_consts, dimension_numbers=new_dnums) val_out = index_in_dim(outputs, 0, keepdims=False) scattered_ids = index_in_dim(outputs, 1, keepdims=False) @@ -3454,15 +3435,14 @@ def _masking_defreducer(prim, identity): masking.masking_rules[prim] = partial(_reducer_masking_rule, prim, identity) def _reducer_masking_rule(prim, identity, padded_vals, logical_shapes, - axes, input_shape): - del input_shape # Unused. + axes): (padded_val,), (logical_shape,) = padded_vals, logical_shapes padded_shape = masking.padded_shape_as_value(padded_val.shape) masks = [broadcasted_iota(onp.int32, padded_shape, i) < d for i, d in enumerate(logical_shape) if i in axes] mask = _reduce(operator.and_, masks) masked_val = select(mask, padded_val, identity(padded_shape, padded_val.dtype)) - return prim.bind(masked_val, axes=axes, input_shape=padded_shape) + return prim.bind(masked_val, axes=axes) reduce_p = standard_primitive(_reduce_shape_rule, _input_dtype, 'reduce', _reduce_translation_rule) @@ -3475,19 +3455,19 @@ def _reduce_number_dtype_rule(name, operand, *args, **kw): "of number.".format(name, onp.dtype(operand.dtype).name)) return dtypes.canonicalize_dtype(operand.dtype) -def _reduce_sum_shape_rule(operand, axes, input_shape): - assert operand.shape == input_shape, ('{} != {}' - .format(operand.shape, input_shape)) +def _reduce_sum_shape_rule(operand, axes): return _reduce_op_shape_rule(operand, axes) -def _reduce_sum_translation_rule(c, operand, axes, input_shape): +def _reduce_sum_translation_rule(c, operand, axes): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(0, dtype)), xla.primitive_subcomputation(add_p, scalar, scalar), axes) -def _reduce_sum_transpose_rule(cotangent, input_shape, axes): +def _reduce_sum_transpose_rule(cotangent, operand, axes): + assert ad.is_undefined_primal(operand) + input_shape = operand.aval.shape broadcast_dimensions = tuple(onp.delete(onp.arange(len(input_shape)), axes)) result = broadcast_in_dim(cotangent, input_shape, broadcast_dimensions) assert result.shape == input_shape @@ -3496,7 +3476,7 @@ def _reduce_sum_transpose_rule(cotangent, input_shape, axes): reduce_sum_p = standard_primitive( _reduce_sum_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_sum'), 'reduce_sum', _reduce_sum_translation_rule) -ad.deflinear(reduce_sum_p, _reduce_sum_transpose_rule) +ad.deflinear2(reduce_sum_p, _reduce_sum_transpose_rule) batching.defreducer(reduce_sum_p) _masking_defreducer(reduce_sum_p, lambda shape, dtype: onp.broadcast_to(onp.array(0, dtype), shape)) @@ -3646,7 +3626,7 @@ def reduce_window(x, window_dimensions, window_strides, padding): def _reduce_window_sum_shape_rule(operand, window_dimensions, window_strides, - padding, input_shape): + padding): if not dtypes.issubdtype(operand.dtype, onp.number): msg = "operand to reduce_window_sum must have a number dtype, got {}" raise TypeError(msg.format(onp.dtype(operand.dtype).name)) @@ -3654,15 +3634,17 @@ def _reduce_window_sum_shape_rule(operand, window_dimensions, window_strides, window_strides, padding) def _reduce_window_sum_translation_rule(c, operand, window_dimensions, - window_strides, padding, input_shape): + window_strides, padding): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.ReduceWindow(operand, c.Constant(onp.array(0, dtype)), xla.primitive_subcomputation(add_p, scalar, scalar), window_dimensions, window_strides, padding) -def _reduce_window_sum_transpose_rule(cotangent, window_dimensions, - window_strides, padding, input_shape): +def _reduce_window_sum_transpose_rule(cotangent, operand, window_dimensions, + window_strides, padding): + assert ad.is_undefined_primal(operand) + input_shape = operand.aval.shape in_pads = padtype_to_pads(input_shape, window_dimensions, window_strides, padding) ones = [1] * len(input_shape) @@ -3677,9 +3659,8 @@ def _reduce_window_sum_transpose_rule(cotangent, window_dimensions, assert result.shape == input_shape return [result] -def _reduce_window_batch_rule( - reduce_window, batched_args, bdims, window_dimensions, window_strides, - padding, input_shape=None): +def _reduce_window_batch_rule(reduce_window, batched_args, bdims, + window_dimensions, window_strides, padding): operand, = batched_args bdim, = bdims @@ -3696,7 +3677,7 @@ def _reduce_window_batch_rule( reduce_window_sum_p = standard_primitive( _reduce_window_sum_shape_rule, _input_dtype, 'reduce_window_sum', _reduce_window_sum_translation_rule) -ad.deflinear(reduce_window_sum_p, _reduce_window_sum_transpose_rule) +ad.deflinear2(reduce_window_sum_p, _reduce_window_sum_transpose_rule) batching.primitive_batchers[reduce_window_sum_p] = partial( _reduce_window_batch_rule, _reduce_window_sum) @@ -3821,7 +3802,7 @@ def _select_and_scatter_add_jvp( def _select_and_scatter_add_transpose( t, source, operand, select_prim, window_dimensions, window_strides, padding): - assert source is ad.undefined_primal and operand is not ad.undefined_primal + assert ad.is_undefined_primal(source) and not ad.is_undefined_primal(operand) source_t = _select_and_gather_add(t, operand, select_prim, window_dimensions, window_strides, padding) return [source_t, None] @@ -3999,7 +3980,7 @@ def _select_and_gather_add_jvp( def _select_and_gather_add_transpose( t, tangents, operand, select_prim, window_dimensions, window_strides, padding): - assert tangents is ad.undefined_primal and operand is not ad.undefined_primal + assert ad.is_undefined_primal(tangents) and not ad.is_undefined_primal(operand) result = _select_and_scatter_add(t, operand, select_prim, window_dimensions, window_strides, padding) return [result, None] @@ -4083,8 +4064,8 @@ def _sort_key_val_transpose_rule(t, keys, values, dimension): assert t_keys is ad_util.zero iota = broadcasted_iota(onp.int32, keys.shape, dimension % keys.ndim) _, perm = sort_key_val(keys, iota) - keys_result = ad_util.zero if keys is ad.undefined_primal else None - values_result = sort_key_val(perm, t_values)[1] if values is ad.undefined_primal else None + keys_result = ad_util.zero if ad.is_undefined_primal(keys) else None + values_result = sort_key_val(perm, t_values)[1] if ad.is_undefined_primal(values) else None return [keys_result, values_result] def _sort_key_val_batch_rule(batched_args, batch_dims, dimension): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 4a11c169e526..ba84068e47f6 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -623,7 +623,7 @@ def _transpose_cond_jaxpr(jaxpr, num_res): @lu.wrap_init def transposed(*args): res, cts_out = split_list(args, [num_res]) - primals = res + [ad.undefined_primal] * num_non_res + primals = res + [ad.UndefinedPrimal(aval) for aval in primal_avals] cts_in = ad.backward_pass( jaxpr.jaxpr, jaxpr.literals, primals, cts_out) _, cts_in = split_list(cts_in, [num_res]) @@ -1022,8 +1022,8 @@ def _scan_transpose(cts, *args, forward, length, num_consts, num_carry, jaxpr, l consts, _, xs = split_list(args, [num_consts, num_carry]) ires, _ = split_list(consts, [num_ires]) _, eres = split_list(xs, [sum(xs_lin)]) - assert not any(r is ad.undefined_primal for r in ires) - assert not any(r is ad.undefined_primal for r in eres) + assert not any(ad.is_undefined_primal(r) for r in ires) + assert not any(ad.is_undefined_primal(r) for r in eres) carry_avals, y_avals = split_list(jaxpr.out_avals, [num_carry]) ys_avals = _map(partial(_promote_aval_rank, length), y_avals) @@ -1060,7 +1060,8 @@ def _transpose_scan_jaxpr(num_res1, num_c, num_res2, jaxpr): def transposed(*res1_cbar_bbar_res2): res1, c_bar, b_bar, res2 = split_list( res1_cbar_bbar_res2, [num_res1, num_c, num_b]) - primals = res1 + [ad.undefined_primal] * (num_c + num_a) + res2 + primals = (res1 + [ad.UndefinedPrimal(aval) for aval in c_avals] + + [ad.UndefinedPrimal(aval) for aval in a_avals] + res2) cbar_abar = ad.backward_pass(jaxpr.jaxpr, jaxpr.literals, primals, b_bar) _, new_c_bar, a_bar, _ = split_list(cbar_abar, [num_res1, num_c, num_a]) @@ -1219,8 +1220,7 @@ def map(f, xs): return ys -def _concat_masking_rule(padded_vals, logical_shapes, dimension, operand_shapes): - del operand_shapes # Unused. +def _concat_masking_rule(padded_vals, logical_shapes, dimension): result = lax.concatenate(padded_vals, dimension) # fragmented offset = 0 for padded_val, logical_shape in zip(padded_vals, logical_shapes): @@ -1577,7 +1577,7 @@ def _linear_solve_transpose_rule(cotangent, *primals, **kwargs): 'differentiation of custom_linear_solve') params, b = _split_linear_solve_args(primals, const_lengths) - assert b == [ad.undefined_primal] * len(b) + assert all(ad.is_undefined_primal(x) for x in b) cotangent_b = linear_solve_p.bind( *(_flatten(params.transpose()) + cotangent), const_lengths=const_lengths.transpose(), jaxprs=jaxprs.transpose(), diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 89afa9002e7d..2ef61fa26f15 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -659,10 +659,10 @@ def cases(x, y, xdim, ydim, xc, yc, xb, yb): out, xdim, ydim, dimension_numbers)) -def _reshape_papply_rule(name, size, vals, axes, new_sizes, dimensions, - old_sizes): +def _reshape_papply_rule(name, size, vals, axes, new_sizes, dimensions): operand, = vals axis, = axes + old_sizes = tuple(onp.insert(operand.shape, axis, size)) def filter_ones(xs): return filter(lambda x: x != 1, xs) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index e0039424c1c0..529a164e6493 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -357,7 +357,7 @@ def triangular_solve_transpose_rule( unit_diagonal): # Triangular solve is nonlinear in its first argument and linear in its second # argument, analogous to `div` but swapped. - assert a is not ad.undefined_primal and b is ad.undefined_primal + assert not ad.is_undefined_primal(a) and ad.is_undefined_primal(b) if cotangent is ad_util.zero: cotangent_b = ad_util.zero else: diff --git a/tests/api_test.py b/tests/api_test.py index 23d7d5b49f17..766eaf8a925b 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1894,8 +1894,7 @@ def func1(first, second): let c = sin b d = mul c 3.0 e = add a d - f = reduce_sum[ axes=(0,) - input_shape=(8,) ] e + f = reduce_sum[ axes=(0,) ] e in f } """, str(jaxpr)) From 271041b499029d639bade9e1c77d3dc64a89f9cd Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 13 Mar 2020 13:35:18 -0400 Subject: [PATCH 0859/1053] Update a regression test to test size-zero device to device transfers. (#2411) --- tests/api_test.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/api_test.py b/tests/api_test.py index 766eaf8a925b..5231ab5af881 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -308,14 +308,17 @@ def test_device_put_and_get(self): self.assertIsInstance(y2[1][1], onp.ndarray) assert onp.all(y2[1][1] == 3 * x) - def test_device_put_across_devices(self): - if xb.device_count() == 1: + @parameterized.parameters([(3,)], [(2, 0)]) + def test_device_put_across_devices(self, shape): + if len(api.local_devices()) < 2: raise unittest.SkipTest("this test requires multiple devices") - d1, d2 = xb.local_devices()[:2] - x = api.device_put(onp.array([1,2,3]), device=d1) + d1, d2 = api.local_devices()[:2] + data = onp.random.randn(*shape).astype(onp.float32) + x = api.device_put(data, device=d1) self.assertEqual(x.device_buffer.device(), d1) y = api.device_put(x, device=d2) self.assertEqual(y.device_buffer.device(), d2) + onp.testing.assert_array_equal(data, onp.array(y)) # Make sure these don't crash api.device_put(x) api.device_put(y) From c41c4de5a54e16998fdb6b9e238f301d6299d078 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 13 Mar 2020 15:15:55 -0700 Subject: [PATCH 0860/1053] lower fori_loop to scan when possible (#2414) When a fori_loop specialized on trip count is to be evaluated, it's preferable to generate a scan rather than a while_loop because the former is reverse-mode differentiable while the latter is not. Otherwise they're essentially the same; in particular, no extensive inputs/outputs arise unless reverse-mode autodiff is applied. Also fixes #2412. --- jax/lax/lax_control_flow.py | 68 +++++++++++++++++++++++++--------- tests/lax_control_flow_test.py | 10 ++++- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index ba84068e47f6..2d6072b9346c 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -94,6 +94,13 @@ def while_body_fun(loop_carry): return lax.add(i, lax._const(i, 1)), upper, body_fun(i, x) return while_body_fun +@cache() +def _fori_scan_body_fun(body_fun): + def scanned_fun(loop_carry, _): + i, upper, x = loop_carry + return (lax.add(i, lax._const(i, 1)), upper, body_fun(i, x)), None + return scanned_fun + def fori_loop(lower, upper, body_fun, init_val): """Loop from ``lower`` to ``upper`` by reduction to ``while_loop``. @@ -131,15 +138,31 @@ def fori_loop(lower, upper, body_fun, init_val): Returns: Loop value from the final iteration, of type ``a``. """ - # TODO: perhaps do more type checking here, for better error messages. + # TODO(phawkins): perhaps do more type checking here, better error messages. lower_dtype = dtypes.canonicalize_dtype(lax.dtype(lower)) upper_dtype = dtypes.canonicalize_dtype(lax.dtype(upper)) if lower_dtype != upper_dtype: msg = ("lower and upper arguments to fori_loop must have equal types, " "got {} and {}") raise TypeError(msg.format(lower_dtype.name, upper_dtype.name)) - _, _, result = while_loop(_fori_cond_fun, _fori_body_fun(body_fun), - (lower, upper, init_val)) + + # If we can specialize on the trip count, call scan instead of a while_loop + # to enable efficient reverse-mode differentiation. + try: + lower_ = int(lower) + upper_ = int(upper) + except TypeError: + use_scan = False + else: + use_scan = True + + if use_scan: + (_, _, result), _ = scan(_fori_scan_body_fun(body_fun), + (lower, upper, init_val), None, + length=upper_ - lower_) + else: + _, _, result = while_loop(_fori_cond_fun, _fori_body_fun(body_fun), + (lower, upper, init_val)) return result @@ -815,17 +838,26 @@ def _scan_impl(*args, forward, length, num_consts, num_carry, jaxpr, linear): _, _, x_avals = split_list(jaxpr.in_avals, [num_consts, num_carry]) _, y_avals = split_list(jaxpr.out_avals, [num_carry]) - def body_fun(i, vals): - i = i if forward else length - i - 1 - carry, ys = split_list(vals, [num_carry]) - x = _map(partial(_index_array, i), x_avals, xs) + def cond_fun(vals): + i, *_ = vals + return i < length + + def body_fun(vals): + [i], carry, ys = split_list(vals, [1, num_carry]) + i_ = i if forward else length - i - 1 + x = _map(partial(_index_array, i_), x_avals, xs) out_flat = core.jaxpr_as_fun(jaxpr)(*(consts + carry + x)) carry_out, y_updates = split_list(out_flat, [num_carry]) - ys_out = _map(partial(_update_array, i), y_avals, ys, y_updates) - return carry_out + ys_out + ys_out = _map(partial(_update_array, i_), y_avals, ys, y_updates) + return [i + 1] + carry_out + ys_out ys_init = _map(partial(_empty_array, length), y_avals) - return fori_loop(lax._const(length, 0), length, body_fun, init + ys_init) + if length == 0: + return init + ys_init + else: + init_val = [lax._const(length, 0)] + init + ys_init + _, *outs = while_loop(cond_fun, body_fun, init_val) + return outs def _index_array(i, aval, x): if aval is core.abstract_unit: @@ -845,12 +877,11 @@ def _update_array(i, aval, xs, x): else: return lax.dynamic_update_index_in_dim(xs, x, i, 0) -# TODO(mattjj): make scan a primitive -# def _scan_abstract_eval(*args, forward, length, num_consts, num_carry, jaxpr, linear): -# carry_avals, y_avals = split_list(jaxpr.out_avals, [num_carry]) -# ys_avals = [ShapedArray((length,) + aval.shape, aval.dtype) -# if aval is not core.abstract_unit else aval for aval in y_avals] -# return carry_avals + y_avals +def _scan_abstract_eval(*args, forward, length, num_consts, num_carry, jaxpr, linear): + carry_avals, y_avals = split_list(jaxpr.out_avals, [num_carry]) + ys_avals = [ShapedArray((length,) + aval.shape, aval.dtype) + if aval is not core.abstract_unit else aval for aval in y_avals] + return carry_avals + ys_avals def _scan_jvp(primals, tangents, forward, length, jaxpr, num_consts, num_carry, linear): @@ -1141,7 +1172,7 @@ def _scan_masking_rule(shape_envs, padded_vals, shape_exprs, forward, length, *itertools.chain([dynamic_length] + consts, [0], init, xs), forward=forward, length=max_length, jaxpr=masked_jaxpr, num_consts=1 + num_consts, num_carry=1 + num_carry, - linear=[False] + const_linear + [False] + init_linear + xs_linear) + linear=tuple([False] + const_linear + [False] + init_linear + xs_linear)) return out_vals[1:], out_shape def _masked_scan_jaxpr(jaxpr, num_consts, num_carry): @@ -1180,7 +1211,8 @@ def scan_bind(*args, forward, length, num_consts, num_carry, jaxpr, linear): scan_p = core.Primitive("scan") scan_p.multiple_results = True scan_p.def_custom_bind(scan_bind) -scan_p.def_impl(_scan_impl) +scan_p.def_impl(partial(xla.apply_primitive, scan_p)) +scan_p.def_abstract_eval(_scan_abstract_eval) ad.primitive_jvps[scan_p] = _scan_jvp ad.primitive_transposes[scan_p] = _scan_transpose pe.custom_partial_eval_rules[scan_p] = _scan_partial_eval diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 111baab784ba..455ebc192640 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -349,7 +349,9 @@ def fun(x): self.assertAllClose(ans, expected, check_dtypes=False) def testForiLoopBatchedIssue1190(self): - f = lambda x: lax.fori_loop(0, 4, lambda _, x: x + 1, x) + cond_fun = lambda carry: carry[0] < 4 + body_fun = lambda carry: (carry[0] + 1, carry[1] + 1) + f = lambda x: lax.while_loop(cond_fun, body_fun, (0, x)) jaxpr = api.make_jaxpr(api.vmap(f))(np.arange(3)) eqn = jaxpr.jaxpr.eqns[0] self.assertIs(eqn.primitive, lax.while_p) @@ -1269,6 +1271,12 @@ def testMap(self): actual = lax.map(f, xs) self.assertAllClose(actual, expected, check_dtypes=True) + def testMapEmpty(self): + # https://github.com/google/jax/issues/2412 + ans = lax.map(lambda x: x * x, np.array([])) + expected = np.array([]) + self.assertAllClose(ans, expected, check_dtypes=True) + def testCaching(self): def cond(x): assert python_should_be_executing From 47df7b95c44d27a2bb78636c7642a60cdb622402 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 14 Mar 2020 12:33:14 -0700 Subject: [PATCH 0861/1053] change the xla representation of JAX's unit (#2416) * change the xla representation of JAX's unit Previously the representation of JAX's unit value (a sentinel / placeholder) was an empty tuple, but by changing the representation to something else we can further reduce our dependence on runtime tuples. This commit makes the representation fairly easy to change. There are three functions in xla.py that define the representation. Here are versions that would keep the old XLA representation as an empty tuple: ``` def _make_unit(c): return c.Tuple() def _make_abstract_unit(_): return xc.Shape.tuple_shape(()) def _device_put_unit(_, device): return xc.Buffer.make_tuple((), device, backend=xb.get_device_backend(device)) ``` The new representation is as a trivial array. An alternative representation would be nothing at all: we don't need to generate XLA computations that have representations of JAX units. While that alterntaive is probably the best choice, it seemed like it would require a bit more refactoring/bookkeeping (e.g. to allow XLA computations to have a smaller number of outputs than the corresponding JAX function), and would also mean the XLA representation would be a step further removed from the jaxpr representation. So I stuck with a trivial array for now. The mapping from JAX types to XLA types need not be invertible. However, XLA translation rules currently don't take as arguments the corresponding JAX types (abstract values), and there were a few cases where we relied on checking whether an argument's XLA type was that of an empty tuple so as to determine if we were effectively operating on a JAX unit. In particular, the AD-related primitive add_jaxvals_p could in principle add two units, and get lowered to an XLA addition on the unit representation. Previously, the translation rule for add_jaxvals_p checked the XLA type so that adding two empty tuples didn't produce any XLA operation; now it adds its inputs, and so if unit is represented as a trivial array we could be inserting trivial scalar adds where we had none before. However, if that case is ever possible, it doesn't come up in our tests (which I checked by keeping the representation as an empty tuple and then asserting an XLA tuple type is never seen by that translation rule). * add comment about JAX<->XLA array types assumption --- jax/ad_util.py | 1 - jax/api.py | 2 +- jax/dlpack.py | 7 ++- jax/interpreters/pxla.py | 40 +++++++------- jax/interpreters/xla.py | 104 +++++++++++++++++++++--------------- jax/lax/lax_control_flow.py | 20 ++++--- jax/lax_linalg.py | 2 +- jax/random.py | 6 +-- 8 files changed, 100 insertions(+), 82 deletions(-) diff --git a/jax/ad_util.py b/jax/ad_util.py index 76aaea0d3940..70759e400ca3 100644 --- a/jax/ad_util.py +++ b/jax/ad_util.py @@ -29,7 +29,6 @@ def add_jaxvals(x, y): @add_jaxvals_p.def_impl def add_impl(xs, ys): - # assert type(xs) == type(ys), (xs, ys) return jaxval_adders[type(xs)](xs, ys) @add_jaxvals_p.def_abstract_eval diff --git a/jax/api.py b/jax/api.py index 2b9b7859e4d4..ce18cf8acd30 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1559,7 +1559,7 @@ def fun_abstract_eval(*avals, **params): fun_p.def_abstract_eval(fun_abstract_eval) def fun_translation(c, *xla_args, **params): - return xla.lower_fun(fun_impl, True)(c, *xla_args, **params) + return xla.lower_fun(fun_impl)(c, *xla_args, **params) xla.translations[fun_p] = fun_translation return CustomTransformsFunction(fun, fun_p) diff --git a/jax/dlpack.py b/jax/dlpack.py index 92d8ee5b9e0b..c78903c96e7c 100644 --- a/jax/dlpack.py +++ b/jax/dlpack.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from . import core from . import lazy from .interpreters import xla from .lib import xla_client @@ -44,5 +45,7 @@ def from_dlpack(dlpack, backend=None): # would be able to figure it out from the DLPack. backend = backend or xla_bridge.get_backend() buf = xla_client._xla.DLPackManagedTensorToBuffer(dlpack, backend.client) - aval = xla._aval_from_xla_shape(buf.shape()) - return xla.DeviceArray(aval, buf.device(), lazy.array(aval.shape), buf) \ No newline at end of file + xla_shape = buf.shape() + assert not xla_shape.is_tuple() + aval = core.ShapedArray(xla_shape.dimensions(), xla_shape.numpy_dtype()) + return xla.DeviceArray(aval, buf.device(), lazy.array(aval.shape), buf) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index ff7808584f6e..2fea4921ad91 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -647,8 +647,7 @@ def execute_replicated(compiled, backend, in_handler, out_handler, *args): def _pmap_translation_rule(c, axis_env, in_nodes, name_stack, axis_name, axis_size, global_axis_size, devices, name, - call_jaxpr, backend=None, - mapped_invars=None): + call_jaxpr, *, backend=None, mapped_invars): # We in-line here rather than generating a Call HLO as in the xla_call # translation rule just because the extra tuple stuff is a pain. if axis_env.devices is not None or (axis_env.names and devices is not None): @@ -657,45 +656,48 @@ def _pmap_translation_rule(c, axis_env, global_axis_size = axis_size new_env = xla.extend_axis_env(axis_env, axis_name, global_axis_size) # Shard the in_nodes that are mapped + in_avals = [v.aval for v in call_jaxpr.invars] in_nodes_sharded = ( - _xla_shard(c, new_env, in_node) if in_node_mapped else in_node - for in_node, in_node_mapped in zip(in_nodes, mapped_invars)) + _xla_shard(c, aval, new_env, in_node) if in_node_mapped else in_node + for aval, in_node, in_node_mapped in zip(in_avals, in_nodes, mapped_invars)) sharded_outs = xla.jaxpr_subcomp( c, call_jaxpr, backend, new_env, (), extend_name_stack(name_stack, wrap_name(name, 'pmap')), *in_nodes_sharded) - outs = [_xla_unshard(c, new_env, shard) for shard in sharded_outs] + out_avals = [v.aval for v in call_jaxpr.outvars] + outs = [_xla_unshard(c, aval, new_env, shard) + for aval, shard in zip(out_avals, sharded_outs)] return c.Tuple(*outs) xla.call_translations[xla_pmap_p] = _pmap_translation_rule ad.primitive_transposes[xla_pmap_p] = partial(ad.map_transpose, xla_pmap_p) pe.map_primitives.add(xla_pmap_p) -def _xla_shard(c, axis_env, x): - xla_shape = c.GetShape(x) - if xla_shape.is_tuple(): - assert not xla_shape.tuple_shapes() +def _xla_shard(c, aval, axis_env, x): + if aval is core.abstract_unit: return x - else: - dims = list(xla_shape.dimensions()) + elif isinstance(aval, ShapedArray): + dims = list(c.GetShape(x).dimensions()) zero = c.Constant(onp.zeros((), dtype=onp.uint32)) idxs = [_unravel_index(c, axis_env)] + [zero] * (len(dims) - 1) return c.Reshape(c.DynamicSlice(x, idxs, [1] + dims[1:]), None, dims[1:]) + else: + raise TypeError((aval, c.GetShape(x))) # TODO(b/110096942): more efficient gather -def _xla_unshard(c, axis_env, x): - xla_shape = c.GetShape(x) - if xla_shape.is_tuple(): - assert not xla_shape.tuple_shapes() +def _xla_unshard(c, aval, axis_env, x): + if aval is core.abstract_unit: return x - else: - dims = list(xla_shape.dimensions()) - padded = c.Broadcast(c.Constant(onp.array(0, xla_shape.numpy_dtype())), - [axis_env.sizes[-1]] + dims) + elif isinstance(aval, ShapedArray): + dims = list(c.GetShape(x).dimensions()) + padded = c.Broadcast(c.Constant(onp.array(0, aval.dtype)), + [axis_env.sizes[-1]] + dims) zero = c.Constant(onp.zeros((), dtype=onp.uint32)) idxs = [_unravel_index(c, axis_env)] + [zero] * len(dims) padded = c.DynamicUpdateSlice(padded, c.Reshape(x, None, [1] + dims), idxs) return c.CrossReplicaSum(padded, xla.axis_groups(axis_env, axis_env.names[-1])) + else: + raise TypeError((aval, c.GetShape(x))) def _unravel_index(c, axis_env): div = c.Constant(onp.array(axis_env.nreps // prod(axis_env.sizes), onp.uint32)) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index cef1a6e22627..cc2a6c9a7055 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -51,9 +51,17 @@ def _map(f, *xs): return tuple(map(f, *xs)) def identity(x): return x +# unit representation +def _make_unit(c): return c.Constant(onp.zeros((), dtype=onp.dtype('bool'))) +def _make_abstract_unit(_): return xc.Shape.array_shape(onp.dtype('bool'), ()) +def _device_put_unit(_, device): + return xc.Buffer.from_pyval(onp.zeros((), dtype=onp.dtype('bool')), + backend=xb.get_device_backend(device)) + + ### handlers -xb.register_constant_handler(core.Unit, lambda c, *_: c.Tuple()) +xb.register_constant_handler(core.Unit, lambda c, *_: _make_unit(c)) def aval_to_xla_shape(aval): try: @@ -62,7 +70,7 @@ def aval_to_xla_shape(aval): raise TypeError("No xla_shape_handler for type: {}".format(type(aval)) ) from err xla_shape_handlers = {} -xla_shape_handlers[core.AbstractUnit] = lambda _: xc.Shape.tuple_shape(()) +xla_shape_handlers[core.AbstractUnit] = _make_abstract_unit xla_shape_handlers[ShapedArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) xla_shape_handlers[ConcreteArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) @@ -88,9 +96,7 @@ def device_put(x, device=None): ) from err device_put_handlers = {} -device_put_handlers[core.Unit] = \ - lambda _, device: xc.Buffer.make_tuple( - (), device, backend=xb.get_device_backend(device)) +device_put_handlers[core.Unit] = _device_put_unit def _device_put_array(x, device): return xc.Buffer.from_pyval(x, device, backend=xb.get_device_backend(device)) for _t in array_types: @@ -223,7 +229,8 @@ def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params) rule(c, *xla_args, **params) elif prim in initial_style_translations: rule = initial_style_translations[prim] - rule(c, axis_env, extend_name_stack(prim.name), *xla_args, backend=backend, **params) + rule(c, axis_env, extend_name_stack(prim.name), avals, backend, + *xla_args, **params) else: raise NotImplementedError("XLA translation rule for {} not found".format(prim)) c.ClearOpMetadata() @@ -268,13 +275,11 @@ def check_nans(prim, bufs): _check_nans(prim.name, bufs.shape(), bufs) def _check_nans(name, xla_shape, buf): - if xla_shape.is_tuple(): - assert not xla_shape.tuple_shapes() - else: - if dtypes.issubdtype(xla_shape.element_type(), onp.floating): - if onp.any(onp.isnan(buf.to_py())): - msg = "invalid value (nan) encountered in {}" - raise FloatingPointError(msg.format(name)) + assert not xla_shape.is_tuple() + if dtypes.issubdtype(xla_shape.element_type(), onp.floating): + if onp.any(onp.isnan(buf.to_py())): + msg = "invalid value (nan) encountered in {}" + raise FloatingPointError(msg.format(name)) ### compiling jaxprs @@ -302,12 +307,18 @@ def read(v): else: return env[v] + def aval(v): + if type(v) is Literal: + return abstractify(v.val) + else: + return v.aval + def write(v, node): assert node is not None env[v] = node env = {} - write(core.unitvar, c.Tuple()) + write(core.unitvar, _make_unit(c)) _map(write, jaxpr.constvars, consts) _map(write, jaxpr.invars, args) for eqn in jaxpr.eqns: @@ -325,7 +336,7 @@ def write(v, node): new_params = check_backend_params(eqn.params, backend) rule = initial_style_translations[eqn.primitive] ans = rule(c, axis_env, extend_name_stack(name_stack, eqn.primitive.name), - *in_nodes, backend=backend, **new_params) + map(aval, eqn.invars), backend, *in_nodes, **new_params) elif eqn.primitive in parallel_translations: replica_groups = axis_groups(axis_env, eqn.params['axis_name']) new_params = {k: v for k, v in eqn.params.items() if k != 'axis_name'} @@ -586,7 +597,7 @@ def make_tuple(bufs, device, backend): def _get_device(device, backend): # TODO(mattjj): after jaxlib update, avoid compile here, just to get device c = xb.make_computation_builder("get_device") - built = c.Build(c.Tuple()) + built = c.Build(_make_unit(c)) options = xb.get_compile_options( num_replicas=1, num_partitions=1, @@ -628,48 +639,53 @@ def _xla_call_translation_rule(c, axis_env, def zeros_like_translation_rule(c, x): shape = c.GetShape(x) - if shape.is_tuple(): - assert not shape.tuple_shapes() - return c.Tuple() - else: - zero = c.Constant(onp.array(0, shape.element_type())) - return c.Broadcast(zero, shape.dimensions()) + assert not shape.is_tuple() + zero = c.Constant(onp.array(0, shape.element_type())) + return c.Broadcast(zero, shape.dimensions()) translations[ad_util.zeros_like_p] = zeros_like_translation_rule def add_jaxvals_translation_rule(c, x, y): shape = c.GetShape(x) - if shape.is_tuple(): - assert not shape.tuple_shapes() - return x - else: - return c.Add(x, y) + assert not shape.is_tuple() + return c.Add(x, y) translations[ad_util.add_jaxvals_p] = add_jaxvals_translation_rule -def lower_fun(fun, instantiate=False, initial_style=False): - """Build a translation rule for a traceable function.""" - def f(c, *args, **params): - backend = params.pop('backend', None) +def lower_fun(fun): + # This function can only be used to lower functions that take JAX array types + # as arguments (and e.g. don't accept unit values), because it assumes it can + # map from XLA types to JAX types. In general that mapping is not possible (as + # the mapping from JAX types to XLA types is not invertible), but for now at + # least we assume that the mapping from JAX *array* types to XLA array types + # is invertible. This assumption is unchecked! + # TODO(mattjj): remove assumption can map XLA array types to JAX array types + def f(c, *xla_args, **params): # TODO(mattjj): revise this 'calling convention' - if initial_style: - axis_env, name_stack, xla_args = args[0], args[1], args[2:] - else: - axis_env, name_stack, xla_args = AxisEnv(1), '', args - xla_shapes = tuple(map(c.GetShape, xla_args)) - avals = map(_aval_from_xla_shape, xla_shapes) + avals = [_array_aval_from_xla_shape(c.GetShape(x)) for x in xla_args] pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, params), pvals, instantiate=True) consts = _map(c.Constant, consts) - outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, - name_stack, *xla_args) + outs = jaxpr_subcomp(c, jaxpr, None, AxisEnv(1), consts, '', *xla_args) return c.Tuple(*outs) return f -def _aval_from_xla_shape(xla_shape): - if xla_shape.is_tuple() and not xla_shape.tuple_shapes(): - return core.abstract_unit - else: - return ShapedArray(xla_shape.dimensions(), xla_shape.element_type()) +def _array_aval_from_xla_shape(xla_shape): + # This function instantiates the assumption that we can map fro XLA array + # types to JAX array types. + # TODO(mattjj): remove assumption can map XLA array types to JAX array types + assert not xla_shape.is_tuple() + return ShapedArray(xla_shape.dimensions(), xla_shape.numpy_dtype()) + +def lower_fun_initial_style(fun): + def f(c, axis_env, name_stack, avals, backend, *xla_args, **params): + pvals = [pe.PartialVal((a, core.unit)) for a in avals] + jaxpr, _, consts = pe.trace_to_jaxpr( + lu.wrap_init(fun, params), pvals, instantiate=True) + consts = _map(c.Constant, consts) + outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, name_stack, + *xla_args) + return c.Tuple(*outs) + return f ### device-persistent data diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 2d6072b9346c..df55fddd9b6d 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -235,10 +235,8 @@ def while_loop(cond_fun, body_fun, init_val): def _while_loop_abstract_eval(*args, **kwargs): return _map(raise_to_shaped, kwargs["body_jaxpr"].out_avals) -def _while_loop_translation_rule(c, axis_env, name_stack, *args, **kwargs): - backend = kwargs.pop('backend') - cond_jaxpr, body_jaxpr, cond_nconsts, body_nconsts = split_dict( - kwargs, ["cond_jaxpr", "body_jaxpr", "cond_nconsts", "body_nconsts"]) +def _while_loop_translation_rule(c, axis_env, name_stack, avals, backend, *args, + cond_jaxpr, body_jaxpr, cond_nconsts, body_nconsts): cond_consts, body_consts, init_vals = split_list(args, [cond_nconsts, body_nconsts]) batched = bool(cond_jaxpr.out_avals[0].shape) @@ -451,8 +449,8 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): def _cond_abstract_eval(*args, **kwargs): return _map(raise_to_shaped, kwargs["true_jaxpr"].out_avals) -def _cond_translation_rule(c, axis_env, name_stack, pred, *args, - true_jaxpr, false_jaxpr, linear, backend=None): +def _cond_translation_rule(c, axis_env, name_stack, avals, backend, + pred, *args, true_jaxpr, false_jaxpr, linear): del linear # Unused. true_ops, false_ops = split_list(args, [len(true_jaxpr.in_avals)]) @@ -1216,7 +1214,8 @@ def scan_bind(*args, forward, length, num_consts, num_carry, jaxpr, linear): ad.primitive_jvps[scan_p] = _scan_jvp ad.primitive_transposes[scan_p] = _scan_transpose pe.custom_partial_eval_rules[scan_p] = _scan_partial_eval -xla.initial_style_translations[scan_p] = xla.lower_fun(_scan_impl, initial_style=True) +xla.initial_style_translations[scan_p] = \ + xla.lower_fun_initial_style(_scan_impl) batching.primitive_batchers[scan_p] = _scan_batching_rule masking.shape_parameterized_primitive_rules[scan_p] = _scan_masking_rule @@ -1424,8 +1423,7 @@ def _root_jvp(primals, tangents, const_lengths, jaxprs): root_p.def_impl(_root_impl) root_p.def_abstract_eval(_root_abstract_eval) ad.primitive_jvps[root_p] = _root_jvp -xla.initial_style_translations[root_p] = xla.lower_fun( - _root_impl, initial_style=True) +xla.initial_style_translations[root_p] = xla.lower_fun_initial_style(_root_impl) # TODO(shoyer): write batching rule @@ -1696,7 +1694,7 @@ def _linear_solve_batching_rule(args, dims, **kwargs): linear_solve_p.def_impl(_custom_linear_solve_impl) linear_solve_p.def_abstract_eval(_linear_solve_abstract_eval) ad.primitive_jvps[linear_solve_p] = _custom_linear_solve_jvp -xla.initial_style_translations[linear_solve_p] = xla.lower_fun( - _custom_linear_solve_impl, initial_style=True) +xla.initial_style_translations[linear_solve_p] = \ + xla.lower_fun_initial_style(_custom_linear_solve_impl) ad.primitive_transposes[linear_solve_p] = _linear_solve_transpose_rule batching.primitive_batchers[linear_solve_p] = _linear_solve_batching_rule diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 529a164e6493..741fbb9a218a 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -616,7 +616,7 @@ def _lu_cpu_gpu_translation_rule(getrf_impl, c, operand): lu_p.multiple_results = True lu_p.def_impl(_lu_impl) lu_p.def_abstract_eval(_lu_abstract_eval) -xla.translations[lu_p] = xla.lower_fun(_lu_python, instantiate=True) +xla.translations[lu_p] = xla.lower_fun(_lu_python) ad.primitive_jvps[lu_p] = _lu_jvp_rule batching.primitive_batchers[lu_p] = _lu_batching_rule diff --git a/jax/random.py b/jax/random.py index 03f7d62c2448..7c61801d0282 100644 --- a/jax/random.py +++ b/jax/random.py @@ -192,9 +192,9 @@ def _broadcast(x): threefry2x32_p.def_abstract_eval(_threefry2x32_abstract_eval) batching.defbroadcasting(threefry2x32_p) xla.translations[threefry2x32_p] = xla.lower_fun( - partial(_threefry2x32_lowering, use_rolled_loops=False), instantiate=True) + partial(_threefry2x32_lowering, use_rolled_loops=False)) xla.backend_specific_translations['cpu'][threefry2x32_p] = xla.lower_fun( - partial(_threefry2x32_lowering, use_rolled_loops=True), instantiate=True) + partial(_threefry2x32_lowering, use_rolled_loops=True)) if cuda_prng: xla.backend_specific_translations['gpu'][threefry2x32_p] = \ _threefry2x32_gpu_translation_rule @@ -927,7 +927,7 @@ def _gamma_batching_rule(batched_args, batch_dims): random_gamma_p.def_impl(_gamma_impl) random_gamma_p.def_abstract_eval(lambda key, a: (abstract_arrays.raise_to_shaped(a),)) ad.defjvp2(random_gamma_p, None, lambda tangent, ans, key, a: (tangent * _gamma_grad(ans[0], a),)) -xla.translations[random_gamma_p] = xla.lower_fun(_gamma_impl, instantiate=True) +xla.translations[random_gamma_p] = xla.lower_fun(_gamma_impl) batching.primitive_batchers[random_gamma_p] = _gamma_batching_rule def gamma(key, a, shape=None, dtype=onp.float64): From e84a621184967618997e2b0018fa88979735a7cd Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 20 Feb 2020 08:04:21 -0800 Subject: [PATCH 0862/1053] new jet implementation, with conv-based rules Co-authored-by: Jesse Bettencourt Co-authored-by: David Duvenaud --- jax/api.py | 6 +++ jax/interpreters/taylor.py | 104 +++++++++++++++++++++++++++++++++++++ jax/lax/lax.py | 17 ++++++ mac.py | 7 +++ 4 files changed, 134 insertions(+) create mode 100644 jax/interpreters/taylor.py create mode 100644 mac.py diff --git a/jax/api.py b/jax/api.py index ce18cf8acd30..1f78dd55cd3b 100644 --- a/jax/api.py +++ b/jax/api.py @@ -57,6 +57,7 @@ from .interpreters import batching from .interpreters import parallel from .interpreters import masking +from .interpreters import taylor from .interpreters.masking import shapecheck, ensure_poly from .config import flags, config, bool_env @@ -2107,3 +2108,8 @@ def fun_remat(*args, **kwargs): return tree_unflatten(out_tree(), out_flat) return fun_remat remat = checkpoint + +def jet(fun, primals, series): + f = lu.wrap_init(fun) + out_primal, out_terms = taylor.jet(f).call_wrapped(primals, series) + return out_primal, out_terms diff --git a/jax/interpreters/taylor.py b/jax/interpreters/taylor.py new file mode 100644 index 000000000000..f4ce7252bbd2 --- /dev/null +++ b/jax/interpreters/taylor.py @@ -0,0 +1,104 @@ +from functools import partial +from collections import Counter + +import numpy as onp +from scipy.special import factorial as fact + +from jax import core +from jax.util import unzip2, prod +import jax.linear_util as lu + + +@lu.transformation +def jet(primals, series): + with core.new_master(JetTrace) as master: + trace = JetTrace(master, core.cur_sublevel()) + in_tracers = map(partial(JetTracer, trace), primals, series) + ans = yield in_tracers, {} + out_tracer = trace.full_raise(ans) # TODO multiple outputs + out_primal, series_out = out_tracer.primal, out_tracer.terms + yield out_primal, series_out + + +class JetTracer(core.Tracer): + __slots__ = ["primal", "terms"] + + def __init__(self, trace, primal, terms): + assert type(terms) in (ZeroSeries, list, tuple) + self._trace = trace + self.primal = primal + self.terms = terms + + @property + def aval(self): + return core.get_aval(self.primal) + + def full_lower(self): + return self # TODO symbolic zeros + +class JetTrace(core.Trace): + + def pure(self, val): + return JetTracer(self, val, zero_series) + + def lift(self, val): + return JetTracer(self, val, zero_series) + + def sublift(self, val): + return JetTracer(self, val.primal, val.terms) + + def process_primitive(self, primitive, tracers, params): + primals_in, series_in = unzip2((t.primal, t.terms) for t in tracers) + order, = {len(terms) for terms in series_in if terms is not zero_series} + series_in = [[zero_term] * order if s is zero_series else s + for s in series_in] + series_in = [[onp.zeros(onp.shape(x), dtype=onp.result_type(x)) + if t is zero_term else t for t in series] + for x, series in zip(primals_in, series_in)] + rule = prop_rules[primitive] + primal_out, terms_out = rule(primals_in, series_in, **params) + return JetTracer(self, primal_out, terms_out) + + def process_call(self, call_primitive, f, tracers, params): + assert False + + def post_process_call(self, call_primitive, out_tracer, params): + assert False + + def join(self, xt, yt): + assert False + + +class ZeroTerm(object): pass +zero_term = ZeroTerm() + +class ZeroSeries(object): pass +zero_series = ZeroSeries() + + +prop_rules = {} + +def tay_to_deriv_coeff(u_tay): + u_deriv = [ui * fact(i) for (i, ui) in enumerate(u_tay)] + return u_deriv + +def deriv_to_tay_coeff(u_deriv): + u_tay = [ui / fact(i) for (i, ui) in enumerate(u_deriv)] + return u_tay + +def taylor_tilde(u_tay): + u_tilde = [i * ui for (i, ui) in enumerate(u_tay)] + return u_tilde + +def taylor_untilde(u_tilde): + u_tay = [i * ui for (i, ui) in enumerate(u_tilde)] + return u_tay + + +def deflinear(prim): + prop_rules[prim] = partial(linear_prop, prim) + +def linear_prop(prim, primals_in, series_in, **params): + primal_out = prim.bind(*primals_in, **params) + series_out = [prim.bind(*terms_in, **params) for terms_in in zip(*series_in)] + return primal_out, series_out diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 7e9a69b255fe..c11ddaedc8a3 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -24,6 +24,7 @@ import warnings import numpy as onp +from scipy.special import factorial as fact # TODO scipy dep? from ..util import partial, prod @@ -43,6 +44,7 @@ from ..interpreters import pxla from ..interpreters import ad from ..interpreters import batching +from ..interpreters import taylor from ..interpreters import masking from ..util import curry, cache, safe_zip, unzip2, prod from ..tree_util import build_tree, tree_unflatten, tree_map @@ -1638,6 +1640,7 @@ def _brcast_to(x, shape): neg_p = standard_unop(_num, 'neg') ad.deflinear(neg_p, lambda t: [neg(t)]) +taylor.deflinear(neg_p) def _sign_translation_rule(c, x): shape = c.GetShape(x) @@ -1839,6 +1842,7 @@ def _add_transpose(t, x, y): add_p = standard_naryop([_num, _num], 'add') ad.defjvp(add_p, lambda g, x, y: _brcast(g, y), lambda g, x, y: _brcast(g, x)) ad.primitive_transposes[add_p] = _add_transpose +taylor.deflinear(add_p) def _sub_transpose(t, x, y): @@ -1854,6 +1858,19 @@ def _sub_transpose(t, x, y): mul_p = standard_naryop([_num, _num], 'mul') ad.defbilinear_broadcasting(_brcast, mul_p, mul, mul) +def prop_mul(primals_in, series_in): + x, y = primals_in + x_terms, y_terms = series_in + u = [x] + x_terms + w = [y] + y_terms + v = [None] * len(u) + def scale(k, j): return 1. / (fact(k - j) * fact(j)) + for k in range(0, len(v)): + v[k] = fact(k) * sum([scale(k, j) * u[j] * w[k-j] for j in range(0, k+1)]) + primal_out, *series_out = v + return primal_out, series_out +taylor.prop_rules[mul_p] = prop_mul + def _safe_mul_translation_rule(c, x, y): dtype = c.GetShape(x).numpy_dtype() diff --git a/mac.py b/mac.py new file mode 100644 index 000000000000..cbde8b367335 --- /dev/null +++ b/mac.py @@ -0,0 +1,7 @@ +from jax import jet + +def f(x, y): + return x + 2 * y + +out = jet(f, (1., 2.), [(1., 0.), (1., 0.)]) +print(out) From a21fdf8669437a7a052983e18112b3379b955290 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 20 Feb 2020 08:43:40 -0800 Subject: [PATCH 0863/1053] more jet rules and tests Co-authored-by: Jesse Bettencourt --- jax/lax/lax.py | 31 +++++++++++++++++-- mac.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 107 insertions(+), 4 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index c11ddaedc8a3..b005f5087dae 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1674,6 +1674,18 @@ def _sign_translation_rule(c, x): exp_p = standard_unop(_float | _complex, 'exp') ad.defjvp2(exp_p, lambda g, ans, x: _safe_mul(g, ans)) +def _exp_taylor(primals_in, series_in): + x, = primals_in + series, = series_in + u = [x] + series + v = [exp(x)] + [None] * len(series) + def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) + for k in range(1,len(v)): + v[k] = fact(k-1) * sum([scale(k, j)* v[k-j] * u[j] for j in range(1, k+1)]) + primal_out, *series_out = v + return primal_out, series_out +taylor.prop_rules[exp_p] = _exp_taylor + log_p = standard_unop(_float | _complex, 'log') ad.defjvp(log_p, lambda g, x: div(g, x)) @@ -1858,7 +1870,7 @@ def _sub_transpose(t, x, y): mul_p = standard_naryop([_num, _num], 'mul') ad.defbilinear_broadcasting(_brcast, mul_p, mul, mul) -def prop_mul(primals_in, series_in): +def _mul_taylor(primals_in, series_in): x, y = primals_in x_terms, y_terms = series_in u = [x] + x_terms @@ -1869,7 +1881,7 @@ def scale(k, j): return 1. / (fact(k - j) * fact(j)) v[k] = fact(k) * sum([scale(k, j) * u[j] * w[k-j] for j in range(0, k+1)]) primal_out, *series_out = v return primal_out, series_out -taylor.prop_rules[mul_p] = prop_mul +taylor.prop_rules[mul_p] = _mul_taylor def _safe_mul_translation_rule(c, x, y): @@ -2343,6 +2355,21 @@ def _dot_general_masking_rule(padded_vals, logical_shapes, dimension_numbers, batching.primitive_batchers[dot_general_p] = _dot_general_batch_rule masking.masking_rules[dot_general_p] = _dot_general_masking_rule +# TODO factor out a bilinear rule (mul, dot, conv, ...) +def _dot_general_taylor(primals_in, series_in, **params): + x, y = primals_in + x_terms, y_terms = series_in + u = [x] + x_terms + w = [y] + y_terms + v = [None] * len(u) + dot = partial(dot_general_p.bind, **params) + def scale(k, j): return 1. / (fact(k - j) * fact(j)) + for k in range(0, len(v)): + v[k] = fact(k) * sum([scale(k, j) * dot(u[j], w[k-j]) for j in range(0, k+1)]) + primal_out, *series_out = v + return primal_out, series_out +taylor.prop_rules[dot_general_p] = _dot_general_taylor + def _broadcast_shape_rule(operand, sizes): _check_shapelike('broadcast', 'sizes', sizes) diff --git a/mac.py b/mac.py index cbde8b367335..d4c310318121 100644 --- a/mac.py +++ b/mac.py @@ -1,7 +1,83 @@ -from jax import jet +import jax.numpy as np +from jax import jet, jvp def f(x, y): - return x + 2 * y + return x + 2 * np.exp(y) out = jet(f, (1., 2.), [(1., 0.), (1., 0.)]) print(out) + +out = jvp(f, (1., 2.), (1., 1.)) +print(out) + + +### + +from functools import reduce +import numpy.random as npr +from jax import jacobian + +from scipy.special import factorial as fact + +def jvp_taylor(f, primals, series): + def expansion(eps): + tayterms = [ + sum([eps**(i + 1) * terms[i] / fact(i + 1) for i in range(len(terms))]) + for terms in series + ] + return f(*map(sum, zip(primals, tayterms))) + + n_derivs = [] + N = len(series[0]) + 1 + for i in range(1, N): + d = repeated(jacobian, i)(expansion)(0.) + n_derivs.append(d) + return f(*primals), n_derivs + +def repeated(f, n): + def rfun(p): + return reduce(lambda x, _: f(x), range(n), p) + return rfun + +def jvp_test_jet(f, primals, series, atol=1e-5): + y, terms = jet(f, primals, series) + y_jvp, terms_jvp = jvp_taylor(f, primals, series) + # import ipdb; ipdb.set_trace() + assert np.allclose(y, y_jvp) + assert np.allclose(terms, terms_jvp, atol=atol) + +def test_exp(): + npr.seed(0) + D = 3 # dimensionality + N = 6 # differentiation order + x = npr.randn(D) + terms_in = list(npr.randn(N,D)) + jvp_test_jet(np.exp, (x,), (terms_in,), atol=1e-4) + + +def test_dot(): + D = 6 + N = 4 + x1 = npr.randn(D) + x2 = npr.randn(D) + primals = (x1, x2) + terms_in1 = list(npr.randn(N,D)) + terms_in2 = list(npr.randn(N,D)) + series_in = (terms_in1, terms_in2) + jvp_test_jet(np.dot, primals, series_in) + + + +def test_mlp(): + sigm = lambda x: 1. / (1. + np.exp(-x)) + def mlp(M1,M2,x): + return np.dot(sigm(np.dot(x,M1)),M2) + f_mlp = lambda x: mlp(M1,M2,x) + M1,M2 = (npr.randn(10,10), npr.randn(10,5)) + x= npr.randn(2,10) + terms_in = [np.ones_like(x), np.zeros_like(x), np.zeros_like(x), np.zeros_like(x)] + jvp_test_jet(f_mlp,(x,),[terms_in]) + +test_exp() +test_dot() +test_mlp() # TODO add div rule! From 7adf9fe84f5b522ee9120a7ff7763ea0708fc394 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 27 Feb 2020 08:00:34 -0800 Subject: [PATCH 0864/1053] add more jet rules! Co-authored-by: Jesse Bettencourt Co-authored-by: Jacob Kelly Co-authored-by: David Duvenaud --- jax/lax/lax.py | 26 ++++++--------------- mac.py | 63 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 61 insertions(+), 28 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index b005f5087dae..4bbfb35fe0f2 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1870,20 +1870,6 @@ def _sub_transpose(t, x, y): mul_p = standard_naryop([_num, _num], 'mul') ad.defbilinear_broadcasting(_brcast, mul_p, mul, mul) -def _mul_taylor(primals_in, series_in): - x, y = primals_in - x_terms, y_terms = series_in - u = [x] + x_terms - w = [y] + y_terms - v = [None] * len(u) - def scale(k, j): return 1. / (fact(k - j) * fact(j)) - for k in range(0, len(v)): - v[k] = fact(k) * sum([scale(k, j) * u[j] * w[k-j] for j in range(0, k+1)]) - primal_out, *series_out = v - return primal_out, series_out -taylor.prop_rules[mul_p] = _mul_taylor - - def _safe_mul_translation_rule(c, x, y): dtype = c.GetShape(x).numpy_dtype() zero = c.Constant(onp.array(0, dtype=dtype)) @@ -2355,20 +2341,21 @@ def _dot_general_masking_rule(padded_vals, logical_shapes, dimension_numbers, batching.primitive_batchers[dot_general_p] = _dot_general_batch_rule masking.masking_rules[dot_general_p] = _dot_general_masking_rule -# TODO factor out a bilinear rule (mul, dot, conv, ...) -def _dot_general_taylor(primals_in, series_in, **params): +def _bilinear_taylor_rule(prim, primals_in, series_in, **params): x, y = primals_in x_terms, y_terms = series_in u = [x] + x_terms w = [y] + y_terms v = [None] * len(u) - dot = partial(dot_general_p.bind, **params) + op = partial(prim.bind, **params) def scale(k, j): return 1. / (fact(k - j) * fact(j)) for k in range(0, len(v)): - v[k] = fact(k) * sum([scale(k, j) * dot(u[j], w[k-j]) for j in range(0, k+1)]) + v[k] = fact(k) * sum([scale(k, j) * op(u[j], w[k-j]) for j in range(0, k+1)]) primal_out, *series_out = v return primal_out, series_out -taylor.prop_rules[dot_general_p] = _dot_general_taylor +taylor.prop_rules[dot_general_p] = partial(_bilinear_taylor_rule, dot_general_p) +taylor.prop_rules[mul_p] = partial(_bilinear_taylor_rule, mul_p) +taylor.prop_rules[conv_general_dilated_p] = partial(_bilinear_taylor_rule, conv_general_dilated_p) def _broadcast_shape_rule(operand, sizes): @@ -2662,6 +2649,7 @@ def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unuse reshape_p.def_impl(_reshape_impl) ad.deflinear2(reshape_p, _reshape_transpose_rule) batching.primitive_batchers[reshape_p] = _reshape_batch_rule +taylor.deflinear(reshape_p) def _rev_shape_rule(operand, dimensions): diff --git a/mac.py b/mac.py index d4c310318121..2c454144b349 100644 --- a/mac.py +++ b/mac.py @@ -1,3 +1,5 @@ +import time + import jax.numpy as np from jax import jet, jvp @@ -40,9 +42,14 @@ def rfun(p): return rfun def jvp_test_jet(f, primals, series, atol=1e-5): + tic = time.time() y, terms = jet(f, primals, series) + print("jet done in {} sec".format(time.time() - tic)) + + tic = time.time() y_jvp, terms_jvp = jvp_taylor(f, primals, series) - # import ipdb; ipdb.set_trace() + print("jvp done in {} sec".format(time.time() - tic)) + assert np.allclose(y, y_jvp) assert np.allclose(terms, terms_jvp, atol=atol) @@ -56,18 +63,17 @@ def test_exp(): def test_dot(): - D = 6 - N = 4 - x1 = npr.randn(D) - x2 = npr.randn(D) + M, K, N = 5, 6, 7 + order = 4 + x1 = npr.randn(M, K) + x2 = npr.randn(K, N) primals = (x1, x2) - terms_in1 = list(npr.randn(N,D)) - terms_in2 = list(npr.randn(N,D)) + terms_in1 = [npr.randn(*x1.shape) for _ in range(order)] + terms_in2 = [npr.randn(*x2.shape) for _ in range(order)] series_in = (terms_in1, terms_in2) jvp_test_jet(np.dot, primals, series_in) - def test_mlp(): sigm = lambda x: 1. / (1. + np.exp(-x)) def mlp(M1,M2,x): @@ -78,6 +84,45 @@ def mlp(M1,M2,x): terms_in = [np.ones_like(x), np.zeros_like(x), np.zeros_like(x), np.zeros_like(x)] jvp_test_jet(f_mlp,(x,),[terms_in]) +def test_mul(): + D = 3 + N = 4 + x1 = npr.randn(D) + x2 = npr.randn(D) + f = lambda a, b: a * b + primals = (x1, x2) + terms_in1 = list(npr.randn(N,D)) + terms_in2 = list(npr.randn(N,D)) + series_in = (terms_in1, terms_in2) + jvp_test_jet(f, primals, series_in) + +from jax.experimental import stax +from jax import random +from jax.tree_util import tree_map + +def test_conv(): + order = 4 + input_shape = (1, 5, 5, 1) + key = random.PRNGKey(0) + init_fun, apply_fun = stax.Conv(3, (2, 2), padding='VALID') + _, (W, b) = init_fun(key, input_shape) + + x = npr.randn(*input_shape) + primals = (W, b, x) + + series_in1 = [npr.randn(*W.shape) for _ in range(order)] + series_in2 = [npr.randn(*b.shape) for _ in range(order)] + series_in3 = [npr.randn(*x.shape) for _ in range(order)] + + series_in = (series_in1, series_in2, series_in3) + + def f(W, b, x): + return apply_fun((W, b), x) + jvp_test_jet(f, primals, series_in) + + test_exp() test_dot() -test_mlp() # TODO add div rule! +test_conv() +test_mul() +# test_mlp() # TODO add div rule! From ddd52c47301d48cb65b6c7098a164b99362efa3a Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Fri, 28 Feb 2020 13:18:11 -0500 Subject: [PATCH 0865/1053] adding div and linear prims Co-authored-by: Jesse Bettencourt --- jax/interpreters/xla.py | 2 ++ jax/lax/lax.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index cc2a6c9a7055..16470e9ef883 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -37,6 +37,7 @@ from ..lib import xla_client as xc from . import partial_eval as pe from . import ad +from . import taylor from . import masking FLAGS = flags.FLAGS @@ -982,6 +983,7 @@ def _device_put_impl(x, device=None): device_put_p.def_impl(_device_put_impl) pe.custom_partial_eval_rules[device_put_p] = lambda trace, x, **params: x ad.deflinear(device_put_p, lambda cotangent, **kwargs: [cotangent]) +taylor.deflinear(device_put_p) masking.shape_rules[device_put_p] = lambda x, **_: x.shape masking.defvectorized(device_put_p) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 4bbfb35fe0f2..b1314514daec 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1779,6 +1779,7 @@ def _bessel_i1e_jvp(g, y, x): real_p = unop(_complex_basetype, _complex, 'real') ad.deflinear(real_p, lambda t: [complex(t, onp.zeros((), _dtype(t)))]) +taylor.deflinear(real_p) imag_p = unop(_complex_basetype, _complex, 'imag') ad.defjvp(imag_p, lambda g, _: real(mul(_const(g, -1j), g))) @@ -1787,6 +1788,7 @@ def _bessel_i1e_jvp(g, y, x): complex_p = naryop(_complex_dtype, [_complex_elem_types, _complex_elem_types], 'complex') ad.deflinear(complex_p, lambda t: [real(t), imag(neg(t))]) +taylor.deflinear(complex_p) conj_p = unop(_complex_dtype, _complex_elem_types | _complex, 'conj') @@ -1892,7 +1894,21 @@ def _div_transpose_rule(cotangent, x, y): ad.defjvp(div_p, lambda g, x, y: div(_brcast(g, y), y), lambda g, x, y: div(mul(neg(_brcast(g, x)), x), square(y))) + +def _div_taylor_rule(primals_in, series_in, **params): + x, y = primals_in + x_terms, y_terms = series_in + u = [x] + x_terms + w = [y] + y_terms + v = [None] * len(u) + def scale(k, j): return 1. / (fact(k - j) * fact(j)) + for k in range(0, len(v)): + conv = sum([scale(k, j) * v[j] * w[k-j] for j in range(0, k)]) + v[k] = (u[k] - fact(k) * conv) / w[0] + primal_out, *series_out = v + return primal_out, series_out ad.primitive_transposes[div_p] = _div_transpose_rule +taylor.prop_rules[div_p] = _div_taylor_rule rem_p = standard_naryop([_num, _num], 'rem') ad.defjvp(rem_p, @@ -1982,6 +1998,7 @@ def _convert_element_type_translation_rule(c, operand, new_dtype, old_dtype): ad.deflinear( convert_element_type_p, lambda t, new_dtype, old_dtype: [convert_element_type(t, old_dtype)]) +taylor.deflinear(convert_element_type_p) batching.defvectorized(convert_element_type_p) masking.defvectorized(convert_element_type_p) @@ -2371,6 +2388,7 @@ def _broadcast_batch_rule(batched_args, batch_dims, sizes): broadcast_p = standard_primitive( _broadcast_shape_rule, _input_dtype, 'broadcast') ad.deflinear(broadcast_p, lambda t, sizes: [_reduce_sum(t, range(len(sizes)))]) +taylor.deflinear(broadcast_p) batching.primitive_batchers[broadcast_p] = _broadcast_batch_rule def _broadcast_in_dim_impl(operand, shape, broadcast_dimensions): @@ -2418,6 +2436,7 @@ def _broadcast_in_dim_batch_rule(batched_args, batch_dims, shape, _broadcast_in_dim_shape_rule, _input_dtype, 'broadcast_in_dim') broadcast_in_dim_p.def_impl(_broadcast_in_dim_impl) ad.deflinear(broadcast_in_dim_p, _broadcast_in_dim_transpose_rule) +taylor.deflinear(broadcast_in_dim_p) batching.primitive_batchers[broadcast_in_dim_p] = _broadcast_in_dim_batch_rule @@ -2508,6 +2527,7 @@ def _concatenate_batch_rule(batched_args, batch_dims, dimension): _concatenate_shape_rule, _concatenate_dtype_rule, 'concatenate', _concatenate_translation_rule) ad.deflinear(concatenate_p, _concatenate_transpose_rule) +taylor.deflinear(concatenate_p) ad.primitive_transposes[concatenate_p] = _concatenate_transpose_rule batching.primitive_batchers[concatenate_p] = _concatenate_batch_rule @@ -2556,6 +2576,7 @@ def _pad_batch_rule(batched_args, batch_dims, padding_config): pad_p = standard_primitive(_pad_shape_rule, _pad_dtype_rule, 'pad') ad.deflinear(pad_p, _pad_transpose) +taylor.deflinear(pad_p) ad.primitive_transposes[pad_p] = _pad_transpose batching.primitive_batchers[pad_p] = _pad_batch_rule @@ -2648,6 +2669,7 @@ def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unuse 'reshape', _reshape_translation_rule) reshape_p.def_impl(_reshape_impl) ad.deflinear2(reshape_p, _reshape_transpose_rule) +taylor.deflinear(reshape_p) batching.primitive_batchers[reshape_p] = _reshape_batch_rule taylor.deflinear(reshape_p) @@ -2671,6 +2693,7 @@ def _rev_batch_rule(batched_args, batch_dims, dimensions): rev_p = standard_primitive(_rev_shape_rule, _input_dtype, 'rev') ad.deflinear(rev_p, lambda t, dimensions: [rev(t, dimensions)]) +taylor.deflinear(rev_p) batching.primitive_batchers[rev_p] = _rev_batch_rule @@ -2703,6 +2726,7 @@ def _transpose_batch_rule(batched_args, batch_dims, permutation): transpose_p.def_impl(_transpose_impl) ad.deflinear(transpose_p, lambda t, permutation: [transpose(t, onp.argsort(permutation))]) +taylor.deflinear(transpose_p) batching.primitive_batchers[transpose_p] = _transpose_batch_rule @@ -2861,6 +2885,7 @@ def _slice_batching_rule(batched_args, batch_dims, start_indices, limit_indices, slice_p = standard_primitive(_slice_shape_rule, _input_dtype, 'slice', _slice_translation_rule) ad.deflinear2(slice_p, _slice_transpose_rule) +taylor.deflinear(slice_p) batching.primitive_batchers[slice_p] = _slice_batching_rule @@ -3509,6 +3534,7 @@ def _reduce_sum_transpose_rule(cotangent, operand, axes): _reduce_sum_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_sum'), 'reduce_sum', _reduce_sum_translation_rule) ad.deflinear2(reduce_sum_p, _reduce_sum_transpose_rule) +taylor.deflinear(reduce_sum_p) batching.defreducer(reduce_sum_p) _masking_defreducer(reduce_sum_p, lambda shape, dtype: onp.broadcast_to(onp.array(0, dtype), shape)) @@ -3710,6 +3736,7 @@ def _reduce_window_batch_rule(reduce_window, batched_args, bdims, _reduce_window_sum_shape_rule, _input_dtype, 'reduce_window_sum', _reduce_window_sum_translation_rule) ad.deflinear2(reduce_window_sum_p, _reduce_window_sum_transpose_rule) +taylor.deflinear(reduce_window_sum_p) batching.primitive_batchers[reduce_window_sum_p] = partial( _reduce_window_batch_rule, _reduce_window_sum) @@ -4167,6 +4194,7 @@ def _tie_in_batch_rule(batched_args, batch_dims): tie_in_p.def_abstract_eval(lambda x, y: raise_to_shaped(y)) xla.translations[tie_in_p] = lambda c, x, y: y ad.deflinear(tie_in_p, _tie_in_transpose_rule) +taylor.deflinear(tie_in_p) batching.primitive_batchers[tie_in_p] = _tie_in_batch_rule masking.shape_rules[tie_in_p] = lambda x, y: y.shape masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] From 098aabefcdf25ed992de0bc5a331364cc5e227f9 Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Fri, 28 Feb 2020 20:40:47 -0500 Subject: [PATCH 0866/1053] fix typo --- jax/lax/lax.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index b1314514daec..f21557334e12 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3184,6 +3184,7 @@ def _gather_batching_rule(batched_args, batch_dims, dimension_numbers, _gather_shape_rule, _gather_dtype_rule, 'gather', _gather_translation_rule) ad.defjvp(gather_p, _gather_jvp_rule, None) + ad.primitive_transposes[gather_p] = _gather_transpose_rule batching.primitive_batchers[gather_p] = _gather_batching_rule From 3bcf02a191fdb3239cdd8125b4617efc4420d8e0 Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Fri, 28 Feb 2020 20:50:03 -0500 Subject: [PATCH 0867/1053] Add gather rule Co-authored-by: Matthew Johnson Co-authored-by: Jesse Bettencourt Co-authored-by: David Duvenaud --- jax/lax/lax.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index f21557334e12..7195a8d58f2e 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3185,6 +3185,14 @@ def _gather_batching_rule(batched_args, batch_dims, dimension_numbers, _gather_translation_rule) ad.defjvp(gather_p, _gather_jvp_rule, None) +def _gather_taylor_rule(primals_in, series_in, **params): + operand, start_indices = primals_in + gs, _ = series_in + primal_out = gather_p.bind(operand, start_indices, **params) + series_out = [gather_p.bind(g, start_indices, **params) for g in gs] + return primal_out, series_out +taylor.prop_rules[gather_p] = _gather_taylor_rule + ad.primitive_transposes[gather_p] = _gather_transpose_rule batching.primitive_batchers[gather_p] = _gather_batching_rule From dcebe5056215c9de8527ce5ec1e54ae4154c34d6 Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Sat, 29 Feb 2020 13:23:38 -0500 Subject: [PATCH 0868/1053] jet for reduce_max Co-authored-by: Matthew Johnson Co-authored-by: Jesse Bettencourt Co-authored-by: David Duvenaud --- jax/lax/lax.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 7195a8d58f2e..2d37bb6eb7eb 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3619,6 +3619,22 @@ def _reduce_chooser_jvp_rule(g, ans, operand, axes): reduce_max_p = standard_primitive(_reduce_op_shape_rule, _input_dtype, 'reduce_max', _reduce_max_translation_rule) ad.defjvp2(reduce_max_p, _reduce_chooser_jvp_rule) + +def _reduce_max_taylor_rule(primals_in, series_in, **params): + operand, = primals_in + gs, = series_in + primal_out = reduce_max_p.bind(operand, **params) + def _reduce_chooser_taylor_rule(g, ans, operand, axes): + # TODO: everything except the return statement can be factored out of the function + shape = [1 if i in axes else d for i, d in enumerate(operand.shape)] + location_indicators = convert_element_type( + _eq_meet(operand, reshape(ans, shape)), g.dtype) + counts = _reduce_sum(location_indicators, axes) + return div(_reduce_sum(mul(g, location_indicators), axes), counts) + series_out = [_reduce_chooser_taylor_rule(g, primal_out, operand, **params) for g in gs] + return primal_out, series_out +taylor.prop_rules[reduce_max_p] = _reduce_max_taylor_rule + batching.defreducer(reduce_max_p) From 30830dfc251a1d55e7bd48f2894fe3b03084d69f Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Sat, 29 Feb 2020 13:30:14 -0500 Subject: [PATCH 0869/1053] linear rule for sub Co-authored-by: Jesse Bettencourt --- jax/lax/lax.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2d37bb6eb7eb..356fe814a8b8 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1867,6 +1867,7 @@ def _sub_transpose(t, x, y): ad.defjvp(sub_p, lambda g, x, y: _brcast(g, y), lambda g, x, y: _brcast(neg(g), x)) +taylor.deflinear(sub_p) ad.primitive_transposes[sub_p] = _sub_transpose mul_p = standard_naryop([_num, _num], 'mul') From b4d003d460ee512821ee7a6bc8b64a04d6aee6f9 Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Sat, 29 Feb 2020 14:02:16 -0500 Subject: [PATCH 0870/1053] jet rule for log Co-authored-by: Jesse Bettencourt Co-authored-by: Matthew Johnson Co-authored-by: David Duvenaud --- jax/lax/lax.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 356fe814a8b8..c1669cc61f78 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1689,6 +1689,19 @@ def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) log_p = standard_unop(_float | _complex, 'log') ad.defjvp(log_p, lambda g, x: div(g, x)) +def _log_taylor(primals_in, series_in): + x, = primals_in + series, = series_in + u = [x] + series + v = [log(x)] + [None] * len(series) + def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) + for k in range(1, len(v)): + conv = sum([scale(k, j) * v[j] * u[k-j] for j in range(1, k)]) + v[k] = (u[k] - fact(k - 1) * conv) / u[0] + primal_out, *series_out = v + return primal_out, series_out +taylor.prop_rules[log_p] = _log_taylor + expm1_p = standard_unop(_float | _complex, 'expm1') ad.defjvp2(expm1_p, lambda g, ans, x: mul(g, add(ans, _one(ans)))) From 2c53b949daee1b866256f988553e7e7e91a4199a Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Sat, 29 Feb 2020 14:32:47 -0500 Subject: [PATCH 0871/1053] add tests Co-authored-by: Jesse Bettencourt Co-authored-by: Matthew Johnson Co-authored-by: David Duvenaud --- jet_nn.py | 267 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 jet_nn.py diff --git a/jet_nn.py b/jet_nn.py new file mode 100644 index 000000000000..d9d5edeb4d77 --- /dev/null +++ b/jet_nn.py @@ -0,0 +1,267 @@ +""" +Create some pared down examples to see if we can take jets through them. +""" +import time + +import haiku as hk +import jax +import jax.numpy as jnp +import numpy.random as npr + +from jax.flatten_util import ravel_pytree + +import tensorflow_datasets as tfds +from functools import reduce + +from scipy.special import factorial as fact + + +def sigmoid(z): + """ + Defined using only numpy primitives (but probably less numerically stable). + """ + return 1./(1. + jnp.exp(-z)) + +def repeated(f, n): + def rfun(p): + return reduce(lambda x, _: f(x), range(n), p) + return rfun + + +def jvp_taylor(f, primals, series): + def expansion(eps): + tayterms = [ + sum([eps**(i + 1) * terms[i] / fact(i + 1) for i in range(len(terms))]) + for terms in series + ] + return f(*map(sum, zip(primals, tayterms))) + + n_derivs = [] + N = len(series[0]) + 1 + for i in range(1, N): + d = repeated(jax.jacobian, i)(expansion)(0.) + n_derivs.append(d) + return f(*primals), n_derivs + + +def jvp_test_jet(f, primals, series, atol=1e-5): + tic = time.time() + y, terms = jax.jet(f, primals, series) + print("jet done in {} sec".format(time.time() - tic)) + + tic = time.time() + y_jvp, terms_jvp = jvp_taylor(f, primals, series) + print("jvp done in {} sec".format(time.time() - tic)) + + assert jnp.allclose(y, y_jvp) + assert jnp.allclose(terms, terms_jvp, atol=atol) + + +def softmax_cross_entropy(logits, labels): + one_hot = hk.one_hot(labels, logits.shape[-1]) + return -jnp.sum(jax.nn.log_softmax(logits) * one_hot, axis=-1) + # return -logits[labels] + + +rng = jax.random.PRNGKey(42) + +order = 4 + +batch_size = 2 +train_ds = tfds.load('mnist', split=tfds.Split.TRAIN) +train_ds = train_ds.cache().shuffle(1000).batch(batch_size) +batch = next(tfds.as_numpy(train_ds)) + + +def test_mlp_x(): + """ + Test jet through a linear layer built with Haiku wrt x. + """ + + def loss_fn(images, labels): + model = hk.Sequential([ + lambda x: x.astype(jnp.float32) / 255., + hk.Linear(10) + ]) + logits = model(images) + return jnp.mean(softmax_cross_entropy(logits, labels)) + + loss_obj = hk.transform(loss_fn) + + # flatten for MLP + batch['image'] = jnp.reshape(batch['image'], (batch_size, -1)) + images, labels = jnp.array(batch['image'], dtype=jnp.float32), jnp.array(batch['label']) + + params = loss_obj.init(rng, images, labels) + + flat_params, unravel = ravel_pytree(params) + + loss = loss_obj.apply(unravel(flat_params), images, labels) + print("forward pass works") + + f = lambda images: loss_obj.apply(unravel(flat_params), images, labels) + _ = jax.grad(f)(images) + terms_in = [npr.randn(*images.shape) for _ in range(order)] + jvp_test_jet(f, (images,), (terms_in,)) + + +def test_mlp1(): + """ + Test jet through a linear layer built with Haiku. + """ + + def loss_fn(images, labels): + model = hk.Sequential([ + lambda x: x.astype(jnp.float32) / 255., + hk.Linear(10) + ]) + logits = model(images) + return jnp.mean(softmax_cross_entropy(logits, labels)) + + loss_obj = hk.transform(loss_fn) + + # flatten for MLP + batch['image'] = jnp.reshape(batch['image'], (batch_size, -1)) + images, labels = jnp.array(batch['image'], dtype=jnp.float32), jnp.array(batch['label']) + + params = loss_obj.init(rng, images, labels) + + flat_params, unravel = ravel_pytree(params) + + loss = loss_obj.apply(unravel(flat_params), images, labels) + print("forward pass works") + + f = lambda flat_params: loss_obj.apply(unravel(flat_params), images, labels) + terms_in = [npr.randn(*flat_params.shape) for _ in range(order)] + jvp_test_jet(f, (flat_params,), (terms_in,)) + + +def test_mlp2(): + """ + Test jet through a MLP with sigmoid activations. + """ + + def loss_fn(images, labels): + model = hk.Sequential([ + lambda x: x.astype(jnp.float32) / 255., + hk.Linear(100), + sigmoid, + hk.Linear(10) + ]) + logits = model(images) + return jnp.mean(softmax_cross_entropy(logits, labels)) + + loss_obj = hk.transform(loss_fn) + + # flatten for MLP + batch['image'] = jnp.reshape(batch['image'], (batch_size, -1)) + images, labels = jnp.array(batch['image'], dtype=jnp.float32), jnp.array(batch['label']) + + params = loss_obj.init(rng, images, labels) + + flat_params, unravel = ravel_pytree(params) + + loss = loss_obj.apply(unravel(flat_params), images, labels) + print("forward pass works") + + f = lambda flat_params: loss_obj.apply(unravel(flat_params), images, labels) + terms_in = [npr.randn(*flat_params.shape) for _ in range(order)] + jvp_test_jet(f, (flat_params,), (terms_in,), atol=1e-4) + + +def test_res1(): + """ + Test jet through a simple convnet with sigmoid activations. + """ + + def loss_fn(images, labels): + model = hk.Sequential([ + lambda x: x.astype(jnp.float32) / 255., + hk.Conv2D(output_channels=10, + kernel_shape=3, + stride=2, + padding="VALID"), + sigmoid, + hk.Reshape(output_shape=(batch_size, -1)), + hk.Linear(10) + ]) + logits = model(images) + return jnp.mean(softmax_cross_entropy(logits, labels)) + + loss_obj = hk.transform(loss_fn) + + images, labels = batch['image'], batch['label'] + + params = loss_obj.init(rng, images, labels) + + flat_params, unravel = ravel_pytree(params) + + loss = loss_obj.apply(unravel(flat_params), images, labels) + print("forward pass works") + + f = lambda flat_params: loss_obj.apply(unravel(flat_params), images, labels) + terms_in = [npr.randn(*flat_params.shape) for _ in range(order)] + jvp_test_jet(f, (flat_params,), (terms_in,)) + + +def test_div(): + x = 1. + y = 5. + primals = (x, y) + order = 4 + series_in = ([npr.randn() for _ in range(order)], [npr.randn() for _ in range(order)]) + jvp_test_jet(lambda a, b: a / b, primals, series_in) + + +def test_gather(): + npr.seed(0) + D = 3 # dimensionality + N = 6 # differentiation order + x = npr.randn(D) + terms_in = list(npr.randn(N, D)) + jvp_test_jet(lambda x: x[1:], (x,), (terms_in,)) + +def test_reduce_max(): + npr.seed(0) + D1, D2 = 3, 5 # dimensionality + N = 6 # differentiation order + x = npr.randn(D1, D2) + terms_in = [npr.randn(D1, D2) for _ in range(N)] + jvp_test_jet(lambda x: x.max(axis=1), (x,), (terms_in,)) + +def test_sub(): + x = 1. + y = 5. + primals = (x, y) + order = 4 + series_in = ([npr.randn() for _ in range(order)], [npr.randn() for _ in range(order)]) + jvp_test_jet(lambda a, b: a - b, primals, series_in) + +def test_exp(): + npr.seed(0) + D1, D2 = 3, 5 # dimensionality + N = 6 # differentiation order + x = npr.randn(D1, D2) + terms_in = [npr.randn(D1, D2) for _ in range(N)] + jvp_test_jet(lambda x: jnp.exp(x), (x,), (terms_in,)) + +def test_log(): + npr.seed(0) + D1, D2 = 3, 5 # dimensionality + N = 4 # differentiation order + x = jnp.exp(npr.randn(D1, D2)) + terms_in = [jnp.exp(npr.randn(D1, D2)) for _ in range(N)] + jvp_test_jet(lambda x: jnp.log(x), (x,), (terms_in,)) + + +# test_div() +# test_gather() +# test_reduce_max() +# test_sub() +# test_exp() +# test_log() + +# test_mlp_x() +# test_mlp1() +# test_mlp2() +# test_res1() From 840797d4a17f6870a076f6173b5ecadd5c07277e Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Sat, 29 Feb 2020 14:37:20 -0500 Subject: [PATCH 0872/1053] refactor reduce_max jet rule --- jax/lax/lax.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index c1669cc61f78..0d92bfd4504f 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3638,14 +3638,15 @@ def _reduce_max_taylor_rule(primals_in, series_in, **params): operand, = primals_in gs, = series_in primal_out = reduce_max_p.bind(operand, **params) - def _reduce_chooser_taylor_rule(g, ans, operand, axes): - # TODO: everything except the return statement can be factored out of the function - shape = [1 if i in axes else d for i, d in enumerate(operand.shape)] - location_indicators = convert_element_type( - _eq_meet(operand, reshape(ans, shape)), g.dtype) - counts = _reduce_sum(location_indicators, axes) + axes = params.pop("axes", None) + primal_dtype = gs[0].dtype + shape = [1 if i in axes else d for i, d in enumerate(operand.shape)] + location_indicators = convert_element_type( + _eq_meet(operand, reshape(primal_out, shape)), primal_dtype) + counts = _reduce_sum(location_indicators, axes) + def _reduce_chooser_taylor_rule(g): return div(_reduce_sum(mul(g, location_indicators), axes), counts) - series_out = [_reduce_chooser_taylor_rule(g, primal_out, operand, **params) for g in gs] + series_out = [_reduce_chooser_taylor_rule(g) for g in gs] return primal_out, series_out taylor.prop_rules[reduce_max_p] = _reduce_max_taylor_rule From 668a1703bc8e4a4f289b25ab9867bcbe1a6167fe Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 14 Mar 2020 21:21:27 -0700 Subject: [PATCH 0873/1053] add jet tests, remove top-level files --- jax/interpreters/taylor.py | 29 +--- jax/lax/lax.py | 16 +-- jet_nn.py | 267 ------------------------------------- mac.py | 128 ------------------ tests/jet_test.py | 150 +++++++++++++++++++++ 5 files changed, 164 insertions(+), 426 deletions(-) delete mode 100644 jet_nn.py delete mode 100644 mac.py create mode 100644 tests/jet_test.py diff --git a/jax/interpreters/taylor.py b/jax/interpreters/taylor.py index f4ce7252bbd2..ff2cd9c9bf82 100644 --- a/jax/interpreters/taylor.py +++ b/jax/interpreters/taylor.py @@ -55,18 +55,18 @@ def process_primitive(self, primitive, tracers, params): series_in = [[onp.zeros(onp.shape(x), dtype=onp.result_type(x)) if t is zero_term else t for t in series] for x, series in zip(primals_in, series_in)] - rule = prop_rules[primitive] + rule = jet_rules[primitive] primal_out, terms_out = rule(primals_in, series_in, **params) return JetTracer(self, primal_out, terms_out) def process_call(self, call_primitive, f, tracers, params): - assert False + assert False # TODO def post_process_call(self, call_primitive, out_tracer, params): - assert False + assert False # TODO def join(self, xt, yt): - assert False + assert False # TODO? class ZeroTerm(object): pass @@ -76,27 +76,10 @@ class ZeroSeries(object): pass zero_series = ZeroSeries() -prop_rules = {} - -def tay_to_deriv_coeff(u_tay): - u_deriv = [ui * fact(i) for (i, ui) in enumerate(u_tay)] - return u_deriv - -def deriv_to_tay_coeff(u_deriv): - u_tay = [ui / fact(i) for (i, ui) in enumerate(u_deriv)] - return u_tay - -def taylor_tilde(u_tay): - u_tilde = [i * ui for (i, ui) in enumerate(u_tay)] - return u_tilde - -def taylor_untilde(u_tilde): - u_tay = [i * ui for (i, ui) in enumerate(u_tilde)] - return u_tay - +jet_rules = {} def deflinear(prim): - prop_rules[prim] = partial(linear_prop, prim) + jet_rules[prim] = partial(linear_prop, prim) def linear_prop(prim, primals_in, series_in, **params): primal_out = prim.bind(*primals_in, **params) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 0d92bfd4504f..a94aa4394f9a 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1684,7 +1684,7 @@ def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) v[k] = fact(k-1) * sum([scale(k, j)* v[k-j] * u[j] for j in range(1, k+1)]) primal_out, *series_out = v return primal_out, series_out -taylor.prop_rules[exp_p] = _exp_taylor +taylor.jet_rules[exp_p] = _exp_taylor log_p = standard_unop(_float | _complex, 'log') ad.defjvp(log_p, lambda g, x: div(g, x)) @@ -1700,7 +1700,7 @@ def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) v[k] = (u[k] - fact(k - 1) * conv) / u[0] primal_out, *series_out = v return primal_out, series_out -taylor.prop_rules[log_p] = _log_taylor +taylor.jet_rules[log_p] = _log_taylor expm1_p = standard_unop(_float | _complex, 'expm1') ad.defjvp2(expm1_p, lambda g, ans, x: mul(g, add(ans, _one(ans)))) @@ -1922,7 +1922,7 @@ def scale(k, j): return 1. / (fact(k - j) * fact(j)) primal_out, *series_out = v return primal_out, series_out ad.primitive_transposes[div_p] = _div_transpose_rule -taylor.prop_rules[div_p] = _div_taylor_rule +taylor.jet_rules[div_p] = _div_taylor_rule rem_p = standard_naryop([_num, _num], 'rem') ad.defjvp(rem_p, @@ -2384,9 +2384,9 @@ def scale(k, j): return 1. / (fact(k - j) * fact(j)) v[k] = fact(k) * sum([scale(k, j) * op(u[j], w[k-j]) for j in range(0, k+1)]) primal_out, *series_out = v return primal_out, series_out -taylor.prop_rules[dot_general_p] = partial(_bilinear_taylor_rule, dot_general_p) -taylor.prop_rules[mul_p] = partial(_bilinear_taylor_rule, mul_p) -taylor.prop_rules[conv_general_dilated_p] = partial(_bilinear_taylor_rule, conv_general_dilated_p) +taylor.jet_rules[dot_general_p] = partial(_bilinear_taylor_rule, dot_general_p) +taylor.jet_rules[mul_p] = partial(_bilinear_taylor_rule, mul_p) +taylor.jet_rules[conv_general_dilated_p] = partial(_bilinear_taylor_rule, conv_general_dilated_p) def _broadcast_shape_rule(operand, sizes): @@ -3205,7 +3205,7 @@ def _gather_taylor_rule(primals_in, series_in, **params): primal_out = gather_p.bind(operand, start_indices, **params) series_out = [gather_p.bind(g, start_indices, **params) for g in gs] return primal_out, series_out -taylor.prop_rules[gather_p] = _gather_taylor_rule +taylor.jet_rules[gather_p] = _gather_taylor_rule ad.primitive_transposes[gather_p] = _gather_transpose_rule batching.primitive_batchers[gather_p] = _gather_batching_rule @@ -3648,7 +3648,7 @@ def _reduce_chooser_taylor_rule(g): return div(_reduce_sum(mul(g, location_indicators), axes), counts) series_out = [_reduce_chooser_taylor_rule(g) for g in gs] return primal_out, series_out -taylor.prop_rules[reduce_max_p] = _reduce_max_taylor_rule +taylor.jet_rules[reduce_max_p] = _reduce_max_taylor_rule batching.defreducer(reduce_max_p) diff --git a/jet_nn.py b/jet_nn.py deleted file mode 100644 index d9d5edeb4d77..000000000000 --- a/jet_nn.py +++ /dev/null @@ -1,267 +0,0 @@ -""" -Create some pared down examples to see if we can take jets through them. -""" -import time - -import haiku as hk -import jax -import jax.numpy as jnp -import numpy.random as npr - -from jax.flatten_util import ravel_pytree - -import tensorflow_datasets as tfds -from functools import reduce - -from scipy.special import factorial as fact - - -def sigmoid(z): - """ - Defined using only numpy primitives (but probably less numerically stable). - """ - return 1./(1. + jnp.exp(-z)) - -def repeated(f, n): - def rfun(p): - return reduce(lambda x, _: f(x), range(n), p) - return rfun - - -def jvp_taylor(f, primals, series): - def expansion(eps): - tayterms = [ - sum([eps**(i + 1) * terms[i] / fact(i + 1) for i in range(len(terms))]) - for terms in series - ] - return f(*map(sum, zip(primals, tayterms))) - - n_derivs = [] - N = len(series[0]) + 1 - for i in range(1, N): - d = repeated(jax.jacobian, i)(expansion)(0.) - n_derivs.append(d) - return f(*primals), n_derivs - - -def jvp_test_jet(f, primals, series, atol=1e-5): - tic = time.time() - y, terms = jax.jet(f, primals, series) - print("jet done in {} sec".format(time.time() - tic)) - - tic = time.time() - y_jvp, terms_jvp = jvp_taylor(f, primals, series) - print("jvp done in {} sec".format(time.time() - tic)) - - assert jnp.allclose(y, y_jvp) - assert jnp.allclose(terms, terms_jvp, atol=atol) - - -def softmax_cross_entropy(logits, labels): - one_hot = hk.one_hot(labels, logits.shape[-1]) - return -jnp.sum(jax.nn.log_softmax(logits) * one_hot, axis=-1) - # return -logits[labels] - - -rng = jax.random.PRNGKey(42) - -order = 4 - -batch_size = 2 -train_ds = tfds.load('mnist', split=tfds.Split.TRAIN) -train_ds = train_ds.cache().shuffle(1000).batch(batch_size) -batch = next(tfds.as_numpy(train_ds)) - - -def test_mlp_x(): - """ - Test jet through a linear layer built with Haiku wrt x. - """ - - def loss_fn(images, labels): - model = hk.Sequential([ - lambda x: x.astype(jnp.float32) / 255., - hk.Linear(10) - ]) - logits = model(images) - return jnp.mean(softmax_cross_entropy(logits, labels)) - - loss_obj = hk.transform(loss_fn) - - # flatten for MLP - batch['image'] = jnp.reshape(batch['image'], (batch_size, -1)) - images, labels = jnp.array(batch['image'], dtype=jnp.float32), jnp.array(batch['label']) - - params = loss_obj.init(rng, images, labels) - - flat_params, unravel = ravel_pytree(params) - - loss = loss_obj.apply(unravel(flat_params), images, labels) - print("forward pass works") - - f = lambda images: loss_obj.apply(unravel(flat_params), images, labels) - _ = jax.grad(f)(images) - terms_in = [npr.randn(*images.shape) for _ in range(order)] - jvp_test_jet(f, (images,), (terms_in,)) - - -def test_mlp1(): - """ - Test jet through a linear layer built with Haiku. - """ - - def loss_fn(images, labels): - model = hk.Sequential([ - lambda x: x.astype(jnp.float32) / 255., - hk.Linear(10) - ]) - logits = model(images) - return jnp.mean(softmax_cross_entropy(logits, labels)) - - loss_obj = hk.transform(loss_fn) - - # flatten for MLP - batch['image'] = jnp.reshape(batch['image'], (batch_size, -1)) - images, labels = jnp.array(batch['image'], dtype=jnp.float32), jnp.array(batch['label']) - - params = loss_obj.init(rng, images, labels) - - flat_params, unravel = ravel_pytree(params) - - loss = loss_obj.apply(unravel(flat_params), images, labels) - print("forward pass works") - - f = lambda flat_params: loss_obj.apply(unravel(flat_params), images, labels) - terms_in = [npr.randn(*flat_params.shape) for _ in range(order)] - jvp_test_jet(f, (flat_params,), (terms_in,)) - - -def test_mlp2(): - """ - Test jet through a MLP with sigmoid activations. - """ - - def loss_fn(images, labels): - model = hk.Sequential([ - lambda x: x.astype(jnp.float32) / 255., - hk.Linear(100), - sigmoid, - hk.Linear(10) - ]) - logits = model(images) - return jnp.mean(softmax_cross_entropy(logits, labels)) - - loss_obj = hk.transform(loss_fn) - - # flatten for MLP - batch['image'] = jnp.reshape(batch['image'], (batch_size, -1)) - images, labels = jnp.array(batch['image'], dtype=jnp.float32), jnp.array(batch['label']) - - params = loss_obj.init(rng, images, labels) - - flat_params, unravel = ravel_pytree(params) - - loss = loss_obj.apply(unravel(flat_params), images, labels) - print("forward pass works") - - f = lambda flat_params: loss_obj.apply(unravel(flat_params), images, labels) - terms_in = [npr.randn(*flat_params.shape) for _ in range(order)] - jvp_test_jet(f, (flat_params,), (terms_in,), atol=1e-4) - - -def test_res1(): - """ - Test jet through a simple convnet with sigmoid activations. - """ - - def loss_fn(images, labels): - model = hk.Sequential([ - lambda x: x.astype(jnp.float32) / 255., - hk.Conv2D(output_channels=10, - kernel_shape=3, - stride=2, - padding="VALID"), - sigmoid, - hk.Reshape(output_shape=(batch_size, -1)), - hk.Linear(10) - ]) - logits = model(images) - return jnp.mean(softmax_cross_entropy(logits, labels)) - - loss_obj = hk.transform(loss_fn) - - images, labels = batch['image'], batch['label'] - - params = loss_obj.init(rng, images, labels) - - flat_params, unravel = ravel_pytree(params) - - loss = loss_obj.apply(unravel(flat_params), images, labels) - print("forward pass works") - - f = lambda flat_params: loss_obj.apply(unravel(flat_params), images, labels) - terms_in = [npr.randn(*flat_params.shape) for _ in range(order)] - jvp_test_jet(f, (flat_params,), (terms_in,)) - - -def test_div(): - x = 1. - y = 5. - primals = (x, y) - order = 4 - series_in = ([npr.randn() for _ in range(order)], [npr.randn() for _ in range(order)]) - jvp_test_jet(lambda a, b: a / b, primals, series_in) - - -def test_gather(): - npr.seed(0) - D = 3 # dimensionality - N = 6 # differentiation order - x = npr.randn(D) - terms_in = list(npr.randn(N, D)) - jvp_test_jet(lambda x: x[1:], (x,), (terms_in,)) - -def test_reduce_max(): - npr.seed(0) - D1, D2 = 3, 5 # dimensionality - N = 6 # differentiation order - x = npr.randn(D1, D2) - terms_in = [npr.randn(D1, D2) for _ in range(N)] - jvp_test_jet(lambda x: x.max(axis=1), (x,), (terms_in,)) - -def test_sub(): - x = 1. - y = 5. - primals = (x, y) - order = 4 - series_in = ([npr.randn() for _ in range(order)], [npr.randn() for _ in range(order)]) - jvp_test_jet(lambda a, b: a - b, primals, series_in) - -def test_exp(): - npr.seed(0) - D1, D2 = 3, 5 # dimensionality - N = 6 # differentiation order - x = npr.randn(D1, D2) - terms_in = [npr.randn(D1, D2) for _ in range(N)] - jvp_test_jet(lambda x: jnp.exp(x), (x,), (terms_in,)) - -def test_log(): - npr.seed(0) - D1, D2 = 3, 5 # dimensionality - N = 4 # differentiation order - x = jnp.exp(npr.randn(D1, D2)) - terms_in = [jnp.exp(npr.randn(D1, D2)) for _ in range(N)] - jvp_test_jet(lambda x: jnp.log(x), (x,), (terms_in,)) - - -# test_div() -# test_gather() -# test_reduce_max() -# test_sub() -# test_exp() -# test_log() - -# test_mlp_x() -# test_mlp1() -# test_mlp2() -# test_res1() diff --git a/mac.py b/mac.py deleted file mode 100644 index 2c454144b349..000000000000 --- a/mac.py +++ /dev/null @@ -1,128 +0,0 @@ -import time - -import jax.numpy as np -from jax import jet, jvp - -def f(x, y): - return x + 2 * np.exp(y) - -out = jet(f, (1., 2.), [(1., 0.), (1., 0.)]) -print(out) - -out = jvp(f, (1., 2.), (1., 1.)) -print(out) - - -### - -from functools import reduce -import numpy.random as npr -from jax import jacobian - -from scipy.special import factorial as fact - -def jvp_taylor(f, primals, series): - def expansion(eps): - tayterms = [ - sum([eps**(i + 1) * terms[i] / fact(i + 1) for i in range(len(terms))]) - for terms in series - ] - return f(*map(sum, zip(primals, tayterms))) - - n_derivs = [] - N = len(series[0]) + 1 - for i in range(1, N): - d = repeated(jacobian, i)(expansion)(0.) - n_derivs.append(d) - return f(*primals), n_derivs - -def repeated(f, n): - def rfun(p): - return reduce(lambda x, _: f(x), range(n), p) - return rfun - -def jvp_test_jet(f, primals, series, atol=1e-5): - tic = time.time() - y, terms = jet(f, primals, series) - print("jet done in {} sec".format(time.time() - tic)) - - tic = time.time() - y_jvp, terms_jvp = jvp_taylor(f, primals, series) - print("jvp done in {} sec".format(time.time() - tic)) - - assert np.allclose(y, y_jvp) - assert np.allclose(terms, terms_jvp, atol=atol) - -def test_exp(): - npr.seed(0) - D = 3 # dimensionality - N = 6 # differentiation order - x = npr.randn(D) - terms_in = list(npr.randn(N,D)) - jvp_test_jet(np.exp, (x,), (terms_in,), atol=1e-4) - - -def test_dot(): - M, K, N = 5, 6, 7 - order = 4 - x1 = npr.randn(M, K) - x2 = npr.randn(K, N) - primals = (x1, x2) - terms_in1 = [npr.randn(*x1.shape) for _ in range(order)] - terms_in2 = [npr.randn(*x2.shape) for _ in range(order)] - series_in = (terms_in1, terms_in2) - jvp_test_jet(np.dot, primals, series_in) - - -def test_mlp(): - sigm = lambda x: 1. / (1. + np.exp(-x)) - def mlp(M1,M2,x): - return np.dot(sigm(np.dot(x,M1)),M2) - f_mlp = lambda x: mlp(M1,M2,x) - M1,M2 = (npr.randn(10,10), npr.randn(10,5)) - x= npr.randn(2,10) - terms_in = [np.ones_like(x), np.zeros_like(x), np.zeros_like(x), np.zeros_like(x)] - jvp_test_jet(f_mlp,(x,),[terms_in]) - -def test_mul(): - D = 3 - N = 4 - x1 = npr.randn(D) - x2 = npr.randn(D) - f = lambda a, b: a * b - primals = (x1, x2) - terms_in1 = list(npr.randn(N,D)) - terms_in2 = list(npr.randn(N,D)) - series_in = (terms_in1, terms_in2) - jvp_test_jet(f, primals, series_in) - -from jax.experimental import stax -from jax import random -from jax.tree_util import tree_map - -def test_conv(): - order = 4 - input_shape = (1, 5, 5, 1) - key = random.PRNGKey(0) - init_fun, apply_fun = stax.Conv(3, (2, 2), padding='VALID') - _, (W, b) = init_fun(key, input_shape) - - x = npr.randn(*input_shape) - primals = (W, b, x) - - series_in1 = [npr.randn(*W.shape) for _ in range(order)] - series_in2 = [npr.randn(*b.shape) for _ in range(order)] - series_in3 = [npr.randn(*x.shape) for _ in range(order)] - - series_in = (series_in1, series_in2, series_in3) - - def f(W, b, x): - return apply_fun((W, b), x) - jvp_test_jet(f, primals, series_in) - - -test_exp() -test_dot() -test_conv() -test_mul() -# test_mlp() # TODO add div rule! diff --git a/tests/jet_test.py b/tests/jet_test.py new file mode 100644 index 000000000000..c009e3561593 --- /dev/null +++ b/tests/jet_test.py @@ -0,0 +1,150 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from functools import partial, reduce +import operator as op +from unittest import SkipTest + +from absl.testing import absltest +from absl.testing import parameterized +import numpy as onp +from scipy.special import factorial as fact + +from jax import core +from jax import test_util as jtu + +import jax.numpy as np +from jax import random +from jax import jet, jacobian, jit +from jax.experimental import stax + +from jax.config import config +config.parse_flags_with_absl() + + +def jvp_taylor(fun, primals, series): + order, = set(map(len, series)) + def composition(eps): + taylor_terms = [sum([eps ** (i+1) * terms[i] / fact(i + 1) + for i in range(len(terms))]) for terms in series] + nudged_args = [x + t for x, t in zip(primals, taylor_terms)] + return fun(*nudged_args) + primal_out = fun(*primals) + terms_out = [repeated(jacobian, i+1)(composition)(0.) for i in range(order)] + return primal_out, terms_out + +def repeated(f, n): + def rfun(p): + return reduce(lambda x, _: f(x), range(n), p) + return rfun + +class JetTest(jtu.JaxTestCase): + + def check_jet(self, fun, primals, series, atol=1e-5, rtol=1e-5): + y, terms = jet(fun, primals, series) + expected_y, expected_terms = jvp_taylor(fun, primals, series) + self.assertAllClose(y, expected_y, atol=atol, rtol=rtol, check_dtypes=True) + self.assertAllClose(terms, expected_terms, atol=atol, rtol=rtol, + check_dtypes=True) + + @jtu.skip_on_devices("tpu") + def test_exp(self): + order, dim = 4, 3 + rng = onp.random.RandomState(0) + primal_in = rng.randn(dim) + terms_in = [rng.randn(dim) for _ in range(order)] + self.check_jet(np.exp, (primal_in,), (terms_in,), atol=1e-4, rtol=1e-4) + + @jtu.skip_on_devices("tpu") + def test_log(self): + order, dim = 4, 3 + rng = onp.random.RandomState(0) + primal_in = np.exp(rng.randn(dim)) + terms_in = [rng.randn(dim) for _ in range(order)] + self.check_jet(np.log, (primal_in,), (terms_in,), atol=1e-4, rtol=1e-4) + + @jtu.skip_on_devices("tpu") + def test_dot(self): + M, K, N = 2, 3, 4 + order = 3 + rng = onp.random.RandomState(0) + x1 = rng.randn(M, K) + x2 = rng.randn(K, N) + primals = (x1, x2) + terms_in1 = [rng.randn(*x1.shape) for _ in range(order)] + terms_in2 = [rng.randn(*x2.shape) for _ in range(order)] + series_in = (terms_in1, terms_in2) + self.check_jet(np.dot, primals, series_in) + + @jtu.skip_on_devices("tpu") + def test_conv(self): + order = 3 + input_shape = (1, 5, 5, 1) + key = random.PRNGKey(0) + init_fun, apply_fun = stax.Conv(3, (2, 2), padding='VALID') + _, (W, b) = init_fun(key, input_shape) + + rng = onp.random.RandomState(0) + + x = rng.randn(*input_shape) + primals = (W, b, x) + + series_in1 = [rng.randn(*W.shape) for _ in range(order)] + series_in2 = [rng.randn(*b.shape) for _ in range(order)] + series_in3 = [rng.randn(*x.shape) for _ in range(order)] + + series_in = (series_in1, series_in2, series_in3) + + def f(W, b, x): + return apply_fun((W, b), x) + + self.check_jet(f, primals, series_in) + + @jtu.skip_on_devices("tpu") + def test_div(self): + primals = 1., 5. + order = 4 + rng = onp.random.RandomState(0) + series_in = ([rng.randn() for _ in range(order)], [rng.randn() for _ in range(order)]) + self.check_jet(op.truediv, primals, series_in) + + @jtu.skip_on_devices("tpu") + def test_sub(self): + primals = 1., 5. + order = 4 + rng = onp.random.RandomState(0) + series_in = ([rng.randn() for _ in range(order)], [rng.randn() for _ in range(order)]) + self.check_jet(op.sub, primals, series_in) + + @jtu.skip_on_devices("tpu") + def test_gather(self): + order, dim = 4, 3 + rng = onp.random.RandomState(0) + x = rng.randn(dim) + terms_in = [rng.randn(dim) for _ in range(order)] + self.check_jet(lambda x: x[1:], (x,), (terms_in,)) + + @jtu.skip_on_devices("tpu") + def test_reduce_max(self): + dim1, dim2 = 3, 5 + order = 6 + rng = onp.random.RandomState(0) + x = rng.randn(dim1, dim2) + terms_in = [rng.randn(dim1, dim2) for _ in range(order)] + self.check_jet(lambda x: x.max(axis=1), (x,), (terms_in,)) + + +if __name__ == '__main__': + absltest.main() From 92a0b3d40a271f931626865a5a0d90a34698d48a Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Mar 2020 09:58:54 -0700 Subject: [PATCH 0874/1053] add basic pytree support to jet --- jax/api.py | 29 +++++++++++++++++++++++++---- jax/interpreters/taylor.py | 12 ++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/jax/api.py b/jax/api.py index 1f78dd55cd3b..e478833bd872 100644 --- a/jax/api.py +++ b/jax/api.py @@ -43,7 +43,7 @@ flatten_fun_nokwargs2) from .tree_util import (tree_map, tree_flatten, tree_unflatten, tree_structure, tree_transpose, tree_leaves, tree_multimap, - _replace_nones) + treedef_is_leaf, _replace_nones) from .util import (unzip2, curry, partial, safe_map, safe_zip, WrapHashably, Hashable, prod, split_list, extend_name_stack, wrap_name) from .lib import xla_bridge as xb @@ -2110,6 +2110,27 @@ def fun_remat(*args, **kwargs): remat = checkpoint def jet(fun, primals, series): - f = lu.wrap_init(fun) - out_primal, out_terms = taylor.jet(f).call_wrapped(primals, series) - return out_primal, out_terms + try: + order, = set(map(len, series)) + except ValueError: + msg = "jet terms have inconsistent lengths for different arguments" + raise ValueError(msg) from None + + # TODO(mattjj): consider supporting pytree inputs + for i, (x, terms) in enumerate(zip(primals, series)): + treedef = tree_structure(x) + if not treedef_is_leaf(treedef): + raise ValueError("primal value at position {} is not an array".format(i)) + for j, t in enumerate(terms): + treedef = tree_structure(t) + if not treedef_is_leaf(treedef): + raise ValueError("term {} for argument {} is not an array".format(j, i)) + + @lu.transformation_with_aux + def flatten_fun_output(*args): + ans = yield args, {} + yield tree_flatten(ans) + + f, out_tree = flatten_fun_output(lu.wrap_init(fun)) + out_primals, out_terms = taylor.jet(f).call_wrapped(primals, series) + return tree_unflatten(out_tree(), out_primals), tree_unflatten(out_tree(), out_terms) diff --git a/jax/interpreters/taylor.py b/jax/interpreters/taylor.py index ff2cd9c9bf82..0d20ec10bbcc 100644 --- a/jax/interpreters/taylor.py +++ b/jax/interpreters/taylor.py @@ -15,9 +15,9 @@ def jet(primals, series): trace = JetTrace(master, core.cur_sublevel()) in_tracers = map(partial(JetTracer, trace), primals, series) ans = yield in_tracers, {} - out_tracer = trace.full_raise(ans) # TODO multiple outputs - out_primal, series_out = out_tracer.primal, out_tracer.terms - yield out_primal, series_out + out_tracers = map(trace.full_raise, ans) + out_primals, out_terms = unzip2((t.primal, t.terms) for t in out_tracers) + yield out_primals, out_terms class JetTracer(core.Tracer): @@ -34,7 +34,10 @@ def aval(self): return core.get_aval(self.primal) def full_lower(self): - return self # TODO symbolic zeros + if self.terms is zero_series or all(t is zero_term for t in self.terms): + return core.full_lower(self.primal) + else: + return self class JetTrace(core.Trace): @@ -52,6 +55,7 @@ def process_primitive(self, primitive, tracers, params): order, = {len(terms) for terms in series_in if terms is not zero_series} series_in = [[zero_term] * order if s is zero_series else s for s in series_in] + # TODO(mattjj): avoid always instantiating zeros series_in = [[onp.zeros(onp.shape(x), dtype=onp.result_type(x)) if t is zero_term else t for t in series] for x, series in zip(primals_in, series_in)] From a7b3be71e89e1c49efb91e9f3fe5ce42b2ae18a1 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Mar 2020 10:49:48 -0700 Subject: [PATCH 0875/1053] move jet into jax.experimental --- jax/api.py | 27 ----- jax/experimental/jet.py | 227 +++++++++++++++++++++++++++++++++++++ jax/interpreters/taylor.py | 91 --------------- jax/interpreters/xla.py | 2 - jax/lax/lax.py | 100 ---------------- tests/jet_test.py | 3 +- 6 files changed, 229 insertions(+), 221 deletions(-) create mode 100644 jax/experimental/jet.py delete mode 100644 jax/interpreters/taylor.py diff --git a/jax/api.py b/jax/api.py index e478833bd872..a28dd8a9ff36 100644 --- a/jax/api.py +++ b/jax/api.py @@ -57,7 +57,6 @@ from .interpreters import batching from .interpreters import parallel from .interpreters import masking -from .interpreters import taylor from .interpreters.masking import shapecheck, ensure_poly from .config import flags, config, bool_env @@ -2108,29 +2107,3 @@ def fun_remat(*args, **kwargs): return tree_unflatten(out_tree(), out_flat) return fun_remat remat = checkpoint - -def jet(fun, primals, series): - try: - order, = set(map(len, series)) - except ValueError: - msg = "jet terms have inconsistent lengths for different arguments" - raise ValueError(msg) from None - - # TODO(mattjj): consider supporting pytree inputs - for i, (x, terms) in enumerate(zip(primals, series)): - treedef = tree_structure(x) - if not treedef_is_leaf(treedef): - raise ValueError("primal value at position {} is not an array".format(i)) - for j, t in enumerate(terms): - treedef = tree_structure(t) - if not treedef_is_leaf(treedef): - raise ValueError("term {} for argument {} is not an array".format(j, i)) - - @lu.transformation_with_aux - def flatten_fun_output(*args): - ans = yield args, {} - yield tree_flatten(ans) - - f, out_tree = flatten_fun_output(lu.wrap_init(fun)) - out_primals, out_terms = taylor.jet(f).call_wrapped(primals, series) - return tree_unflatten(out_tree(), out_primals), tree_unflatten(out_tree(), out_terms) diff --git a/jax/experimental/jet.py b/jax/experimental/jet.py new file mode 100644 index 000000000000..5a8c9a41a5f5 --- /dev/null +++ b/jax/experimental/jet.py @@ -0,0 +1,227 @@ +from functools import partial +from collections import Counter + +import numpy as onp +from scipy.special import factorial as fact + +from jax import core +from jax.util import unzip2, prod +from jax.tree_util import (register_pytree_node, tree_structure, + treedef_is_leaf, tree_flatten, tree_unflatten) +import jax.linear_util as lu + + +def jet(fun, primals, series): + try: + order, = set(map(len, series)) + except ValueError: + msg = "jet terms have inconsistent lengths for different arguments" + raise ValueError(msg) from None + + # TODO(mattjj): consider supporting pytree inputs + for i, (x, terms) in enumerate(zip(primals, series)): + treedef = tree_structure(x) + if not treedef_is_leaf(treedef): + raise ValueError("primal value at position {} is not an array".format(i)) + for j, t in enumerate(terms): + treedef = tree_structure(t) + if not treedef_is_leaf(treedef): + raise ValueError("term {} for argument {} is not an array".format(j, i)) + + @lu.transformation_with_aux + def flatten_fun_output(*args): + ans = yield args, {} + yield tree_flatten(ans) + + f, out_tree = flatten_fun_output(lu.wrap_init(fun)) + out_primals, out_terms = jet_transform(f).call_wrapped(primals, series) + return tree_unflatten(out_tree(), out_primals), tree_unflatten(out_tree(), out_terms) + +@lu.transformation +def jet_transform(primals, series): + with core.new_master(JetTrace) as master: + trace = JetTrace(master, core.cur_sublevel()) + in_tracers = map(partial(JetTracer, trace), primals, series) + ans = yield in_tracers, {} + out_tracers = map(trace.full_raise, ans) + out_primals, out_terms = unzip2((t.primal, t.terms) for t in out_tracers) + yield out_primals, out_terms + + +class JetTracer(core.Tracer): + __slots__ = ["primal", "terms"] + + def __init__(self, trace, primal, terms): + assert type(terms) in (ZeroSeries, list, tuple) + self._trace = trace + self.primal = primal + self.terms = terms + + @property + def aval(self): + return core.get_aval(self.primal) + + def full_lower(self): + if self.terms is zero_series or all(t is zero_term for t in self.terms): + return core.full_lower(self.primal) + else: + return self + +class JetTrace(core.Trace): + + def pure(self, val): + return JetTracer(self, val, zero_series) + + def lift(self, val): + return JetTracer(self, val, zero_series) + + def sublift(self, val): + return JetTracer(self, val.primal, val.terms) + + def process_primitive(self, primitive, tracers, params): + primals_in, series_in = unzip2((t.primal, t.terms) for t in tracers) + order, = {len(terms) for terms in series_in if terms is not zero_series} + series_in = [[zero_term] * order if s is zero_series else s + for s in series_in] + # TODO(mattjj): avoid always instantiating zeros + series_in = [[onp.zeros(onp.shape(x), dtype=onp.result_type(x)) + if t is zero_term else t for t in series] + for x, series in zip(primals_in, series_in)] + rule = jet_rules[primitive] + primal_out, terms_out = rule(primals_in, series_in, **params) + return JetTracer(self, primal_out, terms_out) + + def process_call(self, call_primitive, f, tracers, params): + assert False # TODO + + def post_process_call(self, call_primitive, out_tracer, params): + assert False # TODO + + def join(self, xt, yt): + assert False # TODO? + + +class ZeroTerm(object): pass +zero_term = ZeroTerm() +register_pytree_node(ZeroTerm, lambda z: ((), None), lambda _, xs: zero_term) + +class ZeroSeries(object): pass +zero_series = ZeroSeries() +register_pytree_node(ZeroSeries, lambda z: ((), None), lambda _, xs: zero_series) + + +jet_rules = {} + +def deflinear(prim): + jet_rules[prim] = partial(linear_prop, prim) + +def linear_prop(prim, primals_in, series_in, **params): + primal_out = prim.bind(*primals_in, **params) + series_out = [prim.bind(*terms_in, **params) for terms_in in zip(*series_in)] + return primal_out, series_out + + +### rule definitions + +from jax.lax import lax + +deflinear(lax.neg_p) +deflinear(lax.real_p) +deflinear(lax.complex_p) +deflinear(lax.add_p) +deflinear(lax.sub_p) +deflinear(lax.convert_element_type_p) +deflinear(lax.broadcast_p) +deflinear(lax.broadcast_in_dim_p) +deflinear(lax.concatenate_p) +deflinear(lax.pad_p) +deflinear(lax.reshape_p) +deflinear(lax.rev_p) +deflinear(lax.transpose_p) +deflinear(lax.slice_p) +deflinear(lax.reduce_sum_p) +deflinear(lax.reduce_window_sum_p) +deflinear(lax.tie_in_p) + +def _exp_taylor(primals_in, series_in): + x, = primals_in + series, = series_in + u = [x] + series + v = [lax.exp(x)] + [None] * len(series) + def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) + for k in range(1,len(v)): + v[k] = fact(k-1) * sum([scale(k, j)* v[k-j] * u[j] for j in range(1, k+1)]) + primal_out, *series_out = v + return primal_out, series_out +jet_rules[lax.exp_p] = _exp_taylor + +def _log_taylor(primals_in, series_in): + x, = primals_in + series, = series_in + u = [x] + series + v = [lax.log(x)] + [None] * len(series) + def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) + for k in range(1, len(v)): + conv = sum([scale(k, j) * v[j] * u[k-j] for j in range(1, k)]) + v[k] = (u[k] - fact(k - 1) * conv) / u[0] + primal_out, *series_out = v + return primal_out, series_out +jet_rules[lax.log_p] = _log_taylor + +def _div_taylor_rule(primals_in, series_in, **params): + x, y = primals_in + x_terms, y_terms = series_in + u = [x] + x_terms + w = [y] + y_terms + v = [None] * len(u) + def scale(k, j): return 1. / (fact(k - j) * fact(j)) + for k in range(0, len(v)): + conv = sum([scale(k, j) * v[j] * w[k-j] for j in range(0, k)]) + v[k] = (u[k] - fact(k) * conv) / w[0] + primal_out, *series_out = v + return primal_out, series_out +jet_rules[lax.div_p] = _div_taylor_rule + +def _bilinear_taylor_rule(prim, primals_in, series_in, **params): + x, y = primals_in + x_terms, y_terms = series_in + u = [x] + x_terms + w = [y] + y_terms + v = [None] * len(u) + op = partial(prim.bind, **params) + def scale(k, j): return 1. / (fact(k - j) * fact(j)) + for k in range(0, len(v)): + v[k] = fact(k) * sum([scale(k, j) * op(u[j], w[k-j]) for j in range(0, k+1)]) + primal_out, *series_out = v + return primal_out, series_out +jet_rules[lax.dot_general_p] = partial(_bilinear_taylor_rule, lax.dot_general_p) +jet_rules[lax.mul_p] = partial(_bilinear_taylor_rule, lax.mul_p) +jet_rules[lax.conv_general_dilated_p] = partial(_bilinear_taylor_rule, lax.conv_general_dilated_p) + +def _gather_taylor_rule(primals_in, series_in, **params): + operand, start_indices = primals_in + gs, _ = series_in + primal_out = lax.gather_p.bind(operand, start_indices, **params) + series_out = [lax.gather_p.bind(g, start_indices, **params) for g in gs] + return primal_out, series_out +jet_rules[lax.gather_p] = _gather_taylor_rule + +def _reduce_max_taylor_rule(primals_in, series_in, **params): + operand, = primals_in + gs, = series_in + primal_out = lax.reduce_max_p.bind(operand, **params) + axes = params.pop("axes", None) + primal_dtype = gs[0].dtype + shape = [1 if i in axes else d for i, d in enumerate(operand.shape)] + location_indicators = lax.convert_element_type( + lax._eq_meet(operand, lax.reshape(primal_out, shape)), primal_dtype) + counts = lax._reduce_sum(location_indicators, axes) + def _reduce_chooser_taylor_rule(g): + return lax.div(lax._reduce_sum(lax.mul(g, location_indicators), axes), counts) + series_out = [_reduce_chooser_taylor_rule(g) for g in gs] + return primal_out, series_out +jet_rules[lax.reduce_max_p] = _reduce_max_taylor_rule + + +from jax.interpreters import xla +deflinear(xla.device_put_p) diff --git a/jax/interpreters/taylor.py b/jax/interpreters/taylor.py deleted file mode 100644 index 0d20ec10bbcc..000000000000 --- a/jax/interpreters/taylor.py +++ /dev/null @@ -1,91 +0,0 @@ -from functools import partial -from collections import Counter - -import numpy as onp -from scipy.special import factorial as fact - -from jax import core -from jax.util import unzip2, prod -import jax.linear_util as lu - - -@lu.transformation -def jet(primals, series): - with core.new_master(JetTrace) as master: - trace = JetTrace(master, core.cur_sublevel()) - in_tracers = map(partial(JetTracer, trace), primals, series) - ans = yield in_tracers, {} - out_tracers = map(trace.full_raise, ans) - out_primals, out_terms = unzip2((t.primal, t.terms) for t in out_tracers) - yield out_primals, out_terms - - -class JetTracer(core.Tracer): - __slots__ = ["primal", "terms"] - - def __init__(self, trace, primal, terms): - assert type(terms) in (ZeroSeries, list, tuple) - self._trace = trace - self.primal = primal - self.terms = terms - - @property - def aval(self): - return core.get_aval(self.primal) - - def full_lower(self): - if self.terms is zero_series or all(t is zero_term for t in self.terms): - return core.full_lower(self.primal) - else: - return self - -class JetTrace(core.Trace): - - def pure(self, val): - return JetTracer(self, val, zero_series) - - def lift(self, val): - return JetTracer(self, val, zero_series) - - def sublift(self, val): - return JetTracer(self, val.primal, val.terms) - - def process_primitive(self, primitive, tracers, params): - primals_in, series_in = unzip2((t.primal, t.terms) for t in tracers) - order, = {len(terms) for terms in series_in if terms is not zero_series} - series_in = [[zero_term] * order if s is zero_series else s - for s in series_in] - # TODO(mattjj): avoid always instantiating zeros - series_in = [[onp.zeros(onp.shape(x), dtype=onp.result_type(x)) - if t is zero_term else t for t in series] - for x, series in zip(primals_in, series_in)] - rule = jet_rules[primitive] - primal_out, terms_out = rule(primals_in, series_in, **params) - return JetTracer(self, primal_out, terms_out) - - def process_call(self, call_primitive, f, tracers, params): - assert False # TODO - - def post_process_call(self, call_primitive, out_tracer, params): - assert False # TODO - - def join(self, xt, yt): - assert False # TODO? - - -class ZeroTerm(object): pass -zero_term = ZeroTerm() - -class ZeroSeries(object): pass -zero_series = ZeroSeries() - - -jet_rules = {} - -def deflinear(prim): - jet_rules[prim] = partial(linear_prop, prim) - -def linear_prop(prim, primals_in, series_in, **params): - primal_out = prim.bind(*primals_in, **params) - series_out = [prim.bind(*terms_in, **params) for terms_in in zip(*series_in)] - return primal_out, series_out diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 16470e9ef883..cc2a6c9a7055 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -37,7 +37,6 @@ from ..lib import xla_client as xc from . import partial_eval as pe from . import ad -from . import taylor from . import masking FLAGS = flags.FLAGS @@ -983,7 +982,6 @@ def _device_put_impl(x, device=None): device_put_p.def_impl(_device_put_impl) pe.custom_partial_eval_rules[device_put_p] = lambda trace, x, **params: x ad.deflinear(device_put_p, lambda cotangent, **kwargs: [cotangent]) -taylor.deflinear(device_put_p) masking.shape_rules[device_put_p] = lambda x, **_: x.shape masking.defvectorized(device_put_p) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index a94aa4394f9a..70d23afd6271 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -24,7 +24,6 @@ import warnings import numpy as onp -from scipy.special import factorial as fact # TODO scipy dep? from ..util import partial, prod @@ -44,7 +43,6 @@ from ..interpreters import pxla from ..interpreters import ad from ..interpreters import batching -from ..interpreters import taylor from ..interpreters import masking from ..util import curry, cache, safe_zip, unzip2, prod from ..tree_util import build_tree, tree_unflatten, tree_map @@ -1640,7 +1638,6 @@ def _brcast_to(x, shape): neg_p = standard_unop(_num, 'neg') ad.deflinear(neg_p, lambda t: [neg(t)]) -taylor.deflinear(neg_p) def _sign_translation_rule(c, x): shape = c.GetShape(x) @@ -1674,34 +1671,9 @@ def _sign_translation_rule(c, x): exp_p = standard_unop(_float | _complex, 'exp') ad.defjvp2(exp_p, lambda g, ans, x: _safe_mul(g, ans)) -def _exp_taylor(primals_in, series_in): - x, = primals_in - series, = series_in - u = [x] + series - v = [exp(x)] + [None] * len(series) - def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) - for k in range(1,len(v)): - v[k] = fact(k-1) * sum([scale(k, j)* v[k-j] * u[j] for j in range(1, k+1)]) - primal_out, *series_out = v - return primal_out, series_out -taylor.jet_rules[exp_p] = _exp_taylor - log_p = standard_unop(_float | _complex, 'log') ad.defjvp(log_p, lambda g, x: div(g, x)) -def _log_taylor(primals_in, series_in): - x, = primals_in - series, = series_in - u = [x] + series - v = [log(x)] + [None] * len(series) - def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) - for k in range(1, len(v)): - conv = sum([scale(k, j) * v[j] * u[k-j] for j in range(1, k)]) - v[k] = (u[k] - fact(k - 1) * conv) / u[0] - primal_out, *series_out = v - return primal_out, series_out -taylor.jet_rules[log_p] = _log_taylor - expm1_p = standard_unop(_float | _complex, 'expm1') ad.defjvp2(expm1_p, lambda g, ans, x: mul(g, add(ans, _one(ans)))) @@ -1792,7 +1764,6 @@ def _bessel_i1e_jvp(g, y, x): real_p = unop(_complex_basetype, _complex, 'real') ad.deflinear(real_p, lambda t: [complex(t, onp.zeros((), _dtype(t)))]) -taylor.deflinear(real_p) imag_p = unop(_complex_basetype, _complex, 'imag') ad.defjvp(imag_p, lambda g, _: real(mul(_const(g, -1j), g))) @@ -1801,7 +1772,6 @@ def _bessel_i1e_jvp(g, y, x): complex_p = naryop(_complex_dtype, [_complex_elem_types, _complex_elem_types], 'complex') ad.deflinear(complex_p, lambda t: [real(t), imag(neg(t))]) -taylor.deflinear(complex_p) conj_p = unop(_complex_dtype, _complex_elem_types | _complex, 'conj') @@ -1869,7 +1839,6 @@ def _add_transpose(t, x, y): add_p = standard_naryop([_num, _num], 'add') ad.defjvp(add_p, lambda g, x, y: _brcast(g, y), lambda g, x, y: _brcast(g, x)) ad.primitive_transposes[add_p] = _add_transpose -taylor.deflinear(add_p) def _sub_transpose(t, x, y): @@ -1880,7 +1849,6 @@ def _sub_transpose(t, x, y): ad.defjvp(sub_p, lambda g, x, y: _brcast(g, y), lambda g, x, y: _brcast(neg(g), x)) -taylor.deflinear(sub_p) ad.primitive_transposes[sub_p] = _sub_transpose mul_p = standard_naryop([_num, _num], 'mul') @@ -1908,21 +1876,7 @@ def _div_transpose_rule(cotangent, x, y): ad.defjvp(div_p, lambda g, x, y: div(_brcast(g, y), y), lambda g, x, y: div(mul(neg(_brcast(g, x)), x), square(y))) - -def _div_taylor_rule(primals_in, series_in, **params): - x, y = primals_in - x_terms, y_terms = series_in - u = [x] + x_terms - w = [y] + y_terms - v = [None] * len(u) - def scale(k, j): return 1. / (fact(k - j) * fact(j)) - for k in range(0, len(v)): - conv = sum([scale(k, j) * v[j] * w[k-j] for j in range(0, k)]) - v[k] = (u[k] - fact(k) * conv) / w[0] - primal_out, *series_out = v - return primal_out, series_out ad.primitive_transposes[div_p] = _div_transpose_rule -taylor.jet_rules[div_p] = _div_taylor_rule rem_p = standard_naryop([_num, _num], 'rem') ad.defjvp(rem_p, @@ -2012,7 +1966,6 @@ def _convert_element_type_translation_rule(c, operand, new_dtype, old_dtype): ad.deflinear( convert_element_type_p, lambda t, new_dtype, old_dtype: [convert_element_type(t, old_dtype)]) -taylor.deflinear(convert_element_type_p) batching.defvectorized(convert_element_type_p) masking.defvectorized(convert_element_type_p) @@ -2372,22 +2325,6 @@ def _dot_general_masking_rule(padded_vals, logical_shapes, dimension_numbers, batching.primitive_batchers[dot_general_p] = _dot_general_batch_rule masking.masking_rules[dot_general_p] = _dot_general_masking_rule -def _bilinear_taylor_rule(prim, primals_in, series_in, **params): - x, y = primals_in - x_terms, y_terms = series_in - u = [x] + x_terms - w = [y] + y_terms - v = [None] * len(u) - op = partial(prim.bind, **params) - def scale(k, j): return 1. / (fact(k - j) * fact(j)) - for k in range(0, len(v)): - v[k] = fact(k) * sum([scale(k, j) * op(u[j], w[k-j]) for j in range(0, k+1)]) - primal_out, *series_out = v - return primal_out, series_out -taylor.jet_rules[dot_general_p] = partial(_bilinear_taylor_rule, dot_general_p) -taylor.jet_rules[mul_p] = partial(_bilinear_taylor_rule, mul_p) -taylor.jet_rules[conv_general_dilated_p] = partial(_bilinear_taylor_rule, conv_general_dilated_p) - def _broadcast_shape_rule(operand, sizes): _check_shapelike('broadcast', 'sizes', sizes) @@ -2402,7 +2339,6 @@ def _broadcast_batch_rule(batched_args, batch_dims, sizes): broadcast_p = standard_primitive( _broadcast_shape_rule, _input_dtype, 'broadcast') ad.deflinear(broadcast_p, lambda t, sizes: [_reduce_sum(t, range(len(sizes)))]) -taylor.deflinear(broadcast_p) batching.primitive_batchers[broadcast_p] = _broadcast_batch_rule def _broadcast_in_dim_impl(operand, shape, broadcast_dimensions): @@ -2450,7 +2386,6 @@ def _broadcast_in_dim_batch_rule(batched_args, batch_dims, shape, _broadcast_in_dim_shape_rule, _input_dtype, 'broadcast_in_dim') broadcast_in_dim_p.def_impl(_broadcast_in_dim_impl) ad.deflinear(broadcast_in_dim_p, _broadcast_in_dim_transpose_rule) -taylor.deflinear(broadcast_in_dim_p) batching.primitive_batchers[broadcast_in_dim_p] = _broadcast_in_dim_batch_rule @@ -2541,7 +2476,6 @@ def _concatenate_batch_rule(batched_args, batch_dims, dimension): _concatenate_shape_rule, _concatenate_dtype_rule, 'concatenate', _concatenate_translation_rule) ad.deflinear(concatenate_p, _concatenate_transpose_rule) -taylor.deflinear(concatenate_p) ad.primitive_transposes[concatenate_p] = _concatenate_transpose_rule batching.primitive_batchers[concatenate_p] = _concatenate_batch_rule @@ -2590,7 +2524,6 @@ def _pad_batch_rule(batched_args, batch_dims, padding_config): pad_p = standard_primitive(_pad_shape_rule, _pad_dtype_rule, 'pad') ad.deflinear(pad_p, _pad_transpose) -taylor.deflinear(pad_p) ad.primitive_transposes[pad_p] = _pad_transpose batching.primitive_batchers[pad_p] = _pad_batch_rule @@ -2683,9 +2616,7 @@ def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unuse 'reshape', _reshape_translation_rule) reshape_p.def_impl(_reshape_impl) ad.deflinear2(reshape_p, _reshape_transpose_rule) -taylor.deflinear(reshape_p) batching.primitive_batchers[reshape_p] = _reshape_batch_rule -taylor.deflinear(reshape_p) def _rev_shape_rule(operand, dimensions): @@ -2707,7 +2638,6 @@ def _rev_batch_rule(batched_args, batch_dims, dimensions): rev_p = standard_primitive(_rev_shape_rule, _input_dtype, 'rev') ad.deflinear(rev_p, lambda t, dimensions: [rev(t, dimensions)]) -taylor.deflinear(rev_p) batching.primitive_batchers[rev_p] = _rev_batch_rule @@ -2740,7 +2670,6 @@ def _transpose_batch_rule(batched_args, batch_dims, permutation): transpose_p.def_impl(_transpose_impl) ad.deflinear(transpose_p, lambda t, permutation: [transpose(t, onp.argsort(permutation))]) -taylor.deflinear(transpose_p) batching.primitive_batchers[transpose_p] = _transpose_batch_rule @@ -2899,7 +2828,6 @@ def _slice_batching_rule(batched_args, batch_dims, start_indices, limit_indices, slice_p = standard_primitive(_slice_shape_rule, _input_dtype, 'slice', _slice_translation_rule) ad.deflinear2(slice_p, _slice_transpose_rule) -taylor.deflinear(slice_p) batching.primitive_batchers[slice_p] = _slice_batching_rule @@ -3199,14 +3127,6 @@ def _gather_batching_rule(batched_args, batch_dims, dimension_numbers, _gather_translation_rule) ad.defjvp(gather_p, _gather_jvp_rule, None) -def _gather_taylor_rule(primals_in, series_in, **params): - operand, start_indices = primals_in - gs, _ = series_in - primal_out = gather_p.bind(operand, start_indices, **params) - series_out = [gather_p.bind(g, start_indices, **params) for g in gs] - return primal_out, series_out -taylor.jet_rules[gather_p] = _gather_taylor_rule - ad.primitive_transposes[gather_p] = _gather_transpose_rule batching.primitive_batchers[gather_p] = _gather_batching_rule @@ -3557,7 +3477,6 @@ def _reduce_sum_transpose_rule(cotangent, operand, axes): _reduce_sum_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_sum'), 'reduce_sum', _reduce_sum_translation_rule) ad.deflinear2(reduce_sum_p, _reduce_sum_transpose_rule) -taylor.deflinear(reduce_sum_p) batching.defreducer(reduce_sum_p) _masking_defreducer(reduce_sum_p, lambda shape, dtype: onp.broadcast_to(onp.array(0, dtype), shape)) @@ -3633,23 +3552,6 @@ def _reduce_chooser_jvp_rule(g, ans, operand, axes): reduce_max_p = standard_primitive(_reduce_op_shape_rule, _input_dtype, 'reduce_max', _reduce_max_translation_rule) ad.defjvp2(reduce_max_p, _reduce_chooser_jvp_rule) - -def _reduce_max_taylor_rule(primals_in, series_in, **params): - operand, = primals_in - gs, = series_in - primal_out = reduce_max_p.bind(operand, **params) - axes = params.pop("axes", None) - primal_dtype = gs[0].dtype - shape = [1 if i in axes else d for i, d in enumerate(operand.shape)] - location_indicators = convert_element_type( - _eq_meet(operand, reshape(primal_out, shape)), primal_dtype) - counts = _reduce_sum(location_indicators, axes) - def _reduce_chooser_taylor_rule(g): - return div(_reduce_sum(mul(g, location_indicators), axes), counts) - series_out = [_reduce_chooser_taylor_rule(g) for g in gs] - return primal_out, series_out -taylor.jet_rules[reduce_max_p] = _reduce_max_taylor_rule - batching.defreducer(reduce_max_p) @@ -3776,7 +3678,6 @@ def _reduce_window_batch_rule(reduce_window, batched_args, bdims, _reduce_window_sum_shape_rule, _input_dtype, 'reduce_window_sum', _reduce_window_sum_translation_rule) ad.deflinear2(reduce_window_sum_p, _reduce_window_sum_transpose_rule) -taylor.deflinear(reduce_window_sum_p) batching.primitive_batchers[reduce_window_sum_p] = partial( _reduce_window_batch_rule, _reduce_window_sum) @@ -4234,7 +4135,6 @@ def _tie_in_batch_rule(batched_args, batch_dims): tie_in_p.def_abstract_eval(lambda x, y: raise_to_shaped(y)) xla.translations[tie_in_p] = lambda c, x, y: y ad.deflinear(tie_in_p, _tie_in_transpose_rule) -taylor.deflinear(tie_in_p) batching.primitive_batchers[tie_in_p] = _tie_in_batch_rule masking.shape_rules[tie_in_p] = lambda x, y: y.shape masking.masking_rules[tie_in_p] = lambda vals, logical_shapes: vals[1] diff --git a/tests/jet_test.py b/tests/jet_test.py index c009e3561593..5f41db5ba1c9 100644 --- a/tests/jet_test.py +++ b/tests/jet_test.py @@ -27,8 +27,9 @@ import jax.numpy as np from jax import random -from jax import jet, jacobian, jit +from jax import jacobian, jit from jax.experimental import stax +from jax.experimental.jet import jet from jax.config import config config.parse_flags_with_absl() From ae921c7a4adebe90828166163dfa2d15ee507dda Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Mar 2020 11:15:13 -0700 Subject: [PATCH 0876/1053] update changelog --- docs/CHANGELOG.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 80e8b62a9c64..3e769599600d 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -16,12 +16,14 @@ jax 0.1.60 (unreleased) * `GitHub commits `_. * New features: - * :py:func:`jax.pmap` has ``static_broadcast_argnums`` argument which allows the user to - specify arguments that should be treated as compile-time constants and - should be broadcasted to all devices. It works analogously to + * :py:func:`jax.pmap` has ``static_broadcast_argnums`` argument which allows + the user to specify arguments that should be treated as compile-time + constants and should be broadcasted to all devices. It works analogously to ``static_argnums`` in :py:func:`jax.jit`. * Improved error messages for when tracers are mistakenly saved in global state. * Added :py:func:`jax.nn.one_hot` utility function. + * Added :py:module:`jax.experimental.jet` for exponentially faster + higher-order automatic differentiation. * The minimum jaxlib version is now 0.1.40. jaxlib 0.1.40 (March 4, 2020) From 8d402d83da8ca68d7937ee01726fec74d5abb4f7 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Mar 2020 11:39:44 -0700 Subject: [PATCH 0877/1053] add copyright notice to jet.py --- jax/experimental/jet.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/jax/experimental/jet.py b/jax/experimental/jet.py index 5a8c9a41a5f5..8aa517b53d8c 100644 --- a/jax/experimental/jet.py +++ b/jax/experimental/jet.py @@ -1,3 +1,18 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + from functools import partial from collections import Counter From a00e3986d4c2c73e49f4517a8518cf1b7b424535 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Mar 2020 12:00:44 -0700 Subject: [PATCH 0878/1053] remove scipy dep, fix dtype issue --- jax/experimental/jet.py | 4 +++- tests/jet_test.py | 21 +++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/jax/experimental/jet.py b/jax/experimental/jet.py index 8aa517b53d8c..f4cd4004048f 100644 --- a/jax/experimental/jet.py +++ b/jax/experimental/jet.py @@ -17,7 +17,6 @@ from collections import Counter import numpy as onp -from scipy.special import factorial as fact from jax import core from jax.util import unzip2, prod @@ -140,6 +139,9 @@ def linear_prop(prim, primals_in, series_in, **params): from jax.lax import lax +def fact(n): + return lax.exp(lax.lgamma(n+1.)) + deflinear(lax.neg_p) deflinear(lax.real_p) deflinear(lax.complex_p) diff --git a/tests/jet_test.py b/tests/jet_test.py index 5f41db5ba1c9..b6374786d63b 100644 --- a/tests/jet_test.py +++ b/tests/jet_test.py @@ -20,7 +20,6 @@ from absl.testing import absltest from absl.testing import parameterized import numpy as onp -from scipy.special import factorial as fact from jax import core from jax import test_util as jtu @@ -29,7 +28,7 @@ from jax import random from jax import jacobian, jit from jax.experimental import stax -from jax.experimental.jet import jet +from jax.experimental.jet import jet, fact from jax.config import config config.parse_flags_with_absl() @@ -53,12 +52,14 @@ def rfun(p): class JetTest(jtu.JaxTestCase): - def check_jet(self, fun, primals, series, atol=1e-5, rtol=1e-5): + def check_jet(self, fun, primals, series, atol=1e-5, rtol=1e-5, + check_dtypes=True): y, terms = jet(fun, primals, series) expected_y, expected_terms = jvp_taylor(fun, primals, series) - self.assertAllClose(y, expected_y, atol=atol, rtol=rtol, check_dtypes=True) + self.assertAllClose(y, expected_y, atol=atol, rtol=rtol, + check_dtypes=check_dtypes) self.assertAllClose(terms, expected_terms, atol=atol, rtol=rtol, - check_dtypes=True) + check_dtypes=check_dtypes) @jtu.skip_on_devices("tpu") def test_exp(self): @@ -99,19 +100,19 @@ def test_conv(self): rng = onp.random.RandomState(0) - x = rng.randn(*input_shape) + x = rng.randn(*input_shape).astype("float32") primals = (W, b, x) - series_in1 = [rng.randn(*W.shape) for _ in range(order)] - series_in2 = [rng.randn(*b.shape) for _ in range(order)] - series_in3 = [rng.randn(*x.shape) for _ in range(order)] + series_in1 = [rng.randn(*W.shape).astype("float32") for _ in range(order)] + series_in2 = [rng.randn(*b.shape).astype("float32") for _ in range(order)] + series_in3 = [rng.randn(*x.shape).astype("float32") for _ in range(order)] series_in = (series_in1, series_in2, series_in3) def f(W, b, x): return apply_fun((W, b), x) - self.check_jet(f, primals, series_in) + self.check_jet(f, primals, series_in, check_dtypes=False) @jtu.skip_on_devices("tpu") def test_div(self): From 94832f9627dfd0f9b2f38f68f3373dc81107fe0b Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Sun, 15 Mar 2020 20:29:11 -0700 Subject: [PATCH 0879/1053] add lax.broadcast_in_dim shape check and test Operand dimensions must equal their corresponding dimensions in the broadcast shape. --- jax/lax/lax.py | 7 +++++++ tests/lax_test.py | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 7e9a69b255fe..93ffd7233a5c 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2367,6 +2367,13 @@ def _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions): msg = ('broadcast_in_dim broadcast_dimensions must be a subset of output ' 'dimensions, got {} for operand ndim {} and shape {}.') raise TypeError(msg.format(broadcast_dimensions, operand.ndim, shape)) + if any(operand.shape[i] != shape[broadcast_dimensions[i]] + for i in range(operand.ndim)): + msg = ('broadcast_in_dim operand dimension sizes must equal their ' + 'corresponding dimensions in the broadcasted-to shape; got ' + 'operand of shape {}, target broadcast shape {}, ' + 'broadcast_dimensions {} ') + raise TypeError(msg.format(operand.shape, shape, broadcast_dimensions)) return shape def _broadcast_in_dim_transpose_rule(t, shape, broadcast_dimensions): diff --git a/tests/lax_test.py b/tests/lax_test.py index 8faef6a504b7..e1124164773d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -831,6 +831,17 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, rng_factory): op = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) self._CompileAndCheck(op, args_maker, check_dtypes=True) + def testBroadcastInDimShapeCheck(self): + rng = jtu.rand_default() + x = rng((6, 7), onp.float32) + def op(x): + lax.broadcast_in_dim(x, broadcast_dimensions=(1, 2), shape=(3, 4, 5)) + self.assertRaisesRegex( + TypeError, + ("broadcast_in_dim operand dimension sizes must equal their " + "corresponding dimensions in the broadcasted-to shape;*"), + lambda: op(x)) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_bcdims={}".format( jtu.format_shape_dtype_string(inshape, dtype), From 7666c254f99717081283d3c9d0859f5ed451f127 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 15 Mar 2020 21:32:56 -0700 Subject: [PATCH 0880/1053] fix buggy broadcast_in_dim shapecheck test --- tests/masking_test.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/masking_test.py b/tests/masking_test.py index 6ff0aec54e7d..ade6323b0ff6 100644 --- a/tests/masking_test.py +++ b/tests/masking_test.py @@ -149,11 +149,17 @@ def d_put(x): return api.device_put(x) def test_shapecheck_broadcast_in_dim(self): + x = np.zeros(7) + + @shapecheck(['(n,)'], '(3, n, 4)') + def broadcast_in_dim(x): + return lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1,)) + x = np.zeros((7, 1)) - lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) - @shapecheck(['(n, 1)'], '(3, n, 4)') + + @shapecheck(['(n, 1)'], '(3, n, 4, 1)') def broadcast_in_dim(x): - return lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4), broadcast_dimensions=(1, 2)) + return lax.broadcast_in_dim(x, shape=(3, x.shape[0], 4, x.shape[1]), broadcast_dimensions=(1, 3)) def test_shapecheck_jit(self): @shapecheck(['n'], '2*n') From 196fddbb99f39e83450c0392369808a930a76b36 Mon Sep 17 00:00:00 2001 From: Matteo Hessel Date: Mon, 16 Mar 2020 11:12:04 +0000 Subject: [PATCH 0881/1053] Make gradient clipping by norm more numerically safe --- jax/experimental/optix.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jax/experimental/optix.py b/jax/experimental/optix.py index 112d8d4b4256..b7a7e0a4db4e 100644 --- a/jax/experimental/optix.py +++ b/jax/experimental/optix.py @@ -83,7 +83,6 @@ def update_fn(updates, state): def global_norm(items): return jnp.sqrt(jnp.sum([jnp.sum(x**2) for x in tree_leaves(items)])) -_global_norm = global_norm # TODO(mtthss): remove when google code updated def clip_by_global_norm(max_norm): @@ -106,7 +105,7 @@ def update_fn(updates, state): g_norm = global_norm(updates) trigger = g_norm < max_norm updates = tree_multimap( - lambda t: jnp.where(trigger, t, t * (max_norm / g_norm)), updates) + lambda t: jnp.where(trigger, t, (t / g_norm) * max_norm), updates) return updates, state return InitUpdate(init_fn, update_fn) From 219d503e713e5bf01cef7fab42c22ce79e31fa89 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 16 Mar 2020 11:01:08 -0400 Subject: [PATCH 0882/1053] Don't show progress bar in build script if output is not a terminal. (#2429) --- build/build.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/build.py b/build/build.py index 1d225e525c8b..34cc2de4b0f7 100755 --- a/build/build.py +++ b/build/build.py @@ -107,7 +107,8 @@ def progress(block_count, block_size, total_size): package.file, "#" * progress_chars, "." * (num_chars - progress_chars), int(progress * 100.0))) - tmp_path, _ = urlretrieve(uri, None, progress) + tmp_path, _ = urlretrieve(uri, None, + progress if sys.stdout.isatty() else None) sys.stdout.write("\n") # Verify that the downloaded Bazel binary has the expected SHA256. From 388e78f8e5fce236af572050d0cbf0431129f17f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 16 Mar 2020 11:24:02 -0400 Subject: [PATCH 0883/1053] Increment jaxlib version to 0.1.41. (#2428) Update XLA. --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbcd20fc26b6..848ee13f43ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "9699d5c26fdeb8d57b701b7edb1dd1c127849765f7880d767b0ae8c06c38d601", - strip_prefix = "tensorflow-ca8d8fbf7bba22415b675a5cb88b7393bfaadf1f", + sha256 = "f547378a36495762f294a47707e54db5322b2d920a8fb947d95a186bc35f2603", + strip_prefix = "tensorflow-cd2466610c5dda695f95ab85fd6211c9e30d835b", urls = [ - "https://github.com/tensorflow/tensorflow/archive/ca8d8fbf7bba22415b675a5cb88b7393bfaadf1f.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/cd2466610c5dda695f95ab85fd6211c9e30d835b.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index a8da27b3f95c..18c4971702d0 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.40" +__version__ = "0.1.41" From 1c202ac3c4d83b889c54765752470a5589278f19 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Mar 2020 09:20:34 -0700 Subject: [PATCH 0884/1053] fix typo, unbreak pmap (from #2416) --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index cc2a6c9a7055..e5fcacb20c1d 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -55,7 +55,7 @@ def identity(x): return x def _make_unit(c): return c.Constant(onp.zeros((), dtype=onp.dtype('bool'))) def _make_abstract_unit(_): return xc.Shape.array_shape(onp.dtype('bool'), ()) def _device_put_unit(_, device): - return xc.Buffer.from_pyval(onp.zeros((), dtype=onp.dtype('bool')), + return xc.Buffer.from_pyval(onp.zeros((), dtype=onp.dtype('bool')), device, backend=xb.get_device_backend(device)) From 5280793191f391bfb3f97617796ddfda4a3d4e48 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Mar 2020 10:23:24 -0700 Subject: [PATCH 0885/1053] fix custom_transforms + jit bug from #2416 --- jax/api.py | 4 ++-- jax/interpreters/xla.py | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/jax/api.py b/jax/api.py index a28dd8a9ff36..f3937f75b787 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1559,8 +1559,8 @@ def fun_abstract_eval(*avals, **params): fun_p.def_abstract_eval(fun_abstract_eval) def fun_translation(c, *xla_args, **params): - return xla.lower_fun(fun_impl)(c, *xla_args, **params) - xla.translations[fun_p] = fun_translation + return xla.lower_fun(fun_impl, translation_with_avals=True)(c, *xla_args, **params) + xla.translations_with_avals[fun_p] = fun_translation return CustomTransformsFunction(fun, fun_p) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index e5fcacb20c1d..dfbe22d66936 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -225,8 +225,9 @@ def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params) rule = backend_specific_translations[platform][prim] rule(c, *xla_args, **params) elif prim in translations: - rule = translations[prim] - rule(c, *xla_args, **params) + translations[prim](c, *xla_args, **params) + elif prim in translations_with_avals: + translations_with_avals[prim](c, avals, *xla_args, **params) elif prim in initial_style_translations: rule = initial_style_translations[prim] rule(c, axis_env, extend_name_stack(prim.name), avals, backend, @@ -332,6 +333,9 @@ def write(v, node): ans = rule(c, *in_nodes, **eqn.params) elif eqn.primitive in translations: ans = translations[eqn.primitive](c, *in_nodes, **eqn.params) + elif eqn.primitive in translations_with_avals: + ans = translations_with_avals[eqn.primitive](c, map(aval, eqn.invars), + *in_nodes, **eqn.params) elif eqn.primitive in initial_style_translations: new_params = check_backend_params(eqn.params, backend) rule = initial_style_translations[eqn.primitive] @@ -629,6 +633,7 @@ def _xla_call_translation_rule(c, axis_env, ### translation tables translations = {} +translations_with_avals = {} # TODO(mattjj): unify with above table parallel_translations = {} initial_style_translations = {} call_translations = {} @@ -650,7 +655,7 @@ def add_jaxvals_translation_rule(c, x, y): return c.Add(x, y) translations[ad_util.add_jaxvals_p] = add_jaxvals_translation_rule -def lower_fun(fun): +def lower_fun(fun, translation_with_avals=False): # This function can only be used to lower functions that take JAX array types # as arguments (and e.g. don't accept unit values), because it assumes it can # map from XLA types to JAX types. In general that mapping is not possible (as @@ -658,9 +663,13 @@ def lower_fun(fun): # least we assume that the mapping from JAX *array* types to XLA array types # is invertible. This assumption is unchecked! # TODO(mattjj): remove assumption can map XLA array types to JAX array types - def f(c, *xla_args, **params): + def f(c, *args, **params): # TODO(mattjj): revise this 'calling convention' - avals = [_array_aval_from_xla_shape(c.GetShape(x)) for x in xla_args] + if translation_with_avals: + avals, *xla_args = args + else: + xla_args = args + avals = [_array_aval_from_xla_shape(c.GetShape(x)) for x in xla_args] pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, params), pvals, instantiate=True) From efaedf4b5751ec109c8f7492d929d372bae0d88e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Mar 2020 12:13:25 -0700 Subject: [PATCH 0886/1053] undo previous commit --- jax/api.py | 4 ++-- jax/interpreters/xla.py | 19 +++++-------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/jax/api.py b/jax/api.py index f3937f75b787..a28dd8a9ff36 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1559,8 +1559,8 @@ def fun_abstract_eval(*avals, **params): fun_p.def_abstract_eval(fun_abstract_eval) def fun_translation(c, *xla_args, **params): - return xla.lower_fun(fun_impl, translation_with_avals=True)(c, *xla_args, **params) - xla.translations_with_avals[fun_p] = fun_translation + return xla.lower_fun(fun_impl)(c, *xla_args, **params) + xla.translations[fun_p] = fun_translation return CustomTransformsFunction(fun, fun_p) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index dfbe22d66936..e5fcacb20c1d 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -225,9 +225,8 @@ def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params) rule = backend_specific_translations[platform][prim] rule(c, *xla_args, **params) elif prim in translations: - translations[prim](c, *xla_args, **params) - elif prim in translations_with_avals: - translations_with_avals[prim](c, avals, *xla_args, **params) + rule = translations[prim] + rule(c, *xla_args, **params) elif prim in initial_style_translations: rule = initial_style_translations[prim] rule(c, axis_env, extend_name_stack(prim.name), avals, backend, @@ -333,9 +332,6 @@ def write(v, node): ans = rule(c, *in_nodes, **eqn.params) elif eqn.primitive in translations: ans = translations[eqn.primitive](c, *in_nodes, **eqn.params) - elif eqn.primitive in translations_with_avals: - ans = translations_with_avals[eqn.primitive](c, map(aval, eqn.invars), - *in_nodes, **eqn.params) elif eqn.primitive in initial_style_translations: new_params = check_backend_params(eqn.params, backend) rule = initial_style_translations[eqn.primitive] @@ -633,7 +629,6 @@ def _xla_call_translation_rule(c, axis_env, ### translation tables translations = {} -translations_with_avals = {} # TODO(mattjj): unify with above table parallel_translations = {} initial_style_translations = {} call_translations = {} @@ -655,7 +650,7 @@ def add_jaxvals_translation_rule(c, x, y): return c.Add(x, y) translations[ad_util.add_jaxvals_p] = add_jaxvals_translation_rule -def lower_fun(fun, translation_with_avals=False): +def lower_fun(fun): # This function can only be used to lower functions that take JAX array types # as arguments (and e.g. don't accept unit values), because it assumes it can # map from XLA types to JAX types. In general that mapping is not possible (as @@ -663,13 +658,9 @@ def lower_fun(fun, translation_with_avals=False): # least we assume that the mapping from JAX *array* types to XLA array types # is invertible. This assumption is unchecked! # TODO(mattjj): remove assumption can map XLA array types to JAX array types - def f(c, *args, **params): + def f(c, *xla_args, **params): # TODO(mattjj): revise this 'calling convention' - if translation_with_avals: - avals, *xla_args = args - else: - xla_args = args - avals = [_array_aval_from_xla_shape(c.GetShape(x)) for x in xla_args] + avals = [_array_aval_from_xla_shape(c.GetShape(x)) for x in xla_args] pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( lu.wrap_init(fun, params), pvals, instantiate=True) From ed8dbd254deee8f11f77e50ad6e70e2696fead51 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 16 Mar 2020 12:17:09 -0700 Subject: [PATCH 0887/1053] temporarily switch off #2414 changes --- jax/lax/lax_control_flow.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index df55fddd9b6d..191a79aee228 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -154,7 +154,7 @@ def fori_loop(lower, upper, body_fun, init_val): except TypeError: use_scan = False else: - use_scan = True + use_scan = False # TODO(mattjj): re-enable this if use_scan: (_, _, result), _ = scan(_fori_scan_body_fun(body_fun), @@ -1209,7 +1209,8 @@ def scan_bind(*args, forward, length, num_consts, num_carry, jaxpr, linear): scan_p = core.Primitive("scan") scan_p.multiple_results = True scan_p.def_custom_bind(scan_bind) -scan_p.def_impl(partial(xla.apply_primitive, scan_p)) +scan_p.def_impl(_scan_impl) +# scan_p.def_impl(partial(xla.apply_primitive, scan_p)) # TODO(mattjj): re-enable scan_p.def_abstract_eval(_scan_abstract_eval) ad.primitive_jvps[scan_p] = _scan_jvp ad.primitive_transposes[scan_p] = _scan_transpose From ec9513fa2992b1d31c96c8a65c565d202ff0069d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 16 Mar 2020 16:10:26 -0400 Subject: [PATCH 0888/1053] Advertise jaxlib 0.1.41. (#2432) Bump minimum jaxlib version to 0.1.41. --- .travis.yml | 2 +- README.md | 4 ++-- jax/lib/__init__.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index cbb265733817..abc5960f3260 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ install: # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. - - pip install jaxlib==0.1.40 + - pip install jaxlib==0.1.41 - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then diff --git a/README.md b/README.md index a9fc2d59c20b..24910221c399 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,7 @@ PYTHON_VERSION=cp37 # alternatives: cp35, cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda92, cuda100, cuda101, cuda102 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.40-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.41-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` @@ -436,7 +436,7 @@ more. To try automatic detection of the correct version for your system, you can run: ```bash -pip install --upgrade https://storage.googleapis.com/jax-releases/`nvcc -V | sed -En "s/.* release ([0-9]*)\.([0-9]*),.*/cuda\1\2/p"`/jaxlib-0.1.40-`python3 -V | sed -En "s/Python ([0-9]*)\.([0-9]*).*/cp\1\2/p"`-none-linux_x86_64.whl jax +pip install --upgrade https://storage.googleapis.com/jax-releases/`nvcc -V | sed -En "s/.* release ([0-9]*)\.([0-9]*),.*/cuda\1\2/p"`/jaxlib-0.1.41-`python3 -V | sed -En "s/Python ([0-9]*)\.([0-9]*).*/cp\1\2/p"`-none-linux_x86_64.whl jax ``` Please let us know on [the issue tracker](https://github.com/google/jax/issues) diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index ecf0daa4841f..4670d86c9b87 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 40) +_minimum_jaxlib_version = (0, 1, 41) try: from jaxlib import version as jaxlib_version except Exception as err: From 5cf82c756e6a9acf9102499e9f6d44d24c533c73 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 16 Mar 2020 09:54:58 +0100 Subject: [PATCH 0889/1053] Improved argument checking for lax.broadcast_in_dim * Added checking that the output shape has higher or equal rank to input * Added checking that the broadcast_dims are sorted (required by XLA) * Relaxed check that operand dimension size can be 1 * Added lax.broadcast_in_dim docstring --- jax/lax/lax.py | 33 ++++++++++++++++++++++----------- jax/lax_reference.py | 7 ++++--- tests/lax_test.py | 33 ++++++++++++++++++++++++--------- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 73f415de0efa..edcc51eb5aab 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -615,6 +615,11 @@ def broadcast(operand, sizes): return broadcast_in_dim(operand, tuple(sizes) + onp.shape(operand), dims) def broadcast_in_dim(operand, shape, broadcast_dimensions): + """Wraps XLA's `BroadcastInDim + `_ + operator. + """ + shape = _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions) if onp.ndim(operand) == len(shape) and not len(broadcast_dimensions): return operand return broadcast_in_dim_p.bind( @@ -2355,25 +2360,31 @@ def _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions): _check_shapelike('broadcast_in_dim', 'shape', shape) _check_shapelike('broadcast_in_dim', 'broadcast_dimensions', broadcast_dimensions) - if any(x >= len(shape) for x in broadcast_dimensions): - msg = ("broadcast_in_dim broadcast dimensions must be less than " - "ndim(shape), got {} for shape {}.") - raise ValueError(msg.format(broadcast_dimensions, shape)) if operand.ndim != len(broadcast_dimensions): msg = ('broadcast_in_dim broadcast_dimensions must have length equal to ' - 'operand ndim, got broadcast_dimensions {} for operand ndim {}.') + 'operand ndim; got broadcast_dimensions {} for operand ndim {}.') raise TypeError(msg.format(broadcast_dimensions, operand.ndim)) + if len(shape) < operand.ndim: + msg = ('broadcast_in_dim target broadcast shape must have equal or higher rank ' + 'to the operand shape; got operand ndim {} and target broadcast ndim {}.') + raise TypeError(msg.format(operand.ndim, len(shape))) if not set(broadcast_dimensions).issubset(set(range(len(shape)))): msg = ('broadcast_in_dim broadcast_dimensions must be a subset of output ' 'dimensions, got {} for operand ndim {} and shape {}.') raise TypeError(msg.format(broadcast_dimensions, operand.ndim, shape)) - if any(operand.shape[i] != shape[broadcast_dimensions[i]] + if any(operand.shape[i] != 1 and operand.shape[i] != shape[broadcast_dimensions[i]] for i in range(operand.ndim)): - msg = ('broadcast_in_dim operand dimension sizes must equal their ' - 'corresponding dimensions in the broadcasted-to shape; got ' - 'operand of shape {}, target broadcast shape {}, ' - 'broadcast_dimensions {} ') - raise TypeError(msg.format(operand.shape, shape, broadcast_dimensions)) + msg = ('broadcast_in_dim operand dimension sizes must either be 1, or be ' + 'equal to their corresponding dimensions in the target broadcast shape; ' + 'got operand of shape {}, target broadcast shape {}, ' + 'broadcast_dimensions {} ') + raise TypeError(msg.format(operand.shape, shape, broadcast_dimensions)) + if (len(broadcast_dimensions) != len(set(broadcast_dimensions)) or + tuple(broadcast_dimensions) != tuple(sorted(broadcast_dimensions))): + msg = ('broadcast_in_dim broadcast_dimensions must be strictly increasing; ' + 'got broadcast_dimensions {}') + raise TypeError(msg.format(broadcast_dimensions)) + return shape def _broadcast_in_dim_transpose_rule(t, shape, broadcast_dimensions): diff --git a/jax/lax_reference.py b/jax/lax_reference.py index bc4783374b9e..d244eb0d399e 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -188,9 +188,10 @@ def broadcast(operand, sizes): return onp.broadcast_to(operand, sizes + onp.shape(operand)) def broadcast_in_dim(operand, shape, broadcast_dimensions): - inshape = tuple(1 if i not in broadcast_dimensions else d - for i, d in enumerate(shape)) - return onp.broadcast_to(onp.reshape(operand, inshape), shape) + in_reshape = onp.ones(len(shape), dtype=onp.int32) + for i, bd in enumerate(broadcast_dimensions): + in_reshape[bd] = operand.shape[i] + return onp.broadcast_to(onp.reshape(operand, in_reshape), shape) sum = onp.sum diff --git a/tests/lax_test.py b/tests/lax_test.py index e1124164773d..cc3a993b183a 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -822,6 +822,7 @@ def testBroadcastAgainstNumpy(self, shape, dtype, broadcast_sizes, rng_factory): ([2], [2, 2], [1]), ([2], [2, 3], [0]), ([], [2, 3], []), + ([1], [2, 3], [1]), ] for dtype in default_dtypes for rng_factory in [jtu.rand_default])) @@ -831,16 +832,29 @@ def testBroadcastInDim(self, inshape, dtype, outshape, dimensions, rng_factory): op = lambda x: lax.broadcast_in_dim(x, outshape, dimensions) self._CompileAndCheck(op, args_maker, check_dtypes=True) - def testBroadcastInDimShapeCheck(self): + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_inshape={}_outshape={}_bcdims={}".format( + jtu.format_shape_dtype_string(inshape, onp.float32), + outshape, broadcast_dimensions), + "inshape": inshape, "outshape": outshape, + "broadcast_dimensions": broadcast_dimensions, "err_msg": err_msg} + for inshape, outshape, broadcast_dimensions, err_msg in [ + ([2], [2, 2], [0, 1], ('broadcast_dimensions must have length equal to ' + 'operand ndim')), + ([2, 2], [2], [0, 1], ('target broadcast shape must have equal or higher rank ' + 'to the operand shape')), + ([2], [2, 3], [2], ('broadcast_in_dim broadcast_dimensions must be a subset of output ' + 'dimensions')), + ([2], [3], [0], ('operand dimension sizes must either be 1, or be ' + 'equal to their corresponding dimensions in the target broadcast shape')), + ([2, 2], [2, 2], [1, 0], ('broadcast_dimensions must be strictly increasing')), + ])) + def testBroadcastInDimShapeCheck(self, inshape, outshape, broadcast_dimensions, err_msg): rng = jtu.rand_default() - x = rng((6, 7), onp.float32) - def op(x): - lax.broadcast_in_dim(x, broadcast_dimensions=(1, 2), shape=(3, 4, 5)) - self.assertRaisesRegex( - TypeError, - ("broadcast_in_dim operand dimension sizes must equal their " - "corresponding dimensions in the broadcasted-to shape;*"), - lambda: op(x)) + x = rng(inshape, onp.float32) + with self.assertRaisesRegex(TypeError, err_msg): + lax.broadcast_in_dim(x, shape=outshape, broadcast_dimensions=broadcast_dimensions) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_outshape={}_bcdims={}".format( @@ -853,6 +867,7 @@ def op(x): ([2], [2, 2], [1]), ([2], [2, 3], [0]), ([], [2, 3], []), + ([1], [2, 3], [1]), ] for dtype in default_dtypes for rng_factory in [jtu.rand_default])) From 3362591c796a6c0ef58d9522ebbaddf711629237 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 16 Mar 2020 10:00:48 +0100 Subject: [PATCH 0890/1053] Updated CHANGELOG --- docs/CHANGELOG.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 3e769599600d..79f63ba748d8 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -24,6 +24,8 @@ jax 0.1.60 (unreleased) * Added :py:func:`jax.nn.one_hot` utility function. * Added :py:module:`jax.experimental.jet` for exponentially faster higher-order automatic differentiation. + * Added more sanity checking to arguments of :py:func:`jax.lax.broadcast_in_dim`. + * The minimum jaxlib version is now 0.1.40. jaxlib 0.1.40 (March 4, 2020) From 0ddc2ec360b9683f5c123a419984938e2f80df7b Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 16 Mar 2020 10:59:25 +0100 Subject: [PATCH 0891/1053] Fixed failing tests --- jax/lax/lax.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index edcc51eb5aab..2389b7c5fac2 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -2360,20 +2360,21 @@ def _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions): _check_shapelike('broadcast_in_dim', 'shape', shape) _check_shapelike('broadcast_in_dim', 'broadcast_dimensions', broadcast_dimensions) - if operand.ndim != len(broadcast_dimensions): + operand_ndim = onp.ndim(operand) + if operand_ndim != len(broadcast_dimensions): msg = ('broadcast_in_dim broadcast_dimensions must have length equal to ' 'operand ndim; got broadcast_dimensions {} for operand ndim {}.') - raise TypeError(msg.format(broadcast_dimensions, operand.ndim)) - if len(shape) < operand.ndim: + raise TypeError(msg.format(broadcast_dimensions, operand_ndim)) + if len(shape) < operand_ndim: msg = ('broadcast_in_dim target broadcast shape must have equal or higher rank ' 'to the operand shape; got operand ndim {} and target broadcast ndim {}.') - raise TypeError(msg.format(operand.ndim, len(shape))) + raise TypeError(msg.format(operand_ndim, len(shape))) if not set(broadcast_dimensions).issubset(set(range(len(shape)))): msg = ('broadcast_in_dim broadcast_dimensions must be a subset of output ' 'dimensions, got {} for operand ndim {} and shape {}.') - raise TypeError(msg.format(broadcast_dimensions, operand.ndim, shape)) + raise TypeError(msg.format(broadcast_dimensions, operand_ndim, shape)) if any(operand.shape[i] != 1 and operand.shape[i] != shape[broadcast_dimensions[i]] - for i in range(operand.ndim)): + for i in range(operand_ndim)): msg = ('broadcast_in_dim operand dimension sizes must either be 1, or be ' 'equal to their corresponding dimensions in the target broadcast shape; ' 'got operand of shape {}, target broadcast shape {}, ' From 5f2d2254a0ce61d3bf6e0d474d9888278485b937 Mon Sep 17 00:00:00 2001 From: jheek Date: Tue, 17 Mar 2020 07:45:17 +0100 Subject: [PATCH 0892/1053] Fix typo in ShapeDtypeStruct (#2253) * fix ShapeDtypeSTruct dtype bug * move dtype conversion to constructor --- jax/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/api.py b/jax/api.py index a28dd8a9ff36..907e03015960 100644 --- a/jax/api.py +++ b/jax/api.py @@ -2006,7 +2006,7 @@ class ShapeDtypeStruct(object): __slots__ = ["shape", "dtype"] def __init__(self, shape, dtype): self.shape = shape - self.dtype = dtype + self.dtype = onp.dtype(dtype) size = property(lambda self: onp.prod(self.shape)) ndim = property(lambda self: len(self.shape)) @@ -2019,7 +2019,7 @@ def __len__(self): def __repr__(self): return "{}(shape={}, dtype={})".format( - type(self).__name__, self.shape, self.dtype.dtype.name) + type(self).__name__, self.shape, self.dtype.name) __str__ = __repr__ From e66e5699474bd1fbffe1f7ded1a95a78d2727d6a Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 17 Mar 2020 09:07:14 +0100 Subject: [PATCH 0893/1053] Minor update to docsl trigger readthedocs (#2433) --- docs/CHANGELOG.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 79f63ba748d8..c33ee45ba3a6 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -26,10 +26,10 @@ jax 0.1.60 (unreleased) higher-order automatic differentiation. * Added more sanity checking to arguments of :py:func:`jax.lax.broadcast_in_dim`. -* The minimum jaxlib version is now 0.1.40. +* The minimum jaxlib version is now 0.1.41. jaxlib 0.1.40 (March 4, 2020) --------------------------------- +------------------------------ * Adds experimental support in Jaxlib for TensorFlow profiler, which allows tracing of CPU and GPU computations from TensorBoard. From c4c770b7fc3b8d8f199e2b037d02a5b79e944175 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 17 Mar 2020 09:24:17 +0100 Subject: [PATCH 0894/1053] Minor update to docs; trigger readthedocs (#2434) --- docs/CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index c33ee45ba3a6..fb4e05513183 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -29,7 +29,7 @@ jax 0.1.60 (unreleased) * The minimum jaxlib version is now 0.1.41. jaxlib 0.1.40 (March 4, 2020) ------------------------------- +------------------------------- * Adds experimental support in Jaxlib for TensorFlow profiler, which allows tracing of CPU and GPU computations from TensorBoard. From 6b157ff91cd9b0030e62b43e857fcecc32cfdf8b Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Mar 2020 10:04:17 -0400 Subject: [PATCH 0895/1053] Update jax version to 0.1.60. (#2437) --- docs/CHANGELOG.rst | 2 +- jax/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index fb4e05513183..da0e407ef6bc 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -8,7 +8,7 @@ Change Log These are the release notes for JAX. -jax 0.1.60 (unreleased) +jax 0.1.60 (March 17, 2020) ----------------------- .. PLEASE REMEMBER TO CHANGE THE '..master' WITH AN ACTUAL TAG in GITHUB LINK. diff --git a/jax/version.py b/jax/version.py index 8ea3905de59c..5dbabb1e3e78 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.59" +__version__ = "0.1.60" From 985d5f73279acfa45261e3e2f8c754bdc3c8b1fc Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Mar 2020 17:01:04 -0400 Subject: [PATCH 0896/1053] Fix Python 3.5 support. (#2439) * Fix Python 3.5 compatibility problems. --- .travis.yml | 9 ++++----- jax/api.py | 8 ++++---- jax/core.py | 4 ++-- jax/numpy/vectorize.py | 3 +-- tests/api_test.py | 3 +++ tests/lax_numpy_test.py | 8 ++++---- 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index abc5960f3260..edf80f4526ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,13 +3,12 @@ notifications: email: false dist: xenial language: python -python: - - "3.6" -env: - - JAX_ENABLE_X64=0 JAX_NUM_GENERATED_CASES=25 - - JAX_ENABLE_X64=1 JAX_NUM_GENERATED_CASES=25 matrix: include: + - python: "3.6" + env: JAX_ENABLE_X64=0 JAX_NUM_GENERATED_CASES=25 + - python: "3.6" + env: JAX_ENABLE_X64=1 JAX_NUM_GENERATED_CASES=25 - python: "3.7" env: JAX_ENABLE_X64=1 JAX_ONLY_DOCUMENTATION=true diff --git a/jax/api.py b/jax/api.py index 907e03015960..3245af49becf 100644 --- a/jax/api.py +++ b/jax/api.py @@ -28,7 +28,7 @@ import functools import itertools as it import threading -from typing import Any, Callable, Collection, Optional, Sequence, Tuple, Union +from typing import Any, Callable, Iterable, Optional, Sequence, Tuple, Union from warnings import warn import numpy as onp @@ -81,7 +81,7 @@ def __init__(self): _thread_local_state = _ThreadLocalState() -def jit(fun: Callable, static_argnums: Union[int, Collection[int]] = (), +def jit(fun: Callable, static_argnums: Union[int, Iterable[int]] = (), device=None, backend: Optional[str] = None): """Sets up `fun` for just-in-time compilation with XLA. @@ -197,7 +197,7 @@ def disable_jit(): def xla_computation(fun: Callable, - static_argnums: Union[int, Collection[int]] = (), + static_argnums: Union[int, Iterable[int]] = (), axis_env: Optional[Sequence[Tuple[AxisName, int]]] = None, backend: Optional[str] = None, tuple_args: bool = False, @@ -737,7 +737,7 @@ def _flatten_axes(treedef, axis_tree): def pmap(fun: Callable, axis_name: Optional[AxisName] = None, - static_broadcasted_argnums: Union[int, Collection[int]] = (), + static_broadcasted_argnums: Union[int, Iterable[int]] = (), devices=None, backend: Optional[str] = None, axis_size: Optional[int] = None): """Parallel map with support for collectives. diff --git a/jax/core.py b/jax/core.py index 947383cb582d..8cc0d6240d2e 100644 --- a/jax/core.py +++ b/jax/core.py @@ -88,8 +88,8 @@ def __init__(self, jaxpr, literals, in_avals, out_avals): out_avals_raised = [raise_to_shaped(v) for v in out_avals] exp_in_avals = [v.aval for v in jaxpr.invars] exp_out_avals = [v.aval for v in jaxpr.outvars] - assert in_avals_raised == exp_in_avals, f"expected: {exp_in_avals}, got: {in_avals_raised}" - assert out_avals_raised == exp_out_avals, f"expected: {exp_out_avals}, got: {out_avals_raised}" + assert in_avals_raised == exp_in_avals, "expected: {}, got: {}".format(exp_in_avals, in_avals_raised) + assert out_avals_raised == exp_out_avals, "expected: {}, got: {}".format(exp_out_avals, out_avals_raised) self.jaxpr = jaxpr self.literals = list(literals) diff --git a/jax/numpy/vectorize.py b/jax/numpy/vectorize.py index f2278b3c6ecd..2ae454bb8c48 100644 --- a/jax/numpy/vectorize.py +++ b/jax/numpy/vectorize.py @@ -62,8 +62,7 @@ def _update_dim_sizes( shape: Tuple[int, ...], core_dims: CoreDims, error_context: str = "", - *, - is_input: bool, + is_input: bool = False, ): """Incrementally check and update core dimension sizes for a single argument. diff --git a/tests/api_test.py b/tests/api_test.py index 5231ab5af881..e9112ea2deaf 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -18,6 +18,7 @@ import copy from functools import partial import re +import sys import unittest import warnings import weakref @@ -1884,6 +1885,8 @@ def f(x): in e } """, str(jaxpr)) + @unittest.skipIf((sys.version_info.major, sys.version_info.minor) <= (3, 5), + "Test fails on Python 3.5") def testExamplesJaxprDoc(self): """Tests examples included in the Understanding JAXPRs doc (docs/jaxpr.rst).""" from jax import numpy as jnp diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index c30dd10b8496..05cca1a8f185 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -567,7 +567,7 @@ def testBitwiseOp(self, onp_op, jnp_op, rng_factory, shapes, dtypes): "axis": axis, "keepdims": keepdims, "inexact": rec.inexact} for shape in rec.shapes for dtype in rec.dtypes for out_dtype in [None] + rec.dtypes - for axis in set(range(-len(shape), len(shape))) | set([None]) + for axis in list(range(-len(shape), len(shape))) + [None] for keepdims in [False, True]) for rec in JAX_REDUCER_RECORDS)) def testReducer(self, onp_op, jnp_op, rng_factory, shape, dtype, out_dtype, @@ -599,7 +599,7 @@ def onp_fun(x): "axis": axis, "keepdims": keepdims, "inexact": rec.inexact} for rec in JAX_REDUCER_NO_DTYPE_RECORDS for shape in rec.shapes for dtype in rec.dtypes - for axis in set(range(-len(shape), len(shape))) | set([None]) + for axis in list(range(-len(shape), len(shape))) + [None] for keepdims in [False, True])) def testReducerNoDtype(self, onp_op, jnp_op, rng_factory, shape, dtype, axis, keepdims, inexact): @@ -616,7 +616,7 @@ def testReducerNoDtype(self, onp_op, jnp_op, rng_factory, shape, dtype, axis, jtu.format_shape_dtype_string(shape, dtype), axis), "shape": shape, "dtype": dtype, "axis": axis} for shape in all_shapes for dtype in all_dtypes - for axis in set(range(-len(shape), len(shape))) | set([None]))) + for axis in list(range(-len(shape), len(shape))) + [None])) def testCountNonzero(self, shape, dtype, axis): rng = jtu.rand_some_zero() onp_fun = lambda x: onp.count_nonzero(x, axis) @@ -1484,7 +1484,7 @@ def testSqueeze(self, arg_shape, dtype, ax, rng_factory): "rng_factory": jtu.rand_default, "shape": shape, "dtype": dtype, "axis": axis, "weights_shape": weights_shape, "returned": returned} for shape, dtype in _shape_and_dtypes(nonempty_shapes, number_dtypes) - for axis in set(range(-len(shape), len(shape))) | set([None]) + for axis in list(range(-len(shape), len(shape))) + [None] # `weights_shape` is either `None`, same as the averaged axis, or same as # that of the input for weights_shape in ([None, shape] if axis is None or len(shape) == 1 From e46a002ead497fcd5db73971d2626bd65ecda78d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Mar 2020 17:02:22 -0400 Subject: [PATCH 0897/1053] Remove runtime tuple use from JAX. (#2441) Change in preparation for upcoming runtime changes related to buffer aliasing. --- jax/interpreters/pxla.py | 19 +++++++-------- jax/interpreters/sharded_jit.py | 5 ++-- jax/interpreters/xla.py | 42 ++++++++++++--------------------- tests/api_test.py | 19 ++------------- 4 files changed, 29 insertions(+), 56 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 2fea4921ad91..dd9804e341d2 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -45,7 +45,7 @@ def identity(x): return x -def shard_args(backend, devices, assignments, axis_size, tuple_args, args): +def shard_args(backend, devices, assignments, axis_size, args): """Shard each argument data array along its leading axis. Args: @@ -96,10 +96,6 @@ def shard_args(backend, devices, assignments, axis_size, tuple_args, args): for r, buf in enumerate(bufs): buffers[r][a] = buf - if tuple_args: - buffers = [[xla.make_tuple(bufs, devices[r], backend)] - for r, bufs in enumerate(buffers)] - return buffers @@ -546,11 +542,12 @@ def dynamic_fun(dummy, *args): handle_args = partial(shard_args, backend, compiled.local_devices(), assign_shards_to_replicas(num_local_replicas, axis_size), - axis_size, tuple_args) + axis_size) handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, out_pvals, compiled.local_devices(), backend) - return partial(execute_replicated, compiled, backend, handle_args, handle_outs) + return partial(execute_replicated, compiled, backend, handle_args, handle_outs, + tuple_args) multi_host_supported_collectives = set() @@ -564,7 +561,7 @@ def _pvals_to_results_handler(size, nrep, out_pvals, devices, backend): def handler(out_bufs): buffers = [[result_to_populate] * nrep for _ in range(nouts)] for r, tuple_buf in enumerate(out_bufs): - for i, buf in enumerate(tuple_buf.destructure()): + for i, buf in enumerate(tuple_buf): buffers[i][r] = buf assert not any(buf is result_to_populate for bufs in buffers for buf in bufs) @@ -631,9 +628,11 @@ def _pval_to_result_handler(axis_size, nrep, pval, devices, backend): else: return aval_to_result_handler(axis_size, nrep, pv) -def execute_replicated(compiled, backend, in_handler, out_handler, *args): +def execute_replicated(compiled, backend, in_handler, out_handler, tuple_args, + *args): input_bufs = in_handler(args) - out_bufs = compiled.ExecuteOnLocalDevices(list(input_bufs)) + out_bufs = compiled.ExecuteOnLocalDevices( + list(input_bufs), tuple_arguments=tuple_args) return out_handler(out_bufs) diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index bd6e2b32c2f0..752b7775be05 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -86,7 +86,7 @@ def handler(out_bufs): buffers = [[[None] * npar for _ in range(nrep)] for _ in range(nouts)] for raw_idx, tuple_buf in enumerate(out_bufs): r, p = onp.unravel_index(raw_idx, (nrep, npar)) - for i, buf in enumerate(tuple_buf.destructure()): + for i, buf in enumerate(tuple_buf): buffers[i][r][p] = buf return [h(bufs) for h, bufs in zip(handlers, buffers)] @@ -202,7 +202,8 @@ def _sharded_jit_translation_rule(c, axis_env, freevar_nodes, def _execute_spatially_partitioned(compiled, in_handler, out_handler, *args): input_bufs = in_handler(args) - out_bufs = compiled.ExecuteOnLocalDevices(list(input_bufs)) + out_bufs = compiled.ExecuteOnLocalDevices( + list(input_bufs), tuple_arguments=False) return out_handler(out_bufs) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index e5fcacb20c1d..143a1119181f 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -175,7 +175,7 @@ def xla_primitive_callable(prim, *arg_specs, **params): handle_result = aval_to_result_handler(device, aval_out) else: handlers = tuple(map(partial(aval_to_result_handler, device), aval_out)) - handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs.destructure())) + handle_result = lambda xs: tuple(h(x) for h, x in zip(handlers, xs)) tuple_args = len(avals) > 100 if prim in initial_style_translations: nreps = initial_style_primitive_replicas(params) @@ -249,30 +249,23 @@ def _execute_compiled_primitive(prim, compiled, backend, tuple_args, result_handler, *args): device, = compiled.local_devices() input_bufs = [device_put(x, device) for x in args if x is not token] - if tuple_args: - input_bufs = [make_tuple(input_bufs, device, backend)] - out_buf = compiled.Execute(input_bufs) + out_bufs = compiled.Execute(input_bufs, tuple_arguments=tuple_args) if FLAGS.jax_debug_nans: - check_nans(prim, out_buf.destructure() if prim.multiple_results else out_buf) - return result_handler(out_buf) + check_nans(prim, out_bufs) + return result_handler(out_bufs if prim.multiple_results else out_bufs[0]) def _execute_replicated_primitive(prim, compiled, backend, tuple_args, result_handler, *args): input_bufs = [ [device_put(x, device) for x in args if x is not token] for device in compiled.local_devices()] - if tuple_args: - input_bufs = [[make_tuple(bufs, device, backend)] for bufs, device in - zip(input_bufs, compiled.local_devices())] - out_buf = compiled.ExecuteOnLocalDevices(input_bufs)[0] + out_buf = compiled.ExecuteOnLocalDevices( + input_bufs, tuple_arguments=tuple_args)[0][0] return result_handler(out_buf) def check_nans(prim, bufs): - if prim.multiple_results: - for buf in bufs: - _check_nans(prim.name, buf.shape(), buf) - else: - _check_nans(prim.name, bufs.shape(), bufs) + for buf in bufs: + _check_nans(prim.name, buf.shape(), buf) def _check_nans(name, xla_shape, buf): assert not xla_shape.is_tuple() @@ -564,9 +557,7 @@ def _pval_to_result_handler(device, pval): def _execute_compiled(compiled, backend, handlers, tuple_args, *args): device, = compiled.local_devices() input_bufs = [device_put(x, device) for x in args if x is not token] - if tuple_args: - input_bufs = [make_tuple(input_bufs, device, backend)] - out_bufs = compiled.Execute(input_bufs).destructure() + out_bufs = compiled.Execute(input_bufs, tuple_arguments=tuple_args) if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] @@ -574,10 +565,8 @@ def _execute_replicated(compiled, backend, handlers, tuple_args, *args): input_bufs = [ [device_put(x, device) for x in args if x is not token] for device in compiled.local_devices()] - if tuple_args: - input_bufs = [[make_tuple(bufs, device, backend)] for bufs, device in - zip(input_bufs, compiled.local_devices())] - out_bufs = compiled.ExecuteOnLocalDevices(input_bufs)[0].destructure() + out_bufs = compiled.ExecuteOnLocalDevices( + input_bufs, tuple_arguments=tuple_args)[0] if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] @@ -590,9 +579,6 @@ def _execute_trivial(jaxpr, device, consts, handlers, *args): return [_copy_device_array_to_device(x, device) if type(x) is DeviceArray else h(device_put(x, device)) for h, x in zip(handlers, outs)] -def make_tuple(bufs, device, backend): - return xb.get_backend(backend).make_tuple(bufs, device) - @memoize def _get_device(device, backend): # TODO(mattjj): after jaxlib update, avoid compile here, just to get device @@ -960,9 +946,11 @@ def _lazy_force_computation(sticky, aval, device, lexpr): result_device = device if sticky else None handler = partial(DeviceArray, aval, result_device, lazy.array(aval.shape)) if lazy.is_constant(lexpr): - force_fun = lambda _: handler(compiled.Execute([])) + def force_fun(_): + return handler(compiled.Execute([], tuple_arguments=False)[0]) else: - force_fun = lambda x: handler(compiled.Execute([x.device_buffer])) + def force_fun(x): + return handler(compiled.Execute([x.device_buffer], tuple_arguments=False)[0]) return force_fun diff --git a/tests/api_test.py b/tests/api_test.py index e9112ea2deaf..5d4b3262f45a 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -117,27 +117,12 @@ def f(x, y, z): f(1, 2, z=onp.zeros(3)) # doesn't crash - def test_jit_many_args_tuples(self): + def test_jit_with_many_args_works(self): @jit def f(args_list): return sum(args_list) - make_tuple = xla.make_tuple - - counts = [0] - def make_tuple_and_count(*args, **kwargs): - counts[0] += 1 - return make_tuple(*args, **kwargs) - - try: - xla.make_tuple = make_tuple_and_count - ans = f(list(range(500))) - finally: - xla.make_tuple = make_tuple - - expected = sum(range(500)) - self.assertEqual(counts[0], 1) # formed a tuple on dispatch - self.assertEqual(ans, expected) # computed the correct result + self.assertEqual(f(list(range(500))), sum(range(500))) def test_grad_of_jit(self): side = [] From 84140ea52593be9ce1c7d7653f4f907bfde8d23d Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Tue, 17 Mar 2020 21:02:41 +0000 Subject: [PATCH 0898/1053] Ensure jax.host_ids() returns a stable ordering (#2442) ...in this case, by sorting them. --- jax/lib/xla_bridge.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index f54eb0f3100d..1d8fe76bcf14 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -232,8 +232,8 @@ def host_id(backend=None): def host_ids(backend=None): - """Returns a list of all host IDs.""" - return list(set(d.host_id for d in devices(backend))) + """Returns a sorted list of all host IDs.""" + return sorted(list(set(d.host_id for d in devices(backend)))) def host_count(backend=None): From db8bea4cc60d91ed93382e73868fe53364f2b624 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Mar 2020 17:09:05 -0400 Subject: [PATCH 0899/1053] Update changelog for jax 0.1.61 release. (#2443) --- docs/CHANGELOG.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index da0e407ef6bc..8adadcfa4a87 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -5,13 +5,18 @@ Change Log Remember to leave an empty line before the start of an itemized list, and to align the itemized text with the first line of an item. +.. PLEASE REMEMBER TO CHANGE THE '..master' WITH AN ACTUAL TAG in GITHUB LINK. + These are the release notes for JAX. +jax 0.1.61 (March 17, 2020) +--------------------------- -jax 0.1.60 (March 17, 2020) ------------------------ +* Fixes Python 3.5 support. This will be the last JAX or jaxlib release that + supports Python 3.5. -.. PLEASE REMEMBER TO CHANGE THE '..master' WITH AN ACTUAL TAG in GITHUB LINK. +jax 0.1.60 (March 17, 2020) +--------------------------- * `GitHub commits `_. * New features: From 75813f462a9252e837eb3f9b76383e0bf719d312 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 17 Mar 2020 17:15:59 -0400 Subject: [PATCH 0900/1053] Update jax version number. (#2444) --- jax/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/version.py b/jax/version.py index 5dbabb1e3e78..a974fb2a89d5 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.60" +__version__ = "0.1.61" From 75077a14414124c13decc65c4ab1c1ac74174b81 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 17 Mar 2020 14:31:25 -0700 Subject: [PATCH 0901/1053] Add pmap_benchmark.py (#2409) Example output: ``` $ TARGET_TOTAL_SECS=2 CUDA_VISIBLE_DEVICES= XLA_FLAGS=--xla_force_host_platform_device_count=500 python3 benchmarks/pmap_benchmark.py 2020-03-12 15:46:35.903121: E external/org_tensorflow/tensorflow/stream_executor/cuda/cuda_driver.cc:313] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected /usr/local/google/home/skyewm/jax/jax/lib/xla_bridge.py:122: UserWarning: No GPU/TPU found, falling back to CPU. warnings.warn('No GPU/TPU found, falling back to CPU.') ---------Benchmark results for pmap_shard_args_nargs=10_nshards=4--------- mean=0.034490 std=0.002890 %std=8.378140 total=2.000426 #iters=58 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=100_nshards=4--------- mean=0.091495 std=0.005935 %std=6.486871 total=2.012888 #iters=22 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=101_nshards=4--------- mean=0.113549 std=0.009080 %std=7.996712 total=2.043878 #iters=18 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=500_nshards=4--------- mean=0.356868 std=0.007960 %std=2.230518 total=2.141210 #iters=6 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=10_nshards=2--------- mean=0.022288 std=0.002946 %std=13.219607 total=2.005951 #iters=90 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=10_nshards=4--------- mean=0.035210 std=0.002024 %std=5.747389 total=2.006975 #iters=57 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=10_nshards=8--------- mean=0.048641 std=0.001578 %std=3.243398 total=2.042912 #iters=42 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=10_nshards=100--------- mean=0.257487 std=0.007190 %std=2.792452 total=2.059900 #iters=8 #warmup=1 ---------Benchmark results for pmap_shard_args_nargs=10_nshards=500--------- mean=1.696294 std=0.005097 %std=0.300473 total=3.392588 #iters=2 #warmup=1 ---------Benchmark summary for pmap_shard_args--------- nargs nshards mean %std relative ------- --------- --------- --------- ---------- 10 4 0.0344901 8.37814 1 100 4 0.0914949 6.48687 2.65279 101 4 0.113549 7.99671 3.29221 500 4 0.356868 2.23052 10.347 10 2 0.0222883 13.2196 0.646224 10 4 0.0352101 5.74739 1.02088 10 8 0.0486408 3.2434 1.41028 10 100 0.257487 2.79245 7.46555 10 500 1.69629 0.300473 49.182 ---------Benchmark results for pmap_shard_outputs_nouts=10_nshards=4--------- mean=0.061780 std=0.004737 %std=7.668032 total=2.038743 #iters=33 #warmup=1 ---------Benchmark results for pmap_shard_outputs_nouts=100_nshards=4--------- mean=0.123264 std=0.005980 %std=4.851385 total=2.095494 #iters=17 #warmup=1 ---------Benchmark results for pmap_shard_outputs_nouts=500_nshards=4--------- mean=0.471524 std=0.024051 %std=5.100792 total=2.357622 #iters=5 #warmup=1 ---------Benchmark results for pmap_shard_outputs_nouts=10_nshards=2--------- mean=0.041546 std=0.004446 %std=10.700256 total=2.035745 #iters=49 #warmup=1 ---------Benchmark results for pmap_shard_outputs_nouts=10_nshards=4--------- mean=0.063768 std=0.002756 %std=4.322039 total=2.040561 #iters=32 #warmup=1 ---------Benchmark results for pmap_shard_outputs_nouts=10_nshards=8--------- mean=0.087285 std=0.005343 %std=6.121320 total=2.007556 #iters=23 #warmup=1 ---------Benchmark results for pmap_shard_outputs_nouts=10_nshards=100--------- mean=0.623440 std=0.004038 %std=0.647725 total=2.493759 #iters=4 #warmup=1 ---------Benchmark results for pmap_shard_outputs_nouts=10_nshards=500--------- mean=4.096676 std=0.000000 %std=0.000000 total=4.096676 #iters=1 #warmup=1 ---------Benchmark summary for pmap_shard_outputs--------- nouts nshards mean %std relative ------- --------- --------- --------- ---------- 10 4 0.0617801 7.66803 1 100 4 0.123264 4.85139 1.99521 500 4 0.471524 5.10079 7.6323 10 2 0.0415458 10.7003 0.672479 10 4 0.0637675 4.32204 1.03217 10 8 0.087285 6.12132 1.41283 10 100 0.62344 0.647725 10.0913 10 500 4.09668 0 66.3106 ``` --- benchmarks/benchmark.py | 109 +++++++++++++++++++++++++++++++++++ benchmarks/pmap_benchmark.py | 88 ++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 benchmarks/benchmark.py create mode 100644 benchmarks/pmap_benchmark.py diff --git a/benchmarks/benchmark.py b/benchmarks/benchmark.py new file mode 100644 index 000000000000..e0cb7eb55c16 --- /dev/null +++ b/benchmarks/benchmark.py @@ -0,0 +1,109 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A simple Python microbenchmarking library.""" + +from collections import OrderedDict +from numbers import Number +import os +import time +from typing import Any, Optional, Union, Callable, List, Dict + +import numpy as onp +from tabulate import tabulate + +from jax.util import safe_zip + + +def benchmark(f: Callable[[], Any], iters: Optional[int] = None, + warmup: Optional[int] = None, name: Optional[str] = None, + target_total_secs: Optional[Union[int, float]] = None): + """Benchmarks ``f``. Prints the results and returns the raw times. + + Args: + f: The function to be benchmarked. Should take no arguments. + iters: The number of iterations to run for. If none, runs until + ``target_total_secs`` has elapsed. + warmup: The number of warmup (untimed) iterations to run for. + name: The name of the benchmark. Defaults to f.__name__. + target_total_secs: If ``iters`` isn't specified, the minimum number of + seconds to run for. Defaults to the env var TARGET_TOTAL_SECS or 10 if + not set. + + Returns: + An ndarray containing the number of seconds each iteration ran for. + """ + if target_total_secs is None: + target_total_secs = int(os.getenv("TARGET_TOTAL_SECS", "10")) + + if warmup is None: + if iters is None: + warmup = 1 + else: + warmup = onp.clip(1, iters // 10, 10) + for _ in range(warmup): + f() + + times = [] + count = 0 + while (count < iters if iters is not None + else sum(times) < target_total_secs): + start = time.time() + f() + end = time.time() + times.append(end - start) + count += 1 + + times = onp.array(times) + print("---------Benchmark results for %s---------" % (name or f.__name__)) + print("mean=%f std=%f %%std=%f total=%f" % + (times.mean(), times.std(), _pstd(times), times.sum())) + print("#iters=%d #warmup=%d" % (count, warmup)) + print() + return times + + +def benchmark_suite(prepare: Callable[..., Callable], params_list: List[Dict], + name: str, target_total_secs: int = None): + """Benchmarks a function for several combinations of parameters. + + Prints the summarized results in a table.. + + Args: + prepare: given kwargs returns a benchmark function specialized to the kwargs. + params_list: a list of kwargs on which to run the benchmark. + name: the name of this benchmark suite + target_total_secs: the ``target_total_secs`` to pass to ``benchmark``. + """ + # Sort parameters alphabetically so benchmark results print consistently. + params_list = [OrderedDict(sorted(p.items())) for p in params_list] + assert all(p.keys() == params_list[0].keys() for p in params_list) + + times = [] + for params in params_list: + f = prepare(**params) + subname = name + "".join("_%s=%s" % (n, p) for n, p in params.items()) + times.append(benchmark(f, name=subname, + target_total_secs=target_total_secs)) + + print("---------Benchmark summary for %s---------" % name) + param_names = list(params_list[0].keys()) + print(tabulate([tuple(params.values()) + + (t.mean(), _pstd(t), t.mean() / times[0].mean()) + for params, t in safe_zip(params_list, times)], + param_names + ["mean", "%std", "relative"])) + print() + + +def _pstd(x): + return x.std() / x.mean() * 100 diff --git a/benchmarks/pmap_benchmark.py b/benchmarks/pmap_benchmark.py new file mode 100644 index 000000000000..5262e4c5b5b3 --- /dev/null +++ b/benchmarks/pmap_benchmark.py @@ -0,0 +1,88 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""To run on CPU with 500 CPU devices: + +CUDA_VISIBLE_DEVICES= XLA_FLAGS=--xla_force_host_platform_device_count=500 \ +python3 pmap_benchmark.py + +To make it run faster, set env var TARGET_TOTAL_SECS to a low number (e.g. 2). +""" +import numpy as onp + +from benchmark import benchmark_suite +import jax +import jax.numpy as np +from jax import pmap + + +def pmap_shard_args_benchmark(): + """Pmap benchmark focusing on shard_args fast path. + + This is intended to measure how long it takes to dispatch a correctly-sharded + ShardedDeviceArray to pmap. + """ + + def get_benchmark_fn(nargs, nshards): + pmap_fn = pmap(lambda *args: np.sum(args)) + shape = (nshards, 4) + args = [onp.random.random(shape) for _ in range(nargs)] + sharded_args = pmap(lambda x: x)(args) + assert all(type(arg) == jax.pxla.ShardedDeviceArray for arg in sharded_args) + def benchmark_fn(): + for _ in range(100): + pmap_fn(*sharded_args) + return benchmark_fn + + params = [] + for nargs in (10, 100, 101, 500): + nshards = min(4, jax.local_device_count()) + params.append({"nargs": nargs, "nshards": nshards}) + for nshards in (2, 4, 8, 100, 500): + if nshards > jax.local_device_count(): continue + params.append({"nargs": 10, "nshards": nshards}) + benchmark_suite(get_benchmark_fn, params, "pmap_shard_args") + + +def pmap_shard_outputs_benchmark(): + """Pmap benchmark focusing on array_result_handler path. + + This is intended to measure how long it takes to construct ShardedDeviceArrays + from pmap. + """ + def get_benchmark_fn(nouts, nshards): + pmap_fn = pmap(lambda x: [x + i for i in range(nouts)]) + shape = (nshards, 4) + arg = onp.random.random(shape) + def benchmark_fn(): + for _ in range(100): + pmap_fn(arg) + return benchmark_fn + + params = [] + for nouts in (10, 100, 500): + nshards = min(4, jax.local_device_count()) + params.append({"nouts": nouts, "nshards": nshards}) + for nshards in (2, 4, 8, 100, 500): + if nshards > jax.local_device_count(): continue + params.append({"nouts": 10, "nshards": nshards}) + benchmark_suite(get_benchmark_fn, params, "pmap_shard_outputs") + + +def run_all_benchmarks(): + pmap_shard_args_benchmark() + pmap_shard_outputs_benchmark() + + +if __name__ == "__main__": + run_all_benchmarks() From f1d9130f2511be29b8c53a0b5f4f685009771af7 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 17 Mar 2020 22:07:53 -0700 Subject: [PATCH 0902/1053] remove safe_mul (undo #383, also cf. #1052) --- jax/lax/__init__.py | 10 +++++----- jax/lax/lax.py | 27 ++++----------------------- jax/lax/lax_parallel.py | 1 - jax/scipy/special.py | 4 ++-- tests/lax_numpy_test.py | 38 ++++++++++++++++++++++---------------- 5 files changed, 33 insertions(+), 47 deletions(-) diff --git a/jax/lax/__init__.py b/jax/lax/__init__.py index a91aa5a28921..979961c263b6 100644 --- a/jax/lax/__init__.py +++ b/jax/lax/__init__.py @@ -16,11 +16,11 @@ from .lax import (_reduce_sum, _reduce_max, _reduce_min, _reduce_or, _reduce_and, _reduce_window_sum, _reduce_window_max, _reduce_window_min, _reduce_window_prod, - _select_and_gather_add, _float, _complex, - _input_dtype, _const, _eq_meet, _safe_mul, - _broadcasting_select, _check_user_dtype_supported, - _one, _const, _upcast_fp16_for_computation, - _broadcasting_shape_rule, _eye, _tri, _delta) + _select_and_gather_add, _float, _complex, _input_dtype, + _const, _eq_meet, _broadcasting_select, + _check_user_dtype_supported, _one, _const, + _upcast_fp16_for_computation, _broadcasting_shape_rule, + _eye, _tri, _delta) from .lax_control_flow import * from .lax_fft import * from .lax_parallel import * diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2389b7c5fac2..2bc5868f62c6 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1145,9 +1145,6 @@ def stop_gradient(x): return tree_map(stop_gradient_p.bind, x) -def _safe_mul(x, y): return safe_mul_p.bind(x, y) - - ### convenience wrappers around traceables @@ -1674,7 +1671,7 @@ def _sign_translation_rule(c, x): ad.defjvp_zero(is_finite_p) exp_p = standard_unop(_float | _complex, 'exp') -ad.defjvp2(exp_p, lambda g, ans, x: _safe_mul(g, ans)) +ad.defjvp2(exp_p, lambda g, ans, x: mul(g, ans)) log_p = standard_unop(_float | _complex, 'log') ad.defjvp(log_p, lambda g, x: div(g, x)) @@ -1804,21 +1801,18 @@ def _abs_jvp_rule(g, ans, x): _maybe_real = lambda x: real(x) if _iscomplex(x) else x sqrt_p = standard_unop(_float | _complex, 'sqrt') -ad.defjvp2(sqrt_p, lambda g, ans, x: _safe_mul(g, div(_const(x, 0.5), ans))) +ad.defjvp2(sqrt_p, lambda g, ans, x: mul(g, div(_const(x, 0.5), ans))) rsqrt_p = standard_unop(_float | _complex, 'rsqrt') ad.defjvp2(rsqrt_p, lambda g, ans, x: - _safe_mul(g, mul(_const(x, -0.5), pow(x, _const(x, -1.5))))) + mul(g, mul(_const(x, -0.5), pow(x, _const(x, -1.5))))) pow_p = standard_naryop([_float | _complex, _float | _complex], 'pow') def _pow_jvp_lhs(g, ans, x, y): - # we call _safe_mul here so that we get the behavior 0*inf = 0, since when a - # coefficient in `g` is zero we want to keep it at zero, not produce a nan. - # see https://github.com/google/jax/pull/383 jac = mul(y, pow(x, select(eq(y, _zeros(y)), _ones(y), sub(y, _ones(y))))) - return _safe_mul(_brcast(g, y), jac) + return mul(_brcast(g, y), jac) def _pow_jvp_rhs(g, ans, x, y): return mul(_brcast(g, x), mul(log(_replace_zero(x)), ans)) @@ -1859,19 +1853,6 @@ def _sub_transpose(t, x, y): mul_p = standard_naryop([_num, _num], 'mul') ad.defbilinear_broadcasting(_brcast, mul_p, mul, mul) -def _safe_mul_translation_rule(c, x, y): - dtype = c.GetShape(x).numpy_dtype() - zero = c.Constant(onp.array(0, dtype=dtype)) - out_shape = broadcast_shapes(c.GetShape(x).dimensions(), - c.GetShape(y).dimensions()) - return c.Select(c.Or(c.Eq(x, zero), c.Eq(y, zero)), - c.Broadcast(zero, out_shape), - c.Mul(x, y)) - -safe_mul_p = standard_naryop([_num, _num], 'safe_mul', - translation_rule=_safe_mul_translation_rule) -ad.defbilinear_broadcasting(_brcast, safe_mul_p, _safe_mul, _safe_mul) - def _div_transpose_rule(cotangent, x, y): assert ad.is_undefined_primal(x) and not ad.is_undefined_primal(y) diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 2ef61fa26f15..9d4fabd8dde7 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -519,7 +519,6 @@ def _defidentity(prim, argnum=0): _defbroadcasting(lax.add_p) _defbroadcasting(lax.sub_p) _defbroadcasting(lax.mul_p) -_defbroadcasting(lax.safe_mul_p) _defbroadcasting(lax.div_p) _defbroadcasting(lax.rem_p) _defbroadcasting(lax.max_p) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index efee2ea2c33a..b03d4f68cc7c 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -113,13 +113,13 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False): @_wraps(osp_special.xlogy) def xlogy(x, y): x, y = _promote_args_inexact("xlogy", x, y) - return lax._safe_mul(x, lax.log(y)) + return lax.mul(x, lax.log(y)) @_wraps(osp_special.xlog1py, update_doc=False) def xlog1py(x, y): x, y = _promote_args_inexact("xlog1py", x, y) - return lax._safe_mul(x, lax.log1p(y)) + return lax.mul(x, lax.log1p(y)) @_wraps(osp_special.entr) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 05cca1a8f185..a75de3f9f7b9 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2113,17 +2113,20 @@ def testSymmetrizeDtypePromotion(self): jax_numpy_result = ((x + x.T) / 2).dtype self.assertEqual(orig_numpy_result, jax_numpy_result) - def testIssue347(self): - # https://github.com/google/jax/issues/347 - def test_fail(x): - x = jnp.sqrt(jnp.sum(x ** 2, axis=1)) - ones = jnp.ones_like(x) - x = jnp.where(x > 0.5, x, ones) - return jnp.sum(x) - - x = jnp.array([[1, 2], [3, 4], [0, 0]], dtype=jnp.float64) - result = api.grad(test_fail)(x) - assert not onp.any(onp.isnan(result)) + # NOTE(mattjj): I disabled this test when removing lax._safe_mul because + # introducing the convention 0 * inf = 0 leads to silently wrong results in + # some cases. See this comment for details: + # https://github.com/google/jax/issues/1052#issuecomment-514083352 + # def testIssue347(self): + # # https://github.com/google/jax/issues/347 + # def test_fail(x): + # x = jnp.sqrt(jnp.sum(x ** 2, axis=1)) + # ones = jnp.ones_like(x) + # x = jnp.where(x > 0.5, x, ones) + # return jnp.sum(x) + # x = jnp.array([[1, 2], [3, 4], [0, 0]], dtype=jnp.float64) + # result = api.grad(test_fail)(x) + # assert not onp.any(onp.isnan(result)) def testIssue453(self): # https://github.com/google/jax/issues/453 @@ -2240,11 +2243,14 @@ def f(u): self.assertAllClose(onp.zeros(3,), api.grad(f)(onp.ones(3,)), check_dtypes=True) - def testIssue777(self): - x = jnp.linspace(-200, 0, 4, dtype=onp.float32) - f = api.grad(lambda x: jnp.sum(1 / (1 + jnp.exp(-x)))) - self.assertAllClose(f(x), onp.array([0., 0., 0., 0.25], dtype=onp.float32), - check_dtypes=True) + # NOTE(mattjj): I disabled this test when removing lax._safe_mul because this + # is a numerical stability issue that should be solved with a custom jvp rule + # of the sigmoid function being differentiated here, not by safe_mul. + # def testIssue777(self): + # x = jnp.linspace(-200, 0, 4, dtype=onp.float32) + # f = api.grad(lambda x: jnp.sum(1 / (1 + jnp.exp(-x)))) + # self.assertAllClose(f(x), onp.array([0., 0., 0., 0.25], dtype=onp.float32), + # check_dtypes=True) @parameterized.named_parameters( jtu.cases_from_list( From 26d5a68f09bfc3c8cd4412a99fe6724b03cb48cd Mon Sep 17 00:00:00 2001 From: James Bradbury Date: Tue, 17 Mar 2020 22:41:02 -0700 Subject: [PATCH 0903/1053] Wrap pad_widths in a tuple to avoid cache misses (#2379) --- jax/numpy/lax_numpy.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 00bce0a2a5c9..f951dd3abc23 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1681,6 +1681,8 @@ def _pad(array, pad_width, mode, constant_values): @_wraps(onp.pad) def pad(array, pad_width, mode='constant', constant_values=0): + if isinstance(pad_width, list): + pad_width = tuple(pad_width) return _pad(array, pad_width, mode, constant_values) From cbdf9a5a43b07282a6bdd5f0735802d57e03de00 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 18 Mar 2020 10:54:28 -0400 Subject: [PATCH 0904/1053] Drop support for Python 3.5. (#2445) --- README.md | 8 ++++---- build/Dockerfile | 2 -- build/build.py | 4 ++-- build/build_jaxlib_wheels.sh | 2 +- build/build_jaxlib_wheels_macos.sh | 1 - build/setup.py | 2 +- docs/CHANGELOG.rst | 5 +++++ setup.py | 2 +- tests/api_test.py | 3 --- 9 files changed, 14 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 24910221c399..c2e95581f13d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ | [**Change logs**](https://jax.readthedocs.io/en/latest/CHANGELOG.html) | [**Reference docs**](https://jax.readthedocs.io/en/latest/) -**Announcement:** JAX 0.1.58 has dropped Python 2 support, and requires Python 3.5 or newer. See [docs/CHANGELOG.rst](https://jax.readthedocs.io/en/latest/CHANGELOG.html). +**Announcement:** JAX has dropped Python 2 support, and requires Python 3.6 or newer. See [docs/CHANGELOG.rst](https://jax.readthedocs.io/en/latest/CHANGELOG.html). ## What is JAX? @@ -408,7 +408,7 @@ cloud VM), you can run ```bash # install jaxlib -PYTHON_VERSION=cp37 # alternatives: cp35, cp36, cp37, cp38 +PYTHON_VERSION=cp37 # alternatives: cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda92, cuda100, cuda101, cuda102 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' @@ -429,8 +429,8 @@ grep CUDNN_MAJOR -A 2 /usr/local/cuda/include/cudnn.h # might need different pa ``` The Python version must match your Python interpreter. There are prebuilt wheels -for Python 3.5, 3.6, 3.7, and 3.8; for anything else, you must build from -source. Jax requires Python 3.5 or above. Jax does not support Python 2 any +for Python 3.6, 3.7, and 3.8; for anything else, you must build from +source. Jax requires Python 3.6 or above. Jax does not support Python 2 any more. To try automatic detection of the correct version for your system, you can run: diff --git a/build/Dockerfile b/build/Dockerfile index 08e99e37c973..7279f27a88ed 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -7,13 +7,11 @@ RUN apt-get update RUN apt-get install libffi-dev RUN git clone --branch v1.2.14 https://github.com/pyenv/pyenv.git /pyenv ENV PYENV_ROOT /pyenv -RUN /pyenv/bin/pyenv install 3.5.6 RUN /pyenv/bin/pyenv install 3.6.8 RUN /pyenv/bin/pyenv install 3.7.2 RUN /pyenv/bin/pyenv install 3.8.0 # We pin numpy to a version < 1.16 to avoid version compatibility issues. -RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.5.6 && pip install numpy==1.15.4 scipy cython setuptools wheel six RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.6.8 && pip install numpy==1.15.4 scipy cython setuptools wheel six RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.7.2 && pip install numpy==1.15.4 scipy cython setuptools wheel six RUN eval "$(/pyenv/bin/pyenv init -)" && /pyenv/bin/pyenv local 3.8.0 && pip install numpy==1.17.3 scipy cython setuptools wheel six diff --git a/build/build.py b/build/build.py index 34cc2de4b0f7..41162fa68af5 100755 --- a/build/build.py +++ b/build/build.py @@ -64,8 +64,8 @@ def get_python_version(python_bin_path): return major, minor def check_python_version(python_version): - if python_version < (3, 5): - print("JAX requires Python 3.5 or newer.") + if python_version < (3, 6): + print("JAX requires Python 3.6 or newer.") sys.exit(-1) diff --git a/build/build_jaxlib_wheels.sh b/build/build_jaxlib_wheels.sh index c2de7c80df0e..873b52e2a14b 100755 --- a/build/build_jaxlib_wheels.sh +++ b/build/build_jaxlib_wheels.sh @@ -1,7 +1,7 @@ #!/bin/bash set -xev -PYTHON_VERSIONS="3.5.6 3.6.8 3.7.2 3.8.0" +PYTHON_VERSIONS="3.6.8 3.7.2 3.8.0" CUDA_VERSIONS="9.2 10.0 10.1 10.2" CUDA_VARIANTS="cuda" # "cuda-included" diff --git a/build/build_jaxlib_wheels_macos.sh b/build/build_jaxlib_wheels_macos.sh index 1fccedaa3fa1..72a3d7b61e2f 100755 --- a/build/build_jaxlib_wheels_macos.sh +++ b/build/build_jaxlib_wheels_macos.sh @@ -43,7 +43,6 @@ build_jax () { rm -fr build/dist -build_jax 3.5.6 cp35 1.15.4 1.2.0 build_jax 3.6.8 cp36 1.15.4 1.2.0 build_jax 3.7.2 cp37 1.15.4 1.2.0 build_jax 3.8.0 cp38 1.17.3 1.3.2 diff --git a/build/setup.py b/build/setup.py index 06194b24a033..7976ab2adcb7 100644 --- a/build/setup.py +++ b/build/setup.py @@ -31,7 +31,7 @@ author='JAX team', author_email='jax-dev@google.com', packages=['jaxlib'], - python_requires='>=3.5', + python_requires='>=3.6', install_requires=['scipy', 'numpy>=1.12', 'absl-py'], url='https://github.com/google/jax', license='Apache-2.0', diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 8adadcfa4a87..9b338fa444c2 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -9,6 +9,11 @@ Change Log These are the release notes for JAX. +jax 0.1.62 (unreleased) +--------------------------- + +* JAX has dropped support for Python 3.5. Please upgrade to Python 3.6 or newer. + jax 0.1.61 (March 17, 2020) --------------------------- diff --git a/setup.py b/setup.py index e83d99dba1ec..1fbf740ec5c5 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ author='JAX team', author_email='jax-dev@google.com', packages=find_packages(exclude=["examples"]), - python_requires='>=3.5', + python_requires='>=3.6', install_requires=[ 'numpy>=1.12', 'absl-py', 'opt_einsum' ], diff --git a/tests/api_test.py b/tests/api_test.py index 5d4b3262f45a..9ff8e981339a 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -18,7 +18,6 @@ import copy from functools import partial import re -import sys import unittest import warnings import weakref @@ -1870,8 +1869,6 @@ def f(x): in e } """, str(jaxpr)) - @unittest.skipIf((sys.version_info.major, sys.version_info.minor) <= (3, 5), - "Test fails on Python 3.5") def testExamplesJaxprDoc(self): """Tests examples included in the Understanding JAXPRs doc (docs/jaxpr.rst).""" from jax import numpy as jnp From cd248ba30e6e95fbcd8fc9f458160a5f045b05d9 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Wed, 18 Mar 2020 14:05:28 -0700 Subject: [PATCH 0905/1053] Fix xlog1py and xlogy not returning 0 when x == 0. (#2450) * Fix xlog1py and xlogy not returning 0 when x == 0. * Add tests for xlog1py and xlogy --- jax/scipy/special.py | 10 ++++++++-- tests/lax_scipy_test.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index b03d4f68cc7c..a443e153c6bb 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -113,13 +113,19 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False): @_wraps(osp_special.xlogy) def xlogy(x, y): x, y = _promote_args_inexact("xlogy", x, y) - return lax.mul(x, lax.log(y)) + x_ok = x != 0. + safe_x = jnp.where(x_ok, x, 1.) + safe_y = jnp.where(x_ok, y, 1.) + return jnp.where(x_ok, lax.mul(safe_x, lax.log(safe_y)), jnp.zeros_like(x)) @_wraps(osp_special.xlog1py, update_doc=False) def xlog1py(x, y): x, y = _promote_args_inexact("xlog1py", x, y) - return lax.mul(x, lax.log1p(y)) + x_ok = x != 0. + safe_x = jnp.where(x_ok, x, 1.) + safe_y = jnp.where(x_ok, y, 1.) + return jnp.where(x_ok, lax.mul(safe_x, lax.log1p(safe_y)), jnp.zeros_like(x)) @_wraps(osp_special.entr) diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 5dfe5df52f1b..a9b9fccce258 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -75,6 +75,8 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): op_record("ndtr", 1, float_dtypes, jtu.rand_default, True), # TODO(phawkins): gradient of entr yields NaNs. op_record("entr", 1, float_dtypes, jtu.rand_default, False), + op_record("xlogy", 2, float_dtypes, jtu.rand_default, True), + op_record("xlog1py", 2, float_dtypes, jtu.rand_default, True), ] @@ -162,6 +164,20 @@ def testIssue980(self): self.assertAllClose(onp.zeros((4,), dtype=onp.float32), lsp_special.expit(x), check_dtypes=True) + def testXlogyShouldReturnZero(self): + self.assertAllClose(lsp_special.xlogy(0., 0.), 0., check_dtypes=False) + + def testGradOfXlogyAtZero(self): + partial_xlogy = functools.partial(lsp_special.xlogy, 0.) + self.assertAllClose(api.grad(partial_xlogy)(0.), 0., check_dtypes=False) + + def testXlog1pyShouldReturnZero(self): + self.assertAllClose(lsp_special.xlog1py(0., -1.), 0., check_dtypes=False) + + def testGradOfXlog1pyAtZero(self): + partial_xlog1py = functools.partial(lsp_special.xlog1py, 0.) + self.assertAllClose(api.grad(partial_xlog1py)(-1.), 0., check_dtypes=False) + if __name__ == "__main__": absltest.main() From 68b32bf704a3528de32d8a508e1668d3415c00ea Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 18 Mar 2020 17:06:05 -0400 Subject: [PATCH 0906/1053] Add mypy type checking (#2430) * Add type annotations to make mypy pass. * Add mypy to .travis.yml. --- .travis.yml | 6 +++++- jax/ad_util.py | 7 +++++-- jax/api.py | 30 +++++++++++++++++------------- jax/core.py | 20 ++++++++++++++------ jax/interpreters/ad.py | 11 +++++------ jax/interpreters/batching.py | 8 +++++--- jax/interpreters/masking.py | 7 ++++--- jax/interpreters/parallel.py | 3 ++- jax/interpreters/partial_eval.py | 7 ++++--- jax/interpreters/pxla.py | 16 +++++++++------- jax/interpreters/sharded_jit.py | 3 ++- jax/interpreters/xla.py | 27 +++++++++++++++------------ jax/lax/lax.py | 21 ++++++++++++--------- jax/lax/lax_control_flow.py | 6 +++--- jax/lax/lax_fft.py | 5 +++++ jax/lax/lax_parallel.py | 2 +- jax/lax_linalg.py | 1 - jax/lazy.py | 2 +- jax/lib/xla_bridge.py | 3 ++- jax/numpy/lax_numpy.py | 3 +-- jax/numpy/vectorize.py | 13 +++++++------ jax/test_util.py | 3 ++- mypy.ini | 12 ++++++++++++ 23 files changed, 133 insertions(+), 83 deletions(-) create mode 100644 mypy.ini diff --git a/.travis.yml b/.travis.yml index edf80f4526ca..4e535f253e4f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,8 @@ dist: xenial language: python matrix: include: + - python: "3.6" + env: JAX_CHECK_TYPES=true - python: "3.6" env: JAX_ENABLE_X64=0 JAX_NUM_GENERATED_CASES=25 - python: "3.6" @@ -23,7 +25,7 @@ before_install: - conda config --add channels conda-forge - conda update -q conda install: - - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark + - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark mypy # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. @@ -38,6 +40,8 @@ install: script: - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html ; + elif [ "$JAX_CHECK_TYPES" = true ]; then + mypy --config-file=mypy.ini jax ; else pytest -n 1 tests examples -W ignore ; fi diff --git a/jax/ad_util.py b/jax/ad_util.py index 70759e400ca3..990e0003ac18 100644 --- a/jax/ad_util.py +++ b/jax/ad_util.py @@ -15,8 +15,11 @@ from .core import lattice_join, Primitive, Unit, unit, AbstractUnit from .tree_util import register_pytree_node +from typing import Any, Dict from .util import safe_map +Array = Any + map = safe_map jaxval_adders = {} @@ -35,12 +38,12 @@ def add_impl(xs, ys): def add_abstract(xs, ys): return lattice_join(xs, ys) -jaxval_zeros_likers = {} +jaxval_zeros_likers: Dict[type, Array] = {} def zeros_like_aval(aval): return aval_zeros_likers[type(aval)](aval) -aval_zeros_likers = {} +aval_zeros_likers: Dict[type, Array] = {} aval_zeros_likers[AbstractUnit] = lambda _: unit def zeros_like_jaxval(val): diff --git a/jax/api.py b/jax/api.py index 3245af49becf..513482e9c43a 100644 --- a/jax/api.py +++ b/jax/api.py @@ -28,7 +28,7 @@ import functools import itertools as it import threading -from typing import Any, Callable, Iterable, Optional, Sequence, Tuple, Union +from typing import Any, Callable, Dict, Iterable, Optional, Sequence, Tuple, Union from warnings import warn import numpy as onp @@ -57,7 +57,7 @@ from .interpreters import batching from .interpreters import parallel from .interpreters import masking -from .interpreters.masking import shapecheck, ensure_poly +from .interpreters.masking import ensure_poly from .config import flags, config, bool_env AxisName = Any @@ -414,9 +414,9 @@ def value_and_grad_f(*args, **kwargs): f = lu.wrap_init(fun, kwargs) f_partial, dyn_args = _argnums_partial(f, argnums, args) if not has_aux: - ans, vjp_py = vjp(f_partial, *dyn_args) + ans, vjp_py = _vjp(f_partial, *dyn_args) else: - ans, vjp_py, aux = vjp(f_partial, *dyn_args, has_aux=True) + ans, vjp_py, aux = _vjp(f_partial, *dyn_args, has_aux=True) _check_scalar(ans) dtype = dtypes.result_type(ans) if not (holomorphic or dtypes.issubdtype(dtype, onp.floating)): @@ -477,7 +477,7 @@ def jacfun(*args, **kwargs): f = lu.wrap_init(fun, kwargs) f_partial, dyn_args = _argnums_partial(f, argnums, args) holomorphic or tree_map(_check_real_input_jacfwd, dyn_args) - pushfwd = partial(jvp, f_partial, dyn_args) + pushfwd = partial(_jvp, f_partial, dyn_args) y, jac = vmap(pushfwd, out_axes=(None, batching.last))(_std_basis(dyn_args)) example_args = dyn_args[0] if isinstance(argnums, int) else dyn_args return tree_map(partial(_unravel_array_into_pytree, example_args, -1), jac) @@ -521,7 +521,7 @@ def jacrev(fun: Callable, argnums: Union[int, Sequence[int]] = 0, def jacfun(*args, **kwargs): f = lu.wrap_init(fun, kwargs) f_partial, dyn_args = _argnums_partial(f, argnums, args) - y, pullback = vjp(f_partial, *dyn_args) + y, pullback = _vjp(f_partial, *dyn_args) holomorphic or tree_map(_check_real_output_jacrev, y) jac = vmap(pullback)(_std_basis(y)) jac = jac[0] if isinstance(argnums, int) else jac @@ -1060,7 +1060,7 @@ def mask(fun: Callable, in_shapes, out_shape): in_specs = map(masking.parse_spec, in_specs) out_specs = map(masking.parse_spec, out_specs) - unique_ids = collections.defaultdict(object) + unique_ids: Dict[Any, Any] = collections.defaultdict(object) in_specs = map(partial(_remap_ids, unique_ids), in_specs) out_specs = map(partial(_remap_ids, unique_ids), out_specs) @@ -1148,9 +1148,10 @@ def jvp(fun: Callable, primals, tangents): >>> print(v) 0.19900084 """ - if not isinstance(fun, lu.WrappedFun): - fun = lu.wrap_init(fun) + return _jvp(lu.wrap_init(fun), primals, tangents) +def _jvp(fun: lu.WrappedFun, primals, tangents): + """Variant of jvp() that takes an lu.WrappedFun.""" if (not isinstance(primals, (tuple, list)) or not isinstance(tangents, (tuple, list))): msg = ("primal and tangent arguments to jax.jvp must be tuples or lists; " @@ -1316,10 +1317,12 @@ def vjp(fun: Callable, *primals, **kwargs): >>> print(ybar) -0.2524413 """ + return _vjp(lu.wrap_init(fun), *primals, **kwargs) + +def _vjp(fun: lu.WrappedFun, *primals, **kwargs): + """Variant of vjp() that takes an lu.WrappedFun.""" has_aux = kwargs.pop('has_aux', False) assert not kwargs - if not isinstance(fun, lu.WrappedFun): - fun = lu.wrap_init(fun) primals_flat, in_tree = tree_flatten(primals) _check_args(primals_flat) tree_map(_check_inexact_input_vjp, primals) @@ -2091,8 +2094,9 @@ def __init__(self, shape, dtype): def abstractify(x): return ShapedArray(onp.shape(x), dtypes.result_type(x)) args_flat, in_tree = tree_flatten((args, kwargs)) - fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) - out = pe.abstract_eval_fun(fun.call_wrapped, *map(abstractify, args_flat)) + wrapped_fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) + out = pe.abstract_eval_fun(wrapped_fun.call_wrapped, + *map(abstractify, args_flat)) out = [ShapeDtypeStruct(x.shape, x.dtype) for x in out] return tree_unflatten(out_tree(), out) diff --git a/jax/core.py b/jax/core.py index 8cc0d6240d2e..edc81e08bea1 100644 --- a/jax/core.py +++ b/jax/core.py @@ -22,6 +22,7 @@ from weakref import ref import threading import types +from typing import Any, Callable, ClassVar, Dict, List, Optional, Set import numpy as onp @@ -110,8 +111,10 @@ def jaxpr_as_fun(typed_jaxpr, *args): -JaxprEqn = namedtuple('JaxprEqn', ['invars', 'outvars', 'primitive', 'params']) -JaxprEqn.__repr__ = JaxprEqn.__str__ = lambda eqn: str(pp_eqn(eqn)).rstrip() +class JaxprEqn(namedtuple('JaxprEqn', + ['invars', 'outvars', 'primitive', 'params'])): + def __repr__(self): return str(pp_eqn(self)).rstrip() + new_jaxpr_eqn = JaxprEqn @@ -175,7 +178,7 @@ def __repr__(self): else: return '{}'.format(self.val) -literalable_types = set() +literalable_types: Set[type] = set() class Primitive(object): multiple_results = False # override for multi-output primitives @@ -552,7 +555,7 @@ def new_sublevel(): class AbstractValue(object): - __slots__ = [] + __slots__: List[str] = [] def at_least_vspace(self): assert False @@ -613,7 +616,7 @@ def get_aval(x): return concrete_aval(x) -pytype_aval_mappings = {} +pytype_aval_mappings: Dict[type, Callable[[Any], AbstractValue]] = {} class Unit(object): @@ -713,6 +716,11 @@ def __init__(self, shape, dtype, weak_type=False): ndim = property(lambda self: len(self.shape)) size = property(lambda self: prod(self.shape)) + broadcast: ClassVar[Optional[aval_method]] = None + transpose: ClassVar[Optional[aval_method]] = None + reshape: ClassVar[Optional[aval_method]] = None + _iter: ClassVar[Optional[staticmethod]] = None + def __eq__(self, other): return (type(self) is type(other) and self.dtype == other.dtype and self.shape == other.shape @@ -822,7 +830,7 @@ def raise_to_shaped(aval, weak_type=False): raise TypeError(type(aval)) # Registry for valid dimension types. This is used by masking.Poly. -_DIMENSION_TYPES = {int} +_DIMENSION_TYPES: Set[type] = {int} def _canonicalize_dimension(dim): if type(dim) in _DIMENSION_TYPES: diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 01460f942df2..ef718f228fc2 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -15,7 +15,7 @@ import functools import itertools as it -from typing import Any +from typing import Any, Callable, Dict from . import partial_eval as pe from .. import core as core @@ -159,7 +159,7 @@ def write_primal(v, val): if not is_undefined_primal(val): primal_env[v] = val - primal_env = {} + primal_env: Dict[Any, Any] = {} write_primal(core.unitvar, core.unit) map(write_primal, jaxpr.constvars, consts) map(write_primal, jaxpr.invars, args) @@ -191,7 +191,7 @@ def is_linear(var): map(read_primal, eqn.invars), params) map(write_primal, eqn.outvars, ans) - ct_env = {} + ct_env: Dict[Any, Any] = {} map(write_cotangent, jaxpr.outvars, cotangents_in) for eqn in linear_eqns[::-1]: invals = map(read_primal, eqn.invars) @@ -371,10 +371,9 @@ def _primal_tangent_shapes_match(primal, tangent): # -------------------- Primitives -------------------- -primitive_jvps = {} -composite_jvps = {} +primitive_jvps: Dict[core.Primitive, Callable] = {} -primitive_transposes = {} +primitive_transposes: Dict[core.Primitive, Callable] = {} def deflinear(primitive, transpose_rule): diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 197dcc08ac34..54edf6f3882b 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Any, Callable, Dict, Optional, Sequence, Tuple, Union import numpy as onp @@ -60,8 +61,8 @@ def batch_subtrace(master, in_dims, *in_vals): class BatchTracer(Tracer): __slots__ = ['val', 'batch_dim'] - def __init__(self, trace, val, batch_dim): - assert core.skip_checks or type(batch_dim) in (int, NotMapped) + def __init__(self, trace, val, batch_dim: Optional[int]): + assert core.skip_checks or type(batch_dim) in (int, NotMapped) # type: ignore self._trace = trace self.val = val self.batch_dim = batch_dim @@ -150,7 +151,8 @@ def todo(x): ### primitives -primitive_batchers = {} +BatchingRule = Callable[..., Tuple[Any, Union[int, Tuple[int, ...]]]] +primitive_batchers: Dict[core.Primitive, BatchingRule] = {} def get_primitive_batcher(p): try: diff --git a/jax/interpreters/masking.py b/jax/interpreters/masking.py index 54d165f9b288..bca12a208b48 100644 --- a/jax/interpreters/masking.py +++ b/jax/interpreters/masking.py @@ -20,6 +20,7 @@ import itertools as it import operator as op import string +from typing import Callable, Dict import numpy as onp @@ -389,9 +390,9 @@ def process_primitive(self, primitive, tracers, params): def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): raise NotImplementedError # TODO mask-of-jit -shape_parameterized_primitive_rules = {} -masking_rules = {} -shape_rules = {} +shape_parameterized_primitive_rules: Dict[core.Primitive, Callable] = {} +masking_rules: Dict[core.Primitive, Callable] = {} +shape_rules: Dict[core.Primitive, Callable] = {} def defvectorized(prim): masking_rules[prim] = partial(vectorized_masking_rule, prim) diff --git a/jax/interpreters/parallel.py b/jax/interpreters/parallel.py index bd079b4835a4..f00016ce3533 100644 --- a/jax/interpreters/parallel.py +++ b/jax/interpreters/parallel.py @@ -14,6 +14,7 @@ from functools import partial +from typing import Callable, Dict from .. import core @@ -137,4 +138,4 @@ def process_map(self, map_primitive, f :lu.WrappedFun, tracers, params): raise NotImplementedError # TODO(mattjj,frostig) -papply_primitive_rules = {} +papply_primitive_rules: Dict[core.Primitive, Callable] = {} diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 963b3c742943..6d30a65dde44 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -17,6 +17,7 @@ from collections import namedtuple import contextlib import threading +from typing import Callable, Dict, Set from weakref import ref import numpy as onp @@ -248,9 +249,9 @@ def _unmapped_aval(size, aval): else: raise TypeError(aval) -map_primitives = set() -custom_partial_eval_rules = {} -call_partial_eval_rules = {} +map_primitives: Set[core.Primitive] = set() +custom_partial_eval_rules: Dict[core.Primitive, Callable] = {} +call_partial_eval_rules: Dict[core.Primitive, Callable] = {} def partial_eval(f, trace, pvs): diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index dd9804e341d2..779da4e11e03 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -17,6 +17,7 @@ from contextlib import contextmanager import operator as op import threading +from typing import Any, Callable, Dict, List, Sequence, Set, Type from absl import logging import numpy as onp @@ -99,7 +100,7 @@ def shard_args(backend, devices, assignments, axis_size, args): return buffers -shard_arg_handlers = {} +shard_arg_handlers: Dict[Any, Callable[[Any, Any, Any], Sequence[Any]]] = {} shard_arg_handlers[core.Unit] = \ lambda x, devices, _: [xla.device_put(core.unit, d) for d in devices] def _shard_array(x, devices, assignments): @@ -121,7 +122,7 @@ def shard_aval(size, aval): except KeyError as err: raise TypeError("No shard_aval handler for type: {}".format(type(aval)) ) from err -shard_aval_handlers = {} +shard_aval_handlers: Dict[Type[core.AbstractValue], Callable[[int, Any], Any]] = {} shard_aval_handlers[core.AbstractUnit] = lambda size, x: x def _shard_abstract_array(size, x): if x.shape[0] != size: @@ -136,7 +137,8 @@ def aval_to_result_handler(size, nrep, aval): except KeyError as err: raise TypeError("No pxla_result_handler for type: {}".format(type(aval)) ) from err -pxla_result_handlers = {} +PxlaResultHandler = Callable[..., Callable[[Any], Any]] +pxla_result_handlers: Dict[Type[core.AbstractValue], PxlaResultHandler] = {} pxla_result_handlers[core.AbstractUnit] = lambda *_: lambda _: core.unit def array_result_handler(size, nrep, aval): full_aval = ShapedArray((size,) + aval.shape, aval.dtype) @@ -242,7 +244,7 @@ def apply_parallel_primitive(prim, *args, **params): shape = (logical_size(dynamic_axis_env[axis_name]),) return parallel_pure_rules[prim](*args, shape=shape, **params) -parallel_pure_rules = {} +parallel_pure_rules: Dict[core.Primitive, Callable] = {} def axis_index(axis_name): @@ -377,7 +379,7 @@ def _sharded_device_array_constant_handler(c, val, canonicalize_types=True): class ChunkedDeviceArray(ShardedDeviceArray): - __slots__ = [] + __slots__: List[str] = [] _collect = staticmethod(onp.concatenate) def __init__(self, axis_size, aval, device_buffers): @@ -549,7 +551,7 @@ def dynamic_fun(dummy, *args): return partial(execute_replicated, compiled, backend, handle_args, handle_outs, tuple_args) -multi_host_supported_collectives = set() +multi_host_supported_collectives: Set[core.Primitive] = set() class ResultToPopulate(object): pass result_to_populate = ResultToPopulate() @@ -865,4 +867,4 @@ def todo(x): return val, todo -split_axis_rules = {} +split_axis_rules: Dict[core.Primitive, Callable] = {} diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index 752b7775be05..edece2d05214 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -13,6 +13,7 @@ # limitations under the License. from functools import partial +from typing import Callable, Dict, Type from absl import logging import numpy as onp @@ -105,7 +106,7 @@ def _aval_to_result_handler(partition, aval): return result_handlers[type(aval)](partition, aval) -result_handlers = {} +result_handlers: Dict[Type[core.AbstractValue], Callable] = {} def _array_result_handler(partition, aval): diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 143a1119181f..990434338f3c 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -16,6 +16,7 @@ from collections import defaultdict import itertools as it import operator as op +from typing import Any, Callable, Dict, Type from absl import logging import numpy as onp @@ -69,7 +70,7 @@ def aval_to_xla_shape(aval): except KeyError as err: raise TypeError("No xla_shape_handler for type: {}".format(type(aval)) ) from err -xla_shape_handlers = {} +xla_shape_handlers: Dict[Type[core.AbstractValue], Callable] = {} xla_shape_handlers[core.AbstractUnit] = _make_abstract_unit xla_shape_handlers[ShapedArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) xla_shape_handlers[ConcreteArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) @@ -80,7 +81,7 @@ def aval_to_result_handler(device, aval): except KeyError as err: raise TypeError("No xla_result_handler for type: {}".format(type(aval)) ) from err -xla_result_handlers = {} +xla_result_handlers: Dict[Type[core.AbstractValue], Callable[..., Callable]] = {} xla_result_handlers[core.AbstractUnit] = lambda _, __: lambda _: core.unit def array_result_handler(device, aval): return partial(DeviceArray, raise_to_shaped(aval), device, lazy.array(aval.shape)) @@ -95,7 +96,7 @@ def device_put(x, device=None): raise TypeError("No device_put handler for type: {}".format(type(x)) ) from err -device_put_handlers = {} +device_put_handlers: Dict[Any, Callable] = {} device_put_handlers[core.Unit] = _device_put_unit def _device_put_array(x, device): return xc.Buffer.from_pyval(x, device, backend=xb.get_device_backend(device)) @@ -118,7 +119,7 @@ def canonicalize_dtype(x): if handler: return handler(x) raise TypeError("No canonicalize_dtype handler for type: {}".format(type(x))) -canonicalize_dtype_handlers = {} +canonicalize_dtype_handlers: Dict[Any, Callable] = {} canonicalize_dtype_handlers[core.Unit] = identity def _canonicalize_ndarray_dtype(x): return onp.asarray(x, dtypes.canonicalize_dtype(dtypes.result_type(x))) @@ -139,7 +140,7 @@ def abstractify(x): if aval_fn: return aval_fn(x) raise TypeError("No abstraction handler for type: {}".format(type(x))) -pytype_aval_mappings = {} +pytype_aval_mappings: Dict[Any, Callable[[Any], core.AbstractValue]] = {} pytype_aval_mappings[core.Unit] = lambda _: core.abstract_unit for _t in array_types: pytype_aval_mappings[_t] = make_shaped_array @@ -571,7 +572,7 @@ def _execute_replicated(compiled, backend, handlers, tuple_args, *args): return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] def _execute_trivial(jaxpr, device, consts, handlers, *args): - env = {core.unitvar : core.unit} + env = {core.unitvar: core.unit} _map(env.setdefault, jaxpr.invars, args) _map(env.setdefault, jaxpr.constvars, consts) outs = [canonicalize_dtype(v.val) if type(v) is Literal else env[v] @@ -614,11 +615,11 @@ def _xla_call_translation_rule(c, axis_env, ### translation tables -translations = {} -parallel_translations = {} -initial_style_translations = {} -call_translations = {} -backend_specific_translations = defaultdict(dict) +translations: Dict[core.Primitive, Callable] = {} +parallel_translations: Dict[core.Primitive, Callable] = {} +initial_style_translations: Dict[core.Primitive, Callable] = {} +call_translations: Dict[core.Primitive, Callable] = {} +backend_specific_translations: Dict[str, Dict[core.Primitive, Callable]] = defaultdict(dict) translations[core.identity_p] = lambda c, x: x call_translations[xla_call_p] = _xla_call_translation_rule @@ -922,7 +923,8 @@ def _force(x): return force_fun(x) @cache() -def _lazy_force_computation(sticky, aval, device, lexpr): +def _lazy_force_computation(sticky, aval, device, lexpr + ) -> Callable[[DeviceValue], DeviceArray]: c = xb.make_computation_builder("lazy_force") if lazy.is_constant(lexpr): param = None @@ -945,6 +947,7 @@ def _lazy_force_computation(sticky, aval, device, lexpr): result_device = device if sticky else None handler = partial(DeviceArray, aval, result_device, lazy.array(aval.shape)) + force_fun: Callable[[DeviceValue], DeviceArray] if lazy.is_constant(lexpr): def force_fun(_): return handler(compiled.Execute([], tuple_arguments=False)[0]) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2bc5868f62c6..3609d64d2f70 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -20,7 +20,7 @@ import itertools import operator import string -from typing import Any +from typing import Any, Callable import warnings import numpy as onp @@ -4456,15 +4456,18 @@ def _const(example, val): return dtypes.scalar_type_of(example)(val) return onp.array(val, _dtype(example)) -_zeros = partial(full_like, fill_value=0) -_zero = partial(full_like, shape=(), fill_value=0) -_ones = partial(full_like, fill_value=1) -_one = partial(full_like, shape=(), fill_value=1) -_twos = partial(full_like, fill_value=2) -_two = partial(full_like, shape=(), fill_value=2) +_zeros: Callable = partial(full_like, fill_value=0) +_zero: Callable = partial(full_like, shape=(), fill_value=0) +_ones: Callable = partial(full_like, fill_value=1) +_one: Callable = partial(full_like, shape=(), fill_value=1) +_twos: Callable = partial(full_like, fill_value=2) +_two: Callable = partial(full_like, shape=(), fill_value=2) -_dtype = dtype = dtypes.result_type -_iscomplex = lambda x: dtypes.issubdtype(_dtype(x), onp.complexfloating) +dtype: Callable = dtypes.result_type +_dtype: Callable = dtypes.result_type + +def _iscomplex(x) -> bool: + return dtypes.issubdtype(_dtype(x), onp.complexfloating) def ranges_like(*xs): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 191a79aee228..3a391c00feb7 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -55,9 +55,9 @@ @cache() def _initial_style_jaxpr(fun: Callable, in_tree, in_avals): in_pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] - fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) - jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=True, - stage_out_calls=True) + wrapped_fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) + jaxpr, out_pvals, consts = pe.trace_to_jaxpr( + wrapped_fun, in_pvals, instantiate=True, stage_out_calls=True) out_avals = _map(raise_to_shaped, unzip2(out_pvals)[0]) const_avals = tuple(raise_to_shaped(core.get_aval(c)) for c in consts) typed_jaxpr = core.TypedJaxpr(pe.convert_constvars_jaxpr(jaxpr), diff --git a/jax/lax/lax_fft.py b/jax/lax/lax_fft.py index 269b68ea827e..091dc4426d49 100644 --- a/jax/lax/lax_fft.py +++ b/jax/lax/lax_fft.py @@ -27,6 +27,10 @@ from ..interpreters import ad from ..interpreters import batching +__all__ = [ + "fft", + "fft_p", +] def _promote_to_complex(arg): dtype = onp.result_type(arg, onp.complex64) @@ -133,3 +137,4 @@ def fft_batching_rule(batched_args, batch_dims, fft_type, fft_lengths): xla.translations[fft_p] = fft_translation_rule ad.deflinear(fft_p, fft_transpose_rule) batching.primitive_batchers[fft_p] = fft_batching_rule + diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 9d4fabd8dde7..1c8ff20f624d 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -322,7 +322,7 @@ def _translate(val): partial(_allreduce_split_axis_rule, psum_p, lax._reduce_sum) xla.parallel_translations[psum_p] = _psum_translation_rule pxla.parallel_pure_rules[psum_p] = lambda *args, shape: (x * prod(shape) for x in args) -ad.deflinear(psum_p, lambda *ts, axis_name: psum(*ts, axis_name)) +ad.deflinear(psum_p, lambda ts, axis_name: psum(ts, axis_name=axis_name)) pxla.multi_host_supported_collectives.add(psum_p) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index 741fbb9a218a..ea26e8f0f35f 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -14,7 +14,6 @@ # limitations under the License. -from functools import partial import numpy as onp from jax.numpy import lax_numpy as np diff --git a/jax/lazy.py b/jax/lazy.py index 624731aa25e6..26436d27204a 100644 --- a/jax/lazy.py +++ b/jax/lazy.py @@ -38,7 +38,7 @@ def __str__(self): return '{}{}'.format(name, tuple.__str__(self[1:])) class_namespace = {'__new__' : __new__, '__str__': __str__} for i, f in enumerate(fields): - class_namespace[f] = property(op.itemgetter(i+1)) + class_namespace[f] = property(op.itemgetter(i+1)) # type: ignore return type(name, (tuple,), class_namespace) diff --git a/jax/lib/xla_bridge.py b/jax/lib/xla_bridge.py index 1d8fe76bcf14..3eaed178f7bc 100644 --- a/jax/lib/xla_bridge.py +++ b/jax/lib/xla_bridge.py @@ -22,6 +22,7 @@ from functools import partial import os +from typing import Callable, Dict import warnings from absl import logging @@ -329,7 +330,7 @@ def make_computation_builder(name): def register_constant_handler(type_, handler_fun): _constant_handlers[type_] = handler_fun -_constant_handlers = {} +_constant_handlers: Dict[type, Callable] = {} def _ndarray_constant_handler(c, val, canonicalize_types=True): diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index f951dd3abc23..cccdf8c7c3dc 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -89,7 +89,7 @@ # the ndarray class to have a metaclass with special __instancecheck__ behavior. _arraylike_types = (onp.ndarray, UnshapedArray, DeviceArray) -class _ArrayMeta(type(onp.ndarray)): +class _ArrayMeta(type(onp.ndarray)): # type: ignore """Metaclass for overriding ndarray isinstance checks.""" def __instancecheck__(self, instance): @@ -172,7 +172,6 @@ def _make_scalar_type(onp_scalar_type): dtype = onp.dtype can_cast = dtypes.can_cast issubsctype = dtypes.issubsctype -result_type = dtypes.result_type promote_types = dtypes.promote_types ComplexWarning = onp.ComplexWarning diff --git a/jax/numpy/vectorize.py b/jax/numpy/vectorize.py index 2ae454bb8c48..cc19b20fb3e0 100644 --- a/jax/numpy/vectorize.py +++ b/jax/numpy/vectorize.py @@ -52,9 +52,10 @@ def _parse_gufunc_signature( if not re.match(_SIGNATURE, signature): raise ValueError( 'not a valid gufunc signature: {}'.format(signature)) - return tuple([tuple(re.findall(_DIMENSION_NAME, arg)) - for arg in re.findall(_ARGUMENT, arg_list)] - for arg_list in signature.split('->')) + args, retvals = ([tuple(re.findall(_DIMENSION_NAME, arg)) + for arg in re.findall(_ARGUMENT, arg_list)] + for arg_list in signature.split('->')) + return args, retvals def _update_dim_sizes( @@ -62,8 +63,8 @@ def _update_dim_sizes( shape: Tuple[int, ...], core_dims: CoreDims, error_context: str = "", - is_input: bool = False, -): + *, + is_input: bool): """Incrementally check and update core dimension sizes for a single argument. Args: @@ -116,7 +117,7 @@ def _parse_input_dimensions( 'wrong number of positional arguments: expected %r, got %r %s' % (len(input_core_dims), len(args), error_context)) shapes = [] - dim_sizes = {} + dim_sizes: Dict[str, int] = {} for arg, core_dims in zip(args, input_core_dims): _update_dim_sizes(dim_sizes, arg.shape, core_dims, error_context, is_input=True) diff --git a/jax/test_util.py b/jax/test_util.py index e080e5cfe223..372f6a8f00f2 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -18,6 +18,7 @@ import re import itertools as it import os +from typing import Dict, Sequence from unittest import SkipTest from absl.testing import absltest @@ -629,7 +630,7 @@ def assert_dot_precision(expected_precision, fun, *args): assert precision == expected_precision, msg -_CACHED_INDICES = {} +_CACHED_INDICES: Dict[int, Sequence[int]] = {} def cases_from_list(xs): xs = list(xs) diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 000000000000..ce2c0c8c02ac --- /dev/null +++ b/mypy.ini @@ -0,0 +1,12 @@ +[mypy] + +[mypy-absl.*] +ignore_missing_imports = True +[mypy-jaxlib.*] +ignore_missing_imports = True +[mypy-numpy.*] +ignore_missing_imports = True +[mypy-opt_einsum.*] +ignore_missing_imports = True +[mypy-scipy.*] +ignore_missing_imports = True From 2998a2150542af12576c01761809ebe95badf66e Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 19 Mar 2020 06:55:43 +0100 Subject: [PATCH 0907/1053] Updated Common Gotchas (#2435) * Minor update to docs; trigger readthedocs * Updated Common Gotchas notebook Handle errors explicitly, otherwise it is too hard to test the notebook by 'Run all' * Added a section about pure functions to Common Gotchas --- docs/notebooks/Common_Gotchas_in_JAX.ipynb | 5007 ++++++++++---------- 1 file changed, 2617 insertions(+), 2390 deletions(-) diff --git a/docs/notebooks/Common_Gotchas_in_JAX.ipynb b/docs/notebooks/Common_Gotchas_in_JAX.ipynb index 21fa3fc45fd7..e2de3129efe6 100644 --- a/docs/notebooks/Common_Gotchas_in_JAX.ipynb +++ b/docs/notebooks/Common_Gotchas_in_JAX.ipynb @@ -1,2395 +1,2622 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "hjM_sV_AepYf" - }, - "source": [ - "# 🔪 JAX - The Sharp Bits 🔪" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "4k5PVzEo2uJO" - }, - "source": [ - "*levskaya@ mattjj@*\n", - "\n", - "When walking about the countryside of [Italy](https://iaml.it/blog/jax-intro), the people will not hesitate to tell you that __JAX__ has _\"una anima di pura programmazione funzionale\"_.\n", - "\n", - "__JAX__ is a language for __expressing__ and __composing__ __transformations__ of numerical programs. As such it needs to control the _unwanted proliferation_ of __side-effects__ in its programs so that analysis and transformation of its computations remain tractable!\n", - "\n", - "This requires us to write code in a _functional_ style with _explicit_ descriptions of how the state of a program changes, which results in __several important differences__ to how you might be used to programming in Numpy, Tensorflow or Pytorch.\n", - "\n", - "Herein we try to cover the most frequent points of trouble that users encounter when starting out in __JAX__." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "GoK_PCxPeYcy" - }, - "outputs": [], - "source": [ - "import numpy as onp\n", - "from jax import grad, jit\n", - "from jax import lax\n", - "from jax import random\n", - "import jax\n", - "import jax.numpy as np\n", - "import matplotlib as mpl\n", - "from matplotlib import pyplot as plt\n", - "from matplotlib import rcParams\n", - "rcParams['image.interpolation'] = 'nearest'\n", - "rcParams['image.cmap'] = 'viridis'\n", - "rcParams['axes.grid'] = False" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "oBdKtkVW8Lha" - }, - "source": [ - "## 🔪 In-Place Updates" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "JffAqnEW4JEb" - }, - "source": [ - "In Numpy you're used to doing this:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 153 - }, - "colab_type": "code", - "id": "om4xV7_84N9j", - "outputId": "25ed90e1-74f9-420c-ba06-21e5d6a3b58e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "original array:\n", - "[[0. 0. 0.]\n", - " [0. 0. 0.]\n", - " [0. 0. 0.]]\n", - "updated array:\n", - "[[0. 0. 0.]\n", - " [1. 1. 1.]\n", - " [0. 0. 0.]]\n" - ] - } - ], - "source": [ - "numpy_array = onp.zeros((3,3), dtype=np.float32)\n", - "print(\"original array:\")\n", - "print(numpy_array)\n", - "\n", - "# In place, mutating update\n", - "numpy_array[1, :] = 1.0\n", - "print(\"updated array:\")\n", - "print(numpy_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "go3L4x3w4-9p" - }, - "source": [ - "If we try to update a JAX device array in-place, however, we get an __error__! (☉_☉)" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 198 - }, - "colab_type": "code", - "id": "2AxeCufq4wAp", - "outputId": "7013374b-041f-4270-db19-cfb4ab992f52", - "tags": [ - "raises-exception" - ] - }, - "outputs": [ - { - "ename": "TypeError", - "evalue": "ignored", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# In place update of JAX's array will yield an error!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mjax_array\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: '_FilledConstant' object does not support item assignment" - ] - } - ], - "source": [ - "jax_array = np.zeros((3,3), dtype=np.float32)\n", - "\n", - "# In place update of JAX's array will yield an error!\n", - "jax_array[1, :] = 1.0" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "7mo76sS25Wco" - }, - "source": [ - "__What gives?!__ \n", - "\n", - "Allowing mutation of variables in-place makes program analysis and transformation very difficult. JAX requires a pure functional expression of a numerical program. \n", - "\n", - "Instead, JAX offers the _functional_ update functions: [__index_update__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_update.html#jax.ops.index_update), [__index_add__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_add.html#jax.ops.index_add), [__index_min__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_min.html#jax.ops.index_min), [__index_max__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_max.html#jax.ops.index_max), and the [__index__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index.html#jax.ops.index) helper.\n", - "\n", - "️⚠️ inside `jit`'d code and `lax.while_loop` or `lax.fori_loop` the __size__ of slices can't be functions of argument _values_ but only functions of argument _shapes_ -- the slice start indices have no such restriction. See the below __Control Flow__ Section for more information on this limitation." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "m5lg1RYq5D9p" - }, - "outputs": [], - "source": [ - "from jax.ops import index, index_add, index_update" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "X2Xjjvd-l8NL" - }, - "source": [ - "### index_update" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "eM6MyndXL2NY" - }, - "source": [ - "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 221 - }, - "colab_type": "code", - "id": "ygUJT49b7BBk", - "outputId": "c1dc7528-4a4a-4ee6-c9a2-c7e39f95ccb1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "original array:\n", - "[[0. 0. 0.]\n", - " [0. 0. 0.]\n", - " [0. 0. 0.]]\n", - "old array unchanged:\n", - "[[0. 0. 0.]\n", - " [0. 0. 0.]\n", - " [0. 0. 0.]]\n", - "new array:\n", - "[[0. 0. 0.]\n", - " [1. 1. 1.]\n", - " [0. 0. 0.]]\n" - ] - } - ], - "source": [ - "jax_array = np.zeros((3, 3))\n", - "print(\"original array:\")\n", - "print(jax_array)\n", - "\n", - "new_jax_array = index_update(jax_array, index[1, :], 1.)\n", - "\n", - "print(\"old array unchanged:\")\n", - "print(jax_array)\n", - "\n", - "print(\"new array:\")\n", - "print(new_jax_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "7to-sF8EmC_y" - }, - "source": [ - "### index_add" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "iI5cLY1xMBLs" - }, - "source": [ - "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 221 - }, - "colab_type": "code", - "id": "tsw2svao8FUp", - "outputId": "2492b20d-0b8e-4f61-816d-00b8a08ce29f" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "original array:\n", - "[[1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 1. 1. 1.]]\n", - "new array post-addition:\n", - "[[1. 1. 1. 8. 8. 8.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 8. 8. 8.]\n", - " [1. 1. 1. 1. 1. 1.]\n", - " [1. 1. 1. 8. 8. 8.]]\n" - ] - } - ], - "source": [ - "print(\"original array:\")\n", - "jax_array = np.ones((5, 6))\n", - "print(jax_array)\n", - "\n", - "new_jax_array = index_add(jax_array, index[::2, 3:], 7.)\n", - "print(\"new array post-addition:\")\n", - "print(new_jax_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 🔪 Out-of-Bounds Indexing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In Numpy, you are used to errors being thrown when you index an array outside of its bounds, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "tags": [ - "raises-exception" - ] - }, - "outputs": [ - { - "ename": "IndexError", - "evalue": "index 11 is out of bounds for axis 0 with size 10", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0monp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m11\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m: index 11 is out of bounds for axis 0 with size 10" - ] - } - ], - "source": [ - "onp.arange(10)[11]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "However, raising an error on other accelerators can be more difficult. Therefore, JAX does not raise an error and instead returns the last value in the array. " - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "DeviceArray(9, dtype=int32)" - ] - }, - "execution_count": 0, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.arange(10)[11]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "MUycRNh6e50W" - }, - "source": [ - "## 🔪 Random Numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "O8vvaVt3MRG2" - }, - "source": [ - "> _If all scientific papers whose results are in doubt because of bad \n", - "> `rand()`s were to disappear from library shelves, there would be a \n", - "> gap on each shelf about as big as your fist._ - Numerical Recipes" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Qikt9pPW9L5K" - }, - "source": [ - "### RNGs and State\n", - "You're used to _stateful_ pseudorandom number generators (PRNGs) from numpy and other libraries, which helpfully hide a lot of details under the hood to give you a ready fountain of pseudorandomness:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "id": "rr9FeP41fynt", - "outputId": "180b7c87-7050-4123-dc42-2356da6f14a2" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.7117779558041075\n", - "0.014396253746679077\n", - "0.7717174868106601\n" - ] - } - ], - "source": [ - "print(onp.random.random())\n", - "print(onp.random.random())\n", - "print(onp.random.random())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ORMVVGZJgSVi" - }, - "source": [ - "Underneath the hood, numpy uses the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) PRNG to power its pseudorandom functions. The PRNG has a period of $2^{19937-1}$ and at any point can be described by __624 32bit unsigned ints__ and a __position__ indicating how much of this \"entropy\" has been used up." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "7Pyp2ajzfPO2" - }, - "outputs": [], - "source": [ - "onp.random.seed(0)\n", - "rng_state = onp.random.get_state()\n", - "#print(rng_state)\n", - "# --> ('MT19937', array([0, 1, 1812433255, 1900727105, 1208447044,\n", - "# 2481403966, 4042607538, 337614300, ... 614 more numbers..., \n", - "# 3048484911, 1796872496], dtype=uint32), 624, 0, 0.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "aJIxHVXCiM6m" - }, - "source": [ - "This pseudorandom state vector is automagically updated behind the scenes every time a random number is needed, \"consuming\" 2 of the uint32s in the Mersenne twister state vector:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "GAHaDCYafpAF" - }, - "outputs": [], - "source": [ - "_ = onp.random.uniform()\n", - "rng_state = onp.random.get_state()\n", - "#print(rng_state) \n", - "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", - "# ..., 2648828502, 1678096082], dtype=uint32), 2, 0, 0.0)\n", - "\n", - "# Let's exhaust the entropy in this PRNG statevector\n", - "for i in range(311):\n", - " _ = onp.random.uniform()\n", - "rng_state = onp.random.get_state()\n", - "#print(rng_state) \n", - "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", - "# ..., 2648828502, 1678096082], dtype=uint32), 624, 0, 0.0)\n", - "\n", - "# Next call iterates the RNG state for a new batch of fake \"entropy\".\n", - "_ = onp.random.uniform()\n", - "rng_state = onp.random.get_state()\n", - "# print(rng_state) \n", - "# --> ('MT19937', array([1499117434, 2949980591, 2242547484, \n", - "# 4162027047, 3277342478], dtype=uint32), 2, 0, 0.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "N_mWnleNogps" - }, - "source": [ - "The problem with magic PRNG state is that it's hard to reason about how it's being used and updated across different threads, processes, and devices, and it's _very easy_ to screw up when the details of entropy production and consumption are hidden from the end user.\n", - "\n", - "The Mersenne Twister PRNG is also known to have a [number](https://cs.stackexchange.com/a/53475) of problems, it has a large 2.5Kb state size, which leads to problematic [initialization issues](https://dl.acm.org/citation.cfm?id=1276928). It [fails](http://www.pcg-random.org/pdf/toms-oneill-pcg-family-v1.02.pdf) modern BigCrush tests, and is generally slow. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Uvq7nV-j4vKK" - }, - "source": [ - "### JAX PRNG" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "COjzGBpO4tzL" - }, - "source": [ - "\n", - "JAX instead implements an _explicit_ PRNG where entropy production and consumption are handled by explicitly passing and iterating PRNG state. JAX uses a modern [Three-fry counter-based PRNG](https://github.com/google/jax/blob/master/design_notes/prng.md) that's __splittable__. That is, its design allows us to __fork__ the PRNG state into new PRNGs for use with parallel stochastic generation.\n", - "\n", - "The random state is described by two unsigned-int32s that we call a __key__:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "yPHE7KTWgAWs", - "outputId": "6c2db189-d971-4d60-eb6b-c7ee3a4704b7" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0, 0], dtype=uint32)" - ] - }, - "execution_count": 196, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "from jax import random\n", - "key = random.PRNGKey(0)\n", - "key" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "XjYyWYNfq0hW" - }, - "source": [ - "JAX's random functions produce pseudorandom numbers from the PRNG state, but __do not__ change the state! \n", - "\n", - "Reusing the same state will cause __sadness__ and __monotony__, depriving the enduser of __lifegiving chaos__:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "id": "7zUdQMynoE5e", - "outputId": "9e1e1f08-19c9-4d22-c78f-4d3e113e185d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[-0.20584233]\n", - "[0 0]\n", - "[-0.20584233]\n", - "[0 0]\n" - ] - } - ], - "source": [ - "print(random.normal(key, shape=(1,)))\n", - "print(key)\n", - "# No no no!\n", - "print(random.normal(key, shape=(1,)))\n", - "print(key)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "hQN9van8rJgd" - }, - "source": [ - "Instead, we __split__ the PRNG to get usable __subkeys__ every time we need a new pseudorandom number:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "id": "ASj0_rSzqgGh", - "outputId": "ea3fae99-6642-4016-b0c0-938214384fe7" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "old key [0 0]\n", - " \\---SPLIT --> new key [4146024105 967050713]\n", - " \\--> new subkey [2718843009 1272950319] --> normal [-1.2515389]\n" - ] - } - ], - "source": [ - "print(\"old key\", key)\n", - "key, subkey = random.split(key)\n", - "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", - "print(\" \\---SPLIT --> new key \", key)\n", - "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "tqtFVE4MthO3" - }, - "source": [ - "We propagate the __key__ and make new __subkeys__ whenever we need a new random number:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "id": "jbC34XLor2Ek", - "outputId": "436713d1-06a3-408e-fbaa-1fedeea73c73" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "old key [4146024105 967050713]\n", - " \\---SPLIT --> new key [2384771982 3928867769]\n", - " \\--> new subkey [1278412471 2182328957] --> normal [-0.5866507]\n" - ] - } - ], - "source": [ - "print(\"old key\", key)\n", - "key, subkey = random.split(key)\n", - "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", - "print(\" \\---SPLIT --> new key \", key)\n", - "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "0KLYUluz3lN3" - }, - "source": [ - "We can generate more than one __subkey__ at a time:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "id": "lEi08PJ4tfkX", - "outputId": "7599b43d-930e-4c20-d549-b7694281a59a" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[-0.37533447]\n", - "[0.9864503]\n", - "[0.1455319]\n" - ] - } - ], - "source": [ - "key, *subkeys = random.split(key, 4)\n", - "for subkey in subkeys:\n", - " print(random.normal(subkey, shape=(1,)))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "rg4CpMZ8c3ri" - }, - "source": [ - "## 🔪 Control Flow" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "izLTvT24dAq0" - }, - "source": [ - "### ✔ python control_flow + autodiff ✔\n", - "\n", - "If you just want to apply `grad` to your python functions, you can use regular python control-flow constructs with no problems, as if you were using [Autograd](https://github.com/hips/autograd) (or Pytorch or TF Eager)." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 51 - }, - "colab_type": "code", - "id": "aAx0T3F8lLtu", - "outputId": "1f75bb41-2d50-451e-c05d-cb946b580d8d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12.0\n", - "-4.0\n" - ] - } - ], - "source": [ - "def f(x):\n", - " if x < 3:\n", - " return 3. * x ** 2\n", - " else:\n", - " return -4 * x\n", - "\n", - "print(grad(f)(2.)) # ok!\n", - "print(grad(f)(4.)) # ok!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "hIfPT7WMmZ2H" - }, - "source": [ - "### python control flow + JIT\n", - "\n", - "Using control flow with `jit` is more complicated, and by default it has more constraints.\n", - "\n", - "This works:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "OZ_BJX0CplNC", - "outputId": "d75b0e66-273d-461a-814d-a95c40d41ef4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "24\n" - ] - } - ], - "source": [ - "@jit\n", - "def f(x):\n", - " for i in range(3):\n", - " x = 2 * x\n", - " return x\n", - "\n", - "print(f(3))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "22RzeJ4QqAuX" - }, - "source": [ - "So does this:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "pinVnmRWp6w6", - "outputId": "f7829934-8cdd-4bba-b540-d9df38c71e95" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6.0\n" - ] - } - ], - "source": [ - "@jit\n", - "def g(x):\n", - " y = 0.\n", - " for i in range(x.shape[0]):\n", - " y = y + x[i]\n", - " return y\n", - "\n", - "print(g(np.array([1., 2., 3.])))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "TStltU2dqf8A" - }, - "source": [ - "But this doesn't, at least by default:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 54 - }, - "colab_type": "code", - "id": "9z38AIKclRNM", - "outputId": "f911fb55-f489-4300-f9b1-9142d252f3f9" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ERROR: Abstract value passed to `bool`, which requires a concrete value. The function to be transformed can't be traced at the required level of abstraction. If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions instead.\n" - ] - } - ], - "source": [ - "@jit\n", - "def f(x):\n", - " if x < 3:\n", - " return 3. * x ** 2\n", - " else:\n", - " return -4 * x\n", - "\n", - "# This will fail!\n", - "try:\n", - " f(2)\n", - "except Exception as e:\n", - " print(\"ERROR:\", e)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "pIbr4TVPqtDN" - }, - "source": [ - "__What gives!?__\n", - "\n", - "When we `jit`-compile a function, we usually want to compile a version of the function that works for many different argument values, so that we can cache and reuse the compiled code. That way we don't have to re-compile on each function evaluation.\n", - "\n", - "For example, if we evaluate an `@jit` function on the array `np.array([1., 2., 3.], np.float32)`, we might want to compile code that we can reuse to evaluate the function on `np.array([4., 5., 6.], np.float32)` to save on compile time.\n", - "\n", - "To get a view of your Python code that is valid for many different argument values, JAX traces it on _abstract values_ that represent sets of possible inputs. There are [multiple different levels of abstraction](https://github.com/google/jax/blob/master/jax/abstract_arrays.py), and different transformations use different abstraction levels.\n", - "\n", - "By default, `jit` traces your code on the `ShapedArray` abstraction level, where each abstract value represents the set of all array values with a fixed shape and dtype. For example, if we trace using the abstract value `ShapedArray((3,), np.float32)`, we get a view of the function that can be reused for any concrete value in the corresponding set of arrays. That means we can save on compile time.\n", - "\n", - "But there's a tradeoff here: if we trace a Python function on a `ShapedArray((), np.float32)` that isn't committed to a specific concrete value, when we hit a line like `if x < 3`, the expression `x < 3` evaluates to an abstract `ShapedArray((), np.bool_)` that represents the set `{True, False}`. When Python attempts to coerce that to a concrete `True` or `False`, we get an error: we don't know which branch to take, and can't continue tracing! The tradeoff is that with higher levels of abstraction we gain a more general view of the Python code (and thus save on re-compilations), but we require more constraints on the Python code to complete the trace.\n", - "\n", - "The good news is that you can control this tradeoff yourself. By having `jit` trace on more refined abstract values, you can relax the traceability constraints. For example, using the `static_argnums` argument to `jit`, we can specify to trace on concrete values of some arguments. Here's that example function again:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "-Tzp0H7Bt1Sn", - "outputId": "1435a6a3-2b1c-4acd-be81-c1361021f3c4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12.0\n" - ] - } - ], - "source": [ - "def f(x):\n", - " if x < 3:\n", - " return 3. * x ** 2\n", - " else:\n", - " return -4 * x\n", - "\n", - "f = jit(f, static_argnums=(0,))\n", - "\n", - "print(f(2.))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "MHm1hIQAvBVs" - }, - "source": [ - "Here's another example, this time involving a loop:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "iwY86_JKvD6b", - "outputId": "469a4aeb-2dbd-4f03-9aef-9fd646a717d7" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(5., dtype=float32)" - ] - }, - "execution_count": 206, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "def f(x, n):\n", - " y = 0.\n", - " for i in range(n):\n", - " y = y + x[i]\n", - " return y\n", - "\n", - "f = jit(f, static_argnums=(1,))\n", - "\n", - "f(np.array([2., 3., 4.]), 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "nSPTOX8DvOeO" - }, - "source": [ - "In effect, the loop gets statically unrolled. JAX can also trace at _higher_ levels of abstraction, like `Unshaped`, but that's not currently the default for any transformation" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "wWdg8LTYwCW3" - }, - "source": [ - "️⚠️ **functions with argument-__value__ dependent shapes**\n", - "\n", - "These control-flow issues also come up in a more subtle way: numerical functions we want to __jit__ can't specialize the shapes of internal arrays on argument _values_ (specializing on argument __shapes__ is ok). As a trivial example, let's make a function whose output happens to depend on the input variable `length`." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "colab_type": "code", - "id": "Tqe9uLmUI_Gv", - "outputId": "dbb43bac-8141-40a3-c760-95656181b598" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[4. 4. 4. 4. 4.]\n", - "error! `full` requires shapes to be concrete. If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions instead.\n", - "[4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]\n", - "[4. 4. 4. 4. 4.]\n" - ] - } - ], - "source": [ - "def example_fun(length, val):\n", - " return np.ones((length,)) * val\n", - "# un-jit'd works fine\n", - "print(example_fun(5, 4))\n", - "\n", - "bad_example_jit = jit(example_fun)\n", - "# this will fail:\n", - "try:\n", - " print(bad_example_jit(10, 4))\n", - "except Exception as e:\n", - " print(\"error!\", e)\n", - "# static_argnums tells JAX to recompile on changes at these argument positions:\n", - "good_example_jit = jit(example_fun, static_argnums=(0,))\n", - "# first compile\n", - "print(good_example_jit(10, 4))\n", - "# recompiles\n", - "print(good_example_jit(5, 4))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "MStx_r2oKxpp" - }, - "source": [ - "`static_argnums` can be handy if `length` in our example rarely changes, but it would be disastrous if it changed a lot! \n", - "\n", - "Lastly, if your function has global side-effects, JAX's tracer can cause weird things to happen. A common gotcha is trying to print arrays inside __jit__'d functions: " - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "accelerator": "GPU", "colab": { - "base_uri": "https://localhost:8080/", - "height": 68 - }, - "colab_type": "code", - "id": "m2ABpRd8K094", - "outputId": "06fe7d4e-2c59-4499-c04e-94166916be74" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Traced\n", - "Traced\n" - ] - }, - { - "data": { - "text/plain": [ - "array(4, dtype=int32)" - ] - }, - "execution_count": 12, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "@jit\n", - "def f(x):\n", - " print(x)\n", - " y = 2 * x\n", - " print(y)\n", - " return y\n", - "f(2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "uCDcWG4MnVn-" - }, - "source": [ - "### Structured control flow primitives\n", - "\n", - "There are more options for control flow in JAX. Say you want to avoid re-compilations but still want to use control flow that's traceable, and that avoids un-rolling large loops. Then you can use these 4 structured control flow primitives:\n", - "\n", - " - `lax.cond` _differentiable_\n", - " - `lax.while_loop` __fwd-mode-differentiable__\n", - " - `lax.fori_loop` __fwd-mode-differentiable__\n", - " - `lax.scan` _differentiable_\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Sd9xrLMXeK3A" - }, - "source": [ - "#### cond\n", - "python equivalent:\n", - "\n", - "```\n", - "def cond(pred, true_operand, true_fun, false_operand, false_fun):\n", - " if pred:\n", - " return true_fun(true_operand)\n", - " else:\n", - " return false_fun(false_operand)\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "SGxz9JOWeiyH", - "outputId": "b91c6e01-c3a7-41a0-b4d2-f815f273c8a7" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-1.], dtype=float32)" - ] - }, - "execution_count": 207, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "from jax import lax\n", - "\n", - "operand = np.array([0.])\n", - "lax.cond(True, operand, lambda x: x+1, operand, lambda x: x-1)\n", - "# --> array([1.], dtype=float32)\n", - "lax.cond(False, operand, lambda x: x+1, operand, lambda x: x-1)\n", - "# --> array([-1.], dtype=float32)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "xkOFAw24eOMg" - }, - "source": [ - "#### while_loop\n", - "\n", - "python equivalent:\n", - "```\n", - "def while_loop(cond_fun, body_fun, init_val):\n", - " val = init_val\n", - " while cond_fun(val):\n", - " val = body_fun(val)\n", - " return val\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "jM-D39a-c436", - "outputId": "496ba1d8-e1d9-4432-d44b-c1104e1e966d" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(10, dtype=int32)" - ] - }, - "execution_count": 208, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "init_val = 0\n", - "cond_fun = lambda x: x<10\n", - "body_fun = lambda x: x+1\n", - "lax.while_loop(cond_fun, body_fun, init_val)\n", - "# --> array(10, dtype=int32)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "apo3n3HAeQY_" - }, - "source": [ - "#### fori_loop\n", - "python equivalent:\n", - "```\n", - "def fori_loop(start, stop, body_fun, init_val):\n", - " val = init_val\n", - " for i in range(start, stop):\n", - " val = body_fun(i, val)\n", - " return val\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "dt3tUpOmeR8u", - "outputId": "3155b3ce-589c-437c-a456-de81b3db0a64" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(45, dtype=int32)" - ] - }, - "execution_count": 209, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" - } - ], - "source": [ - "init_val = 0\n", - "start = 0\n", - "stop = 10\n", - "body_fun = lambda i,x: x+i\n", - "lax.fori_loop(start, stop, body_fun, init_val)\n", - "# --> array(45, dtype=int32)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "SipXS5qiqk8e" - }, - "source": [ - "#### Summary\n", - "\n", - "$$\n", - "\\begin{array} {r|rr} \n", - "\\hline \\\n", - "\\textrm{construct} \n", - "& \\textrm{jit} \n", - "& \\textrm{grad} \\\\\n", - "\\hline \\\n", - "\\textrm{if} & ❌ & ✔ \\\\\n", - "\\textrm{for} & ✔* & ✔\\\\\n", - "\\textrm{while} & ✔* & ✔\\\\\n", - "\\textrm{lax.cond} & ✔ & ✔\\\\\n", - "\\textrm{lax.while_loop} & ✔ & \\textrm{fwd}\\\\\n", - "\\textrm{lax.fori_loop} & ✔ & \\textrm{fwd}\\\\\n", - "\\textrm{lax.scan} & ✔ & ✔\\\\\n", - "\\hline\n", - "\\end{array}\n", - "$$\n", - "

    $\\ast$ = argument-__value__-independent loop condition - unrolls the loop
    " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "bxuUjFVG-v1h" - }, - "source": [ - "## 🔪 Convolutions" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "0pcn2LeS-03b" - }, - "source": [ - "JAX and XLA offer the very general N-dimensional __conv_general_dilated__ function, but it's not very obvious how to use it. We'll give some examples of the common use-cases. There are also the convenience functions `lax.conv` and `lax.conv_general_padding` for the most common kinds of convolutions.\n", - "\n", - "A survey of the family of convolutional operators, [a guide to convolutional arithmetic](https://arxiv.org/abs/1603.07285) is highly recommended reading!\n", - "\n", - "Let's define a simple diagonal edge kernel:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - }, - "colab_type": "code", - "id": "Yud1Y3ss-x1K", - "outputId": "1674482b-501a-43eb-91c6-0bef42a73d6d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Edge Conv kernel:\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAADe5JREFUeJzt3X+snmV9x/H3Zy1gJkwqJdKUKj+j\nc24GPEGUxTRDEySGLpEl8IeC0XQ4yZRoMtQEE5Nl6h8uYxpJA0RYDDaCgeNSQ2DAcFmKVFIohSCF\nuLS1EyyuyHSysu/+ODfm8XB+9Xru8zzP0fcrefJc931f576+vdp8ev9sU1VI0pH6vXEXIGllMjwk\nNTE8JDUxPCQ1MTwkNTE8JDUZKjySvDbJXUme7L7XzNPvpSQ7u8/0MGNKmgwZ5jmPJF8CnquqLyS5\nGlhTVX8zR78XqurYIeqUNGGGDY8ngI1VdSDJOuC+qnrjHP0MD+m3zLDh8V9VdXzXDvCzl5dn9TsM\n7AQOA1+oqtvn2d9mYDPAq38/b3vTGUc31ybt+tmJ4y5h4r24d99Pq6ppolYv1iHJ3cBJc2z67OBC\nVVWS+ZLoDVW1P8lpwD1JdlXVU7M7VdUWYAvA1FtfVd+/c8OivwBpPqdvvWLcJUy8H33iU//R+rOL\nhkdVvXu+bUl+kmTdwGnLM/PsY3/3/XSS+4CzgFeEh6SVY9hbtdPAZV37MuCO2R2SrElyTNdeC5wH\nPDbkuJLGbNjw+ALwniRPAu/ulkkyleT6rs8fAjuSPAzcy8w1D8NDWuEWPW1ZSFUdBM6fY/0O4CNd\n+9+BPx5mHEmTxydMJTUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwk\nNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1\nMTwkNeklPJJckOSJJHuSXD3H9mOSbO22P5DklD7GlTQ+Q4dHklXAV4H3Am8GLk3y5lndPgz8rKrO\nAP4e+OKw40oarz6OPM4B9lTV01X1IvBNYNOsPpuAm7r2rcD5SdLD2JLGpI/wWA/sHVje162bs09V\nHQYOASf0MLakMZmoC6ZJNifZkWTHswdfGnc5khbQR3jsBzYMLJ/crZuzT5LVwGuAg7N3VFVbqmqq\nqqZOPGFVD6VJWi59hMeDwJlJTk1yNHAJMD2rzzRwWde+GLinqqqHsSWNyephd1BVh5NcCdwJrAJu\nrKrdST4P7KiqaeAG4J+S7AGeYyZgJK1gQ4cHQFVtA7bNWnfNQPt/gL/oYyxJk2GiLphKWjkMD0lN\nDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0M\nD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU16CY8kFyR5Isme\nJFfPsf3yJM8m2dl9PtLHuJLGZ/WwO0iyCvgq8B5gH/BgkumqemxW161VdeWw40maDH0ceZwD7Kmq\np6vqReCbwKYe9itpgg195AGsB/YOLO8D3j5Hv/cneRfwQ+Cqqto7u0OSzcBmgNev76O0316nb71i\n3CVMvDOu2j7uEibej4b42VFdMP0OcEpV/QlwF3DTXJ2qaktVTVXV1IknrBpRaZJa9BEe+4ENA8sn\nd+t+raoOVtWvusXrgbf1MK6kMeojPB4EzkxyapKjgUuA6cEOSdYNLF4EPN7DuJLGaOgLC1V1OMmV\nwJ3AKuDGqtqd5PPAjqqaBv46yUXAYeA54PJhx5U0Xr1clayqbcC2WeuuGWh/Gvh0H2NJmgw+YSqp\nieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ\n4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIalJL+GR5MYkzyR5\ndJ7tSXJtkj1JHklydh/jShqfvo48vg5csMD29wJndp/NwNd6GlfSmPQSHlV1P/DcAl02ATfXjO3A\n8UnW9TG2pPEY1TWP9cDegeV93brfkGRzkh1Jdjx78KURlSapxURdMK2qLVU1VVVTJ56watzlSFrA\nqMJjP7BhYPnkbp2kFWpU4TENfLC763IucKiqDoxobEnLYHUfO0lyC7ARWJtkH/A54CiAqroO2AZc\nCOwBfgF8qI9xJY1PL+FRVZcusr2Aj/UxlqTJMFEXTCWtHIaHpCaGh6QmhoekJoaHpCaGh6Qmhoek\nJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6Qm\nhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmvYRHkhuTPJPk0Xm2b0xyKMnO7nNNH+NKGp9e/qNr4OvA\nV4CbF+jzvap6X0/jSRqzXo48qup+4Lk+9iVpZejryGMp3pHkYeDHwKeqavfsDkk2A5sBVq1Zw+lb\nrxhheSvLGVdtH3cJ+h03qgumDwFvqKq3Av8I3D5Xp6raUlVTVTW16thXj6g0SS1GEh5V9XxVvdC1\ntwFHJVk7irElLY+RhEeSk5Kka5/TjXtwFGNLWh69XPNIcguwEVibZB/wOeAogKq6DrgY+GiSw8Av\ngUuqqvoYW9J49BIeVXXpItu/wsytXEm/JXzCVFITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NS\nE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1IT\nw0NSE8NDUhPDQ1ITw0NSE8NDUpOhwyPJhiT3Jnksye4kH5+jT5Jcm2RPkkeSnD3suJLGq4//6Pow\n8MmqeijJccAPktxVVY8N9HkvcGb3eTvwte5b0go19JFHVR2oqoe69s+Bx4H1s7ptAm6uGduB45Os\nG3ZsSePT6zWPJKcAZwEPzNq0Htg7sLyPVwaMpBWkt/BIcixwG/CJqnq+cR+bk+xIsuOlF/67r9Ik\nLYNewiPJUcwExzeq6ttzdNkPbBhYPrlb9xuqaktVTVXV1KpjX91HaZKWSR93WwLcADxeVV+ep9s0\n8MHursu5wKGqOjDs2JLGp4+7LecBHwB2JdnZrfsM8HqAqroO2AZcCOwBfgF8qIdxJY3R0OFRVf8G\nZJE+BXxs2LEkTQ6fMJXUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTw\nkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ\n1MTwkNTE8JDUZOjwSLIhyb1JHkuyO8nH5+izMcmhJDu7zzXDjitpvFb3sI/DwCer6qEkxwE/SHJX\nVT02q9/3qup9PYwnaQIMfeRRVQeq6qGu/XPgcWD9sPuVNNlSVf3tLDkFuB94S1U9P7B+I3AbsA/4\nMfCpqto9x89vBjZ3i28BHu2tuH6sBX467iIGWM/CJq0emLya3lhVx7X8YG/hkeRY4F+Bv62qb8/a\n9gfA/1XVC0kuBP6hqs5cZH87qmqql+J6Mmk1Wc/CJq0emLyahqmnl7stSY5i5sjiG7ODA6Cqnq+q\nF7r2NuCoJGv7GFvSePRxtyXADcDjVfXlefqc1PUjyTnduAeHHVvS+PRxt+U84APAriQ7u3WfAV4P\nUFXXARcDH01yGPglcEktfr60pYfa+jZpNVnPwiatHpi8mprr6fWCqaTfHT5hKqmJ4SGpycSER5LX\nJrkryZPd95p5+r008Jj79DLUcUGSJ5LsSXL1HNuPSbK12/5A92zLslpCTZcneXZgXj6yjLXcmOSZ\nJHM+g5MZ13a1PpLk7OWq5QhqGtnrEUt8XWOkc7Rsr5BU1UR8gC8BV3ftq4EvztPvhWWsYRXwFHAa\ncDTwMPDmWX3+Criua18CbF3meVlKTZcDXxnR79O7gLOBR+fZfiHwXSDAucADE1DTRuCfRzQ/64Cz\nu/ZxwA/n+P0a6RwtsaYjnqOJOfIANgE3de2bgD8fQw3nAHuq6umqehH4ZlfXoME6bwXOf/k29Bhr\nGpmquh94boEum4Cba8Z24Pgk68Zc08jU0l7XGOkcLbGmIzZJ4fG6qjrQtf8TeN08/V6VZEeS7Un6\nDpj1wN6B5X28cpJ/3aeqDgOHgBN6ruNIawJ4f3cIfGuSDctYz2KWWu+ovSPJw0m+m+SPRjFgd0p7\nFvDArE1jm6MFaoIjnKM+nvNYsiR3AyfNsemzgwtVVUnmu4f8hqran+Q04J4ku6rqqb5rXWG+A9xS\nVb9K8pfMHBn92ZhrmiQPMfPn5uXXI24HFnw9Yljd6xq3AZ+ogfe8xmmRmo54jkZ65FFV766qt8zx\nuQP4ycuHbt33M/PsY3/3/TRwHzMp2pf9wODf2id36+bsk2Q18BqW92nZRWuqqoNV9atu8XrgbctY\nz2KWMocjVSN+PWKx1zUYwxwtxyskk3TaMg1c1rUvA+6Y3SHJmiTHdO21zDzdOvvfDRnGg8CZSU5N\ncjQzF0Rn39EZrPNi4J7qrjgtk0VrmnW+fBEz57TjMg18sLujcC5waOB0dCxG+XpEN86Cr2sw4jla\nSk1NczSKK9BLvCJ8AvAvwJPA3cBru/VTwPVd+53ALmbuOOwCPrwMdVzIzNXop4DPdus+D1zUtV8F\nfAvYA3wfOG0Ec7NYTX8H7O7m5V7gTctYyy3AAeB/mTlX/zBwBXBFtz3AV7tadwFTI5ifxWq6cmB+\ntgPvXMZa/hQo4BFgZ/e5cJxztMSajniOfDxdUpNJOm2RtIIYHpKaGB6SmhgekpoYHpKaGB6Smhge\nkpr8P9IpB0Tn+nMHAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "# 2D kernel - HWIO layout\n", - "kernel = onp.zeros((3, 3, 3, 3), dtype=np.float32)\n", - "kernel += onp.array([[1, 1, 0],\n", - " [1, 0,-1],\n", - " [0,-1,-1]])[:, :, onp.newaxis, onp.newaxis]\n", - "\n", - "print(\"Edge Conv kernel:\")\n", - "plt.imshow(kernel[:, :, 0, 0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "dITPaPdh_cMI" - }, - "source": [ - "And we'll make a simple synthetic image:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - }, - "colab_type": "code", - "id": "cpbGsIGa_Qyx", - "outputId": "44f0c042-3c74-4f39-9ed2-cd651cbc13fc" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original Image:\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "# NHWC layout\n", - "img = onp.zeros((1, 200, 198, 3), dtype=np.float32)\n", - "for k in range(3):\n", - " x = 30 + 60*k\n", - " y = 20 + 60*k\n", - " img[0, x:x+10, y:y+10, k] = 1.0\n", - "\n", - "print(\"Original Image:\")\n", - "plt.imshow(img[0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "_m90y74OWorG" - }, - "source": [ - "### lax.conv and lax.conv_with_general_padding" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Pv9_QPDnWssM" - }, - "source": [ - "These are the simple convenience functions for convolutions\n", - "\n", - "️⚠️ The convenience `lax.conv`, `lax.conv_with_general_padding` helper function assume __NCHW__ images and __OIHW__ kernels." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "kppxbxpZW0nb", - "outputId": "2c872f2b-b71a-4821-d870-0b3a4f1eeee9" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 3, 200, 198)\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAJCCAYAAAAlTAh6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGXdJREFUeJzt3X+spndZ5/HPtTPaxKmbtjvdpkKh\nhZQGNd2CYyVRCLtIbYmh4h/Qxigq2UICxGZNFDRZiImJq1a7ullMCQ2Q1AIuVhvTKl3WlWxilSk2\nY6EMTLEN0x3aDgWxxbB2uPaPc81wZjjTDnPOc55hzuuVnJz7+T4/7u/cuc/0Pff3eU6ruwMAQPKv\nlj0BAIBThTACABjCCABgCCMAgCGMAACGMAIAGMIIAGAsLIyq6sqq2ltV+6rqbYvaDwDARqlF/ILH\nqtqW5DNJXplkf5KPJ7m2uz+14TsDANgg2xf0upcn2dfdn0uSqvpAkquTrBlG287c0dvPOWdBUwEA\ntrKnHn88h554sk7ksYsKo2cl+fyq2/uT/NBxJ3HOOfmeX7x+QVMBALay/3vDjSf82KW9+bqqrquq\n3VW1+9ATTy5rGgAARywqjB5OcsGq28+esSO6+6bu3tXdu7aduWNB0wAAOHGLCqOPJ7m4qi6qqu9M\nck2S2xe0LwCADbGQ9xh191NV9ZYkf5FkW5Kbu/uTi9gXAMBGWdSbr9PddyS5Y1GvDwCw0fzmawCA\nIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYw\nAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggA\nYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAh\njAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjAC\nABjCCABgCCMAgCGMAACGMAIAGCcdRlV1QVX9ZVV9qqo+WVW/MOPvrKqHq+re+XrVxk0XAGBxtq/j\nuU8l+cXu/kRVfXeSe6rqrrnvd7v7t9c/PQCAzXPSYdTdB5IcmO1/qqr7kzxroyYGALDZNuQ9RlV1\nYZIXJfmbGXpLVe2pqpur6uyN2AcAwKKtO4yq6swkH05yfXd/Jcm7kjw/yWVZuaJ0w3Ged11V7a6q\n3YeeeHK90wAAWLd1hVFVfUdWouiW7v7jJOnuR7r7UHd/Pcm7k1y+1nO7+6bu3tXdu7aduWM90wAA\n2BDr+VRaJXlPkvu7+3dWjZ+/6mGvSXLfyU8PAGDzrOdTaT+c5KeT/H1V3Ttjv5Lk2qq6LEkneTDJ\nG9c1QwCATbKeT6X9nyS1xl13nPx0AACWx2++BgAYwggAYAgjAIAhjAAAxno+lcZxnHX/ynvSd+5Z\n/C+uPHjpN34H1Jdf2AvfHwCczlwxAgAYwggAYFhKW4AjS2h37/nG4EsuXci+Vi+fnXvJwSTJY3t3\nLmRfAHC6c8UIAGC4YrRIq64S7Xvddy1kF9dfcec3jd2496qF7AsATneuGAEADGEEADCEEQDAEEYA\nAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAM\nYQQAMIQRAMAQRgAAQxgBAIzty57A6ejgpTuSJF9+YR8Zu/6KOxeyr7ee/dCR7d//0nMXsg8A2Cpc\nMQIAGMIIAGBYSluAw0to515ycOH7Wr18dstDP7jw/QHA6cwVIwCAIYwAAIaltAV6bO/OI9s37r1q\niTMBAE6EK0YAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA\nEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABj+3pfoKoeTPJPSQ4leaq7d1XV\nOUk+mOTCJA8meW13f2m9+wIAWKSNumL077v7su7eNbffluSj3X1xko/ObQCAU9qiltKuTvK+2X5f\nkp9Y0H4AADbMRoRRJ/lIVd1TVdfN2HndfWC2v5DkvGOfVFXXVdXuqtp96IknN2AaAADrs+73GCX5\nke5+uKr+bZK7qurTq+/s7q6qPvZJ3X1TkpuS5IznXPBN9wMAbLZ1XzHq7ofn+6NJbktyeZJHqur8\nJJnvj653PwAAi7auMKqqHVX13Ye3k1yR5L4ktyd5/Tzs9Un+dD37AQDYDOtdSjsvyW1Vdfi1/rC7\n/7yqPp7kQ1X1hiQPJXntOvcDALBw6wqj7v5ckn+3xvgXk7xiPa8NALDZ/OZrAIAhjAAAhjACABjC\nCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMA\ngCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACG\nMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMII\nAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCA\nIYwAAIYwAgAY20/2iVV1SZIPrhp6XpL/nOSsJP8xyWMz/ivdfcdJzxAAYJOcdBh1994klyVJVW1L\n8nCS25L8XJLf7e7f3pAZAgBsko1aSntFkge6+6ENej0AgE23UWF0TZJbV91+S1Xtqaqbq+rstZ5Q\nVddV1e6q2n3oiSc3aBoAACdv3WFUVd+Z5NVJ/miG3pXk+VlZZjuQ5Ia1ntfdN3X3ru7ete3MHeud\nBgDAum3EFaOrknyiux9Jku5+pLsPdffXk7w7yeUbsA8AgIXbiDC6NquW0arq/FX3vSbJfRuwDwCA\nhTvpT6UlSVXtSPLKJG9cNfybVXVZkk7y4DH3AQCcstYVRt39ZJJ/c8zYT69rRgAAS+I3XwMADGEE\nADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA\nEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMY\nAQAMYQQAMIQRAMDYvuwJAItz1v11ZHvnnicXuq+Dl+44sv3lF/ZC9wWwKK4YAQAMYQQAMCylwWns\nqOWzu/esfH/JpQvZ1+rls3MvOXhk+7G9OxeyP4BFcMUIAGAIIwCAYSkNtopZQtv3uu9ayMtff8Wd\na47fuPeqhewPYBFcMQIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMA\ngCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAxvZlTwBYnIOX7jiy/eUXdpLk\n+ivuXMi+3nr2Q0e2f/9Lz13IPgAW7YSuGFXVzVX1aFXdt2rsnKq6q6o+O9/PnvGqqt+rqn1Vtaeq\nXryoyQMAbKQTXUp7b5Irjxl7W5KPdvfFST46t5PkqiQXz9d1Sd61/mkCACzeCS2ldffHqurCY4av\nTvLy2X5fkv+d5Jdn/P3d3Unurqqzqur87j6wERMGTtzh5bMkOfeSgwvd1+rls1se+sGF7gtgUdbz\n5uvzVsXOF5KcN9vPSvL5VY/bP2NHqarrqmp3Ve0+9MST65gGAMDG2JBPpc3VoX7GBx79nJu6e1d3\n79p25o5nfgIAwIKt51NpjxxeIquq85M8OuMPJ7lg1eOePWPAEj22d2eS5Ma9Vy15JgCnrvVcMbo9\nyetn+/VJ/nTV+M/Mp9NekuQfvb8IAPh2cEJXjKrq1qy80XpnVe1P8o4kv5HkQ1X1hiQPJXntPPyO\nJK9Ksi/JV5P83AbPGQBgIU70U2nXHueuV6zx2E7y5vVMCgBgGfwvQQAAhjACABjCCABgCCMAgCGM\nAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIA\nGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAI\nIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwA\nAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAY\nwggAYDxjGFXVzVX1aFXdt2rst6rq01W1p6puq6qzZvzCqvrnqrp3vv5gkZMHANhIJ3LF6L1Jrjxm\n7K4k39/dlyb5TJK3r7rvge6+bL7etDHTBABYvGcMo+7+WJLHjxn7SHc/NTfvTvLsBcwNAGBTbcR7\njH4+yZ2rbl9UVX9XVX9VVS893pOq6rqq2l1Vuw898eQGTAMAYH22r+fJVfWrSZ5KcssMHUjynO7+\nYlX9QJI/qarv6+6vHPvc7r4pyU1JcsZzLuj1zAMAYCOc9BWjqvrZJD+e5Ke6u5Oku7/W3V+c7XuS\nPJDkBRswTwCAhTupMKqqK5P8UpJXd/dXV42fW1XbZvt5SS5O8rmNmCgAwKI941JaVd2a5OVJdlbV\n/iTvyMqn0M5IcldVJcnd8wm0lyX5tar6lyRfT/Km7n58zRcGADjFPGMYdfe1awy/5ziP/XCSD693\nUgAAy+A3XwMADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABD\nGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEE\nADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDA\nEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMY\nAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAwti97AgCc/s66v45s79zz5ML3d/DSHUmSL7+wF74vTi/P\neMWoqm6uqker6r5VY++sqoer6t75etWq+95eVfuqam9V/diiJg4AsNFOZCntvUmuXGP8d7v7svm6\nI0mq6nuTXJPk++Y5/72qtm3UZAEAFukZl9K6+2NVdeEJvt7VST7Q3V9L8g9VtS/J5Un++qRnCMC3\nvaOWz+7e843tl1y6kP0dXkI795KDR8Ye27tzIfvi9LKeN1+/par2zFLb2TP2rCSfX/WY/TP2Tarq\nuqraXVW7Dz2x+PVmAIBncrJh9K4kz09yWZIDSW74Vl+gu2/q7l3dvWvbmTtOchoAABvnpD6V1t2P\nHN6uqncn+bO5+XCSC1Y99NkzBgArVi2f7Xvddy1kF9dfcec3jd2496qF7IvTy0ldMaqq81fdfE2S\nw59Yuz3JNVV1RlVdlOTiJH+7vikCAGyOZ7xiVFW3Jnl5kp1VtT/JO5K8vKouS9JJHkzyxiTp7k9W\n1YeSfCrJU0ne3N2HFjN1AICNdSKfSrt2jeH3PM3jfz3Jr69nUgAAy+B/CQIAMIQRAMAQRgAAQxgB\nAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxhBAAw\nti97AgCc/g5euuPI9pdf2Ee2r7/izoXs761nP5Qk+f0vPXchr8/pyxUjAIAhjAAAhqU0ABZu9fLZ\nuZccXPj+Di+h3fLQDy58X5xeXDECABjCCABgWEoDYFM9tnfnke0b9161xJnAN3PFCABgCCMAgCGM\nAACGMAIAGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIA\nGMIIAGAIIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAhjACABjCCABgCCMAgCGMAACGMAIAGMIIAGAI\nIwCAIYwAAIYwAgAYwggAYAgjAIAhjAAAxjOGUVXdXFWPVtV9q8Y+WFX3zteDVXXvjF9YVf+86r4/\nWOTkAQA20vYTeMx7k/y3JO8/PNDdrzu8XVU3JPnHVY9/oLsv26gJAgBslmcMo+7+WFVduNZ9VVVJ\nXpvkP2zstAAANt9632P00iSPdPdnV41dVFV/V1V/VVUvPd4Tq+q6qtpdVbsPPfHkOqcBALB+J7KU\n9nSuTXLrqtsHkjynu79YVT+Q5E+q6vu6+yvHPrG7b0pyU5Kc8ZwLep3zAABYt5O+YlRV25P8ZJIP\nHh7r7q919xdn+54kDyR5wXonCQCwGdazlPajST7d3fsPD1TVuVW1bbafl+TiJJ9b3xQBADbHiXxc\n/9Ykf53kkqraX1VvmLuuydHLaEnysiR75uP7/yPJm7r78Y2cMADAopzIp9KuPc74z64x9uEkH17/\ntAAANp/ffA0AMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAM\nYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQR\nAMAQRgAAQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAA\nQxgBAAxhBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAAQxgBAAxh\nBAAwhBEAwBBGAABDGAEADGEEADCEEQDAEEYAAEMYAQAMYQQAMKq7lz2HVNVjSR5KsjPJwSVP51Ti\neBzN8Tia4/ENjsXRHI+jOR5H24rH47ndfe6JPPCUCKPDqmp3d+9a9jxOFY7H0RyPozke3+BYHM3x\nOJrjcTTH4+lZSgMAGMIIAGCcamF007IncIpxPI7meBzN8fgGx+JojsfRHI+jOR5P45R6jxEAwDKd\naleMAACW5pQIo6q6sqr2VtW+qnrbsuez2arqgqr6y6r6VFV9sqp+YcbfWVUPV9W98/WqZc91s1TV\ng1X19/Pn3j1j51TVXVX12fl+9rLnuRmq6pJV58C9VfWVqrp+K50fVXVzVT1aVfetGlvzfKgVvzd/\nn+ypqhcvb+aLcZzj8VtV9en5M99WVWfN+IVV9c+rzpM/WN7MF+M4x+O4Px9V9fY5P/ZW1Y8tZ9aL\nc5zj8cFVx+LBqrp3xk/78+NbtfSltKraluQzSV6ZZH+Sjye5trs/tdSJbaKqOj/J+d39iar67iT3\nJPmJJK9N8kR3//ZSJ7gEVfVgkl3dfXDV2G8meby7f2MC+uzu/uVlzXEZ5ufl4SQ/lOTnskXOj6p6\nWZInkry/u79/xtY8H+Y/gG9N8qqsHKf/2t0/tKy5L8JxjscVSf5Xdz9VVf8lSeZ4XJjkzw4/7nR0\nnOPxzqzx81FV35vk1iSXJ/meJP8zyQu6+9CmTnqB1joex9x/Q5J/7O5f2wrnx7fqVLhidHmSfd39\nue7+f0k+kOTqJc9pU3X3ge7+xGz/U5L7kzxrubM6JV2d5H2z/b6sxONW84okD3T3Q8ueyGbq7o8l\nefyY4eOdD1dn5T8I3d13Jzlr/vFx2ljreHT3R7r7qbl5d5Jnb/rEluQ458fxXJ3kA939te7+hyT7\nsvLfodPG0x2Pqqqs/KP71k2d1LeRUyGMnpXk86tu788WjoKp9xcl+ZsZestcGr95qywdjU7ykaq6\np6qum7HzuvvAbH8hyXnLmdpSXZOj/0LbqudHcvzzwd8pyc8nuXPV7Yuq6u+q6q+q6qXLmtQSrPXz\nsdXPj5cmeaS7P7tqbKueH2s6FcKIUVVnJvlwkuu7+ytJ3pXk+UkuS3IgyQ1LnN5m+5HufnGSq5K8\neS4NH9Era8Bb6iOVVfWdSV6d5I9maCufH0fZiufD8VTVryZ5KsktM3QgyXO6+0VJ/lOSP6yqf72s\n+W0iPx9ruzZH/+Nqq54fx3UqhNHDSS5YdfvZM7alVNV3ZCWKbunuP06S7n6kuw9199eTvDun2eXe\np9PdD8/3R5PclpU/+yOHl0Tm+6PLm+FSXJXkE939SLK1z49xvPNhy/6dUlU/m+THk/zUxGJmyeiL\ns31PkgeSvGBpk9wkT/PzsZXPj+1JfjLJBw+PbdXz4+mcCmH08SQXV9VF8y/ia5LcvuQ5bapZ831P\nkvu7+3dWja9+X8Rrktx37HNPR1W1Y96EnqrakeSKrPzZb0/y+nnY65P86XJmuDRH/Utvq54fqxzv\nfLg9yc/Mp9NekpU3mR5Y6wVOJ1V1ZZJfSvLq7v7qqvFz5037qarnJbk4yeeWM8vN8zQ/H7cnuaaq\nzqiqi7JyPP52s+e3JD+a5NPdvf/wwFY9P57O9mVPYD5B8ZYkf5FkW5Kbu/uTS57WZvvhJD+d5O8P\nf4Qyya8kubaqLsvKEsGDSd64nOltuvOS3LbSi9me5A+7+8+r6uNJPlRVb0jyUFbeQLglTCC+Mkef\nA7+5Vc6Pqro1ycuT7Kyq/UnekeQ3svb5cEdWPpG2L8lXs/LpvdPKcY7H25OckeSu+dm5u7vflORl\nSX6tqv4lydeTvKm7T/SNyt8WjnM8Xr7Wz0d3f7KqPpTkU1lZcnzz6fSJtGTt49Hd78k3v0cx2QLn\nx7dq6R/XBwA4VZwKS2kAAKcEYQQAMIQRAMAQRgAAQxgBAAxhBAAwhBEAwBBGAADj/wNFwYmlDN8g\nuwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "out = lax.conv(np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", - " np.transpose(kernel,[3,2,0,1]), # rhs = OIHW conv kernel tensor\n", - " (1, 1), # window strides\n", - " 'SAME') # padding mode\n", - "print(\"out shape: \", out.shape)\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,0,:,:]);" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "aonr1tWvYCW9", - "outputId": "63727dd7-1758-4aa0-f93f-557758a160a8" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 3, 202, 200)\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "out = lax.conv_with_general_padding(\n", - " np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", - " np.transpose(kernel,[2,3,0,1]), # rhs = IOHW conv kernel tensor\n", - " (1, 1), # window strides\n", - " ((2,2),(2,2)), # general padding 2x2\n", - " (1,1), # lhs/image dilation\n", - " (1,1)) # rhs/kernel dilation\n", - "print(\"out shape: \", out.shape)\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,0,:,:]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "lyOwGRez_ycJ" - }, - "source": [ - "### Dimension Numbers define dimensional layout for conv_general_dilated\n", - "\n", - "The important argument is the 3-tuple of axis layout arguments:\n", - "(Input Layout, Kernel Layout, Output Layout)\n", - " - __N__ - batch dimension\n", - " - __H__ - spatial height\n", - " - __W__ - spatial height\n", - " - __C__ - channel dimension\n", - " - __I__ - kernel _input_ channel dimension\n", - " - __O__ - kernel _output_ channel dimension\n", - "\n", - "⚠️ To demonstrate the flexibility of dimension numbers we choose a __NHWC__ image and __HWIO__ kernel convention for `lax.conv_general_dilated` below." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "oXKebfCb_i2B", - "outputId": "0b80fca6-0eb7-4baf-d824-458c3739d052" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ConvDimensionNumbers(lhs_spec=(0, 3, 1, 2), rhs_spec=(3, 2, 0, 1), out_spec=(0, 3, 1, 2))\n" - ] - } - ], - "source": [ - "dn = lax.conv_dimension_numbers(img.shape, # only ndim matters, not shape\n", - " kernel.shape, # only ndim matters, not shape \n", - " ('NHWC', 'HWIO', 'NHWC')) # the important bit\n", - "print(dn)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "elZys_HzFVG6" - }, - "source": [ - "#### SAME padding, no stride, no dilation" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "rgb2T15aFVG6", - "outputId": "93fed3a7-69d2-4046-de2f-487ff34b5ee2" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 200, 198, 3)\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "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\nuwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'SAME', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape)\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "E4i3TI5JFVG9" - }, - "source": [ - "#### VALID padding, no stride, no dilation" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "1HQwudKVFVG-", - "outputId": "9edf1704-b920-4666-8a49-2db7dd622fd1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 198, 196, 3) DIFFERENT from above!\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "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\nRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'VALID', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \"DIFFERENT from above!\")\n", - "print(\"First output channel:\")\n", - "plt.figure(figsize=(10,10))\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "VYKZdqLIFVHB" - }, - "source": [ - "#### SAME padding, 2,2 stride, no dilation" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "mKq2-zmmFVHC", - "outputId": "73b80162-fdca-4f6a-ec06-4645d6fdc9f6" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 100, 99, 3) <-- half the size of above\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (2,2), # window strides\n", - " 'SAME', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \" <-- half the size of above\")\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "gPxttaiaFVHE" - }, - "source": [ - "#### VALID padding, no stride, rhs kernel dilation ~ Atrous convolution (excessive to illustrate)" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "_pGr0x6qFVHF", - "outputId": "a0f489eb-bab7-42c4-c030-fb756f63a4a4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 176, 174, 3)\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "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\nAFSiCACgEkUAAJUoAgCoRBEAQCWKAAAqUQQAUIkiAICqZq216xmamS9Un62urH53x+PswoW43Rfi\nNpftvtBciNt9IW5z2e5z3X+71voTT7XSORFFXzUzJ9Zax3c9xzPtQtzuC3Gby3bveo5n2oW43Rfi\nNpft3vUcB8XbZwAAiSIAgOrci6K7dj3AjlyI230hbnPZ7gvNhbjdF+I2l+0+Es6pc4oAAHblXDtS\nBACwE+dEFM3MzTPziZk5OTOv3vU8h2VmrpmZ98zMR2fmIzPzo5vlV8zMu2fmk5uvz971rAdtZi6a\nmV+fmV/a3L9uZt632ef3zMzFu57xoM3M5TPzjpn5+Mx8bGb+3AWyr1+5+fv94Zl568x8/VHc3zPz\nppl5eGY+vG/Zaffv7Pm5zfZ/cGZesLvJt3OG7f4Hm7/nH5yZfzUzl+977DWb7f7EzHz3bqbe3um2\ne99jr5qZNTNXbu4f6f29Wf4jm33+kZn5+/uWn9f7e+dRNDMXVf9H9ZLq+dXLZub5u53q0DxWvWqt\n9fzqpuoVm219dXXfWuvG6r7N/aPmR6uP7bv/M9Wda60bqt+vXr6TqQ7Xz1b/Zq31p6tva2/7j/S+\nnpmrqr9THV9rfWt1UXVrR3N/v7m6+QnLzrR/X1LduPlze/X6Z2jGw/Dmnrzd766+da31Z6rfql5T\ntfn5dmv1LZvn/JPNz/zz0Zt78nY3M9dUf6n63L7FR3p/z8x3VbdU37bW+pbqH26Wn/f7e+dRVL2w\nOrnW+vRa6yvV29r7H/vIWWs9tNb6wOb2f27vP5JXtbe9d29Wu7v6/t1MeDhm5urqL1c/v7k/1Yuq\nd2xWOYrb/Merv1C9sWqt9ZW11hc74vt641j1x2bmWPWs6qGO4P5ea723+r0nLD7T/r2l+oW15/7q\n8pl57jMz6cE63Xavtf7dWuuxzd37q6s3t2+p3rbWenSt9ZnqZHs/8887Z9jfVXdWP17tP0H3SO/v\n6m9VP73WenSzzsOb5ef9/j4Xouiq6oF9909tlh1pM3Nt9e3V+6rnrLUe2jz0+eo5OxrrsPzj9n5o\n/NHm/jdUX9z3Q/Qo7vPrqi9U/3TztuHPz8ylHfF9vdZ6sL3/1/i59mLoS9WvdfT391edaf9eSD/n\n/mb1rze3j/R2z8wt1YNrrd98wkNHerur51V/fvOW+H+cmT+7WX7eb/e5EEUXnJm5rPqX1Y+ttf7T\n/sfW3uWAR+aSwJn53urhtdav7XqWZ9ix6gXV69da31490hPeKjtq+7pqcw7NLe1F4TdVl3aatxwu\nBEdx/z6Vmfmp9k4TeMuuZzlsM/Os6ier/2XXs+zAseqK9k4D+Z+rt2/eATjvnQtR9GB1zb77V2+W\nHUkz83XtBdFb1lrv3Cz+na8eWt18ffhMzz8PfUf1fTPz2+29Nfqi9s61uXzz9kodzX1+qjq11nrf\n5v472ouko7yvq/5i9Zm11hfWWn9YvbO9vwNHfX9/1Zn275H/OTczf7363uqH1v//WS9Hebuvby/+\nf3Pz8+3q6gMz8yc72ttdez/f3rl5e/D97b0LcGVHYLvPhSj61erGzdUpF7d3kta9O57pUGxK+o3V\nx9Za/2jfQ/dWt21u31a965me7bCstV6z1rp6rXVte/v2P6y1fqh6T/UDm9WO1DZXrbU+Xz0wM9+8\nWfTi6qMd4X298bnqppl51ubv+1e3+0jv733OtH/vrX54c1XSTdWX9r3Ndt6bmZvbe4v8+9Zaf7Dv\noXurW2fmkpm5rr0Tj9+/ixkP2lrrQ2utb1xrXbv5+XaqesHm3/6R3t/VL1bfVTUzz6subu+Xwp7/\n+3uttfM/1fe0d8XCp6qf2vU8h7id/0N7h9M/WP3G5s/3tHeOzX3VJ6t/X12x61kPafu/s/qlze0/\n1d4/lpPVv6gu2fV8h7C9/111YrO/f7F69oWwr6v/rfp49eHqn1WXHMX9Xb21vfOm/rC9/yC+/Ez7\nt5r2rrL9VPWh9q7O2/k2HOB2n2zvXJKv/lx7w771f2qz3Z+oXrLr+Q9yu5/w+G9XV14g+/vi6p9v\n/o1/oHrRUdnfPtEaAKBz4+0zAICdE0UAAIkiAIBKFAEAVKIIAKASRQAAlSgCAKhEEQBAVf8vMwxh\njUiRM0EAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " 'VALID', # padding mode\n", - " (1,1), # lhs/image dilation\n", - " (12,12), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape)\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "v-RhEeUfFVHI" - }, - "source": [ - "#### VALID padding, no stride, lhs=input dilation ~ Transposed Convolution" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "B9Ail8ppFVHJ", - "outputId": "03d00b5a-ec38-435a-81f7-79d4737239c0" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 399, 395, 3) <-- larger than original!\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "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\njAAAxv8H2emSG61MbfQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " ((0, 0), (0, 0)), # padding mode\n", - " (2,2), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \"<-- larger than original!\")\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "A-9OagtrVDyV" - }, - "source": [ - "We can use the last to, for instance, implement _transposed convolutions_:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 629 - }, - "colab_type": "code", - "id": "5EYIj77-NdHE", - "outputId": "d2e82a42-9c8e-4973-f760-511a14805527" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "out shape: (1, 400, 396, 3) <-- transposed_conv\n", - "First output channel:\n" - ] - }, - { - "data": { - "image/png": "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\nVXV3VT1cVQ9V1W/P+LY8Ro6zHtvyGKmq51bVZ6vqi7MefzDjl1TVvfO6b6uq58z42XN7Ze5/4TLn\nv9mOsx4fqqqvrTk+9sz4Gf37ckq6e2lfSXYk+UqSf5fkOUm+mOTFy5zTktbh60me/6yx/5rkhtm+\nIckfL3ueC3z9v57kiiQPnuj1J7k6yV8lqST7kty77Plv0Xq8M8l/Psq+L57fm7OTXDK/TzuW/Ro2\neT0uSHLFbD8vyT/M696Wx8hx1mNbHiPz33nXbJ+V5N757357kmtm/P1J/uNs/6ck75/ta5LctuzX\nsEXr8aEkrznK/mf078upfC37HaMrk6x091e7+1+S3Jpk/5LndLrYn+SW2b4lyauXOJeF6u5PJ/nW\ns4aP9fr3J/lwr7onyblVdcHWzHRrHGM9jmV/klu7+6nu/lqSlaz+Xp0xuvtQd39htr+f5JEkF2ab\nHiPHWY9jOaOPkfnv/OTcPGu+OsnLknxkxp99fDxz3HwkycurqrZougt3nPU4ljP69+VULDuMLkzy\n6Jrbj+X4v+Bnqk7yt1X1+ao6MGPnd/eh2f5mkvOXM7WlOdbr387HzFvnre6b15xa3VbrMac9XpLV\nfwVv+2PkWeuRbNNjpKp2VNX9SZ5IcldW3xX7Tnc/Pbusfc0/Wo+5/7tJfnZrZ7xYz16P7n7m+HjX\nHB83VtXZM3bGHx8na9lhxKpf6+4rkrwqyfVV9etr7+zV9zu37eWD2/31j/cluTTJniSHkrx7udPZ\nelW1K8lHk7ytu7+39r7teIwcZT227THS3Ye7e0+Si7L6btiLljylpXr2elTVLyR5R1bX5ZeSnJfk\nd5c4xdPassPoYJKL19y+aMa2le4+ON+fSPKxrP5iP/7M25nz/YnlzXApjvX6t+Ux092Pz//Y/WuS\nD+THp0K2xXpU1VlZjYA/6+6/nOFte4wcbT22+zGSJN39nSR3J/mVrJ4S2jl3rX3NP1qPuf9nkvzz\nFk91S6xZj6vmFGx391NJ/iTb8PhYr2WH0eeSXD5XDzwnqx+Eu2PJc9pSVXVOVT3vme0kv5Hkwayu\nw7Wz27VJPr6cGS7NsV7/HUneOFdS7Evy3TWnU85Yzzrn/5tZPUaS1fW4Zq60uSTJ5Uk+u9XzW6T5\n/McHkzzS3e9Zc9e2PEaOtR7b9RipqhdU1bmz/dNJXpHVz13dneQ1s9uzj49njpvXJPnUvON4RjjG\nevz9mn9EVFY/b7X2+Dhjf19Oxc4T77I43f10Vb01yd9k9Qq1m7v7oWXOaQnOT/Kx+ezfziR/3t1/\nXVWfS3J7Vb05yTeSvHaJc1yoqvqLJC9N8vyqeizJ7yf5oxz99d+Z1asoVpL8MMmbtnzCC3aM9Xjp\nXF7bWb2K8S1J0t0PVdXtSR5O8nSS67v78DLmvUC/muQNSb40n5tIkt/L9j1GjrUer9+mx8gFSW6p\nqh1Z/cf+7d39iap6OMmtVfWHSf4uqzGZ+f6nVbWS1YscrlnGpBfoWOvxqap6QVavPrs/yXWz/5n+\n+3LS/OVrAICx7FNpAACnDWEEADCEEQDAEEYAAEMYAQAMYQQAMIQRAMAQRgAA4/8Bvw2GDv/f1K0A\nAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "# The following is equivalent to tensorflow:\n", - "# N,H,W,C = img.shape\n", - "# out = tf.nn.conv2d_transpose(img, kernel, (N,2*H,2*W,C), (1,2,2,1))\n", - "\n", - "# transposed conv = 180deg kernel roation plus LHS dilation\n", - "# rotate kernel 180deg:\n", - "kernel_rot = np.rot90(np.rot90(kernel, axes=(0,1)), axes=(0,1))\n", - "# need a custom output padding:\n", - "padding = ((2, 1), (2, 1))\n", - "out = lax.conv_general_dilated(img, # lhs = image tensor\n", - " kernel_rot, # rhs = conv kernel tensor\n", - " (1,1), # window strides\n", - " padding, # padding mode\n", - " (2,2), # lhs/image dilation\n", - " (1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape, \"<-- transposed_conv\")\n", - "plt.figure(figsize=(10,10))\n", - "print(\"First output channel:\")\n", - "plt.imshow(onp.array(out)[0,:,:,0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "v8HsE-NCmUxx" - }, - "source": [ - "### 1D Convolutions" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "WeP0rw0tm7HK" - }, - "source": [ - "You aren't limited to 2D convolutions, a simple 1D demo is below:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 680 - }, - "colab_type": "code", - "id": "jJ-jcAn3cig-", - "outputId": "614ed589-e097-4bfe-f596-3421e3492698" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "in shapes: (1, 200, 2) (3, 2, 2)\n", - "ConvDimensionNumbers(lhs_spec=(0, 2, 1), rhs_spec=(2, 1, 0), out_spec=(0, 2, 1))\n", - "out shape: (1, 200, 2)\n" - ] - }, - { - "data": { - "image/png": "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\nAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\ndnvvz0uzHuu8mNlXzezO3vM827vtIjP7iJnd1/v4mKzHOQ9m9uQDr/HtZlY1s9ev8utvZm83s2+Z\n2V0Hbot8vS30X3rvBXeY2bOyG3k6Yp7/b5nZ53vP8VYzO9W7/Voz2z/wc/D72Y18djHPPfZn3cx+\nrffaf8HMXpzNqNMT8/zfc+C5f9XMbu/dvmqvfdy5brl+951zK/VHUl7SlyQ9XlJJ0uck3ZD1uOb4\nfC+T9Kze37ckfVHSDZLeLOlXsx7fgo7BVyVdPHLbf5T0xt7f3yjpN7Me5wKOQ17SNyVds8qvv6Tn\nS3qWpLsmvd6SXirpQ5JM0nMlfSrr8c/p+f+gpELv77954Plfe/DrTvqfmOce+bPeex/8nKSypOt6\n54V81s8h7ec/8vn/JOnXV/S1jzvXLdXv/ipWqp4j6X7n3Jedc01J75b08ozHNDfOuQedc5/t/b0m\n6V5JV2Q7qqXwcknv6P39HZL+cYZjWZQfkPQl59y8dyvIlHPubyQ9OnJz3Ov9ckn/04U+KemUmV22\nmJHOR9Tzd8592DnX7v3zk5KuXPjAFiDmtY/zcknvds41nHNfkXS/wvPDiTXu+ZuZSfoJSX+80EEt\nyJhz3VL97q9iqLpC0tcP/PsBeRIyzOxaSTdK+lTvpl/olT3fvqqXv3qcpA+b2W1mdnPvtkuccw/2\n/v5NSZdkM7SFeqUOv6H68vpL8a+3j+8Hr1X4P/S+68zs78zs/5jZ87Ia1JxF/az79to/T9JDzrn7\nDty2kq/9yLluqX73VzFUecnMNiX9qaTXO+eqkv6bpCdIeqakBxWWhVfV9zrnniXpJZJeZ2bPP/hJ\nF9aCV7p3iJmVJL1M0nt7N/n0+h/iw+sdx8zeJKkt6V29mx6UdLVz7kZJvyzpj8ysktX45sTbn/UR\nr9Lh/1St5Gsfca4bWIbf/VUMVd+QdNWBf1/Zu21lmVlR4Q/Zu5xzfyZJzrmHnHMd51xX0v/QCS97\nj+Oc+0bv47ck3arwuT7UL/X2Pn4ruxEuxEskfdY595Dk1+vfE/d6e/N+YGavkfTDkn6yd3JR79LX\nI72/36ZwXtGTMhvkHIz5WffptS9IeoWk9/RvW8XXPupcpyX73V/FUPUZSU80s+t6/3t/paT3Zzym\nueldR3+bpHudc79z4PaD145/VNJdo/ddBWa2YWZb/b8rnLB7l8LX/NW9L3u1pPdlM8KFOfS/VF9e\n/wPiXu/3S/qZ3kqg50raOXCpYGWY2U2S3iDpZc65CwduP21m+d7fHy/piZK+nM0o52PMz/r7Jb3S\nzMpmdp3C5/7pRY9vQV4k6fPOuQf6N6zaax93rtOy/e5nNZN/nn8Uzvr/osJk/qasxzPn5/q9Csud\nd0i6vffnpZL+UNKdvdvfL+myrMc6p+f/eIUrfD4n6e7+6y3psZL+StJ9kj4q6aKsxzrHY7Ah6RFJ\n2wduW9nXX2F4fFBSS+E8iZ+Ne70Vrvx5a++94E5JZ7Ie/5ye//0K54/03wN+v/e1P9b7vbhd0mcl\n/UjW45/Dc4/9WZf0pt5r/wVJL8l6/PN4/r3b/0DSz4187aq99nHnuqX63WebGgAAgBSs4uU/AACA\nhSNUAQAApIBQBQAAkAJCFQAAQAoIVQAAACkgVAEAAKSAUAUAAJCC/w+oKapj4mrseQAAAABJRU5E\nrkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "# 1D kernel - WIO layout\n", - "kernel = onp.array([[[1, 0, -1], [-1, 0, 1]], \n", - " [[1, 1, 1], [-1, -1, -1]]], \n", - " dtype=np.float32).transpose([2,1,0])\n", - "# 1D data - NWC layout\n", - "data = onp.zeros((1, 200, 2), dtype=np.float32)\n", - "for i in range(2):\n", - " for k in range(2):\n", - " x = 35*i + 30 + 60*k\n", - " data[0, x:x+30, k] = 1.0\n", - "\n", - "print(\"in shapes:\", data.shape, kernel.shape)\n", - "\n", - "plt.figure(figsize=(10,5))\n", - "plt.plot(data[0]);\n", - "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", - " ('NWC', 'WIO', 'NWC'))\n", - "print(dn)\n", - "\n", - "out = lax.conv_general_dilated(data, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,), # window strides\n", - " 'SAME', # padding mode\n", - " (1,), # lhs/image dilation\n", - " (1,), # rhs/kernel dilation\n", - " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", - "print(\"out shape: \", out.shape)\n", - "plt.figure(figsize=(10,5))\n", - "plt.plot(out[0]);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "7XOgXqCTmaPa" - }, - "source": [ - "### 3D Convolutions" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 530 - }, - "colab_type": "code", - "id": "QNvSiq5-mcLd", - "outputId": "eecbad0f-f443-43c1-83d6-f8fba22c7383" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "in shapes: (1, 30, 30, 30, 1) (3, 3, 3, 1, 1)\n", - "ConvDimensionNumbers(lhs_spec=(0, 4, 1, 2, 3), rhs_spec=(4, 3, 0, 1, 2), out_spec=(0, 4, 1, 2, 3))\n", - "out shape: (1, 30, 30, 30, 1)\n" - ] - }, - { - "data": { - "image/png": "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\nSObD7ZaPtztu55mb04kxBjrnuB6W6vb3mUV0Fx6F70rF9u4LwMP7IaR3DtoMRQreOUKIWGtxTaKo\nzLrtiC4RcmKKtSUxpsihBFw2nEpm17Rc9h3hNmOMZfCeKUamEEFpnvcDT9Zrxhi++Zk6a1hvt1wN\nA+47cCWw8NtlGfRbeO/49rSEtQZj6oGWSF1jHseZQp3AsEbTWI931fdg8J6ucYhSrBrP066nNw5d\nCnOJTKWw7jzP1wNP+xVZBAwUJazaho+2G36wu0CAQww01vF0tcIbswjue8BS6S6814j8ouIVOVfk\nCqwzKMB4U/0eyNydRpQ2cF5dvuhbdFLcjzPeCYfkEaD3liiJU4pMKfNsveLFas2cM7EUYq4eCx+t\nNzxdrZYlh/eMRXQX3muUgvywJiyCtQZBziY9hSLVYEeoFW7RZ+fgImQpvN4fyWScMRhnedEObNuO\n+znUmWSjQSkuhwGrFK+OB1LJrH3DRdctgvsesojuwnuPMaq6o6lqsKOVZs6RXKrgojWtMeiVJuTq\nRjYlTRahbxwxGdrWMknmLkfmU2bXN3xvvcVozc04cppnWud4Ogw8W62Xg7L3mEV0F957lFJnO8na\nw81n60hvdJ00UIIxmtOYSTkRcsZozbbzKGdIqd5+1IGohNZbQir0zrFp22p8Yy2bpmG9ROe89yyi\nu/De865/g9YKQdM4943xzhwyc8ooDU4Z0IqYM04b5pzYh5k5R4w1fLzZsOs6Xh/23IcZozW7ruPZ\n0rtdOLOI7sJ7zbvbag9TDVpDemeu2HmDymC0x1pLKcL9NHGMkZwL3mqsadiHmcbWMbGrfsAbzUXX\n0zm3CO7CNyyiu/De8+0RMvOOhy+czdK1JeRf+Pz23uOMBqNZN54swlfHA3fzROccnXNLdbvwK1lc\nxhYW/oFMITKnanxujcYYzcvDgcE5lFKcYkArzfXQ441derfvN4u148LCb4IHQ58HS8ub8cTdPAPQ\nGMP1sMIu1e3CIroLC789Ys4ILCu8C++yiO7CwsLCI/JrRXe5DlpYWFh4RBbRXVhYWHhEFtFdWFhY\neEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4\nRBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhE\nFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4ROz/5f5fGyO8sLCwsPCPZ6l0\nFxYWFh6RRXQXFhYWHpFFdBcWFhYekUV0FxYWFh6RRXQXFhYWHpFFdBcWFhYekf8NqyMgE3YvbLEA\nAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvVnMZVtd7v0b3WxX8663qW5X7QYQ\nUOCwP/X4fR/iufiUCzWgwYgK2EW8IeHKLiqJQY0GNeiVRsVAJAE0JhpNNBoU7KLGaDjm6AE3u6ld\ne1f7NqudzWi/i1nUkdCogJtmz19SSb1rrDnWqnrXfNacz3j+/yFSSoyMjIyMPDPIz/UbGBkZGXk2\nMYruyMjIyDPIKLojIyMjzyCj6I6MjIw8g4yiOzIyMvIMov+d8THaMDIyMvKfR3yygfFKd2RkZOQZ\nZBTdkZGRkWeQUXRHRkZGnkFG0R3h9a9/PRcvXmQ2m/H85z+ft7/97ffGPvCBDyClZDKZMJlMuHz5\nMq95zWv4+7//+8/hO/6v5cEHH+R973vf5+18I1/YjKI7wo/+6I/yxBNPsF6v+f3f/33e/OY38w//\n8A/3xi9dusR2u2Wz2fC3f/u3vPCFL+RrvuZr+NM//dPP4bseGfnCZBTdEV70oheR5zkAQgiEEDz6\n6KMf9zwhBJcvX+Ynf/InecMb3sCP/MiPfNI5/+qv/oqXvexl7O3tceXKFd75zncCsFqt+K7v+i6O\njo544IEH+Omf/mlijAC8853v5OUvfzk/+IM/yGKx4KGHHuKP/uiPAPit3/otvvIrv/JjXuMXf/EX\nedWrXvUJX//69eu86lWvYn9/n+c973n8+q//+r2x7/me7+HNb37zvZ8/8IEPcPnyZQC+8zu/kyef\nfJJXvvKVTCYTfu7nfo4nnngCIQS/9mu/xqVLl7h48SK/8Au/8GnPN/LsZhTdEQDe+MY3UlUVL3zh\nC7l48SLf8A3f8Cmf/+pXv5p//Md/ZLfbfdzY1atX+fqv/3re9KY3cefOHT74wQ/y8MMPA/CmN72J\n1WrFY489xp//+Z/zm7/5m7zjHe+4d+zf/d3f8YIXvIDj42N++Id/mO/7vu8jpcQrX/lKPvzhD/PI\nI4/ce+673/1uXvva137C9/ft3/7tXL58mevXr/M7v/M7/NiP/Rh/9md/9u/+P7zrXe/i/vvv5w/+\n4A/Ybrf88A//8L2x97///TzyyCP8yZ/8CW9961v/Q5bBp5pv5NnJKLojAPzyL/8ym82Gv/zLv+TV\nr371vSvfT8alS5dIKbFcLj9u7N3vfjdf93Vfx3d8x3dgjOHg4ICHH36YEALvfe97+dmf/Vmm0ykP\nPvggP/ADP8C73vWue8c+8MADfP/3fz9KKb77u7+bGzducOvWLaqq4pu+6Zt4z3veA8AjjzzChz70\noU94pXvt2jX++q//mre+9a0URcHDDz/MG97wBn7zN3/zM/o/+omf+AnquuYlL3kJ3/u933vvvYyM\n/GcYRXfkHkopXv7yl/PUU0/xK7/yK5/yuU8//TRCCPb29j5u7Nq1azz3uc/9uMePj49xzvHAAw/c\ne+yBBx7g6aefvvfzhQsX7v29qioAttstAK997WvvCd273/1uvvmbv/nec/4t169fZ39/n+l0+klf\n59PhypUrHzPf9evXP6P5Rp6djKI78nF47z+hp/tv+d3f/V2+/Mu/nLquP27sypUrn/D4w8NDjDFc\nvXr13mNPPvkk991333/ofb3iFa+4Z1e85z3v+aTWwqVLlzg9PWWz2XzC16nrmqZp7o3dvHnzY44X\n4hMXE127du1j5rt06dJnNN/Is5NRdJ/l3L59m/e+971st1tCCPzxH/8x73nPe/jar/3aj3tuSomn\nn36at7zlLbz97W/nZ37mZz7hnK973et43/vex2//9m/jvefk5IQPfvCDKKV4zWtew4//+I+z2Wy4\nevUqb3vb23j961//H3qvxhi+9Vu/lR/6oR/i9PSUV7ziFZ/weVeuXOFlL3sZP/qjP0rXdfzTP/0T\nv/Ebv3HvdR5++GH+8A//kNPTU27evMkv/dIvfczx58+f57HHHvu4eX/qp36Kpmn453/+Z97xjnfw\nbd/2bZ/RfCPPUlJKn+rPyBc5t2/fTv/jf/yPNJ/P03Q6TS9+8YvTr/3ar90bf//735+EEKmu61RV\nVbp48WL6lm/5lvQ3f/M3n3Lev/iLv0hf9VVflabTabp8+XJ65zvfmVJK6fT0NL3uda9Lh4eH6fLl\ny+ktb3lLCiGklFJ6xzvekb76q7/6Y+YB0iOPPPIx8wLpjW9846d8/WvXrqVv/MZvTIvFIj3nOc9J\nv/Irv3JvrG3b9JrXvCZNp9P0kpe8JL3tbW9L9913373x3/u930tXrlxJ8/k8/fzP/3x6/PHHE5B+\n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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "tags": [] - }, - "output_type": "display_data" + "name": "Common Gotchas in JAX", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" } - ], - "source": [ - "# Random 3D kernel - HWDIO layout\n", - "kernel = onp.array([\n", - " [[0, 0, 0], [0, 1, 0], [0, 0, 0]],\n", - " [[0, -1, 0], [-1, 0, -1], [0, -1, 0]], \n", - " [[0, 0, 0], [0, 1, 0], [0, 0, 0]]], \n", - " dtype=np.float32)[:, :, :, onp.newaxis, onp.newaxis]\n", - "\n", - "# 3D data - NHWDC layout\n", - "data = onp.zeros((1, 30, 30, 30, 1), dtype=np.float32)\n", - "x, y, z = onp.mgrid[0:1:30j, 0:1:30j, 0:1:30j]\n", - "data += (onp.sin(2*x*np.pi)*onp.cos(2*y*np.pi)*onp.cos(2*z*np.pi))[None,:,:,:,None]\n", - "\n", - "print(\"in shapes:\", data.shape, kernel.shape)\n", - "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", - " ('NHWDC', 'HWDIO', 'NHWDC'))\n", - "print(dn)\n", - "\n", - "out = lax.conv_general_dilated(data, # lhs = image tensor\n", - " kernel, # rhs = conv kernel tensor\n", - " (1,1,1), # window strides\n", - " 'SAME', # padding mode\n", - " (1,1,1), # lhs/image dilation\n", - " (1,1,1), # rhs/kernel dilation\n", - " dn) # dimension_numbers\n", - "print(\"out shape: \", out.shape)\n", - "\n", - "# Make some simple 3d density plots:\n", - "from mpl_toolkits.mplot3d import Axes3D\n", - "def make_alpha(cmap):\n", - " my_cmap = cmap(np.arange(cmap.N))\n", - " my_cmap[:,-1] = np.linspace(0, 1, cmap.N)**3\n", - " return mpl.colors.ListedColormap(my_cmap)\n", - "my_cmap = make_alpha(plt.cm.viridis)\n", - "fig = plt.figure()\n", - "ax = fig.gca(projection='3d')\n", - "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=data.ravel(), cmap=my_cmap)\n", - "ax.axis('off')\n", - "ax.set_title('input')\n", - "fig = plt.figure()\n", - "ax = fig.gca(projection='3d')\n", - "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=out.ravel(), cmap=my_cmap)\n", - "ax.axis('off')\n", - "ax.set_title('3D conv output');" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "DKTMw6tRZyK2" - }, - "source": [ - "## 🔪 NaNs" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ncS0NI4jZrwy" - }, - "source": [ - "### Debugging NaNs\n", - "\n", - "If you want to trace where NaNs are occurring in your functions or gradients, you can turn on the NaN-checker by:\n", - "- setting the `JAX_DEBUG_NANS=True` environment variable.\n", - "- adding `from jax.config import config` and `config.update(\"jax_debug_nans\", True)` near the top of your main file\n", - "- adding `from jax.config import config` and `config.parse_flags_with_absl()` to your main file, then set the option using a command-line flag like `--jax_debug_nans=True`.\n", - "\n", - "This will cause computations to error-out immediately on production of a NaN.\n", - "\n", - "⚠️ You shouldn't have the NaN-checker on if you're not debugging, as it can introduce lots of device-host round-trips and performance regressions!\n" - ] }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YTktlwTTMgFl" - }, - "source": [ - "## Double (64bit) precision\n", - "\n", - "At the moment, JAX by default enforces single-precision numbers to mitigate the Numpy API's tendency to aggressively promote operands to `double`. This is the desired behavior for many machine-learning applications, but it may catch you by surprise!" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "CNNGtzM3NDkO", - "outputId": "211d9880-4518-4a7d-f652-e3663274825f" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "dtype('float32')" - ] - }, - "execution_count": 14, - "metadata": { - "tags": [] - }, - "output_type": "execute_result" + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hjM_sV_AepYf" + }, + "source": [ + "# 🔪 JAX - The Sharp Bits 🔪" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "4k5PVzEo2uJO" + }, + "source": [ + "*levskaya@ mattjj@*\n", + "\n", + "When walking about the countryside of [Italy](https://iaml.it/blog/jax-intro), the people will not hesitate to tell you that __JAX__ has _\"una anima di pura programmazione funzionale\"_.\n", + "\n", + "__JAX__ is a language for __expressing__ and __composing__ __transformations__ of numerical programs. __JAX__ is also able to __compile__ numerical programs for CPU or accelerators (GPU/TPU). \n", + "JAX works great for many numerical and scientific programs, but __only if they are written with certain constraints__ that we describe below." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "GoK_PCxPeYcy", + "colab": {} + }, + "source": [ + "import numpy as onp\n", + "from jax import grad, jit\n", + "from jax import lax\n", + "from jax import random\n", + "import jax\n", + "import jax.numpy as np\n", + "import matplotlib as mpl\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib import rcParams\n", + "rcParams['image.interpolation'] = 'nearest'\n", + "rcParams['image.cmap'] = 'viridis'\n", + "rcParams['axes.grid'] = False" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cxwbr3XK2_mK", + "colab_type": "text" + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gX8CZU1g2agP", + "colab_type": "text" + }, + "source": [ + "## 🔪 Pure functions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2oHigBkW2dPT", + "colab_type": "text" + }, + "source": [ + "JAX transformation and compilation are designed to work only on Python functions that are functionally pure: all the input data is passed through the function parameters, all the results are output through the function results. A pure function will always return the same result if involved with the same inputs. \n", + "\n", + "Here are some examples of functions that are not functially pure for which JAX behaves differently than the Python interpreter. Note that these behaviors are not guaranteed by the JAX system; the proper way to use JAX is to use it only on functionally pure Python functions.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "A6R-pdcm4u3v", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 102 + }, + "outputId": "389605df-a4d5-4d4b-8d74-64e9d5d39456" + }, + "source": [ + "def impure_print_side_effect(x):\n", + " print(\"Executing function\") # This is a side-effect \n", + " return x\n", + "\n", + "# The side-effects appear during the first run \n", + "print (\"First call: \", jit(impure_print_side_effect)(4.))\n", + "\n", + "# Subsequent runs with parameters of same type and shape may not show the side-effect\n", + "# This is because JAX now invokes a cached compilation of the function\n", + "print (\"Second call: \", jit(impure_print_side_effect)(5.))\n", + "\n", + "# JAX re-runs the Python function when the type or shape of the argument changes\n", + "print (\"Third call, different type: \", jit(impure_print_side_effect)(np.array([5.])))" + ], + "execution_count": 121, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Executing function\n", + "First call: 4.0\n", + "Second call: 5.0\n", + "Executing function\n", + "Third call, different type: [5.]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-N8GhitI2bhD", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "f16ce914-1387-43b4-9b8a-1d6e3b97b11d" + }, + "source": [ + "g = 0.\n", + "def impure_uses_globals(x):\n", + " return x + g\n", + "\n", + "# JAX captures the value of the global during the first run\n", + "print (\"First call: \", jit(impure_uses_globals)(4.))\n", + "g = 10. # Update the global\n", + "\n", + "# Subsequent runs may silently use the cached value of the globals\n", + "print (\"Second call: \", jit(impure_uses_globals)(5.))\n", + "\n", + "# JAX re-runs the Python function when the type or shape of the argument changes\n", + "# This will end up reading the latest value of the global\n", + "print (\"Third call, different type: \", jit(impure_uses_globals)(np.array([4.])))" + ], + "execution_count": 122, + "outputs": [ + { + "output_type": "stream", + "text": [ + "First call: 4.0\n", + "Second call: 5.0\n", + "Third call, different type: [14.]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "RTB6iFgu4DL6", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "e93d2a70-1c18-477a-d69d-d09ed556305a" + }, + "source": [ + "g = 0.\n", + "def impure_saves_global(x):\n", + " global g\n", + " g = x\n", + " return x\n", + "\n", + "# JAX runs once the transformed function with special Traced values for arguments\n", + "print (\"First call: \", jit(impure_saves_global)(4.))\n", + "print (\"Saved global: \", g) # Saved global has an internal JAX value" + ], + "execution_count": 123, + "outputs": [ + { + "output_type": "stream", + "text": [ + "First call: 4.0\n", + "Saved global: Traced\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Mlc2pQlp6v-9", + "colab_type": "text" + }, + "source": [ + "A Python function can be functionally pure even if it actually uses stateful objects internally, as long as it does not read or write external state:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "TP-Mqf_862C0", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "78df2d95-2c6f-41c9-84a9-feda6329e75e" + }, + "source": [ + "\n", + "def pure_uses_internal_state(x):\n", + " state = dict(even=0, odd=0)\n", + " for i in range(10):\n", + " state['even' if i % 2 == 0 else 'odd'] += x\n", + " return state['even'] + state['odd']\n", + "\n", + "print(jit(pure_uses_internal_state)(5.))" + ], + "execution_count": 124, + "outputs": [ + { + "output_type": "stream", + "text": [ + "50.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "oBdKtkVW8Lha" + }, + "source": [ + "## 🔪 In-Place Updates" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "JffAqnEW4JEb" + }, + "source": [ + "In Numpy you're used to doing this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "om4xV7_84N9j", + "outputId": "733f901e-d433-4dc8-b5bb-0c23bf2b1306", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + } + }, + "source": [ + "numpy_array = onp.zeros((3,3), dtype=np.float32)\n", + "print(\"original array:\")\n", + "print(numpy_array)\n", + "\n", + "# In place, mutating update\n", + "numpy_array[1, :] = 1.0\n", + "print(\"updated array:\")\n", + "print(numpy_array)" + ], + "execution_count": 125, + "outputs": [ + { + "output_type": "stream", + "text": [ + "original array:\n", + "[[0. 0. 0.]\n", + " [0. 0. 0.]\n", + " [0. 0. 0.]]\n", + "updated array:\n", + "[[0. 0. 0.]\n", + " [1. 1. 1.]\n", + " [0. 0. 0.]]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "go3L4x3w4-9p" + }, + "source": [ + "If we try to update a JAX device array in-place, however, we get an __error__! (☉_☉)" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "2AxeCufq4wAp", + "outputId": "d5d873db-cee0-49dc-981d-ec852347f7ca", + "tags": [ + "raises-exception" + ], + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + } + }, + "source": [ + "jax_array = np.zeros((3,3), dtype=np.float32)\n", + "\n", + "# In place update of JAX's array will yield an error!\n", + "try:\n", + " jax_array[1, :] = 1.0\n", + "except Exception as e:\n", + " print(\"Exception {}\".format(e))" + ], + "execution_count": 126, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Exception '' object does not support item assignment. JAX arrays are immutable; perhaps you want jax.ops.index_update or jax.ops.index_add instead?\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7mo76sS25Wco" + }, + "source": [ + "__What gives?!__ \n", + "\n", + "Allowing mutation of variables in-place makes program analysis and transformation very difficult. JAX requires a pure functional expression of a numerical program. \n", + "\n", + "Instead, JAX offers the _functional_ update functions: [__index_update__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_update.html#jax.ops.index_update), [__index_add__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_add.html#jax.ops.index_add), [__index_min__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_min.html#jax.ops.index_min), [__index_max__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index_max.html#jax.ops.index_max), and the [__index__](https://jax.readthedocs.io/en/latest/_autosummary/jax.ops.index.html#jax.ops.index) helper.\n", + "\n", + "️⚠️ inside `jit`'d code and `lax.while_loop` or `lax.fori_loop` the __size__ of slices can't be functions of argument _values_ but only functions of argument _shapes_ -- the slice start indices have no such restriction. See the below __Control Flow__ Section for more information on this limitation." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "m5lg1RYq5D9p", + "colab": {} + }, + "source": [ + "from jax.ops import index, index_add, index_update" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "X2Xjjvd-l8NL" + }, + "source": [ + "### index_update" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "eM6MyndXL2NY" + }, + "source": [ + "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "ygUJT49b7BBk", + "outputId": "1a3511c4-a480-472f-cccb-5e01620cbe99", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + } + }, + "source": [ + "jax_array = np.zeros((3, 3))\n", + "print(\"original array:\")\n", + "print(jax_array)\n", + "\n", + "new_jax_array = index_update(jax_array, index[1, :], 1.)\n", + "\n", + "print(\"old array unchanged:\")\n", + "print(jax_array)\n", + "\n", + "print(\"new array:\")\n", + "print(new_jax_array)" + ], + "execution_count": 128, + "outputs": [ + { + "output_type": "stream", + "text": [ + "original array:\n", + "[[0. 0. 0.]\n", + " [0. 0. 0.]\n", + " [0. 0. 0.]]\n", + "old array unchanged:\n", + "[[0. 0. 0.]\n", + " [0. 0. 0.]\n", + " [0. 0. 0.]]\n", + "new array:\n", + "[[0. 0. 0.]\n", + " [1. 1. 1.]\n", + " [0. 0. 0.]]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7to-sF8EmC_y" + }, + "source": [ + "### index_add" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "iI5cLY1xMBLs" + }, + "source": [ + "If the __input values__ of __index_update__ aren't reused, __jit__-compiled code will perform these operations _in-place_." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "tsw2svao8FUp", + "outputId": "874acd15-a493-4d63-efe4-9f440d5d2a12", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + } + }, + "source": [ + "print(\"original array:\")\n", + "jax_array = np.ones((5, 6))\n", + "print(jax_array)\n", + "\n", + "new_jax_array = index_add(jax_array, index[::2, 3:], 7.)\n", + "print(\"new array post-addition:\")\n", + "print(new_jax_array)" + ], + "execution_count": 129, + "outputs": [ + { + "output_type": "stream", + "text": [ + "original array:\n", + "[[1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 1. 1. 1.]]\n", + "new array post-addition:\n", + "[[1. 1. 1. 8. 8. 8.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 8. 8. 8.]\n", + " [1. 1. 1. 1. 1. 1.]\n", + " [1. 1. 1. 8. 8. 8.]]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oZ_jE2WAypdL", + "colab_type": "text" + }, + "source": [ + "## 🔪 Out-of-Bounds Indexing" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "btRFwEVzypdN", + "colab_type": "text" + }, + "source": [ + "In Numpy, you are used to errors being thrown when you index an array outside of its bounds, like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [ + "raises-exception" + ], + "id": "5_ZM-BJUypdO", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "461f38cd-9452-4bcc-a44f-a07ddfa12f42" + }, + "source": [ + "try:\n", + " onp.arange(10)[11]\n", + "except Exception as e:\n", + " print(\"Exception {}\".format(e))" + ], + "execution_count": 130, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Exception index 11 is out of bounds for axis 0 with size 10\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eoXrGARWypdR", + "colab_type": "text" + }, + "source": [ + "However, raising an error on other accelerators can be more difficult. Therefore, JAX does not raise an error and instead returns the last value in the array. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "cusaAD0NypdR", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "48428ad6-6cde-43ad-c12d-2eb9b9fe59cf" + }, + "source": [ + "np.arange(10)[11]" + ], + "execution_count": 131, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(9, dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 131 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MUycRNh6e50W" + }, + "source": [ + "## 🔪 Random Numbers" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "O8vvaVt3MRG2" + }, + "source": [ + "> _If all scientific papers whose results are in doubt because of bad \n", + "> `rand()`s were to disappear from library shelves, there would be a \n", + "> gap on each shelf about as big as your fist._ - Numerical Recipes" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Qikt9pPW9L5K" + }, + "source": [ + "### RNGs and State\n", + "You're used to _stateful_ pseudorandom number generators (PRNGs) from numpy and other libraries, which helpfully hide a lot of details under the hood to give you a ready fountain of pseudorandomness:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "rr9FeP41fynt", + "outputId": "849d84cf-04ad-4e8b-9505-a92f6c0d7a39", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "print(onp.random.random())\n", + "print(onp.random.random())\n", + "print(onp.random.random())" + ], + "execution_count": 132, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.08960303423860538\n", + "0.6720478073539145\n", + "0.24536720985284477\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ORMVVGZJgSVi" + }, + "source": [ + "Underneath the hood, numpy uses the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) PRNG to power its pseudorandom functions. The PRNG has a period of $2^{19937-1}$ and at any point can be described by __624 32bit unsigned ints__ and a __position__ indicating how much of this \"entropy\" has been used up." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "7Pyp2ajzfPO2", + "colab": {} + }, + "source": [ + "onp.random.seed(0)\n", + "rng_state = onp.random.get_state()\n", + "#print(rng_state)\n", + "# --> ('MT19937', array([0, 1, 1812433255, 1900727105, 1208447044,\n", + "# 2481403966, 4042607538, 337614300, ... 614 more numbers..., \n", + "# 3048484911, 1796872496], dtype=uint32), 624, 0, 0.0)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "aJIxHVXCiM6m" + }, + "source": [ + "This pseudorandom state vector is automagically updated behind the scenes every time a random number is needed, \"consuming\" 2 of the uint32s in the Mersenne twister state vector:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "GAHaDCYafpAF", + "colab": {} + }, + "source": [ + "_ = onp.random.uniform()\n", + "rng_state = onp.random.get_state()\n", + "#print(rng_state) \n", + "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", + "# ..., 2648828502, 1678096082], dtype=uint32), 2, 0, 0.0)\n", + "\n", + "# Let's exhaust the entropy in this PRNG statevector\n", + "for i in range(311):\n", + " _ = onp.random.uniform()\n", + "rng_state = onp.random.get_state()\n", + "#print(rng_state) \n", + "# --> ('MT19937', array([2443250962, 1093594115, 1878467924,\n", + "# ..., 2648828502, 1678096082], dtype=uint32), 624, 0, 0.0)\n", + "\n", + "# Next call iterates the RNG state for a new batch of fake \"entropy\".\n", + "_ = onp.random.uniform()\n", + "rng_state = onp.random.get_state()\n", + "# print(rng_state) \n", + "# --> ('MT19937', array([1499117434, 2949980591, 2242547484, \n", + "# 4162027047, 3277342478], dtype=uint32), 2, 0, 0.0)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "N_mWnleNogps" + }, + "source": [ + "The problem with magic PRNG state is that it's hard to reason about how it's being used and updated across different threads, processes, and devices, and it's _very easy_ to screw up when the details of entropy production and consumption are hidden from the end user.\n", + "\n", + "The Mersenne Twister PRNG is also known to have a [number](https://cs.stackexchange.com/a/53475) of problems, it has a large 2.5Kb state size, which leads to problematic [initialization issues](https://dl.acm.org/citation.cfm?id=1276928). It [fails](http://www.pcg-random.org/pdf/toms-oneill-pcg-family-v1.02.pdf) modern BigCrush tests, and is generally slow. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Uvq7nV-j4vKK" + }, + "source": [ + "### JAX PRNG" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "COjzGBpO4tzL" + }, + "source": [ + "\n", + "JAX instead implements an _explicit_ PRNG where entropy production and consumption are handled by explicitly passing and iterating PRNG state. JAX uses a modern [Three-fry counter-based PRNG](https://github.com/google/jax/blob/master/design_notes/prng.md) that's __splittable__. That is, its design allows us to __fork__ the PRNG state into new PRNGs for use with parallel stochastic generation.\n", + "\n", + "The random state is described by two unsigned-int32s that we call a __key__:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "yPHE7KTWgAWs", + "outputId": "329e7757-2461-434c-a08c-fde80a2d10c9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "from jax import random\n", + "key = random.PRNGKey(0)\n", + "key" + ], + "execution_count": 135, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray([0, 0], dtype=uint32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 135 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "XjYyWYNfq0hW" + }, + "source": [ + "JAX's random functions produce pseudorandom numbers from the PRNG state, but __do not__ change the state! \n", + "\n", + "Reusing the same state will cause __sadness__ and __monotony__, depriving the enduser of __lifegiving chaos__:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "7zUdQMynoE5e", + "outputId": "50617324-b887-42f2-a7ff-2a10f92d876a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + } + }, + "source": [ + "print(random.normal(key, shape=(1,)))\n", + "print(key)\n", + "# No no no!\n", + "print(random.normal(key, shape=(1,)))\n", + "print(key)" + ], + "execution_count": 136, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[-0.20584226]\n", + "[0 0]\n", + "[-0.20584226]\n", + "[0 0]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hQN9van8rJgd" + }, + "source": [ + "Instead, we __split__ the PRNG to get usable __subkeys__ every time we need a new pseudorandom number:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "ASj0_rSzqgGh", + "outputId": "bcc2ed60-2e41-4ef8-e84f-c724654aa198", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "print(\"old key\", key)\n", + "key, subkey = random.split(key)\n", + "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", + "print(\" \\---SPLIT --> new key \", key)\n", + "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" + ], + "execution_count": 137, + "outputs": [ + { + "output_type": "stream", + "text": [ + "old key [0 0]\n", + " \\---SPLIT --> new key [4146024105 967050713]\n", + " \\--> new subkey [2718843009 1272950319] --> normal [-1.2515389]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "tqtFVE4MthO3" + }, + "source": [ + "We propagate the __key__ and make new __subkeys__ whenever we need a new random number:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "jbC34XLor2Ek", + "outputId": "6834a812-7160-4646-ee19-a246f683905a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "print(\"old key\", key)\n", + "key, subkey = random.split(key)\n", + "normal_pseudorandom = random.normal(subkey, shape=(1,))\n", + "print(\" \\---SPLIT --> new key \", key)\n", + "print(\" \\--> new subkey\", subkey, \"--> normal\", normal_pseudorandom)" + ], + "execution_count": 138, + "outputs": [ + { + "output_type": "stream", + "text": [ + "old key [4146024105 967050713]\n", + " \\---SPLIT --> new key [2384771982 3928867769]\n", + " \\--> new subkey [1278412471 2182328957] --> normal [-0.58665055]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "0KLYUluz3lN3" + }, + "source": [ + "We can generate more than one __subkey__ at a time:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "lEi08PJ4tfkX", + "outputId": "3bb513de-8d14-4d37-ae57-51d6f5eaa762", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "key, *subkeys = random.split(key, 4)\n", + "for subkey in subkeys:\n", + " print(random.normal(subkey, shape=(1,)))" + ], + "execution_count": 139, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[-0.37533438]\n", + "[0.98645043]\n", + "[0.14553197]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "rg4CpMZ8c3ri" + }, + "source": [ + "## 🔪 Control Flow" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "izLTvT24dAq0" + }, + "source": [ + "### ✔ python control_flow + autodiff ✔\n", + "\n", + "If you just want to apply `grad` to your python functions, you can use regular python control-flow constructs with no problems, as if you were using [Autograd](https://github.com/hips/autograd) (or Pytorch or TF Eager)." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "aAx0T3F8lLtu", + "outputId": "808cfa77-d924-4586-af19-35a8fd7d2238", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + } + }, + "source": [ + "def f(x):\n", + " if x < 3:\n", + " return 3. * x ** 2\n", + " else:\n", + " return -4 * x\n", + "\n", + "print(grad(f)(2.)) # ok!\n", + "print(grad(f)(4.)) # ok!" + ], + "execution_count": 140, + "outputs": [ + { + "output_type": "stream", + "text": [ + "12.0\n", + "-4.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hIfPT7WMmZ2H" + }, + "source": [ + "### python control flow + JIT\n", + "\n", + "Using control flow with `jit` is more complicated, and by default it has more constraints.\n", + "\n", + "This works:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "OZ_BJX0CplNC", + "outputId": "48ce004c-536a-44f5-b020-9267825e7e4d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "@jit\n", + "def f(x):\n", + " for i in range(3):\n", + " x = 2 * x\n", + " return x\n", + "\n", + "print(f(3))" + ], + "execution_count": 141, + "outputs": [ + { + "output_type": "stream", + "text": [ + "24\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "22RzeJ4QqAuX" + }, + "source": [ + "So does this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "pinVnmRWp6w6", + "outputId": "e3e6f2f7-ba59-4a98-cdfc-905c91b38ed1", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "@jit\n", + "def g(x):\n", + " y = 0.\n", + " for i in range(x.shape[0]):\n", + " y = y + x[i]\n", + " return y\n", + "\n", + "print(g(np.array([1., 2., 3.])))" + ], + "execution_count": 142, + "outputs": [ + { + "output_type": "stream", + "text": [ + "6.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "TStltU2dqf8A" + }, + "source": [ + "But this doesn't, at least by default:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "9z38AIKclRNM", + "outputId": "466730dd-df8b-4b80-ac5e-e55b5ea85ec7", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + } + }, + "source": [ + "@jit\n", + "def f(x):\n", + " if x < 3:\n", + " return 3. * x ** 2\n", + " else:\n", + " return -4 * x\n", + "\n", + "# This will fail!\n", + "try:\n", + " f(2)\n", + "except Exception as e:\n", + " print(\"Exception {}\".format(e))" + ], + "execution_count": 143, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Exception Abstract value passed to `bool`, which requires a concrete value. The function to be transformed can't be traced at the required level of abstraction. If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions instead.\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "pIbr4TVPqtDN" + }, + "source": [ + "__What gives!?__\n", + "\n", + "When we `jit`-compile a function, we usually want to compile a version of the function that works for many different argument values, so that we can cache and reuse the compiled code. That way we don't have to re-compile on each function evaluation.\n", + "\n", + "For example, if we evaluate an `@jit` function on the array `np.array([1., 2., 3.], np.float32)`, we might want to compile code that we can reuse to evaluate the function on `np.array([4., 5., 6.], np.float32)` to save on compile time.\n", + "\n", + "To get a view of your Python code that is valid for many different argument values, JAX traces it on _abstract values_ that represent sets of possible inputs. There are [multiple different levels of abstraction](https://github.com/google/jax/blob/master/jax/abstract_arrays.py), and different transformations use different abstraction levels.\n", + "\n", + "By default, `jit` traces your code on the `ShapedArray` abstraction level, where each abstract value represents the set of all array values with a fixed shape and dtype. For example, if we trace using the abstract value `ShapedArray((3,), np.float32)`, we get a view of the function that can be reused for any concrete value in the corresponding set of arrays. That means we can save on compile time.\n", + "\n", + "But there's a tradeoff here: if we trace a Python function on a `ShapedArray((), np.float32)` that isn't committed to a specific concrete value, when we hit a line like `if x < 3`, the expression `x < 3` evaluates to an abstract `ShapedArray((), np.bool_)` that represents the set `{True, False}`. When Python attempts to coerce that to a concrete `True` or `False`, we get an error: we don't know which branch to take, and can't continue tracing! The tradeoff is that with higher levels of abstraction we gain a more general view of the Python code (and thus save on re-compilations), but we require more constraints on the Python code to complete the trace.\n", + "\n", + "The good news is that you can control this tradeoff yourself. By having `jit` trace on more refined abstract values, you can relax the traceability constraints. For example, using the `static_argnums` argument to `jit`, we can specify to trace on concrete values of some arguments. Here's that example function again:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "-Tzp0H7Bt1Sn", + "outputId": "aba57a88-d8eb-40b0-ff22-7c266d892b13", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "def f(x):\n", + " if x < 3:\n", + " return 3. * x ** 2\n", + " else:\n", + " return -4 * x\n", + "\n", + "f = jit(f, static_argnums=(0,))\n", + "\n", + "print(f(2.))" + ], + "execution_count": 144, + "outputs": [ + { + "output_type": "stream", + "text": [ + "12.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MHm1hIQAvBVs" + }, + "source": [ + "Here's another example, this time involving a loop:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "iwY86_JKvD6b", + "outputId": "1ec847ea-df2b-438d-c0a1-fabf7b93b73d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "def f(x, n):\n", + " y = 0.\n", + " for i in range(n):\n", + " y = y + x[i]\n", + " return y\n", + "\n", + "f = jit(f, static_argnums=(1,))\n", + "\n", + "f(np.array([2., 3., 4.]), 2)" + ], + "execution_count": 145, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(5., dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 145 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "nSPTOX8DvOeO" + }, + "source": [ + "In effect, the loop gets statically unrolled. JAX can also trace at _higher_ levels of abstraction, like `Unshaped`, but that's not currently the default for any transformation" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "wWdg8LTYwCW3" + }, + "source": [ + "️⚠️ **functions with argument-__value__ dependent shapes**\n", + "\n", + "These control-flow issues also come up in a more subtle way: numerical functions we want to __jit__ can't specialize the shapes of internal arrays on argument _values_ (specializing on argument __shapes__ is ok). As a trivial example, let's make a function whose output happens to depend on the input variable `length`." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "Tqe9uLmUI_Gv", + "outputId": "fe319758-9959-434c-ab9d-0926e599dbc0", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 122 + } + }, + "source": [ + "def example_fun(length, val):\n", + " return np.ones((length,)) * val\n", + "# un-jit'd works fine\n", + "print(example_fun(5, 4))\n", + "\n", + "bad_example_jit = jit(example_fun)\n", + "# this will fail:\n", + "try:\n", + " print(bad_example_jit(10, 4))\n", + "except Exception as e:\n", + " print(\"Exception {}\".format(e))\n", + "# static_argnums tells JAX to recompile on changes at these argument positions:\n", + "good_example_jit = jit(example_fun, static_argnums=(0,))\n", + "# first compile\n", + "print(good_example_jit(10, 4))\n", + "# recompiles\n", + "print(good_example_jit(5, 4))" + ], + "execution_count": 146, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[4. 4. 4. 4. 4.]\n", + "Exception Shapes must be 1D sequences of concrete values of integer type, got (Traced,).\n", + "If using `jit`, try using `static_argnums` or applying `jit` to smaller subfunctions.\n", + "[4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]\n", + "[4. 4. 4. 4. 4.]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "MStx_r2oKxpp" + }, + "source": [ + "`static_argnums` can be handy if `length` in our example rarely changes, but it would be disastrous if it changed a lot! \n", + "\n", + "Lastly, if your function has global side-effects, JAX's tracer can cause weird things to happen. A common gotcha is trying to print arrays inside __jit__'d functions: " + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "m2ABpRd8K094", + "outputId": "64da37a0-aa06-46a3-e975-88c676c5b9fa", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "@jit\n", + "def f(x):\n", + " print(x)\n", + " y = 2 * x\n", + " print(y)\n", + " return y\n", + "f(2)" + ], + "execution_count": 147, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Traced\n", + "Traced\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(4, dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 147 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "uCDcWG4MnVn-" + }, + "source": [ + "### Structured control flow primitives\n", + "\n", + "There are more options for control flow in JAX. Say you want to avoid re-compilations but still want to use control flow that's traceable, and that avoids un-rolling large loops. Then you can use these 4 structured control flow primitives:\n", + "\n", + " - `lax.cond` _differentiable_\n", + " - `lax.while_loop` __fwd-mode-differentiable__\n", + " - `lax.fori_loop` __fwd-mode-differentiable__\n", + " - `lax.scan` _differentiable_\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Sd9xrLMXeK3A" + }, + "source": [ + "#### cond\n", + "python equivalent:\n", + "\n", + "```\n", + "def cond(pred, true_operand, true_fun, false_operand, false_fun):\n", + " if pred:\n", + " return true_fun(true_operand)\n", + " else:\n", + " return false_fun(false_operand)\n", + "```" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "SGxz9JOWeiyH", + "outputId": "b29da06c-037f-4b05-dbd8-ba52ac35a8cf", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "from jax import lax\n", + "\n", + "operand = np.array([0.])\n", + "lax.cond(True, operand, lambda x: x+1, operand, lambda x: x-1)\n", + "# --> array([1.], dtype=float32)\n", + "lax.cond(False, operand, lambda x: x+1, operand, lambda x: x-1)\n", + "# --> array([-1.], dtype=float32)" + ], + "execution_count": 148, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray([-1.], dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 148 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "xkOFAw24eOMg" + }, + "source": [ + "#### while_loop\n", + "\n", + "python equivalent:\n", + "```\n", + "def while_loop(cond_fun, body_fun, init_val):\n", + " val = init_val\n", + " while cond_fun(val):\n", + " val = body_fun(val)\n", + " return val\n", + "```" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "jM-D39a-c436", + "outputId": "b9c97167-fecf-4559-9ca7-1cb0235d8ad2", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "init_val = 0\n", + "cond_fun = lambda x: x<10\n", + "body_fun = lambda x: x+1\n", + "lax.while_loop(cond_fun, body_fun, init_val)\n", + "# --> array(10, dtype=int32)" + ], + "execution_count": 149, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(10, dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 149 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "apo3n3HAeQY_" + }, + "source": [ + "#### fori_loop\n", + "python equivalent:\n", + "```\n", + "def fori_loop(start, stop, body_fun, init_val):\n", + " val = init_val\n", + " for i in range(start, stop):\n", + " val = body_fun(i, val)\n", + " return val\n", + "```" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "dt3tUpOmeR8u", + "outputId": "864f2959-2429-4666-b364-4baf90a57482", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "init_val = 0\n", + "start = 0\n", + "stop = 10\n", + "body_fun = lambda i,x: x+i\n", + "lax.fori_loop(start, stop, body_fun, init_val)\n", + "# --> array(45, dtype=int32)" + ], + "execution_count": 150, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(45, dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 150 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "SipXS5qiqk8e" + }, + "source": [ + "#### Summary\n", + "\n", + "$$\n", + "\\begin{array} {r|rr} \n", + "\\hline \\\n", + "\\textrm{construct} \n", + "& \\textrm{jit} \n", + "& \\textrm{grad} \\\\\n", + "\\hline \\\n", + "\\textrm{if} & ❌ & ✔ \\\\\n", + "\\textrm{for} & ✔* & ✔\\\\\n", + "\\textrm{while} & ✔* & ✔\\\\\n", + "\\textrm{lax.cond} & ✔ & ✔\\\\\n", + "\\textrm{lax.while_loop} & ✔ & \\textrm{fwd}\\\\\n", + "\\textrm{lax.fori_loop} & ✔ & \\textrm{fwd}\\\\\n", + "\\textrm{lax.scan} & ✔ & ✔\\\\\n", + "\\hline\n", + "\\end{array}\n", + "$$\n", + "
    $\\ast$ = argument-__value__-independent loop condition - unrolls the loop
    " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "bxuUjFVG-v1h" + }, + "source": [ + "## 🔪 Convolutions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "0pcn2LeS-03b" + }, + "source": [ + "JAX and XLA offer the very general N-dimensional __conv_general_dilated__ function, but it's not very obvious how to use it. We'll give some examples of the common use-cases. There are also the convenience functions `lax.conv` and `lax.conv_general_padding` for the most common kinds of convolutions.\n", + "\n", + "A survey of the family of convolutional operators, [a guide to convolutional arithmetic](https://arxiv.org/abs/1603.07285) is highly recommended reading!\n", + "\n", + "Let's define a simple diagonal edge kernel:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "Yud1Y3ss-x1K", + "outputId": "5aacee92-2769-4f10-d9a6-475cded80981", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + } + }, + "source": [ + "# 2D kernel - HWIO layout\n", + "kernel = onp.zeros((3, 3, 3, 3), dtype=np.float32)\n", + "kernel += onp.array([[1, 1, 0],\n", + " [1, 0,-1],\n", + " [0,-1,-1]])[:, :, onp.newaxis, onp.newaxis]\n", + "\n", + "print(\"Edge Conv kernel:\")\n", + "plt.imshow(kernel[:, :, 0, 0]);" + ], + "execution_count": 151, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Edge Conv kernel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAN7klEQVR4nO3df6yeZX3H8fdnLWAmTCol0pQqP6Nz\nbgY8QZTFNEMTJIYukSXwh4LRdDjJlGgy1AQTk2XqHy5jGkkDRFgMNoKB41JDYMBwWYpUUiiFIIW4\ntLUTLK7IdLKy7/44N+bxcH71eu7zPM/R9yt58lz3fV/nvr692nx6/2xTVUjSkfq9cRcgaWUyPCQ1\nMTwkNTE8JDUxPCQ1MTwkNRkqPJK8NsldSZ7svtfM0++lJDu7z/QwY0qaDBnmOY8kXwKeq6ovJLka\nWFNVfzNHvxeq6tgh6pQ0YYYNjyeAjVV1IMk64L6qeuMc/QwP6bfMsOHxX1V1fNcO8LOXl2f1Owzs\nBA4DX6iq2+fZ32ZgM8Crfz9ve9MZRzfXJu362YnjLmHivbh330+rqmmiVi/WIcndwElzbPrs4EJV\nVZL5kugNVbU/yWnAPUl2VdVTsztV1RZgC8DUW19V379zw6K/AGk+p2+9YtwlTLwffeJT/9H6s4uG\nR1W9e75tSX6SZN3Aacsz8+xjf/f9dJL7gLOAV4SHpJVj2Fu108BlXfsy4I7ZHZKsSXJM114LnAc8\nNuS4ksZs2PD4AvCeJE8C7+6WSTKV5Pquzx8CO5I8DNzLzDUPw0Na4RY9bVlIVR0Ezp9j/Q7gI137\n34E/HmYcSZPHJ0wlNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1\nMTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUx\nPCQ16SU8klyQ5Ikke5JcPcf2Y5Js7bY/kOSUPsaVND5Dh0eSVcBXgfcCbwYuTfLmWd0+DPysqs4A\n/h744rDjShqvPo48zgH2VNXTVfUi8E1g06w+m4CbuvatwPlJ0sPYksakj/BYD+wdWN7XrZuzT1Ud\nBg4BJ/QwtqQxmagLpkk2J9mRZMezB18adzmSFtBHeOwHNgwsn9ytm7NPktXAa4CDs3dUVVuqaqqq\npk48YVUPpUlaLn2Ex4PAmUlOTXI0cAkwPavPNHBZ174YuKeqqoexJY3J6mF3UFWHk1wJ3AmsAm6s\nqt1JPg/sqKpp4Abgn5LsAZ5jJmAkrWBDhwdAVW0Dts1ad81A+3+Av+hjLEmTYaIumEpaOQwPSU0M\nD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwP\nSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTXoJjyQXJHkiyZ4k\nV8+x/fIkzybZ2X0+0se4ksZn9bA7SLIK+CrwHmAf8GCS6ap6bFbXrVV15bDjSZoMfRx5nAPsqaqn\nq+pF4JvAph72K2mCDX3kAawH9g4s7wPePke/9yd5F/BD4Kqq2ju7Q5LNwGaA16/vo7TfXqdvvWLc\nJUy8M67aPu4SJt6PhvjZUV0w/Q5wSlX9CXAXcNNcnapqS1VNVdXUiSesGlFpklr0ER77gQ0Dyyd3\n636tqg5W1a+6xeuBt/UwrqQx6iM8HgTOTHJqkqOBS4DpwQ5J1g0sXgQ83sO4ksZo6AsLVXU4yZXA\nncAq4Maq2p3k88COqpoG/jrJRcBh4Dng8mHHlTRevVyVrKptwLZZ664ZaH8a+HQfY0maDD5hKqmJ\n4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnh\nIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqUkv4ZHkxiTPJHl0\nnu1Jcm2SPUkeSXJ2H+NKGp++jjy+DlywwPb3Amd2n83A13oaV9KY9BIeVXU/8NwCXTYBN9eM7cDx\nSdb1Mbak8RjVNY/1wN6B5X3dut+QZHOSHUl2PHvwpRGVJqnFRF0wraotVTVVVVMnnrBq3OVIWsCo\nwmM/sGFg+eRunaQValThMQ18sLvrci5wqKoOjGhsSctgdR87SXILsBFYm2Qf8DngKICqug7YBlwI\n7AF+AXyoj3EljU8v4VFVly6yvYCP9TGWpMkwURdMJa0choekJoaHpCaGh6QmhoekJoaHpCaGh6Qm\nhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaG\nh6QmhoekJoaHpCaGh6QmhoekJoaHpCa9hEeSG5M8k+TRebZvTHIoyc7uc00f40oan17+o2vg68BX\ngJsX6PO9qnpfT+NJGrNejjyq6n7guT72JWll6OvIYynekeRh4MfAp6pq9+wOSTYDmwFWrVnD6Vuv\nGGF5K8sZV20fdwn6HTeqC6YPAW+oqrcC/wjcPlenqtpSVVNVNbXq2FePqDRJLUYSHlX1fFW90LW3\nAUclWTuKsSUtj5GER5KTkqRrn9ONe3AUY0taHr1c80hyC7ARWJtkH/A54CiAqroOuBj4aJLDwC+B\nS6qq+hhb0nj0Eh5Vdeki27/CzK1cSb8lfMJUUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1IT\nw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1ITw0NSE8NDUhPD\nQ1ITw0NSE8NDUhPDQ1ITw0NSk6HDI8mGJPcmeSzJ7iQfn6NPklybZE+SR5KcPey4ksarj//o+jDw\nyap6KMlxwA+S3FVVjw30eS9wZvd5O/C17lvSCjX0kUdVHaiqh7r2z4HHgfWzum0Cbq4Z24Hjk6wb\ndmxJ49PrNY8kpwBnAQ/M2rQe2DuwvI9XBoykFaS38EhyLHAb8Imqer5xH5uT7Eiy46UX/ruv0iQt\ng17CI8lRzATHN6rq23N02Q9sGFg+uVv3G6pqS1VNVdXUqmNf3UdpkpZJH3dbAtwAPF5VX56n2zTw\nwe6uy7nAoao6MOzYksanj7st5wEfAHYl2dmt+wzweoCqug7YBlwI7AF+AXyoh3EljdHQ4VFV/wZk\nkT4FfGzYsSRNDp8wldTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ\n1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDU\nxPCQ1MTwkNRk6PBIsiHJvUkeS7I7ycfn6LMxyaEkO7vPNcOOK2m8Vvewj8PAJ6vqoSTHAT9IcldV\nPTar3/eq6n09jCdpAgx95FFVB6rqoa79c+BxYP2w+5U02VJV/e0sOQW4H3hLVT0/sH4jcBuwD/gx\n8Kmq2j3Hz28GNneLbwEe7a24fqwFfjruIgZYz8ImrR6YvJreWFXHtfxgb+GR5FjgX4G/rapvz9r2\nB8D/VdULSS4E/qGqzlxkfzuqaqqX4noyaTVZz8ImrR6YvJqGqaeXuy1JjmLmyOIbs4MDoKqer6oX\nuvY24Kgka/sYW9J49HG3JcANwONV9eV5+pzU9SPJOd24B4cdW9L49HG35TzgA8CuJDu7dZ8BXg9Q\nVdcBFwMfTXIY+CVwSS1+vrSlh9r6Nmk1Wc/CJq0emLyamuvp9YKppN8dPmEqqYnhIanJxIRHktcm\nuSvJk933mnn6vTTwmPv0MtRxQZInkuxJcvUc249JsrXb/kD3bMuyWkJNlyd5dmBePrKMtdyY5Jkk\ncz6DkxnXdrU+kuTs5arlCGoa2esRS3xdY6RztGyvkFTVRHyALwFXd+2rgS/O0++FZaxhFfAUcBpw\nNPAw8OZZff4KuK5rXwJsXeZ5WUpNlwNfGdHv07uAs4FH59l+IfBdIMC5wAMTUNNG4J9HND/rgLO7\n9nHAD+f4/RrpHC2xpiOeo4k58gA2ATd17ZuAPx9DDecAe6rq6ap6EfhmV9egwTpvBc5/+Tb0GGsa\nmaq6H3hugS6bgJtrxnbg+CTrxlzTyNTSXtcY6RwtsaYjNknh8bqqOtC1/xN43Tz9XpVkR5LtSfoO\nmPXA3oHlfbxykn/dp6oOA4eAE3qu40hrAnh/dwh8a5INy1jPYpZa76i9I8nDSb6b5I9GMWB3SnsW\n8MCsTWObowVqgiOcoz6e81iyJHcDJ82x6bODC1VVSea7h/yGqtqf5DTgniS7quqpvmtdYb4D3FJV\nv0ryl8wcGf3ZmGuaJA8x8+fm5dcjbgcWfD1iWN3rGrcBn6iB97zGaZGajniORnrkUVXvrqq3zPG5\nA/jJy4du3fcz8+xjf/f9NHAfMynal/3A4N/aJ3fr5uyTZDXwGpb3adlFa6qqg1X1q27xeuBty1jP\nYpYyhyNVI349YrHXNRjDHC3HKySTdNoyDVzWtS8D7pjdIcmaJMd07bXMPN06+98NGcaDwJlJTk1y\nNDMXRGff0Rms82LgnuquOC2TRWuadb58ETPntOMyDXywu6NwLnBo4HR0LEb5ekQ3zoKvazDiOVpK\nTU1zNIor0Eu8InwC8C/Ak8DdwGu79VPA9V37ncAuZu447AI+vAx1XMjM1eingM926z4PXNS1XwV8\nC9gDfB84bQRzs1hNfwfs7ublXuBNy1jLLcAB4H+ZOVf/MHAFcEW3PcBXu1p3AVMjmJ/FarpyYH62\nA+9cxlr+FCjgEWBn97lwnHO0xJqOeI58PF1Sk0k6bZG0ghgekpoYHpKaGB6SmhgekpoYHpKaGB6S\nmvw/0ikHROf6cwcAAAAASUVORK5CYII=\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "dITPaPdh_cMI" + }, + "source": [ + "And we'll make a simple synthetic image:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "cpbGsIGa_Qyx", + "outputId": "e27385e6-8fa2-498d-f952-7d8e04775856", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + } + }, + "source": [ + "# NHWC layout\n", + "img = onp.zeros((1, 200, 198, 3), dtype=np.float32)\n", + "for k in range(3):\n", + " x = 30 + 60*k\n", + " y = 20 + 60*k\n", + " img[0, x:x+10, y:y+10, k] = 1.0\n", + "\n", + "print(\"Original Image:\")\n", + "plt.imshow(img[0]);" + ], + "execution_count": 152, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Original Image:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n4ZcaZfilRhl+qVHjluualNeB/+luV5qzWJnjgpU7tpU2rl+er3FJzNsPkGTXSizdtVLHBSt3bCt1\nXHN52i81yvBLjVpK4d8y7Q70ZKWOC1bu2FbquN5lyVzzSzq5ltKRX9JJNPXwJ7kqyQtJ9ia5ddr9\nGVeSfUmeTrInya6u7cwkO5K82N2eMe1+Hk+SrUkOJ3lmqG3ecWTgS917+FSSS6bX8+NbYGy3JznQ\nvW97klwzdN9t3dheSPLp6fR68qYa/iSrgC8DVwMXATckuWiafZqQT1TVzNDXRbcCO6tqHbCz217q\n7gGumtO20DiuBtZ1yybgrpPUx1Hdw3vHBnBn977NVNUjAN3f4wbg4u45X+n+bpe9aR/5LwP2VtXL\nVfVT4H5g/ZT71If1wLZufRtw7RT7ckKq6nHgzTnNC41jPXBvDTwBnJ7knJPT08VbYGwLWQ/cX1U/\nqaofAHsZ/N0ue9MO/7nAq0Pb+7u25ayAx5LsTrKpa1tdVQe79deA1dPp2tgWGsdKeR83d5ctW4cu\nzVbK2N5j2uFfiT5eVZcwOBW+JckVw3fW4OuVZf8Vy0oZx5C7gAuBGeAgcMd0u9O/aYf/AHD+0PZ5\nXduyVVUHutvDwEMMThEPzZ4Gd7eHp9fDsSw0jmX/PlbVoao6WlXvAHdz7NR+2Y9tIdMO/5PAuiRr\nk7yPwQcr26fcp5EleX+S02bXgU8BzzAY08buYRuBh6fTw7EtNI7twGe6T/0/Brw1dHmwLMz5jOI6\nBu8bDMa2IcmpSdYy+FDz2ye7f32Y6r/qq6ojSTYDjwKrgK1V9ew0+zSm1cBDSWDw3/ZrVfXNJE8C\nDya5EXgFuH6KfTwhSe4DrgTOSrIf+ALwV8w/jkeAaxh8GPYj4LMnvcOLsMDYrkwyw+BSZh9wE0BV\nPZvkQeA54AhwS1UdnUa/J81f+EmNmvZpv6QpMfxSowy/1CjDLzXK8EuNMvxSowy/1CjDLzXqfwFe\nIOBcSsg4NQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_m90y74OWorG" + }, + "source": [ + "### lax.conv and lax.conv_with_general_padding" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Pv9_QPDnWssM" + }, + "source": [ + "These are the simple convenience functions for convolutions\n", + "\n", + "️⚠️ The convenience `lax.conv`, `lax.conv_with_general_padding` helper function assume __NCHW__ images and __OIHW__ kernels." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "kppxbxpZW0nb", + "outputId": "0d72fdd9-19d7-45ae-891b-b19df819620f", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 628 + } + }, + "source": [ + "out = lax.conv(np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", + " np.transpose(kernel,[3,2,0,1]), # rhs = OIHW conv kernel tensor\n", + " (1, 1), # window strides\n", + " 'SAME') # padding mode\n", + "print(\"out shape: \", out.shape)\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,0,:,:]);" + ], + "execution_count": 153, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 3, 200, 198)\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAJBCAYAAACqM9quAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAaP0lEQVR4nO3df6zld13n8dd7Z7SJUzdtd7pNhUIL\nKQ1qulXHSqIQdpHaEkPFP6CNUVSyhQSIzZooaLIQExNXrXZ1s5gSGiCpBVysNqZVuqwr2cQqU2zG\nQhmZYhumO7YdCmKLYe3w3j/mzHBnuMNM594zZ5j345Hc3O/5nB/fz3zzvdPnfD/n3FZ3BwBgon+1\n6gkAAKyKEAIAxhJCAMBYQggAGEsIAQBjCSEAYKylhVBVXV1Vu6tqT1W9bVn7AQA4WbWM3yNUVVuS\n/F2SVybZm+TjSa7v7k9t+s4AAE7S1iW97pVJ9nT3Z5Okqj6Q5Nok64bQlrO39dbzzlvSVACAyZ55\n8skceOrpWu++ZYXQc5J8bs3tvUl+4FgP3nreefmOn79xSVMBACb7vzfdfMz7VvZm6aq6oap2VtXO\nA089vappAACDLSuEHk1y0Zrbz12MHdbdt3T3ju7eseXsbUuaBgDAsS0rhD6e5NKquqSqvjXJdUnu\nXNK+AABOylLeI9Tdz1TVW5L8WZItSW7t7k8uY18AACdrWW+WTnffleSuZb0+AMBG+c3SAMBYQggA\nGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICx\nhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsI\nAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAA\nMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBj\nCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAY510CFXVRVX151X1qar6ZFX93GL8\nnVX1aFXdv/h61eZNFwBg82zdwHOfSfLz3f2Jqvr2JPdV1T2L+367u39z49MDAFiekw6h7t6XZN9i\n+5+q6sEkz9msiQEALNumvEeoqi5O8j1J/mox9Jaq2lVVt1bVuZuxDwCAzbbhEKqqs5N8OMmN3f2l\nJO9K8sIkV+TgFaObjvG8G6pqZ1XtPPDU0xudBgDAs7ahEKqqb8nBCLqtu/8wSbr7se4+0N1fTfLu\nJFeu99zuvqW7d3T3ji1nb9vINAAATspGPjVWSd6T5MHu/q014xeuedhrkjxw8tMDAFiejXxq7AeT\n/GSSv62q+xdjv5Tk+qq6IkkneTjJGzc0QwCAJdnIp8b+T5Ja5667Tn46AACnjt8sDQCMJYQAgLGE\nEAAwlhACAMbayKfGOIZzHjz4HvLtu5b/iyL3X/6138H0xRf30vcHAGcSV4QAgLGEEAAwlqWxJTi8\nJHbvrq8NvuTypexr7XLY+ZftT5I8sXv7UvYFAGcaV4QAgLFcEVqmNVeB9rzu25ayixuvuvvrxm7e\nfc1S9gUAZxpXhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhAC\nAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYa+uqJ3Am2n/5\ntiTJF1/ch8duvOrupezrrec+cnj7d7/w/KXsAwDOVK4IAQBjCSEAYCxLY0twaEns/Mv2L31fa5fD\nbnvk+5e+PwA4k7giBACMJYQAgLEsjS3RE7u3H96+efc1K5wJALAeV4QAgLGEEAAwlhACAMYSQgDA\nWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwl\nhACAsYQQADCWEAIAxhJCAMBYQggAGGvrRl+gqh5O8k9JDiR5prt3VNV5ST6Y5OIkDyd5bXd/YaP7\nAgDYTJt1Rejfd/cV3b1jcfttST7a3Zcm+ejiNgDAaWVZS2PXJnnfYvt9SX5sSfsBADhpmxFCneQj\nVXVfVd2wGLugu/cttv8hyQVHP6mqbqiqnVW188BTT2/CNAAAnp0Nv0coyQ9196NV9W+T3FNVn157\nZ3d3VfXRT+ruW5LckiRnPe+ir7sfAGDZNnxFqLsfXXx/PMkdSa5M8lhVXZgki++Pb3Q/AACbbUMh\nVFXbqurbD20nuSrJA0nuTPL6xcNen+SPN7IfAIBl2OjS2AVJ7qiqQ6/1+939p1X18SQfqqo3JHkk\nyWs3uB8AgE23oRDq7s8m+XfrjH8+ySs28toAAMvmN0sDAGMJIQBgLCEEAIwlhACAsYQQADCWEAIA\nxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAs\nIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJC\nAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQA\njCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBY\nQggAGEsIAQBjCSEAYCwhBACMtfVkn1hVlyX54JqhFyT5z0nOSfIfkzyxGP+l7r7rpGcIALAkJx1C\n3b07yRVJUlVbkjya5I4kP5Pkt7v7NzdlhgAAS7JZS2OvSPJQdz+ySa8HALB0mxVC1yW5fc3tt1TV\nrqq6tarOXe8JVXVDVe2sqp0Hnnp6k6YBAHDiNhxCVfWtSV6d5A8WQ+9K8sIcXDbbl+Sm9Z7X3bd0\n947u3rHl7G0bnQYAwLO2GVeErknyie5+LEm6+7HuPtDdX03y7iRXbsI+AAA23WaE0PVZsyxWVReu\nue81SR7YhH0AAGy6k/7UWJJU1bYkr0zyxjXDv15VVyTpJA8fdR8AwGljQyHU3U8n+TdHjf3khmYE\nAHCK+M3SAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkh\nAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIA\nxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAw1tZVTwBYnnMerMPb23c9vdR97b982+Ht\nL764l7ovgM3iihAAMJYQAgDGsjQGZ7AjlsPu3XXw+0suX8q+1i6HnX/Z/sPbT+zevpT9AWwGV4QA\ngLGEEAAwlqUxmGKxJLbndd+2lJe/8aq71x2/efc1S9kfwGZwRQgAGEsIAQBjCSEAYCwhBACMJYQA\ngLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAY\nSwgBAGMJIQBgLCEEAIy1ddUTAJZn/+XbDm9/8cWdJLnxqruXsq+3nvvI4e3f/cLzl7IPgM12QleE\nqurWqnq8qh5YM3ZeVd1TVZ9ZfD93MV5V9TtVtaeqdlXV9y5r8gAAG3GiS2PvTXL1UWNvS/LR7r40\nyUcXt5PkmiSXLr5uSPKujU8TAGDzndDSWHd/rKouPmr42iQvX2y/L8n/TvKLi/H3d3cnubeqzqmq\nC7t732ZMGDhxh5bDkuT8y/YvdV9rl8Nue+T7l7ovgM2ykTdLX7Ambv4hyQWL7eck+dyax+1djB2h\nqm6oqp1VtfPAU09vYBoAACdnUz41trj608d94JHPuaW7d3T3ji1nbzv+EwAANtlGPjX22KElr6q6\nMMnji/FHk1y05nHPXYwBK/TE7u1Jkpt3X7PimQCcPjZyRejOJK9fbL8+yR+vGf+pxafHXpLkH70/\nCAA4HZ3QFaGquj0H3xi9var2JnlHkl9L8qGqekOSR5K8dvHwu5K8KsmeJF9O8jObPGcAgE1xop8a\nu/4Yd71incd2kjdvZFIAAKeC/8UGADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGE\nEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgB\nAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAw\nlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJ\nIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhAC\nAMYSQgDAWMcNoaq6taoer6oH1oz9RlV9uqp2VdUdVXXOYvziqvrnqrp/8fV7y5w8AMBGnMgVofcm\nufqosXuSfHd3X57k75K8fc19D3X3FYuvN23ONAEANt9xQ6i7P5bkyaPGPtLdzyxu3pvkuUuYGwDA\nUm3Ge4R+Nsnda25fUlV/U1V/UVUvPdaTquqGqtpZVTsPPPX0JkwDAODZ2bqRJ1fVLyd5Jslti6F9\nSZ7X3Z+vqu9L8kdV9V3d/aWjn9vdtyS5JUnOet5FvZF5AACcjJO+IlRVP53kR5P8RHd3knT3V7r7\n84vt+5I8lORFmzBPAIBNd1IhVFVXJ/mFJK/u7i+vGT+/qrYstl+Q5NIkn92MiQIAbLbjLo1V1e1J\nXp5ke1XtTfKOHPyU2FlJ7qmqJLl38QmxlyX5lar6lyRfTfKm7n5y3RcGAFix44ZQd1+/zvB7jvHY\nDyf58EYnBQBwKvjN0gDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAY\nSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGE\nEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgB\nAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAw\nlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYa+uqJwDA\nme+cB+vw9vZdTy99f/sv35Yk+eKLe+n74pvbca8IVdWtVfV4VT2wZuydVfVoVd2/+HrVmvveXlV7\nqmp3Vf3IsiYOALBRJ7I09t4kV68z/tvdfcXi664kqarvTHJdku9aPOe/V9WWzZosAMBmOu7SWHd/\nrKouPsHXuzbJB7r7K0n+vqr2JLkyyV+e9AwB+KZ3xHLYvbu+tv2Sy5eyv0NLYudftv/w2BO7ty9l\nX3xz28ibpd9SVbsWS2fnLsaek+Rzax6zdzH2darqhqraWVU7Dzy1/PViAICjnWwIvSvJC5NckWRf\nkpue7Qt09y3dvaO7d2w5e9tJTgMA4OSd1KfGuvuxQ9tV9e4kf7K4+WiSi9Y89LmLMQA4aM1y2J7X\nfdtSdnHjVXd/3djNu69Zyr745nZSV4Sq6sI1N1+T5NAnyu5Mcl1VnVVVlyS5NMlfb2yKAADLcdwr\nQlV1e5KXJ9leVXuTvCPJy6vqiiSd5OEkb0yS7v5kVX0oyaeSPJPkzd19YDlTBwDYmBP51Nj16wy/\n5xs8/leT/OpGJgUAcCr4X2wAAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBj\nCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAY21d9QQAOPPtv3zb4e0vvrgPb994\n1d1L2d9bz30kSfK7X3j+Ul6fM4crQgDAWEIIABjL0hgAS7d2Oez8y/YvfX+HlsRue+T7l74vvrm5\nIgQAjCWEAICxLI0BcEo9sXv74e2bd1+zwpmAK0IAwGBCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQ\nADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEA\nYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCW\nEAIAxhJCAMBYQggAGEsIAQBjHTeEqurWqnq8qh5YM/bBqrp/8fVwVd2/GL+4qv55zX2/t8zJAwBs\nxNYTeMx7k/y3JO8/NNDdrzu0XVU3JfnHNY9/qLuv2KwJAgAsy3FDqLs/VlUXr3dfVVWS1yb5D5s7\nLQCA5dvoe4RemuSx7v7MmrFLqupvquovquqlx3piVd1QVTuraueBp57e4DQAAJ69E1ka+0auT3L7\nmtv7kjyvuz9fVd+X5I+q6ru6+0tHP7G7b0lyS5Kc9byLeoPzAAB41k76ilBVbU3y40k+eGisu7/S\n3Z9fbN+X5KEkL9roJAEAlmEjS2M/nOTT3b330EBVnV9VWxbbL0hyaZLPbmyKAADLcSIfn789yV8m\nuayq9lbVGxZ3XZcjl8WS5GVJdi0+Tv8/krypu5/czAkDAGyWE/nU2PXHGP/pdcY+nOTDG58WAMDy\n+c3SAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAs\nIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJC\nAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQA\njCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBY\nQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjFXd\nveo5pKqeSPJIku1J9q94OqcTx+NIjseRHI+vcSyO5HgcyfE40sTj8fzuPn+9O06LEDqkqnZ2945V\nz+N04XgcyfE4kuPxNY7FkRyPIzkeR3I8jmRpDAAYSwgBAGOdbiF0y6oncJpxPI7keBzJ8fgax+JI\njseRHI8jOR5rnFbvEQIAOJVOtytCAACnzGkRQlV1dVXtrqo9VfW2Vc/nVKuqi6rqz6vqU1X1yar6\nucX4O6vq0aq6f/H1qlXP9VSpqoer6m8Xf+6di7HzquqeqvrM4vu5q57nqVBVl605B+6vqi9V1Y2T\nzo+qurWqHq+qB9aMrXs+1EG/s/j7ZFdVfe/qZr4cxzgev1FVn178me+oqnMW4xdX1T+vOU9+b3Uz\nX45jHI9j/nxU1dsX58fuqvqR1cx6eY5xPD645lg8XFX3L8bP+PPjeFa+NFZVW5L8XZJXJtmb5ONJ\nru/uT610YqdQVV2Y5MLu/kRVfXuS+5L8WJLXJnmqu39zpRNcgap6OMmO7t6/ZuzXkzzZ3b+2COZz\nu/sXVzXHVVj8vDya5AeS/EyGnB9V9bIkTyV5f3d/92Js3fNh8R+8tyZ5VQ4ep//a3T+wqrkvwzGO\nx1VJ/ld3P1NV/yVJFsfj4iR/cuhxZ6JjHI93Zp2fj6r6ziS3J7kyyXck+Z9JXtTdB07ppJdoveNx\n1P03JfnH7v6VCefH8ZwOV4SuTLKnuz/b3f8vyQeSXLviOZ1S3b2vuz+x2P6nJA8mec5qZ3VaujbJ\n+xbb78vBWJzmFUke6u5HVj2RU6m7P5bkyaOGj3U+XJuD/wHo7r43yTmLf2ycMdY7Ht39ke5+ZnHz\n3iTPPeUTW5FjnB/Hcm2SD3T3V7r775PsycH/Dp0xvtHxqKrKwX9k335KJ3UaOx1C6DlJPrfm9t4M\njoBFnX9Pkr9aDL1lcan71ilLQQud5CNVdV9V3bAYu6C79y22/yHJBauZ2kpdlyP/Apt6fiTHPh/8\nnZL8bJK719y+pKr+pqr+oqpeuqpJrcB6Px/Tz4+XJnmsuz+zZmzq+ZHk9AghFqrq7CQfTnJjd38p\nybuSvDDJFUn2JblphdM71X6ou783yTVJ3ry41HtYH1zTHfWRx6r61iSvTvIHi6HJ58cRJp4Px1JV\nv5zkmSS3LYb2JXled39Pkv+U5Per6l+van6nkJ+P9V2fI/8xNfX8OOx0CKFHk1y05vZzF2OjVNW3\n5GAE3dbdf5gk3f1Ydx/o7q8meXfOsMu330h3P7r4/niSO3Lwz/7YoSWOxffHVzfDlbgmySe6+7Fk\n9vmxcKzzYezfKVX100l+NMlPLOIwiyWgzy+270vyUJIXrWySp8g3+PmYfH5sTfLjST54aGzq+bHW\n6RBCH09yaVVdsvgX73VJ7lzxnE6pxZrte5I82N2/tWZ87fsaXpPkgaOfeyaqqm2LN42nqrYluSoH\n/+x3Jnn94mGvT/LHq5nhyhzxL7mp58caxzof7kzyU4tPj70kB98Uum+9FziTVNXVSX4hyau7+8tr\nxs9fvMk+VfWCJJcm+exqZnnqfIOfjzuTXFdVZ1XVJTl4PP76VM9vRX44yae7e++hgannx1pbVz2B\nxScc3pLkz5JsSXJrd39yxdM61X4wyU8m+dtDH2lM8ktJrq+qK3Lwkv/DSd64mumdchckueNgH2Zr\nkt/v7j+tqo8n+VBVvSHJIzn4hr8RFkH4yhx5Dvz6lPOjqm5P8vIk26tqb5J3JPm1rH8+3JWDnxjb\nk+TLOfjpujPKMY7H25OcleSexc/Ovd39piQvS/IrVfUvSb6a5E3dfaJvLP6mcIzj8fL1fj66+5NV\n9aEkn8rBJcQ3n0mfGEvWPx7d/Z58/XsMkwHnx/Gs/OPzAACrcjosjQEArIQQAgDGEkIAwFhCCAAY\nSwgBAGMJIQBgLCEEAIwlhACAsf4/QXaJowhPRekAAAAASUVORK5CYII=\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "aonr1tWvYCW9", + "outputId": "1b61e1b7-331d-4b60-b524-73a0fbad3ed9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 628 + } + }, + "source": [ + "out = lax.conv_with_general_padding(\n", + " np.transpose(img,[0,3,1,2]), # lhs = NCHW image tensor\n", + " np.transpose(kernel,[2,3,0,1]), # rhs = IOHW conv kernel tensor\n", + " (1, 1), # window strides\n", + " ((2,2),(2,2)), # general padding 2x2\n", + " (1,1), # lhs/image dilation\n", + " (1,1)) # rhs/kernel dilation\n", + "print(\"out shape: \", out.shape)\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,0,:,:]);" + ], + "execution_count": 154, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 3, 202, 200)\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "lyOwGRez_ycJ" + }, + "source": [ + "### Dimension Numbers define dimensional layout for conv_general_dilated\n", + "\n", + "The important argument is the 3-tuple of axis layout arguments:\n", + "(Input Layout, Kernel Layout, Output Layout)\n", + " - __N__ - batch dimension\n", + " - __H__ - spatial height\n", + " - __W__ - spatial height\n", + " - __C__ - channel dimension\n", + " - __I__ - kernel _input_ channel dimension\n", + " - __O__ - kernel _output_ channel dimension\n", + "\n", + "⚠️ To demonstrate the flexibility of dimension numbers we choose a __NHWC__ image and __HWIO__ kernel convention for `lax.conv_general_dilated` below." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "oXKebfCb_i2B", + "outputId": "0243bbe8-ac5a-4923-8c6f-454a8d28f04b", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "dn = lax.conv_dimension_numbers(img.shape, # only ndim matters, not shape\n", + " kernel.shape, # only ndim matters, not shape \n", + " ('NHWC', 'HWIO', 'NHWC')) # the important bit\n", + "print(dn)" + ], + "execution_count": 155, + "outputs": [ + { + "output_type": "stream", + "text": [ + "ConvDimensionNumbers(lhs_spec=(0, 3, 1, 2), rhs_spec=(3, 2, 0, 1), out_spec=(0, 3, 1, 2))\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "elZys_HzFVG6" + }, + "source": [ + "#### SAME padding, no stride, no dilation" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "rgb2T15aFVG6", + "outputId": "2dae283f-21a6-4ca6-bf10-eaa247e579e7", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 628 + } + }, + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " 'SAME', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape)\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ], + "execution_count": 156, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 200, 198, 3)\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAJBCAYAAACqM9quAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAaP0lEQVR4nO3df6zld13n8dd7Z7SJUzdtd7pNhUIL\nKQ1qulXHSqIQdpHaEkPFP6CNUVSyhQSIzZooaLIQExNXrXZ1s5gSGiCpBVysNqZVuqwr2cQqU2zG\nQhmZYhumO7YdCmKLYe3w3j/mzHBnuMNM594zZ5j345Hc3O/5nB/fz3zzvdPnfD/n3FZ3BwBgon+1\n6gkAAKyKEAIAxhJCAMBYQggAGEsIAQBjCSEAYKylhVBVXV1Vu6tqT1W9bVn7AQA4WbWM3yNUVVuS\n/F2SVybZm+TjSa7v7k9t+s4AAE7S1iW97pVJ9nT3Z5Okqj6Q5Nok64bQlrO39dbzzlvSVACAyZ55\n8skceOrpWu++ZYXQc5J8bs3tvUl+4FgP3nreefmOn79xSVMBACb7vzfdfMz7VvZm6aq6oap2VtXO\nA089vappAACDLSuEHk1y0Zrbz12MHdbdt3T3ju7eseXsbUuaBgDAsS0rhD6e5NKquqSqvjXJdUnu\nXNK+AABOylLeI9Tdz1TVW5L8WZItSW7t7k8uY18AACdrWW+WTnffleSuZb0+AMBG+c3SAMBYQggA\nGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICx\nhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsI\nAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAA\nMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBj\nCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAY510CFXVRVX151X1qar6ZFX93GL8\nnVX1aFXdv/h61eZNFwBg82zdwHOfSfLz3f2Jqvr2JPdV1T2L+367u39z49MDAFiekw6h7t6XZN9i\n+5+q6sEkz9msiQEALNumvEeoqi5O8j1J/mox9Jaq2lVVt1bVuZuxDwCAzbbhEKqqs5N8OMmN3f2l\nJO9K8sIkV+TgFaObjvG8G6pqZ1XtPPDU0xudBgDAs7ahEKqqb8nBCLqtu/8wSbr7se4+0N1fTfLu\nJFeu99zuvqW7d3T3ji1nb9vINAAATspGPjVWSd6T5MHu/q014xeuedhrkjxw8tMDAFiejXxq7AeT\n/GSSv62q+xdjv5Tk+qq6IkkneTjJGzc0QwCAJdnIp8b+T5Ja5667Tn46AACnjt8sDQCMJYQAgLGE\nEAAwlhACAMbayKfGOIZzHjz4HvLtu5b/iyL3X/6138H0xRf30vcHAGcSV4QAgLGEEAAwlqWxJTi8\nJHbvrq8NvuTypexr7XLY+ZftT5I8sXv7UvYFAGcaV4QAgLFcEVqmNVeB9rzu25ayixuvuvvrxm7e\nfc1S9gUAZxpXhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhAC\nAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYa+uqJ3Am2n/5\ntiTJF1/ch8duvOrupezrrec+cnj7d7/w/KXsAwDOVK4IAQBjCSEAYCxLY0twaEns/Mv2L31fa5fD\nbnvk+5e+PwA4k7giBACMJYQAgLEsjS3RE7u3H96+efc1K5wJALAeV4QAgLGEEAAwlhACAMYSQgDA\nWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwl\nhACAsYQQADCWEAIAxhJCAMBYQggAGGvrRl+gqh5O8k9JDiR5prt3VNV5ST6Y5OIkDyd5bXd/YaP7\nAgDYTJt1Rejfd/cV3b1jcfttST7a3Zcm+ejiNgDAaWVZS2PXJnnfYvt9SX5sSfsBADhpmxFCneQj\nVXVfVd2wGLugu/cttv8hyQVHP6mqbqiqnVW188BTT2/CNAAAnp0Nv0coyQ9196NV9W+T3FNVn157\nZ3d3VfXRT+ruW5LckiRnPe+ir7sfAGDZNnxFqLsfXXx/PMkdSa5M8lhVXZgki++Pb3Q/AACbbUMh\nVFXbqurbD20nuSrJA0nuTPL6xcNen+SPN7IfAIBl2OjS2AVJ7qiqQ6/1+939p1X18SQfqqo3JHkk\nyWs3uB8AgE23oRDq7s8m+XfrjH8+ySs28toAAMvmN0sDAGMJIQBgLCEEAIwlhACAsYQQADCWEAIA\nxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAs\nIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJC\nAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQA\njCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBY\nQggAGEsIAQBjCSEAYCwhBACMtfVkn1hVlyX54JqhFyT5z0nOSfIfkzyxGP+l7r7rpGcIALAkJx1C\n3b07yRVJUlVbkjya5I4kP5Pkt7v7NzdlhgAAS7JZS2OvSPJQdz+ySa8HALB0mxVC1yW5fc3tt1TV\nrqq6tarOXe8JVXVDVe2sqp0Hnnp6k6YBAHDiNhxCVfWtSV6d5A8WQ+9K8sIcXDbbl+Sm9Z7X3bd0\n947u3rHl7G0bnQYAwLO2GVeErknyie5+LEm6+7HuPtDdX03y7iRXbsI+AAA23WaE0PVZsyxWVReu\nue81SR7YhH0AAGy6k/7UWJJU1bYkr0zyxjXDv15VVyTpJA8fdR8AwGljQyHU3U8n+TdHjf3khmYE\nAHCK+M3SAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkh\nAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIA\nxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAw1tZVTwBYnnMerMPb23c9vdR97b982+Ht\nL764l7ovgM3iihAAMJYQAgDGsjQGZ7AjlsPu3XXw+0suX8q+1i6HnX/Z/sPbT+zevpT9AWwGV4QA\ngLGEEAAwlqUxmGKxJLbndd+2lJe/8aq71x2/efc1S9kfwGZwRQgAGEsIAQBjCSEAYCwhBACMJYQA\ngLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAY\nSwgBAGMJIQBgLCEEAIy1ddUTAJZn/+XbDm9/8cWdJLnxqruXsq+3nvvI4e3f/cLzl7IPgM12QleE\nqurWqnq8qh5YM3ZeVd1TVZ9ZfD93MV5V9TtVtaeqdlXV9y5r8gAAG3GiS2PvTXL1UWNvS/LR7r40\nyUcXt5PkmiSXLr5uSPKujU8TAGDzndDSWHd/rKouPmr42iQvX2y/L8n/TvKLi/H3d3cnubeqzqmq\nC7t732ZMGDhxh5bDkuT8y/YvdV9rl8Nue+T7l7ovgM2ykTdLX7Ambv4hyQWL7eck+dyax+1djB2h\nqm6oqp1VtfPAU09vYBoAACdnUz41trj608d94JHPuaW7d3T3ji1nbzv+EwAANtlGPjX22KElr6q6\nMMnji/FHk1y05nHPXYwBK/TE7u1Jkpt3X7PimQCcPjZyRejOJK9fbL8+yR+vGf+pxafHXpLkH70/\nCAA4HZ3QFaGquj0H3xi9var2JnlHkl9L8qGqekOSR5K8dvHwu5K8KsmeJF9O8jObPGcAgE1xop8a\nu/4Yd71incd2kjdvZFIAAKeC/8UGADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGE\nEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgB\nAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAw\nlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJ\nIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhAC\nAMYSQgDAWMcNoaq6taoer6oH1oz9RlV9uqp2VdUdVXXOYvziqvrnqrp/8fV7y5w8AMBGnMgVofcm\nufqosXuSfHd3X57k75K8fc19D3X3FYuvN23ONAEANt9xQ6i7P5bkyaPGPtLdzyxu3pvkuUuYGwDA\nUm3Ge4R+Nsnda25fUlV/U1V/UVUvPdaTquqGqtpZVTsPPPX0JkwDAODZ2bqRJ1fVLyd5Jslti6F9\nSZ7X3Z+vqu9L8kdV9V3d/aWjn9vdtyS5JUnOet5FvZF5AACcjJO+IlRVP53kR5P8RHd3knT3V7r7\n84vt+5I8lORFmzBPAIBNd1IhVFVXJ/mFJK/u7i+vGT+/qrYstl+Q5NIkn92MiQIAbLbjLo1V1e1J\nXp5ke1XtTfKOHPyU2FlJ7qmqJLl38QmxlyX5lar6lyRfTfKm7n5y3RcGAFix44ZQd1+/zvB7jvHY\nDyf58EYnBQBwKvjN0gDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAY\nSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGE\nEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgB\nAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAw\nlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYa+uqJwDA\nme+cB+vw9vZdTy99f/sv35Yk+eKLe+n74pvbca8IVdWtVfV4VT2wZuydVfVoVd2/+HrVmvveXlV7\nqmp3Vf3IsiYOALBRJ7I09t4kV68z/tvdfcXi664kqarvTHJdku9aPOe/V9WWzZosAMBmOu7SWHd/\nrKouPsHXuzbJB7r7K0n+vqr2JLkyyV+e9AwB+KZ3xHLYvbu+tv2Sy5eyv0NLYudftv/w2BO7ty9l\nX3xz28ibpd9SVbsWS2fnLsaek+Rzax6zdzH2darqhqraWVU7Dzy1/PViAICjnWwIvSvJC5NckWRf\nkpue7Qt09y3dvaO7d2w5e9tJTgMA4OSd1KfGuvuxQ9tV9e4kf7K4+WiSi9Y89LmLMQA4aM1y2J7X\nfdtSdnHjVXd/3djNu69Zyr745nZSV4Sq6sI1N1+T5NAnyu5Mcl1VnVVVlyS5NMlfb2yKAADLcdwr\nQlV1e5KXJ9leVXuTvCPJy6vqiiSd5OEkb0yS7v5kVX0oyaeSPJPkzd19YDlTBwDYmBP51Nj16wy/\n5xs8/leT/OpGJgUAcCr4X2wAAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBYQggAGEsIAQBj\nCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAY21d9QQAOPPtv3zb4e0vvrgPb994\n1d1L2d9bz30kSfK7X3j+Ul6fM4crQgDAWEIIABjL0hgAS7d2Oez8y/YvfX+HlsRue+T7l74vvrm5\nIgQAjCWEAICxLI0BcEo9sXv74e2bd1+zwpmAK0IAwGBCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQ\nADCWEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEA\nYwkhAGAsIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCW\nEAIAxhJCAMBYQggAGEsIAQBjHTeEqurWqnq8qh5YM/bBqrp/8fVwVd2/GL+4qv55zX2/t8zJAwBs\nxNYTeMx7k/y3JO8/NNDdrzu0XVU3JfnHNY9/qLuv2KwJAgAsy3FDqLs/VlUXr3dfVVWS1yb5D5s7\nLQCA5dvoe4RemuSx7v7MmrFLqupvquovquqlx3piVd1QVTuraueBp57e4DQAAJ69E1ka+0auT3L7\nmtv7kjyvuz9fVd+X5I+q6ru6+0tHP7G7b0lyS5Kc9byLeoPzAAB41k76ilBVbU3y40k+eGisu7/S\n3Z9fbN+X5KEkL9roJAEAlmEjS2M/nOTT3b330EBVnV9VWxbbL0hyaZLPbmyKAADLcSIfn789yV8m\nuayq9lbVGxZ3XZcjl8WS5GVJdi0+Tv8/krypu5/czAkDAGyWE/nU2PXHGP/pdcY+nOTDG58WAMDy\n+c3SAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAs\nIQQAjCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJC\nAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQA\njCWEAICxhBAAMJYQAgDGEkIAwFhCCAAYSwgBAGMJIQBgLCEEAIwlhACAsYQQADCWEAIAxhJCAMBY\nQggAGEsIAQBjCSEAYCwhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAYwkhAGAsIQQAjFXd\nveo5pKqeSPJIku1J9q94OqcTx+NIjseRHI+vcSyO5HgcyfE40sTj8fzuPn+9O06LEDqkqnZ2945V\nz+N04XgcyfE4kuPxNY7FkRyPIzkeR3I8jmRpDAAYSwgBAGOdbiF0y6oncJpxPI7keBzJ8fgax+JI\njseRHI8jOR5rnFbvEQIAOJVOtytCAACnzGkRQlV1dVXtrqo9VfW2Vc/nVKuqi6rqz6vqU1X1yar6\nucX4O6vq0aq6f/H1qlXP9VSpqoer6m8Xf+6di7HzquqeqvrM4vu5q57nqVBVl605B+6vqi9V1Y2T\nzo+qurWqHq+qB9aMrXs+1EG/s/j7ZFdVfe/qZr4cxzgev1FVn178me+oqnMW4xdX1T+vOU9+b3Uz\nX45jHI9j/nxU1dsX58fuqvqR1cx6eY5xPD645lg8XFX3L8bP+PPjeFa+NFZVW5L8XZJXJtmb5ONJ\nru/uT610YqdQVV2Y5MLu/kRVfXuS+5L8WJLXJnmqu39zpRNcgap6OMmO7t6/ZuzXkzzZ3b+2COZz\nu/sXVzXHVVj8vDya5AeS/EyGnB9V9bIkTyV5f3d/92Js3fNh8R+8tyZ5VQ4ep//a3T+wqrkvwzGO\nx1VJ/ld3P1NV/yVJFsfj4iR/cuhxZ6JjHI93Zp2fj6r6ziS3J7kyyXck+Z9JXtTdB07ppJdoveNx\n1P03JfnH7v6VCefH8ZwOV4SuTLKnuz/b3f8vyQeSXLviOZ1S3b2vuz+x2P6nJA8mec5qZ3VaujbJ\n+xbb78vBWJzmFUke6u5HVj2RU6m7P5bkyaOGj3U+XJuD/wHo7r43yTmLf2ycMdY7Ht39ke5+ZnHz\n3iTPPeUTW5FjnB/Hcm2SD3T3V7r775PsycH/Dp0xvtHxqKrKwX9k335KJ3UaOx1C6DlJPrfm9t4M\njoBFnX9Pkr9aDL1lcan71ilLQQud5CNVdV9V3bAYu6C79y22/yHJBauZ2kpdlyP/Apt6fiTHPh/8\nnZL8bJK719y+pKr+pqr+oqpeuqpJrcB6Px/Tz4+XJnmsuz+zZmzq+ZHk9AghFqrq7CQfTnJjd38p\nybuSvDDJFUn2JblphdM71X6ou783yTVJ3ry41HtYH1zTHfWRx6r61iSvTvIHi6HJ58cRJp4Px1JV\nv5zkmSS3LYb2JXled39Pkv+U5Per6l+van6nkJ+P9V2fI/8xNfX8OOx0CKFHk1y05vZzF2OjVNW3\n5GAE3dbdf5gk3f1Ydx/o7q8meXfOsMu330h3P7r4/niSO3Lwz/7YoSWOxffHVzfDlbgmySe6+7Fk\n9vmxcKzzYezfKVX100l+NMlPLOIwiyWgzy+270vyUJIXrWySp8g3+PmYfH5sTfLjST54aGzq+bHW\n6RBCH09yaVVdsvgX73VJ7lzxnE6pxZrte5I82N2/tWZ87fsaXpPkgaOfeyaqqm2LN42nqrYluSoH\n/+x3Jnn94mGvT/LHq5nhyhzxL7mp58caxzof7kzyU4tPj70kB98Uum+9FziTVNXVSX4hyau7+8tr\nxs9fvMk+VfWCJJcm+exqZnnqfIOfjzuTXFdVZ1XVJTl4PP76VM9vRX44yae7e++hgannx1pbVz2B\nxScc3pLkz5JsSXJrd39yxdM61X4wyU8m+dtDH2lM8ktJrq+qK3Lwkv/DSd64mumdchckueNgH2Zr\nkt/v7j+tqo8n+VBVvSHJIzn4hr8RFkH4yhx5Dvz6lPOjqm5P8vIk26tqb5J3JPm1rH8+3JWDnxjb\nk+TLOfjpujPKMY7H25OcleSexc/Ovd39piQvS/IrVfUvSb6a5E3dfaJvLP6mcIzj8fL1fj66+5NV\n9aEkn8rBJcQ3n0mfGEvWPx7d/Z58/XsMkwHnx/Gs/OPzAACrcjosjQEArIQQAgDGEkIAwFhCCAAY\nSwgBAGMJIQBgLCEEAIwlhACAsf4/QXaJowhPRekAAAAASUVORK5CYII=\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "E4i3TI5JFVG9" + }, + "source": [ + "#### VALID padding, no stride, no dilation" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "1HQwudKVFVG-", + "outputId": "a141ffd2-9c7c-4633-b752-7cd345632fdf", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 628 + } + }, + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " 'VALID', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \"DIFFERENT from above!\")\n", + "print(\"First output channel:\")\n", + "plt.figure(figsize=(10,10))\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ], + "execution_count": 157, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 198, 196, 3) DIFFERENT from above!\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n42RhexzJNjmSbXI42+NItsmRbJPDTd4eTo0BAGMJIQBgrJMthK5f9wROMrbHkWyTI9kmh7M9jmSb\nHMk2OdzY7XFSXSMEAHAinWxHhAAATpiTIoSq6rKq2ltV91bV29c9n3WoqnOr6s+r6tNV9amq+rnF\n+Luq6qGqumvx9ep1z/VEqar7q+pvF3/u3YuxM6vq9qr67OL7Geue54lSVRcu7Qd3VdWXq+qaaftI\nVd1QVY9W1d1LYxvuF3XA7yz+btlTVd+7vpmvxlG2x29U1WcWf+abq+r0xfh5VfXPS/vK761v5qtz\nlG1y1J+TqnrHYh/ZW1U/sp5Zr9ZRtsmHlrbH/VV112J8xH5y0NpPjVXVtiR/l+RVSR5M8okkV3X3\np9c6sROsqs5Jck53f7Kqvj3JnUl+LMnrkjzR3b+51gmuQVXdn2RXd+9bGvv1JI93968tovmM7v7F\ndc1xXRY/Nw8l+YEkP5NB+0hVvTzJE0k+0N3fvRjbcL9Y/MfubUlenQPb6r929w+sa+6rcJTtcWmS\n/9XdT1XVf0mSxfY4L8n/OPi6U9VRtsm7ssHPSVV9Z5KbklyS5DuS/M8kL+7u/Sd00iu20TZ52vPX\nJvnH7v6VKfvJQSfDEaFLktzb3Z/r7v+X5INJrljznE647n64uz+5WP6nJPckee56Z3VSuiLJ+xfL\n78+BWJzolUnu6+4H1j2RE627P57k8acNH22/uCIH/uLv7r4jyemLf3ScMjbaHt390e5+avHwjiTP\nO+ETW6Oj7CNHc0WSD3b3V7v775PcmwP/XTqlfKNtUlWVA//ovumETuokcTKE0HOTfH7p8YMZHgCL\nGv+eJH+1GHrr4hD3DZNOBSXpJB+tqjur6urF2Nnd/fBi+R+SnL2eqa3dlTn8L62p+8hBR9sv/P2S\n/GyS25Yen19Vf1NVf1FVL1vXpNZko58T+0jysiSPdPdnl8bG7CcnQwixpKpOS/KRJNd095eTvDvJ\ni5JcnOThJNeucXon2g919/cmuTzJWxaHdg/pA+d1x932WFXfmuQ1Sf5gMTR5HznC1P1iI1X1y0me\nSnLjYujhJM/v7u9J8p+S/H5V/et1ze8E83NydFfl8H9YjdpPToYQeijJuUuPn7cYG6eqviUHIujG\n7v6jJOnuR7p7f3d/Lcl7cgoesj2a7n5o8f3RJDfnwJ/9kYOnNhbfH13fDNfm8iSf7O5Hktn7yJKj\n7Rdj/36pqp9O8qNJfmIRh1mc/vnCYvnOJPclefHaJnkCfYOfk7H7SJJU1fYkP57kQwfHpu0nJ0MI\nfSLJBVV1/uJfulcmuWXNczrhFudo35vknu7+raXx5esZXpvk7qe/91RUVTsWF42nqnYkuTQH/uy3\nJHnD4mVvSPIn65nhWh32r7ep+8jTHG2/uCXJTy3uHntpDlwM+vBGH3AqqarLkvxCktd091eWxs9a\nXGifqnphkguSfG49szyxvsHPyS1Jrqyq51TV+TmwTf76RM9vjX44yWe6+8GDA9P2k+3rnsDiroa3\nJvmzJNuS3NDdn1rztNbhB5P8ZJK/PXgLY5JfSnJVVV2cA4f670/ypvVM74Q7O8nNB/ow25P8fnf/\naVV9IsmHq+qNSR7IgQv8xlhE4aty+H7w65P2kaq6KckrkuysqgeTvDPJr2Xj/eLWHLhj7N4kX8mB\nO+xOKUfZHu9I8pwkty9+hu7o7jcneXmSX6mqf0nytSRv7u5jvaj4m8ZRtskrNvo56e5PVdWHk3w6\nB04jvuVUu2Ms2XibdPd7c+T1hsmQ/eSgtd8+DwCwLifDqTEAgLUQQgDAWEIIABhLCAEAYwkhAGAs\nIQQAjCWEAICxhBAAMNb/BwN3joMOviDcAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "VYKZdqLIFVHB" + }, + "source": [ + "#### SAME padding, 2,2 stride, no dilation" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "mKq2-zmmFVHC", + "outputId": "065e2f69-3f1d-4d19-864d-28ef59f1b0f8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 627 + } + }, + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (2,2), # window strides\n", + " 'SAME', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \" <-- half the size of above\")\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ], + "execution_count": 158, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 100, 99, 3) <-- half the size of above\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nTlU9UFV/vzg+XFX3LK61T1XVubu9Rr6jqs6vqlur6l+q6uGqer1rbG+rqj9Y/Jv4xaq6pape7Drb\nP3Y0eKrqnCR/leRXkrw6ydVV9eqdXAMbsprkD7v71Ulel+R3FufphiSf6+5XJfnc4pi94z1JHj7l\n+C+TfKi7X5nkP5Ncuyur4oV8JMk/dvdPJ/nZrJ0719geVVUXJ3l3kiPd/TNJzknyzrjO9o2dvsPz\n2iSPdPej3f2tJJ9MctUOr4Ez6O4nuvv+xff/lbV/iC/O2rm6efG0m5Mc250V8r2q6pIkb03yscVx\nJTma5NbFU5yvPaSqXprkTUluSpLu/lZ3PxvX2F63kuQlVbWS5ECSJ+I62zd2OnguTvL4KccnFmPs\nUVX1iiSvSXJPkkPd/cTioSeTHNqlZXG6Dyf54yT/szh+WZJnu3t1cexa21sOJ3kmyd8sXob8WFUd\njGtsz+ruk0k+kOSxrIXO15PcF9fZvmHTMi+oqn4wyd8l+f3u/sapj/Xa2/u8xW8PqKq3JXm6u+/b\n7bWwYStJfj7JR7v7NUmey/e8fOUa21sW+6muylqs/liSg0nevKuL4qzsdPCcTHLpKceXLMbYY6rq\nRVmLnU9092cWw09V1UWLxy9K8vRurY/v8sYkv1pV/561l4mPZm1/yPmLW++Ja22vOZHkRHffszi+\nNWsB5Brbu34pyVe6+5nu/naSz2Tt2nOd7RM7HTz3JnnVYlf7uVnb8HXHDq+BM1js/7gpycPd/cFT\nHrojyTWL769JcvtOr43TdfefdPcl3f2KrF1Td3b3rye5K8nbF09zvvaQ7n4yyeNV9VOLoSuTPBTX\n2F72WJLXVdWBxb+R/3fOXGf7xI5/8GBVvSVr+w3OSfLx7v7zHV0AZ1RVv5Dk7iQP5jt7Qv40a/t4\nPp3kx7P2V+/f0d1f25VFsq6q+sUkf9Tdb6uqn8zaHZ8LkzyQ5De6+5u7uT6+o6p+LmubzM9N8miS\n38raf0JdY3tUVf1Zkl/L2jtZH0jy21nbs+M62wd80jIAMJ5NywDAeIIHABhP8AAA4wkeAGA8wQMA\njCd4AIDxBA8AMJ7gAQDG+1+hhyBcEjzN/wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "gPxttaiaFVHE" + }, + "source": [ + "#### VALID padding, no stride, rhs kernel dilation ~ Atrous convolution (excessive to illustrate)" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "_pGr0x6qFVHF", + "outputId": "5387205f-3c23-4203-ff1b-ae5115eed5f7", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 628 + } + }, + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " 'VALID', # padding mode\n", + " (1,1), # lhs/image dilation\n", + " (12,12), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape)\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ], + "execution_count": 159, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 176, 174, 3)\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nSQQBACOJIABgJBEEAIwkggCAkUQQADCSCAIARhJBAMBIIggAGEkEAQAjiSAAYCQRBACMJIIAgJFE\nEAAwkggCAEYSQQDASCIIABhJBAEAI4kgAGAkEQQAjCSCAICRRBAAMJIIAgBGEkEAwEgiCAAYSQQB\nACOJIABgJBEEAIwkggCAkUQQADCSCAIARhJBAMBIIggAGEkEAQAjiSAAYCQRBACMVN297hlSVV9M\n8tkk5yb5yzWPsw4T93viPif2e5qJ+z1xnxP7vdP9k+7+1qMXd0QEPayqDnX3/nXP8VibuN8T9zmx\n3+ue47E2cb8n7nNiv9c9x1Z5OQwAGEkEAQAj7bQIum7dA6zJxP2euM+J/Z5m4n5P3OfEfp+SdtR7\nggAAHis77UwQAMBjYkdEUFVdVlWfrKrDVfXqdc+zXarqgqp6f1XdUVW3V9XLF+vnVNX7qupTi9/P\nXvesq1ZVe6rqT6vq9xa3L6qqWxfH/MaqOm3dM65aVZ1VVe+qqk9U1Z1V9T1DjvU1iz/ft1XV26vq\nG3fj8a6q66vqvqq6bdPaMY9vbfj1xf5/rKqevr7Jl3Oc/f6lxZ/zj1XV71TVWZvue81ivz9ZVc9b\nz9TLO9Z+b7rvlVXVVXXu4vauPt6L9Z9aHPPbq+oXN62fUsd77RFUVXuS/Ockz0/ypCQvraonrXeq\nbfNgkld295OSHEjyssW+vjrJzd19aZKbF7d3m5cnuXPT7V9Icm13X5Lkr5JcuZapttevJfmD7v7O\nJE/Nxv7v6mNdVecn+ekk+7v7KUn2JLk8u/N4vyXJZUetHe/4Pj/JpYtfVyV542M043Z4Sx653+9L\n8pTu/q4kf57kNUmy+Pl2eZInLx7zG4uf+aeit+SR+52quiDJDyT53KblXX28q+rZSQ4meWp3PznJ\nLy/WT7njvfYISvKMJIe7+9Pd/bUk78jG/7i7Tnff290fWXz9N9n4j+L52djfGxab3ZDkxeuZcHtU\n1b4kP5jkNxe3K8lzkrxrsclu3OdvTvJ9Sd6cJN39te7+cnb5sV7Ym+SbqmpvkscluTe78Hh39weS\nfOmo5eMd34NJ3tobbklyVlU9/rGZdLWOtd/d/Yfd/eDi5i1J9i2+PpjkHd39QHd/JsnhbPzMP+Uc\n53gnybVJXpVk8xtsd/XxTvKTSd7Q3Q8strlvsX7KHe+dEEHnJ7l70+0ji7VdraouTPK0JLcmOa+7\n713c9fkk561prO3yq9n4IfF3i9vfkuTLm35o7sZjflGSLyb5rcXLgL9ZVWdklx/r7r4nG/+v8HPZ\niJ+vJPlwdv/xftjxju+kn3M/keT3F1/v6v2uqoNJ7unujx51167e7yRPTPK9i5e4/2dVffdi/ZTb\n750QQeNU1ZlJfjvJK7r7rzff1xuX6+2aS/aq6oVJ7uvuD697lsfY3iRPT/LG7n5akvtz1Etfu+1Y\nJ8niPTAHsxGBT0hyRo7xEsIEu/H4nkhVvTYbL/u/bd2zbLeqelySn0/y79c9yxrsTXJONt7W8e+S\nvHNxhv+UsxMi6J4kF2y6vW+xtitV1TdkI4De1t3vXix/4eFTpYvf7zve409Bz0zyoqr6i2y81Pmc\nbLxX5qzFyyXJ7jzmR5Ic6e5bF7fflY0o2s3HOkm+P8lnuvuL3f31JO/Oxp+B3X68H3a847vrf85V\n1Y8leWGSH+n//9kru3m/L85G7H908fNtX5KPVNU/yu7e72Tj59u7Fy/3fTAbZ/nPzSm43zshgj6U\n5NLF1SOnZeNNVTeteaZtsSjlNye5s7t/ZdNdNyW5YvH1FUne81jPtl26+zXdva+7L8zGsf3j7v6R\nJO9P8kOLzXbVPidJd38+yd1V9R2LpecmuSO7+FgvfC7Jgap63OLP+8P7vauP9ybHO743JfnRxVVD\nB5J8ZdPLZqe8qrosGy95v6i7/3bTXTclubyqTq+qi7LxRuEPrmPGVevuj3f3t3X3hYufb0eSPH3x\nd39XH+8kv5vk2UlSVU9Mclo2/hHVU+94d/fafyV5QTauKLgryWvXPc827uc/z8bp8Y8l+bPFrxdk\n4z0yNyf5VJI/SnLOumfdpv1/VpLfW3z97dn4y3E4yX9Pcvq659uG/f2nSQ4tjvfvJjl7wrFO8h+T\nfCLJbUn+a5LTd+PxTvL2bLzv6evZ+A/glcc7vkkqG1fB3pXk49m4em7t+7DC/T6cjfeCPPxz7U2b\ntn/tYr8/meT5655/lft91P1/keTcIcf7tCT/bfF3/CNJnnOqHm+fGA0AjLQTXg4DAHjMiSAAYCQR\nBACMJIIAgJFEEAAwkggCAEYSQQDASCIIABjp/wLoMFWX9Nz8GQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "v-RhEeUfFVHI" + }, + "source": [ + "#### VALID padding, no stride, lhs=input dilation ~ Transposed Convolution" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "B9Ail8ppFVHJ", + "outputId": "3617a5d2-1eaa-46e8-d691-87b365ed1310", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + } + }, + "source": [ + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " ((0, 0), (0, 0)), # padding mode\n", + " (2,2), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \"<-- larger than original!\")\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ], + "execution_count": 160, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 397, 393, 3) <-- larger than original!\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n9VxOIS+N9TiSNXk26/Fc1uTZrMdzWZNnm7Ie/7K7X3a0HadECCVJVR3o7n2rnsepwno8lzV5Nuvx\nXNbk2azHc1mTZ7MeLo0BAIMJIQBgrFMphG5c9QROMdbjuazJs1mP57Imz2Y9nsuaPNv49Thl3iME\nALDTTqVXhAAAdtTKQ6iqLqmqL1XVwaq6dtXzWZWqeqiqvlhVd1fVgWXs7Kq6s6r+Zvn+klXPc7tU\n1U1V9XhV3btu7KjPv9b81nLO3FNVr1ndzLfPMdbkfVV1aDlP7q6qS9fte8+yJl+qqp9Zzay3T1Wd\nX1Wfqqr7q+q+qvr5ZXzkefI86zH5HPmeqvpsVf3lsia/soxfUFWfWZ77rVX1omX89OX2wWX/y1c5\n/632POvxoar6yrpzZO8y/oL+nTmm7l7ZV5JdSR5M8oNJXpTkL5O8apVzWuFaPJTkpUeM/Zck1y7b\n1yb59VXPcxuf/08leU2Sezd6/kkuTfLHSSrJ/iSfWfX8d3BN3pfkPx3l2Fctvz+nJ7lg+b3atern\nsMXrsSfJa5btFyf56+V5jzxPnmc9Jp8jleTMZfu0JJ9Z/re/LckVy/gNSf7Dsv0fk9ywbF+R5NZV\nP4cdWo8PJXnzUY5/Qf/OHOtr1a8IXZzkYHd/ubv/PsktSS5b8ZxOJZcluXnZvjnJm1Y4l23V3Z9O\n8vUjho/1/C9L8uFec1eSs6pqz87MdOccY02O5bIkt3T3U939lSQHs/b79YLR3Y929xeW7W8neSDJ\nuRl6njzPehzLhHOku/uJ5eZpy1cneV2SjyzjR54jz5w7H0ny+qqqHZrutnue9TiWF/TvzLGsOoTO\nTfLwutuP5Pl/kV/IOsmfVdXnq+qqZeyc7n502f5aknNWM7WVOdbzn37evGt52fqmdZdLR63Jcgnj\n1Vn7F+748+SI9UgGnyNVtauq7k7yeJI7s/bK1ze7++nlkPXP+x/XZNn/rSTfv7Mz3l5Hrkd3P3OO\nvH85R66rqtOXsRHnyJFWHUJ8109292uSvDHJNVX1U+t39trrlmM/4jf9+a9zfZILk+xN8miSD6x2\nOjuvqs5M8odJ3t3df7d+38Tz5CjrMfoc6e7D3b03yXlZe8XrlSue0koduR5V9cNJ3pO1dfnRJGcn\n+aUVTnHlVh1Ch5Kcv+72ecvYON19aPn+eJKPZu0X+LFnXpZcvj++uhmuxLGe/9jzprsfW/7D9g9J\nfjvfvbQxYk2q6rSs/Z/+73X3Hy3DY8+To63H9HPkGd39zSSfSvLjWbvEs3vZtf55/+OaLPu/L8nf\n7vBUd8S69bhkuaza3f1Ukt/J0HPkGasOoc8luWh5R/+LsvZmtdtXPKcdV1VnVNWLn9lO8tNJ7s3a\nWly5HHZlko+tZoYrc6znf3uSty+fcNif5FvrLo28oB1xvf5ns3aeJGtrcsXyKZgLklyU5LM7Pb/t\ntLx344NJHuju31i3a+R5cqz1GH6OvKyqzlq2vzfJG7L23qlPJXnzctiR58gz586bk3xyeVXxBeEY\n6/FX6/7hUFl7v9T6c+QF+ztzLLs3PmT7dPfTVfWuJH+atU+Q3dTd961yTityTpKPLu/R253k97v7\nT6rqc0luq6p3JvlqkrescI7bqqr+IMlrk7y0qh5J8t4kv5ajP/87svbphoNJvpPkHTs+4R1wjDV5\n7fJR187aJw1/Lkm6+76qui3J/UmeTnJNdx9exby30U8keVuSLy7veUiSX87c8+RY6/HWwefIniQ3\nV9WurP1D/7bu/nhV3Z/klqr61SR/kbWAzPL9d6vqYNY+mHDFKia9jY61Hp+sqpdl7dNhdye5ejn+\nhf47c1T+sjQAMNaqL40BAKyMEAIAxhJCAMBYQggAGEsIAQBjCSEAYCwhBACMJYQAgLH+P2a9mLpL\n+QBTAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "A-9OagtrVDyV" + }, + "source": [ + "We can use the last to, for instance, implement _transposed convolutions_:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "5EYIj77-NdHE", + "outputId": "f325e6cb-3079-4250-898f-ca4fb081c6c7", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + } + }, + "source": [ + "# The following is equivalent to tensorflow:\n", + "# N,H,W,C = img.shape\n", + "# out = tf.nn.conv2d_transpose(img, kernel, (N,2*H,2*W,C), (1,2,2,1))\n", + "\n", + "# transposed conv = 180deg kernel roation plus LHS dilation\n", + "# rotate kernel 180deg:\n", + "kernel_rot = np.rot90(np.rot90(kernel, axes=(0,1)), axes=(0,1))\n", + "# need a custom output padding:\n", + "padding = ((2, 1), (2, 1))\n", + "out = lax.conv_general_dilated(img, # lhs = image tensor\n", + " kernel_rot, # rhs = conv kernel tensor\n", + " (1,1), # window strides\n", + " padding, # padding mode\n", + " (2,2), # lhs/image dilation\n", + " (1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape, \"<-- transposed_conv\")\n", + "plt.figure(figsize=(10,10))\n", + "print(\"First output channel:\")\n", + "plt.imshow(onp.array(out)[0,:,:,0]);" + ], + "execution_count": 161, + "outputs": [ + { + "output_type": "stream", + "text": [ + "out shape: (1, 400, 396, 3) <-- transposed_conv\n", + "First output channel:\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\ncTTrcTTrcbSJ6/Gvu/vlx9pxSoRQklTVA919cNXzOFVYj6NZj6NZj6NZj6NZj6NZj6NZj6O5NAYA\njCWEAICxTqUQumXVEzjFWI+jWY+jWY+jWY+jWY+jWY+jWY8NTpn3CAEA7LVT6RUhAIA9tfIQqqqr\nq+rzVbVWVTetej6rUFVfrqrPVdWDVfXAMnZeVd1TVX+7fD931fPcLVV1a1U9XVUPbxg75vOvde9b\nzpeHquqK1c18dxxnPd5dVYeXc+TBqrpmw753Levx+ar62dXMevdU1cVVdW9VPVpVj1TVLy3jI8+R\nF1mPkedIVX1vVX2yqj67rMevL+OXVNX9y/O+o6pesoyfudxeW/a/YpXz32kvsh4fqqovbTg/Dizj\np/Xvy6Z098q+kuxL8oUk/ybJS5J8NskrVzmnFa3Dl5O87AVj/yXJTcv2TUl+a9Xz3MXn/9NJrkjy\n8Imef5JrkvxJkkpyVZL7Vz3/PVqPdyf5T8c49pXL782ZSS5Zfp/2rfo57PB6XJDkimX7pUn+Znne\nI8+RF1mPkefI8s/57GX7jCT3L//c70xy3TL+gST/Ydn+j0k+sGxfl+SOVT+HPVqPDyV54zGOP61/\nXzbztepXhK5MstbdX+zuf0pye5JrVzynU8W1SW5btm9L8oYVzmVXdfdfJPnaC4aP9/yvTfLhXndf\nknOq6oK9meneOM56HM+1SW7v7me7+0tJ1rL+e3Xa6O4nu/szy/Y3kzyW5MIMPUdeZD2O57Q+R5Z/\nzs8sN89YvjrJa5J8ZBl/4fnx/HnzkSSvrarao+nuuhdZj+M5rX9fNmPVIXRhksc33H4iL/4Lfbrq\nJH9eVZ+uqkPL2Pnd/eSy/dUk569maitzvOc/+Zx5+/LS9a0bLpWOWo/lMsarsv5fuePPkResRzL0\nHKmqfVX1YJKnk9yT9Ve9vt7dzy2HbHzO31mPZf83kvzA3s54d71wPbr7+fPjPcv5cXNVnbmMnfbn\nx4msOoRY91PdfUWS1ye5sap+euPOXn/9cuzH+6Y//8X7k1ya5ECSJ5O8d7XT2XtVdXaSP0zyju7+\nx437Jp4jx1iPsedIdx/p7gNJLsr6q10/tOIprdQL16OqfiTJu7K+Lj+W5Lwkv7LCKZ5SVh1Ch5Nc\nvOH2RcvYKN19ePn+dJKPZv0X+annX55cvj+9uhmuxPGe/8hzprufWv7l9s9Jfif/cmljxHpU1RlZ\n/x/93+/uP1qGx54jx1qP6edIknT315Pcm+Qnsn6JZ/+ya+Nz/s56LPu/P8nf7/FU98SG9bh6uaTa\n3f1skt/NwPPjeFYdQp9Kcvny7v6XZP2Na3eteE57qqrOqqqXPr+d5GeSPJz1dbh+Oez6JB9bzQxX\n5njP/64kb1k+6XBVkm9suDxy2nrBNfufy/o5kqyvx3XLJ2EuSXJ5kk/u9fx20/L+jQ8meay7f3vD\nrpHnyPHWY+o5UlUvr6pzlu3vS/K6rL9v6t4kb1wOe+H58fx588Ykn1heUTwtHGc9/nrDfzRU1t8v\ntfH8OG1/XzZj/4kP2T3d/VxVvT3Jn2X9E2S3dvcjq5zTCpyf5KPLe/X2J/mf3f2nVfWpJHdW1duS\nfCXJm1Y4x11VVX+Q5NVJXlZVTyT5tSS/mWM//7uz/imHtSTfTvLWPZ/wLjvOerx6+bhrZ/1Thr+Y\nJN39SFXdmeTRJM8lubG7j6xi3rvoJ5P8QpLPLe97SJJfzdxz5Hjr8eah58gFSW6rqn1Z/4/7O7v7\nj6vq0SS3V9VvJPmrrMdjlu+/V1VrWf9QwnWrmPQuOt56fKKqXp71T4c9mOSG5fjT/fflhPxlaQBg\nrFVfGgMAWBkhBACMJYQAgLGEEAAwlhACAMYSQgDAWEIIABhLCAEAY/0/+/Z6Go3XJGcAAAAASUVO\nRK5CYII=\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "v8HsE-NCmUxx" + }, + "source": [ + "### 1D Convolutions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "WeP0rw0tm7HK" + }, + "source": [ + "You aren't limited to 2D convolutions, a simple 1D demo is below:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "jJ-jcAn3cig-", + "outputId": "64e578be-92c5-4aef-9d5d-ae93939f9b31", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 674 + } + }, + "source": [ + "# 1D kernel - WIO layout\n", + "kernel = onp.array([[[1, 0, -1], [-1, 0, 1]], \n", + " [[1, 1, 1], [-1, -1, -1]]], \n", + " dtype=np.float32).transpose([2,1,0])\n", + "# 1D data - NWC layout\n", + "data = onp.zeros((1, 200, 2), dtype=np.float32)\n", + "for i in range(2):\n", + " for k in range(2):\n", + " x = 35*i + 30 + 60*k\n", + " data[0, x:x+30, k] = 1.0\n", + "\n", + "print(\"in shapes:\", data.shape, kernel.shape)\n", + "\n", + "plt.figure(figsize=(10,5))\n", + "plt.plot(data[0]);\n", + "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", + " ('NWC', 'WIO', 'NWC'))\n", + "print(dn)\n", + "\n", + "out = lax.conv_general_dilated(data, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,), # window strides\n", + " 'SAME', # padding mode\n", + " (1,), # lhs/image dilation\n", + " (1,), # rhs/kernel dilation\n", + " dn) # dimension_numbers = lhs, rhs, out dimension permutation\n", + "print(\"out shape: \", out.shape)\n", + "plt.figure(figsize=(10,5))\n", + "plt.plot(out[0]);" + ], + "execution_count": 162, + "outputs": [ + { + "output_type": "stream", + "text": [ + "in shapes: (1, 200, 2) (3, 2, 2)\n", + "ConvDimensionNumbers(lhs_spec=(0, 2, 1), rhs_spec=(2, 1, 0), out_spec=(0, 2, 1))\n", + "out shape: (1, 200, 2)\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nM7P7zOx1WTwmZogglchwjtTxi/xa5SJJUmsvIkh53Mdxw3SS1CxuHdvENG7fKUnK5UxbZSoso8JN\nYmOC1FpR7a7TQasz51YB/pk6SJlZXtKbJL1I0vWSXm5m10/7uJghj8+ASyNul25JWu/ti9QZXc7v\neR9XY84mlHqbmHb3jn2+FN3H/dsZ2juqVo+v+vX7ni0jgNnLoiL1LEn3Oee+5JxrSnqHpJsyeFzM\ngnPeV0uS6k/q3SxFDDtthxWp7sHIBpMe93G91VGz3Y2s4ElSt1zRphsNUvET+sPbi0w2HzFuHtpw\ngj7hE5i16HetZK6Q9LVD/79f0ndm8LipfeLW39Vld/7XRTZhaZmcrnQtfe2gqKsiPv53X/22Xvu/\n7lS7y9yKvod3G7GTeoO1DdVdUdd/+Q/0tTfeOrj9EvdNPXjJcyP7+MJ+U694yydWdqiq0/veidoT\nSpJceVubdqCvvfE7Brc91jm9q7SlSv59kfeprBX0kfse0vN++68zb++y+L4nnNUbXvLkY7e7bld3\n/PYP6eKDrxy5/U1dp4+uvUrS+WP36VekXvGWT6g8simqzy7bDvTWVz1LxfzxGsJH3/yruvL+9y6g\nVZjWI895o572/J9Y2NfPIkidiJndLOlmSTp37txMv1b5zKV6cPM7Jn+ipz5+4Tod5J6tn4r42Ce+\n/Ii+8M1d/dBTL1PejgcHXz39qvhzCe94/KtVePAzR267q3at7rUX6pcjPv/zD+7q0/fv6Lsf92hd\nvFnOuKXL4ZnXXKTnP+kxkR+7/Ltfpk/ufFnWHc7feVT7m3rmwWfUyT8k6eyx+/yz77lW773zgVk1\nd+HuvP+C3n/XA5FBqlHf1w37f6sv5h+rb69fO7j9KXsf1QuDuyIf74ZzZ/TyZ12lvQZzpPq++si+\n/vaLD+uhWkOXn1k79vFLvv5BlVxDX9t6+gJah2ls9qZYLEoWQerr0pFfvK/s3XaEc+4WSbdI0vnz\n52da7nja835cet6Pz/JLnGo/+a/fr1faZZEfq9Zbypn0ey+/QUaQOpFn/9Qbj932sls+qtFTY/r6\nwy3/6sYn6WljAtqquvpJz9DVT3rX0Rvv+yvpbS89tr9U3wuffKle+ORL59C6xfiN996jt33sq5Ef\n273wsAJJ33riP9V3/sS/HH7gvz9XQb4eeZ+toKh//9KnzqClp9f7PvOAfv7tn1K13tLlOh6k1rt7\n+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\nmJiJapP8AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7XOgXqCTmaPa" + }, + "source": [ + "### 3D Convolutions" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "QNvSiq5-mcLd", + "outputId": "1c278db7-e2a0-4f53-d7d4-57472f2a794e", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 530 + } + }, + "source": [ + "# Random 3D kernel - HWDIO layout\n", + "kernel = onp.array([\n", + " [[0, 0, 0], [0, 1, 0], [0, 0, 0]],\n", + " [[0, -1, 0], [-1, 0, -1], [0, -1, 0]], \n", + " [[0, 0, 0], [0, 1, 0], [0, 0, 0]]], \n", + " dtype=np.float32)[:, :, :, onp.newaxis, onp.newaxis]\n", + "\n", + "# 3D data - NHWDC layout\n", + "data = onp.zeros((1, 30, 30, 30, 1), dtype=np.float32)\n", + "x, y, z = onp.mgrid[0:1:30j, 0:1:30j, 0:1:30j]\n", + "data += (onp.sin(2*x*np.pi)*onp.cos(2*y*np.pi)*onp.cos(2*z*np.pi))[None,:,:,:,None]\n", + "\n", + "print(\"in shapes:\", data.shape, kernel.shape)\n", + "dn = lax.conv_dimension_numbers(data.shape, kernel.shape,\n", + " ('NHWDC', 'HWDIO', 'NHWDC'))\n", + "print(dn)\n", + "\n", + "out = lax.conv_general_dilated(data, # lhs = image tensor\n", + " kernel, # rhs = conv kernel tensor\n", + " (1,1,1), # window strides\n", + " 'SAME', # padding mode\n", + " (1,1,1), # lhs/image dilation\n", + " (1,1,1), # rhs/kernel dilation\n", + " dn) # dimension_numbers\n", + "print(\"out shape: \", out.shape)\n", + "\n", + "# Make some simple 3d density plots:\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "def make_alpha(cmap):\n", + " my_cmap = cmap(np.arange(cmap.N))\n", + " my_cmap[:,-1] = np.linspace(0, 1, cmap.N)**3\n", + " return mpl.colors.ListedColormap(my_cmap)\n", + "my_cmap = make_alpha(plt.cm.viridis)\n", + "fig = plt.figure()\n", + "ax = fig.gca(projection='3d')\n", + "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=data.ravel(), cmap=my_cmap)\n", + "ax.axis('off')\n", + "ax.set_title('input')\n", + "fig = plt.figure()\n", + "ax = fig.gca(projection='3d')\n", + "ax.scatter(x.ravel(), y.ravel(), z.ravel(), c=out.ravel(), cmap=my_cmap)\n", + "ax.axis('off')\n", + "ax.set_title('3D conv output');" + ], + "execution_count": 163, + "outputs": [ + { + "output_type": "stream", + "text": [ + "in shapes: (1, 30, 30, 30, 1) (3, 3, 3, 1, 1)\n", + "ConvDimensionNumbers(lhs_spec=(0, 4, 1, 2, 3), rhs_spec=(4, 3, 0, 1, 2), out_spec=(0, 4, 1, 2, 3))\n", + "out shape: (1, 30, 30, 30, 1)\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n5sPtlo+3O27nmZvTiTEGOue4Hpbq9veZRXQXHoXvSsX27gvAw/shpHcO2gxFCt45QohYa3FNoqjM\nuu2ILhFyYoq1JTGmyKEEXDacSmbXtFz2HeE2Y4xl8J4pRqYQQWme9wNP1mvGGL75mTprWG+3XA0D\n7jtwJbDw22UZ9Ft47/j2tIS1BmPqgZZIXWMex5lCncCwRtNYj3fV92Dwnq5xiFKsGs/Trqc3Dl0K\nc4lMpbDuPM/XA0/7FVkEDBQlrNqGj7YbfrC7QIBDDDTW8XS1whuzCO57wFLpLrzXiPyi4hU5V+QK\nrDMowHhT/R7I3J1GlDZwXl2+6Ft0UtyPM94Jh+QRoPeWKIlTikwp82y94sVqzZwzsRRirh4LH603\nPF2tliWH94xFdBfea5SC/LAmLIK1BkHOJj2FItVgR6gVbtFn5+AiZCm83h/JZJwxGGd50Q5s2477\nOdSZZKNBKS6HAasUr44HUsmsfcNF1y2C+x6yiO7Ce48xqrqjqWqwo5VmzpFcquCiNa0x6JUm5OpG\nNiVNFqFvHDEZ2tYySeYuR+ZTZtc3fG+9xWjNzThymmda53g6DDxbrZeDsveYRXQX3nuUUmc7ydrD\nzWfrSG90nTRQgjGa05hJORFyxmjNtvMoZ0ip3n7UgaiE1ltCKvTOsWnbanxjLZumYb1E57z3LKK7\n8N7zrn+D1gpB0zj3jfHOHDJzyigNThnQipgzThvmnNiHmTlHjDV8vNmw6zpeH/bchxmjNbuu49nS\nu104s4juwnvNu9tqD1MNWkN6Z67YeYPKYLTHWkspwv00cYyRnAveaqxp2IeZxtYxsat+wBvNRdfT\nObcI7sI3LKK78N7z7REy846HL5zN0rUl5F/4/Pbe44wGo1k3nizCV8cDd/NE5xydc0t1u/ArWVzG\nFhb+gUwhMqdqfG6NxhjNy8OBwTmUUpxiQCvN9dDjjV16t+83i7XjwsJvggdDnwdLy5vxxN08A9AY\nw/Wwwi7V7cIiugsLvz1izggsK7wL77KI7sLCwsIj8mtFd7kOWlhYWHhEFtFdWFhYeEQW0V1YWFh4\nRBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhE\nFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW\n0V1YWFh4RBbRXVhYWHhEFtFdWFhYeEQW0V1YWFh4RBbRXVhYWHhE7P/l/l8bI7ywsLCw8I9nqXQX\nFhYWHpFFdBcWFhYekUV0FxYWFh6RRXQXFhYWHpFFdBcWFhYekUV0FxYWFh6R/w2rIyATdi9ssQAA\nAABJRU5ErkJggg==\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nOy9WcxlW13u/RvdbFfzrrepblftBhBQ\n4LA/9fh9H+K5+JQLNaDBiArYRbwh4couKolBjQY16JVGxUAkATQmGk00GhTsosZoOOboATe7qV17\nV/s2q53NaL+LWdSR0KiAm2bPX1JJvWusOdaqetd81pzPeP7/IVJKjIyMjIw8M8jP9RsYGRkZeTYx\niu7IyMjIM8gouiMjIyPPIKPojoyMjDyDjKI7MjIy8gyi/53xMdowMjIy8p9HfLKB8Up3ZGRk5Blk\nFN2RkZGRZ5BRdEdGRkaeQUbRHeH1r389Fy9eZDab8fznP5+3v/3t98Y+8IEPIKVkMpkwmUy4fPky\nr3nNa/j7v//7z+E7/q/lwQcf5H3ve9/n7XwjX9iMojvCj/7oj/LEE0+wXq/5/d//fd785jfzD//w\nD/fGL126xHa7ZbPZ8Ld/+7e88IUv5Gu+5mv40z/908/hux4Z+cJkFN0RXvSiF5HnOQBCCIQQPPro\nox/3PCEEly9f5id/8id5wxvewI/8yI980jn/6q/+ipe97GXs7e1x5coV3vnOdwKwWq34ru/6Lo6O\njnjggQf46Z/+aWKMALzzne/k5S9/OT/4gz/IYrHgoYce4o/+6I8A+K3f+i2+8iu/8mNe4xd/8Rd5\n1ate9Qlf//r167zqVa9if3+f5z3vefz6r//6vbHv+Z7v4c1vfvO9nz/wgQ9w+fJlAL7zO7+TJ598\nkle+8pVMJhN+7ud+jieeeAIhBL/2a7/GpUuXuHjxIr/wC7/wac838uxmFN0RAN74xjdSVRUvfOEL\nuXjxIt/wDd/wKZ//6le/mn/8x39kt9t93NjVq1f5+q//et70pjdx584dPvjBD/Lwww8D8KY3vYnV\nasVjjz3Gn//5n/Obv/mbvOMd77h37N/93d/xghe8gOPjY374h3+Y7/u+7yOlxCtf+Uo+/OEP88gj\nj9x77rvf/W5e+9rXfsL39+3f/u1cvnyZ69ev8zu/8zv82I/9GH/2Z3/27/4/vOtd7+L+++/nD/7g\nD9hut/zwD//wvbH3v//9PPLII/zJn/wJb33rW/9DlsGnmm/k2ckouiMA/PIv/zKbzYa//Mu/5NWv\nfvW9K99PxqVLl0gpsVwuP27s3e9+N1/3dV/Hd3zHd2CM4eDggIcffpgQAu9973v52Z/9WabTKQ8+\n+CA/8AM/wLve9a57xz7wwAN8//d/P0opvvu7v5sbN25w69Ytqqrim77pm3jPe94DwCOPPMKHPvSh\nT3ile+3aNf76r/+at771rRRFwcMPP8wb3vAGfvM3f/Mz+j/6iZ/4Ceq65iUveQnf+73fe++9jIz8\nZxhFd+QeSile/vKX89RTT/Erv/Irn/K5Tz/9NEII9vb2Pm7s2rVrPPe5z/24x4+Pj3HO8cADD9x7\n7IEHHuDpp5++9/OFCxfu/b2qKgC22y0Ar33ta+8J3bvf/W6++Zu/+d5z/i3Xr19nf3+f6XT6SV/n\n0+HKlSsfM9/169c/o/lGnp2MojvycXjvP6Gn+2/53d/9Xb78y7+cuq4/buzKlSuf8PjDw0OMMVy9\nevXeY08++ST33Xfff+h9veIVr7hnV7znPe/5pNbCpUuXOD09ZbPZfMLXqeuapmnujd28efNjjhfi\nExcTXbt27WPmu3Tp0mc038izk1F0n+Xcvn2b9773vWy3W0II/PEf/zHvec97+Nqv/dqPe25Kiaef\nfpq3vOUtvP3tb+dnfuZnPuGcr3vd63jf+97Hb//2b+O95+TkhA9+8IMopXjNa17Dj//4j7PZbLh6\n9Spve9vbeP3rX/8feq/GGL71W7+VH/qhH+L09JRXvOIVn/B5V65c4WUvexk/+qM/Std1/NM//RO/\n8Ru/ce91Hn74Yf7wD/+Q09NTbt68yS/90i99zPHnz5/nscce+7h5f+qnfoqmafjnf/5n3vGOd/Bt\n3/Ztn9F8I89SUkqf6s/IFzm3b99O/+N//I80n8/TdDpNL37xi9Ov/dqv3Rt///vfn4QQqa7rVFVV\nunjxYvqWb/mW9Dd/8zefct6/+Iu/SF/1VV+VptNpunz5cnrnO9+ZUkrp9PQ0ve51r0uHh4fp8uXL\n6S1veUsKIaSUUnrHO96Rvvqrv/pj5gHSI4888jHzAumNb3zjp3z9a9eupW/8xm9Mi8UiPec5z0m/\n8iu/cm+sbdv0mte8Jk2n0/SSl7wkve1tb0v33XffvfHf+73fS1euXEnz+Tz9/M//fHr88ccTkH71\n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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "DKTMw6tRZyK2" + }, + "source": [ + "## 🔪 NaNs" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ncS0NI4jZrwy" + }, + "source": [ + "### Debugging NaNs\n", + "\n", + "If you want to trace where NaNs are occurring in your functions or gradients, you can turn on the NaN-checker by:\n", + "- setting the `JAX_DEBUG_NANS=True` environment variable.\n", + "- adding `from jax.config import config` and `config.update(\"jax_debug_nans\", True)` near the top of your main file\n", + "- adding `from jax.config import config` and `config.parse_flags_with_absl()` to your main file, then set the option using a command-line flag like `--jax_debug_nans=True`.\n", + "\n", + "This will cause computations to error-out immediately on production of a NaN.\n", + "\n", + "⚠️ You shouldn't have the NaN-checker on if you're not debugging, as it can introduce lots of device-host round-trips and performance regressions!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "YTktlwTTMgFl" + }, + "source": [ + "## Double (64bit) precision\n", + "\n", + "At the moment, JAX by default enforces single-precision numbers to mitigate the Numpy API's tendency to aggressively promote operands to `double`. This is the desired behavior for many machine-learning applications, but it may catch you by surprise!" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "CNNGtzM3NDkO", + "outputId": "d1384021-d9bf-450f-a9ae-82024fa5fc1a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", + "x.dtype" + ], + "execution_count": 164, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "dtype('float32')" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 164 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "VcvqzobxNPbd" + }, + "source": [ + "To use double-precision numbers, you need to set the `jax_enable_x64` configuration variable __at startup__. \n", + "\n", + "There are a few ways to do this:\n", + "\n", + "1. You can enable 64bit mode by setting the environment variable `JAX_ENABLE_X64=True`.\n", + "\n", + "2. You can manually set the `jax_enable_x64` configuration flag at startup:\n", + "\n", + "```\n", + "# again, this only works on startup!\n", + "from jax.config import config\n", + "config.update(\"jax_enable_x64\", True)\n", + "```\n", + "\n", + "3. You can parse command-line flags with `absl.app.run(main)`\n", + "\n", + "```\n", + "from jax.config import config\n", + "config.config_with_absl()\n", + "```\n", + "\n", + "4. If you want JAX to run absl parsing for you, i.e. you don't want to do `absl.app.run(main)`, you can instead use\n", + "\n", + "```\n", + "from jax.config import config\n", + "if __name__ == '__main__':\n", + " # calls config.config_with_absl() *and* runs absl parsing\n", + " config.parse_flags_with_absl()\n", + "```\n", + "\n", + "Note that #2-#4 work for _any_ of JAX's configuration options.\n", + "\n", + "We can then confirm that `x64` mode is enabled:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab_type": "code", + "id": "HqGbBa9Rr-2g", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "cd241d63-3d00-4fd7-f9c0-afc6af01ecf4" + }, + "source": [ + "from jax import numpy as np, random\n", + "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", + "x.dtype # --> dtype('float64')" + ], + "execution_count": 165, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "dtype('float32')" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 165 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "6Cks2_gKsXaW" + }, + "source": [ + "### Caveats\n", + "⚠️ XLA doesn't support 64-bit convolutions on all backends!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "WAHjmL0E2XwO" + }, + "source": [ + "## Fin.\n", + "\n", + "If something's not covered here that has caused you weeping and gnashing of teeth, please let us know and we'll extend these introductory _advisos_!" + ] } - ], - "source": [ - "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", - "x.dtype" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "VcvqzobxNPbd" - }, - "source": [ - "To use double-precision numbers, you need to set the `jax_enable_x64` configuration variable __at startup__. \n", - "\n", - "There are a few ways to do this:\n", - "\n", - "1. You can enable 64bit mode by setting the environment variable `JAX_ENABLE_X64=True`.\n", - "\n", - "2. You can manually set the `jax_enable_x64` configuration flag at startup:\n", - "\n", - "```\n", - "# again, this only works on startup!\n", - "from jax.config import config\n", - "config.update(\"jax_enable_x64\", True)\n", - "```\n", - "\n", - "3. You can parse command-line flags with `absl.app.run(main)`\n", - "\n", - "```\n", - "from jax.config import config\n", - "config.config_with_absl()\n", - "```\n", - "\n", - "4. If you want JAX to run absl parsing for you, i.e. you don't want to do `absl.app.run(main)`, you can instead use\n", - "\n", - "```\n", - "from jax.config import config\n", - "if __name__ == '__main__':\n", - " # calls config.config_with_absl() *and* runs absl parsing\n", - " config.parse_flags_with_absl()\n", - "```\n", - "\n", - "Note that #2-#4 work for _any_ of JAX's configuration options.\n", - "\n", - "We can then confirm that `x64` mode is enabled:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "HqGbBa9Rr-2g" - }, - "outputs": [], - "source": [ - "from jax import numpy as np, random\n", - "x = random.uniform(random.PRNGKey(0), (1000,), dtype=np.float64)\n", - "x.dtype # --> dtype('float64')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "6Cks2_gKsXaW" - }, - "source": [ - "### Caveats\n", - "⚠️ XLA doesn't support 64-bit convolutions on all backends!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "WAHjmL0E2XwO" - }, - "source": [ - "## Fin.\n", - "\n", - "If something's not covered here that has caused you weeping and gnashing of teeth, please let us know and we'll extend these introductory _advisos_!" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "collapsed_sections": [], - "name": "Common Gotchas in JAX", - "provenance": [], - "toc_visible": true, - "version": "0.3.2" - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} + ] +} \ No newline at end of file From cd7ab0a9e0476043f1a3f4a029d6e088a63c3e29 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 19 Mar 2020 06:56:59 +0100 Subject: [PATCH 0908/1053] Changed to pmap_benchmark to make it runnable in Google (#2448) --- benchmarks/pmap_benchmark.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/benchmarks/pmap_benchmark.py b/benchmarks/pmap_benchmark.py index 5262e4c5b5b3..c467af4c8e15 100644 --- a/benchmarks/pmap_benchmark.py +++ b/benchmarks/pmap_benchmark.py @@ -18,12 +18,15 @@ To make it run faster, set env var TARGET_TOTAL_SECS to a low number (e.g. 2). """ -import numpy as onp +from absl import app -from benchmark import benchmark_suite import jax -import jax.numpy as np +from jax import numpy as np from jax import pmap +from jax.benchmarks import benchmark +from jax.config import config + +import numpy as onp def pmap_shard_args_benchmark(): @@ -38,7 +41,8 @@ def get_benchmark_fn(nargs, nshards): shape = (nshards, 4) args = [onp.random.random(shape) for _ in range(nargs)] sharded_args = pmap(lambda x: x)(args) - assert all(type(arg) == jax.pxla.ShardedDeviceArray for arg in sharded_args) + assert all(isinstance(arg, jax.pxla.ShardedDeviceArray) + for arg in sharded_args) def benchmark_fn(): for _ in range(100): pmap_fn(*sharded_args) @@ -51,7 +55,7 @@ def benchmark_fn(): for nshards in (2, 4, 8, 100, 500): if nshards > jax.local_device_count(): continue params.append({"nargs": 10, "nshards": nshards}) - benchmark_suite(get_benchmark_fn, params, "pmap_shard_args") + benchmark.benchmark_suite(get_benchmark_fn, params, "pmap_shard_args") def pmap_shard_outputs_benchmark(): @@ -76,7 +80,7 @@ def benchmark_fn(): for nshards in (2, 4, 8, 100, 500): if nshards > jax.local_device_count(): continue params.append({"nouts": 10, "nshards": nshards}) - benchmark_suite(get_benchmark_fn, params, "pmap_shard_outputs") + benchmark.benchmark_suite(get_benchmark_fn, params, "pmap_shard_outputs") def run_all_benchmarks(): @@ -84,5 +88,10 @@ def run_all_benchmarks(): pmap_shard_outputs_benchmark() -if __name__ == "__main__": +def main(unused_argv): run_all_benchmarks() + + +if __name__ == "__main__": + config.config_with_absl() + app.run(main) From 78c1f6b08d60f3f6c8252a2b6dd05fcef5ad8afb Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 19 Mar 2020 08:54:37 +0100 Subject: [PATCH 0909/1053] Increased tolerance for testScipySpecialFun (#2454) Prevent failures on TPU --- jax/test_util.py | 11 ++++++++++- tests/lax_scipy_test.py | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/jax/test_util.py b/jax/test_util.py index 372f6a8f00f2..791f4dcf7017 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -18,7 +18,7 @@ import re import itertools as it import os -from typing import Dict, Sequence +from typing import Dict, Sequence, Union from unittest import SkipTest from absl.testing import absltest @@ -295,6 +295,15 @@ def jaxpr_subcomp_and_count(*args, **kwargs): def device_under_test(): return FLAGS.jax_test_dut or xla_bridge.get_backend().platform +def if_device_under_test(device_type: Union[str, Sequence[str]], + if_true, if_false): + """Chooses `if_true` of `if_false` based on device_under_test.""" + if device_under_test() in ([device_type] if isinstance(device_type, str) + else device_type): + return if_true + else: + return if_false + def supported_dtypes(): if device_under_test() == "tpu": return {onp.bool_, onp.int32, onp.uint32, dtypes.bfloat16, onp.float32, diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index a9b9fccce258..86d4ddf1b76b 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -136,7 +136,8 @@ def testScipySpecialFun(self, scipy_op, lax_op, rng_factory, shapes, dtypes, self._CompileAndCheck(lax_op, args_maker, check_dtypes=True, rtol=1e-5) if test_autodiff: - jtu.check_grads(lax_op, args, order=1, atol=1e-3, rtol=3e-3, eps=1e-3) + jtu.check_grads(lax_op, args, order=1, + atol=jtu.if_device_under_test("tpu", 2e-3, 1e-3), rtol=3e-3, eps=1e-3) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_inshape={}_d={}".format( From cecfb37e6c9d72e9f30c30073be40d69a75f8fa8 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 19 Mar 2020 09:57:11 -0400 Subject: [PATCH 0910/1053] Increment jaxlib version to 0.1.42. (#2457) Update XLA. --- WORKSPACE | 6 +++--- docs/CHANGELOG.rst | 8 ++++++++ jaxlib/version.py | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 848ee13f43ed..1265b10eb933 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "f547378a36495762f294a47707e54db5322b2d920a8fb947d95a186bc35f2603", - strip_prefix = "tensorflow-cd2466610c5dda695f95ab85fd6211c9e30d835b", + sha256 = "9fd878b7da8ceb5ced72f4bd1a61cda3a4812272457ccb3b5a417acc25e4b45e", + strip_prefix = "tensorflow-3dc37733523f2b0df52965ec2e68023a491a39d7", urls = [ - "https://github.com/tensorflow/tensorflow/archive/cd2466610c5dda695f95ab85fd6211c9e30d835b.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/3dc37733523f2b0df52965ec2e68023a491a39d7.tar.gz", ], ) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 9b338fa444c2..0bb3e243a727 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -9,11 +9,19 @@ Change Log These are the release notes for JAX. + jax 0.1.62 (unreleased) --------------------------- * JAX has dropped support for Python 3.5. Please upgrade to Python 3.6 or newer. +jaxlib 0.1.42 (March 19, 2020) +------------------------------ + +* jaxlib 0.1.41 broke cloud TPU support due to an API incompatibility. This + release fixes it again. +* JAX has dropped support for Python 3.5. Please upgrade to Python 3.6 or newer. + jax 0.1.61 (March 17, 2020) --------------------------- diff --git a/jaxlib/version.py b/jaxlib/version.py index 18c4971702d0..e1707a10ccbc 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.41" +__version__ = "0.1.42" From afdd1a73675fb8b713e56047d6970753d123fc41 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 19 Mar 2020 10:28:29 -0400 Subject: [PATCH 0911/1053] Add more return types to api.py. (#2452) --- jax/api.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/jax/api.py b/jax/api.py index 513482e9c43a..562ed1ea4d3c 100644 --- a/jax/api.py +++ b/jax/api.py @@ -82,7 +82,7 @@ def __init__(self): _thread_local_state = _ThreadLocalState() def jit(fun: Callable, static_argnums: Union[int, Iterable[int]] = (), - device=None, backend: Optional[str] = None): + device=None, backend: Optional[str] = None) -> Callable: """Sets up `fun` for just-in-time compilation with XLA. Args: @@ -201,7 +201,7 @@ def xla_computation(fun: Callable, axis_env: Optional[Sequence[Tuple[AxisName, int]]] = None, backend: Optional[str] = None, tuple_args: bool = False, - instantiate_const_outputs: bool = True): + instantiate_const_outputs: bool = True) -> Callable: """Creates a function that produces its XLA computation given example args. Args: @@ -318,7 +318,7 @@ def computation_maker(*args, **kwargs): return computation_maker def grad(fun: Callable, argnums: Union[int, Sequence[int]] = 0, - has_aux: bool = False, holomorphic: bool = False): + has_aux: bool = False, holomorphic: bool = False) -> Callable: """Creates a function which evaluates the gradient of `fun`. Args: @@ -369,7 +369,7 @@ def grad_f_aux(*args, **kwargs): return grad_f_aux if has_aux else grad_f def value_and_grad(fun: Callable, argnums: Union[int, Sequence[int]] = 0, - has_aux: bool = False, holomorphic: bool = False): + has_aux: bool = False, holomorphic: bool = False) -> Callable: """Creates a function which evaluates both `fun` and the gradient of `fun`. Args: @@ -448,7 +448,7 @@ def _check_scalar(x): def jacfwd(fun: Callable, argnums: Union[int, Sequence[int]] = 0, - holomorphic: bool = False): + holomorphic: bool = False) -> Callable: """Jacobian of `fun` evaluated column-by-column using forward-mode AD. Args: @@ -494,7 +494,7 @@ def _check_real_input_jacfwd(x): def jacrev(fun: Callable, argnums: Union[int, Sequence[int]] = 0, - holomorphic: bool = False): + holomorphic: bool = False) -> Callable: """Jacobian of `fun` evaluated row-by-row using reverse-mode AD. Args: @@ -542,7 +542,7 @@ def _check_real_output_jacrev(x): def hessian(fun: Callable, argnums: Union[int, Sequence[int]] = 0, - holomorphic: bool = False): + holomorphic: bool = False) -> Callable: """Hessian of `fun`. Args: @@ -589,7 +589,7 @@ def _dtype(x): return dtypes.canonicalize_dtype(dtypes.result_type(x)) -def vmap(fun: Callable, in_axes=0, out_axes=0): +def vmap(fun: Callable, in_axes=0, out_axes=0) -> Callable: """Vectorizing map. Creates a function which maps `fun` over argument axes. Args: @@ -739,7 +739,7 @@ def _flatten_axes(treedef, axis_tree): def pmap(fun: Callable, axis_name: Optional[AxisName] = None, static_broadcasted_argnums: Union[int, Iterable[int]] = (), devices=None, backend: Optional[str] = None, - axis_size: Optional[int] = None): + axis_size: Optional[int] = None) -> Callable: """Parallel map with support for collectives. The purpose of ``pmap`` is to express single-program multiple-data (SPMD) @@ -957,7 +957,7 @@ def __eq__(self, other): def soft_pmap(fun: Callable, axis_name: Optional[AxisName] = None, - backend: Optional[str] = None): + backend: Optional[str] = None) -> Callable: warn("soft_pmap is an experimental feature and probably has bugs!") _check_callable(fun) axis_name = _TempAxisName(fun) if axis_name is None else axis_name @@ -1053,7 +1053,7 @@ def pfun(*args): return pfun -def mask(fun: Callable, in_shapes, out_shape): +def mask(fun: Callable, in_shapes, out_shape) -> Callable: in_specs, in_shapes_tree = tree_flatten(in_shapes) out_specs, out_shapes_tree = tree_flatten(out_shape) @@ -1120,7 +1120,7 @@ def _shape_spec_consistent(spec, expr): return all(a == b for a, b in zip(spec, expr) if a is not masking.monomorphic_dim) -def jvp(fun: Callable, primals, tangents): +def jvp(fun: Callable, primals, tangents) -> Tuple[Any, Any]: """Computes a (forward-mode) Jacobian-vector product of `fun`. Args: @@ -1175,7 +1175,7 @@ def _jvp(fun: lu.WrappedFun, primals, tangents): return (tree_unflatten(out_tree(), out_primals), tree_unflatten(out_tree(), out_tangents)) -def linearize(fun: Callable, *primals): +def linearize(fun: Callable, *primals) -> Tuple[Any, Callable]: """Produce a linear approximation to `fun` using `jvp` and partial evaluation. Args: @@ -1283,7 +1283,7 @@ def _vjp_pullback_wrapper(fun, cotangent_dtypes, io_tree, py_args): return tree_unflatten(out_tree, ans) -def vjp(fun: Callable, *primals, **kwargs): +def vjp(fun: Callable, *primals, **kwargs) -> Tuple[Any, Callable]: """Compute a (reverse-mode) vector-Jacobian product of `fun`. `grad` is implemented as a special case of `vjp`. @@ -1343,7 +1343,7 @@ def _vjp(fun: lu.WrappedFun, *primals, **kwargs): return out_primal_py, vjp_py, tree_unflatten(aux_tree, aux) -def make_jaxpr(fun: Callable): +def make_jaxpr(fun: Callable) -> Callable[..., core.TypedJaxpr]: """Creates a function that produces its jaxpr given example args. Args: @@ -2101,7 +2101,7 @@ def abstractify(x): return tree_unflatten(out_tree(), out) -def checkpoint(fun: Callable, concrete: bool = False): +def checkpoint(fun: Callable, concrete: bool = False) -> Callable: @wraps(fun) def fun_remat(*args, **kwargs): args_flat, in_tree = tree_flatten((args, kwargs)) From c7f211d433f68ca3e92d222f7563cae05dc524ed Mon Sep 17 00:00:00 2001 From: Srinivas Vasudevan Date: Thu, 19 Mar 2020 07:29:37 -0700 Subject: [PATCH 0912/1053] Update JAX to use XLA hyperbolic functions. (#2415) --- examples/control_test.py | 2 ++ jax/lax/lax.py | 41 +++++++++++++++++++++++++-------- jax/lax_reference.py | 3 +++ jax/numpy/lax_numpy.py | 49 +++------------------------------------- tests/lax_scipy_test.py | 1 - tests/lax_test.py | 3 +++ 6 files changed, 42 insertions(+), 57 deletions(-) diff --git a/examples/control_test.py b/examples/control_test.py index 86e72db94e59..3c1272876503 100644 --- a/examples/control_test.py +++ b/examples/control_test.py @@ -17,6 +17,7 @@ from __future__ import print_function from functools import partial +from unittest import SkipTest from absl.testing import absltest import numpy as onp @@ -215,6 +216,7 @@ def testMpcWithLqrProblem(self): def testMpcWithLqrProblemSpecifiedGenerally(self): + raise SkipTest # TODO(froystig) randn = onp.random.RandomState(0).randn dim, T, num_iters = 2, 10, 3 p = one_step_control(dim, T) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 3609d64d2f70..d03dea529df5 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1456,21 +1456,25 @@ def atan(x): r"""Elementwise arc tangent: :math:`\mathrm{atan}(x)`.""" return atan2(x, _const(x, 1)) -@api.jit -@_upcast_fp16_for_computation def sinh(x): r"""Elementwise hyperbolic sine: :math:`\mathrm{sinh}(x)`.""" - log_half = _const(x, onp.log(0.5)) - # This formulation avoids overflow when e^x is inf but e^x/2 is not inf. - return sub(exp(add(log_half, x)), exp(sub(log_half, x))) + return sinh_p.bind(x) -@api.jit -@_upcast_fp16_for_computation def cosh(x): r"""Elementwise hyperbolic cosine: :math:`\mathrm{cosh}(x)`.""" - log_half = _const(x, onp.log(0.5)) - # This formulation avoids overflow when e^x is inf but e^x/2 is not inf. - return add(exp(add(log_half, x)), exp(sub(log_half, x))) + return cosh_p.bind(x) + +def asinh(x): + r"""Elementwise inverse hyperbolic sine: :math:`\mathrm{asinh}(x)`.""" + return asinh_p.bind(x) + +def acosh(x): + r"""Elementwise inverse hyperbolic cosine: :math:`\mathrm{acosh}(x)`.""" + return acosh_p.bind(x) + +def atanh(x): + r"""Elementwise inverse hyperbolic tangent: :math:`\mathrm{atanh}(x)`.""" + return atanh_p.bind(x) # Add some methods to ShapedArray that rely on lax primitives @@ -1696,6 +1700,23 @@ def _sign_translation_rule(c, x): lambda g, x, y: _brcast(g, y) * (y / (square(x) + square(y))), lambda g, x, y: _brcast(g, x) * -x / (square(x) + square(y))) +sinh_p = standard_unop(_float | _complex, 'sinh') +ad.defjvp(sinh_p, lambda g, x: mul(g, cosh(x))) + +cosh_p = standard_unop(_float | _complex, 'cosh') +ad.defjvp(cosh_p, lambda g, x: mul(g, sinh(x))) + +asinh_p = standard_unop(_float | _complex, 'asinh') +ad.defjvp(asinh_p, lambda g, x: mul(g, rsqrt(square(x) + _one(x)))) + +acosh_p = standard_unop(_float | _complex, 'acosh') +ad.defjvp(acosh_p, + lambda g, x: mul(g, rsqrt((x - _one(x)) * (x + _one(x))))) + +atanh_p = standard_unop(_float | _complex, 'atanh') +ad.defjvp(atanh_p, + lambda g, x: mul(g, reciprocal((_one(x) - x) * (_one(x) + x)))) + regularized_incomplete_beta_p = standard_naryop( [_float, _float, _float], 'regularized_incomplete_beta') diff --git a/jax/lax_reference.py b/jax/lax_reference.py index d244eb0d399e..a2e2526f4acb 100644 --- a/jax/lax_reference.py +++ b/jax/lax_reference.py @@ -56,6 +56,9 @@ atan = onp.arctan sinh = onp.sinh cosh = onp.cosh +asinh = onp.arcsinh +acosh = onp.arccosh +atanh = onp.arctanh betainc = scipy.special.betainc lgamma = scipy.special.gammaln diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index cccdf8c7c3dc..737d685bf64d 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -424,6 +424,9 @@ def fn(x1, x2): sinh = _one_to_one_unop(onp.sinh, lax.sinh, True) cosh = _one_to_one_unop(onp.cosh, lax.cosh, True) tanh = _one_to_one_unop(onp.tanh, lax.tanh, True) +arcsinh = _one_to_one_unop(onp.arcsinh, lax.asinh, True) +arccosh = _one_to_one_unop(onp.arccosh, lax.acosh, True) +arctanh = _one_to_one_unop(onp.arctanh, lax.atanh, True) sqrt = _one_to_one_unop(onp.sqrt, lax.sqrt, True) @@ -711,52 +714,6 @@ def sinc(x): lax._const(x, 1), lax.div(lax.sin(pi_x), pi_x)) -@_wraps(onp.arcsinh) -@custom_transforms -@jit -@lax._upcast_fp16_for_computation -def arcsinh(x): - # asinh(x) = log(x + sqrt(x**2 + 1)) - x, = _promote_dtypes_inexact(x) - one = lax._const(x, 1) - result = lax.log(x + lax.sqrt(x * x + one)) - if issubdtype(_dtype(result), complexfloating): - return result - a = abs(x) - sqrt_max_value = onp.sqrt(finfo(_dtype(x)).max) - log2 = lax._const(a, onp.log(2)) - return lax.select(a < sqrt_max_value, result, lax.sign(x) * (lax.log(a) + log2)) - -defjvp(arcsinh, lambda g, ans, x: g / lax.sqrt(lax._const(x, 1) + square(x))) - - -@_wraps(onp.arccosh) -@jit -@lax._upcast_fp16_for_computation -def arccosh(x): - # acosh(x) = log(x + sqrt((x + 1) * (x - 1))) if x < sqrt_max_value - # log(x) + log(2) otherwise - x, = _promote_dtypes_inexact(x) - one = lax._const(x, 1) - result = lax.log(x + lax.sqrt((x + one) * (x - one))) - if issubdtype(_dtype(result), complexfloating): - return result - sqrt_max_value = onp.sqrt(finfo(_dtype(x)).max) - log2 = lax._const(x, onp.log(2)) - return lax.select(x < sqrt_max_value, result, lax.log(x) + log2) - - -@_wraps(onp.arctanh) -def arctanh(x): - # atanh(x) = 0.5 * log((1 + x) / (1 - x)) - x, = _promote_dtypes_inexact(x) - one = lax._const(x, 1) - result = lax._const(x, 0.5) * lax.log((one + x) / (one - x)) - if issubdtype(_dtype(result), complexfloating): - return result - return lax.select(abs(x) <= 1, result, lax.full_like(x, onp.nan)) - - @_wraps(onp.transpose) def transpose(a, axes=None): axes = onp.arange(ndim(a))[::-1] if axes is None else axes diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 86d4ddf1b76b..656c33b2ffbc 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -79,7 +79,6 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): op_record("xlog1py", 2, float_dtypes, jtu.rand_default, True), ] - CombosWithReplacement = itertools.combinations_with_replacement diff --git a/tests/lax_test.py b/tests/lax_test.py index cc3a993b183a..b2b29042fdf6 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -112,6 +112,9 @@ def op_record(op, nargs, dtypes, rng_factory, tol=None): op_record("asin", 1, float_dtypes, jtu.rand_small), op_record("acos", 1, float_dtypes, jtu.rand_small), op_record("atan", 1, float_dtypes, jtu.rand_small), + op_record("asinh", 1, float_dtypes, jtu.rand_default), + op_record("acosh", 1, float_dtypes, jtu.rand_positive), + op_record("atanh", 1, float_dtypes, jtu.rand_small), op_record("sinh", 1, float_dtypes + complex_dtypes, jtu.rand_default), op_record("cosh", 1, float_dtypes + complex_dtypes, jtu.rand_default), op_record("lgamma", 1, float_dtypes, jtu.rand_positive, From d11a9ab18577f8a9b7bd7edda821ce67df89f387 Mon Sep 17 00:00:00 2001 From: Trevor Cai Date: Thu, 19 Mar 2020 15:35:00 +0000 Subject: [PATCH 0913/1053] Expose jax.lax.all_gather (#2449) * Expose jax.lax.all_gather * add all_gather to RTD --- docs/jax.lax.rst | 1 + jax/lax/lax_parallel.py | 39 +++++++++++++++++++++++++++++++++++---- tests/pmap_test.py | 9 +++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index 59fb8bc434c8..4c2caf3d588a 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -156,6 +156,7 @@ Parallelism support is experimental. .. autosummary:: :toctree: _autosummary + all_gather all_to_all psum pmax diff --git a/jax/lax/lax_parallel.py b/jax/lax/lax_parallel.py index 1c8ff20f624d..6b815d29d461 100644 --- a/jax/lax/lax_parallel.py +++ b/jax/lax/lax_parallel.py @@ -246,7 +246,6 @@ def bind(x): axis_name=axis_name) return tree_util.tree_map(bind, x) - ### parallel primitives def standard_pmap_primitive(name, multiple_results=False): @@ -399,13 +398,45 @@ def _moveaxis(src, dst, x): def _drop(x, dim, axis_name): return lax.dynamic_index_in_dim(x, axis_index(axis_name), dim, False) -def _allgather(x, dim, size, axis_name): +def _expand(dim, size, axis_name, x): shape = list(x.shape) shape.insert(dim, size) out = lax.full(shape, lax._const(x, 0)) - out = lax.dynamic_update_index_in_dim(out, x, axis_index(axis_name), dim) - return psum(out, axis_name) + return lax.dynamic_update_index_in_dim(out, x, axis_index(axis_name), dim) + +def _allgather(x, dim, size, axis_name): + outs = tree_util.tree_map(partial(_expand, dim, size, axis_name), x) + return psum(outs, axis_name) + +def all_gather(x, axis_name): + """Gather values of x across all replicas. + + If ``x`` is a pytree then the result is equivalent to mapping this function to + each leaf in the tree. + + This is equivalent to, but faster than, all_to_all(broadcast(x)). + + Args: + x: array(s) with a mapped axis named ``axis_name``. + axis_name: hashable Python object used to name a pmapped axis (see the + ``pmap`` docstring for more details). + + Returns: + Array(s) representing the result of an all-gather along the axis + ``axis_name``. Shapes are the same as ``x.shape``, but with a leading + dimension of the axis_size. + + For example, with 2 XLA devices available: + >>> x = np.arange(4) + >>> y = jax.pmap(lambda x: jax.lax.all_gather(x, 'i'), axis_name='i')(x) + >>> print(y) + [[0 1 2 3] + [0 1 2 3] + [0 1 2 3] + [0 1 2 3]] + """ + return _allgather(x, 0, psum(1, axis_name), axis_name) def _broadcasting_papply(prim, name, size, vals, axes, **params): x, y = vals diff --git a/tests/pmap_test.py b/tests/pmap_test.py index 28870ad9281f..1f39ce25a73a 100644 --- a/tests/pmap_test.py +++ b/tests/pmap_test.py @@ -98,6 +98,15 @@ def testMean(self): ans = f(x) self.assertAllClose(ans, expected, check_dtypes=False) + def testGather(self): + f = pmap(lambda x: lax.all_gather(x, 'i'), axis_name='i') + + shape = (xla_bridge.device_count(), 4) + x = onp.arange(prod(shape), dtype=onp.float32).reshape(shape) + expected = onp.array([x] * xla_bridge.device_count()) + ans = f(x) + self.assertAllClose(ans, expected, check_dtypes=False) + def testTrees(self): ptranspose = lambda x, axis_name: lax.all_to_all(x, axis_name, 0, 0) def protate(x, axis_name): From c3f890904274c9e262f3e4e6f363d4439ee7e56a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 19 Mar 2020 12:41:19 -0400 Subject: [PATCH 0914/1053] Update jaxlib version in README.md. (#2461) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c2e95581f13d..59d21f4ebb33 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,7 @@ PYTHON_VERSION=cp37 # alternatives: cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda92, cuda100, cuda101, cuda102 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.41-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.42-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` @@ -436,7 +436,7 @@ more. To try automatic detection of the correct version for your system, you can run: ```bash -pip install --upgrade https://storage.googleapis.com/jax-releases/`nvcc -V | sed -En "s/.* release ([0-9]*)\.([0-9]*),.*/cuda\1\2/p"`/jaxlib-0.1.41-`python3 -V | sed -En "s/Python ([0-9]*)\.([0-9]*).*/cp\1\2/p"`-none-linux_x86_64.whl jax +pip install --upgrade https://storage.googleapis.com/jax-releases/`nvcc -V | sed -En "s/.* release ([0-9]*)\.([0-9]*),.*/cuda\1\2/p"`/jaxlib-0.1.42-`python3 -V | sed -En "s/Python ([0-9]*)\.([0-9]*).*/cp\1\2/p"`-none-linux_x86_64.whl jax ``` Please let us know on [the issue tracker](https://github.com/google/jax/issues) From 1d0b7e2b5c7c4fc1c46a8065f12ce1e56378d9a8 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 19 Mar 2020 11:26:29 -0700 Subject: [PATCH 0915/1053] make jaxpr pretty-print show multiple outputs --- jax/core.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/jax/core.py b/jax/core.py index edc81e08bea1..360c2ebde7a0 100644 --- a/jax/core.py +++ b/jax/core.py @@ -968,11 +968,7 @@ def pp_eqn(eqn): >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr def pp_jaxpr(jaxpr): - if len(jaxpr.outvars) > 1: - pp_outvars = str(tuple(jaxpr.outvars)) - else: - pp_outvars = str(jaxpr.outvars[0]) - + pp_outvars = str(tuple(jaxpr.outvars)) return (pp('{{ lambda {} ; {}.'.format(pp_vars(jaxpr.constvars), pp_vars(jaxpr.invars))) + ((pp('let ') >> From 7f8ce8ff3c927d4d2a251af71c2ee4388cf6da26 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 19 Mar 2020 11:28:35 -0700 Subject: [PATCH 0916/1053] fix test errors from previous commit --- .../Writing_custom_interpreters_in_Jax.ipynb | 8 ++--- tests/api_test.py | 34 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb index 4d84da3d6f85..4e62c9491c3b 100644 --- a/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb +++ b/docs/notebooks/Writing_custom_interpreters_in_Jax.ipynb @@ -152,7 +152,7 @@ "\n", "jaxpr: { lambda ; ; a.\n", " let b = add a 1\n", - " in [b] }\n", + " in (b,) }\n", "\n", "\n", "bar\n", @@ -169,7 +169,7 @@ " precision=None ] a c\n", " e = add d b\n", " g = add e f\n", - " in [g, c] }\n", + " in (g, c) }\n", "\n" ] } @@ -358,7 +358,7 @@ "{ lambda ; ; a.\n", " let b = tanh a\n", " c = exp b\n", - " in [c] }\n", + " in (c,) }\n", "\n", "()\n" ] @@ -681,7 +681,7 @@ " j = tie_in b nan\n", " k = broadcast[ sizes=() ] j\n", " l = select d i k\n", - " in [l] }" + " in (l,) }" ] }, "execution_count": 14, diff --git a/tests/api_test.py b/tests/api_test.py index 9ff8e981339a..c325c3100e4d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1861,12 +1861,12 @@ def f(x): d = add a 2.0 e = cond[ false_jaxpr={ lambda ; b a. let c = sub a b - in c } + in (c,) } linear=(False, False, False, False) true_jaxpr={ lambda ; b a. let c = add a b - in c } ] b a c a d - in e } + in (c,) } ] b a c a d + in (e,) } """, str(jaxpr)) def testExamplesJaxprDoc(self): @@ -1883,7 +1883,7 @@ def func1(first, second): d = mul c 3.0 e = add a d f = reduce_sum[ axes=(0,) ] e - in f } + in (f,) } """, str(jaxpr)) def func5(first, second): @@ -1898,7 +1898,7 @@ def func6(first): { lambda b d ; a. let c = add a b e = sub c d - in e } + in (e,) } """, str(jaxpr)) def func7(arg): @@ -1914,12 +1914,12 @@ def func7(arg): let b = ge a 0.0 c = cond[ false_jaxpr={ lambda ; a. let b = sub a 3.0 - in b } + in (b,) } linear=(False, False) true_jaxpr={ lambda ; a. let b = add a 3.0 - in b } ] b a a - in c } + in (b,) } ] b a a + in (c,) } """, str(jaxpr)) def func8(arg1, arg2): # arg2 is a pair @@ -1935,12 +1935,12 @@ def func8(arg1, arg2): # arg2 is a pair let d = ge a 0.0 f = cond[ false_jaxpr={ lambda ; c a b. let d = add c b - in d } + in (d,) } linear=(False, False, False, False, False) true_jaxpr={ lambda ; a b. let - in a } ] d b c e b c - in f } + in (a,) } ] d b c e b c + in (f,) } """, str(jaxpr)) def func10(arg, n): @@ -1961,9 +1961,9 @@ def func10(arg, n): body_nconsts=2 cond_jaxpr={ lambda ; a b c. let d = lt a b - in d } + in (d,) } cond_nconsts=0 ] c a 0 b e - in h } + in (h,) } """, str(jaxpr)) def func11(arr, extra): @@ -2008,11 +2008,11 @@ def inner(x): call_jaxpr={ lambda ; c b a. let d = mul b c e = add a d - in e } + in (e,) } device=None name=inner ] b a c e = add a d - in e } + in (e,) } """, str(jaxpr)) def func13(arr, extra): @@ -2033,12 +2033,12 @@ def inner(x): e = add c d f = psum[ axis_name=rows ] a g = div e f - in g } + in (g,) } devices=None global_axis_size=None mapped_invars=(True, False, True) name=inner ] c b a - in d } + in (d,) } """, str(jaxpr)) class LazyTest(jtu.JaxTestCase): From 592ba02c89a6dce6186dde11c0fff69067f44e06 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 19 Mar 2020 14:53:24 -0400 Subject: [PATCH 0917/1053] Fix nondeterminism in test ordering in Python 3.6. (#2460) Set orders aren't deterministic, and this made pytest-xdist complain. --- tests/lax_numpy_test.py | 7 +++++-- tests/lax_test.py | 17 +++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index a75de3f9f7b9..fd5b67404e02 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -54,8 +54,11 @@ nonempty_shapes = scalar_shapes + nonempty_array_shapes all_shapes = scalar_shapes + array_shapes -float_dtypes = list(jtu.supported_dtypes().intersection( - {jnp.bfloat16, onp.float16, onp.float32, onp.float64})) +def supported_dtypes(dtypes): + return [t for t in dtypes if t in jtu.supported_dtypes()] + +float_dtypes = supported_dtypes([jnp.bfloat16, onp.float16, onp.float32, + onp.float64]) complex_dtypes = [onp.complex64, onp.complex128] int_dtypes = [onp.int32, onp.int64] uint_dtypes = [onp.uint32, onp.uint64] diff --git a/tests/lax_test.py b/tests/lax_test.py index b2b29042fdf6..08b9570606d6 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -55,15 +55,16 @@ def num_float_bits(dtype): # For standard unops and binops, we can generate a large number of tests on # arguments of appropriate shapes and dtypes using the following table. -float_dtypes = list(jtu.supported_dtypes().intersection( - {dtypes.bfloat16, onp.float16, onp.float32, onp.float64})) -complex_elem_dtypes = list(jtu.supported_dtypes().intersection( - {onp.float32, onp.float64})) -complex_dtypes = list(jtu.supported_dtypes().intersection( - {onp.complex64, onp.complex128})) +def supported_dtypes(dtypes): + return [t for t in dtypes if t in jtu.supported_dtypes()] + +float_dtypes = supported_dtypes([dtypes.bfloat16, onp.float16, onp.float32, + onp.float64]) +complex_elem_dtypes = supported_dtypes([onp.float32, onp.float64]) +complex_dtypes = supported_dtypes([onp.complex64, onp.complex128]) inexact_dtypes = float_dtypes + complex_dtypes -int_dtypes = list(jtu.supported_dtypes().intersection({onp.int32, onp.int64})) -uint_dtypes = list(jtu.supported_dtypes().intersection({onp.uint32, onp.uint64})) +int_dtypes = supported_dtypes([onp.int32, onp.int64]) +uint_dtypes = supported_dtypes([onp.uint32, onp.uint64]) bool_dtypes = [onp.bool_] default_dtypes = float_dtypes + int_dtypes all_dtypes = float_dtypes + complex_dtypes + int_dtypes + bool_dtypes From 578e5cf6d7272a9d29a6b9d50899efbcf17780f1 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 19 Mar 2020 14:54:04 -0400 Subject: [PATCH 0918/1053] Fix return type for vjp. (#2462) Fix vjp doc string. --- jax/api.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/jax/api.py b/jax/api.py index 562ed1ea4d3c..5f25c324e8e7 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1283,10 +1283,11 @@ def _vjp_pullback_wrapper(fun, cotangent_dtypes, io_tree, py_args): return tree_unflatten(out_tree, ans) -def vjp(fun: Callable, *primals, **kwargs) -> Tuple[Any, Callable]: +def vjp(fun: Callable, *primals, **kwargs + ) -> Union[Tuple[Any, Callable], Tuple[Any, Callable, Any]]: """Compute a (reverse-mode) vector-Jacobian product of `fun`. - `grad` is implemented as a special case of `vjp`. + :py:func:`grad` is implemented as a special case of :py:func:`vjp`. Args: fun: Function to be differentiated. Its arguments should be arrays, scalars, @@ -1301,11 +1302,14 @@ def vjp(fun: Callable, *primals, **kwargs) -> Tuple[Any, Callable]: differentiated and the second element is auxiliary data. Default False. Returns: - A `(primals_out, vjpfun)` pair, where `primals_out` is `fun(*primals)`. - `vjpfun` is a function from a cotangent vector with the same shape as - `primals_out` to a tuple of cotangent vectors with the same shape as - `primals`, representing the vector-Jacobian product of `fun` evaluated at - `primals`. + If ``has_aux`` is ``False``, returns a ``(primals_out, vjpfun)`` pair, where + ``primals_out`` is ``fun(*primals)``. + ``vjpfun`` is a function from a cotangent vector with the same shape as + ``primals_out`` to a tuple of cotangent vectors with the same shape as + ``primals``, representing the vector-Jacobian product of ``fun`` evaluated at + ``primals``. If ``has_aux`` is ``True``, returns a + ``(primals_out, vjpfun, aux)`` tuple where ``aux`` is the auxiliary data + returned by ``fun``. >>> def f(x, y): ... return jax.numpy.sin(x), jax.numpy.cos(y) From f7e6b26d66b87cc0858d3fd0e566098b194aa303 Mon Sep 17 00:00:00 2001 From: Georg Ostrovski Date: Thu, 19 Mar 2020 18:17:02 +0000 Subject: [PATCH 0919/1053] Make jax.numpy.squeeze as strict as numpy.squeeze about axis shape. Raise error if an axis explicitly selected to be squeezed has shape != 1. --- jax/numpy/lax_numpy.py | 12 ++++++++---- tests/lax_numpy_test.py | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 737d685bf64d..9856b3fb3397 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -924,15 +924,19 @@ def ravel(a, order="C"): @_wraps(onp.squeeze) def squeeze(a, axis=None): - if 1 not in shape(a): - return a + shape_a = shape(a) if axis is None: - newshape = [d for d in shape(a) if d != 1] + if 1 not in shape_a: + return a + newshape = [d for d in shape_a if d != 1] else: if isinstance(axis, int): axis = (axis,) axis = frozenset(_canonicalize_axis(i, ndim(a)) for i in axis) - newshape = [d for i, d in enumerate(shape(a)) + if _any(shape_a[a] != 1 for a in axis): + raise ValueError("cannot select an axis to squeeze out which has size " + "not equal to one") + newshape = [d for i, d in enumerate(shape_a) if d != 1 or i not in axis] return lax.reshape(a, newshape) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index fd5b67404e02..cb5b276d402a 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1478,6 +1478,23 @@ def testSqueeze(self, arg_shape, dtype, ax, rng_factory): self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_inshape={}_axis={}".format( + jtu.format_shape_dtype_string(arg_shape, dtype), ax), + "arg_shape": arg_shape, "dtype": dtype, "ax": ax, + "rng_factory": jtu.rand_default} + for arg_shape, ax in [ + ((3,), 0), + ((1, 3), 1), + ((1, 3, 1), (0, 1))] + for dtype in default_dtypes)) + def testSqueezeFailsOnNonsingletonAxis(self, arg_shape, dtype, ax, + rng_factory): + rng = rng_factory() + x = jnp.zeros(arg_shape, dtype=dtype) + fun = lambda: jnp.squeeze(x, ax) + self.assertRaisesRegex(ValueError, "cannot select an axis to squeeze", fun) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}_weights={}_returned={}".format( jtu.format_shape_dtype_string(shape, dtype), From 9331fc5b428c573461c070d81b6582904462b932 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 21 Mar 2020 13:53:35 +0100 Subject: [PATCH 0920/1053] Added pytype checking to Travis (#2475) --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4e535f253e4f..7cd8bb40f4d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ language: python matrix: include: - python: "3.6" - env: JAX_CHECK_TYPES=true + env: JAX_ONLY_CHECK_TYPES=true - python: "3.6" env: JAX_ENABLE_X64=0 JAX_NUM_GENERATED_CASES=25 - python: "3.6" @@ -25,7 +25,7 @@ before_install: - conda config --add channels conda-forge - conda update -q conda install: - - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark mypy + - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark mypy pytype # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. @@ -40,8 +40,9 @@ install: script: - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html ; - elif [ "$JAX_CHECK_TYPES" = true ]; then + elif [ "$JAX_ONLY_CHECK_TYPES" = true ]; then mypy --config-file=mypy.ini jax ; + pytype jax ; else pytest -n 1 tests examples -W ignore ; fi From 428377afb37f7f2f5ffe9583cb9f32389b6a5045 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 21 Mar 2020 13:54:30 +0100 Subject: [PATCH 0921/1053] Added type annotations and removed unused imports (#2472) * Added type annotations and removed unused imports * Adjusted type hints for pytype --- benchmarks/benchmark.py | 8 ++--- docs/developer.rst | 58 +++++++++----------------------- jax/api.py | 1 + jax/core.py | 33 +++++++++--------- jax/dlpack.py | 4 +-- jax/interpreters/batching.py | 3 +- jax/interpreters/parallel.py | 1 - jax/interpreters/partial_eval.py | 8 +++-- jax/interpreters/pxla.py | 4 +-- jax/interpreters/xla.py | 17 ++++++---- tests/api_test.py | 2 +- tests/fft_test.py | 4 +-- tests/linalg_test.py | 2 +- 13 files changed, 61 insertions(+), 84 deletions(-) diff --git a/benchmarks/benchmark.py b/benchmarks/benchmark.py index e0cb7eb55c16..f5f5977b048d 100644 --- a/benchmarks/benchmark.py +++ b/benchmarks/benchmark.py @@ -54,7 +54,7 @@ def benchmark(f: Callable[[], Any], iters: Optional[int] = None, for _ in range(warmup): f() - times = [] + times: List[float] = [] count = 0 while (count < iters if iters is not None else sum(times) < target_total_secs): @@ -64,13 +64,13 @@ def benchmark(f: Callable[[], Any], iters: Optional[int] = None, times.append(end - start) count += 1 - times = onp.array(times) + times_arr = onp.array(times) print("---------Benchmark results for %s---------" % (name or f.__name__)) print("mean=%f std=%f %%std=%f total=%f" % - (times.mean(), times.std(), _pstd(times), times.sum())) + (times_arr.mean(), times_arr.std(), _pstd(times_arr), times_arr.sum())) print("#iters=%d #warmup=%d" % (count, warmup)) print() - return times + return times_arr def benchmark_suite(prepare: Callable[..., Callable], params_list: List[Dict], diff --git a/docs/developer.rst b/docs/developer.rst index 0d85f323f1de..2b458c3c269b 100644 --- a/docs/developer.rst +++ b/docs/developer.rst @@ -1,9 +1,7 @@ Building from source ==================== -First, obtain the JAX source code. - -.. code-block:: shell +First, obtain the JAX source code:: git clone https://github.com/google/jax cd jax @@ -20,9 +18,7 @@ Installing ``jaxlib`` with pip .............................. If you're only modifying Python portions of JAX, we recommend installing -``jaxlib`` from a prebuilt wheel using pip: - -.. code-block:: shell +``jaxlib`` from a prebuilt wheel using pip:: pip install jaxlib @@ -40,9 +36,7 @@ To build ``jaxlib`` from source, you must also install some prerequisites: * Cython * six (required for during the jaxlib build only, not required at install time) -On Ubuntu 18.04 or Debian you can install the necessary prerequisites with: - -.. code-block:: shell +On Ubuntu 18.04 or Debian you can install the necessary prerequisites with:: sudo apt-get install g++ python python3-dev python3-numpy python3-scipy cython3 python3-six @@ -50,16 +44,12 @@ On Ubuntu 18.04 or Debian you can install the necessary prerequisites with: If you are building on a Mac, make sure XCode and the XCode command line tools are installed. -You can also install the necessary Python dependencies using ``pip``: - -.. code-block:: shell +You can also install the necessary Python dependencies using ``pip``:: - pip install numpy scipy cython six + pip install numpy scipy cython six -To build ``jaxlib`` with CUDA support, you can run - -.. code-block:: shell +To build ``jaxlib`` with CUDA support, you can run:: python build/build.py --enable_cuda pip install -e build # installs jaxlib (includes XLA) @@ -70,9 +60,7 @@ specify the paths to CUDA and CUDNN, which you must have installed. Here ``python`` should be the name of your Python 3 interpreter; on some systems, you may need to use ``python3`` instead. -To build ``jaxlib`` without CUDA GPU support (CPU only), drop the ``--enable_cuda``: - -.. code-block:: shell +To build ``jaxlib`` without CUDA GPU support (CPU only), drop the ``--enable_cuda``:: python build/build.py pip install -e build # installs jaxlib (includes XLA) @@ -80,9 +68,7 @@ To build ``jaxlib`` without CUDA GPU support (CPU only), drop the ``--enable_cud Installing ``jax`` ------------------ -Once ``jaxlib`` has been installed, you can install ``jax`` by running - -.. code-block:: shell +Once ``jaxlib`` has been installed, you can install ``jax`` by running:: pip install -e . # installs jax @@ -97,33 +83,25 @@ Running the tests To run all the JAX tests, we recommend using ``pytest-xdist``, which can run tests in parallel. First, install ``pytest-xdist`` and ``pytest-benchmark`` by running ``pip install pytest-xdist pytest-benchmark``. -Then, from the repository root directory run - -.. code-block:: shell +Then, from the repository root directory run:: pytest -n auto tests JAX generates test cases combinatorially, and you can control the number of cases that are generated and checked for each test (default is 10). The automated tests -currently use 25: - -.. code-block:: shell +currently use 25:: JAX_NUM_GENERATED_CASES=25 pytest -n auto tests -The automated tests also run the tests with default 64-bit floats and ints: - -.. code-block:: shell +The automated tests also run the tests with default 64-bit floats and ints:: JAX_ENABLE_X64=1 JAX_NUM_GENERATED_CASES=25 pytest -n auto tests You can run a more specific set of tests using `pytest `_'s built-in selection mechanisms, or alternatively you can run a specific test -file directly to see more detailed information about the cases being run: - -.. code-block:: shell +file directly to see more detailed information about the cases being run:: python tests/lax_numpy_test.py --num_generated_cases=5 @@ -135,9 +113,7 @@ The Colab notebooks are tested for errors as part of the documentation build. Update documentation ==================== -To rebuild the documentation, install several packages: - -.. code-block:: shell +To rebuild the documentation, install several packages:: pip install -r docs/requirements.txt @@ -148,9 +124,7 @@ I have used successfully on the Mac: ``conda install -c conda-forge pandoc``. If you do not want to install ``pandoc`` then you should regenerate the documentation without the notebooks. -You run at top-level one of the following commands: - -.. code-block:: shell +You run at top-level one of the following commands:: sphinx-build -b html docs docs/build/html # with the notebooks sphinx-build -b html -D nbsphinx_execute=never docs docs/build/html # without the notebooks @@ -195,9 +169,7 @@ branch. That branch is also built automatically, and you can see the generated documentation `here `_. For a local test, I was able to do it in a fresh directory by replaying the commands -I saw in the Readthedocs logs: - -.. code-block:: shell +I saw in the Readthedocs logs:: mkvirtualenv jax-docs # A new virtualenv mkdir jax-docs # A new directory diff --git a/jax/api.py b/jax/api.py index 5f25c324e8e7..4989ba281a9e 100644 --- a/jax/api.py +++ b/jax/api.py @@ -47,6 +47,7 @@ from .util import (unzip2, curry, partial, safe_map, safe_zip, WrapHashably, Hashable, prod, split_list, extend_name_stack, wrap_name) from .lib import xla_bridge as xb +# Unused imports to be exported from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, host_id, host_ids, host_count) from .abstract_arrays import ConcreteArray, ShapedArray, raise_to_shaped diff --git a/jax/core.py b/jax/core.py index 360c2ebde7a0..799a09d13425 100644 --- a/jax/core.py +++ b/jax/core.py @@ -21,6 +21,7 @@ import itertools as it from weakref import ref import threading +from typing import Dict, Generator, Iterator, Sequence, Type import types from typing import Any, Callable, ClassVar, Dict, List, Optional, Set @@ -28,8 +29,9 @@ from . import dtypes from . import linear_util as lu + from .util import safe_zip, safe_map, partial, curry, prod, partialmethod -from .pprint_util import pp, vcat, hcat, pp_kv_pairs +from .pprint_util import pp, vcat, hcat, pp_kv_pairs, PrettyPrint # TODO(dougalm): the trace cache breaks the leak detector. Consisder solving. check_leaks = False @@ -64,7 +66,7 @@ def __str__(self): __repr__ = __str__ -def subjaxprs(jaxpr): +def subjaxprs(jaxpr: Jaxpr) -> Iterator[Jaxpr]: """Generator for all subjaxprs found in the params of jaxpr.eqns. Does not descend recursively into the found subjaxprs. """ @@ -77,12 +79,10 @@ def subjaxprs(jaxpr): class TypedJaxpr(object): - def __init__(self, jaxpr, literals, in_avals, out_avals): - assert type(jaxpr) is Jaxpr + def __init__(self, jaxpr: Jaxpr, literals: Sequence, + in_avals: Sequence['AbstractValue'], out_avals: Sequence['AbstractValue']): assert len(literals) == len(jaxpr.constvars) assert len(in_avals) == len(jaxpr.invars) - assert all(isinstance(aval, AbstractValue) for aval in in_avals) - assert all(isinstance(aval, AbstractValue) for aval in out_avals) if not skip_checks: in_avals_raised = [raise_to_shaped(v) for v in in_avals] @@ -106,7 +106,7 @@ def __str__(self): __repr__ = __str__ @curry -def jaxpr_as_fun(typed_jaxpr, *args): +def jaxpr_as_fun(typed_jaxpr: TypedJaxpr, *args): return eval_jaxpr(typed_jaxpr.jaxpr, typed_jaxpr.literals, *args) @@ -518,7 +518,7 @@ def cur_sublevel(): @contextmanager -def new_master(trace_type, bottom=False): +def new_master(trace_type: Type[Trace], bottom=False) -> Generator[MasterTrace, None, None]: level = trace_state.trace_stack.next_level(bottom) master = MasterTrace(level, trace_type) trace_state.trace_stack.push(master, bottom) @@ -914,7 +914,7 @@ def call_impl(f: lu.WrappedFun, *args, **params): # ------------------- Jaxpr printed representation ------------------- -def check_jaxpr(jaxpr): +def check_jaxpr(jaxpr: Jaxpr): """Checks well-formedness of a jaxpr. Specifically it checks that all variabled used are previously defined. @@ -922,16 +922,16 @@ def check_jaxpr(jaxpr): def context(): return "\njaxpr:\n{}\n".format(jaxpr) - def read_env(env, v): + def read_env(env: Set[Var], v: Var): if type(v) is not Literal and v not in env: raise Exception("Variable '{}' not defined".format(v) + context()) - def write_env(env, v): + def write_env(env: Set[Var], v: Var): if v in env: raise Exception("Variable {} already bound".format(v) + context()) env.add(v) - env = set() + env: Set[Var] = set() read = partial(read_env, env) write = partial(write_env, env) @@ -952,22 +952,23 @@ def write_env(env, v): map(read, jaxpr.outvars) -def pp_vars(vs): +def pp_vars(vs) -> str: return ' '.join(map(str, vs)) -def pp_eqn_compact(primitive_name, params): +def pp_eqn_compact(primitive_name: str, params: Dict) -> PrettyPrint: filtered_params = {k: v for k, v in params.items() if not isinstance(v, (Jaxpr, TypedJaxpr))} return pp(primitive_name) >> pp_kv_pairs(sorted(filtered_params.items())) -def pp_eqn(eqn): +def pp_eqn(eqn: JaxprEqn) -> PrettyPrint: lhs = pp_vars(eqn.outvars) pp_subexpr = pp('') return (pp('{} = '.format(lhs)) >> pp(eqn.primitive.name) >> pp_kv_pairs(sorted(eqn.params.items())) >> pp(' ') >> pp(pp_vars(eqn.invars))) + pp_subexpr -def pp_jaxpr(jaxpr): + +def pp_jaxpr(jaxpr) -> PrettyPrint: pp_outvars = str(tuple(jaxpr.outvars)) return (pp('{{ lambda {} ; {}.'.format(pp_vars(jaxpr.constvars), pp_vars(jaxpr.invars))) + diff --git a/jax/dlpack.py b/jax/dlpack.py index c78903c96e7c..eff055a46154 100644 --- a/jax/dlpack.py +++ b/jax/dlpack.py @@ -18,7 +18,7 @@ from .lib import xla_client from .lib import xla_bridge -def to_dlpack(x): +def to_dlpack(x: xla.DeviceArray): """Returns a DLPack tensor that encapsulates a DeviceArray `x`. The DLPack shares memory with `x`. @@ -48,4 +48,4 @@ def from_dlpack(dlpack, backend=None): xla_shape = buf.shape() assert not xla_shape.is_tuple() aval = core.ShapedArray(xla_shape.dimensions(), xla_shape.numpy_dtype()) - return xla.DeviceArray(aval, buf.device(), lazy.array(aval.shape), buf) + return xla.DeviceArray(aval, buf.device(), lazy.array(aval.shape), buf) # pytype: disable=attribute-error diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 54edf6f3882b..befd76f07fab 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -12,9 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, Callable, Dict, Optional, Sequence, Tuple, Union - import numpy as onp +from typing import Any, Callable, Dict, Optional, Sequence, Tuple, Union from .. import core from .. import dtypes diff --git a/jax/interpreters/parallel.py b/jax/interpreters/parallel.py index f00016ce3533..1471d3f83b56 100644 --- a/jax/interpreters/parallel.py +++ b/jax/interpreters/parallel.py @@ -16,7 +16,6 @@ from functools import partial from typing import Callable, Dict - from .. import core from .. import linear_util as lu from ..core import Trace, Tracer, Primitive, new_master diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 6d30a65dde44..ec5a247f11c6 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -17,7 +17,7 @@ from collections import namedtuple import contextlib import threading -from typing import Callable, Dict, Set +from typing import Callable, Dict, Sequence, Set from weakref import ref import numpy as onp @@ -331,7 +331,7 @@ def __new__(cls, xs): valid_pv_types = (AbstractValue, type(None)) -def merge_pvals(val, pval): +def merge_pvals(val, pval: PartialVal): pv, const = pval if isinstance(pv, AbstractValue): return val @@ -348,7 +348,9 @@ def partial_val_aval(pv, const): else: raise TypeError(pv) -def trace_to_jaxpr(fun: lu.WrappedFun, pvals, instantiate=False, stage_out_calls=False, bottom=False): + +def trace_to_jaxpr(fun: lu.WrappedFun, pvals: Sequence[PartialVal], + instantiate=False, stage_out_calls=False, bottom=False): """Traces a function, given abstract inputs, to a jaxpr.""" trace_type = StagingJaxprTrace if stage_out_calls else JaxprTrace with new_master(trace_type, bottom=bottom) as master: diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 779da4e11e03..c71811c58bf1 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -399,7 +399,7 @@ def __getitem__(self, idx): ### the xla_pmap primitive and its rules are comparable to xla_call in xla.py -def xla_pmap_impl(fun, *args, backend, axis_name, axis_size, global_axis_size, +def xla_pmap_impl(fun: lu.WrappedFun, *args, backend, axis_name, axis_size, global_axis_size, devices, name, mapped_invars=None): abstract_args = map(xla.abstractify, args) compiled_fun = parallel_callable(fun, backend, axis_name, axis_size, @@ -602,7 +602,7 @@ def replicate(val, axis_size, nrep, devices=None, backend=None): devices = xb.get_backend(backend).get_default_device_assignment(nrep) assert nrep == len(devices) - aval = xla.abstractify(val) + aval = xla.abstractify(val) # type: ShapedArray aval = ShapedArray((axis_size,) + aval.shape, aval.dtype) device_buffers = [xla.device_put(val, d) for d in devices] return ShardedDeviceArray(aval, device_buffers) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 990434338f3c..69a6311745bf 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -39,6 +39,7 @@ from . import partial_eval as pe from . import ad from . import masking +from typing import Callable FLAGS = flags.FLAGS flags.DEFINE_bool('jax_debug_nans', @@ -58,7 +59,8 @@ def _make_abstract_unit(_): return xc.Shape.array_shape(onp.dtype('bool'), ()) def _device_put_unit(_, device): return xc.Buffer.from_pyval(onp.zeros((), dtype=onp.dtype('bool')), device, backend=xb.get_device_backend(device)) - +def _make_array_shape(a): + return xc.Shape.array_shape(a.dtype, a.shape) ### handlers @@ -72,8 +74,9 @@ def aval_to_xla_shape(aval): ) from err xla_shape_handlers: Dict[Type[core.AbstractValue], Callable] = {} xla_shape_handlers[core.AbstractUnit] = _make_abstract_unit -xla_shape_handlers[ShapedArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) -xla_shape_handlers[ConcreteArray] = lambda a: xc.Shape.array_shape(a.dtype, a.shape) + +xla_shape_handlers[ShapedArray] = _make_array_shape +xla_shape_handlers[ConcreteArray] = _make_array_shape def aval_to_result_handler(device, aval): try: @@ -131,7 +134,7 @@ def _canonicalize_python_scalar_dtype(typ, x): for _t in dtypes.python_scalar_dtypes.keys(): canonicalize_dtype_handlers[_t] = partial(_canonicalize_python_scalar_dtype, _t) -def abstractify(x): +def abstractify(x) -> core.AbstractValue: typ = type(x) aval_fn = pytype_aval_mappings.get(typ) if aval_fn: return aval_fn(x) @@ -908,7 +911,7 @@ def _copy_device_array_to_device(x, device): backend=xb.get_device_backend(device)) return DeviceArray(x.aval, device, x._lazy_expr, moved_buf) -def _force(x): +def _force(x: DeviceArray) -> DeviceArray: if lazy.is_trivial(x._lazy_expr): return x else: @@ -923,8 +926,8 @@ def _force(x): return force_fun(x) @cache() -def _lazy_force_computation(sticky, aval, device, lexpr - ) -> Callable[[DeviceValue], DeviceArray]: + +def _lazy_force_computation(sticky, aval, device, lexpr) -> Callable[[DeviceArray], DeviceArray]: c = xb.make_computation_builder("lazy_force") if lazy.is_constant(lexpr): param = None diff --git a/tests/api_test.py b/tests/api_test.py index c325c3100e4d..22cc102f4b74 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -675,7 +675,7 @@ def vjpfun(x, y): ans = api.grad(foo, (0, 1))(3., 4.) self.assertAllClose(ans, (1. + 3. + 4., 1. * 3. * 9.), check_dtypes=False) - def test_defvjp_all(self): + def test_defvjp_all_custom_transforms(self): @api.custom_transforms def foo(x): return np.sin(x) diff --git a/tests/fft_test.py b/tests/fft_test.py index d0c40ce4df11..41767d63edb7 100644 --- a/tests/fft_test.py +++ b/tests/fft_test.py @@ -248,13 +248,13 @@ def testFft2Errors(self, inverse, real): self.assertRaisesRegex( ValueError, "jax.np.fft.{} only supports 2 axes. " - "Got axes = \\[0\\].".format(name, name), + "Got axes = \\[0\\].".format(name), lambda: func(rng([2, 3], dtype=onp.float64), axes=[0]) ) self.assertRaisesRegex( ValueError, "jax.np.fft.{} only supports 2 axes. " - "Got axes = \\(0, 1, 2\\).".format(name, name), + "Got axes = \\(0, 1, 2\\).".format(name), lambda: func(rng([2, 3, 3], dtype=onp.float64), axes=(0, 1, 2)) ) self.assertRaises( diff --git a/tests/linalg_test.py b/tests/linalg_test.py index cd7d66ce95bb..fccd3e798734 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -433,7 +433,7 @@ def testEighBatching(self, shape, dtype, rng_factory): (isinstance(axis, tuple) and len(axis) == 1) else [None, 'fro', 1, 2, -1, -2, np.inf, -np.inf, 'nuc']) for dtype in float_types + complex_types - for rng_factory in [jtu.rand_default])) + for rng_factory in [jtu.rand_default])) # type: ignore def testNorm(self, shape, dtype, ord, axis, keepdims, rng_factory): rng = rng_factory() _skip_if_unsupported_type(dtype) From e41a5ea6b8b628b9ef38fa053c6a4e1ef7b6f325 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 21 Mar 2020 15:45:59 +0100 Subject: [PATCH 0922/1053] Pytype2 (#2476) * Try to install pytype from pip --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7cd8bb40f4d5..c281d48aa4b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,10 @@ before_install: - conda config --add channels conda-forge - conda update -q conda install: - - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark mypy pytype + - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark mypy + - if [ "$JAX_ONLY_CHECK_TYPES" = true ]; then + pip install pytype ; # Not on conda + fi # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. From fcdbe63f372e02a673238732a7752125b83ae22a Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 21 Mar 2020 17:38:46 +0100 Subject: [PATCH 0923/1053] Trigger a Travis build (#2477) * Remove more unused imports * Fix warnings in travis.yml --- .travis.yml | 12 +++++++----- tests/batching_test.py | 3 --- tests/core_test.py | 3 +-- tests/debug_nans_test.py | 2 -- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index c281d48aa4b8..5bdc183678f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ -sudo: false notifications: email: false dist: xenial language: python -matrix: +os: linux +jobs: include: - python: "3.6" env: JAX_ONLY_CHECK_TYPES=true @@ -27,7 +27,7 @@ before_install: install: - conda install --yes python=$TRAVIS_PYTHON_VERSION pip absl-py opt_einsum numpy scipy pytest-xdist pytest-benchmark mypy - if [ "$JAX_ONLY_CHECK_TYPES" = true ]; then - pip install pytype ; # Not on conda + pip install pytype ; fi # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted @@ -44,8 +44,10 @@ script: - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html ; elif [ "$JAX_ONLY_CHECK_TYPES" = true ]; then - mypy --config-file=mypy.ini jax ; - pytype jax ; + echo "===== Checking with mypy ====" && + time mypy --config-file=mypy.ini jax && + echo "===== Checking with pytype ====" && + time pytype jax ; else pytest -n 1 tests examples -W ignore ; fi diff --git a/tests/batching_test.py b/tests/batching_test.py index ddf612b9c97c..b6559e776d03 100644 --- a/tests/batching_test.py +++ b/tests/batching_test.py @@ -20,14 +20,11 @@ import jax import jax.numpy as np from jax import test_util as jtu -from jax.abstract_arrays import ShapedArray from jax import lax from jax import lax_linalg from jax import random from jax.api import jit, grad, jvp, vjp, make_jaxpr, jacfwd, jacrev, hessian from jax.api import vmap -from jax.core import unit -from jax.interpreters import partial_eval as pe from jax.util import partial, curry import jax.ops diff --git a/tests/core_test.py b/tests/core_test.py index 8d7ea8007c31..cfd3ff0cc203 100644 --- a/tests/core_test.py +++ b/tests/core_test.py @@ -22,7 +22,6 @@ from absl.testing import absltest from absl.testing import parameterized -from jax import api from jax import core from jax import numpy as np from jax import test_util as jtu @@ -31,7 +30,7 @@ from jax.tree_util import tree_flatten, tree_unflatten, tree_multimap, tree_reduce, tree_leaves from jax.util import partial from jax.interpreters import partial_eval as pe -from jax.interpreters import xla + from jax.config import config config.parse_flags_with_absl() diff --git a/tests/debug_nans_test.py b/tests/debug_nans_test.py index 9a1723880dc4..88e4a7df4614 100644 --- a/tests/debug_nans_test.py +++ b/tests/debug_nans_test.py @@ -21,9 +21,7 @@ import jax from jax import test_util as jtu -from jax.test_util import check_grads from jax import numpy as np -from jax import random from jax.config import config config.parse_flags_with_absl() From 93d3e347211405d3b8cf10fd1e671cdc7bf6b835 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 21 Mar 2020 10:46:07 -0700 Subject: [PATCH 0924/1053] make lax_linalg.solve_triangular allow vector rhs also add tests for jax.scipy.linalg.cho_solve --- jax/lax_linalg.py | 8 +++++++- jax/scipy/linalg.py | 6 +----- tests/linalg_test.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index ea26e8f0f35f..dd51ecf4a44c 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -70,9 +70,15 @@ def svd(x, full_matrices=True, compute_uv=True): def triangular_solve(a, b, left_side=False, lower=False, transpose_a=False, conjugate_a=False, unit_diagonal=False): conjugate_a = conjugate_a and np.issubdtype(lax.dtype(a), np.complexfloating) - return triangular_solve_p.bind( + singleton = np.ndim(b) == np.ndim(a) - 1 + if singleton: + b = np.expand_dims(b, -1 if left_side else -2) + out = triangular_solve_p.bind( a, b, left_side=left_side, lower=lower, transpose_a=transpose_a, conjugate_a=conjugate_a, unit_diagonal=unit_diagonal) + if singleton: + out = out[..., 0] if left_side else out[..., 0, :] + return out # utilities diff --git a/jax/scipy/linalg.py b/jax/scipy/linalg.py index d1fd8f19a32b..21644c2a59a6 100644 --- a/jax/scipy/linalg.py +++ b/jax/scipy/linalg.py @@ -46,15 +46,11 @@ def cho_factor(a, lower=False, overwrite_a=False, check_finite=True): def _cho_solve(c, b, lower): c, b = np_linalg._promote_arg_dtypes(np.asarray(c), np.asarray(b)) np_linalg._check_solve_shapes(c, b) - # TODO(phawkins): triangular_solve only supports matrices on the RHS, so we - # add a dummy dimension. Extend it to support vectors and simplify this. - rhs_vector = c.ndim == b.ndim + 1 - b = b[..., np.newaxis] if rhs_vector else b b = lax_linalg.triangular_solve(c, b, left_side=True, lower=lower, transpose_a=not lower, conjugate_a=not lower) b = lax_linalg.triangular_solve(c, b, left_side=True, lower=lower, transpose_a=lower, conjugate_a=lower) - return b[..., 0] if rhs_vector else b + return b @_wraps(scipy.linalg.cho_solve, update_doc=False) def cho_solve(c_and_lower, b, overwrite_b=False, check_finite=True): diff --git a/tests/linalg_test.py b/tests/linalg_test.py index fccd3e798734..f867cc9fad62 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -1037,8 +1037,10 @@ def testSolveTriangular(self, lower, transpose_a, unit_diagonal, lhs_shape, for conjugate_a in ( [False] if np.issubdtype(dtype, np.floating) else [False, True]) for left_side, a_shape, b_shape in [ + (False, (4, 4), (4,)), (False, (4, 4), (1, 4,)), (False, (3, 3), (4, 3)), + (True, (4, 4), (4,)), (True, (4, 4), (4, 1)), (True, (4, 4), (4, 3)), (True, (2, 8, 8), (2, 8, 10)), @@ -1139,5 +1141,35 @@ def testIssue2131(self, n, dtype): check_dtypes=True) self._CompileAndCheck(jsp_fun, args_maker_zeros, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_lhs={}_rhs={}_lower={}".format( + jtu.format_shape_dtype_string(lhs_shape, dtype), + jtu.format_shape_dtype_string(rhs_shape, dtype), + lower), + "lhs_shape": lhs_shape, "rhs_shape": rhs_shape, "dtype": dtype, + "rng_factory": rng_factory, "lower": lower} + for lhs_shape, rhs_shape in [ + [(1, 1), (1,)], + [(4, 4), (4,)], + [(4, 4), (4, 4)], + ] + for dtype in float_types + for lower in [True, False] + for rng_factory in [jtu.rand_default])) + def testChoSolve(self, lhs_shape, rhs_shape, dtype, lower, rng_factory): + rng = rng_factory() + _skip_if_unsupported_type(dtype) + def args_maker(): + b = rng(rhs_shape, dtype) + if lower: + L = onp.tril(rng(lhs_shape, dtype)) + return [(L, lower), b] + else: + U = onp.triu(rng(lhs_shape, dtype)) + return [(U, lower), b] + self._CheckAgainstNumpy(osp.linalg.cho_solve, jsp.linalg.cho_solve, + args_maker, check_dtypes=True, tol=1e-3) + + if __name__ == "__main__": absltest.main() From 7b0ee9a5acd1f404084373a401fe62cc690fdc74 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 21 Mar 2020 15:42:59 -0700 Subject: [PATCH 0925/1053] improve implementation of MVN logpdf (#2481) fixes #2314 I also added a bit more test coverage, but not a ton: scipy has different batch shape semantics and default arguments than I might expect, so I didn't bother to implement those (and left some test cases commented out). I ran into this surprising scipy bug: ```python In [1]: from scipy.stats import multivariate_normal In [2]: import numpy as np In [3]: args = [np.array(1., np.float32), np.array(2., np.float64), np.array(3., np.float64)] In [4]: print([x.shape for x in args]) [(), (), ()] In [5]: multivariate_normal.logpdf(*args) Out[5]: -1.6349113442053944 In [6]: print([x.shape for x in args]) [(), (1,), (1, 1)] ``` Mutated arguments! But it depends on dtype promotion: ```python In [7]: args = [np.array(1., np.float32), np.array(2., np.float32), np.array(3., np.float32)] In [8]: print([x.shape for x in args]) [(), (), ()] In [9]: multivariate_normal.logpdf(*args) Out[9]: -1.6349113442053944 In [10]: print([x.shape for x in args]) [(), (), ()] ``` --- jax/scipy/stats/multivariate_normal.py | 30 +++++----- jax/test_util.py | 2 +- tests/scipy_stats_test.py | 79 ++++++++++++++++++++------ 3 files changed, 78 insertions(+), 33 deletions(-) diff --git a/jax/scipy/stats/multivariate_normal.py b/jax/scipy/stats/multivariate_normal.py index 7e7bf535fe5c..76b98b10a940 100644 --- a/jax/scipy/stats/multivariate_normal.py +++ b/jax/scipy/stats/multivariate_normal.py @@ -17,27 +17,29 @@ import scipy.stats as osp_stats from ... import lax +from ...lax_linalg import cholesky, triangular_solve +from ... import numpy as jnp from ...numpy.lax_numpy import _promote_dtypes_inexact, _constant_like, _wraps -from ...numpy.lax_numpy import dot, subtract, einsum -from ...numpy.linalg import det, inv @_wraps(osp_stats.multivariate_normal.logpdf, update_doc=False) def logpdf(x, mean, cov): x, mean, cov = _promote_dtypes_inexact(x, mean, cov) - two = _constant_like(x, 2) - dim = _constant_like(x, mean.shape[0]) - det_sig = det(cov).astype(cov.dtype) - log_normalizer = lax.log(lax.mul(lax.pow(_constant_like(x, 2 * np.pi), dim), - det_sig)) - x_shape = x.shape[:-1] - if x_shape: - x_2d = x.reshape((-1, mean.shape[0])) - quadratic = einsum("ij,jk,ik->i", subtract(x_2d, mean), inv(cov), - subtract(x_2d, mean)).reshape(x_shape).astype(cov.dtype) + if not mean.shape: + return -1/2 * (x - mean) ** 2 / cov - 1/2 * (np.log(2*np.pi) + jnp.log(cov)) else: - quadratic = dot(dot(subtract(x, mean), inv(cov)), subtract(x, mean).T).astype(cov.dtype) - return lax.div(lax.neg(lax.add(log_normalizer, quadratic)), two) + n = mean.shape[-1] + if not np.shape(cov): + y = x - mean + return (-1/2 * jnp.einsum('...i,...i->...', y, y) / cov + - n/2 * (np.log(2*np.pi) + jnp.log(cov))) + else: + if cov.ndim < 2 or cov.shape[-2:] != (n, n): + raise ValueError("multivariate_normal.logpdf got incompatible shapes") + L = cholesky(cov) + y = triangular_solve(L, x - mean, lower=True, transpose_a=True) + return (-1/2 * jnp.einsum('...i,...i->...', y, y) - n/2*np.log(2*np.pi) + - jnp.log(L.diagonal()).sum()) @_wraps(osp_stats.multivariate_normal.pdf, update_doc=False) def pdf(x, mean, cov): diff --git a/jax/test_util.py b/jax/test_util.py index 791f4dcf7017..c02eb54849e3 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -757,7 +757,7 @@ def wrapped_fun(*args): def _CheckAgainstNumpy(self, numpy_reference_op, lax_op, args_maker, check_dtypes=False, tol=None): args = args_maker() - numpy_ans = numpy_reference_op(*args) lax_ans = lax_op(*args) + numpy_ans = numpy_reference_op(*args) self.assertAllClose(numpy_ans, lax_ans, check_dtypes=check_dtypes, atol=tol, rtol=tol) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index d402e8e17c8b..1d3929b120b6 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -260,24 +260,6 @@ def args_maker(): tol=1e-6) self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - # TODO: currently it ignores the argument "shapes" and only tests dim=4 - @genNamedParametersNArgs(3, jtu.rand_default) - def testMultivariateNormalLogPdf(self, rng_factory, shapes, dtypes): - rng = rng_factory() - scipy_fun = osp_stats.multivariate_normal.logpdf - lax_fun = lsp_stats.multivariate_normal.logpdf - dim = 4 - shapex = (dim,) - - def args_maker(): - x, mean, cov = map(rng, (shapex, shapex, (dim, dim)), dtypes) - cov = random_correlation.rvs(onp.arange(1, 1+dim) * 2 / (dim + 1)) - return [x, mean, cov] - - self._CheckAgainstNumpy(scipy_fun, lax_fun, args_maker, check_dtypes=False, - tol=1e-4) - self._CompileAndCheck(lax_fun, args_maker, check_dtypes=True) - @genNamedParametersNArgs(3, jtu.rand_default) def testNormLogPdf(self, rng_factory, shapes, dtypes): rng = rng_factory() @@ -400,6 +382,67 @@ def testIssue972(self): lsp_stats.norm.cdf(onp.full((4,), onp.inf, onp.float32)), check_dtypes=False) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_x={}_mean={}_cov={}".format( + jtu.format_shape_dtype_string(x_shape, x_dtype), + jtu.format_shape_dtype_string(mean_shape, mean_dtype) + if mean_shape is not None else None, + jtu.format_shape_dtype_string(cov_shape, cov_dtype) + if cov_shape is not None else None), + "x_shape": x_shape, "x_dtype": x_dtype, + "mean_shape": mean_shape, "mean_dtype": mean_dtype, + "cov_shape": cov_shape, "cov_dtype": cov_dtype, + "rng_factory": rng_factory} + for x_shape, mean_shape, cov_shape in [ + # # These test cases cover default values for mean/cov, but we don't + # # support those yet (and they seem not very valuable). + # [(), None, None], + # [(), (), None], + # [(2,), None, None], + # [(2,), (), None], + # [(2,), (2,), None], + # [(3, 2), (3, 2,), None], + # [(5, 3, 2), (5, 3, 2,), None], + + [(), (), ()], + [(3,), (), ()], + [(3,), (3,), ()], + [(3,), (3,), (3, 3)], + [(3, 4), (4,), (4, 4)], + + # # These test cases are where scipy flattens things, which has + # # different batch semantics than some might expect + # [(5, 3, 2), (5, 3, 2,), ()], + # [(5, 3, 2), (5, 3, 2,), (5, 3, 2, 2)], + # [(5, 3, 2), (3, 2,), (5, 3, 2, 2)], + # [(5, 3, 2), (3, 2,), (2, 2)], + ] + for x_dtype, mean_dtype, cov_dtype in CombosWithReplacement(float_dtypes, 3) + if (mean_shape is not None or mean_dtype == onp.float32) + and (cov_shape is not None or cov_dtype == onp.float32) + for rng_factory in [jtu.rand_default])) + def testMultivariateNormalLogpdf(self, x_shape, x_dtype, mean_shape, + mean_dtype, cov_shape, cov_dtype, rng_factory): + rng = rng_factory() + def args_maker(): + args = [rng(x_shape, x_dtype)] + if mean_shape is not None: + args.append(5 * rng(mean_shape, mean_dtype)) + if cov_shape is not None: + if cov_shape == (): + args.append(0.1 + rng(cov_shape, cov_dtype) ** 2) + else: + factor_shape = (*cov_shape[:-1], 2 * cov_shape[-1]) + factor = rng(factor_shape, cov_dtype) + args.append(onp.matmul(factor, onp.swapaxes(factor, -1, -2))) + return args + + self._CheckAgainstNumpy(osp_stats.multivariate_normal.logpdf, + lsp_stats.multivariate_normal.logpdf, + args_maker, check_dtypes=True, tol=1e-3) + self._CompileAndCheck(lsp_stats.multivariate_normal.logpdf, args_maker, + check_dtypes=True) + if __name__ == "__main__": absltest.main() From 15c8d4c2b3aaa23eb5ca85d2c6f1cf3f20a57592 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 21 Mar 2020 20:57:25 -0700 Subject: [PATCH 0926/1053] update version and changelog for pypi --- docs/CHANGELOG.rst | 11 ++++++++++- jax/version.py | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 0bb3e243a727..5086fedf2e99 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -9,11 +9,20 @@ Change Log These are the release notes for JAX. +jax 0.1.63 (unreleased) +--------------------------- -jax 0.1.62 (unreleased) +jax 0.1.62 (March 21, 2020) --------------------------- * JAX has dropped support for Python 3.5. Please upgrade to Python 3.6 or newer. +* Removed the internal function ``lax._safe_mul``, which implemented the + convention ``0. * nan == 0.``. This change means some programs when + differentiated will produce nans when they previously produced correct + values, though it ensures nans rather than silently incorrect results are + produced for other programs. See #2447 and #1052 for details. +* Added an ``all_gather`` parallel convenience function. +* More type annotations in core code. jaxlib 0.1.42 (March 19, 2020) ------------------------------ diff --git a/jax/version.py b/jax/version.py index a974fb2a89d5..9602d26bde36 100644 --- a/jax/version.py +++ b/jax/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.61" +__version__ = "0.1.62" From 6876271bac7d4ce68118190f06e003e004b070a9 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 21 Mar 2020 21:20:12 -0700 Subject: [PATCH 0927/1053] bump tolerance for mvn logpdf x64 test --- tests/scipy_stats_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/scipy_stats_test.py b/tests/scipy_stats_test.py index 1d3929b120b6..e0d578e42b4d 100644 --- a/tests/scipy_stats_test.py +++ b/tests/scipy_stats_test.py @@ -441,7 +441,7 @@ def args_maker(): lsp_stats.multivariate_normal.logpdf, args_maker, check_dtypes=True, tol=1e-3) self._CompileAndCheck(lsp_stats.multivariate_normal.logpdf, args_maker, - check_dtypes=True) + check_dtypes=True, rtol=1e-4, atol=1e-4) if __name__ == "__main__": From 7e480fa923097826febec8ac6b74222dca6189a3 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 15 Jan 2020 15:00:38 -0800 Subject: [PATCH 0928/1053] add custom_jvp / vjp, delete custom_transforms --- .travis.yml | 6 +- README.md | 2 +- design_notes/custom_derivatives.md | 472 ++++ docs/CHANGELOG.rst | 2 +- docs/index.rst | 10 +- docs/jax.rst | 5 - docs/jaxpr.rst | 66 +- ...tom_derivative_rules_for_Python_code.ipynb | 2344 +++++++++++++++++ docs/notebooks/How_JAX_primitives_work.ipynb | 4 +- examples/control_test.py | 3 +- images/custom_jvp_schematic.png | Bin 0 -> 182949 bytes jax/api.py | 576 +--- jax/api_util.py | 29 +- jax/core.py | 39 +- jax/custom_derivatives.py | 542 ++++ jax/experimental/loops.py | 2 +- jax/experimental/ode.py | 668 ++--- jax/interpreters/ad.py | 88 +- jax/interpreters/batching.py | 70 +- jax/interpreters/partial_eval.py | 10 +- jax/lax/lax.py | 8 +- jax/lax/lax_control_flow.py | 41 +- jax/linear_util.py | 3 +- jax/nn/functions.py | 10 +- jax/numpy/lax_numpy.py | 3 +- jax/numpy/linalg.py | 23 +- jax/random.py | 2 +- jax/scipy/special.py | 41 +- tests/api_test.py | 896 +++++-- 29 files changed, 4414 insertions(+), 1551 deletions(-) create mode 100644 design_notes/custom_derivatives.md create mode 100644 docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb create mode 100644 images/custom_jvp_schematic.png create mode 100644 jax/custom_derivatives.py diff --git a/.travis.yml b/.travis.yml index 5bdc183678f2..8df31c498b19 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,10 +44,8 @@ script: - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html ; elif [ "$JAX_ONLY_CHECK_TYPES" = true ]; then - echo "===== Checking with mypy ====" && - time mypy --config-file=mypy.ini jax && - echo "===== Checking with pytype ====" && - time pytype jax ; + echo "===== Checking with mypy ====" + time mypy --config-file=mypy.ini jax ; else pytest -n 1 tests examples -W ignore ; fi diff --git a/README.md b/README.md index 59d21f4ebb33..0f639cc4237f 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ print(grad(grad(grad(tanh)))(1.0)) For more advanced autodiff, you can use [`jax.vjp`](https://jax.readthedocs.io/en/latest/jax.html#jax.vjp) for reverse-mode vector-Jacobian products and -[`jax.jvp`](https://jax.readthedocs.io/en/latest/jax.html#jax.defjvp) for +[`jax.jvp`](https://jax.readthedocs.io/en/latest/jax.html#jax.jvp) for forward-mode Jacobian-vector products. The two can be composed arbitrarily with one another, and with other JAX transformations. Here's one way to compose those to make a function that efficiently computes [full Hessian diff --git a/design_notes/custom_derivatives.md b/design_notes/custom_derivatives.md new file mode 100644 index 000000000000..41fb6df644d3 --- /dev/null +++ b/design_notes/custom_derivatives.md @@ -0,0 +1,472 @@ +# Custom JVP/VJP rules for JAX-transformable functions + +This is a design document, explaining some of the thinking behind the design and +implementation of `jax.custom_jvp` and `jax.custom_vjp`. For user-oriented +documentation, see [the tutorial notebook](https://jax.readthedocs.io/en/latest/notebooks/Custom_derivative_rules_for_Python_code.html). + +There are two ways to define differentiation rules in JAX: +1. using `jax.custom_jvp` and `jax.custom_vjp` to define custom differentiation + rules for Python functions that are already JAX-transformable; and +2. defining new `core.Primitive` instances along with all their transformation + rules, for example to call into functions from other systems like solvers, + simulators, or general numerical computing systems. + +This document is about #1 only. + +### Contents + +* [Goals](#goals) +* [Non-goals](#non-goals) +* [Main problem descriptions](#main-problem-descriptions) + * [The vmap-removes-custom-jvp semantics problem](#the-vmap-removes-custom-jvp-semantics-problem) + * [The Python flexibility problem](#the-python-flexibility-problem) +* [Solution idea](#solution-idea) +* [Implementation notes](#implementation-notes) + +## Goals + +We want **users** to customize the forward- and/or reverse-mode differentiation +behavior of their code. This customization +1. should have a _clear and consistent semantics_ in how it works and how it + composes with other JAX transformations; and +2. should be _flexible_ in supporting use cases and workflows like in + [Autograd](https://github.com/hips/autograd) and + [PyTorch](https://pytorch.org), including cases involving differentiation of + Python control flow and workflows for NaN debugging. + +As **JAX developers** we want to write library functions, like +[`logit`](https://github.com/google/jax/blob/01039299304b148b405ef9b9fa5e82bbb527471d/jax/scipy/special.py#L83) +and +[`expit`](https://github.com/google/jax/blob/01039299304b148b405ef9b9fa5e82bbb527471d/jax/scipy/special.py#L91), +that are defined in terms of other primitives, but for the purposes of +differentiation have primitive-like behavior in the sense that we want to define +custom differentiation rules for them, which may be more numerically stable or +performant. In particular, we don't want to have to specify `vmap` or `jit` +rules for functions like `logit` and `expit`. + +As a stretch goal, we’d like to make JAX a great environment for power users +looking to add custom differentiation rules for higher-order functions like +`fixed_point`, `odeint`, etc.; this design doc won’t solve that problem, but we +want to be confident we’re not going to preclude good solutions to that problem. + +That is, our primary goals are +1. solve the vmap-removes-custom-jvp semantics problem ([#1249](https://github.com/google/jax/issues/1249)), and +2. allow Python in custom VJPs, e.g. to debug NaNs + ([#1275](https://github.com/google/jax/issues/1275)). + +Secondary goals are +3. clean up and simplify user experience (symbolic zeros, kwargs, etc) +4. make progress towards a world where users can easily add `fixed_point`, + `odeint`, `root`, etc. + +Overall, we want to close +[#116](https://github.com/google/jax/issues/116), +[#1097](https://github.com/google/jax/issues/1097), +[#1249](https://github.com/google/jax/issues/1249), +[#1275](https://github.com/google/jax/issues/1275), +[#1366](https://github.com/google/jax/issues/1366), +[#1723](https://github.com/google/jax/issues/1723), +[#1670](https://github.com/google/jax/issues/1670), +[#1875](https://github.com/google/jax/issues/1875), +[#1938](https://github.com/google/jax/issues/1938), +and replace the custom_transforms machinery (from +[#636](https://github.com/google/jax/issues/636), +[#818](https://github.com/google/jax/issues/818), +and others). + +## Non-goals + +Here are objectives we're **not** aiming to achieve: +1. The `custom_transforms` machinery aimed to provide a transformation-generic + mechanism for customizing behavior, in principle (though never really used in + practice) allowing users to customize rules for any transformation while + somehow inheriting the “transparent” behavior for others. **We are instead + only going to solve the customization problem for differentiation (JVP and + VJP, separately).** Differentiation is the only case actually requested, and + by specializing to differentiation we can reduce complexity and improve + flexibility. To control all rules one can just write a primitive. +2. **We’re not going to prioritize mathematical aesthetics** over flexibility + and clarity on the user side, and simplicity on the implementation side. In + particular, while the custom VJP signature `a -> (b, CT b --o CT a)` is + mathematically pleasing, if it’s hard to implement in a Python mechanism + because of the closure in the return type, we’re fine doing something that + handles residuals more explicitly. +3. **Serialization support**, of the form where the staged-out serialized + program representation can be loaded and further JAX-transformed as opposed + to just evaluated, is currently out of scope for these custom JVP/VJP + transformation rules. Serialization may be useful not only for researchers + who want to save some representation of their computation (and transform it + after loading it), but also for future considerations like having jaxpr + transformations implemented outside Python, or having jaxprs as an MLIR + dialect. By defining this as a non-goal for the purpose of this design, we + have fewer constraints on where we can stash Python callables. + +## Main problem descriptions + +### The vmap-removes-custom-jvp semantics problem + +The vmap-removes-custom-jvp semantics problem is that vmap does not compose +properly with differentiation of functions with `custom_transforms` rules: + +```python +# old custom_transforms api to be replaced +@jax.custom_transforms +def f(x): + return 2. * x + +# f_vjp :: a -> (b, CT b --o CT a) +def f_vjp(x): + return f(x), lambda g: 3. * x # 3 instead of 2 + +jax.defvjp_all(f, f_vjp) + +grad(f)(1.) # 3. +vmap(grad(f))(np.ones(4)) # [3., 3., 3., 3.] +grad(lambda x: vmap(f)(x).sum())(np.ones(4)) # [2., 2., 2., 2.] +``` + +The last grad-of-vmap line has an unexpected result! In general, applying +`vmap`, or really any non-differentiation transformation, has the effect of +removing the custom differentiation rule. (Applying `jvp` causes a failure when +a custom VJP rule is defined.) + +The problem exists because transformations are like rewrites, and the `vmap` +transformation effectively rewrites the function to no longer call the +newly-introduced primitive for which there is a custom rule (and hence `grad` +then doesn’t produce the custom rule’s result). In more detail, the +`custom_transforms` machinery sets things up so that evaluating `f(x)` applies +the function + +``` +{ lambda ; ; a. + let b = f_primitive a + in [b] } +``` + +where `f_primitive` is a new primitive (introduced for every `custom_transforms` +function and in fact for every call of the function) to which the custom VJP +rule is associated. When we evaluate `grad(f)(x)`, the differentiation machinery +encounters `f_primitive` and processes it with the custom rule. + +However, because `f_primitive` is _transparent_ to `vmap`, in the sense that +`vmap` operates on (effectively by inlining) the definition of `f_primitive`, +the function `vmap(f)` is effectively + +``` +{ lambda ; ; a. + let b = mul 2. a + in [b] } +``` + +In words, `vmap` rewrites the function in terms of its underlying primitives and +their transformation rules, removing `f_primitive` entirely. + + +More generally, **because `vmap(f)` has semantics defined in terms of calls to +f, it is semantically inconsistent to remove the custom derivative rule**. That +is, since we define + +```python +vmap(f)(xs) == np.stack([f(x) for x in xs]) +``` + +we must have + +```python +jvp(vmap(f))(xs) == jvp(lambda xs: np.stack([f(x) for x in xs])) +``` + +yet this property is not observed when `f` has a custom derivative rule defined, +as the custom derivative rule is used in the right-hand version but not the +left-hand one. + +This issue isn’t specific to `vmap`; it applies to all transformations for which +the semantics of transforming a function `f` are defined in terms of calls to +the function `f`, rather than rewriting it into another function. The `mask` +transformation also falls into this class. Differentiation transforms and the +hypothetical all-unary-functions-become-cosine transform are not in this class. + +(The interaction between additional custom rules, like custom `vmap` rules, is +likely to get even more complex, suggesting the problem framing of +`custom_transforms` is too broad.) + +### The Python flexibility problem + +In JAX, as in [Autograd](https://github.com/hips/autograd) and +[PyTorch](https://pytorch.org) but not TF1, differentiation of a Python function +is performed while the function is being executed and traced. This behavior +delights users for a few reasons. + +**First and most importantly, it enables pdb-based workflows, e.g. for +inspecting numerics or catching NaNs.** That is, users can employ the standard +Python debugger and other Python-native tools to debug their code, even being +able to inspect runtime values to understand numerical behavior on examples and +to catch fundamentally runtime errors like NaNs. In fact, just while working on +the PR corresponding to this design, especially on the `odeint` primitive, I +used runtime value inspection to debug issues many times, increasing my +confidence that this is a key user workflow in Python. One especially handy +trick, which I’ve used in both JAX and Autograd many times, is the ability to +insert a debugger breakpoint in a custom VJP rule to enter a debugger at a +specific point in the backward pass. + +**Second, it allows differentiation of Python native control flow.** We’re not +sure how often this is used in practice in finalized software artifacts, but +when users first poke around JAX or Autograd they’re often impressed by this +freedom. There’s a reason we include it at the top of our JAX and Autograd +READMEs, slide decks, and demos. Ceding this capability would be a step backward +from Autograd. We want JAX to have the best automatic differentiation. + +However, the `custom_transforms` machinery does not provide this Python-support +flexibility. That is, because it’s implemented in terms of up-front jaxpr +formation from the Python code for both the user function and custom +differentiation rules, code like this leads to an abstract value tracing error: + +```python +# old custom_transforms api to be replaced +@jax.custom_transforms +def f(x): + if x > 0: + return x + else: + return 0. + +def f_vjp(x): + return ... + +jax.defvjp_all(f, f_vjp) + +grad(f)(1.) # Error! +``` + +## Solution idea + +The main idea is that **[dougalm@](https://github.com/dougalm) already solved +these problems with `core.call`**. That is, we can frame the task of specifying +a custom JVP rule for a user function in terms of a new Python-level call +primitive (not to be added to the jaxpr language; see below). This new call +primitive has a user Python function associated with it just like `core.call`, +but additionally has a second Python callable representing the JVP rule. Let’s +refer to this new call primitive as `custom_jvp_call`. + +Transformations like `vmap` interact with `custom_jvp_call` as with `core.call`: +they effectively pass right through it and are applied to the underlying Python +callables. Schematically, writing in terms of curried versions of the primitives +for convenience, analogously to how `vmap` interacts with `core.call` by +applying to the function to be called: + +```python +vmap(call(f)) == call(vmap(f)) +``` + +for the new primitive `custom_jvp_call` we simply apply `vmap` to the two +functions it entails: + +```python +vmap(custom_jvp_call(f, f_jvp)) == custom_jvp_call(vmap(f), vmap(f_jvp)) +``` + +This behavior means we’ve solved the [vmap-removes-custom-jvp semantics +problem](the-vmap-removes-custom-jvp-semantics-problem). + +The `jvp` transformation interacts as one might expect: it just calls `f_jvp`, + + +```python +jvp(call(f)) == call(jvp(f)) + +jvp(custom_jvp_call(f, f_jvp)) == f_jvp +``` + +Because `custom_jvp_call` acts like `core.call` (and not like `xla.xla_call`) in +that it doesn’t raise the abstraction level of its inputs (because it’s not +delaying anything or staging anything out), it means we’ve solved [the Python +flexibility problem](the-python-flexibility-problem): there are no constraints +on the user Python function (above the usual functional programming constraints +required by `jvp` or `vjp`). + +What about evaluation and compilation? These are two ways to “exit” the JAX +system, in the sense that no additional transformations can be applied after +these steps. As a result, their rules are trivial: + +```python +eval(call(f)) == eval(f) +jit(call(f)) == hlo_call(jit(f)) + +eval(custom_jvp_call(f, f_jvp)) == eval(f) +jit(custom_jvp_call(f, f_jvp)) == hlo_call(jit(f)) +``` + +In words, if a JVP rule hasn’t already rewritten `custom_jvp_call(f, f_jvp)` +into `f_jvp`, when we get to the point of evaluation with `eval` or staging out +to XLA with `jit`, differentiation is never going to be applied, so we just +ignore `f_jvp` and behave just like `core.call`. However, due to the wrinkle +discussed next, the partial eval rule for `custom_jvp_call` must be a bit more +complex, since partial evaluation isn’t just used to stage out to XLA with +`jit`. + +The only remaining wrinkle has to do with “initial-style” jaxpr-forming +primitives, like `lax.scan`, and their transformation rules. These represent a +different kind of “staging out to a jaxpr” than that for compilation because we +can perform additional transformations on the staged-out jaxpr. That is, when +`lax.scan` forms a jaxpr, it does not exit the transformation system, since when +we apply a jvp or vmap to a `lax.scan` we need to apply it to the function +represented by the jaxpr. + +Another way to state the wrinkle is that initial-style primitives like `lax.scan` +rely on the ability to round-trip to a jaxpr and back to a Python callable while +preserving semantics. That must mean preserving custom differentiation rule +semantics too. + +The solution is for the partial evaluation rule for `custom_jvp_call` to stage +out an initial-style call-like primitive that can be still be processed +correctly by `eval`, `jit`, `jvp` and/or `vmap` transformations. That means a +staged-out call-like primitive that carries with it enough information about `f` +and `f_jvp` to support all these transformations. We refer to this additional +primitive as `custom_jvp_call_jaxpr`. It is similar to `custom_jvp_call` except +it’s parameterized by a jaxpr for the primal function f rather than a Python +callable. The jaxpr for `f` is formed up-front before binding the primitive, +similar to other initial-style primitives. + +(Three footnotes. First, we could refer to both the Python trace-time primitive +`custom_jvp_call`, which takes a wrapped Python callable as an argument, and the +jaxpr language primitive `custom_jvp_call_jaxpr`, which has a jaxpr as a +parameter, as simply "`custom_jvp_call`", analogously to how we refer to both +versions of `xla_call` as just "`xla_call`", but here we chose to use different +names to make the distinction more explicit. Second, for implementation +simplicity, both `custom_jvp_call` and `custom_jvp_call_jaxpr` have partial eval +rules that don’t do any nontrivial partial evaluation and instead stage +everything out. That doesn’t constrain automatic differentiation because +`custom_jvp_call_jaxpr`'s JVP rule doesn’t itself bind a call primitive but +instead just invokes the custom JVP rule callable. Third, we don’t form a jaxpr +for the JVP rule callable up-front, and instead keep it as a Python callable, to +avoid a recursion problem: in the common case that the JVP rule itself calls the +underlying custom-JVP function, we can’t trace the JVP rule up-front without +getting an infinite recursion. By not forming a jaxpr, we’re solving this in the +same way we always do: rules are Python callbacks invoked when a transformation +is applied, not part of the primitive, and though the rule here is associated +directly with the primitive, rather than being in a global dict, that’s just an +implementation detail.) + +If we gave up on [the Python flexibility +problem](the-python-flexibility-problem), we could get away with only having +`custom_jvp_call_jaxpr` and not having the separate Python-level primitive +`custom_jvp_call`. One way to view the relationship between the two primitives +is in this schematic: + +
    + +
    + +## API + +The custom JVP for an `a -> b` function is specified with an `(a, Ta) -> (b, T +b)` function: + +```python +# f :: a -> b +@jax.custom_jvp +def f(x): + return np.sin(x) + +# f_jvp :: (a, T a) -> (b, T b) +def f_jvp(primals, tangents): + x, = primals + t, = tangents + return f(x), np.cos(x) * t + +f.defjvp(f_jvp) +``` + +(Interesting autodiff aside: for the rule to apply to higher-order +differentiation, one must call `f` in the body of `f_jvp`; that precludes some +kinds of work sharing between the internals of `f` and the tangent calculation.) + +The custom VJP for an `a -> b` function is specified with an `a -> (b, c)` forward +pass function paired with a `(c, CT b) -> CT` a backward pass function: + +```python +# f :: a -> b +@jax.custom_vjp +def f(x): + return np.sin(x) + +# f_fwd :: a -> (b, c) +def f_fwd(x): + return f(x), np.cos(x) + +# f_bwd :: (c, CT b) -> CT a +def f_bwd(cos_x, g): + return (cos_x * g,) + +f.defvjp(f_fwd, f_bwd) +``` + +The signature `a -> (b, CT b --o CT a)` is more aesthetically pleasing, but +supporting it would make the implementation more complex and might require +compromising expressibility desiderata. The basic reason that Python callables +are opaque (unless we trace them to a jaxpr eagerly, which places expressiveness +constraints), and in this case we may be returning a callable with `vmap` tracers +inside its closure that we need to know about during the forward pass. + +We could add convenience wrappers, for example to define the JVP rule for a +single argument at a time (like we do internally for primitives). But because +this proposal is complicated enough as it is, I decided against convenience +layers; let’s keep things minimal for now. + +There are some other bells and whistles to the API: +* Inputs and output types `a`, `b`, and `c` can be arbitrary pytrees of + jaxtypes. +* Passing arguments by name (keyword arguments) is supported when they can be + resolved to positions using the `inspect` module. This is a bit of an experiment + with Python 3’s improved ability to programmatically inspect argument + signatures. I believe it is sound but not complete, which is a fine place to be. + (See also [#2069](https://github.com/google/jax/issues/2069).) +* Arguments can be marked non-differentiable using `nondiff_argnums`, and as with + `jit`’s `static_argnums` these arguments don’t have to be JAX types. We need to + set a convention for how these arguments are passed to the rules. For a primal + function with type signature `(d, a) -> b` where `d` represents the + non-differentiable type, the JVP rule’s signature is `(a, T a, d) -> T b` and + the VJP rule’s reverse component signature is `(d, c, CT b) -> CT a`. That is, + the non-differentiable arguments are passed in order after `primals` and + `tangents` for a custom JVP rule, and passed in order preceding the residuals in + a custom VJP rule’s reverse function. + +## Implementation notes + +* Updated `jax.experimental.odeint` + * Since `odeint` is a pretty complex user of a custom VJP rule, in addition to + just updating it to work at all, I wanted to revise it to be a canonical + user of the new custom VJP API as a way to test that the API was a good one. + * Along the way I made other improvements to the `odeint` implementation: + * remove raveling/unraveling boilerplate + * make use of `lax.scan` to remove the index-update logic + * speed up by 20+% on the simple pendulum benchmark +* Added a custom bind method on each transform for the custom derivative call + primitives, `custom_jvp_call` and `custom_vjp_call`. It’s like + `core.call_bind`, except we don’t process env traces: those are just errors. +* Added `custom_lin` primitive, which gets staged out into linear jaxprs to be + transposed when using a custom VJP rule. + * Because our reverse-mode autodiff is decomposed into linearization, partial + evaluation, and transposition, our custom VJP rules are processed in two + separate steps: one during linearization and one during transposition. + * The linearization step, i.e. the JVP rule for `custom_vjp_call`, applies + `custom_lin` to the tangent values; `custom_lin` carries with it the user’s + custom backward-pass function, and as a primitive it only has a transpose + rule. + * This mechanism is described more in [#636](https://github.com/google/jax/issues/636). +* Added a variant of `transformation_with_aux` called + `transformation_with_equal_aux` to allow repeated stores of equal values due + to running the same function multiple times. + * The custom rules functions, like `f_jvp` and `f_fwd`/`f_bwd` in the examples + above, are not “linear” in the sense of linear_util.py when used in + `custom_jvp_call_jaxpr` and `custom_vjp_call_jaxpr`, respectively. They may be + invoked multiple times as a jaxpr is processed in initial style. It’s + usually fine for rules to be invoked multiple times, but these rules must + plumb aux data out to the api.py-level caller, namely output pytree aux + data. + * (Recall from a footnote above that we can’t solve this by forming jaxprs for + the rules up-front because that can lead to infinite recursion.) + + diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 5086fedf2e99..a029eea4931f 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -77,7 +77,7 @@ jax 0.1.59 (February 11, 2020) * Simplified :py:class:`Jaxpr` by removing the ``Jaxpr.freevars`` and ``Jaxpr.bound_subjaxprs``. The call primitives (``xla_call``, ``xla_pmap``, ``sharded_call``, and ``remat_call``) get a new parameter ``call_jaxpr`` with a - fully-closed (no ``constvars``) JAXPR. Also, added a new field ``call_primitive`` + fully-closed (no ``constvars``) jaxpr. Also, added a new field ``call_primitive`` to primitives. * New features: diff --git a/docs/index.rst b/docs/index.rst index d148479c0d23..0966b98fca26 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,7 +13,8 @@ For an introduction to JAX, start at the notebooks/quickstart notebooks/autodiff_cookbook - Training a Simple Neural Network, with PyTorch Data Loading + notebooks/vmapped_log_probs + Training a Simple Neural Network, with Tensorflow Datasets Data Loading .. toctree:: @@ -21,14 +22,11 @@ For an introduction to JAX, start at the :caption: Advanced JAX Tutorials notebooks/Common_Gotchas_in_JAX - notebooks/XLA_in_Python + notebooks/Custom_derivative_rules_for_Python_code notebooks/JAX_pytrees + notebooks/XLA_in_Python notebooks/How_JAX_primitives_work notebooks/Writing_custom_interpreters_in_Jax.ipynb - Training a Simple Neural Network, with Tensorflow Datasets Data Loading - notebooks/maml - notebooks/score_matching - notebooks/vmapped_log_probs .. toctree:: :maxdepth: 1 diff --git a/docs/jax.rst b/docs/jax.rst index 0d3f53c6f6cc..c7a876059035 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -41,11 +41,6 @@ Automatic differentiation .. autofunction:: jvp .. autofunction:: linearize .. autofunction:: vjp -.. autofunction:: custom_transforms -.. autofunction:: defjvp -.. autofunction:: defjvp_all -.. autofunction:: defvjp -.. autofunction:: defvjp_all .. autofunction:: custom_gradient diff --git a/docs/jaxpr.rst b/docs/jaxpr.rst index b189ed507c60..034e776761a8 100644 --- a/docs/jaxpr.rst +++ b/docs/jaxpr.rst @@ -1,4 +1,4 @@ -Understanding JAXPR +Understanding jaxprs ==================== Updated: February 14, 2020 (for commit 9e6fe64). @@ -8,29 +8,29 @@ Updated: February 14, 2020 (for commit 9e6fe64). Conceptually, one can think of JAX transformations as first tracing the Python function to be transformed into a small and well-behaved intermediate form, -the JAXPR, that is then transformed accordingly, and ultimately compiled and executed. +the jaxpr, that is then transformed accordingly, and ultimately compiled and executed. One of the reasons JAX can pack so much power into such a small software package is that it starts with a familiar and flexible programming interface (Python with NumPy) and it uses the actual Python interpreter to do most of the heavy lifting to distill the essence of the computation into a simple statically-typed expression language -with limited higher-order features: the JAXPR language. +with limited higher-order features: the jaxpr language. Not all Python programs can be processed this way, but it turns out that many scientific computing and machine learning programs do have this property. Before we proceed, it is important to point out that not all JAX transformations -materialize a JAXPR as described above; some, e.g., differentiation, +materialize a jaxpr as described above; some, e.g., differentiation, will apply transformations incrementally during tracing. Nevertheless, if one wants to understand how JAX works internally, or to -make use of the result of JAX tracing, it is useful to understand JAXPR. +make use of the result of JAX tracing, it is useful to understand jaxpr. -A JAXPR instance represents a function with one of more typed parameters (input variables) +A jaxpr instance represents a function with one of more typed parameters (input variables) and one or more typed results. The results depend only on the input variables; there are no free variables captured from enclosing scopes. The inputs and outputs have types, which in JAX are represented as abstract -values. There are two related representations in the code for JAXPRs. The main +values. There are two related representations in the code for jaxprs. The main one is :py:class:`jax.core.TypedJaxpr` and is what you obtain when you -use :py:func:`jax.make_jaxpr` to inspect JAXPRs. It has the following +use :py:func:`jax.make_jaxpr` to inspect jaxprs. It has the following fields: * ``jaxpr``: is the actual computation content of the actual function (described below). @@ -49,12 +49,12 @@ The most interesting part of the TypedJaxpr is the actual execution content, represented as a :py:class:`jax.core.Jaxpr` as printed using the following grammar:: - JAXPR ::= { lambda Var* ; Var+. + jaxpr ::= { lambda Var* ; Var+. let Eqn* in [Expr+] } where: - * The parameter of the JAXPR are shown as two lists of variables separated by + * The parameter of the jaxpr are shown as two lists of variables separated by ``;``. The first set of variables are the ones that have been introduced to stand for constants that have been hoisted out. These are called the `constvars`. The second list of variables are the real input variables. @@ -62,7 +62,7 @@ where: intermediate expressions. Each equation defines one or more variables as the result of applying a primitive on some atomic expressions. Each equation uses only input variables and intermediate variables defined by previous equations. - * ``Expr+``: is a list of output atomic expressions for the JAXPR. + * ``Expr+``: is a list of output atomic expressions for the jaxpr. Equations are printed as follows:: @@ -79,14 +79,14 @@ where: square brackets. Each parameter is shown as ``Name = Value``. -Most JAXPR primitives are first-order (they take just one or more Expr as arguments):: +Most jaxpr primitives are first-order (they take just one or more Expr as arguments):: Primitive := add | sub | sin | mul | ... -The JAXPR primitives are documented in the :py:mod:`jax.lax` module. +The jaxpr primitives are documented in the :py:mod:`jax.lax` module. -For example, here is the JAXPR produced for the function ``func1`` below:: +For example, here is the jaxpr produced for the function ``func1`` below:: from jax import numpy as jnp def func1(first, second): @@ -110,12 +110,12 @@ The ``reduce_sum`` primitive has named parameters ``axes`` and ``input_shape``, addition to the operand ``e``. Note that JAX traces through Python-level control-flow and higher-order functions -when it extracts the JAXPR. This means that just because a Python program contains -functions and control-flow, the resulting JAXPR does not have +when it extracts the jaxpr. This means that just because a Python program contains +functions and control-flow, the resulting jaxpr does not have to contain control-flow or higher-order features. For example, when tracing the function ``func3`` JAX will inline the call to ``inner`` and the conditional ``if second.shape[0] > 4``, and will produce the same -JAXPR as before:: +jaxpr as before:: def func2(inner, first, second): temp = first + inner(second) * 3. @@ -142,13 +142,13 @@ JAXPR as before:: Handling PyTrees ---------------- -In JAXPR there are no tuple types; instead primitives take multiple inputs +In jaxpr there are no tuple types; instead primitives take multiple inputs and produce multiple outputs. When processing a function that has structured -inputs or outputs, JAX will flatten those and in JAXPR they will appear as lists +inputs or outputs, JAX will flatten those and in jaxpr they will appear as lists of inputs and outputs. For more details, please see the documentation for PyTrees (:doc:`notebooks/JAX_pytrees`). -For example, the following code produces an identical JAXPR to what we saw +For example, the following code produces an identical jaxpr to what we saw before (with two input vars, one for each element of the input tuple):: @@ -184,7 +184,7 @@ from the Python program, or from constant-folding. For example, the function print(api.make_jaxpr(func6)(jnp.ones(8))) -JAX produces the following JAXPR:: +JAX produces the following jaxpr:: { lambda b d a. let c = add a b @@ -196,13 +196,13 @@ When tracing ``func6``, the function ``func5`` is invoked with a constant value ``jnp.sin(second) * 3.`` is constant-folded. There are two ConstVars, ``b`` (standing for ``jnp.sin(second) * 3.``) and ``d`` (standing for ``jnp.ones(8)``). Unfortunately, it is not easy to tell from the -JAXPR notation what constants the constant variables stand for. +jaxpr notation what constants the constant variables stand for. Higher-order primitives ----------------------- -JAXPR includes several higher-order primitives. They are more complicated because -they include sub-JAXPRs. +jaxpr includes several higher-order primitives. They are more complicated because +they include sub-jaxprs. Cond ^^^^ @@ -238,7 +238,7 @@ For example:: The cond primitive has a number of parameters: - * `true_jaxpr` and `false_jaxpr` are JAXPRs that correspond to the true + * `true_jaxpr` and `false_jaxpr` are jaxprs that correspond to the true and false branch functionals. In this example, those functionals take each one input variable, corresponding to ``xtrue`` and ``xfalse`` respectively. * `linear` is a tuple of booleans that is used internally by the auto-differentiation @@ -273,7 +273,7 @@ contains a constant ``jnp.ones(1)`` that is hoisted as a `constvar`:: in a } ] d b c e b c in f } -The top-level JAXPR has one `constvar` ``e`` (corresponding to ``jnp.ones(1)`` from the +The top-level jaxpr has one `constvar` ``e`` (corresponding to ``jnp.ones(1)`` from the body of the ``false_jaxpr``) and three input variables ``a b c`` (corresponding to ``arg1`` and the two elements of ``arg2``; note that ``arg2`` has been flattened). The ``true_jaxpr`` has two input variables (corresponding to the two elements of ``arg2`` @@ -286,10 +286,10 @@ The actual operands to the cond primitive are: ``d b c e b c``, which correspond * 1 operand for the predicate, * 2 operands for ``true_jaxpr``, i.e., ``b`` and ``c``, which are input vars, - corresponding to ``arg2`` for the top-level JAXPR, - * 1 constant for ``false_jaxpr``, i.e., ``e``, which is a consvar for the top-level JAXPR, + corresponding to ``arg2`` for the top-level jaxpr, + * 1 constant for ``false_jaxpr``, i.e., ``e``, which is a consvar for the top-level jaxpr, * 2 operands for ``true_jaxpr``, i.e., ``b`` and ``c``, which are the input vars - corresponding to ``arg2`` for the top-level JAXPR. + corresponding to ``arg2`` for the top-level jaxpr. While ^^^^^ @@ -328,7 +328,7 @@ For example, here is an example fori loop:: cond_nconsts=0 ] c a 0 b e in h } -The top-level JAXPR has two constvars: ``c`` (corresponding to ``ones * 3.`` from the body +The top-level jaxpr has two constvars: ``c`` (corresponding to ``ones * 3.`` from the body of the loop) and ``d`` (corresponding to the use of ``ones`` in the initial carry). There are also two input variables (``a`` corresponding to ``arg`` and ``b`` corresponding to ``n``). @@ -386,7 +386,7 @@ For the example consider the function ``func11`` below:: num_consts=1 ] b 0.0 a * c in (d, e) } -The top-level JAXPR has one constvar ``c`` corresponding to the ``ones`` constant, +The top-level jaxpr has one constvar ``c`` corresponding to the ``ones`` constant, and two input variables corresponding to the arguments ``arr`` and ``extra``. The body of the scan has 5 input variables, of which: @@ -413,7 +413,7 @@ XLA_call ^^^^^^^^ The call primitive arises from JIT compilation, and it encapsulates -a sub-JAXPR along with parameters the specify the backend and the device the +a sub-jaxpr along with parameters the specify the backend and the device the computation should run. For example:: def func12(arg): @@ -438,7 +438,7 @@ computation should run. For example:: The top-level constvar ``b`` refers to the ``jnp.ones(1)`` constant, and the top-level input variable `a` refers to the ``arg`` parameter of ``func12``. The ``xla_call`` primitive stands for a call to the jitted ``inner`` function. -The primitive has the function body in the ``call_jaxpr`` parameter, a JAXPR +The primitive has the function body in the ``call_jaxpr`` parameter, a jaxpr with 3 input parameters: * ``c`` is a constvar and stands for the ``ones`` constant, diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb new file mode 100644 index 000000000000..9de88eda0b2b --- /dev/null +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -0,0 +1,2344 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Custom derivative rules for Python code.ipynb", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LqiaKasFjH82", + "colab_type": "text" + }, + "source": [ + "# Custom derivative rules for JAX-transformable Python functions\n", + "\n", + "*mattjj@ Mar 19 2020*\n", + "\n", + "There are two ways to define differentiation rules in JAX:\n", + "\n", + "1. using `jax.custom_jvp` and `jax.custom_vjp` to define custom differentiation rules for Python functions that are already JAX-transformable; and\n", + "2. defining new `core.Primitive` instances along with all their transformation rules, for example to call into functions from other systems like solvers, simulators, or general numerical computing systems.\n", + "\n", + "This notebook is about #1. To read instead about #2, see the [notebook on adding primitives](https://jax.readthedocs.io/en/latest/notebooks/How_JAX_primitives_work.html).\n", + "\n", + "For an introduction to JAX's automatic differentiation API, see [The Autodiff Cookbook](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html). This notebook assumes some familiarity with [`jax.jvp`](https://jax.readthedocs.io/en/latest/jax.html#jax.jvp) and [`jax.grad`](https://jax.readthedocs.io/en/latest/jax.html#jax.vjp), and the mathematical meaning of JVPs and VJPs." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9Fg3NFNY-2RY", + "colab_type": "text" + }, + "source": [ + "## TL;DR" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zXic8tr--1PK", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import jax.numpy as np\n", + "from jax import custom_jvp\n", + "\n", + "@custom_jvp\n", + "def f(x, y):\n", + " return np.sin(x) * y\n", + "\n", + "@f.defjvp\n", + "def f_jvp(primals, tangents):\n", + " x, y = primals\n", + " x_dot, y_dot = tangents\n", + " primal_out = f(x, y)\n", + " tangent_out = np.cos(x) * x_dot * y - np.sin(x) * y_dot\n", + " return primal_out, tangent_out" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "RrNf588X_kJF", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "outputId": "246fe70d-2348-4e3e-f58d-766ef16304bc" + }, + "source": [ + "from jax import jvp, grad\n", + "\n", + "print(f(2., 3.))\n", + "y, y_dot = jvp(f, (2., 3.), (1., 0.))\n", + "print(y)\n", + "print(y_dot)\n", + "print(grad(f)(2., 3.))" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2.7278922\n", + "2.7278922\n", + "-1.2484405\n", + "-1.2484405\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "35ScHqhrBwPh", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import custom_vjp\n", + "\n", + "@custom_vjp\n", + "def f(x, y):\n", + " return np.sin(x) * y\n", + "\n", + "def f_fwd(x, y):\n", + " return f(x, y), (np.cos(x), np.sin(x), y)\n", + "\n", + "def f_bwd(res, g):\n", + " cos_x, sin_x, y = res\n", + " return (cos_x * g * y, -sin_x * g)\n", + "\n", + "f.defvjp(f_fwd, f_bwd)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "HpSozxKUCXgp", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "889eb046-19bf-49c7-d8a9-c037b8325fe9" + }, + "source": [ + "print(grad(f)(2., 3.))" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "-1.2484405\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p5ypWA7XlZpu", + "colab_type": "text" + }, + "source": [ + "## Example problems\n", + "\n", + "To get an idea of what problems `jax.custom_jvp` and `jax.custom_vjp` are meant to solve, let's go over a few examples. A more thorough introduction to the `jax.custom_jvp` and `jax.custom_vjp` APIs is in [the next section](#scrollTo=Dr0aNkBslfQf).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AR02eyd1GQhC", + "colab_type": "text" + }, + "source": [ + "\n", + "\n", + "### Numerical stability\n", + "\n", + "One application of `jax.custom_jvp` is to improve the numerical stability of differentiation." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GksPXslaGPaW", + "colab_type": "text" + }, + "source": [ + "\n", + "Say we want to write a function called `log1pexp`, which computes $x \\mapsto \\log ( 1 + e^x )$. We can write that using `jax.numpy`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6lWbTvs40ET-", + "colab_type": "code", + "outputId": "b7b9d021-5a34-42ee-cba6-90d3a3e1ee55", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "import jax.numpy as np\n", + "\n", + "def log1pexp(x):\n", + " return np.log(1. + np.exp(x))\n", + "\n", + "log1pexp(3.)" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(3.0485873, dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PL36r_cD0oE8", + "colab_type": "text" + }, + "source": [ + "Since it's written in terms of `jax.numpy`, it's JAX-transformable:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "XgtGKFld02UD", + "colab_type": "code", + "outputId": "06691c5d-a3c6-4632-a5c7-96eb7379c978", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "source": [ + "from jax import jit, grad, vmap\n", + "\n", + "print(jit(log1pexp)(3.))\n", + "print(jit(grad(log1pexp))(3.))\n", + "print(vmap(jit(grad(log1pexp)))(np.arange(3.)))" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "3.0485873\n", + "0.95257413\n", + "[0.5 0.7310586 0.88079715]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o56Nr3V61PKS", + "colab_type": "text" + }, + "source": [ + "But there's a numerical stability problem lurking here:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "sVM6iwIO22sB", + "colab_type": "code", + "outputId": "39338c73-dd3a-4915-de26-8c634ba96375", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "print(grad(log1pexp)(100.))" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nan\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Zu9sR2I73wuO", + "colab_type": "text" + }, + "source": [ + "That doesn't seem right! After all, the derivative of $x \\mapsto \\log (1 + e^x)$ is $x \\mapsto \\frac{e^x}{1 + e^x}$, and so for large values of $x$ we'd expect the value to be about 1.\n", + "\n", + "We can get a bit more insight into what's going on by looking at the jaxpr for the gradient computation:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dO6uZlYR4TVp", + "colab_type": "code", + "outputId": "3f573ed5-a7a6-49f8-bb03-a26abc4fd4ef", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 119 + } + }, + "source": [ + "from jax import make_jaxpr\n", + "\n", + "make_jaxpr(grad(log1pexp))(100.)" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{ lambda ; a.\n", + " let b = exp a\n", + " c = add b 1.0\n", + " d = div 1.0 c\n", + " e = mul d b\n", + " in (e,) }" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "52HR5EW26PEt", + "colab_type": "text" + }, + "source": [ + "Stepping through how the jaxpr would be evaluated, we can see that the last line would involve multiplying values that floating point math will round to 0 and $\\infty$, respectively, which is never a good idea. That is, we're effectively evaluating `lambda x: (1 / (1 + np.exp(x))) * np.exp(x)` for large `x`, which effectively turns into `0. * np.inf`.\n", + "\n", + "Instead of generating such large and small values, hoping for a cancellation that floats can't always provide, we'd rather just express the derivative function as a more numerically stable program. In particular, we can write a program that more closely evaluates the equal mathematical expression $1 - \\frac{1}{1 + e^x}$, with no cancellation in sight.\n", + "\n", + "This problem is interesting because even though our definition of `log1pexp` could already be JAX-differentiated (and transformed with `jit`, `vmap`, ...), we're not happy with the result of applying standard autodiff rules to the primitives comprising `log1pexp` and composing the result. Instead, we'd like to specify how the whole function `log1pexp` should be differentiated, as a unit, and thus arrange those exponentials better.\n", + "\n", + "This is one application of custom derivative rules for Python functions that are already JAX transformable: specifying how a composite function should be differentiated, while still using its original Python definition for other transformations (like `jit`, `vmap`, ...).\n", + "\n", + "Here's a solution using `jax.custom_jvp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "XQt6MAuTJewG", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import custom_jvp\n", + "\n", + "@custom_jvp\n", + "def log1pexp(x):\n", + " return np.log(1. + np.exp(x))\n", + "\n", + "@log1pexp.defjvp\n", + "def log1pexp_jvp(primals, tangents):\n", + " x, = primals\n", + " x_dot, = tangents\n", + " ans = log1pexp(x)\n", + " ans_dot = (1 - 1/(1 + np.exp(x))) * x_dot\n", + " return ans, ans_dot" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "rhiMHulfKBIF", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "36c4065b-5e77-4a4c-eedb-857f00a24cf7" + }, + "source": [ + "print(grad(log1pexp)(100.))" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9cLDuAo6KGUu", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "c0f25e98-e4a0-47fe-ee74-a843f3697d55" + }, + "source": [ + "print(jit(log1pexp)(3.))\n", + "print(jit(grad(log1pexp))(3.))\n", + "print(vmap(jit(grad(log1pexp)))(np.arange(3.)))" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "text": [ + "3.0485873\n", + "0.95257413\n", + "[0.5 0.7310586 0.8807971]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V9tHAfrSF1N-", + "colab_type": "text" + }, + "source": [ + "### Enforcing a differentiation convention\n", + "\n", + "A related application is to enforce a differentiation convention, perhaps at a boundary." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "l_6tdb-QGK-H", + "colab_type": "text" + }, + "source": [ + "\n", + "Consider the function $f : \\mathbb{R}_+ \\mapsto \\mathbb{R}_+$ with $f(x) = \\frac{x}{1 + \\sqrt{x}}$, where we take $\\mathbb{R}_+ = [0, \\infty)$. We might implement $f$ as a program like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "AfF5P7x_GaSe", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def f(x):\n", + " return x / (1 + np.sqrt(x))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BVcEkF3ZGgv1", + "colab_type": "text" + }, + "source": [ + "As a mathematical function on $\\mathbb{R}$ (the full real line), $f$ is not differentiable at zero (because the limit defining the derivative doesn't exist from the left). Correspondingly, autodiff produces a `nan` value:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "piI0u5MiHhQh", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "outputId": "5e1ed5f0-271a-4c35-860a-d69cd069b439" + }, + "source": [ + "print(grad(f)(0.))" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nan\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IP0H2b7ZHkzD", + "colab_type": "text" + }, + "source": [ + "But mathematically if we think of $f$ as a function on $\\mathbb{R}_+$ then it is differentiable at 0 [Rudin Definition 5.1, or Tao Definition 10.1.1]. Alternatively, we might say as a convention we want to consider the directional derivative from the right. So there is a sensible value for the Python function `grad(f)` to return at `0.0`, namely `1.0`, even though JAX's machinery for differentiation over reals doesn't produce it.\n", + "\n", + "We can use a custom JVP rule! In particular, we can define the JVP rule in terms of the derivative function $x \\mapsto \\frac{\\sqrt{x} + 2}{2(\\sqrt{x} + 1)^2}$ on $\\mathbb{R}_+$," + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ksHmCkcSKQJr", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x):\n", + " return x / (1 + np.sqrt(x))\n", + "\n", + "@f.defjvp\n", + "def f_jvp(primals, tangents):\n", + " x, = primals\n", + " x_dot, = tangents\n", + " ans = f(x)\n", + " ans_dot = ((np.sqrt(x) + 2) / (2 * (np.sqrt(x) + 1)**2)) * x_dot\n", + " return ans, ans_dot" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Gsh9ZvMTKi1O", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "outputId": "4ce69b63-166b-4e18-cf79-6550046b510a" + }, + "source": [ + "print(grad(f)(0.))" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "CICQuI86WK4_" + }, + "source": [ + "### Python debugging\n", + "\n", + "Another application that is motivated by development workflow rather than numerics is to set a `pdb` debugger trace in the backward pass of reverse-mode autodiff.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cgxMjNTrGjJn", + "colab_type": "text" + }, + "source": [ + "\n", + "When trying to track down the source of a `nan` runtime error, or just examine carefully the cotangent (gradient) values being propagated, it can be useful to insert a debugger at a point in the backward pass that corresponds to a specific point in the primal computation.\n", + "\n", + "We'll defer an example until the next section." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IC7tEcr1-Fc5", + "colab_type": "text" + }, + "source": [ + "### Implicit function differentiation of iterative implementations\n", + "\n", + "This example gets pretty deep in the mathematical weeds!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "szAt97t80hew", + "colab_type": "text" + }, + "source": [ + "Another application for `jax.custom_vjp` is reverse-mode differentiation of functions that are JAX-transformable (by `jit`, `vmap`, ...) but not efficiently JAX-differentiable for some reason, perhaps because they involve `lax.while_loop`. (It's not possible to produce an XLA HLO program that efficiently computes the reverse-mode derivative of an XLA HLO While loop because that would require a program with unbounded memory use, which isn't possible to express in XLA HLO, at least without side-effecting interactions through infeed/outfeed.)\n", + "\n", + "For example, consider this `fixed_point` routine which computes a fixed point by iteratively applying a function in a `while_loop`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2uA8X2izXH2b", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax.lax import while_loop\n", + "\n", + "def fixed_point(f, a, x_guess):\n", + " def cond_fun(carry):\n", + " x_prev, x = carry\n", + " return np.abs(x_prev - x) > 1e-6\n", + "\n", + " def body_fun(carry):\n", + " _, x = carry\n", + " return x, f(a, x)\n", + "\n", + " _, x_star = while_loop(cond_fun, body_fun, (x_guess, f(a, x_guess)))\n", + " return x_star" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p2xFQAte19sF", + "colab_type": "text" + }, + "source": [ + "This is an iterative procedure for numerically solving the equation $x = f(a, x)$ for $x$, by iterating $x_{t+1} = f(a, x_t)$ until $x_{t+1}$ is sufficiently close to $x_t$. The result $x^*$ depends on the parameters $a$, and so we can think of there being a function $a \\mapsto x^*(a)$ that is implicity defined by equation $x = f(a, x)$.\n", + "\n", + "We can use `fixed_point` to run iterative procedures to convergence, for example running Newton's method to calculate square roots while only executing adds, multiplies, and divides:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rDDwM8bYYzRT", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def newton_sqrt(a):\n", + " update = lambda a, x: 0.5 * (x + a / x)\n", + " return fixed_point(update, a, a)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "42Ydd7_6aLXU", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "29833920-bea5-4853-d55b-10c66a27fd32" + }, + "source": [ + "print(newton_sqrt(2.))" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.4142135\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-yFtYWH13QWm", + "colab_type": "text" + }, + "source": [ + "We can `vmap` or `jit` the function as well:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "t_YSXieT3Yyk", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "a6b00ffe-cba1-4177-c50d-0f1b55ceed31" + }, + "source": [ + "print(jit(vmap(newton_sqrt))(np.array([1., 2., 3., 4.])))" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[1. 1.4142135 1.7320508 2. ]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "emwWIt3d3h1T", + "colab_type": "text" + }, + "source": [ + "We can't apply reverse-mode automatic differentiation because of the `while_loop`, but it turns out we wouldn't want to anyway: instead of differentiating through the implementation of `fixed_point` and all its iterations, we can exploit the mathematical structure to do something that is much more memory-efficient (and FLOP-efficient in this case, too!). We can instead use the implicit function theorem [Prop A.25 of Bertsekas's Nonlinear Programming, 2nd ed.], which guarantees (under some conditions) the existence of the mathematical objects we're about to use. In essence, we linearize at the solution and solve those linear equations iteratively to compute the derivatives we want.\n", + "\n", + "Consider again the equation $x = f(a, x)$ and the function $x^*$. We want to evaluate vector-Jacobian products like $v^\\mathsf{T} \\mapsto v^\\mathsf{T} \\partial x^*(a_0)$.\n", + "\n", + "At least in an open neighborhood around the point $a_0$ at which we want to differentiate, let's assume that the equation $x^*(a) = f(a, x^*(a))$ holds for all $a$. Since the two sides are equal as functions of $a$, their derivatives must be equal as well, so let's differentiate both sides:\n", + "\n", + "$\\qquad \\partial x^*(a) = \\partial_0 f(a, x^*(a)) + \\partial_1 f(a, x^*(a)) \\partial x^*(a)$.\n", + "\n", + "Setting $A = \\partial_1 f(a_0, x^*(a_0))$ and $B = \\partial_0 f(a_0, x^*(a_0))$, we can write the quantity we're after more simply as\n", + "\n", + "$\\qquad \\partial x^*(a_0) = B + A \\partial x^*(a_0)$,\n", + "\n", + "or, by rearranging,\n", + "\n", + "$\\qquad \\partial x^*(a_0) = (I - A)^{-1} B$.\n", + "\n", + "That means we can evaluate vector-Jacobian products like\n", + "\n", + "$\\qquad v^\\mathsf{T} \\partial x^*(a_0) = v^\\mathsf{T} (I - A)^{-1} B = w^\\mathsf{T} B$,\n", + "\n", + "where $w^\\mathsf{T} = v^\\mathsf{T} (I - A)^{-1}$, or equivalently $w^\\mathsf{T} = v^\\mathsf{T} + w^\\mathsf{T} A$, or equivalently $w^\\mathsf{T}$ is the fixed point of the map $u^\\mathsf{T} \\mapsto v^\\mathsf{T} + u^\\mathsf{T} A$. That last characterization gives us a way to write the VJP for `fixed_point` in terms of a call to `fixed_point`! Moreover, after expanding $A$ and $B$ back out, we can see we need only to evaluate VJPs of $f$ at $(a_0, x^*(a_0))$.\n", + "\n", + "Here's the upshot:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "g4jo-xlvdiym", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from functools import partial\n", + "\n", + "from jax import custom_vjp\n", + "from jax import vjp\n", + "\n", + "@partial(custom_vjp, nondiff_argnums=(0,))\n", + "def fixed_point(f, a, x_guess):\n", + " def cond_fun(carry):\n", + " x_prev, x = carry\n", + " return np.abs(x_prev - x) > 1e-6\n", + "\n", + " def body_fun(carry):\n", + " _, x = carry\n", + " return x, f(a, x)\n", + "\n", + " _, x_star = while_loop(cond_fun, body_fun, (x_guess, f(a, x_guess)))\n", + " return x_star\n", + "\n", + "def fixed_point_fwd(f, a, x_init):\n", + " x_star = fixed_point(f, a, x_init)\n", + " return x_star, (a, x_star)\n", + "\n", + "def fixed_point_rev(f, res, x_star_bar):\n", + " a, x_star = res\n", + " _, vjp_a = vjp(lambda a: f(a, x_star), a)\n", + " a_bar, = vjp_a(fixed_point(partial(rev_iter, f),\n", + " (a, x_star, x_star_bar),\n", + " x_star_bar))\n", + " return a_bar, np.zeros_like(x_star)\n", + " \n", + "def rev_iter(f, packed, u):\n", + " a, x_star, x_star_bar = packed\n", + " _, vjp_x = vjp(lambda x: f(a, x), x_star)\n", + " return x_star_bar + vjp_x(u)[0]\n", + "\n", + "fixed_point.defvjp(fixed_point_fwd, fixed_point_rev)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "iKzfT6d_mEoB", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "99482a53-f7b5-4715-ffcb-66fb0346a7b3" + }, + "source": [ + "print(newton_sqrt(2.))" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.4142135\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Hmcpjr6gmtkO", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "f76cc1d0-de93-4e1c-c1f3-509d3f04df32" + }, + "source": [ + "print(grad(newton_sqrt)(2.))\n", + "print(grad(grad(newton_sqrt))(2.))" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.35355335\n", + "-0.088388346\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DvVmlaPD7W-4", + "colab_type": "text" + }, + "source": [ + "We can check our answers by differentiating `np.sqrt`, which uses a totally different implementation:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jj_JnI9Pm4jg", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "bae61d39-5f13-452b-b700-897d1f9a38d3" + }, + "source": [ + "print(grad(np.sqrt)(2.))\n", + "print(grad(grad(np.sqrt))(2.))" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.35355338\n", + "-0.08838835\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HowvqayEuy-H", + "colab_type": "text" + }, + "source": [ + "A limitation to this approach is that the argument `f` can't close over any values involved in differentiation. That is, you might notice that we kept the parameter `a` explicit in the argument list of `fixed_point`. While other JAX mechanisms can handle closed-over transformation-traced values in the arguments to higher-order functions (as is done for the control flow primitives like `lax.cond`, `lax.scan`, and `lax.while_loop` itself), `jax.custom_vjp` used as above cannot. A `fixed_point` routine that used a bit more of JAX's internals could have a more convenient and robust API." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dr0aNkBslfQf", + "colab_type": "text" + }, + "source": [ + "## Basic usage of `jax.custom_jvp` and `jax.custom_vjp` APIs\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MojTOg4tmQNT", + "colab_type": "text" + }, + "source": [ + "\n", + "### Use `jax.custom_jvp` to define forward-mode (and, indirectly, reverse-mode) rules\n", + "\n", + "Here's a canonical basic example of using `jax.custom_jvp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nVkhbIFAOGZk", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import custom_jvp\n", + "import jax.numpy as np\n", + "\n", + "# f :: a -> b\n", + "@custom_jvp\n", + "def f(x):\n", + " return np.sin(x)\n", + "\n", + "# f_jvp :: (a, T a) -> (b, T b)\n", + "def f_jvp(primals, tangents):\n", + " x, = primals\n", + " t, = tangents\n", + " return f(x), np.cos(x) * t\n", + "\n", + "f.defjvp(f_jvp)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "fxhlECvW7Krj", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "3dc9640f-ae25-458d-854b-e60330a1812d" + }, + "source": [ + "from jax import jvp\n", + "\n", + "print(f(3.))\n", + "\n", + "y, y_dot = jvp(f, (3.,), (1.,))\n", + "print(y)\n", + "print(y_dot)" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.14112\n", + "0.14112\n", + "-0.9899925\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JaoQVRzSQ9Qd", + "colab_type": "text" + }, + "source": [ + "In words, we start with a a primal function `f` that takes inputs of type `a` and produces outputs of type `b`. We associate with it a JVP rule function `f_jvp` that takes a pair of inputs representing the primal inputs of type `a` and the corresponding tangent inputs of type `T a`, and produces a pair of outputs representing the primal outputs of type `b` and tangent outputs of type `T b`. The tangent outputs should be a linear function of the tangent inputs." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1xGky7yMOavq", + "colab_type": "text" + }, + "source": [ + "You can also use `f.defjvp` as a decorator, as in\n", + "\n", + "```python\n", + "@custom_jvp\n", + "def f(x):\n", + " ...\n", + "\n", + "@f.defjvp\n", + "def f_jvp(primals, tangents):\n", + " ...\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e9R-ppvdQIOC", + "colab_type": "text" + }, + "source": [ + "Even though we defined only a JVP rule and no VJP rule, we can use both forward- and reverse-mode differentiation on `f`. JAX will automatically transpose the linear computation on tangent values from our custom JVP rule, computing the VJP as efficiently as if we had written the rule by hand:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hl9Io86pQD6s", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "3d0ce20f-823c-4cca-8f7b-b40cf3f0c3bd" + }, + "source": [ + "from jax import grad\n", + "\n", + "print(grad(f)(3.))\n", + "print(grad(grad(f))(3.))" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "text": [ + "-0.9899925\n", + "-0.14112\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MRlKe5D90svj", + "colab_type": "text" + }, + "source": [ + "For automatic transposition to work, the JVP rule's output tangents must be linear as a function of the input tangents. Otherwise a transposition error is raised." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GRu-0yg96lXE", + "colab_type": "text" + }, + "source": [ + "Multiple arguments work like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JFLXlXuq6pRf", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x, y):\n", + " return x ** 2 * y\n", + "\n", + "@f.defjvp\n", + "def f_jvp(primals, tangents):\n", + " x, y = primals\n", + " x_dot, y_dot = tangents\n", + " primal_out = f(x, y)\n", + " tangent_out = 2 * x * y * x_dot + x ** 2 * y_dot\n", + " return primal_out, tangent_out" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "QpKwA0oA8DfE", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "53871c47-509d-4f4f-cdae-75ffc414467f" + }, + "source": [ + "print(grad(f)(2., 3.))" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "stream", + "text": [ + "12.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kZ0yc-Ihoezk", + "colab_type": "text" + }, + "source": [ + "Calling a `jax.custom_jvp` function with keyword arguments, or writing a `jax.custom_jvp` function definition with default arguments, are both allowed so long as they can be unambiguosly mapped to positional arguments based on the function signature retrieved by the standard library `inspect.signature` mechanism." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3FGwfT67PDs9", + "colab_type": "text" + }, + "source": [ + "When you're not performing differentiation, the function `f` is called just as if it weren't decorated by `jax.custom_jvp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "b-tB3xCHPRFt", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x):\n", + " print('called f!') # a harmless side-effect\n", + " return np.sin(x)\n", + "\n", + "@f.defjvp\n", + "def f_jvp(primals, tangents):\n", + " print('called f_jvp!')\n", + " x, = primals\n", + " t, = tangents\n", + " return f(x), np.cos(x) * t" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "xAlRea95PjA5", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "26fcf10c-22bb-4bae-94a6-be6f22d5ef34" + }, + "source": [ + "from jax import vmap, jit\n", + "\n", + "print(f(3.))" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f!\n", + "0.14112\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dyD2ow4NmpI-", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "outputId": "b88e980a-6fe0-4c17-d76b-e03e4692f16f" + }, + "source": [ + "print(vmap(f)(np.arange(3.)))\n", + "print(jit(f)(3.))" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f!\n", + "[0. 0.841471 0.9092974]\n", + "called f!\n", + "0.14112\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EzB75KZ5Pz7m", + "colab_type": "text" + }, + "source": [ + "The custom JVP rule is invoked during differentiation, whether forward or reverse:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hKF0xyAxPyLZ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "2ec1142f-0273-4c21-9b28-5d4490bcba12" + }, + "source": [ + "y, y_dot = jvp(f, (3.,), (1.,))\n", + "print(y_dot)" + ], + "execution_count": 33, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f_jvp!\n", + "called f!\n", + "-0.9899925\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Z1KaEgA58MEG", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "f231d379-b296-4a36-8fc3-924476c57edb" + }, + "source": [ + "print(grad(f)(3.))" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f_jvp!\n", + "called f!\n", + "-0.9899925\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o8JFxk3lQhOs", + "colab_type": "text" + }, + "source": [ + "Notice that `f_jvp` calls `f` to compute the primal outputs. In the context of higher-order differentiation, each application of a differentiation transform will use the custom JVP rule if and only if the rule calls the original `f` to compute the primal outputs. (This represents a kind of fundamental tradeoff, where we can't make use of intermediate values from the evaluation of `f` in our rule _and also_ have the rule apply in all orders of higher-order differentiation.)" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "B6PLJooTQgVp", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "outputId": "10b1dd9f-f6fa-4774-bb77-7d222a6bc2c4" + }, + "source": [ + "grad(grad(f))(3.)" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f_jvp!\n", + "called f_jvp!\n", + "called f!\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DeviceArray(-0.14112, dtype=float32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 35 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XNxAmFSsaaro", + "colab_type": "text" + }, + "source": [ + "You can use Python control flow with `jax.custom_jvp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kkXlSJL6adU2", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x):\n", + " if x > 0:\n", + " return np.sin(x)\n", + " else:\n", + " return np.cos(x)\n", + "\n", + "@f.defjvp\n", + "def f_jvp(primals, tangents):\n", + " x, = primals\n", + " x_dot, = tangents\n", + " ans = f(x)\n", + " if x > 0:\n", + " return ans, 2 * x_dot\n", + " else:\n", + " return ans, 3 * x_dot" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "QCHmJ56Na2G3", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "13c86bfa-03f7-45db-aefd-2958b2b60578" + }, + "source": [ + "print(grad(f)(1.))\n", + "print(grad(f)(-1.))" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2.0\n", + "3.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9cVdgR7ilt8l", + "colab_type": "text" + }, + "source": [ + "### Use `jax.custom_vjp` to define custom reverse-mode-only rules\n", + "\n", + "While `jax.custom_jvp` suffices for controlling both forward- and, via JAX's automatic transposition, reverse-mode differentiation behavior, in some cases we may want to directly control a VJP rule, for example in the latter two example problems presented above. We can do that with `jax.custom_vjp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zAZk1n3dUw76", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import custom_vjp\n", + "import jax.numpy as np\n", + "\n", + "# f :: a -> b\n", + "@custom_vjp\n", + "def f(x):\n", + " return np.sin(x)\n", + "\n", + "# f_fwd :: a -> (b, c)\n", + "def f_fwd(x):\n", + " return f(x), np.cos(x)\n", + "\n", + "# f_bwd :: (c, CT b) -> CT a\n", + "def f_bwd(cos_x, y_bar):\n", + " return (cos_x * y_bar,)\n", + "\n", + "f.defvjp(f_fwd, f_bwd)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "E8W-H2S0Ngdr", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "d0f25cc0-8454-42a4-b13b-10863beeb6ea" + }, + "source": [ + "from jax import grad\n", + "\n", + "print(f(3.))\n", + "print(grad(f)(3.))" + ], + "execution_count": 39, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.14112\n", + "-0.9899925\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yLING7qEVGGN", + "colab_type": "text" + }, + "source": [ + "In words, we again start with a a primal function `f` that takes inputs of type `a` and produces outputs of type `b`. We associate with it two functions, `f_fwd` and `f_bwd`, which describe how to perform the forward- and backward-passes of reverse-mode autodiff, respectively.\n", + "\n", + "The function `f_fwd` describes the forward pass, not only the primal computation but also what values to save for use on the backward pass. Its input signature is just like that of the primal function `f`, in that it takes a primal input of type `a`. But as output it produces a pair, where the first element is the primal output `b` and the second element is any \"residual\" data of type `c` to be stored for use by the backward pass. (This second output is analogous to [PyTorch's `save_for_backward` mechanism](https://pytorch.org/tutorials/beginner/examples_autograd/two_layer_net_custom_function.html).)\n", + "\n", + "The function `f_bwd` describes the backward pass. It takes two inputs, where the first is the residual data of type `c` produced by `f_fwd` and the second is the output cotangents of type `CT b` corresponding to the output of the primal function. It produces an output of type `CT a` representing the cotangents corresponding to the input of the primal function. In particular, the output of `f_bwd` must be a sequence (e.g. a tuple) of length equal to the number of arguments to the primal function." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d1b5v67Oncfz", + "colab_type": "text" + }, + "source": [ + "So multiple arguments work like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IhMb64gkngAt", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from jax import custom_vjp\n", + "\n", + "@custom_vjp\n", + "def f(x, y):\n", + " return np.sin(x) * y\n", + "\n", + "def f_fwd(x, y):\n", + " return f(x, y), (np.cos(x), np.sin(x), y)\n", + "\n", + "def f_bwd(res, g):\n", + " cos_x, sin_x, y = res\n", + " return (cos_x * g * y, -sin_x * g)\n", + "\n", + "f.defvjp(f_fwd, f_bwd)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "EnRtIhhLnkry", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "b949c30c-62b8-4ed5-ea76-6910aca4da69" + }, + "source": [ + "print(grad(f)(2., 3.))" + ], + "execution_count": 41, + "outputs": [ + { + "output_type": "stream", + "text": [ + "-1.2484405\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GwC26P9kn8qw", + "colab_type": "text" + }, + "source": [ + "Calling a `jax.custom_vjp` function with keyword arguments, or writing a `jax.custom_vjp` function definition with default arguments, are both allowed so long as they can be unambiguosly mapped to positional arguments based on the function signature retrieved by the standard library `inspect.signature` mechanism." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XfH-ae8bYt6-", + "colab_type": "text" + }, + "source": [ + "As with `jax.custom_jvp`, the custom VJP rule comprised by `f_fwd` and `f_bwd` is not invoked if differentiation is not applied. If function is evaluated, or transformed with `jit`, `vmap`, or other non-differentiation transformations, then only `f` is called." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "s-_Dbqi-N5Ij", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_vjp\n", + "def f(x):\n", + " print(\"called f!\")\n", + " return np.sin(x)\n", + "\n", + "def f_fwd(x):\n", + " print(\"called f_fwd!\")\n", + " return f(x), np.cos(x)\n", + "\n", + "def f_bwd(cos_x, y_bar):\n", + " print(\"called f_bwd!\")\n", + " return (cos_x * y_bar,)\n", + "\n", + "f.defvjp(f_fwd, f_bwd)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "r0aZ79OmOAR5", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "0b06b579-ba48-405a-98eb-c54069ac2f59" + }, + "source": [ + "print(f(3.))" + ], + "execution_count": 43, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f!\n", + "0.14112\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7ToB9BYlm6uN", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "outputId": "8413a918-95b3-40ed-9062-202002550af4" + }, + "source": [ + "print(grad(f)(3.))" + ], + "execution_count": 44, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f_fwd!\n", + "called f!\n", + "called f_bwd!\n", + "-0.9899925\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "s1Pn_qCIODcF", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "e9921a2e-4488-4cf9-bb0e-e2f2cae98806" + }, + "source": [ + "from jax import vjp\n", + "\n", + "y, f_vjp = vjp(f, 3.)\n", + "print(y)" + ], + "execution_count": 45, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f_fwd!\n", + "called f!\n", + "0.14112\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dvgQtDHaOHuo", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "cbc26c6f-871a-46fc-a0b5-2c855b236f4b" + }, + "source": [ + "print(f_vjp(1.))" + ], + "execution_count": 46, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f_bwd!\n", + "(DeviceArray(-0.9899925, dtype=float32),)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qFIIpkFcZCNP", + "colab_type": "text" + }, + "source": [ + "**Forward-mode autodiff cannot be used on the `jax.custom_vjp` function** and will raise an error:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3RGQRbI_OSEX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "2c4a7602-566b-4bb0-a591-5f2568a5427e" + }, + "source": [ + "from jax import jvp\n", + "\n", + "try:\n", + " jvp(f, (3.,), (1.,))\n", + "except TypeError as e:\n", + " print('ERROR! {}'.format(e))" + ], + "execution_count": 47, + "outputs": [ + { + "output_type": "stream", + "text": [ + "called f_fwd!\n", + "called f!\n", + "ERROR! can't apply forward-mode autodiff (jvp) to a custom_vjp function.\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "u04I9j2dntAU", + "colab_type": "text" + }, + "source": [ + "If you want to use both forward- and reverse-mode, use `jax.custom_jvp` instead." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YN97y7LEZbWV", + "colab_type": "text" + }, + "source": [ + "We can use `jax.custom_vjp` together with `pdb` to insert a debugger trace in the backward pass:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-DvRKsHPZk_g", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import pdb\n", + "\n", + "@custom_vjp\n", + "def debug(x):\n", + " return x # acts like identity\n", + "\n", + "def debug_fwd(x):\n", + " return x, x\n", + "\n", + "def debug_bwd(x, g):\n", + " import pdb; pdb.set_trace()\n", + " return g\n", + "\n", + "debug.defvjp(debug_fwd, debug_bwd)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "49GdkP4pZ2IV", + "colab_type": "code", + "colab": {} + }, + "source": [ + "def foo(x):\n", + " y = x ** 2\n", + " y = debug(y) # insert pdb in corresponding backward pass step\n", + " return np.sin(y)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sGLnRcPwaKoX", + "colab_type": "text" + }, + "source": [ + "```python\n", + "jax.grad(foo)(3.)\n", + "\n", + "> (12)debug_bwd()\n", + "-> return g\n", + "(Pdb) p x\n", + "DeviceArray(9., dtype=float32)\n", + "(Pdb) p g\n", + "DeviceArray(-0.91113025, dtype=float32)\n", + "(Pdb) q\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DaTfAJLAl1Lb", + "colab_type": "text" + }, + "source": [ + "## More features and details\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LQF_UDApl_UV", + "colab_type": "text" + }, + "source": [ + "### Working with `list` / `tuple` / `dict` containers (and other pytrees)\n", + "\n", + "You should expect standard Python containers like lists, tuples, namedtuples, and dicts to just work, along with nested versions of those. In general, any [pytrees](https://github.com/google/jax/blob/master/docs/notebooks/JAX_pytrees.ipynb) are permissible, so long as their structures are consistent according to the type constraints. \n", + "\n", + "Here's a contrived example with `jax.custom_jvp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6sDLZ3dAn3P2", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from collections import namedtuple\n", + "Point = namedtuple(\"Point\", [\"x\", \"y\"])\n", + "\n", + "@custom_jvp\n", + "def f(pt):\n", + " x, y = pt.x, pt.y\n", + " return {'a': x ** 2,\n", + " 'b': (np.sin(x), np.cos(y))}\n", + "\n", + "@f.defjvp\n", + "def f_jvp(primals, tangents):\n", + " pt, = primals\n", + " pt_dot, = tangents\n", + " ans = f(pt)\n", + " ans_dot = {'a': 2 * pt.x * pt_dot.x,\n", + " 'b': (np.cos(pt.x) * pt_dot.x, -np.sin(pt.y) * pt_dot.y)}\n", + " return ans, ans_dot\n", + "\n", + "def fun(pt):\n", + " dct = f(pt)\n", + " return dct['a'] + dct['b'][0]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "My8pbOlPppJj", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "2ef4c080-7ecb-425f-dbf9-8e2807529365" + }, + "source": [ + "pt = Point(1., 2.)\n", + "\n", + "print(f(pt))" + ], + "execution_count": 51, + "outputs": [ + { + "output_type": "stream", + "text": [ + "{'a': 1.0, 'b': (DeviceArray(0.841471, dtype=float32), DeviceArray(-0.4161468, dtype=float32))}\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "a9qyiCAhqLd3", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "36dfdb67-f5ca-4833-e37e-4e2488b96c0d" + }, + "source": [ + "print(grad(fun)(pt))" + ], + "execution_count": 52, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Point(x=DeviceArray(2.5403023, dtype=float32), y=array(0.))\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BWLN9tu4qWQd", + "colab_type": "text" + }, + "source": [ + "And an analogous contrived example with `jax.custom_vjp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QkdbwGkJqS3J", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_vjp\n", + "def f(pt):\n", + " x, y = pt.x, pt.y\n", + " return {'a': x ** 2,\n", + " 'b': (np.sin(x), np.cos(y))}\n", + "\n", + "def f_fwd(pt):\n", + " return f(pt), pt\n", + "\n", + "def f_bwd(pt, g):\n", + " a_bar, (b0_bar, b1_bar) = g['a'], g['b']\n", + " x_bar = 2 * pt.x * a_bar + np.cos(pt.x) * b0_bar\n", + " y_bar = -np.sin(pt.y) * b1_bar\n", + " return (Point(x_bar, y_bar),)\n", + "\n", + "f.defvjp(f_fwd, f_bwd)\n", + "\n", + "def fun(pt):\n", + " dct = f(pt)\n", + " return dct['a'] + dct['b'][0]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "3onW7t6nrJ4E", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "ad13ae57-72e4-4b90-ac25-d4d6aa0f8161" + }, + "source": [ + "pt = Point(1., 2.)\n", + "\n", + "print(f(pt))" + ], + "execution_count": 54, + "outputs": [ + { + "output_type": "stream", + "text": [ + "{'a': 1.0, 'b': (DeviceArray(0.841471, dtype=float32), DeviceArray(-0.4161468, dtype=float32))}\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ryyeKIXtrNpd", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "4ce36200-6e27-4ba5-912a-8e86e7500bd0" + }, + "source": [ + "print(grad(fun)(pt))" + ], + "execution_count": 55, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Point(x=DeviceArray(2.5403023, dtype=float32), y=DeviceArray(-0., dtype=float32))\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JKTNivxbmKWO", + "colab_type": "text" + }, + "source": [ + "### Handling non-differentiable arguments" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7g9sXSp_uc36", + "colab_type": "text" + }, + "source": [ + "Some use cases, like the final example problem, call for non-differentiable arguments to be passed to functions with custom differentiation rules, and for those arguments to also be passed to the rules themselves. In the case of `fixed_point`, the function argument `f` was such a non-differentiable argument. A similar situation arises with `jax.experimental.odeint`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9yNIOzyBCvE5", + "colab_type": "text" + }, + "source": [ + "#### `jax.custom_jvp` with `nondiff_argnums`\n", + "\n", + "Use the optional `nondiff_argnums` parameter to `jax.custom_jvp` to indicate arguments like these. Here's an example with `jax.custom_jvp`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "b3YMxxTBvy0I", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from functools import partial\n", + "\n", + "@partial(custom_jvp, nondiff_argnums=(0,))\n", + "def app(f, x):\n", + " return f(x)\n", + "\n", + "@app.defjvp\n", + "def app_jvp(f, primals, tangents):\n", + " x, = primals\n", + " x_dot, = tangents\n", + " return f(x), 2. * x_dot" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5W-yEw9IB34S", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "d6bea705-49c9-4821-e1d5-f0a6e431130f" + }, + "source": [ + "print(app(lambda x: x ** 3, 3.))" + ], + "execution_count": 57, + "outputs": [ + { + "output_type": "stream", + "text": [ + "27.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zbVIlOmqB7_O", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "d690ebab-e3b9-4836-adf8-2be0a743a5d6" + }, + "source": [ + "print(grad(app, 1)(lambda x: x ** 3, 3.))" + ], + "execution_count": 58, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-b_B_4WaBI2D", + "colab_type": "text" + }, + "source": [ + "Notice the gotcha here: no matter where in the argument list these parameters appear, they're placed at the *start* of the signature of the corresponding JVP rule. Here's another example:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9hokWmyHBgKK", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@partial(custom_jvp, nondiff_argnums=(0, 2))\n", + "def app2(f, x, g):\n", + " return f(g((x)))\n", + "\n", + "@app2.defjvp\n", + "def app2_jvp(f, g, primals, tangents):\n", + " x, = primals\n", + " x_dot, = tangents\n", + " return f(g(x)), 3. * x_dot" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "J7GsvJTgCfS0", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "76b6754c-9465-493a-b191-492915c0614c" + }, + "source": [ + "print(app2(lambda x: x ** 3, 3., lambda y: 5 * y))" + ], + "execution_count": 60, + "outputs": [ + { + "output_type": "stream", + "text": [ + "3375.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kPP8Jt1CCb1X", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "152e181f-6ede-4fc6-9dbe-10bdc6483d64" + }, + "source": [ + "print(grad(app2, 1)(lambda x: x ** 3, 3., lambda y: 5 * y))" + ], + "execution_count": 61, + "outputs": [ + { + "output_type": "stream", + "text": [ + "3.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ECbalHIkC4ts", + "colab_type": "text" + }, + "source": [ + "#### `jax.custom_vjp` with `nondiff_argnums`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0u0jn4aWC8k1", + "colab_type": "text" + }, + "source": [ + "A similar option exists for `jax.custom_vjp`, and similarly the convention is that the non-differentiable arguments are passed as the first arguments to the rules, no matter where they appear in the original function's signature. Here's an example:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "yCdu-_9GClWs", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@partial(custom_vjp, nondiff_argnums=(0,))\n", + "def app(f, x):\n", + " return f(x)\n", + "\n", + "def app_fwd(f, x):\n", + " return f(x), x\n", + "\n", + "def app_bwd(f, x, g):\n", + " return (5 * g,)\n", + "\n", + "app.defvjp(app_fwd, app_bwd)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "qSgcWa1eDj4r", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "28289e33-a96e-4f2d-e8c3-479232dfb36d" + }, + "source": [ + "print(app(lambda x: x ** 2, 4.))" + ], + "execution_count": 63, + "outputs": [ + { + "output_type": "stream", + "text": [ + "16.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "tccagflcDmaz", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "12eae540-65a9-4c17-ea82-e0965fae924e" + }, + "source": [ + "print(grad(app, 1)(lambda x: x ** 2, 4.))" + ], + "execution_count": 64, + "outputs": [ + { + "output_type": "stream", + "text": [ + "5.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BTEnNTk5D0sM", + "colab_type": "text" + }, + "source": [ + "See `fixed_point` above for another usage example." + ] + } + ] +} \ No newline at end of file diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 924dffe8425c..59b46bb48273 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -981,7 +981,7 @@ " * Why is JAX using ConcreteArray in square_add_prim? There is no abstract evaluation going on here.\n", " * Not sure how to explain that multiply_add_prim is invoked with ConcreteValue, yet\n", " we do not call the multiply_add_abstract_eval.\n", - " * I think it would be useful to show the JAXPR here\n", + " * I think it would be useful to show the jaxpr here\n", " " ] }, @@ -1503,7 +1503,7 @@ " File \"/usr/local/lib/python3.6/dist-packages/jax/api.py\", line 611, in batched_fun\n", " lambda: _flatten_axes(out_tree(), out_axes))\n", " File \"/usr/local/lib/python3.6/dist-packages/jax/interpreters/batching.py\", line 41, in batch\n", - " out_vals, out_dims = batch_fun(fun, in_vals, in_dims)\n", + " out_vals, out_dims = batch2(fun, in_vals, in_dims)\n", "NotImplementedError: Batching rule for 'multiply_add' not implemented\n" ], "name": "stderr" diff --git a/examples/control_test.py b/examples/control_test.py index 3c1272876503..b172b2752be5 100644 --- a/examples/control_test.py +++ b/examples/control_test.py @@ -215,8 +215,8 @@ def testMpcWithLqrProblem(self): self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + @jtu.skip_on_devices("cpu") # TODO(mattjj,froystig): only fails on travis? def testMpcWithLqrProblemSpecifiedGenerally(self): - raise SkipTest # TODO(froystig) randn = onp.random.RandomState(0).randn dim, T, num_iters = 2, 10, 3 p = one_step_control(dim, T) @@ -229,6 +229,7 @@ def testMpcWithLqrProblemSpecifiedGenerally(self): self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) + @jtu.skip_on_devices("cpu") # TODO(mattjj,froystig): only fails on travis? def testMpcWithNonlinearProblem(self): def cost(t, x, u): return (x[0] ** 2. + 1e-3 * u[0] ** 2.) / (t + 1.) diff --git a/images/custom_jvp_schematic.png b/images/custom_jvp_schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..a06f0800ed8803387e46d19dac6cf6c883cd2291 GIT binary patch literal 182949 zcmeFZWmFtnw>1m|f@^T6aS!h9?ry=|9fBozB2c9oF!4{z5W*YCUAZYML` zUo?LI$RdF9DEC#jMJq=Zt)^1J#UmXf%t{&o2)#x40OR-*snX|TTM7vg5nTS&#w-14 zwS+yLj$w+S$mFZe^gD#zk5CD^k+X1afh+@$P+x)f>UyM5lFp?qxtX+DTjv-=!yi6j zD1dl1Vu2uDqgX~wZbVn&NN*_7;&Y#RMX1KC{9MrFWT@Z@4}}*9VE_xtV;BSeOiB=X z022fK`*=>}z!Vy9VbDme>@KsY$cz6@@eE`SjlPM=q!HkYA6kiO5l7EZF2kLi(Os_o#u~RG0@7cT)9{;{~ z;zXMin}h{9F7`>SvNsY!Oz#OB`w>htGiQ5h2wFZ@lKQ;=jebwTGclkPj4TWzZMGfq zz8QYbjWdI>;x+M+jO*i~XDrDe=#%+gy#&RnZ*W&k@RNPA}>);lj=&vYgLqr=w~zJISf<2(37gX z(^!^kv(K?FIkLVs%&ir@4}i`7K4Z)7T1*!|7;X|s0c6}nC+Tx@_jHF7y%zz$D0Z2a zzmQ@4YIAP)O@+EsIXXHLxKqOOMGWqWfXZKgDQ-9o&im{Rm900fGkh`6Z|F+_#V{4( zoWk}Ve&H+h!uDIi5HbXqf)Ch{(1_%4ilIihz1K`{Gh3{o^LCS_t`^x14U!99~2IKMBJ0DLB14~>6Ka$NXWC<`4NwgIUOI{$0jTKQy zZYxUz5W^luu^?3sXOdw^jFn}+5O9Oy3(uBXNiZ0GQ~1s|_Me z4OM2avM9$iy$ywa42v}56rl(FN-(L!WosA8X{IATF|ZCGud3s$!hNvO9ZAW^Q7)~~mPEi7FsTiH<3P~nG^ zpu7X6FyJOZmdZSd<9i;q#8%>kEOjAQAxR-+;bK%X^pRd6E z`+N3#`nEK%LS50Fx)~kJ2n>gRU4~s!eyi6LheETo2df7WhsamJYn}tL#h`(&_zNg#pC{9Y zmd1F$@4qJ}Tq1Hotw$L_@gi&_^dLGUihHlf&h);LUC?4_Vj$g1k%c3oEwnAdH|O3q zVVV4fd^11n^C7$u>D9VTty)6jROy^e+BDY}m2XVjs@o3RmfvE(-731gqfKU`(NJ2* z$mTpCba=ny{65I#;HS`M=PYosagc!Vdavp(#WZJ_YFN9krkWi&GS(Y8`mfw{<#ZXAc zK=X(Yji5*4Len9Mid&Ccj47G5Rp_D3U0+B%E5O z43}8$Sv*c&~QfXPK7ur=ki79amID*vB1NEeiBsN5m5vb9VaP+4Ioy zbQ^$HwY=N?(;ppfX>N5Wvtez~^&*pde{Y2NVav8FtcL6UJIy&v8f$=mCh?hy*c zNx-e8$QPPoPr%cCclUmnUlya0dY^tZF=ueSH;~|%kO_I6>?wD9G~+uT;is_Bh?MZg z@WTk2aP9DQ^ai9+lnUe{v|EHc(m>8n7?=cgOj~akV@CHD+&W}@V>9^G`N1r{WxnSa4p#; zI8WYc8R}6$P}WUyp`E5sOI%7SOy(3W<30#*lfAguxvA^_HbLw!JV+&#J(D6YuOz>g zw8FvS@uS?8WLxN4T1<~{Z=iT@Xu~@tnqP{7oO0G!&NJ(r;`(kYH;t2>_{OL;v^iPE zIqTzlXF8WA2%lgX;c~=-Hr+O7QC?$q2`1T}Idm+%qG6FFF|98&nRkF&%UxkQK=h4IOeUpPmk%QAd7rj3Ji%wqBf zFLDM*xWcme`gm)Z#Jz9NAxj}AOXzkIun69ja^9n!v}fUF%++|>PdhU?ly6k9pyv7Y zIBwDdWkPN|)jk!lnHgrH09Uj(VmLZ7D$KgY%71%wX2KYFVvt?e>KV0{2 zifq{I*tUMrw;Qh=V?14()Ku@WyQ-C}ox@C~)*Z;@*<|MFFQq9pOPIx_u=ueWTg$it zsd`1rQNOG9;aR_TW%TIN!h8*nfl2er?A!D3ETVoM?zyG;6lZ|b$i|h0`^>M|9^Y5( zjzJ5BOj>SPp++X28QR z!7B&+0YUK30R{dJ-b0Mb72S)#b^M;?2d{zE)ZC@q$5XeB>u%QP4^O76GN7E=pnGfNg9M;AzGC@4W6e#ow) zrH3iGkE4T=JHL+*;I9(=ko`Z0SpnpK74fha0_ZBKl1n(dS(0?5ynU%#aey?!HbQrasJ0 z?v(%4$p2|a($d}B&DO=k*4c^tPrIgO&Ym7Z0KlIM{olX;x=%|V+y8eZC-?vTSda%~ z{d0zujpaS-|7{ymRq)SIepOo^O9x#^TSrSLcgQt_*|_<*1^=q>k5m8elK-u$-v6u0 z#l!jEYyP)0|GTCj>z^n1Z%_1J-SyW|NPh_<39|m*z86Nid89Le33iw9p=y2 zKt_%X@}jv@i~R5(5o?ZjTuyb^<)pMtvKlre{-qd9g%6EY z*5SHgePTR7^HvFK+Y0Kw+UyPaRM+jwq;Z#Dz|ph#Y^lBr2lTu5|8Wa>i)m92HBX)- z9D|r1{GT>ast?d3Z+c-Bzy7B!zW|m=lnc8A-3o^0!++eMN6i0Yi;x2UHu`U${yU}q zT~YrUl>g8J|Ju`k;p9K|z`tnvFPi>~rvIYpf4~xm^ZqZK{6}N@|EK8W!w4om394yh zxeRsa;jqom*ZT!cl!B!n*mvu5DX*ggB08fKn&FpCBY9qEtf9D5BfOCU!@lG&2%t`Sjhczs}=U* zQS2+XFMpOCF*HR+P586kGUW_yDE+OMf67r}oG?0UW;@~$P-Ru8FT45ry91<&Bj9g{ zz4X_Mx9^wQmI{_^()|VDJ1&~{4xFWgYV!BaALm+ZW`8}F?Cm-##rYe|+SlQYN-TR0 zzPQLflXkGL-20(=nSX6wXz{lr##`;oHZrf5Ik4__?X+24Jl3cd%H^?c*vp%2(%vkw z-&wlf?(LGh&5vBG&YN`ypHz1L@MGDV+W;=z`waxd`0aI^?7YPP37i#4U~uz`C%W8J zAP-^(tD6${gBbPmqICcG`m`$P)ClXMzBPB)#9-JI`+v7YHakn1<6`PFoi`2;|Ay zRbTu5&JpBdz);qo)}GXojq+*$NXsb9J|s7Pug;{&s&4Cwqev4n^2%_KTDBv$7WE>8 zk#q3V(-0dP+_tpF%#VIt%sM5pI9Kl8=MD}}2os747-!p* z{fy`(Tyrwz>LN^n8$rbX>dDsT8}%G|+>WtR8^O2eu{^+W_0hqW=MMqnlZ~Jo?3ew! zxMmO*(gRFMUsT<_I1L5!r3!KV@43y@G<0jFfGuHIVN}HPz%5gXQSkXpqTT+w9^xA; zwXMDuuht1_CDR+ixc%#qP`$h7 zcLbYhar|Bz@HbBv#ep^={hwyphQivYIx5=z!7m~n&;2l(a(f?o*C?EF6g*EVt^(x5 zkX;Da@LAaLzxijZO^J6ucFA}C+8-|(6sijFLU3Qi1Ms{|Uiyg)Pi$;_8ElKe(r=LD zlkC=G9M~-bPozcJXU9LLq9h$Jzu5hQ9}52IdM-+h#QnMcBz@(i>V>Wik7eVcs@B^o>Bsa8AUBEg=YZH)zw-~&D|fts7m=9K^+l`g z7Ca+-SOR|Q-^{QbTAR}?C5N6>lZ9fs;zT)pm?izM%d6i#3a)&42xwop(mz&lFo^^9 z?<-y>3&9Og9M7JA!UN32B5%t& z*)v1$w@97%e(Abn;T#fKe}3bASkaROVdB1O0zN?7F|0A)&ciB_V|~~hg=vy8o9aE) z?%Unw+ARGB&t`s)tPf@HN*G2FrTVU^6@UKI-BnG+=2<)gn;AWlY7;H%vKoTD$vj&l zhGa1RtrIozy{R4`5w~CG9BMR|*V|D;x3vsoFc;d_&M0lkog`5T*>NHZJKefj&GEpu-|ICD!igL?^rn*ixE>YuxTq1Nc#7C-e{>f9{N8v|Cj~>t~ zAg>gYPYN5?O!xNpw2Rml`Vdt#Fzg~?hGw6fttjLnl5XIWZ#eFHgAP}iCF`LeQKL(0 zYq*S2ciq(bD=TQ~IgmO=_6*PjjXLdga3gM`HGmgBcKthMG+6NHERs?``Wt{OzP4G} zH{d%_+>!nT(-^g6l&{>|l&pVHmtXOrVPhMd((F!{Q9=R zBwauojsGrd!0lsYcydp|zPoJmm*eKmOsIK=ESGkN$)ZWTzD(8>GgvI~nKB;6&96b4 zX4vR^jNgSFQey>7Zq8=*kk0YfP8BQ?eL`EcdT%t#MQ7?~(FbUp&<$|TF9`1a^#D#vXzH;)YoI_j=n8> zTT~n_>F`w_djN*OLgm8L{x1vmp7;*y=|vJl16Fx0%FhNH*uO@iu=mD3QkEags4btn zMGIXTa~Vztu47ZJhLxpyi40#2*%yBts8T{5J|JZPH9Xqe7qOeeH}E5Q3Pxq z2*RY0*4a{w*k9Ca-!h5rF(BD>28*`?#-G=>~_xvPs}o?RPmX$iG`0|r0rO0E0m>8^xq;sR%|Z5RuC&c zsT;dU8qUL(Di@*Ywi^Mx38?TyFjx`YBntUTpM`=@0>gRsvU>{XD_>G@f2>BU8A`Zp zJL5As{gc<`B^pV*7ug&P9T4pQ!koKxMPuPK-lhsQ7KipVl46Vqf$OrlMUe%6`bOxX;cIhhT1R|aMq%x}6L#l@N{YCC-$ zw#|S5C%et)A;M{~&ku1npYbI))iM@$agUioqi_#ZJ!Ukp!WROn@$I=2OETXQ9hy@V z*9D8*Tt*9arCjPGJK;Vv`S86B_$q+*25zzjN%2}1*(|qzBT8QXB4&V!;GF_a9hd+0 z3GmSm2K%~N*TwxQ>*6C(Y8u|6_$!TFcKi@0qB2L?@CUzcd^m1E!C8`d!RbE(&jds! zUX9#Dk`5EVC|r@(7it6N0ziKAlM~yD>zo0h$q+&os1lzxNDH;&rI>hv(fk`m27{f~ zk)Y+hZdoNj;aV54isJ78fM!54t~YWe&ZZH__6U{~;VKh|lv+yXr7*LmF-Q(<9$v=G z!W%=QaZq5h3W9-cEB z*jpRgR8LG}OHAb7QMz5Y560}Gac;QmOea;Lzn4|&k!!w+HLv}~YD~} zq7;~XoN+w0ymiyD5J3ZE>c@lpYWg0{cD*A2g3}s0MO%tI=kbTf;+kP1B{fYWeT)(h zD5j;yNk-KEy6M{6ywS~Jm2%f!g&mEtZDv>Gx^kuK(z7uJY>xQK`WZsBePW5|Y;Zh1 zh!lB`g#Z?q=Y*6Ms6y(Y54C3?1RZ@Oy|a~Fc+!6qH;2Hq^@XA!FbT;;(iTTnEMWrA zq{Kh$XVZPf1-rjKSF0x8q0^xIWx&Pc->uFW@4K&7l+4e3MQN+|Ep8)o-mob+1A>;2K1AntrT!Rf3;?|%);QK8JqxrEL zE!%jpk}emw$bE=rsCaOKD0NMS--nnr`77uFD~xKM^N83%~u&%q1an0x=_SM9xh(b(MLsjcPmR7AHLymesAY?slWfZojZp}`CxtX=Sq{VC0vRb#30*>NO%@xN3#NM@gUZQULIm?u)AD; zH$(h_P~5Ou4gbi-H!?wLvBnxMz3!2nqds&eciZYrnuK3$>{bww1xRTdmjX?IC&(k- z0UF3#RG-F-ic0gU^v~$GtOseM)oM3euVLw4zF{>ggc)1cXkLL1@yFNlHQ^8607prS z`Y4UaZTBBo4u32^@UWDcQzbn}<(;!^PsfQ;u|+#x7tT?-+1)c{P>5CAP5?2#w(Zk4fn`w> z1_Z%%#d4MUrJX-kUk&J)-X(v8^wT*p?mE-)xm_0Xn@GW(Sv;HbO80u*5@8&`*8Lm) zJUi?8+JVKyciF=gyR3B2d4emywFP-LXkQ)v?s>;^Kp*SDW+3}Bn%-`V(rerR%6`gN zpwC#*1w5EZAyAlAKB4G|)#?tdpi0pj@vBEQ|LP^PXy&}pjj>7UYCe1ymW~>l**^#W z&D0eD9Zf0SD`jQYVBGSdLXtJ7L1NE&+cUbJFe%?%-*z*8^yS+@a%BFT4>R{U3SaO< z$~GmpxuR#uwy8p%mY)E)^C3kU-GHB~J~g5KciU?PpF`Ss9xUOpB{8x0^NH-zEAzZ> z>Kb1@6E&y9{=K}t%*ria1qZEi=~pZn#Tg{hAftmLkS!eTw1s~%j>U=ffZ8MSoT)N_ z_93EbHluOc1G>uZL9keCcuwn zD8NR9;y^XIL0wxPAnNG$(Y}hN#9>gHd1=rU?yS8YoqC5&m-;I6+|e&5x*yTqWwfG2 zgS%MF40R|S-)t6o%Q9V^^K^kXF-9|Js8&Bn5|>Yz<277 z%@A-~U)QscB(W8kRSi+67^$5w0lJf9h>cBldW@-A8<>nCOoeUq#XQqR`@OjWv^NV9}g&!fRcE&Aw496KU7ldc3aZu4D`o7tWrptSN z&6LvL^hsC0IOl&D_#8tt>P2_`2&5KDxu~HLC3&m^WCT*JYI|{VC10Xu-3^L3qfLHS z!&=RHHD66Sbea@N?H4PeA)daMv3S*>ZKImD3md4joa8C9(qi+dnhPsCCwz$fyi?s% z71}Q{cNE#0M51J$*3~T@2Oc$#JupkBq=@pOg^uo_q*B65_C3n%%bc{!6ScjzVp@3l zbVEH1>!x@6GsTWRZxv)jWcx5<{I+HY(c{wjdt55>T2m(mNA#KhU(`Xm9YjQ-)Fklh zB{LZD2OxL|uk6hP9ZYoRywGFHsvdBZ%B*(EfD!r)gCOg7W8BS=mS>j->z)S&gM%ESTlMoj(1}0{E(N%&k->!m zKeMMlD?hjUkiX0K^Z2d6o*u60k^0RnC$fr*emR`geOp#zc7B=glJi2J$pi@s?vpjxQeS)aRgW@u-Ji#iccJ8=0rJnk(7UUSDL0sgD#>{)FR4q$ zQc?rIWK-1@Su?3$rG#=Et4ns;=fxXx4GG+zY}Q`8!% zWj>1)_3wpz9pIBY7dBBY<_$;!2sf|TKeX>Yl?ju+h*AI0oWrKSw<&}*Y&PnfcV9X# z+AkbAJ*5#H^c&$dchV3l*+Vi-g{?`+fTLA=nD^G^zU!EG5jE30H7)AbAxlP(>e|=B z!bp?5(|^it`1JM1IK;)W!>Wbi;yTUpcZ8uypqyfkuUbQ@6Zvxbd{HWI3vb0TCYia5 zWv#7H*ozGGy0+jdE)^&nE;H{@ec(Y<=ai&E3Uj(cWuAF$)DusVq`FF7X>ZJhny(&Y znU>1h(UZ<>H$YzYnZu}-J8lQpKA?A(z|_4OM`6k}i3~bNTG)%^gk4TOY^<}d^*YzUA34kKR{m_`T;!aZPpwWN=BKe+u^Ln}%_nwae0<`(CC|5;s8D!LZO)hH344d zOH&2&lHZTb4hN^Q<0D+Kbn3sIAD@|k2wWfy2?y~faVo-2ZB&W+BF5-&aJWXqOrMT) zy&}bT(qFHI)Pi*W&!ONX*=Z5oce@z*E>DIusf@yjMR$9G-tY3Q=&PQjPnatcA|**m zGzAzoWG4KT^~8q9#D!Ril{FTU2`-!R>WptCKCRo$m;BarwD>P$6#d5-4R-tzhOkpV zq=WgzWrFBxSee@qM^&zYvTvr!IGq@^7!M9MSpUqUn(PUgzyx3aoU}Bxi<`sr9GpkP zFCK4Hp1tU$k85pIs&b*ire>&Jfmgnfs?(PYU9uZBIn!W0m^o-zI_6Bhv%OWCqV-kq z)I$bRMP6G>LSfyvPx!8md4T)}s%i+~m>$0Q-WlX(VK3JHGAbW?Teb>EC)fjS$-rG> zYLpX@tthW&qDRCid<)ug79FB`CIz0@U*z_i|JIKWEa}-bz|McMmTRkV7Euv`wrkgA zQH3R3*SGIcMQYIA2sAoa%6?3mkQv);QTQF28?6S-EcCyV5TwSx#E#6>Ny1D!EL$K*@RH>|X>lEEHmcMd@1^M$dWair+_WbekYa?7oDofwu#IP6G zYHn$3G)8e4=-!-JE_b^vQ2`P5+Q^|#qb2LvYs!{S$h3k#4aPZRTh7W4YYb?~9iTef zU#b20E?F0u`CUb$=8dHrBB?)Xk;>K-mv zjdWwepv#945;CkHj9^`xTa$!VYFuoaL0vi1*8~1v^e~4YIRw?YK>Zg78qq{j43&l` zLUG-m0oKm3^;Z#)i`-keZf2e8lPZ&B=)$MPLNi&<&Wp+Of5v5!SfvoZ&7Vs28Amw- zqzfP2F4M>&H7?nq=rv!TCa(tDD=c)bFt4V~?>93yUCXLapQj@yyYdpt^hTgV;YplW;=UF2S>xC9P2;CzWFtre;l~n&qkdG{^s=I-6AoYGo9lz z>T>^65R~<}{>r0Abv!^cQ8+NfVJYoJd;+`@4@n*lS9>^g-!dR09$-Y79f9t+bVvQL zj(ol^gBG0=B^-rHCZ6h^8vgLFf`3eeP_*}806X-%bZltBRtz=evPcGFwXO?&aZ%F{ znP;%2z60gO7ziG#tw5!#4DNX2tkX_$F|F@4t-N*b8*4f5zP4{fS*^{*jeJg<3Cx_= zd=|i&>i|_f`m@JGJcDRme$OO2X#{>V=^7z-}c8tl| zR$Ud6(tx~5sIY>DLvyVBfxv0B-3#MVA~rD~J&dJhwyN;y?M{gI!Tt%1=GE6nN0Mz@ z$x1f#PDHd_lZ?N~V815Ih|(FB^1=c^SYbW4KH7Ej7X1+Q;+0i3O?5%4d zdGI;s`e>kKxV=bRHlstdVEh|u$M&{>Ye@3zkfeh)v`SY zJ)CBPd)}r%ONnC#0lDi2iqqSTZ(N>8rp;UOXcmGq6_JDoXzUD_)v=e6gQ`95A;VAX ze9NU|V#Y~et1+_**uxo81ZLm6-*eY~n(3PTx~k0Vp;@~%y5svfCD zPwpsjkBXLB&ee31aq`V}l66tO+n4KXPe`zL&1DNMFFlbNZ;h#noJT*nU$p9^eQ>7#%ZJxu=Ry+PSRzba|}WPJ2Y?5Jw|o zKf`(WY__J(UT)c2Ong4yj&hox$|GU^^VKy`V8y-m^UiUNH(owB-S|es23TIT@%x{ol^xT&Hzv&%=kjo+n3>w2b`&e4XnVM}+h z@_)~W@-IGCZrxLKEDUUha8aryP$gE&+ z1%@*STt+TR@$EWCV<6d1IY-sl83hPkbYi}ld!d`GPeBN1u!tEJh;0n28tICC&qWnd zZry{DYRF83uc#la4m&3=C7LMiJRO$=$fxnTt%m}UnZ7LlJs(V?5?o2X2+}{j5|FRD ztpT~HHRXUCr~$xZk>h$2`6?Nq!sm^VZ0^V1{PdaWNuxDv?atsg1&2}xV%QqpYs@f* zYLE!|&UMRr*G1j-Eo+{3&SpbKEobH2)qAnb{ukOok{g%DY?}EX>CmKidt&p!{1nrS zY0=L0Fq$4WDF{-qbHG;#`a8}31Lc!?@S>TL{aOd9o&Hhx6qBeW@e?HP_Tlgy#7VwB zEvWe;@Q}{eDY$0(F`P5j=lE0qCIW3&sn~c1WjD>~!~tosU4oY~k>NR@Jv5yKk;>kf zIb5m7Kt$h~0YSA8eScjmYTbDVGv8}bd#Rp`j&~Itc7uYbOyZ}QoJO=!GC2uL7n67- zZ|QTzb)Jj>a)zuIr}^Ndf_L_!%+p98KZR3B2r;Oiojg6Fm;5v+Hfu9@Q4o`I0ey0= z(>PNKp6Y>^-2Xo3efkg+%0p`c?4CC%q^~WY)!XhBkdDztz|+X(DlKknCFrs zkGA!%0#^a;V4%ylY+;p~^S36Yo^d;5bw*MV5f)Qgd$te+*-}~KY_T~1}3@GA1*Ec~>LvQ45y@QNKOfY|g#=$`f zm?cVu8j*w1gg(?!9$CcMoML5cTVqoR4!XSPi(FHI*6G2V&C;zi$YmcMq?-C(Cev4v zJDW|1frQjE+?wetMFTy*Elrk>uK0XN5Pih9NKL44QLjSZybNakl3F^g|J||(1&qAn zE`otwj!)j^){7nQSrul{PYs%6ck@1-j{1}_brGHY>#V?5tvhOUZM@y<8$^s?dZ`Sl?Q3%DT zJs<*hB|lq!lbcG62hSdsXOOQ72MP`pYU)23m(*y`~<}nGB zT8=F0a<%01cwY<;vR|D39_PhVhA5Q3`FJNXqBhp*W4KIXaXSM}r+7qR`&CZN6=63m z#Ox+pC_M*B()D{qQS+in3zS>YTGiwda^;ueeLQfXHslRfs%V$5i6;O`Eq9-|ajrdF zn=Re#nqlWTxeJ2sSA$GBJ70MyH_vVv3QQ6;UNaErTF13Cd6u8pPh#IL$rNUv8qS*i)jcc`m-;^H7MxM4b;G5& zW`z`@p@4f1lO66IQB^S7Tqk=BLl$tn50-T_ZU;J(MEYyFORl#&z2uYP1F|ZIt zm&w)n=rpZQyvWTaQA~B}^b&RYXh}uWMGMZ|A1#JJ7CWp+8)wh|r6s!K70R zss`bgn#W?_@lNLkv=FYpcDU`YYsBuwfRl0;irPmM@)9-nfLL|H!rBbM{38;JIBUf* zEXP3~C}&%TcpaM=uwo)B{2mFH8~%*mS6EVFXk=CNxTZ-97@D(SgzVW*?k%`3l9yLT zGvLZ!Vgm=sco@j1R#Dj4WJZsCzW&cGzov?=JiM`(i=&~gD_%Q@*L8%bs}td?wBWRL z0u+%=<}LIKrOu9<2ASZSUWCDdKbe|U=-rMhVM{OJcX7O{Z^XNBt=M4fuppK@WVf?P z$+X`YyB{EB>`4~@Ws8ZCB#SN<=LRT^dy?II5)DWgT6SSJV=PuWPO`bNjrtr^>E9p@ zuW4Q<^rPgZ?Cb9$O8xxB8M<#Ghoel)hkMRR38ip60L}J|gVXvh%jOiOV)y*Rg9dQ@>6{-{*;7|C9aC}44`Td!p{ zg~sO*sJ_gXLYgamg9%QXuzB5FI%*Mcy|~rR`C<>zWVN=@OQ(-(X`_Q1F~Tuo-+I}8yRhHMkc5rl6%L)o7ku{^w(NRSi{DEiyWl?HOY1a#{jCM7 z*#gMZ6{N(bajsFu2{EcQzOUYmYPq>IUpJQYxxUui?h?9zc(1;SblcgCnnOqQMYQ`V zE%>=6kw*UzKb%ovh{lLA@l!(EEpAw-aar=cCc;^OrTHJ2O+fwm?Al`~YvH2oYFS7y z*a4@@T8L|Y#Lr>GOj;WBT-lVaBR|dt&2+zTo;K)Ipv{5BW5@{;lzg>2C+OjfZ@caG zs}RNH8i6o#vwYC#PX>As$va|f0j!96d%TUUu1i2Ct7EtjBMRGPItlYoD54Bz-o&rOqF;v z!iGC0@0kzNYCEkc0`wDxGtenpI>cgb-*cw_HW!(F8lDUM;H7D7``DB08vv2QE+`nT zo(~PaH)tC@$Dlj`|3fGxhzV;kN|Ehxs;=MCLxN~cUH&8C1T={R1Ak04Q(U8(8gmk) ziFAoGFVP(BXS-S)3dPk$ZegwPzJY1J=rltIH9v<0{DNw?gt4gHPFPj}xN=8eYEjy_i+S3WEC8bN&Y1(n1!Nw+Sb?4rjTyjGI5b zM>Z=DxlNLua}RyT)A9NYPh2Y>EZ7`W`3Da!X>s4Rz5X>@&&dC{mkEslERb~wFCIL| zW_myySRmB`2w@=^l?0vB%KTWmvMegp@Z*iHTDZKCuYpX~IhR)(-YYVFhu2nO7E&^W zBD_IzM1ew*?CL?*Efi#3H=}-gNhuo*Qd`{pNLAZ{iR($dS?pY$?&Ep=F|+hqpOX1^ z`4~wUxxB2%wssSwVwn>q0x!9gebKUp=95Y#CXilI#3@9s52fn0BO z{)aCQ@$1tQf*slvqRaW7KD#LndY|v>R;^tRkKLO9x?@Z}Gyb3E&W!c_=NR9Jya<`2OTZ+uB?pMhf~_eph0rz3PR5f# zoiSRa$=@8BA=WI22Xd1Pe<)&*z;585d=*EC17=x*e^HA6Y0c>7Q;40mjTTT)Ke}G8 z3?a)gh%QlLT4+aJnyO9Xk5K^XMo)a}YY@PhG3mH*t47m)A;gT-#o#dyrn4Xm*)Kk{ zN{r_(wku`JDtgdWc~xeseDL{2{|%g@trBdOC~WRTL#(!FtLs@DPVEM=zc0HC_-XwR zT*@V}wM5MPJI$`H>!G12y*{4P?<&~}nqm8A&EJ(2s_~*5d_~C`js+U!5gt#dmT=$a z?{>LJ+*3TwaOfwIO`p>g3f#-)G6WhSUEIXbL=qPl$q)Zh#ROdq=I^JtG8rLOckRwD z-6WUmq8XsD!)!2dG0Na^T2Q}Fp6GV3Rv%!LcNkq%Fm02h7}Kba|Dk|d3cewzW*mtc zW;m3OJ%w*(L5F2KKK3mH2g&IvG+QL<^Sb@Yf-4n7{gbMHj{{K>XCirj58(VmuZ8Rj z6%JAZ#$KF3{cUUdF1Im7zCbl@{SVbI9uRqyw484`C{7vJx3A?9!2yXWkm8vSsS;Hl z?k0E7Z>%60}E-!EGeiADaNQLL8;SXaX21#;5cv z9&a<+k)2f7C<%q4E_mx&!mj8@T{O4K4E>vV-YW@%hsm_Oa_BBKG_S29tIvT?{9F4} zePaBpI{o3T^;e8SeJV7y#XG(FPo4TP037kf9N1Ep`7GmGJ-!Zke1U6eFZ8$0fvse0 z{*e>QZ4hF7p*X$3QmwHKr%Y;Kj#owxS#|pq{OSyG!b<-*)TJ8~x04VopnTU_Nhnbg z1d4W-S1iNXvpAQ{Y@wdS>1$_Q_jlUixF8jH=$Egg_tfxh)R28a@s+@&>CuE^;f?q| zzXf2s4bjxLYY}sLK7E6`;IE(o0qS*!u?j%WM?I=2L|Q0KQUL%Q(QYlR_c#0Kqnk@A zjCIAc!2`sEW_pW&-309dUBO!1iYXgArgk}J@0&IGeP0teB^5Pz;69~qpzU<*X0Lcw zqu2O}z6IlTpCWTynqb9X9SZt|iHYhCHdkR1)cgWLpZIPU4bL5nuUR5%7GxQLO)5kZ znYXe$>WSoSUCz&J_R}!5N!3L>jIKUkz1eBV6=pPV6@@cOlixW^2-dRcHu|{r@r``h z)P@GCHO`vnQyPQ}T$FByRlmnHYBDCyd!1EJmvYsq>&z-0W?TDv#^k3f07D~}5m_oe zH2w2NRp=MjgG z7wyeQ!5UNTLr->y#ea z{B5847n(G*m^-O`<}Nrd+i|51RMWAiVNI=`zq{x8D5I;ia^ShrAGpvAqoyITqFTHM_|6iF#AE$;5_*5VY0 z7EAHsQVIo1f|U>g1%kb__ucpIvw1U_$(&5`$M0m%?)U9}yT>hF=}K{ja7Ctk<+UVD|ioGZ=b&T6%JECr}DY*d-r6OCXwIKV8Y z`S6Mo8M>P;_O&d{g_m03fGY@n!C~tY*M((+V1!M~j!U4SsFjI+ExACN?0&oAsGrNf(k-Yv6K=E) z>Sjnyl^Z7kZRRhmlPA|YlsJBqf52~PT*;r!8WMJV>HUAQh|8!)2`B2Nn@U7H{*_-V z_J2pNGU-P4C=g@Q5c}4af2E16q3Ev|4K@>Q)=Pf_7o%2HUgDu-hTlU6|M@F*EhIEC~Ds~nBh(J^F_?rdX*ZBQC+67vsGkA*d zOm2#25*{-_r(YtIc#x0n zFVknT{t%q7%JKyF5LjJLrXR99V>-z^g2xTu)Y0WVin1(@(_S6EMuM+F(6DGaZo-R3 z^-PJn_8ZJFb~N?m4vkI@g$a$(T$U%^b11C^iqb#%OD3Xve@dh3WE*to9Z%j8@yy#5 zM7dcwFxBr1Sn=1dNo?6EDZAKRo8hcd`!0wUh6 zfDwnm+^1}2zYx?`!+?gYsePN437DAi84*|J7}A zeQ!8l1XH~EAu;s*i!trv2*rJDHsF+IV0zfQpE`b_f;pKlRD%qjB-<0Oz?FJS8yX)H^S9IqYe5=LM;;hu^UO%zkAK>Q8M{&=Y`NOQDsAl*NVelwO>Kp)j#zY7u0y#Q*LW1 zxt?}dRHPpIPXYJvYl!NtI9UM)#KgNw^zu8EK^ z!(NK+F$nnhh5D$VWe1LbKgOS!xz{emu^;0zHsrS&{fB$+?we zeYKQ2iy;GEE(RRWREGO->xVC@>~foWCM+jO>#Dl{FV>s;nS|xE^a;Bj=|)#BX}T0V zP~@DJ33lPaUEGV*k81WWAlsPeDAIeTrTYP;zm-hGSZ%i3jZf0XsMd-TE?PG!ti^S2 zJ6GwA9&*3=$|kf-@VwaaJN2hVZl$uC%_FdtcUY)+Knqc5?L7^^`1`wtA}9E<-SO7p zlTm&Rd4mGcS3hX+-c5!qHD4~OimmHo|H$Fm?ipdH-1%9)7S-$|#{smOqlWluNj|01 zY6>wT?s|!irG?cX`Se0I)^4WmC7actDQ**t4i8pB5jRVhJ&cdL?TToHG{5#1;1Bao zjG4o8=e-+!SLRjSN%YiPxgNm9U0{w=kdreMf34K-nNT+U9zNV91uyI;;!pXLIV><; z2R@eq*wEv>b=?43m_3{Q=o;!`zhCwa9!KYnj;|5k<0C(mQC{5Rchu5J8Etse!;YE1 zN4HRT6;x%Cz*VIX{J}GvZw6Iwnjk>cn;c(fN&IVyOQC%i!y;RBTXkmf&@0M-+?$iA zK=qN#kr;*PQ8964$^=;%MgEzq*rP?2Abw#t%f)|Ntij6M{}I~Hh=1vpJJ+bG7xxI! z%gjDo=-)=HeKZ&pLVtT?&Y7Cy?*DnPr-P-huZ4yC+Y$UzD8=ueYd%*H_s6!Kq9BAv zR%DHF=O;IXPLd|id`6EA)Rq@FWSuU5*=~k90H|e}%-+Y}mQEWi5?{I^&LF4r(b>(4 z1?#W>vXn|dR;@H-(JJo4%4>FYi?m9Q`lk0L!+m19y_L|=o8M@0lEd58)Mx|&E?8Q8 zjVS%)2e;)Ld4y3B01))&?gn`ePdokX_jD-jg!@^&1##&z5AW!`hek|$t*!YHJkqI%j;d@!aBj}DI3K31< zaWFu+oc_Zfi@LGyH+#2wiL$13s%3HcPio_8ulzFpHb)4y-)?}TJ`WR>^3r`&4$7s} zd7Q&?&YN*{Zh=y!>Zt22S@G75`Sc^_Q=SJ|$NcT7_}fG1_Ji+o`JXG~K=-%)eY>^i zrT+fgX{uiNVyot~1tjW?(2XqHZrev&{2uwgJos87P0Vi9b#E{6RQ#m z{Z@KikEdY2ldFmuY_>jHDT-Isi%#BT%1;D&ymJ%iKZU9j*Dv}f0q>xs*KbsJG7e?4 z45>WFQ2os{!si~Atub-ItwK&r-Zv(Hv#j(sX!U3WAy|LIn7FiR{1awQC7c&8K;&#xu7ZvBg;Bz`XF7re{rfR?l_4+zxcofK@G=?EQ&MC6sb& zU{v}@;iqPmOhq*~s$r?iTfFl6vF*W=s-QsI{wKAVAoAjkHdLy~2X?pXzo(dSk33af z4FH-9>5Du=MsyGb6c{kMCg`b~g$Gi@ZYw~Vs9;qTv|TJIhOSWG|K>V&By7o+Q333@ z#5VJ?^$qYQLoZQl;^AKA2Bef+GF)$Ix+JN6?p`ONp<$hx^6vNc1GnYi=3iSy`3_&1 zT4e6u%*JUX!RMR9Df6>tDWj~*EV9oXg|~`K)22=3!|IQ}wUlzSzY$gr50r043Tpn0 zqd$$XjM$dhq`@)XD+{w!e&dFv!?&pvPN|z;w{nRe(}}nA*2JCfHHS#lN3Mclea^Si zpg_5cO4^x?T}qvU*U~*(JhD;Kw5P&L>lsqcZ=xWrtCt=?-n@FT4L9Tbp>| zS{GQ(#)_g$QtOJYIf%S{d#)V$s!DXpfl<7!#T2tzOvG;st7G!OG7Hv6S6)25=-`t2yGkv#X{!&x84YP#!M&J&dU5$i8m6?Ofa=zIu9~UQOtQ`crPda=Q%L+W} z=n!_@^*X-JIN%Mj5%MuPIF5dUrzZsOtw$>4JnOh`PBYPS7Q=_`LRl|btfmOSKl3Nx z>#g_mP32bLmS@PulgXe^;f+)@ExOZkXctQrhAmUOCca*jS7C`u+xd+Iroxsi)=SXS zn`Dvcci{Md(PrRl0osz_Kh0_dC8;cybSt@@&99BD^G9`RJ{Ckr8qeXM4AWoA-u>!n zbp<@4RVF@brC zL>S!|=(jYyGjJN+KuR!W2KK@SC+FE^FbX5x6tqlAL7~DhfgFCTR`2ZT7gKc~Ils>M z(MpC1CfN(+2xxm96C%r13~3xF#s>B^M8PYNp7p{B*kOkl`5}dcdA!(8_rcxhOWJpM03q}i&D$l6pw~DYfhuV- zB#B`CB4}IL$X0LWj*FZz!_*=B#+i7@E5B9t-nVU(3A5HGO^PXRLt}o9Lg)+h78Y|B zOV-3^C98~vhKr`F1F2pCjd0lyy=_o);txDMW)r6C-u8deEQq}g-Zo^HzRUWz#i z^xD9)TseL*%I~Ml@Osnd!%Jz3?9O|gE`}!E+$!ZBc3KT5@?l0PF;@K5S1Tf#qXI2ah-S>IV;KD>bb|_g6_AiBmMKW~5X?pv7LnqExU& z+U!SJq7!^v;>SZBiTIcF#A0ol^RD&8{7r2X5I@r05L@cSUT9)P17!`?qk~Y;4{wFR zx7uBuer_9U3_rHe{JDAJRM{iKpBQ` zBHN`-_^juN<0ExmFmU#>UtR;ohn%Un@nI?KEe9B`_-W#YzO<}^L);$Q>o311`j}~E@J^53icu8fYg;gZq#6QJ4@}s6XKGP5BM%vrRPyC8+Ad$Emu=NL8-H= zfxBzy2KT&I&i~1E-$|kzZvf?g6&gr0qKQtdoonNZK66$4HMRJ3=9R~vmg{i{?yRjs zLXxj&`|1?)P~z0`=pCvU2d6y%YFX*H)f^)^y&oqZB^2lf(#+QI{V+C&y|x3y zKLN_J!d)6gn+cZp@e9UddM3BOt@&)IDo|^9j2FtAh}Tf0Xl(TuD7?-d;G2VyX{467 zTzA42Rb}_bUy2$TPxD1N#uwYQB_4f!DcZgUtbiR^92pEt|tbe0C9-ZV*zaKL@wG`?K`B@9A#n}nTO9% z*~S~vEki`xI{%s{+x>(SNBJYFeb?a( z=b@zC(_)jVB<~YIlE4Ur`||xImObFL%Moo$Hx0P$gtVZFIs#XBi~@##0w_34w8sb! zpj-gHX3|NdnA|s-EPo+4YZG_=MY=0$Y`epqlK zqLLvNvC@c~c;R8Qa~IlPLmkMB-qJ$S-`>$MKISADGf<-$qz7jZQxs5_UvwkQ+iEQ* zF>=xODU0L_E%A&c1nN{DX;`fQvp&}@e_S4^QnbJ zvW6rSDA-1rNGsi?IT>_LAl%|ObsV#LE9jiT7m)067D77oPSgt*=W5W4+*F*aSwM3s4= zw0hn!%?-aX@;R)8j+Uvr&8|v-WR-MM%JM46hxu4il&I?xm^vIIsz7Z6AD{lXtsl5i zC-5{Z#6hgj4=9$bq4=wXTB?gvMw+g=}> zU#+Tv+zPqQ<%=gN5)q0X)QqgB_jXnrl?bmHN03Gf{xt~x;`0T(cn?XjB@B_oSQGxF zZB>hbOrP%+^vqa)^X0=U0$H8U@bF7XU4gY5W(hK|?3EfU0P=NBsPz&&na_nfXw+vF zmoYm*zOoCPuUxSVzZ*Fs9wYcmG_J=0LCm#!wVZs{n{M#h z6Jq2G1zBI=I2JqMdff&?WWRJ&2OJ^3uMbU9nZ5pTBN=fnR8kPM)O1(VHp_pt&^0?X zDP|Mw1Ja-lx-D)Ik9DbXF;1keIHc`OQ#0>d5^eGXryn(w<|B zTXxU&{}-GNX@4(8-)&~>bpb}I8IqD%L|0e4>@(t%03#fVx$Sd+`%IwfcE>C$Gu6Ji zv6I!@?dw}*ap>3Bv=HN`D|5G4 zQ7j^0@b3kY)^SyHVROc4(Y~v&SK5_H;(c(>?{5|ntGVW^EoC=8BCqwT2f-1G*XWp{ zo@#U#JAv35M4T?bqw?%l(7a-zdW{v=z``sw*vRrMk~oeEpA-FA8vY3o*;@Ct8nXSm$}%%2RK54* zT-4{Rj|z(7V-Wpy<}fo?eEkv2^-QQZLHM8jP!KHR5vhKXnjdoK&!^KW8V^$>yGK`w zr}wV@oP7 zXG6*`lH4)vFnt%B#R!K}LCH#4%P(E-l2wUC57u15j=nXQhmS!PNgPK)lI)ck2?=Su zwWgz2V|b&d12zYbSPngxauswK&@o%sw{rCf=_wwj>iP!LYm39I`bz@B;I#6pb|-fC zn~ewoUP5fW-7YZc+WAabntzB|czH@6-?a=r<0Hbnv!vao`IhTMo7WH%luDJL=JM$f zqCvaURckuZ8Y9kgP>LYb+eWNXZqEGKZDC?JYW(h3PA*wnB`B;e}LtF#r00aH`!N^Ft|sEj>b0I>66wN9 z_o8CyE#7Etm+;A&&Hd^aL~PS&ifh!s2KbHW_xVD91U!&p63fV9QYyuHtbn$%P5zP1 z27{{J1M5E*BAG9`KJNk&DqRkm^Cd=KTOdqO_cgd$cY6wodpn){T z->2Q`n!#1oM7rtrx`x-#<(s_j1QMrnL{^R25VY78_4FWMzCNlAzw#^U!V(uPP2JXm zkc=5{2TF9scu$Dh>87qI-zwXHa#Im!`uQ;al#`@VO6DJx%fFmQY z{+A@7pZwToJZ_5xweGXw($u|P-C#S5)YO*DzLuc6FvYEDLElp=EsLI3SK3IOi7{{l0^yXR zS7NlAQ%x|cc#gf(dGPnVv8Sw5Cb5qz@9pgq$D&z9BpO}p>1L6?o=iU_29Gk`Yn%-^ zf#S^Yfp6wfqbjJ$y_2T7^@zQB50RDo9HH8}LFJaKT{~j_nQd{(ih3JZ3r;3(SZ3!m z@6e?aSpE=5b(rpa)j#X2o`a4n%BE$Xf)qpRVO|!I`x_~sgFYS0)=B3hQdskV4pnq*?_K;pJx zFJT4oI@=PAx|I4;8nM&5UQ4TXID*v_5s8LwbZPHNT4KFtw#1lSv(cfzTl*{I~BxxRL}}{>){ZOK^D|WF$oF3Sl}dW-A#A>;H19ABUW( zQFci5@%$WB)8?& zXQQPwlJGt&6x>xRvp8x03PEc(wVp&^~oo;~}Y z!eL@URHciM^Z`}%`p--ft6FLCqfy&cYCHR6O>R+jxP|j>V#zfPmDHkFdGu4-J@4W6 z?2{NxI?<(78zw3I_m~CNSQ0>92I=6-A7$*#zh0Wwy=yaM#OAm~-C0>*quYGnr${Qw z9Twux9FGCVM-Ek!P=%MI`3Vs+0k0Nh%uvR%;uUh90Zm_yZ`b!$FmBSIdeh)5smLyR z(9`j5Y>dS>H@f``INHr^98`EN4Xka6Q&wjcP0aW<%)04-!LCRy`5Er!EX2FSP|o{o zXwv5*FR1mcZJQghqm->afgJ4j@bDoQm7hIT6i~K_(72p!b%f=K?Z6K|H1*5kY1PBA zTb&_-3**}D^m1lZ?J?h$?pNYUqRoV5t5=R0sU(rTq)}wcp?4D_OvYhFF=Qs)84VqaM&Uj z8Uj5D;v&69Z>LvZ;p)C~kvTm6s6*mTbb$&k7UuUz)uf3IftPTzNY>5X^Ac5ZNc#fO zgnv_-S>`n_fRUbnpWMOqE?(E`Xa8_vvmU}IU!RRjmVtMWOG|Mp9Vyfg`#Ett?5mfM zVi49B)=gXPFza@2%lor`0)Xj;M?6(G1>aC{n}mY~q-wF)AvYyz+-#b>b0r%=5IM%y zE|k_pnv38Yp;y<_NR>v{8vmcQpCxhp7|RG&15%??X7wS$V*EAtb`Lsl(7P9Nk~A>r zAq^e%G|ImW>SwdWypBPK#Gqg9H?69h$60w1&&yHCi3A^J8{m8{qVD-MF@P|YQ@|=E zbk1kTid4p_5?Rx4G3F3N>TLVG1zfx=yZEmOIS`c$`t|MB=51D~d2I zew%k<_Km6S9(IQ}D*u%8va8sq@yKVe(XBwA4HL~<{mi5u^L`r`+@h;kQG$gH%)K+Q znv0d=Ac`Jjs&BT9mK}@cqKa=1L^rst81TZ=GiMNPF`aOt^e`##2Hu|eiAtVq#*}YsoeZ67X0R)Z)<87e0Vepud|HeABm=(vj##Kp79#R zE0p)wy1yeZv~ku-(v&|Lr#fUBqQ59lzmjLhkbiN<+)uVr;CX2tzJpwI2vtF6EItKh zvJ$3j>QhB0>4}ncr<~`&hsGFJQv75t6jn`s<2xz9L z(^_Sv?n|691aX1cFc(qNYSQd}RnqPDY4O+#s>MWCO0dIjM$1Kgq?V|eYoeT6o^OKC z5c3YHE}mjn^Sd8a(_1tR=H-tjFZg-)U+(6K%hB!kKgJjRguwMay=0b^s?jv1sB}lQ zz}B3*+y|rP0@1eF&Y0NsF)r`2(88TsssZ%?Zd77cJ3?d?r#B z``)fmf!?N%QIWo$K9zq~kc@C8uY|xb+a+}8nwo9Kl}KJK;yUApf^OzdzXOZdcEzgG zP>aDXz%!fkL6j@qa#5_|_dFA)wID}jv_i^Tvsd(t8Ks#b`+^M0BQai%@G~a5C~h$} z6DmEgaRdp!Jn}oIv6Y#wLv^2ay$m+eU5IUejionL7dsw{s)$scJA|svUj zN4k#u4q8eZk#|jdKU14lMpsMmeh9_8>>#4NmF>CvYoIVmY3}H}(h*qqpjg!@ARnSE zo#IBP1}|qU<6h|K&#;ffDeIQyNDscAm4OJPC9dRGhCHYvD?qpcxcD!p0Y- zhu1Q$PUiyT?Qds5#8->z5H+GSXLC(Z(y}3CsNh9bk}4%tPsJg7hz(P^D*24kuNl9r z=vtW5TU_`!Qr?VX{?U%yY&2!?zC;?Hnq)5O7>VeEBhC#J3oI9^sdX{DWNU{dii8z` zE+A>jyXYfc4q0bpehE1%>{^hA57j$mfRgAgxMUq1pTLZW@l zOQ*cCVRR2G$V*2;%r0#(38`!*8P(Etw9Dxd`FD~eIm!>*`SFA1;S>6S!eIjikCY7X z=h$N*v7fQ%ric^eHV3h0`)1YjuZJ&VDt-=AXzY@wMGB}g)1jl)DZE&(6}#1~K~v5WHE_ab75bYuSg|>OXj3m&#;6QbK)OIaF)Z`w>HYW`J7ZV8NrPTIEb) zLgQE!_#2CYnbC_mOxnT%z^!w9yxbzJKf9l8pDHY+e1L*Qi#jHNQKm-AD17Ix2;0+? z(-6XJf=0lA&G2NdOd-v21AhkFZw91Fn4q{!Ah4*PV4^tnjthjJHW2*h*Y`WJQUXhY z3@d%hYM48%+%JvGl+a-Ly5F@yBe?}ayARGVslH>eR*7kD>nEi@`~8@)Qu#4f-~28B zequ3q^VOhKt0*d(J3gLT3sY$TNc2iHNafGDRJwj#+@uoiXTwURm)!1GLECHIBEK$A zy)eNyd=ifFt;?HpE9kyrk;o#M#7fh$$$C7HF25EY@2ofRo-^8a>RDB!bmFO&sD^W71;UvNa>jTfX z_3|w7Y%cGu%Wo91_0##Nj{kasITNi8v`wDgU9%4!Th9p#ZgH-asnhQhqaExjlOoiy zg7zt6p>r~kz~0Hy6JTMWqux+m83Z~Pu_F)vKDyamf^i9~&#tCI7G87$d}Q9Kg!Ok$i_f#SDJa#mQ9qV9IJ&(cw; z-u$K8buD%+lS$3d1%fs5+hkeB0jM=&N!bN1n%H9IV} z{&QOMC>7#o`dKSvM;XC4JZ12yJ?7Utd#mZx$ir$ptfmiiqad=-Q`$#gIos3J_I$+P2Ex2_U01x~Wqrsl&DQ=j?j89*jUbtiIt6^hx+C+mf4OxJF*C&$6 zVk;cF&)`DundjpQX@L1}z>}59;KLAZt!4X@9+G0>Sz)OfZX&+)Jt7@#g#m8I`=;!a z{BZR$+W@lsS#`awPiBI1=NQ+AQ%USB2uLu=z4eSKlO!nYdY}DRxs@y&M@w<|Qg{NBi2H8(OL)>f zkG`~?eH8lrDO&W+qt0Kl9z_}7_auuQY-=bzT|HOX|N9}Kdx0(|8{+V7Ebj5&Pr7`u zYDxB0z8()6@b+N34>{?PFy(wAfY;)dwRLEjf{x6nMKIC*q|uYG*h$qn(a6hI!yswA zB(PsEb~FZ?$PDE<(=E?+h8P&_#$VtsOPdXwmLF>0^vz$*^ z*bPkTKI@^?wrV=21@IcE1^{_?SxS#%)Wu2P3_iFR3*gGvkiHve47xs7fYGs`Iabvr z^sTNO%l&j7m-Ai;v_3l3w_(xZ^fLTKxvqm>Oq)LHJo@7!YpJvttM_6K7PAy~E2ExL z>4d7<%q*eVD<2Q$s`zXKrWU~%Hu|I_Z(g`y`|cb0A0c>32l|m;CLA>NtOS#pGY4)a zsz}^4@MF(kp_yMkaL4J8Y{7ZK0^?)Y zH~Dl`&1f$886i&+9UC#i7rb%arQ%k_J zX|u5{e&ITAX6n+(H|ZRCl+N;dXwlVYhiYWz(8}~7l5O|Od%LWqJ`y8!;x)*@%kDdw zFjxL*%|Nm$0BPUUAe+`^L$uvAs2(G8#E`Lczw;^9(wQ!?4$&&=_Ji#gIB}6|=EcM; z7c6dtyTbI|g-bHM9?qeS`GZD$u6Vkfp{oi*bF`F6M@t~rUh zFTbL6K!#=hcR!zk_l~|)S{%4L_0Om`1TmhbhG?J2%XN}h9lRjh>`>}VIQqjI`Q6n7 z*7TaUnmc~!4^OYEE*wVv*N*!Y4P;&C?tHm>r=R$Iw7aSBXz94;ib?jGbdU+lvG7V`j-h&3wu68Aog%sc&nE9S_k2^(wz z($tEql!EY9Db9@%1#V`}nRf~CgJ%-njEiJjFMJx9E7eCgo_xLi5c@~6Ge3Mi3Nr(s zh;!i(S|F(`PGJ`K;l+SXt031?4^Rh1vW~o7tG;Kgy)JP{VKRN34ZD$Vo9ANfMq<88K-j)REZgwI z;a=s=`q8h8?%0}zC#s)=@A|fGr$Y>i>!-5WC$}*WfQax3)r|lcYHzR~L5r6BgMtw) zGbGD1@FkbcIrDEVU0DRKfr5c4=FAq;LTqIZYnb9Od(|)U^>GJ{i}V*vxTRpXo1(>z zCDh9c0(G77V5m<&tCL81 zaJs<^4_OHVac&Uv(s^PO7ZLK zZMvR3mws!R+BbXEXtuF(ZT`NYP+#L#zrY<-KRfU|*?F@_L%YV^^u$=E<|&$?(o5;B z6Oh$MWLaMM9%BCWzv z-;CgtO_N3XLC*(0IKp8uW&0{zTp$K zzS?lkI1Cw$v0xKjHz|~d6^GYmp7S%$3gP=zoyrwExBGBmu@Ac)pp_YRGACms(&9Ml z#;Om+YDj4vgq;#YEnbVDRjGg{VVA5acnVDQQysOb27o5Ld463cR6mCGNe%Xap#^lH z4#UV4=_s#xCrx(4v6zXevjHXb(Ry+3itlSgyuim~P*Je!voP_NX!EkF&or7@Xt8AU zQ|?Rm?L?Y{O-i@^Ob^GrKP@t8QOk`L=G- zmnv@0aHC8!3mJHmx9}Cf1|@V~)BqnQeCMqx6rGtYUa`9pP`Gp@IUVU~z{s@!A(c$T z=z))@i#$Y&<$@ZF8^fr;b(L=b_gyud56~M9!=cFwBAu;!2V=NO$%*=AWzyFU3-CwA z((|dg?{m=XGWF5JD^r;DxXo~(5yXIB-5)Lc%Fw%K31bltvM9*RQCuZC+~#bQU-4)S zu=O!5UOWX8T5~M5*8%re*tq+$Ta>soqsZ)}Ep_zmnxofcq0>qwLI131{Mm;KqkT zex@#zHsAQDF{1_ty*~bR@W2nkZ-|4e!4p2wu$sO>pCAd=md%j#j>#JSuNJCUE2c>& zC&7w+n14|*0oDciuyg zgJEkRK4wLgVM)2C@Nc|-U`Ekvmb%Jl+waUGt)m0=mm`WzE|5!)W%o&Ixq9^TCPT zV@|JLa~4}PIqL^akX}gI)>7v{l3QyHmbf&u(WSJOxhb_q0(r6JZ|q8#pZ)Rfb0~{n z`0&kW&b@cS+agr-RrboNPF$YFR}VZC-|&X^2l22hO>dtQ?Mh`Jw>-hT`k8ajHgcMPAIp+J9LW(X(r7H4EQ zN433i2gtp*%Uo(uS@(4rdBgLSc$m3P_IJ$bH_(@I^v35(b!uA|CItfBc@G5{=~^sD znBc}})gDW1cG8@5?X`^Y2e9GlmcoFln9@g7+L;}@xWf5qytT)P=Jr+Vd#RPnDW;-P zW1Zal{SJ*$?ajVI`Nx6QCI+iAq1NVb{%+0eDK{R7vAim>cO<=x(C}QQx1-aaMk9>0 zBv7GFae8Ik%OSerTs&_WTxg#RAYJoJU*OCjDPBM!%edj9tM%CMbez*r5zM3jD06wE zA?oSW^akTQx9~FWXx(Eqpo_m)h9v9KLm6pJ^s(6vf)6bOG6072ZfuAt4wB+%@k!93 zKQ?>6ItzJUNhtn%57cI`miF<57#-wQ7^5JuLqButEG?8UE+>v=ukcVvrF;Mf5M&N|EH(eq?5!hOwK(2Xdb_V9BQDDS1s~HnWtc!iajkX zEw$BE64A>8x0r@3hXNb77raf$91+%1+`t;8!uQ>u}&%^ZuvJf}5)Mj#_ zG#P6JK#QoFXJ*4^w@>%x@jlcNUq_d0%bmLY zi7j7Xo76b}P0$K`;#)W;nM{AR)ZRNi0g3E0Z)fH4#ydX&Ntlf-y zcMW6f@qf+&NLB%5-km3Da8MVIr0h<6-vdZKlvw;I#;PPg4cD6kx(pw;oc%)L#ZKUT zWg;!6*5Tl695q$?!}a~I!H4ug3 zR_OH!0>6cZp-~J^!Fnjrr*5&iY8t)17_`s-tDsRhkSRXq*D3XhVF@k~%U<7lVV{Q< z=tHrLryPa5uxa54qQi*IXGV%M2}zwlTD!O@eF#3O9kdVHaOJUL=EOrN3E8wzu-w{(e~6 z*$BpfN!=Jx)}7-=eQ(pYs=1C-ERyOj)VCzRD%xGYUUS|`u^ueMd07v|Ma5#}zp)tQ z$=(ji&kg*g)aC@J)$4B55X!%+hQF)Eo{hP+?-+lRP4OC8Qqfa4tZ`qbGb&mK2+*tu$y74(`ju3y=TD=TrQQt;HWZ^XbtBQ~~W&xlwj+AKH&UWWNS=%$Ht z5jU)s$TD3&s^{6CBMwJ@iL;_bnv<(^0_2*xzgWLFAc|8cF~!Ld<7d|1C0^`!)ZKE4+nP5^r8aS8tQIeQt~bPVHtx?Umc?}do+ zrJ(JbrtC}2i#|D7!?~_D>6eV9$5HkRL4TPRfs=E>(+#qMuf!QNO9nKtYajc|+=bt0!q}ShL$%cGxJOrqqzho*0EYObk~Nfn zG|Sfj^5v#5>Pb|#p-^8$(90_1G2a?BW%J`9)s#-YQ=kxa@$bIkox;O0eoE0Maj+V@ ztKtr5qq#SkCgCYYdPBNmvgNRxIHvi?0zt@3U0`;PC+nvPsfp$`^RFrgZIiz5cLk^G zEbw9EpjX!$*%XL1+Z&%NBPb}z{QkbX_)V~M4eal}#Ljj~{6%sn#_a3ls4(jH{O^j# zSRDD{?~3&A$}mSlJg9*FTWol10H?13*^6>5cSou8!#K*UEYAM7wjUpuJ|uUH7}Yt~ zicJDlY2#`zvoo_7LoaEcmHS~eRLldvrc<+|PcV}jm&8PxM6*pP_7%7K7(L1K?f=x) zc?Hekv)$V&ku>$`sx{Y?^DiP8WFqxOdd~hKc{nF(iR4tOS|?xbs7Q6! zCfkmFD*U0Ktc95^RKw*ZslT1g+@#u*!tw9q(?GRNJI;JVBD1L{6?$v#X&-KNt<3*Y zkoo1*1hYfua=}gweBn576Y#K9hQN&}wFrW{@cawh@oH2wx9}~m!7s0VvvFrA3wF07^0x89=|4f`BA2mxpv})T&yWTWopGyKyq;? zZ<<}o@V*m2pjWlr>^xmCF{fBxCYmI}yGBg99~iDGJ3X9HC;d=( z*<&lZ6@hcd!N9;mG2^A}jJ^&q)eEBmOJIue9p>353rSs_pS6hjQ6lF;iZ{Ncsgg>) zYGAGh#oPZkw%#%<%CPGi7DOqLkOq+&x)A|M=?3ZUkd7gTR(i;xbLeiQl#uQaX^@7I z9AM~thx>k>?|Xl|zvejq%yC?2>{x5(QH<IR-Pne?jFF>@cjS3;KGK*^;U+HGL^(X}BTPCc3EYLOBF*C}$bBVmO{~E^W>p z+T5e4`BmfVvZxi$D$M_$R}3l%=R*j!k2M&Yj|;03@6UquPK`I-Peca5$-7USfBIQl z)4qrP@fxVPcU76*^of`^cY;cfiw<;`%(}-*mh+7@Z; zHC8fB%FdN^%UaIHd4n$weyoxF5*4t2!cDr}Irerw<{L-8j zdI{vdOR>~`-444XkOsw88tcaTNB&NTviz142r4ff9Lr;Le6&k~#i9>{N@;54Rpp;e zmeq@as-!SF5+>VuJ1LN0;%h$ovcfjRMkO;J4yfuU0Ue~0V31%Ea(nMBX3a@JbVZTU zOnk}PL|HJ)sApA8DSyu!EeXC3q{pRKJy)owf;ajZ2zvdv53BWG_1#wIc^Th3bZ*#; zKCMifdt@*V*_px_Irk*HegLYFVWVtkF?Z3f-x}TQ-9w>B%L+t}XThvkSkqL+A}1KX z3(Ld=mZn-VXd$1f)i?+2bI;oD-!j=^fRTmq=<3<@x3`f&iFak=pN=k3dW#Tt@*TK% z{o}RKA)Ov7R*$WC@*CXhyRhq@j{;OGJHYpkZ)I?a_v5dom*l57DGKE5*fZ&T^dYBV z`IXLb1DQ4>evlkE7tr!T`&_S?5_fkd`c~ESpf2P*VxXkMEep73dpsXCm(D#C5!s!!o^>bT6R_uAOLC`Pi(ZgpBIZqJ56~TRn-;V?EIlZ(@nXHQJk`2G>zqAnA!dWQ2gSBm4 zbQasUPHD3SrO<#%{Ka)jU%4g*FM_ZoM|3rnSNi{~gds{$nZI*swBC!_sO; zS0tA{x7X@1G9W3c9Z#*jHRG(BmK!!X`HdDfskXp~x#7y`)Wed^B~#*^Vx_*N?JK?z zdysvOXy#;$qgguWL3S|VTaM7Wa~mX=G>tSspD?JpImh5F%+)?AA(hM-;oj7BHyJ3} zbU&$_m7>CVUU?ChH>CMp;i`1)jJ(WYLP1Hi815$}uOJe&@qmAtQg*EKNkrZC)!nhj zX|A|PP{aZ-_$C?Qe(td)TD?b=nU0GHCtgMM1Cp{%#K75!1$?fGYK<@Poa@N(7^AO**;Zar&tU4|+Xlg_Q-lKFN zXX?G0{)WRxoV$6)S8F08tHD_qIgc+IEs07EvNn_7T#yrGPxHdx+Sc3b_pfeW{Wyc3 z3wd*)@GZe}WSBM{BZ6l?E(TIpn7zsxnwxC%-YAhhQNQ6sF<*w2>$W&{8GOO+-Ikx7 z6t(!7rux^0YIFD`U$zEuBGAD(eTI+DoXhvsaWScE2jAE_;U1#{0);EmK&B3uA+cx7J^8|6(4T9Lzj| zMs0po_L<*IVipM>&`)}2;F^CnkI9?V9zHU)Z5(4F;>>wkdnnKI@m}qLiafee(g34j zX;E*uv{kHWp((DYl=b*-c%{QY_DJ%haohYf_IEW^k~BS4?8`I{lL|vzlx<-5hcm8= z!$5!exe(9{@Ao{Y++Ruyll=*z$N%7CF3r?B9=tKd-@q6`j ze_S;b8Q9MO@qT4JpW?M_O}t0&*5AE+Lke4oQ-G; zWYOb+%kiV}8?>Y@I|5UEhX!O5$ne7UX+B3X`BWXe{Txpl$bmke{ONqS#?RUx%hH3d z_goUs$Y=u$9U3OJO=}-Dh~rl+n6;C!75iihK-H;1^>7>9TzUbCFASk+Y)msBY0LO+ zIYOuf-!Ld~zDTz}=MKO|J7PeSq080uCVy@FlD>ZShV?UuTwB#@(x>~9v`N0NB+qS} zTWkwY928G_Dr=Qs%ntfmsww=s&U~HcB3beb6w33_7UKqQL7N} z`*!S0U<5k1d|}$5J!>%ts4CaeFSl$+3zV1$@)~7E*-d8et>H(XMuHgD^x+0$f1N7wT z4z^9Tq{wuZ4*L@jA%&tb4ul)4(8trj=^>|C&Q2n*JdaVaFw(4|RHl}X*6%mG$xcrI z(L{buzV}-4;JO?cr!ePf*4EFiN1}1AK{8~WTOV&;{dm7@Z2nIThc)Nd$N|3F#@G(% z>QSzb+cc0K6PJ=xq-}XZP^%!sD*6TD!_5INJgslPkTG>m4l-Hme{LT_ovTpUe_AeF zQR#&#skl9ZkR66)oEl*F(FHR>bafuo^Apsvb6=lo6-+ad0J+%WX_^N-ISFK_>s ze~&>z1?AiyP86R|d1_P;?x8OV>#o;JFqKH2ouv#3c;I?J6MWP$I4?V}Nw zeftb}I|Y01z-WusmmGXV#u}*?U;?DAU52yWLYK$7y~TzVMNRT!yE1Bvz0_fvXl#Rd zw(&;1g0rE%mv@j}@-lnS!@o!m@{L{k!pU^0-f7|`wk<%YgANDBN}^gWA31oP8G(mN z6JdzAG^<_thmd0r4EEYjaIdEdO#nJ@H2LZ|{QRe7IwVb7t;NcU0p$qA*h^OuBh)37 z(pURFjZN@Gj=I9exrerFM zr^5$oy|t{$&eJSxd_db$wUwX^RZes;R!3dPnuZzEXKRzd5U(*{JOx!I@K?mW zAz_35w^YGgeMm=-fA3JO^sU;mk8(Mwd{9K0<=@l~?hM@we3cjZ1AVIx#fEanXzY?l4Z_aIX;(e?^ej zK)+GmIyZWKN+9U_>c!4U>%B(lz`ncK*53jq?>?^Ks!zH2D9JE^Rd&#cz^Z(#_e8U+ zi6Vql{qPxD5q&ezf#FNG*SV73h~KHeIzOQ8Z7O7D<&xz9r%xOHc8{B7HJg{-JNx%r zpzM_JX99emhw9i*1Bt*;U|J4q)5PhgAGodI>78$HTm2y@D?;Ry(R}DhW}MI-U_U~x z#dgvZpAPPiiGFMQnz0jc2mQtRIe&pi8+CZov1BWU3Jgk-rxLQ!&#EY~u*{P!qf!ey zXlVAKx)4oXI}UhLa9Ro>Jn0}VSoQsmt?uGoikwT)d8>eHxhhU;!?VubTGAD=Qa|g} z4z#lq<{U3_KC)J^dL8)q42X3P2{{$CynSW6kC+$KQab#Jn55dlgW(T}oFr_WT-Uow z+h^z;#^oJVYxTptp}0z4Z4@rC@R8@VkGP&rROO}|~DArnmTrKKQhdHI{pfM@nnY0VCA z9bqUj1%n=T8bqDWyqLwaNzl6N?5C`&qC6oWb{zC1M~oQ_AjnR4(A?I`+M`RpeT!7v zz^ba-YJ%*;WaBJcw*M@NDUHNYqAm5Huxi|l_rOSz=^abTw_itKE4#7kACU^AXYK`TT<>RNF5sln&e{>6|-nvF?X|`mcT+W`{lH zrb-NAn>4_Ke8j8WsieW}<<;Gk?9Tf2@nG<0JOExh-;d1_x`LQ*ld;6vtK+CF`Ghs* zn_H%PhL;yg)oI6!<)G#-r-gM4Ui^r90e3DTN!EVOQgb!XItmw&ag&m68CEAU zVfoF@687r8FkjX=|8KY=DvPR?zDdQu11Z~L$S{!HT<%o5;{LsfTL2tLDw!l_i9HPbF1K9=B#=Hx@G6-;|DLGZI&j6a*XQ2TAZ5u7HIR%e#KW2>~S47>d49s2(xMnsAV z1{y4uxZ|U~C2S<$Pi774dO2*JtObl05I`UYD?K}VuF--ovj=eSFQ2=~kb#sWXx?SQ zraAg^X=a6M&@?kN(pl&K{3-Eeiy1gGNhgtaR+qdIOcjb{=T8pG&mMoiQ}GA80wlKB z974u9j-Fk)dlqrCC~3rumgz{wiURO4<>aGudH5ie*(>=Po^qtMXMeuXla&E`cY81T>U+#is=$^L%XO0!@VvG6J0pJ7|jW{(wv*|vWK%;4B(EGB;{ zKN_{cWRKBbSyHY3<#ijj?RF~g12T&-UKVSky2%Yv5Gq;ZSIkjGG@d^AM7uhqne;U7 zE!bhAvUG7BNaHfdXITtZ!5>_5uhy(yiuU=GXUm%Nhm3tyUS=JPe%Iz+ByjVv7Ey2W zV?6pNrZ>@;zA^P1goAW-axUmG{Jw9!IsGS>j!!Jjp1co=K())aHhZ z$gO@bAFVF~kXdP8HvfGd-T1eY{@^Tb&ieF)b7ZZ zN|(L@ywKs?>TmyF(R#9tT|KrHAF&%ziF%rs!+bWa^H%=0BJy|@>_-hQ)*kxxt*z8X z{oU@w-Cd);b<{Qq4%}$#&(070so>vM&GiQJA4ty&KWM~B8L(#FE;SjdieY`=&!i=u zrSVjx>M?)BCtk+=UZ{pv23Z`@#Vjp?I(BtO+Xq=KJ?PXD_J4%0?M$Ig+#ER5LJ8w% zQ?FR%NMBBVP-v6JMD7E@e>kpA&yc`mRR)^WExC1n>bR`SazuoULO0*QKTOMi??oV^ zB6%})!zB)fY{9vwf7M*ATC%1rWWfjT1E+Ut)NS>fep|dME76HM{G8xi%Da>(`Cz-= z5y6$I&zkv;HvF=60WHZ`!eA&fK>{P+C6Ulow2~9lAxDp_6Su+I+<|Y>62C0 zYVMUK{i!!9$^(elWNlu@?}#4jFvIxLdiXTfOJ^QjfrGW3bDE0oA`~4rYBpF^h3X6U zZ0{P;HT4u1IBTFeYRCi!@d-B;EX;crF*s4%7I^>DLY(zMnu+kO2}qLk<4DK+!0+ML z5sW=??O2#ar$6=m0+8@-7=rgKiAs8oC3eih20(|duFF~Vuc9?q_`@nitS#m+tGgOR z%j$++j#pAwo+B!9ZaH6Pl<|nh1j|wP(;)L>Ga5>=X-ky}QU_ri2p4OgIs5LK^)3ia zuqSIz#7Hb|%he*FRF53%lam0ILXE8O55ZJvh?HA^P~HH2o+nQe!25h0(d;Ld473w` z$m#)HHONM2rs(h>x4?EAoZr^-T~!X_WkUupU(^FER!05pOtNt+b?Oaj457YMn|vdVXQb_t z*&63x2u2RLuU&n_7tnk76+(ncK=AdbLBC$2Z`26Jazc|%dleutLfJO?1!m#jJHNOm{l({PhRVsdn5%m>>we7PKah&WqJ*2})ki_j*@k?KwP*c~GJJ*&su z99m@;E{1>#oOxDITjrx{+J5M?#q_IND?#696D1;py%XFk_A*eBFdX;VhPe9bQ=3KT zV`5IwLlGaZ2Z-Ei(${G+K1~D}HZO0vD34KPYl7*fzS( zQ-R>?5{69=KH!UUf2=9{=j)eT<$Tko|0_%UjSQ>o+@sCoo_J`LCryp~q!~V}n;V~% zjh<+SH=QQ95Kmi+y5&1>RyMXXNdZTFq89E~d^UrUb69_YdT;AWV6mL8@ zCyYMeC&BJ&E;aP;Q-Ai^BV)-RaXQrDYvs@+g;N}FGtvk7?c&)nmhbfto^QG=-!v;F zP|dhGnR97JCe^VX<*9295884ie#93$VyDjUYufF#Gmz zukl$%(BLe*0A@`#9mVdHnpe&5v5UT9?ct0pCU#$uIGdM65Gkm8qv*Lf%pzuW`i9W(D;zuN&U~FO?;XqF2ij|n} z8)btcfur+MH_FIFntK^mbJoa0n;8m2x&g!2eL5oA2aW|;3uGbR{?@jM{N*&Sg}TUs zW+Ee{AriEsh9>(hDcG3&R!`5z#h?>evqH~9@1I5TuA}4(^>dfgKbdx6-nuLySeD&* z$%`#LJ#hD(X#Y0_zjpbzvb!C~%@ZlI*){8*GQh**jGr55WeGPQft`^)Ox1<${OK7I zG@$!dwYAL~t*<>Vq#~q;E!x=8;JvdxzU64%&Yu`m|F`7iEQ$URu&!)knbYtv(s*v@ z)C_MjQa^|jo6!;u4v&3u&AlQ0uSLbOH2fb(qZ&j_;z==+NWUo6zRF*M>2vPi*`(j% z7%?`j+!8~T!}iZ|vNbR@Zjfr6jeiVOvL_*s5KxSu7OG7B=xVi=`aj*Bnecy`#mR?5 zo9eiEd!+X6ZNSzE`u%&+)?7ahZF#gge2SFRtzCaScR?Go0>px*6&dUc<`8?dBJ%G) zDRpYynBP(+MoyO8gZPzg##~Q$E>Z2V+V@Vg%27rLjzr`QVP5j4ig;?6VP>2-m`oQ6 zr_8{_9LW{B$gTAZravETn8B^0qZU(dN_@gslOoS^>zPzpQb9^N6T;T?dOyHli2v-^ z_eOMK;yo5_ z1mj$d&fXp~<(t6&2up*-Um(R-ET+8!PbQ}o19^>fWs9Y~>NjYOf&5ZYNBc&6*tC%u zn?jMP*{2`tCM$QppXN`$_?gLZ{71)4IPdNwo}CeW2Kq4R)DG9FFwsJJT60rb3tW+@ z>q8QE?Gk=2+fLlay1((>-};)Mw89qm+vXal(%5VyW4!0{-FCB&_sSbXmSsDxKfb7x zH0Y50`>R{5T&x_1?YFk1E0S_EWr<=lUg9XmF#2}=C4HK(4kP%0gLt8#)Ph)Ei-=|U zAnumb{FstTf%${LNqgTX6jOrM@5Ol7cfrmDa$OA-=@y2^21v-<+N>Rr_uk8&R}hNF zgZKWzY!~2!^^+L0IWi;!k6&bh9{Rnh;q^%z0aBOIgO5bJ0Fe;Mgt8Xy&aWxs>1acj z*~8C?JoFzs2&?s06BdlZY_)tuz# zk10DpPc{!55<+M0olafMhWQPZlreR`8nYyo0ApDbjSoo(`)hRQdZ}|1^iI=tHR<(! z!sV>G@S4&g>SR&uGm*CIOjhq*?eNXQ+yUSKRKFVrqQ6){KkKwRWM#g3ma@juJtmoW z>vY6~a4XBIB9`yuW7396eoZ5xgPZ(?fkeRt!ywEL?YWwSQ7}L>Wt)nRUu0N|-MZ6Y z(QZ8d#UD|-I{0OQ-mcCPY#yi~Z_hMnhd-jF_gmGZoyvl_NoRSP^3M)kUF=Gw`$ikY z00fWBLn|}OEp|aR2j58}#sy!-5Z|r@?!*m;lwXm4RO{Xo7_jVXRWOF*12frdlvFoY zz;5<pJ7S?wB33TaD zJx@C{r834f+iT-b+4!PLgJ#=|C_5y^UOK#kwN~-2f64@qP|<|POMUA*d3@O#mlfAO z#}f&=&n2n$S+|y`-o{JG;q;w9$iIhltay=?2$w8+$>TujcuO^&W59JL9y#*XUv0x+ z(G|KG`(u+0E54$*?B;e(440jwnu(W}D<3)`x4z2Gvsrstn{9TTZsRN`XM%3&K3Z+; zR{O&+84{kay*W$jry|#eUtm9$9_t7vc1c-lq)kpa-oWlCNw7t<-u4h=$KKWv-sYPP zf9h|rSQOMUA99JNXpHoo0xfHnr(Q}CZO zTq$|Pm@b{aL?HgEBV&$>Rl#26^y=q&YGn4q5`%V@`c_pV-ZjjRWb8eLT|Sgs7J#6| z1a6^{bgv;w)gt~_*n3<=q|tI5r57d{ABC{OEGbU_^UDZ|N6NT0t!+{T*pA!VUkKX~ zuQbI~Gn`Mxrjl^Iq}CD+u4qvprH2m{dS|Ceem02r?Ep}Yr*d(88)`j<;M-cdC9T=A zQ`c@J^_&2y#3T0JyLmITTC-V*hR&zIuc+i5x@!cDVp>IXTf|$=0@LLHk$45{AhFgl zJ;i{TnI1U!H%2KD6i_K_@z>sJzTLkDuXUTrlB@MQ8^}Ce^j8y^kLAM;$QIA4*8c`z zb#zExalS4}1X*imn)PH2Pi+|>Beparc_aiseYzxd^9jf&+%o$9UA%iU{w>~x(e-`; z`AuaM-lA!FWjOJso~XMWlh=J3kf zkm4ZHshiP!5)H;Y!r6Q7$nZy^q2lXRw|_Wj^{I80pwM_dP7@;sRg)0LH$zH*1Z|0U zJwmD^C&x!yg6}!Y%1*C{_k{uk(}wgAgo>vw@spzfh%ZH+@30j& z-`$H3|C#ybk-nmuLjQ_pn$+5K3{H0d5vssOVcgD$I`_m>Z+nUAfe|euUKR}^=cFQv zf=EJWKxU=O^2U5}2>pwS(m$sL_O3)K1gK-nUbe=i6@LP=86iA)eaTT8$>Or~dB^nf z+S_;4`4TVM3sahOXP#8yhp>%NSSL3ou*V^s#r5o|r1or)4>t)5ygb!(L2*}AD*`Y?~2eRk6N zYF+BZMq#}sfdU|XMTfYK*h_>?GeAKq-QGHWyxgxLn?-b_U9qTM;iLTPxUusxjM)OE z%5v%L(m9>JX2gMRU3rd0;RL2)Ir-YRmjoN;s{~~OHa#qQl@rPm&er_v7T!+t56c%a z77m3U?>S~hex8?lR}+T^!!AJ)iv7huCgh+ZV1Kn%{}e>ddK*AbH%#n%%m%DcUO~57 zqkeG57tUIzy5gSIV;*?_*LTR3#?>mp`)pB&_^f}BinK|i$Q6BV`W}c;>#o-3SNXK* z^4@{jE{?3Q_0K&b2c+&)f|;1!N7LHXCBPgDX`ZE4XEtE@rW(&Lq$G3*KLQsX*r{={ zcUNW>gh)g{E)x)yVjrusRuPnX0R}6$JDF}`14S?hT09q!YSc^Zhw8$BAmqpOQK<9&st~(7q}>?g?x16_cxv%tYt}P$9RwVq^Ze zjEXVOb5D3H`wIM~?{>iF7qWa|=~nx$y%TWVX7UG7GwXAiI(R~rS~`LVo9psn$KRXQ zTN3#@v14%hkn*oCj=x~5b*z<_Ec-X3NN(1gDle7Wed`Y;;cZwFl~>u}LHs3|;!ok4 zxncYDjP89?1GWogT&7**?D*25Af^tff22yU&)!=@TC_KuGMbqr5RVS>-L7KadMIBQJea~m2IHw zGdf8tTO0tps8|(np=4RR_*UuFm=O;Cy?pn06@RaA zFU$HdI|y)Y8qtb?J?|5G{FXIA>bkRk1RuU;rOw+Ci)ib3Z9#Qo=X2Y6PEvDM^00x5 zq&zvwVotOMyKsfa+M46fsocCicq_?dM%P?+2&p;Ta=cU|waF3DHZN%tg$49;EaeaA zC!B<@k|HT@MNC`HSsSG4G?mgQyeWkTbo8_A`6zF)FjV03)hn4E(uTI!6LMrY6#UB@ zsfo4|{?gZhEKcI$_)lVr_gf*p@1mXUJs_mmoM1u9R$ z+;Y!oP3rpq?%IZOw!1B=v9t&r0;Kv^NH8)_n>lhm6XvpMwbUzxuj%(n%&YlJBKh6}+tOa4booyiLKKkctMas2Q zC@zGuZnN^-+ktwL?MiBwTU#VhPZ4PggT;x0kwT=Z4rp-DqMQ>TSt0DL`sWOyfE>l5 z*r@MLNlFm%@l*@I3*nNlolzf?p)417;~NJVNzzPdng?aizL!p_36}A2v9?a(ww2PW zucr}##*1=HLJb)zmgg>78-HuRnMk!6w;{V1foi}RPin`S0L%&k>1bgJit-^!FX!1$ zMzn8c^p^*kmW~o?5zDj8pBOJ#f&g@E8#NH6gTM8B?T+et4xJSOJ^@7bJ9MY>hESM} zEzGxZo?$8Va_m;;vXu@O5cYpwuiMRm1T7d#won;_F+M*mHmhZ~0rVw;K*( znwER`Yra$@#wL;Uz?=EhpxT$ASXPl(bD7^d$U=KiePlybn9EmxooMQyMi@O|E1Na@c#X4eAz*_5b z2(WMAl>8{P;+z#qRP#=^mwAG*h=rpY!D@Xd^zd8QD~K&Y*NotdO@@cU6wX-L_usH_ zxyy3L%9@FLf`>L8*Ylg5iz1kne~;7DV=TLTnk84)vc97vIrc>yEC~U*Z%^20#G`;Z z2aNYMd>lWh@%Rx_B9QYoRT9W@KU6~EJWz+GPjX122p;g}6y&(e0(9 z5Y(aX9}KU!9Q|562Gvf-9wpMI9_Mkn`ze13Oju#w>&h%yFMmsAxZnLn(VFpR7q7nd zW%f>y8!u0!u_?$(IpcXk^DB5^Uyu$nlBKCj)y#a}%5YuydTkm#zLT#qTE?6{zKk@I z!=m#==A@3x(Xn575XHOyv@{?^N2=gso>$KEAsc-3ha*8C1zZLZFp?cCoPsto*mIIB zI;9YPSo5!J*M0ANOICfcRKt;RZ?s`2I3z|=CpVK}M+;UV*--e1Wp`^#t2AKpM%0vd zwwz7n)?T5`mW`UE`dbhv>G&NqEU3J7{HI(>+nz>i5Fiy(cj8^wp9twH?JsWz$+!~K zf;prrwqNDQ@2E_%?zX>s)03n2ETz!JVihNFQQvPPFgVCO7%6yPyk#>}IIjPA{6WIR z(Urq&8}%c;MVx8+@K@g(H^Oha)GQ$_(99N6^U2Vb_2-B6_f%NzFp|cp_#g>g?qW}p z6nlMVW~CgVKH82H3k8~~3#Ko^$5q5GU%lzx=eyQvgtmV5#zmT4TpBJUuil173}bx= zV@|shU0t#@Mu1&Y+*cM`E5bi~tZ^irBAj`vmaZKZP{z_5)^XN@qx6O>JYk&ub?f2G zP5;u-UR?kcPRY$fbaO|-jd}Z=uaSsnC15i>2TVu#J_Lqi*sy0i09HPqxAz|>Ew7rqk4e6}{Q}=@dzJFum_-PN zn2k#g+br)&D|dFT&JS>a!3R#ADBOPTUv?4!?Yc{=ANjFMKzIAMzPt|;-YX}-a?{E5 z_aF9xhBjLRmjBAnl~pS?->o7IsN_=B)hqh30&ffvH3*|I`oQ$=#72R0(eIIt;w?rC9Rg!~X1h9`R zj?z>fv~ML!{h>ZEi7M<;b-q&$Jn1$$F9DVJ?znejj2nK94e}&oFjg&PcF*lW#_fJn*dMV7-@^!Stk7GhsPjg90A|h! zxfznTeP6Cg22Ywh0B)kmlf6$cC>rYAlgfVXg#jfYa$)f#_b7smC+X=*n|U-|;OgC( zf7W8(ar)RuF;b<29_1An;Wgg04&KpYdpYNaGrc6Bj4P8)gE%rPfv7mUkkBGZovAd}V%f5!#V6J{PShM@|@9To0hQ6MBbgM`0 zF<-Nmkg>{JJQ;S-Gdyck0<%ko(Q@|whG%NpB4@}#NVj08tL|CybZd%oVvqjT9O1+l z{1W|k5^(lz1gkJK%rpi!_!l2ODJP1@SYlt?f2*OlF_87P$XN(cM@aqWFUPQ7U(k|T zLudW6{k}n&3xbs@M_3Dm?>u9Irc5W>WQn&MBS{H4sAb_{V)m>%Cpi&48HQip$NiyX zMQJ?0-3ndiGfbI{0KReC^OK`$kEVB1H{*}2323{!DOH3sG!qNo(L#GSzB%!JCJ@6km;;&l+_vJMbT;F>+i-pWsEa>Z~ny+a220jguRt z7pM42AKvsJ^>8nNMAcxI(;Mm|hWNSPYC+`o#udo4GMaoUW)yib5d%1Yw5#v#EE8Ya zcfxt3pz9AYvjl+uc1K#fc`8%8sRPqJrK5yTVHbp%m)d~X;R}nl$lsK198J}2iIX#9 z%u=`Cep`Rn!Pb!#IDv))Y8;}#l>)!mZ+JTTX7b|MJy;br#N^KJQCZ%a7{Qn#H3Vv5lC>uA zhoAueILklD@y}qWS(} zmJ7PUbN0OUf^*jX>4|n6v&Q=A{~;d#Z?Xev_n)X)3u%^%CxyupJ~EmrWsYaVh46ZB zzX|cATh7GiD3?aH9~R;Jvrt0DCZBCw_vY_YB8U;*}->1AzG*7XkQP0TQY&H_T;yIxFsg-%_{D#@Q`S{ zHh^Y|O!+>2Xv3)E{fy^QtP^czeYavhhr)kx)?epO(89R|iR@Du4bu~} zptMt_cq>uas2xz3Y+2kxGA4;OZNHs=Er~`5-i`^BV6zo2G4zg=6UPs~prm zU@4dE2?4Zylrbe$#{Od0RkG-uR4v{$vK?vRRZhKQTL|JqG=-!%yxV22V6V|)GqxC8qYy zsb2B^FMiBJ?(3vJ6Y*MOGlip>mS*kHFX8m5r#pZM#u#qCt4fGKQv*JV$5mDE#xp97 z+xYX#MA-!k;Jj$uh%{})ndQ)}Je_<`w^#hg{Nz>GivyXLM>+m8a=hEB)za64u-Y-Y z(6y1yxU(ZIwE@$?M}W6@dgjQT`cpZ^(;-#ALw;KIyPpC)$c4<4)#VEgEjYU3$Vd$+ zPL?X@A#vv*OhljN!zfh_)JHzD+3@bInZ-omTx5LVmQd9=zs^4-7TPy&YyL^m^!$zf z#0w97&AC^Dr?8vQCS|U0$kNS!vXf?SaeNl)pu@0TzN0z9AK%7g7&^R zz7(h0=76lq?jQy8@<#I-_aqH)XXfIX${xI6)1}K&7>RECA&num#E5Pbwo_GC z@p@kI%-rdO`8nTL=@s2^qFZEfA;r_#IO+)BP$0d?I{|9*ZHr@&X+;p_00(DTThN9~$@-a2D|ZDryW zb>`eI?BMc&uxqHx?4H_d6flGEE>A z_9Ib_N9FrE{zu)b%zra4P8R5-X)B_^j<#~*$zmiWo_gqC(bn-|6Afq8UOJ^hO0;&B zXTH$DnO{lg+DyOiK2bLLt;q%`tEg*>8OxUBkM4Uu-1O6%zbzPwLsxoE_6|F7gTw!O z8JGOwoiaP~ok`X82{CeuaqwE?M(?U_Z=$>|&q)j}FG+4=lM^MdcQW5ZKs&!^E1o3B zWcPg=*&pSl$l~mHjWl$~GAEg}yCT-UoPztl4?BN!yv~SkV;ki1zBeTS_x!O9{$znB z{D^t}dqrEu@LE2j?m5H+Eh2>L>0XAyWNC9dUZY4Kt=N(Aqx98lE+7tqyEX=Qx;Ey0 zw@g=5yhS7qY;zaF!xPufM>FZUEsg-&;$`5~kJK`~q*2>vENCdzfB`{k*{7f-6WrS3W? z>FZDtUxB{<-F&mFz2(?8ef-O=0-?@&89Vo%cZC}K`w2dHAF^@zbfivbM}(+*%b$qP zbwP(+KMwApk{I}_ph?}yi!2h!J$V*o`u9fsCrylrq#iunr3Sh|BeRs=2!%R|u3vqv zR!Ao{kS_YId4{>0j?yX*ZvOZle8-EfNbn`-MwS)C!u)Lc(Ot1_ugtppgpVX~Ck1s7 znQ75N4PBP_BlsdqsRo-?^gAk>R4RutY`NgUJ4i0NnHXENt6ccWR2#ktrmB=_e*4ct z(rnmsO{$FT{9(_|nS*%z3v)+HUV-jUdW=$gR5G!rq@Vg3DuLQ<>?O$(?gfeS(Gf+4 z2C^y3;*b{R$=TLTta+ayvDDoz=l}Ks;QjxPQ3IpY8k5O#;yEWSA^grO-`xQaeIE&l zPe_{*_&v6)0pXFSk|EBC4v*(Kk$=T<`9^&rf`SBNqNF6L2r2#z*lP11J@FTjc8$J? zbzrbVU(sgd!VrnWFNHCOo_xO?N=5zql z>go%SJ1$GVK|59IcOwQ<>KF((rmHfKiWdHwt@Y(iH6i*36K0j8R>)1YPEuWy&4yWH z*!%`qu+yh_uZMiAqt_RCmeg{%Yct-&@cu>53-cj*)?ZC|T-m}XD4xdl++KF_gy`1) zHTH0WO%UAz!|7 zI&*j_QI>W^yk+q(Z%6BB^$N6VWUz_tfk(`n8cY3sadF7JxvT2f1^y-kjm{mqj`r%Y z`C90C-wMe~4PW{-HjU#8{d*$f#Ao2HVrc7k{2pI3fn_HFiarJo&RGi8U3PT#jsxo*ww8*M4x>`1_EahC)78@NCi6 zTjSfR6!Y0~bz+CmH8TCt)6aS!MBqMaESv?w2;=gcI}0i|W`rWiC6W@8iS&ziWm3Ou=4oi^W}+2d>L z$kF&i!bfx&Sdko$80(9DhfC<2^Oi|PZEm4pJ2q@*|7%D_=;xg;mB5~&b z7MWN)mA=+l5cxg@hXVL5Nb_*1=g@H%cm}ZNL{M+PIL^{i?jyj+2z3a{wP&35@Tjx( zJCLktQ0vooV57MjuZ<8zptx2I3C@7Ek|iR!YZ>ttRo(2du-BNu8HsZmH94wIx~9AL zma*mjHA#Zy5NT4WbZJ!pNiWcLU&O=~P%_(yY>V^#bsMx8kHc(?m%WeRRJPT0F42Bp z?04$wYeJGbjuCAWklz?x-63jaM@k?{*EiBl%x{bNOD;GNYb>k_`&^D-2UZ_vLe$Eh z_+ZIy1-ttzlN-z#YEOp289NRW*2tDwmAx*=*hdYctd&*Af)zXc@#|Lo#gm7F-DsHaQ&KdC)!a^xJ+05fdkHR&kWf=rY!G2*6 zK~7)O*;fa-`y5Z`N9~f*WjvQ}9fEALwL^^`_d7NSdt=l ztm={bh?6-5bp0qcUk}?cKVjTm8s6FXmqHM3)LE6i$|9gl0aKAlH*sc8p|$tg#I&}I zxBEc5WX&Z(B6o&2Xkio9Ku%MtN=kueyr*ud*Wq_eWjN8@{;5#UCpiQ!2BoB z&hfXh7`tuV=+|r1fizv6^yz&?U?@<(~o8s;Sdx&7d*}>(T@s$$Y&>0OzBLjk%4m&uKauy zR%<&AyZ}rvBS>xB3UY$>!k@LeymEti?9r@FU(E7jgPv^v9A}!V8t2 zZnGDz2OE(*I*80bezmsqOHD&&h%m)t2%ev}o&0NN5`ARkMXpyJto8#Ixx>@^hb>w> z;Zfy~s@K3ScmAOv*jx?2mSIsPO`GulkoQ($aV=ZBFfJjkQy}t^61#X>{-Vq zG+T1u2m4D0DDO(k5?8fJc9(joERpuyZG7Z=5H-_2I^jkfx^Bj_ z|Af}ugLc7bpXtw?SCW)Lwea!tCbk&3{kh(^8}&7l%xnW$hBx?cwMVnMkq>{v;zK(_ zexf7=v)-dz?eFi9JC`Ji7|J}8}mDfJA{fsvA1X3xvh?(a{F;nAa_d{xM` zbSZN5GOe#%Fk&iSchD|$YYe`|OT|*y(@t$@f|eeYxyfVt8*>`yEFF$WRz(~qe6Nub zPvz?Y)aw+n(t46T92wvtv5YPuS3KK2&=j!G?%lh-aWvm`s%ZcE@x4vH{WN^%V4|DDE8xLhT|{jsI14S$Y$FNEgAOgZDh?9t_k8X1S0X5&W|y8 z0#CV$oxkX*P6=gzeK0iKKf6qjDe4t|?LVh%F8t+%!klQ|SFN*GVb5^#WHJ)cy~ngd z>TR9FXPd>k{9&CfqB-a7_b@lH6+EHk3kv^H#~Na0R%QF_;LQ3%3&$vnD%Si)f-aho z$%BIPzfivu1XV(A0R6c-RD7!>f4L1_-3YC>WE45%$`B3RuhK{D2Z+Ck7*LsLZOkHZbY6=Ns?2Jhs)I4e#zV_H*P6c0_ndkJ%%V-IEvx zr835M8fh55B4TghdBYoTEug2ooq7n*-b&8Dt6N$(q`X~k)|$I9d*_>O2XAbAV{#j# z;eJJ*^Pv*O8OXTgbA0ZtUBR!u?NNel>2=fdNC&e)i4l1aYY#oMcR5N_Y!B-q9m`Y$ zxlHS`AwvA5Dyee&x)MRR0!C1<%A^V_GUfw$a~*K?58lq)3a%0pr~}P3@=wOR8KRbu zrsrR7<-hgqMeRghL?_3VVoY%xJr_8;Y@YeOs8s9xz(OWv&*Wq|nY!mt!5OC3YJ!a- zD3sD9Fq%1Kx6DvUMAqP^*S9+|g!ooViHP(lLjg0+i#?pd^ge=DtX=e~ck(7bv38vhNRMn zO5{FOxcReR|Acpv5gKZ;-8k*}5$CBhc)YJv(1X>?mGF@Ud5FWjE?zsZp(Bp+&dh)r zm8sEFb9-WQ!Rn>vQR&&+EJq1}dOzlZ8lIwaCGNIauje z;;*jS$W!Vfn~Y7E-|{*`l#32dEo-`h7Q_@+uFrt?%t8J=2SH-DC zeNZkNLlzf4RKpx~Jq%Ar<1f_RX?clWl$-cLT#}Ga3{3Q2!K$0!RQ(tH`OA}&MLK|| z`BIzY;9fkmo4Bj+z=3$@v}_WJWHu%%@wGbjR7U&ujZ;yYv$?d_0y{O^M9|EzwYehdS%?S9-PhCR`cVH!FQFl+AAI>K! zC5+Ip>8H$u&3dM)JR#hK(Tti*5xUU*hT19XVniA3e`dOHlEGE1=Ju%abYpgmCtmSj z&lv2@fD+<0=aF!KU&ix);s`_(7(g{Dv#p00N6h#yI2g3(MtIEY;1gjj7C)`^tqf`; zMuibSZf>UMrmaPuvEo2H6n7I1Yaa7_f1T?_t;rK|Re*2+aQ06ua==8V~t6>bE6> zh661>H-ZZWn6T}yT-|?A45$i?Q{*IGCLT}+8$9^jM{K`kucqFT;?6Y4KRT#kNFM-k zo+mc%FdEDzI>}VH2T!`~A?1;*34lr516Bvwz;sg*qb{C87Y-2O?a8EUdsYoBS+n^= zybDJ38+IZ#*h1wZtxQn_@2@4~Qsf-JGu^ZVXmR^iAI?6y#|}a(KI55M%Gp3ASlMo< zF948(33cYV#c11KvWmn~FTT<^HfLvG{;Li0;45Tv8#7Zw;t2Nwlg007TXIT<^ND!P z?x?Rl>|+-PwE{NBv+yTxgr_p&Gsej?*JlfRN0LiSU_Hz(VK`D>Mda@g2sA|TjR%Gv zb;ZAj(2>1WY5U^$4t8rOQyE$khtdtF<%x-8ya&Sn?9DFDk!LW%XzGCOFHzSHJEQos}LSGX)59+YVaE z{;^_%FIJ3`_1yNwiUEP+o5>w_r}yFd9V9Y$?(SAulGuarbw(96u|rFjrSplGB|2Y` zB~6Jlv@X|96Es67-R9yike+0bBNQ%>YGNxUm_D7=`)$46!X-01x5>&O*>)qs)0+SO z(|C2SbU_l*Ct1HUnY-{R{Odako(nt>4PJK}wWLBhc)9Gln*v+gh`8Sl@w`+MT5?W8 z{b%Z-?lLk=ZbH8vPq(fnY*n6`#H+e6bs%rCudUCl%uA>@<+&bF@gX9?BZBi0##Y9$ zI^=VsV5qyx1Mjb|js+hoZ5We%atpN{hd47uqu=SD=mr1q$o5n<@yWa-R-D-KUIQV2 zPi0}mFXBUZO6UbsytqUOyOqQx`aw$BG-k;`}WRBkr+3$}gzf0|uI z2WBr88UD9=;Q>*)J|m=E4}OOmq$Ch%FNpnAFHaF4*w1X3 zDNxTkZjqyPP0WdN?O|@-gf@4ptS{DWc=};*ssP2TJcX}V1h#}8AiR_w=QI)48--imh zS-!43pt2FeW>byzTliy)e3wDdZt-SnKd)6|CwiDa2fFJaH62kl*+~SmW+&KLBralz zqyE)s1H`9f0`{sfdF$L~Lqk4)+)BB@h50q@a>Vh-eOxA-74G&=*gOayDP;HcG*0Wa zPfRQvlIiSjb~kzQqY_b%RmoprA82?73iGq|lVKZB;QA4a(KNbsi9z}X+Qp}+X>y4O z5(U4FbAhN}zR6>&eTjjY$mCpe0=Rv{krfk5uZmu1l{Q*~tmU8-1m?W^;6ica{egen zJ?g!!pjBHmvpxn}slk?`?q=?3-fOxQD@2#o4qi?Qb7n@3`T|R_OQUT43^H zjxh2%iz^te>t!x|u%l~D1$od}CV>bJRZAR1PXI2%l!A#?$Xpc=n}i7Iwh&fIdA*zt z)>yW0XQbr)^#nW9!Hr2S-+gUQS&y z_a)O_ANN{YZpjZ)$kZITeL!UrVOcVv7Y?h(?(Lk%8spKWexMa=U*hc{`9vwB*Bx+# zl1i4`6hI&_bS3N&DnLQ9|D({Hv^)qTaG<07CkjVs4y^+*H!MjzoZG-Uu(nSH}t^B$XSSDMi?^w?FoLxYOLsl)Nf-e$DB%K538 z)F>PLQA|n76sGsFr8EXMrmrqa0=0Rspy8ZTx?L-0>DNW=&*`m&o{Y-e_<8S5B`*2Z zcU>Poyro$lcd&{1Lxp@3moQvHGCX28Y$%J6UoqULA1keoL8JOJL^p+0s}9<-L%!`5 zoYZco6{h&^thUi<&2^~`3bNY?1}BSF=AtBVoULl<@w{aA@d648m(aX>s|IurOHVr; z#h2(DvY!J#Kk@KG5`#|fu*@iw-`f?0MwlK__tzS%ymu>AA7So>W9<{EU&oej3piFC z*wj+#Fve7Jf!q78!8c|~Y;2U_4&#SUJ(NIxyNm0huxjS{8h*eH(dxWsf>%JWh${L{C zGQV}loQ9MX zxvByWt7$pK8dsLRtsDmi;eHst^}$0J{}~A#32Ez{%DGPAHm1?9gr`Qg)+Y1K{2=SN zs-%Vc-iH9UIMf0Mqz|Afb`J&T^IM;f?;}nwP(7?Mud1!z`vmvn*bXmfkYM4F zP!%mDFf@vx{7#0@os+!n|3jMdXFg3jXWvD2vIJl4f*;zK=6}%wCt#u_w4s@9qG4hM zq!2z$ep^f^J3dmGE}7;FO0$|a*N|!ENW2p(g{fSg4Efwh(6BIR#ttnCAPK%qGEJ7h z-@!@N0#c@_J@5Px!<`gsuiFuowu+o>O2e#J*7;4fjbiR%k_$`EPKC}}=dagFX(O&0 zh$W96-V=dp=q^{81kAGN?B8O-=tc2P#aK1aP9ezkDHF8(|`N<;(ph<^ZUa!la}Ay6iZ<0 zt+bP#Evr!RUZp)N={>J)?=C`Q1{h-6eV!EIC1(mr5}qoes8xcMWBwTtacul##EZXQ zfuv|qHtZ&23VN(`P^fU$GJYpJ>CV(={LuUEfB8rbnpClf0bS|xdhp^);->8sX$_PS zO@;yuv=gWa1B*&ur1@0|FU6gV6`p0CurHLOUCz1`Uu?+vOR=UkB1|{G-0U5!jTQa3d^R$>>B2tx_*c zLBFDl-t}{Ikj1FUjoPg3!tq{&W=m577m46Nz`RbQp3Qp|t;GUx{Ce zs_a@1r}qCEwH+297*)^%V+(Ntn&n~#)9Ut7S>4wbZM9d`;UI^87D@uc?P>qlJOuQm zA6Y3JvRbFUdruj9o>4lT^H2uFezv+`&hsm`W}Wx^R+0LF&%I|ZNapeTr=@&0sG!)< zpd}4Nue56ZF7@;4bO0g@YR);k$F3@2fH&x-4q@?DA`m%5YSk}=74!jjX7MZ0n*)75 z|Cf;e5qam==*}Qh&2aQAI`j+O!JbzKs1h@o+zK{hedXLNeFe>A<5i!EZ}^wV{*v$i zS;+r_o;?`sxutj6iocqm8yA${)mqYf)5wiG#?ry19~J$V!{(q5g&Y_C>ORqbUV<_f ztMd8?-ldSQ-UEXZLf^8_i>uE?o*nAAHciS0Z9Dwmo(K&}|2AX{zm$Fz@xHhc=V?dA zP7)!jHK+M!X81n#j%wig!&>XfR2lTQ1TRguqh6OSa{Vt8@!#(aEo?%0@zW4uOi2!AbAw@U{U^`<|L~;$AH2*8njcf$Pb4-?H-?Qny$4p_ z`O_z!wj{E5bxP~J>u`QCM1Dm@c@86mkBh%^PcOU`JU_b9#f-e_dr9;EuW9MDeK}RK z@rfoJ;jb!pu)VJHdJnvKZ^N5(){R>%njRKtKPcnL>jaRQCez%#azssKS z{xZ<7-pl6KsUR-GS(;y8`tig2pvGj2#-hCXLeCqIq2lNUi-w}Sgo>{f6@6a*{)~PR z3;#uF?0jB|m!7JW>)8K2Na#^1zqR7=TjYq6))l-ppIzrxWG@c7ce}Q>3cK=(Q=%qP zZtY-9hNmY)+a5PGDRLhR@$(puUt!|XVB9ug#0sZRPU(GWNRf!Is)$v#ja5?jFC|p5 z5|e(vl72|}0UQFTl@H0b$1 zg1p55#LK&L>mRnMWVW+|GynWq@;E)^tL1usHWFEPw(f!PJ4>?GQ&wH2R7a(3?(Lda zLE8F38rS}>=N6yIthKb6mG;5|jrUXw>WoRa5t65FkVV}gGc6@Oxf`@RRoV&{chw#5%oM9Dx~Ph6i7#Y=lek?kZlkF8EH z=E)c-Q}nHXJDH4E;};p>jnzpJ9O0+KA&gks%Q&!-BA8&{e|}s9_+o+Yy7W8L|NSpl zK7bkpAvd;64zr_#Sf~V+Y*FD{qC6X|x!qE-c`O){K9f?p&tXy<8@s2Cm2Q0BTUdwXEN_65Wz$54!yxRIhPW1gt2CKs3K zgrfqM@Jn@?1xHgtT6-x<7#-dRsS!XJkQ;m+$N=SZlG9<~C06u# zRwG_2x|^#+K{zrcV)c^PZb_|1fW!FJXW2iQR9>FJ0|-tuSfI- zIeEp_7e=+eK${V5A__~ZXibR1MLZXSe#ry*EPkXoKaIQ{U*`Kpy5~$xw9rN(!55vX z%M}Vfjtr4`Ggb8WEX4W%6Mct$$bORkH8*Df!SCa9i`G^Qz1^LN?^UWsj+0I>BpWK=aNR_ zf{Vtl4i_KpQt)x681~H8iTvlpAR<6JJ}eBcE@-!ZIk2XHppP|sfaVw$v(Gt_QOYzd zEMe>e=?C1%@`s{*BSitl4hc+p5ugfBKXN3+xB!7EXueyIY(=>|rbdcqD9x;da}2*b z6|*-rjv~_&Eb<_h3YTc2ptr@Y>aH-6R|q{P5UQj*uV86%E&{%Lmq9OnkpnYj-_TBL zg|0ZRny7r;OCI{knWmp6$)6n|UF~4lCEJlP9V%aYXa}e{Ch%TNARDBFUuvs1Dn-W3TvUHHlc)o@F z>Lt_H#m&0~@+`}o3ia3xOEknt^eeL-?zwF9yi9=bPA)2p?yERRNibt}-TZw)b3dEH zoN%lPSjsPl@=G6iQ+}kFScq(e_g>W$FFimqLL^zugcDe0F4Y(DpiRl(F|u&}++&@k zIuOf^ln>Q8O!LYxH&nxses{a_seb3tZiytkbWeHfQI%2aQu!V0S~GV0Z!rrS3pup` z#m`kBoHqc$o0!AV?jxh}5VG z!uPk|pJ*1ln-mk8`WG=_4tn>+lC-d?I1(l@IvmF$Sia+3n~XZ1Y;(J<$AQnW>lyyW z3L9>KoQN%V-u;)qX2nK?yd@O=7J!3+J>EZ1L-PS($N8Ndai99_(8{P(?P1r>s{Hgh zLBc1yB@5cgOd0X3I&T#P&hXxZ7-SDDH8&CwJObHLFmz{lJt;$Jmqy5d`Y1*ZfUIin zWkF2Dz~J|wRI~J`*gMWqWbBCwjP=OH$k7Q;=qRZP5GG;6Ig=M*3GNd%&%At{U(&bB zCLX-x%X=i56vSLgf90R*uTG|}+*HUI&g1P_f$-gVS@Pcei$rIvTvO!~qpNq&p}xV2 zRt7suS+JT@q9Wqxdj&5sy%Dz!307Na;lQ)wYrQX4f%c1R`%S=^i0NY7n=?Jk+2j1)rZCh$* z^gZ#@>Iv*%VZTXOY$6@646=(`!S(`x6VRvOifH*;#=Ef&hz_$N2E-#29V4X0o2?qZi0+h zGrv+hW7$HdU-pw3bZ22{9W$CStPeW2oqWr}UNyLQj#OR2%?mJ03oW;6{lG+ozs+2E zVv46lu%ntLgBVsU5LZjfyqr-TYTxDGPO4pGzL?65fHh1HVOMS>_(;{h`kS_1e1f#S`PYr%#Ev* zC6!T=)Frvq?&T*lT)q3}(fwGlw1{q5W5;LK+$exDXlc|)tGUx*)L02rZu$|O_g3-4 zYki5MTRQy(;kbg*F4%ua2U?S;ardhb8GS@~Y$cJ66y>H%aWr&j78yka<`M%)f^BK- z%N%v#Yg2pKW$779wQg8EMx0eACMtd+KA}h&U4qQ!4 zEaJA%>CO8MkLUWDyrPMewz<%BXfFoVtMD)Tsw6IgSW--pKLLdbU&?A(U?e;Y-l_HA z4rOzlV6+aKsa74;2ooprLxs6b^=t%-X>K&MvfDsvGZ2yI_*UMPo=c+f@iZ~bQUNv|gsVVB7>wf%}qAnh1M0x&R9j6gvuTH8h)VYp?u>@(< zR90?on}nMh_vF>NJ7f9p$JOxl$q6u!C&ahZFp@|iE)8V}SUTbhJiEk6hrm}Ik#23f8n1JsQEutC16#u$DgM4_tO|7wWLZdME-Ibidz|`m7$Wbl zyHuKFb;&764EAUJQG3+udxpLcm~Xw?pw20Qm}K`$@LSZ#0dpft)_n3jtrZ61NTznf zVvlm@G$@Jr%F!XTSsM*37@Vez2m5~FMTitKB614#P9>N~&A zHwh#5Z*MIe4wIO9bBLwLLSAFC9_+tBk^ixI;AmL`KA;haXxz|?Z*v$^rc$a~4f`;= zK~1;Gg-7Rin)6I%_P8~n@4V`#GIx=8AEc>bDMD@NDM}57E5o$Q7?9#EEpf)ldbF^6 zo=i!POlZxd@Hiz@VF4dN_T`QvMoNb3q6|>7BC4nS|OC1Ag)W} zrJlE~iIMPB6r1|ReOa9c}qz?B1cR2i5b7*|Nt)o^Jy3sX})ntT^p1_A$STbyy9{-$;4p{$Ph_nS1;-^ zqZ;@vxeO>6v=RXNT}ik5p!&>Dt)G5%MxCfgo;KfvW?@U$bqZ zph8TIU2z1b1?Q|V3LIm{;v6}YWc-1pG84fMgT-@~Nd{r~7jw>#hC*0@EZ$eBsSLja^ffSx*if>iE}pPE*s)|1M_*=N)K&k8bcXUc^fD^M&-AeQ%hc zx_YSgwZH6cKu7j|j0&fRqq~Euh;~1Ti#SHy0(+e*8 z*p|Y6#c8v6Zm9}=>{lp)sG+!Piet{{9HpR@cvH$>!V=MXI}I3RiU!~~TglBW95dA=u2M;Q`2+@)M%ma^!JMWsFsx&ubnYmpj7HNyD9ra50v z$iO_37^DqN)ND2k!l*7e>-y9A3H5}^XugR+DOoBm@C)$@%zR$}SVX}%D)N3n4}CyX zFfCoNWVcR#uW!#ihPzT((r*?`Q`~llNcqa)l_hRzzOB$}v9r|h|It6C7yTgd8##^-{pLIrU|Clh+DS@`H1tI>ArhV^&%RCnI{lGhN4()9BJH}17isBA zK+vPGe9PO|W7Ls$5q{2Y<1Z$Dbt>Gmiu{ZX`=_4{O~B`Ykq)u)Ju{9ri1gVGZ*f0E z8wAb2=pC%2FDMlTmoeVIo zetr9x)Y-rK+zDK-)Fh|IvyP0}=10{;tp6G@)G~)c6%M^-(&H}+L;#GZFCq%Cudl&{ zIe5dHnG8Sc9xne@+km-Y7^Uhseyu*uZo(q*-l!R0%&P=LhR(uQy&L_zcjGHppuu*8 zem9Y_Jj@Jr^;jpQih&*YQC%Wv=9kKa-`M)9)3l)ULmTew7r9MI&#!+2axIjKN$XZ& zEuPkl%i~%})Uc|32-qme{Wyn@=Jxf-^jg8a3}nLr$V{P)li+TX@n}m#>9VpnBU*Sf z?=E)chA4}R2~7Bcx+3eW)h$0F1j!r5Alc)WgI5#6dDf2-K7gfAk0MewcQdeVvOO0q zCDY6Vne~Gzz3`2N-ob5I-sAOS%zEksGYu~LZv##2sp@Ae-iG(alN}i^pE|PW0YYMj zrL^X$7`|Z!swtq)f(dkGB>tZ3|CC&{IOgCo67{C#7)sR~e~3+bYkK_Dx9S!D-SrEU z+D`VN`91PZBVw0!np^ zFFdJYDiuZKst!*ntpoRVVsh|fS5 z;+XJaNG^GDqLd-V6|$6a6H_5>2W?;dM8d=A_+T7_NM2dC`L-x>eHQs>s4xPI=hVbM zyLl}m;H7>#Q`-(4N}D?-wR{_Obp}hF_ajUSv)Rq1(1b-C_vd8b!p>r%^6ErT}Ehf0I&c zLULiZ0_W6Y%9R+f{Q?;|PjBBEKfM3c@Pxt9ruh-X4(I7OmmGvU+wa>(T5+AqFWi>; zW@5%4$~qh5vXCl{KKbDI`AhmPNEzIT5pt`c&VpT%gbzy4WvXiSzJWdZIg<_HAE-VJ zgd@Nj4D4yJe-0WBsVK2mF(3s{&w4=b#Q10Q8#F9J|1dj;zuDD}Bk zU}DHRlRheWbWM$SqRxd-@B7nZ6yW?`&9nK}VsEWqYYvB`Y%{QCih(})a3JduOOH?( zTxIH9|LP4>mJ+0N5{7DRpp1ZH#1End6n{(4_2emSUAveiPWHGrz1S7k zbzVXM?e5g893AVn>4mM7whCcYHVBf-8X$EezGS)xWb+=#X^MD6Dy_Vc${q9Jw8#tz zF%3IK#3;Zs+(f7~;gGaL=AE-3qF*S)k4ol=G^UQ^TS3Ew>@bQ(=WAeZ1C}zIe|5Vi zl){A*LgfT~`G!q5r|x#|w(8Y2A;im{e&q57s6H@65;Y{-V!Q*4qIgZ~*4 zB>-mb*XbCcLVYL+twq7?TcAh0VlFwfUK24w~L)qiLJ9DThYl+XL&ayb7H zt3Y)+R>{;^K8u`UcX3#yt<2ULl$yg~-PFZcR)jJPKO3^Vb{N8)t#rs}#D+>K$GX*kza*eByXCO9$`0)p-A-vNadDh%3v$|e^+7%j8CSw{Rwd(6cl(4=<^wHo?h@tQ5HCFJ70Z4mqjTh)B< z^3bb(TJN{}CDhq?lnkcdKU=a>Xa-|(HviB%vE8EjO=B3~n;q^=pLJb#w*xLVTs~s9 z4B&(Sfli3C$h2vP*23a{%0V~+0JQVKtFw638#fZ`%`SA?G+4~~NFC_bjhSl`Q0fkL zBwbSVk0Z|@#59A_gYl*S-=7+vWAS@5H!5CuRLBdDTKLd10JUpp{vc+Rt3WZxwq~>F z-5V);>qV#BGl+#-8+lV&$CBU8>LmkGyb+;PJSXVUAFTnxkQkbRl4tBd@CQ1$yk-S68zn7Z{7;v zKY=4RFr&nie2<60DwU{oJHj?MC7$7wTICBh6$i?UUkUgsnY%J^>vP@HnKSc~OHt>- zmcezSYFJj*)$>Y2WB}P&p6Dt*m#pA-_2w4{SX`&3p4z~>zz)l=#rUVh(b%g$(Ylwx zbJe@1CbSE^R}ah#K?1{(H10z_j@4J#P)?FVj{yci6OXc=RiMiU8dB^{mSygvI;+XT zPirwAd1Cuv8hsvl+giz#WP1W-qL^dwtbv8_R0$ePvRIXuHF+5(x5vG zc*6a0kZnK!J1tkYs@vy^p6pS6{%PA=-p=%WE*{SF-?ovQ4Wvb${3+rE zNib)=yM{KUMv_&dE|yVC`%%NRQAq{?H3f(uZOdTQZ+{f;;EPYLL1rNIy|9G6F{RF$ z#puNS!LO017B+k17uc=SbVqL`e${=A9hUy-l``cp?&6g=6gYA^Uxd;rAn{omDwGCN z*kzQ(-;M3tx4KH5uJ#DMGf1=>Q@HMi_D`P==>$NNRulfa2B09#5n^R*t13-_oIuD1 zDzd-DRoDD>uMiX(6AX#cBQtcAK1*#oy=w4yU&dfFj--nlbFx{L{o+jyzwp|(lal%7<9F#@)p;j-B8fzbqBlmrmN7do zV;VdPWm2t53!yDOU%fRNTiC^CBut`qMRk8NO2Np1e;PK^DXJ_syLF~ES?|hpBiX@T z=&8$H=w(icmENLRedoWcg)WY&F3vqGs&``;g4KeIm`0#9o3+mU^D5v)8qg#n03sqF z_F4QdY50|QxZt<~;!5ix4eNH-rOC4qe%K3@JW z#nh80*6gwFIce(n(Ptq z8{+xa8Z2C6+?I0QDAhFwe3tT;(>=lX5x9J7)MMwHaH5EzjC$5pDW+dy)I8qcynwy( zkfD{c7Tic`Ewt8|Op`^aJP>a0@yGqi1$tL-IjEXd%@PA?Qw~^Q^;laBUGf5ADt~$Fq`xF8HihuvkjvM{mgdQl4sAQcfjz zIj9&0|J4iN!br^`C7v^4V5Nd%)jTmsrp@A-8^5mZ(*1Yx#JN4Xp=pH&>ap;s#~G1# zGLK}ZEil!5tn*6)!b-r3%S4>WxDIULS+Gs@Q{02+7*9PCBP^mi>GkkQLk`IalB_fI zAPPnnM0ku$G3aU8nrp&xmk)P>*V}~p|Se>akGfU2NW1kvI2nb z30wEg{B`->G>PU4EPm%;2ca>1zL)H{Lj)O>lXv0h!`!_AT^!V+0+6D~$#W^41(F3} zYchqCDiTIpz(N~!)uh*QlEhewjIXieSfD#fUf-L)h!5^Xmav2OxGxvFz@PT7(}FJ$ zv47=G%-`u&3G5`Wt~;-gDcv`SXi@9!#XFklXvnO)kqlI_^;xuBS2 z?2m0^KA>2A(;yyVgmMC1&>6G*4^Met^gVt;rJ_;W(bdnSmx4vdT7rHZgc%&d69eP6 zfCkf6va!dt3a_#K{b{=xtB7G090sKvt65-2c_&Hmz1C_>c(2>`3-z@Nn& zRbcj;IWbXFh0}$OC1RVr;0I7F1;h4El3bUrxj?P}DJ*r2Jf~&7+oc12oLqi5Q0}il z6+K`D5lZ=7dHvpLv~6rN`bC(lXqSu6zV#ERC~j26T#|!~ zrLX2xP;;B_!#8N3k!+OaM67i>SX{W~-?54Ax64-&YB*+GVT_kw2%(7*Z4&H~JjQEl z;R&yKpXE8MM7Xb_2X-hjAH-n}k@qtfF6;TC?>;Pz;6ek2JT>z(G&WRR)gxlZbhbeu zBA{@uWed_Ft@HXh?P&vRAutL4I_VMVF*OjY%u@R+Zd$uBF@9{AwWT(}z!i6G0+>E} zLr&~1j5aW}G>Yp>|;J&GlmK3OlR`b6QMiRw)MyQ8I4*+5fq7{yH z-WDdVKBHO*uLWWuWi22spWuEbX#q|8wCn#4s`h=gDe>Spo=~?PfMr!>`tHm#yX17) z62x55?PTAVTqe%Z4BWD`h)ed6m8G;uksyc0yk&FQ{l}7M6!lXD79Hl2byf8D5|9M( z5pomjS4}lsub=Z9(X)BeRzOzU8v*2m$9DvSd(fo-+lZNCYd|y_TQl10W!m-OaEVXD zL(rU8c;KeIaf7P4_c9}J2Efd_uNlvGYMZ8A8?{TDy}c3s^tk_Js6x<26m^&TDku6= zPdxfnt`=SR{)sh zgmE9t62JB!mJZcHPnI};R9OAUG-&(wjgJ)K+^0#ZHv2Dy=P+tyud6Ycb}z&-D9`u+ z374{jl2OGOR2KvzZpir|zToAucKtOt}PXNt=!6Y`^~Sh*uYWH3~r>2yU%et5;X zoK|=ZbemJ}iN-*DRlYF!@s+pf478Q4^v#VjkQQHsQ`mka<@2`FwIblUrg~x-VVI6q z(*bS78vmI3%Mj&xuYkj9JbBPvQ!23!RaGBL^@erX)$mZeZ|m%lk3$9P-bT@bfhVYZ ztl0coQLdkLar%$4oW(1LC_N_cUF<49YGY4wPp|3@>WAL_CbR~QWCvle%@7T7OeM4S zL^_!Jwal>RP<;DMHQrAPG1^t6Pvae!oL(>VR`NyPCFhM>zQ5oKEG)C$g33a z)_WSh{xUh^Mpys@Z%5TODBl&*>ufxmO1@d}LRxu3U@C58-au=aBxg}TCH#!}A|g}J z@-VTuP!kpgEG;#KX}oFzB4}|&u8hQ0t}xE=-N%^$>ym~ou}%yQzH7TE+TDIoV(ZP9 z4CdSBbTUK??@@&>EXd>pqrD(;_D%8~7ia-+)72*0ezj<8@XePcm9hKP@;D4#tP*(a!LVvo zmq8xvM_JHXj816xaNz8MSOMD$$M=_n`6kUO^}(*k>9i3no~bnS>0PZ9e&#;1OYU$V zKdyqg%i>|KXJUojO^C{DF`)X;(wc#B~Zm*;}u!{>PgIfZd zcCq}6#rqRrW3(dlP1gamu}CS-jMTo{B+xp=U_(iPg_`Y%x<)N4;+;LrMF8=#x8 za~B^pz_pUEEG~>HPi@AJ4Q8Fa6k4%H8HA68H_&~KHG)u00sF9%l{7t3F-1ptwODqoKl^PRQE4bx;KFT(aMQMycYFf1xuN=@`ajTAdT@B^H@`}Uqn zxduo4Rr~WxKYA=g;c;WP!D8l!&E3b!Yu}E2VHW)LZlVljhhEQ$X0`g=JH98^kM-3W zWC7*Tgi?=QSd<6pRTuprzt;yo|eIXZx~L6DWZVvW}Oh&e(Dg zm4!)Ir0hqdhOqV!np>jC+JHkVSon{^#9qH|THjypD4(ZtS))8IW?l+P2Y*7~sDWvl z#lN7aczAK54E>-GUMFk15 z!Xb35613ll4^1iHScycZTy2&X==k_Qi0S}g2vFz~`!{qJj^Zj)+Q4F83J*$XXt<-1 z4lVg`hTD(4n*v~BoDo9zG3eV}-qG>~=W~WHD{WVAG8LG9-maoMkO)!*G1BV%Qr?{f z?}`i26(_4|9QV2_qD*tR6~17>s;KWU5<-(^PF?|{6&^9J3U!{_`-pb)M_W`0+<>hh z!3K=nA}eUo)t&jfL$TMtP-N8!YYWs7cgMTF^<@v6MnJN28FUfoY-hdX2EWXD%i&FW zMqaWoX2>v}6XA)e0K*EgVzZ%qQy>nS2X&OjH6R4^E-hr}wv(RvEW1Q4xM0aWj%n8? zh>K8&$P+7II0t*`IN52kH%5uI8HF-J@Jpk+kB}6e^!)gR&)v+GL=5^hP|I(%GAMr_ z04%ZC$sJPYR5%^^X>KNRy;t|E^Q714vP^@f%Ojl_zK`#^r-mhOI#H7*8!JSbiN}Kr zWk#91l4){0gFOMw5so3i*%=}Zc3`45vgzwlZr1sJj@X47$scflaG<^!DK!p=K^(k! z>R1^89ma#qJT8V=5h+fMCI4ZP(1y5eGn|8b$z^&|_l(2j{$IsH^kz`<$+)vV<@J)) zsFE;pXzMqbC!5V%{C_l^WmsEX*R4wk?(VL|rMSC8u#)0VaVzfbPAO8HmK1k)cZxd{ zFYaz9eV_0A&yQTmUTe=e#<=I~lG=r>$!+q>UVRN(dk3(rBjbp{T3v=vBxZwLsmU|? zcSyp@zg01QB9=%yL8RZI{AK#R%uL-#J`N?>1@jA8rKiOP#-D(-FeE;FD)eYlxF+ zV0-{yBmV}`v1YIvP4FWaYf%vRJ&>;=CL_>8cysYA=?gVdzw_=XSbtzYnX=$GxDro> zi<0zQ6eM{PM7MF;@DA`ws9cBl0r1IIpwPDkD+OsbFcW^N=Rq%De+KfU7@$TT=^ z`FmALY3aEl8m<~1NPJ2#Z6~#QyVv$t*EUaVL~h|@_xBUq3fsNMcnW1|rZ9xMCGH*4 zoIDYuv~=BGQa7Y%=n?C)MjnB@FEo|jA_^X${r2!F>~|zd<;l~EU&c7Qk1k9qv=@g1 zer6y*80K=Lp=-}TjMAfb%RZ$3JKa4K0e3qlm4G&BvVB{wAPetBBNl!_b^ z*mlg1rF$NyJ^ie<;ZMqwuc|v89Y_0rE@3p*Kh3{-;Y%)F5E;}ZOEs;+OK-_ZZtYa) zad?-JOskRDpE_v?7+MT^cXIV-MqhV(Xy2MjX9^X&1TV&2xkZU2eG`sIgke@7Q;Lf_ zw!UWGQj>@Tfay+KU_9A~>eDeqTB87EYCa>D3$yPKwf&*)fa_TB+XzBFOk79=!I&re zlTm$}G!yUiIl=QOWa!Ng%3XsvEe<2x5Q_|CAC&w52lVkIQhU zV#yR_!JJBxx<*oJe`O`q zLw66`apFq_5qi|oYnhPhk=z9bsW_ydG{lY zxe=8zhOSK;KXhLOGEctYGM*=N;UJvlBbm^_p*qfs9#^hoJ}*1Hk`|%n(=>% zP|T_;X;PQU&+m9=#8V^nks#-P)d~s)e6(jbQF*qfwYa5>`l^sIVoM--_gD0v=fVw* zThDR_{$T$XpzaYj#>+6^ZY0~C=^A{W(Hap&O&>+8dby-Lzz~UJ$uxJ1Ty&W@8p4mH zZJdv;F# ziI-;U&blwpk*2aGs-kK8o5%LbV!P>mHtAb%D*OFEK{4nZ>?%_1drrmz!mb=W)saPg zfX!$qs_}D%WHzI2aCL>SzUe#r}9j7TwWzS;1;oUy>SdL%TKdv>HiY{~;j zH1(%JS2uy^uBS5A7o09E@H#?T-QQ8Zv|~BLv)=Th&KiP`zLfdI3R@B~KUJ_6k%6Q~ zBFSpj%`Yg7o}EA<6fO%qch|7IKPL9Yn0B|s=$=1_-26&gIm8@#!NE6G3GUun!V)qH z*mU2dqZI(+ZIn?Ly`M0)Ma%BzLCn$fH+47r-kw2eezkw!$BKB7XZA~Kyd%@h#PG2= z^I%Cy9e$juJ6`yoxhBp@l?T+~yh%GPrLOA5GM>lw%iKpWX}=RdgrHbw1n!E5;`9mg zsJ{Hw97p0g!u@Jm+D+TqK#)<`nk3LdFz=lHdEdq5g#}avKI*~5XYKle3}?F!pNJNI z%x+5DZ~mQp>EXLCLLe(E$+Ft?+cJZj-%uOeK%Ld^hITBnhiH@5{OIt~@VC+N0R8SeKPH?rHl-7~@$k|I-@E~KZ16|%} zm;rvO&;x&3`i|7}aI?RF8?pjFPp?B|<1oXCTYPjQuEdt4-GCxa5yw7UFA;TuIXRw& zQW;jvJMJUt-P$w~PSM|++$*o{gV6~JjB2GZ+L8Q6qImQG=fxq`9zh2{nonbZ{V1)z zgsD775uTr@E-w;yBoB%G&4>w(4tl?)$b5GkLjH(-K5S$oW%;ba9w%ptDy625^Gjz` zs51D9HNIR^8cPrSuvst;s=KZ4Sh~ z>O6CpsSBls)ki$8R1S&Q3S-Ii;zt?Fj)*rV=vG!uXc@0k70V3mzZH@x?e3o!V;$Xs zRM7CPD_7q5#Q zTB5viD{E{jO4SRZ)Q5+0s}4Zp`SjhJ^#O5K1kJiHDREP|lo};E1R7R^i^aodt^TZz zE9r-?t6-y&R!jwf=3c`h-YGbgut16^iFiVExqD|orN+VqG8Ds%ukDFLP6hIGxP#wA zvLytjagrzC=d)2hJCy{YSL+ojG;^gUX5FP&ZaYg;(^14NRAST0PuV1dYVzT#(Pn3g zi(fooR+yBXX+g}9_5t6su%(!AzZv)PMdUsIhWdF2MX?hmY$!3JuOdcq+;dFOU4kau zw|m`rZSXv)+^dIJTYcG&@NYVEQ9?1sR zm-EGl-1`ssA6!Gyzw|N)0kpNSrHwkcjz+Be7q*iobd2q9Sy4Xv8WsjmmsK*{TB?f; z8)M z!VBvI6NDr3z5Rn!7g$&_<9v6m$=5r?ZNN?{erLOB7+Y<(%F(8zCh>zwP+1-7gLD@E zyeHE@8ePG_o?SEF0hlB?)U+Mq1u3|{^Zhga02toXkr2&Z@1@0~Ers#0kM6pnOmu_I zSKNPm3q7GNyZg8&@x5z`nj(&kQlcqPi}InShRAkP1VRLrFtxMGd}8Z~BY&CN)?Hhb z9}ImMDlU~D1I}N8q^Hu@0n|*2)X1)|6Id=w{O;VGwM0mjt?Cre&3zbZ8lgy4WjzHmO>F?I* zFx>qXSXN11+1&~%N4t7A)$lOVkI3>R&93>~+)RdEsjR&?o}?&1jzofPQ=yew_wYvi zM0)xcY>}o?`NpiLsbwuiz#WyX{=Y)V4g&~&iYmG%W@-Q2%?AUp`5Yb1D2G=c${BNG zeVK%LMH?!BuAbpl#>c{b6ZWHdfFW+~wO}O5Yx<07Zyz#||3W@oj8QotVPl#TX2!Gt z1D((|NZL@3U!*Crr%C2N%Y40=8EytYs1jH&8-4xQFCdBh)^D5w6>>gA7DsvMImFWL zZW#mcGa(dF0uB|EniC`t>LdGb4PtQaU$idjTExQ3eqVq?q2E5SJyBGU**9_V7u2I# z=JzS2>6L;*cyaPQp*;G`hr;#QvgPa05dLVsCp42er>Rbl?7||^6By@A3uRxDIjoYt z3m|!5GEMwE+flQZ6=ueA{k)7qH_Hr;X*-#fTbGS!dd2-0ksA0Hk%|-23CN_bGQiC1 zH$)vF#fNXdRD+BLDtNGD`tZbu$q1dm@?VrX44RXOj*(U7ccA!INPUf;TX*mNKJRSelgfn-fV}u?>fB((2H2x2u7oDuvIsU3C(Rdf!4}pgrugR zyNS>G6&P~k1H|af=!Evtse^_{fEL=ELuNnO3+b(2?Gp)I6&Nxre)LUxsnD5VVjn5~ zkw!RJ#(^vFMD_2eO;DpDPax?yWd_V0RdEXwCG+t#LT&see|*UmIKAH@_7YaMXv99E zOq_MQI2<2KV5M6xXF*ioW4uN8UiDdS9b=V4dtPEt29!_SP_6*43=3y!G5`jW6+PG^H zANN1^qi6^XE<9thppDu{h-bT(-PFngp<^zo!fN#2>V+= zI-t^1(IH0NtKHhYu}5-B6IF}R;WfIdS0+wrFIE<*`d#uMSIQjGcB~W$aPL~~@QYg< z5D_V%-5wuNAy<9t3-5gqu!JF*awX2!6vOpY{AP<3(QH1rMesWZkdpO*8pOSq$@ud! zmZ_Ex1GrP~2SZ!i)kAQT53Q6YgWoOmF1!i6zY`Z_?Ljj~H{3#|fLRfdLdb1ewQgp>C|HB)k4TMtO6gpdk^)lNt-&(WCDCweczc4Z zASiWQ;+M(vwBQe0i2e2Wr$5&I3-s5T{XF}35$aP18c$Lqm!tb_fzRR$CFiHi9ctU3 zsRlP%;6pXZkV_iA2ab2WABE(wfP3u+!=4`5_WFF#Ubj+o>@wP-k@%vklS6gG=p zto`gGO0rK+I(X}rhp%M?dejZBA=weIopySj-V+53v|#b7=B~w#o>lazh)^$I>?+QU zI#>ov+Y20`Yx_uuKRBW0o#J3K9WuEOz{UDiMT`E0nwHveT`#HjHcsVT@SF?Cwz?Nn z{%4?XYPafhj6+fOzS>ULw;sL^3~W``*LqHi(&PRmyumCN2)c9@kF-TmsG z3j8c$O(c`)ed6%84GPGo28}`QHSMwX;-?BkI}adc>n63|p2i2&9*aBj3e+ zGFn}h0GxVFGRGk_onH{=UKF3SiW)5^9X<=t}O0&~~EVL!A#^wA z8a|!^JU zR9lCt*i;^7rY-Y^W00_RgI#)LL>cfwttxajzL*vpYuQ_%B#+OMo;H`wZ` zThmL)ZJ0#zs$9o+FxriypD>^yB%wdarWFsA`N@=(IzRI<QxVo*2;rv0<x7A#y zyy=dFk6B08MJ#3&H;-{LSk;YQy{#=5msZQZz`o1{Y)a443$Jk?=ONDX74-4Y-n&S5 z_kF+?;}qYK`T%JFpxDj&EYA^(m&Z~bn&+)+;uX06`=i9Mz!C2%{YXcD5~Of(sM2YT zLGpis94$Fbl>kh?^bIK%PBNQqyCr8M{``qDF!B1u&SHN9Q@FJQE*=*FdMdAm9qth$ zCX`Ak)b5VtB>5f5bvDjZ3w5j~hmiR%%|ySWiyXQnvzbY)-ysPG9PWLdo((Txva!bF zwFJpmcdj}J?@Cr}no;;(Ie`o#@Qh@JCr)r0FV=Z;6UF+Ngro?E3l67H0y9!G#M>E# z;_F_l%t>)Wc zVsr0p97>-)3wATC_PJ)oS=chXyU*AylYMBX+tTfIt$^DH1YJ&F~*)l@t1I7%q9=3?#Nj6w{r?PTvS+XI)s0 zLIv+;fSAss&SgIa7}(F4zv|qk@lPHl-WFB(ZtmB(&T)HeU3TxLSNmoej;+cLWaYL)&FMczt4wwnw|`$ z`1vRH_#a5JR@@4HN#~XMqkw2W->xNQ@E`=1_up#@+EKLc-Tu0*aO7Nh-G1~n+>bJM z**L&3`i5f&!_dfGfAkv39?N=|Zy`5XsPl^*md@U}e*E!4?T+!4M8b7@2sVs-YWd0u zc;>80bc*7C{^vjQLuN{)B_+CRLb8hmTjC4Ls?zYOEHwjVa?Zp9=m3f*jV&lNg-9T?)0w$6P4ePISV2f^tNtDa?lyd5> zL)Gzf0xUj)O44gt$|G@4NOlU%UK_kcsp`yoe}HsIO{M+GYpkLIQzU^R1p!v@myNHp zEAF}Jp#=l9=BC+hHw+5R7$_aIt5Ck+#CIj*VPJs+Q3Miza*Orgx0tl?N7KzYzl}LvP;-}WX{Xs|m2~uZ_g+9-{a4!nr3?(BUuAkNkrsnr=lxv4Uv$cK5#YS2NQ9v;@G<1nANI z^9!-+CmHNgZ50k#_AWm`N(`(mS0hkJG~W4vaHpyf)!Thmv=#q7)&$3MY;SX3}s~u^F*Y9^4JyQ-8tmEz6$}!bhAsT zednZ6J^FQ&itwr0QP+97=x=hJ^T8u)9CD6G(v=q3}uR6&3cWtQvw-~Y8P#urd z&AklXGFWja3;wR1y8j-CDO0zMpD%>iFx!aKXZQ7xAv3Br)Qb=Wfd{;epIsE;t2r`T z;uP)_PltM142$u#2CZjZLDN{>p5taXs$rY&ak>PUEbE0b>Ki zk23c4{<9vlAf1)1rn+YS94S;B{N+!Can)DHtM7gpPqneA(AAGUZ zG98?|y_Fx!>d@bcx2iUO;8B90bk)+kz6B;V7 zZE?^Dh@j*H#5I1<$Hq$3Yyg|qoGmWc^U*^u{OwOu5Q~(3N(_GRoEK5*2YZILnj?FD z72|eo-H1#zr`+GSjDX`(+<|)wS_^dFzz%3G^*|`nLRmn;&0&z8u=U(b_`nI(af(t`2tcR&O%SGkjf9a;ld&X?-Oq()9}cjAP^l^QY2 z?pikL%-?c*GT|E>OmMHXvV!DV_LC5nGC{8A^qo((a!5Qe)Md6Y32kHb2y}R$(m5)j zGXo{`7dSfv;x8Ac#EW{@-7_&&m>CL$NA0eVm%4YYO!KP4{Q?~q3>+xU@c3F#GN;g2 za2aO;7kEefBM>>4m-=S{RG~7iMdawpmJal>o=f`#$#p;-+*w`Y$- z@Js!i?zC3<{-)(4^e+fk#ZdrzO#}}$T{l8ruHW0~Z^9=JC6UP66ATrbEgIGo;W^;Y z=C)A^@H@`m@&icOu?dd|s^KmDc1Xk`@Ys{NU6aH|MK=d_mf8b$zFMZD8>31oAqcOl zJ;p+>t{npCYyL7OV4_o`y@CGMP;?Rf04|D+E~hOWKVpA4J`NK}_Shji+D&i!!G-MyGpt5K_JYWX_0}R zGr+BOqsdWt|F-c7&DygF1=$WW5?VG=Cl<-jVskN6&?4;%=)|^A#YGUF(y`W6OZ2Z=` zlrAoFqb%1BN2k&?>wjscdbA)Nt+{fGn~g@WMxmA+E-~O&^QWlSEi3G| zox5bioI&WmCp0@ci>;Ft_W6!pY~O>Tdmj&h$)mTGe=`~yv_1S^5~vd%c{C^RkuUX8Yp{sKM8SiJe<5EnsXeQDEN?woY{Z}7YZpc$u{liSeN zI^shHgpKABy~UM+EPQI&Xi!d0$an`&QZs z>?E!8wN1N_;?oZ;Ur9k(y(&z?EUCCKb-9->*2XGnSdnf|tNz%4vWV_3X71O!I`|@- z!(wzuUaF@zw(jHif7&Y^AYO!oCEO~-1p)cDP$4Iy#P&e=Y~lr?{%(!>fr3znCIs$A z!w9S^G1NFK{;}+&8LKIVSW+jisG0Zs2NLa02VNA3P0B+;@)KDunMRBo6u;@Ycee^F z+%)1h#QStc>ncMGe5PFO=`L%cNyBW){=eSejd;Yv?W)WMBPR>@dHu4tf_`-7&slnG z)Xl6LxHX@*CM#}`diXeejr?H1yJ;6VuUX}SqJ2<(U)IEsv_Y03FzWIiErH^Mm zJ@w)9`dzL6@j^$=4`47O-R~hZ}Ekeg02M z3hWbq%)5t!_THCbo&}kil8Lv$1ZWqv8q|7S&3B(f!*ssBg9Y)2u2B&5!E z)aB4h5VyRclAWUoV;mLbJkz#?4jsSJjS-E4{fIV&R1G6=;SQTW{GLl&N7^ z2xz5LTIDitBfqpeC`>l`wirK_sE*8RRG`W2rj%ltweoT1esK3~UdLmrvTj~LD{b#J zpc06Ts|NuP|NKW#K`{tVk)mCKInV+peNJ;TvTesRW4>}1)|(se{dl@O_92+PKxa9J zBuFU)=>d1AzYBPnE~%2@v=q*d*inUg>vKkqGR%ho_XF2lmN2WqN-l5&j)dWFeSXpR zql8hi#HeFA-HYZW!fUHeBEX?Bs6?^-r`p=H>dSGDoUt?T2$BoECI=f>lq1Vppu6`R zD4n__xqi~gy%nk*-WGf`&X||*&!GvsY5hFd$PxND)G475#Qi>_83FEk^~!g7Z==^% zaGO9xen|K>*H@#H1W0X4tUKy`MR>@(29+2X?>O0Z9HF*TqR(KMpC(`g4s=7)h#EBa zX%S7or+|zn6kb$9{f~r4Z98})YTn15T|h>N1}hsa7+A}se+|NZ`y-w>TFrKk^IQEesrclHo@SJ^6)tDH7! z>|Y#r?TSmrf&snBeCVkoqdwOC5qa9;`w~aak1bEfYD}xIPRy1zVsR5xpJR)d_$plu zzd)fek*SW8xEC0+&Ou^B+7ERiVt_j<`&nzHk%!k%UuT9OL3`_kqdN8e+hx(tgWg*~ zMzxZ;;LQi0s-}(M>QMJ_isVKmmywsZHH1T#j5y{pCm)JX~$1EO+l2^lThaG zz2_-xv~%1A3Ir~!Xv`;(X+(m&Jxh`!p(?o?GMmnG25X%dyozrN?T} zPN-c9334)QB~N^vD8g&8^Hql*r|2k=K$X{{Q3w z^SOw9t&-R0rmQfW$gpOAbH5kjkG|<&)XaL?kzs-3nT z4G2^ndOChh8b*pEA@t9{VS;k?^}asr79s65wY_@VZ5%TBO@pk5nV%GQuXC`?^!oDt zH#-OfybKag<;fQxF#2nhl8}e~gX;^OO)L5F`n{flE(q>%uUo^*J|JpV`yQ35{=)6? z{s1xYbBzS~>#2>hzdJn>)U}ztby<+iy!DB&ZeQ3u>XtO)D8+;%!P=ohkFL?q_iE5IfKdyCJ94Rk=b2dtIy`XTgi%0gBm_R1omAsd^T@ zq|%+R_b$oU;~GIIZpQUupw+itj8(N?CKOklH)C(=R1|Ng419Fg!7^@Ga9c+6wH&2B zhM!L}coF>d`C8sD!E9w1 ze@3C=i1U`%f6XmI^*2?rLnAV-a&@icAv>4f;4?OIS!KSd+CWLOg;q^RGH9S*xb?iZr2__1C{WKpJ$&;Eb=Cg;Z@hI5x zcy=K~FhBmT$U#Dx@RBtYryWlbGd@YKO?&B0tj0@?<3}Wq%QOI5`;NdCNQdxb7{fvl zA@sw+MX3!0a$VP?udO0!(wEAT6=>V;{F^qcj5)RzCba$9-n&oiVLPm|!P5;;yMlF% zs4U`FS~HqXV${)TJl&TB#9p+}c^^5@(=U9tkXbbIn0S#d+06sJn-=FDlsJ=%T>h}b z$PPknq0)*YiK!12bc3%W?0Dt+R8Tq;8TOxOSx9kNPp}dZ7|bS6-)7fvJyKId!w_f6{D6<0_Nf#y?>ZM#CmK1F}@4IEZiR9;jdFr=@ zJKmBy9Xtb>RlV)CkDI*|wz(Jh)G(J8EG)Lr!b0!(h~0~EoZI-A-oM8GplhRe!jV!$ zy`9t_HXb>urkor+!*1Kq`^ffeK<-b@Ebs7akio74u<>L6`ywe37$#Wj7BcZxuUVE7 z(W2)Li?52cd{&=(ITAzxW~_@2?nE=J{;=sZiXLS*Pr!X&@rGiDz*c1LMbGMt8RO6( zi#vWIxSPbgi2hrW8dQ?vz<2RlGHJP1+^_Aq*lT!r2YHbu=>Yevv25KuNu7DKSA?yp zz#MeD6E3|(RDA+Tb3(@fLW?yhoEj)DoRP+;rB;UEmM<3l$n8udQ{KjJGucGq?R&jY zdy6yt0DTb+jXo(BwcxsOR$D)L1H*sXH}hnQ_sD3lq0{D>x>oKt^&N$3{3KZ!^#Qn; z63jO(_7}6fbolSz;HgO)+h7$@&#D;(YCT_DlGd}#R3w3p#g@;t(}Dv9iIN@3kre|+ zeIbqYCoDiP-)EpIB`vcoTakssPO;kRa#~zNUUq|4X;J z1n2v!34{ja4d=rV=;+nLPfd0+nK>1dgKr}Ya|Wt@wkJA#zbAa@gFhZf1FBadi}3N4 zS#$|C8_3>1;^d-*W7f(Dx728~8T%3Ct`oveoaRT_PEKY_eweg~$HS3AkLV8>k2$eE zoAgIFTYf)KN2FvaEa)?~NqJ#>^^uy*Fbd#ALK5P%c-$|ez{;Ar*mTbQS1#*8g_Lp3 z5z!P~LnE4B2>TnRN$Wo!3EbrFpL9*M!nQucVsy1MwMQxB_%i!^v{4tufDsBGY;Tu#6- zOeLeRb#XDB{}H`BWJ%7j2WM?znf{|ewiId72i*k?%Bka}PYUtz(IUQT8jHo(*zmQ4 zh@3gs@;VpBnA>MtlzXVC}grR`!5H<09a!VB(EKH)Ud=_V9=_6yy21bE)Qx zQfb~uZ}B`urB9&bTz(St;pKM%=n3f~EIG?HFDe3Dh?@E-Vz~J2=Cg>opI@ZR>?ej8 z$K9!Xr_lgi?HGC3w#wE{6NL>QQ6%ldEx%ET^&JFN_8wK7l453%xSyBR93*$Ou4<`C zPZa3zx${mi_!ra!`?~A`=BDm7n!JjWKQM#pt3wQcwvR5`=?Ys>Joyu=x?l0YExRsb zJBve{SMq8@cCDEq({qpvfh+;uiUiu-7$N6ok?2fToQ6cLFQw|NuEc#azt;Q{LC^s$ zI?2D$%80CDf`INe5;7K4$$;v=-%A~QDJDCo^W@fruu`F(bH3A+qJWnAvO7LtblbZ5 z=Bfy_8_gVkXXY}twX+i@%BOWhcA9)m{MO5DZ3nPQKZQR*xgF`KFI{i~?Slk5I0nuX zd#k#W3inwnNkdru$h7R~<_s@Hi5KIOL1$oxW}@lI z4Gd`Tw>mpc4XY22a-k3AmetmBqXVHNvps$A#P=RO?XY|2_S#KuVN6|L?OLm!bOHiV zei<^t-lyFXR*@{`W=~jRw|Cc~&=6rq$za3VM)bG99>q9hhMae|?J(65r$p1kIi%lk zRpVy?OzYdBYErT$vufrU669X_hL;yW7%U678$yl4ARELN70Yx6YnRWUWF59h5w7bY zb>q$Upl?P58>b?&ZsxN}32i-IU6TqyoT{epqH|wJL#96OX-`NeZ;Z5_;Plwh^D6G0Ikl z_HlSH85%TcBMEs|Zt=TKn`f)s7W3^j1e@QzhcSP?({cOdem4gD?GmLgg{rJeGy@ik z{ZdN`sIF-xO5?fp1HoL~#-g9!=?5lCWAmnFGZy*(p9Rp!(V;5GhD@vMOQve@TS1T( zXATS!Q`heXx6b|E!BiJ%#Y{Q<@_mRm(Hz=}9RJ9^X@VdzDv}N#4*1`oDEM9rC4LZ| zB8XEVi(*Jo9pWKb(kX)sO(TDm<&de@6{I~s_2|dI9s-c42+(Fx<#7bkRv0DSv%hH{ zGw+XIExonbXM1i?#Jv6Z)_vX}@~I}0K+`+p-TSmAr;pfYZyFlCuo($X@ctXsn%Iw5 zZ?qjR5v1?w)s!)nqK+15AG;mtytbo@&M+i9qHxGM!-{4?J|G$P-)C`UMWAw@+@BMD zq?r9Arxx`##EC>MdbtRF(zO~GZWmDURx~-nHa%&o`cD0 zW<$5ZFNS$z0_1a86WBJg^i`io7dvwP%#GB`Ispv|ezYI1TP z>0r66%S9g>1-8}m^n$Y6ijGxdYdytdbF*AmEFGfJ_-*md@mqFkYn6@Ex-;)-+pdtg zjaWBU5lVe-{Hs;2`miS^)3*L6=(%Ts4(t=bjG-|K9P7wT`=Q{`!SM7;#s zcUDM>Hmj=T9Q2O+;_q=$gi)dan1lzHp8DF4CF}?+6$9*if<@}MX{g>_k*|0U^YtV< z+e_~|5Em%}tcA_LgrmbolswqsPc*p+jH)cHzwY{r%kUbKvLPTKtPPSR6JUGo9UQZi zK(?M$_RLmiTWevP%6%@Uo$w9E5jFFPFzZ`+cQbpyhX#Wu>`lrwGS5IRVBTqF)tT7W z%x#+cq_2@e7`r&+A2BNK+s>5Vd9QSFvc_(BA27W?Lx16R(bgyWDz0&Ns^|@4sO>D* zV7+c@38c+Ak2E7fsK1GW)iaCn6w0gc-bF+5-`3kIFPF)FFKxzMibIz-5Bu{D1um%H zWLET^ZxPKmhszxn%iOnls%Bw$V#ZJa)lHd(-tvd;(=Zx@!k0ecJ^e|nLDeq64grk9 z6fI4Tt?BR~T55Rz>?MbeJt&aLQMR1|oSD8k6URO~>5Cd0_pL7sb zL@O?D!QPwDZW5CVDX%IbU%4=#a{&-NW>MJjWMET4T)gBV$s!6biEj+`Hi_6xW= zQEz5i(r3&ZJ%bpUo^4Am6j2%)^ZdR2D7YNzn&Z3r0Eg)l%a;O&;(orY@ei>+M#C*? zJ}bU8m1_)gtuHmj+LJa{-j<)`UV+RmCDh>&XCXPXI#@bc4qq!-SS-XRNZT@;K+!v;f_QjF#9hJfCSccgux z&N+JtLXz3lxbDU1>+m(yXrxrmLyl$z>ah1Ehn&4shX!1CN}<7#h|VW3WB%oE(1$GH zJ}m^K)px$x9uoxH{yPQTg6Iqtnw3JxkZp$a7xVAETUMf93AZ+G>qqZZbiPxn%KBM! ze z^#D3D^^q^h0^eJzoIVG1q-rwsRm*U7d9D!6Y`GoYdm8MAG`A>u&;w3mg@winmzmL2N9`pe=9cSRV(hQ z^P)k&S5v$ZkJlEhuiG;u^zEn&>x2pye5V&d{A` zLs&uQjqv5iQ<8EEdC+x-{qV21y_99qL5!vEx_S>XkDn5#15IoWbrmaKU8fgW*d#CT zLkb~!aWBpLLTTUcl}1@0l6dKV^Ec{u;e)E1Lsw02UqNH$XYA$F*5!7RXbf z?84Ftc``J0s|=S&6>kQeVeqew?1z%VH(IgN(PyJVwgVHXC6Le$tbDa=nL~H7IC!|9; zQC>i>Gu(}yzYiyqm>7v`eaANp*ST9kr4|xaFMEoKc5)zo{RtuvjN$cas7ueb;&MXp zKBa1Z52G@a%?e%S9aReRiw{zh`qkV>hnajchWL? zG23O%St;|-M^k$>6@}+zJcaLK%){IiL{B1x8e71L58u`HQb+n61h~PKkpx1CXtWIMg#;$n3*tWK7&N+ePl1w5iyGP?Im!d5r@n`F$aU;va-ayv720yvWKAN(;t%PZ6DI zf5n2UB+D7{o6OdH#;o+xJvi2t2Uf$SUCp*%B@7SjrBI0{^z+YNtAR#7+etd_VQvsf zg-#_dus|TOi%@0M)vx!J0c=rfqGODyPS}ZYXyJW_f4S-t+jj9NGZZPw`jBM8u;l49 zW1^<)b2#`fMC#9f`)=EF)Kx~Ae0IjJQSUZKESlVG7XSdP9hQaJCGPd-|A>H8!`_Yu zn?w%3p9?Q7a{T@M%ISX#|_b{i1t;L37b*7ZLd%MXTKhebNM)&`jum0UJ;~4q2vN7nm z?1(%{WJ$VF2~0hJf2kD5{6l3+-YSWt8{Ie z6>c8Ih~e!#4i?e#C^Xz4zYX=dgZxpYv^!sk;e2@brY@Ds5~?+sNO>slO#XB5{tk>AGc@FoTGa1-4hu6Y#4G4nUFD8F-(?Y^(X zZC8nuk}S)b=-rZ1g<$)trBd-fNYa{unu7HG-ilQRO5E-!8YAkG^+b0izkN3NPIbwB zWs!NlB~vzIQ@qNWzFj6jHi0CfQVs$O6X!wH0)aXNtkVd4{uI z#WOzsb4=r>x1}faQ^txfD{BU1bot`=h>5^RmSjwUrGWwG0qbK0@{NmFtF^}U*1MPV z#&tA*ZjS*E(t&M`i9pzNV=ijw0z672s!;jp?9z=_RkxTl7V#b?s``mfTBWVO1hsFn zMT<*1{BGAZq@U!4R% zS`d4b5QtIyli8Ub`*U#fle~Boo%@TR67p>z?(6aCkoq&uhgn{+ zb&WW+RQKEUplQM@6-mDicm2ocU!DF^#5+9OW;ls;8Xx!bHc^RZL719UiQ)7{#DSXn zbC&lZ9>dt^xMOX#pWltx$i4`Epw4sX`-|~qwtRelLV<7d~2ED)$A4 zpyt8wTX&TBiUrO$j6sk`;^TtP_Gjz5{Y?=s-b-=qOAek&g2>5l65De-Z+|=8WyF&| zB&P~^iw0K4*UePvbukdTGcbfK)o)9;Q{(X1e{ZcIfy2sNt91{QTQe;OHL%r zl!f==aYVa)wamVr5Uo*`<@GKpbA+DQ=Bn(;9_VtJ-l&X5;$x92g&(Rcp7WPd6Z9k_ z+4+O+J~R`{0+vHf&b$0D5HT506jLLN3(^^pyeoG_y(rF&%djn)H~dX*Kzv4w^i(10SUgmy}VvW{+B?y3dV>hf0WZp}oJ7cxc-!h|% zd8{6JB&P>SU!D!;_B<_W8U%iQ2fCO*2YQ@}dnRD=GKwvN+4VRONtN`?CE~IoV;5eD zI&z_sYOd$pJFP~i*d~l#j6l-}4Btnr;FS*XXBV<99d^AqS!mQb=BG-8)k|;mz~`O4 z?u@TL{)SeQEFjTiflBxz2@#?RMbfl31OE(>lrjdt5*X4ywuQ$cGAN%i=z1i*n^rIA zqM(tr)TrrID(3q6t?OxZ@~dUB>ncBSnZ>WeG54BeME9sW&A&5uSVBtT3h>AWk)+1@ zKY+Bmf;w^M>)FydUaHbVDu>a?H&cx1vXv!2oW{Sy-PK9*a~Nz1H&LSOk#PP`T$vfGI}!`DF#2PK&5k??39i!^bm(aEh{_Pk)me8F z$Wg+v%X8Csl(=4Gn%9UNNid2lIydFY_QrxOiCWw&an2A~dv{Z+8pW#grL1FF$EpSZuwSdMT2L1^ih8{VMoQAj~Ob(H_S+|E8gJ zP-9R;&Cip@JgakW##QZk*)4CZwPv10y8&H+=LvuU!bP$niN-?lC3W&=+B51TR_Xp; z0HI;9;`c+d!d&>uw>h)4L*|k)IW1r{laz{+U~u&dbv0fwvJy34w0vda+4>=cA**Tk z=nYTO$pRJ+-&em1UL^I1hA!IJ&TozCb#p0G`Q@4^7S5~;fYY5Y!}b-FFuzJUZ>hq( zn|+JE(#HjRZ@@fW<$bll5uHo9d6w?QP_a?sfh_SjUvyu?1rXN9z0O7hrCrl*7v22i zOCYMwi}6>(H{l4WKRUkGNAIK~xcIo5ANx9vMv%!IqJgV8ibPNrj~MPMY0dcJZd<5m8kz+_cn8Fpuu>IT}A z(9jp+Z%v}YDepqKS}r331z-5Sa#$euElK~7TROtLOF+%yyA;dW4!FSymM!g)Ns6#% z{8`^he02>43}+>FqIWK!3Jmgu=PIz;rdjRZW8E3!$xTFqCYpN!xJV*}dUBk@wdE2>QVHi z_u&T0#{C-g5qbku#=Ehf>hdJ-jyi6AA67mw;+NgrLdB@r3)%A4*tEQv z9xq3X%e;E~lAWq>hQ+i#cBzhRl!2Y-@rp_ePs=4=CPK@p562%g825!&n!SS2-0Zgg z&KD|HvvKP9W(l=B-kcmO>*dMmRe6J%u`5QyfuA;@CMC34Dk*!!E9iedICwuFS}6vX zWvlvz&|xiDp!iuUx))LJYjvQcAfb>j5rlQ7ii{#8f#Pr-dGeVPBl7s4iIjb%rE5Br zljZAxvQ^l0+*CZrfs7KO&A+i8)*IlQ;eYlj*KBsTb5z*p(8i}(TUWsGDr(DHpS>aS z={J_#f9aiKCM54+1y_DeZtf%rZ4KTiB|3&?-}}y5<^dt~C8-|; z{X?r0EYNu4j8>dN8ZNBei2Mc@BPr&B2R50$)`L0LsovC0P*%We677CC9|BT6a-}?%-%2ey$OtF4;B+f|58SRw@ zcPQEnr1#npHW!G>5tw7PsbTB`R_)WAnkjMx&$$5|im9_$UOa2O^@+kz^<<>Sr4#QG z#7n88_sO=%XAH}7Icc#*@0wNSG{r%Mf%DLlYtagFrMt}F1p&d92TrWvr-18kU!4^5 z>YUs1558~f^|VgF(N1SB%;$!`y>k-o&MH-gMOxIp6S&1^HS~&`EY&~rAt7T{ z!hhN}7|xB}`s%NJa}b5!+TcnNd($$>l!D%1*^riy&JZ>?B;i{k&sYpe2}Gm{Vt~Tv zT30Kl?xS{NjLJcxknr5$C;eT4viU$$?9-|@lIZCcj}s9q^hW19)3g592SL~kZY1)R z*%v_VjtiDFsmGP3ZjkuR8g@*fumdrGG8Q9sLyyu>@lJr2{(LFZ>EzA~VffSr;%MzJ1kh}Zc!N>JOO1W|Jb&o zMUtk-`hG86zW6w>TvIszCCyZ>cx|}pm?I5PxC9H3 zI7E+uEL6w-kABF!@nL9T*A*Dg5-v!FaU1BZ;OWp*)R8qJ9!H3z*K-$i7E3<95x(}u`ew_yJ+)*fuq~pfj=jge&1_z5 z7XFbxj+pBJzmO_mtw&mSKCnvq#x+8t(~|Y#h|P3G*3CPC z^FppC;>#cR&iHAUQjQ;8*!BiRqS7$}P}?PzN)Ot?l*bHDS#Tv4XFu2TrMEhk;=kVo z@mkaLkI#G*7}8C=X32Im&XN{WPC|Ni9kZ%c^GDke5Bo%yL>9tW6Jx9 zOGxBlmb*ovxehUj?auk-gHPPuU!uNB?=8O%3zgceU~@|8JANw*ixEwL45H4>LD5VV z_QPYF`ZV^g7YWiYaYBKd{NSUpqwQ>2*5UnNBK#87RnpNi=ebFq7@{=r`D2y?Vhp_x zp-qxcrjBFGp;K!VvK+Y;r3M$XkTP_*z!xlVWg(^K^bVqAQQj>-xT5;r{byz^MtNpT zDa}^!omh#9ZK|LFh2#jv6RaSUFTyYfD%g@g+de~QsV1Hto%xSfSK&LyLi$vmF{%yuLv2)D=!oSy963? zyu0_`HPe9I_@-1UTTSpEM@FGO{#7r6&Zp$ymv3BPm41368*;cR3I2p)$DMuUhe{d2aHu?b)~6&$fiMak z<-C5)Ziwk>rtDWT@`C>xC+J`}N;3wCJ7#u~ z=WwhFXD3`XXe&v$TsVpwX2$zw*q+7odR`(hgX-ivu0hFLYl;qqFy>p`ej)*;-T1FQB@QX;4Ne_M!s?FXjIxj=>(!nMF z!SqM07zpERVqxwzfixu+~d`4as1I|asl`MJK@p!n;aQ@ED- zy%;pdGo&$~zAU5WTFR$1q12o;m23gman$)xWt1ZJ3u-dFLf@yP%{0l612_pz<&K?n zphl9ROni+#sB7ng;JupcwZdh~1vXgC=-6Ileof#Q#isXyu7f(E%LLlahOkTzmOrFv zFfwxHrbggALujjC{H%{da^8@>>kU{A3?mmt2YJL_#(a^38kun$+0r}GwKn3$d$h9S zGTLJD{7L+qzBjxlBQJy1PHJPBcZ>0u#XN0wLEU7_H+oxY6NxOX`fA_q)fHhlY{m@6 zdCUketA=2i{hpK-D*!DH%sUqc_#jjuX?rpG-RT)k(Ieu(x$;Kz$Y8wULTi=8IQ~@9 zmDy=4q7bwTwRbL|^3jaWw%R(l-4OZI{b-6~y*?b$s?0B-oa#)s6GTx7hIL}p#a316 zg?e7Fvqe1VRdZzJZGEa?MW95I+6ap8qk?!mK`U=j@=z0hiT)W;SWYa>4E^{X1)#2O zPY#}(QpK*wJv((fW~oYnZ-P4amm10+7wFi#{;>Js=h!7&G}j zh-WKhs<>lOsrV%Ypg}G=dyB-)9Mn9kbVtp9ftm@UiNRLw6$V#a`64@+a~ez!SKjfg zRl4hja}Et0NafhQIoKf|no}Mtw6|)!z7&7ORo+^oWda*SC$gL?oVqYmfHRX`f;IYPAwT zHo_9-Kk7o{p$hg(*pP*4=jFoP_2u&dGl&{TJ}AJ~7))6KXoz}F(C%sQFpK(46-?jd zXfTPZbJ==%>2*q0g^YabPWnxWj5twtC$l_%lB4{{C!C7M3@~OZN z1>_c6HDr4iHRcRBl0wifd1j3)Te36{QA(nBN<${;cfQbdShg?|ZOCe-<16iEE+Re` zgH@W5-)${I!xI5y`w3K$OE@f0K5mF2ecKrB`JeK!lu%j@b`#GR@>rE8qoWMX=jmv4 zqC#-f>NL!R((1!AY$>ta7|SBb4O3%FMz3K*g+B0#!RcjGUbg{)K7zhN0T^{(V#d^A z(WV5$XI}#}I`a*1xa-bzwIR1=42wtz-gBK@Y84%RoAt=H#uMu`Kah$pLdI$41fy)S z3)n4cSM>mnU_?p@sFHm%T=`($EcB^?!I;KWsewGk_Yfz3Z=(Mm z#qN^A*h-|=t!HLXt@!pM4BjGPq{Z3BM~1bX!y(^3*oh9Evc!ZccYOuIbV-{MK9uyJ zrS&@rOSrHsVAfop^(2XlZNu>vZVjmO`*k!r;k|*SIWk7CBfZ2Qt$fCG5ObGK$`|u- z6vMW+QH)vCwHKj>Ps%i2<`nXscF=#KtU zQV8x#@%#wsabQLF06q(^IUUH22fe>NZ$V{fTRH&s!7*-LYBm!o6;Q7)!Xp*``g0G)_ds*8 z#Nk(&Z$4T}UmD)AdkUb%TU?zRM~O#8$4=xez+E+iu;5_*s2Og4&i?V?Y;LSm1rdElk<&NuM*Z|{{7YL#3)ZfCYb?+6*PkgdHwSd%rzMS!$fg9 zez)ZOfHYXCER1oI(NXQIc3TI56QQizW;gOk&}VF+w;sH89s6bdU+O(s{LK4Ew3L$= ze*1JVqdG{k^T=C+vwaG^n@5Dyk}WF0A{d%8PR8XqHQF~G<@WWcU}q{yhBBrb>VHr@ z8m&Tup6#P{<^~gX8=I!Ek34QFm1lkRaUqX_t1p1BoEm+)w=q*yxNwh5LK{I|?};&s z3{l=xGoz7l+K&hOB_DV>N44{L0tfwc7ck+hxVP98B3lBO>43U=aW^x7& z7rF|YmVjzK?z;$a;5<}dvLa)nC;0s6tG~N9SmFBjCA2_Y#K-fFyP#~>SE+&TL4jgH zZJXkmkd96)j56MQ3Yoy=c@4*_`X6PXvR0bq*z+*j?B7V&556Z}zsWgH(VyI}kd7pf z3ODn5Cx^Rc*yv;^(;d*Jw&QkW$s82!kK$Q8%Os_rkh3yo=QNZEnbjf|HP}88>x&~H=fDM2td~vS?p%iwJ;V$&~hmUJuC7~n|gR}$YOZl zOdj8Q@kk5duI(&j=BRVk4L9+*8aCPR^3A6|IHywj+b+}qCGGM1-E$Bp?hh$jAJ5aj zD-y8Q8^Q4MxPO0z^0z(spE5|l@DYF!1U1J50+e>4+|EUny)MVJZ9S4kXpvHOJIwM0 zHS*));8?Rf9JM>3x;z9!&$hg1LlZ_Ltvbz<<0xe@9`MgQy$EZv&VKICLEdy6-)xiq zxQC{Ag63^?cScQ9V6`%QXn7{>k{*+I<_nqRGMMKB=b9eDz$^E*nKWenS_g5P&&uo- zh1RipbG_ej%e=M(dDaW=4}iulfFj zA4cz(MGkGmSBH41!=}Bw5~wphCp4b<-h>xcVU93evhiGH;`RC>cd}#yM!w=L4GCjE zcF&_T%lgagZBfOMq%O1rpDn2bs_{X0l#})A{0XA~?ZCLaq|VPXJ~7 zq!Kfje~iM*NEfujYt0$?e%#>1>P*vNO0YB$^@|YCDEg@q3UE17^0RVG%{Ueh$->>e zZOZig?x&p*Y4@j3rl=J<1UDvB3wz#z#eyw)f}#B4B>GmlB)Bw8=?aS=(XU(yM%8D?H;DC|0d^ywAp5Bt+As+2ac2+v16nNqJ%qYOVJf zmnGtZVry+Ek<~};;vE=lF$BGyn7J-kgI&%Xk6qKEl^uQ5Q@h1x$zgrZsw`u>G8-y9 zIGCRfhEl(XKDhAj7Uw0T`Y)iHIes~PL!u**iZ)U;$d&S2mF6mZrIGc%2G5kt!m3fNcj#g1+ z0cTWNI@{8;3JVX@lUZ_Uz1*8DSiCi$$~PC?ksN^XlYt40b_=dAkmVcb4mWPLt`V`O zC&{o5@dQHg^CyycktjS|5;e2f;O}Of`fSpr+dSi5yrqbTGgI-1nf!If7Y@j1GgYa@ zILb6XXC1mo|B-8kc?zT*q#9VhM}5#s-CJ&`HA` zj-cWKuDfcqTha9rwQ9tGbLyaCh{(UM@u)sWHMLgkyQ6qBA|rClQIyW4VOZP3sm#7E zm>G`DD>dX#{ANNtx6tZksVh@Ck%rY$W?PJ5+&LN6t2+mpOT3U;C#vm4ey|r_cV*eU z8YFw^BWdcp!j>ak$G(?#!C#N)2~-h;%fz+%2u@Kf?Uso5(hSK&h0UAwo@#z!p{GD5Z@$*;)+6;h2?v2B? z5?1ERx)w>NUY20A77={GwJ1D0&Xce^?)B>q#>V_nTQUf1jFduFI-@rG1mcr~e>SNV z9vF&rV%9vLQnTsV4yV3DLQ)h9x1q9sLdu>!#CK^Ub)`M|O=a88 zzD|U60E=B^W}v0>xn!TGZH{(VK0k}OA8UIa=fU|IyrbZ$KQKP2GL*JNger|R7o5X@E7IF8>L*%ZS0t#>YJ|Mm=m>=fI{7k#lNj6lzrn_ghseTH8LE{OQ zijTE@GV;uVuhPP>DzV7dYejl{H#kh)0<$-uC?X|M8uV?a_A+@hdn)*#dCMsvUz5ew zV$=kcN<=vq-Mg86nW{wg$9PM$4eWQM?lOBb8Vpf6(!5lSLfq4v1G zcv@6^MT(;Q_SA$l%3p2#ets3Kxv(eW#VaF~Fdsp4GAv$QY_loqS>T6rAz{w^EBWVQ zNEQZK_1+1sIO4fTYOkg>a}pWoHpQjCh8^ja96cqGynHS$JC0QL!e}AN$7i+2Z)XK# z@O(_S6>w)ATdB|-01-4`J17smO!sWcl^G>eNk5V#6K5zy%O2q*D;b8%m z_4c6x=CJ_xR9n{2v=5f5qXn*xL=KfL+clJ<-o@3q$%vX$?9+#w%8x%oQ@m%ts+iU` zXLtt!bwR|j_at3=!RZ|*4N7GNsFQs*arJ2kw;WGptKuuFW24@0n`c&w=!|?N|AS9; z*0I5f`imKwsp73u=ws+oFW{m^3KJE~2N4fef5$IoDu__1VK~`LoZIr}c25?MYNTN_ zsq(L)p$TH7e(ifeil+z2vG9h=7b>mxkqO_G?xFA67OVb#Q$C3Xz8>b#YpWL-4w>z; zhkB%+T!j(j0QEU>ELln%>VlJ>-Bq}OxU&GHqH+0hZ4jHsUO<9(sGxZM$7)NPv_hb4 zGODbPli4ci;EP%8B#E!|8+ctltJ8TsCPZ~!w3SH?xxg(f{$z-w{Eqngu9W`O(TUCI z`v;)d&FxO-MUkcO>(?&l+Og_rYyJ2d{6BRy;hz+T_7+nO&LslLNDbe$PLU@IkJf5J zRT((ajB_P$gYBCj;3SpyefskQ&E-6x+15CiTwU5k@Q)5F(zFiTwq75~=5HH@0ZCCq z<(om2!-l~MMb?BKj5&y|+P|pv5U|2yVd-9$YL&ss8HxFTCqzF${^-HU{5sEdNS`A`)&Bw`67mbqP-c1e%s1D06BHL+XCx0AoWQPB{YRw7C%|S&E4ITDySuY zTi2Q3T}x_P5vAR2ZfNWgTKI2#QCJE?D8Hpt5?=inoV0+^&QP;kHiD^C?5nQDHf2w* zwZbB5VD(#U|K68)b56|bKwSx>%9`r|=N2a^vLB~S2qfqHt3jvX%w6p(43kGIx3A7AtI0F~Ew{-l7G?xBz`cfs=%0%XX0>j%?k zKsKcXwfhZhD)T=+Oag8lXcI;*BmqTg4F%-pWfLJ$!Y*l1YL`0j)MFu`qrr_OW@r?DIcBFC0raFkzB*80#6%@2*sq?3d4WLOIQ-}&0H=t?nz!$AzUx)bkjsQRZ=4QHEg(ypVWE~GxMyT8T375KYl-te8x<3eJBNQCmEZd zS~}OR15Ag#J>{?l*c|+Cm=}%4U?OPaiGBBxze2g|%=^*Uz+(f_Mt$T6|Jd4u$iU?+ zlJ=*FTutxX-pi897-;ncT%ln51JIwVf|LZs9Vd=p@8h_r$8ls3{_fpqVIci0?nCh$|6D)pWvsGlk%wkK&9mLKjGjt&+GB=)}nn1J(h3Wr@2C z6jGmdq->m+=i?8h*M~n=F#Y84VZ>1vZ#h_5SqQHU>x7coll5aZ_ce(hy|wDEsh~}q zvz$kGi-eD*WCQdp7#v-{%gN1F^ga}@-1LQ4tBp7L z*c+FJ^3h8Qrk_F=&38-xrOO6s!T+XipdFrUE)b;doe9%zL5V&{2U9?hr2w3{5tT+= zc9JA?v{~rX1X%BVZDs2U>H^kivfRE84n1m^*z%yNUjF6P>KGDe8&9y%dfKLhn5sql z{8f#T0X0sJ(-9HZk z)6Zbg)<&YaNQ9+updcm6^}$u^LxWH{&T1G~q&dhDKmzYg$rE-iY)n2q_SRstjLhSX zos@ScXKfZjg{?d~9<0KyW=Fv>to4X`p`dM=q@4Hj>M*u~n{nyu+gVgXu~IL7qTqH)zAQH+tG*OEl77 z^BVKTAu<{(W`95L7IRR$8Q%Y5LcpRhGJ!`h9a?~VeunADOf@aQb= zOUwtSsfHGKExZta*W>fl^E12svG1(MJr6iMx%i#6_SIb(LyYVw0QUmBSkivz5bcK1 zrt9L|M~s^A)LVbtG$Ss}d#Irb91m#3k^E`@Aqs5BO}4;Vbhq+qX(6eXc}{@=+QFQL~9cdUmCBW#0Q;`rKi1AmQ&}Jw#gw=k!AtQh)OYZDEiAVEeeGI0pMp$(8yDVGuV6KBJ04O9 z5PJ%_mw49fFOSX!2yQM%g937~2ObZtgRK-M7LlL`N5NREXyPX}$)1v%yi=V~7Q@Efq zLw8%l_tCVAvKIe0+o@5roK=kF*V@P9XJ$myP~K&1wHShT1wf_Mp8j1B>yKoBx>eCP z;SC2Lg!{jwU~)LS<1mdTf^1GFKLh}&`~K!Mx>H-|Wn)x~vurnncMf~Mcyv*GB>~Zd z%F8x;$EENE1QH2jl8_=$w5s#TZH#2XFT_>8yue~g%a#mD2A#0lnTKX@Sx-e+-iL3XARx4V zEuc{vy2l_ivjQV@^>LR8lrMA^ol4>y;6a<0x^-4sot}-b$w8Kz!Y?%kPU%7KJJSc; zVw<7S%ov4`oJIqFucJf>p7+@bsOV=WPa8w!Qvobqeq#BOtCdcxpE3a`(I1|R1gwhenB!?l;7(PT47@PbUBgrg2kLsKPK0^uB}3dI*OOoEwc zU8XkWVDs7f0Mk(^G8Vaoz9~a|w3~l|u@4@Bk*eU|VOPy7Q2&^Y>9@<$Y)F|cE6mbj z6#ZRw-X*}`b&9Qg1QUO>kML?JKcan;zw5GuTt^b9o7MJ!nY-+s>!}&Jj(#a1MZjKd zLn~6+ilB+C!xgWA!Wq%dhe&cI3t)|fL4y(J!zhtczNN-dX7wD_gRYc`P{Q%We^%R} zrza_VKz=KJlrb|H_k&PoUxV}ghypJFhN^~nu*8FtP5}#9^U(p;P4_+izfq1&fpxdP z&aQ|`+OG`c8xqwP30}3uwlwj$LI8`_aDmzFAd=cICR@N}EJSk~5{#O)FuohD?6AX6 z29F2gi}3rr@C7^78xMYyq;~RTyyp2n{A&(-kC3}yq(gk`0#wjPASb8kO_7&K5z+)S zf7H=v^L6Rkgu3tlpxqNVtq)5hR9W4LEbuJa>I2H`%{_3Ty|SXfsWNRu7>>r3nIb-? zy8c`(02J!lffs`M?~Y;4)ZQh5m4Q_jUE%Sm$bC-0q2%_W592VFBRmR$A1mV86s$hA3)Q;`N(KNIO^G8;iCyEj_| zoOa951!vdO15RP7%-r=aXO{eov_K+A_${!!58=R%snKyf%cTb`PGBbZgn!%c)oi-g z#vc!@%x7oX6D$rV!R{uJjm$evGP|iMB^g~`k_sZTMw=SzG^ER)ryU3dl z6U;RAZlje6`R#QLbfbV13v$Y85zTN?o|Fi!or%zx8=pEI(eQ0zQDZtu;i>MWSnT(jNx2qG=!*EAhbM|>hb^W6sLPa@ zfiZp8`MQH%FlybMJ6PeQvIC!IjrOWwP|1(kAi_r9zr0s^jS;d!bk9pWU>`B{yey!6 zPp};R3T9lUJo$C5V#ly0e{qNudygjBJA?FYjM^$B$#k*n?aEGEN&U^yZs|<-M<&5e z0kkkf2=;iCma2n99voQXl|AnG`y*at9^V3igpxfuz7-W;w>+Ct(x0Y&)=gpQ2PTQj z1(tA#7})24n{HmnDp?5SvB1+lF%t0QnQZPSNE~IpuiIwHM4qsSi!AXuC;gxz zox*W=dHMs}ME$&W!pfD0Ho~NA=*{T8Vt}&4aO$B~z}fN43njFBFH6iHR`0>`{0+9~H;pS18)n<5_UlL3rx^cIQ|GzBm)E$n zLiVmM)bgIy%sEBZh5hV~A9w0E-ltB%P|`*_!Muy+a-a_FVEZS(p07$_!Iy&IJ;f z(RYgyc19$K7jZ|@_E^~QNw6Cx#MROegs2IN1C^5FQ32JUFi>p42vHUz5<57-Puzc*sIX!8(>;CKT3e(uhZrn+>hh!Y<plsri1&C!?1y zGEgZm>SCZ)RnWd~U@(}!)n_}+SQ1rRUD45LS%WW&q;`DHohA}!4?cZ*5iT~vw(Y%j zH8dT0{@nI41VhST!j56Or^ysh>nsj>jze^0Ct1gt#OLyR7QFKC=j4Zq*x-{T6k>yj z6MyW@q`Rpfz(U|o+=4H?^DcFUX=HLdR@p~6c<~pqlwM^IIw#g2y9B=NB^l~hJ$vmJ!fija zAUf;(Mmv5?A7{~qx;seSd4|oS#$-mp*yIi)P&kT*JRHeg64s%o0-pMoky`;$|rhqLjr-2q15%K_pe?T&smqoEd-K zuKeqGCoz_{Q6hr51hA`-T2;?SC>hnTN=TdzA?Ed+VD4 zmFe-=yvImx85KoDev$*@SuA5A$zz7}`4=NK!F+OEZ^wBEKVd=d0pgh_BFaE0hoB#$ zG~yu$$0dee9I$f$e#`D;}Jn*H%fE?h+SQ&{dha5juI3iQEj(3yI}PT^r2tOOQdd^#j*4fy=N_>K<2ujq%;A%tT*u;m{$x|AUEd4BHBUyPD{{nGal z*xdBidW=W zfI_BF3t7kd+WUj3l)M7=Zcw&IjBXqM-^pPFf31cV&N~m3N44x6hH>E}RUVKf$S^H5 zuF;dZPMgBlxpBk|#GrnH0|1byWW+_(aosme`w_K4mK3I}0SZ|mSY^^H+bm%5%Hb9J zuMTN*c$7N6Xs8)@(?zg3QVKcM+cr8{hkmsqkCo}JVJm8H1YtM}OTmphIcwy(6p?Id zD{Ip25z6W_2dNPY)H(@y?Aq}A71|a5E$R9K><+5t@19ePXMV;Y1|#Ah_c0f(bZy^T zHemnyCBoOT93Cr)pb!SAZM2<*N1u!!P^?Jbx$Dd?CX4KZE zFU8nP-=WlZDVJ{o=TUuWwFkG&pTL#j z>sW)x&}5sbzBI&bwM&L@F)nV$rod24lFm{qVt^~fPr{!nB|oR;Kpm}Ir?;V^=&^)% zVck|)=tUozm+nFrA!1I7H7%5eIMYz zYB3IyQ&Svw0_;v{k|82eEIZgD@=`XH<6)j*wNd@1u))4-AB?Se7Z0TG?q+Mj&NLp3 zpUDEKQ(hxCx}&t+(!R!voGQ{>+@xKp#v==`i;`7*w|sMl{f3qhBX=%OkJZGpy&_GPuIRO_sjzp>96Q> z!h#ASRB7)wdE&tYBB8XiAPWhNuZXVdH~{y7c*Ilg^NJ-)Nq zZgOCMW@BR5Bl=^%e7xfq-^nfcvn35UfCXzUZK5nXE#z6h#28jTOk(nP@({5&44B7@ z@?Y5AOtT6Zv%?E`$nx)6H)R>->C|GeGB>(LIT&l6OGuW z7sOF4bTU2@!Q$=OHud@*L?B`YP}HB*+cNbmZr7kSsepK?!wJM&*{76sMjpI(0^;P(=ZOj@cKl59`h z`3aAJ>RUBDxV``s4UWD-QMPj+N4=5Q(=8J6<_!x}-m2qtCfru}$oATm@@d_@4?&QR zBuLjh!mIqL1%328Yo)s`$T7oCZ=%Qr=MKZqbSC$!h@T;g)M*({4ZZAgUa_OGK3QJ% zG4X-_8N!dy(0ncBEH%QF(YT7UO+Jo?7fo#NZ)OsloX)YB?$t5RDM`v8AfoDaJi06b z)GwXpwl;Sg_C%K4Pc0d|p?aDho@JE!Pl^J6v49lTBg%Z8Q&5vZVR_6{FaB<0B zNR;m$^?x@D$f5ANBsdrkJ=J1TyuPL_U~HcWMpwGP^kdjqDj${5J8CDe@j*%2*Nscb zDH?#;0H=1Na@%RVoLJnI(9;6SpL6$1D41%a0kX+4n8jfL*C>_13&#-?JVqSjUu%FrB>`BsrmQc z>|v!RJh8tAf~AQtQ-%oni)5w{Z2RMh^9KF+ZdO1;AjMmBYRNhZ9aGttCph=BRE$M;`a3RSk#baeVx;rl!3| z`cwQ4g?(QH6(`a?zE;xCGrY*&%7(<|aSSuXw6w={c~FLWyUjnbE?<=%1Xu&CpEzwI zXqahpqebtc=q{vP-h5l945W~uaf8&VSLC5JWK1&x<}su58|tU5_|D*iX< z4DvQ@YE|^h?lv#R70>zSf~cwBR}3286m50IAs5%-_rKv_56_SlSpuxdo1HI@D#0o@ z_lo;^`k+B4&&O^$q8=zal|Z-Qm8Vj_85v^KAC=;}I%Fz%QF4bqm~N=_?3TXM;|7hg zWRSi9;V%tEtx@F1=UMy=eAhrTxa#OEJ905{eTiCcnO0&e5$Drtf3QMwqWsAixp@8P zbG_+=m=G@;x89qceMEAPyvZUte_hz+%kh%O*f?9Vd$#g9m*3F-HzcH~Z!sRt0~+iG zI@6x%^{xFCL^x_^#&_QhP^5_f<8{y{-nG!9{r&Mo)!ebONo0`(n<3i6VC_qS@}?aT z+gWniN9VoI1}BN9(B%IVq8Yj5v=M?Z!d9z2TxPp7TQHiL@LygEK{6N}upC7h`3nJi zDp2*zz`{WZag?HhectxBl!%phY^>7epXvqVFGU*`Iw%Y0>e51O7 zY_h`&R3j1<=oNxM8U?L6fO+es>^R}Oc(r{(J{ z@A$lUc@hOcPG9d~lr`7ipWM3w$-zOq1-f>h3{uA%=~8fbAvXkaG%679A^OF;|~YqQfb5P3xxjr0(H z&4LMNa528x{biwoerh8WC!P8H?UL8 z_->gOoCXE?FhxcV_tqM%IE@NLz$^B~C*oM?H~7&VYCBfi&o(DCeKtAO)_I2rYY^f& z)b+ka5@4<;N^ayARMk z@4TN&YKc{qDhf5}q zd^`Kv%LX+;d4my}i$}&DK=CE!KkGG_N<~b9l6Na6#Q4OZ;`?TF7#P#Ffy83^) za4&+K>77~G9-_UD36pc~&3Lv9QOojWX=Ynf&6Eh@rV}}y@BRhwrSmg>=#t82(p$HtP(I8xj(mndegIrnx#+S9%m_QIE z&18S_BMq`}z6j%Wgh$TZ$D)Q80S#PurKDeOyU z6chRfx)(ck@_1&~D}dZf{vh5Hds% zet*IijKn1m@~UQxoH?O$P8U`W6eMHGLAWsIe7B}#uTYt%DS%OwaXtNS)mkB$<0Eu# z5B`7^tA>&)qXz%0JRTTz$j3Yn4&=?r=iPC#ingGQ894xSXg+Qk^M2NYmeJt`^|=nh z)DsI4t2MaQ8@EJ2$1G)ykz1R>0b^X)09tcXhAE2s^ zaHFQ^BtMH;^|8rX_O|+iSnq4x2D&O5L8Zo;?35^lm?mbD<*;*k2*o%dgg&AK!LR?0 z6p;ksy(wx&qXc6k4XWPyQ{hR;7ImEOJ*hi*a(%rO<4q0T_LRU>XJ?rsP|l63{YFK{rh*PxbWMvE}!XBx}fqJx0Ns@{EBq2s>#F- zc~C*k=&zS&ovU^*k8C+mA|S1Sx7_E97=-eBLe}Q)^gop6nWkKPmVnmeVB+Wh&)pID zH<^5txq^R$2_(ZmWHl=zWf52btVh`;3Xt|G70#Iw?_Hyv6`{UEw0qP2IkLO77^d%2 zli{t+23?zh88<-fulTrn_lQQ-6Zc=M#sLL+$(kE=WEoi4if^r!Tt(vF+BC}jK3hy* zQwZG3w1rqrJ&^l9$o3zP{(}0?o1>8RCitgb^+*fBsPzVTOX+?C78C9B4Uy`ioE3K| zRCTa+Q9}W$?&(fEjQ@@y9T!S}s*A3i2?^%Yc?FW!G4u$pVy50mrc7w*NyCUe*)yuup z{U^5*G|;Tdl=M#7=Kj^SfkgYmrjf|6A2;x2js*V>R@}M1n6eO1nf;4dm-qZjAt*}B z+|?iR941J=P5MFF`7fyaZ`?6~zs|URovBjP-^Jb>9acn4-P#)(_*#J5W})!#b)5V3 zs>}(b({Q;i1QZoOrY3aa$ECjn2v6^@TDr9$R8$9K@*w0C;Hzm2!Q64 zD&Ryg-U3p9)NP8FBbv+jzj_z)Dyxx-dU=A~b1dd(a!v+l07B=KcA1lus z{sF-i=&uhH=e%DDBL=a$MV%zT7w$Dpv*LbwMf^;G;g~Q9fBB=QylGJE;AFkiLx>AO zctb$&CEyk7-(E2po;0_DWLCv--|?R{Qh3cznpd8HE)sL z27ndD=zatWM;2nyM5CIQ>t&y0UBt0;ZSXbWHO<{F+sccNOiN1L-Q8K5=M+n;q#h$c zBa`n4zzP=u(8s&(vV3|oq$^>;s~cgT8|QQJJS*8RH$1j3dndae^JhF8>6KByP>_Qt zh?!kkLP`QM2GSnqrO5-;$MYmz?Qe_+n+R(Jw+Ev)1Vi=sFLI?@rsaq+CP+E6B`zy) z@INoD;BzM?eJ1zLf81*jMH!g?vo*hDkC4^iy)gfrVW z5jg8SX9EZljs8N&`*zI_Rz!$zEkqOUSCncxs^F$vtnCjbxXVHop9P~|zxL-HvNJ&N zE_wg>_(H_lcPM4hb*OQXs98%&41SApB^{WJl(dNjhT<3#2&8TsO?T))EgWxiApG4p z(T3{zcqWs37GvtjAErG3>h&CPO9E<`yRjNbgl{eClY%57Bq27HLin4*+W;so3?!5> zHe-z|ielg7V~G;-9p5d~SLO9Liv(gPTuVE@;u<9pyjS}cc;UFNnFa~sWw0jCb!z<5g=No<>pJ3E2 zdZA>+ac!ovR3I#rKqZ{l_1%Maw|5~5!~NmAx>xt&R}^G06ly4N6G^aP?IW6$uVyaCHecEfqXE zuN);5g5|3}zcg~izg-Gb0SfZ*;}>9=G@E;Pv6kp@2=WaYpq&)x2}ljQ5-?KN&)aDR;ZOR?%2d9w-npp-GXh& zDHqaH@mA(7c0=F35EO01jK`x_al$1}Srthk&T-j3e-`P_U(u}8RU`vOU^tHGtq2RP*f4b8yge|BWHwQsJ(lY2Aht9@PcQ3QxGhk zyA51+={l4r3opMrg^_0y3|% zxFGawy8M!`IeB<_F%k9OVU|T#$~GfanVcwv>}^?Etl1K#HCf!E&(eCj!3FiRIXWQa zZ;wByfgN6G4YKiO3FXA|vmsCIqip-JN+&>dS+nBl?bR464vkcK<2jq!EeDF%bXItn z2g39GRQOwi2D13KTS=o;0)&cIX0Z(LP|xs^K6GyaiU?xa=D^G1rE<@mz;8Zol&RJ3 z-Cdk{O{%U_XxV+XRf4|sv((Nf`@UFZUZv{To$W|ye1jJ6UWs z!5+Ok&Md;#p(J_1D6>?MYbLiqc;%8*v=TkXu#MTS4NU&R=F zE0K#mqQk$-0P@5iBAt%{F6o{7D&Rt_e>@u$}(eF=U7Lp1$`Z*YI_kI?o$VD3?oV ze^k*N>9O~Bp$cU*V69bVQebq#pbJ653ID7UOTEZb?fA02o_e9(&Ko}qmFc4OjMeE| z9wX~(qQDdiIR;tN`IoC;0MR!O=>+OKm%TvPG4R7`9Z#LDc>{#_6gqr0xod;F4Sz_0wzB^xsQXUlIQO@BgwQ)nZ7zAT}d?r0g?q)#W+N01C8^ z5GrvwgZo#l=&=g4W&HXwLAmQjGh$P_JJUo-BEDF-jqClnMAP>B4MXBI8G9MhL5@?> zapQeuG+)qrVxua1H6RKe6txpb-s=eOO>r9qo$ajKzdpLpQGmBTUzBMJ9^c-Sc~Q2% zemp!@^WB6r+Q!WN!3U{PGt1H0VfNWCIMc5o*I~{MMPRVcU_e^#GTboLJNH8II7Pce_?Bd=-bK^;uzCk<#GVtrg?B8RAq%^g_KR`iy6|b{;&lT~Qt`>n(Nabfg zR?Z@Nb{K?$$_h~Nj|9R}-GSuTYi|9Clm2{#i%!xWJOZW>qhX^Tg8#l|T(Y4)3-#7F z3TL@yuPesJfsr}hz>u5QG3B*4jH9vrqC7`?XRFKPRiPF4Kn-*Z%FgojV|hf_s_ZG zK?hS*&uvG_4!$tUbu2x5zI(5~kePc<&{?jKu^r&g;Q3MP@^mH)uQ3_pvA(T=h$vDv zE}xMZOjeIG%_{VNkpvE5x20@Hp>XknKo;(QK|3Sh+MCgPd(+^x8V4m28518XabP(m zDxE!XEs|iX{?zd>7=99Ja=}P&odvpgt3O?-D-gTV?yvA<%bTn1C^_BZq|YY~+)OmpgAvgb{5)ac@i(-pw}*Q^le=_*i&GL( z@KJ}59umx_ujRKbQfl1UVZ$}JbwD}(AT}EdBp03BpSxF}X|)M3&0!@e`}}E4 zASV9mW{Y~rMjiXdFc4mMaS$H3U$g?v>-MR)nSNI3Jx>@an@iSdMg(>ZK~ z=SpS?296|LU;HZfab6}4Xuo9d8s~$xakvImh_-}xPGQ7A)ZKW>A7KOAl;g5D%LYJ1 zI(vv!fy22te;V0Xm$khwfkUzbo&@AB)~5VzS)d~5_^GJ`+#<1>o<%rbaKbEjGN^UpG@gpo1kSwjN$r)A zqXU3*;m}cqL9HrCnS~}XKdJ>YeQY%w!jb>OFcb$@rqgXtaPr%srX0K8Cx*SW?@;lLp%J^*ZcmOq>)^n+aWfMssBtfhS5w^}?_E0U&ki;UKHqO|xtlW4ZJt-So%UEV zA3wm$v-uv_3BR|pfWv5BV+^}wxCDK|krUFk*sHHoZQ8A6Ru@()AREmm5|pjn5issG z*DVEa*LHF%QjvS;x`!7jYCwYn-m}GAm%sp<)K*+H^GlrfUkFG1#mN@TY%okWIixw& zC;oEf_dZj%kG*aUFCT8Ic0|Fjvqnp8BZ+8AD~dEtF*IuLqDj>5UWqoGQoGj0_08Kp zuKoxcfQne428rLY$Q{w+(wn){)8#t#(1lxDDsb&vSM=gmKphZPaNGgf|)Ry_lQdU(1C^X!Rm0S}T!keL$dGcQu@2LC-eXoQV6Mo;>ri3Kky8e<0g8Au%vw zy?PUQ6BxpP+N$64Q|QII)uY8Hd#eL74Z@fnm&onuCsxk|savKz0ysT+hcKYY?F(jbL2FB(wW zcLivPX$Q8w3a~44{(2INccR57rwyuyk5znLj;hBVMXImobKqaPt8%m?HeB}aRS(|N zsO^XTY+a9>5lMaU@(Zb`L@nm|#U|!?!?^~Tt%~mI{0*Z^@U>*+IK6@Qc;dm0JvIy2 zR%feJ>e&Bi(tWP=3+9zfEC~-cg^lt}G|^L0F%Q(CBv4Zotb%mp5(VklzKB=Q%Dzgs z8rVVS%Hyuhse+T3_LG9v6{@ExC?ruMQm2BCkjY~iI?Z6B&KMmH)#W<) zmpDsisZHc$58x$$H*#?TNBxL{GkN>J``8Ctl+DpW7OT1w19-f}^Q}=Wvz^yxW;6{m z)LW-aBo{5qXqVL;;@Tdil8Pa8ASlZP|0C~us{r2Iv$ zAfTsgFvLWP$NpiC--8u!yk!-+L>epp*I>`V{~Nix!~C{%ep-4hvGtd)E~e*z2DtqP zsD2~w(xxPEz=!@+PlUI-{5mZuT|&?qZ^92wF9l+JK-)m@Z04q zFFyEEz+aBv|DvIzn<;7!&vae{jYbZrxkEL&E0zh+G@OUn4QFe-0JTg7Ve)5NvysgF zS|Ng@+qfqkIR(@L@GEEPgd!7UaU*}x(mN?i5#oy#qfhB2$co+ul#KF^@;N@R$Ewg( zW-4&7U&IN?it!i!|C$yTg;B59EgQgFSgTc^qd_yNw?H=u+Bj>2J9FRiQZ7ZLur;Ql zj&a$S=~;Kn&{1kC)OeWtkm&{auR!;&%j~Y`Zdlt3l|jc7L$!Z{YZPxMbbnOb_QR@! zH^Yk*Z(D}OQpSFLIg!gA3^cL;lHl>B**@v6j?Kz*WK&B6Aii|s~xYp8&($XJLPU7&_jXmb>uK~s!jx?eE37~ zETx?JWX+wL%I-{@(7AsqglYvXyKCfLndE9KCBqSX_D`H$%ExV`eERYo+zOGV43Yn1 z=#{5S%)C>`xm7ef>#hr0_vH3npF%iNc*25GkLiOh;RXGWLNh;aX8tm=4Y`{OTN`X-|lo{@fu+$ z4+~>Zfbk-4>+(I>uVh*Hae@86KUqGc*yTs#5s5wTzlAKkJ-ZXfNx{bLV}S2aP(2bh zZ{|vK?v+vU-wsJoUk2ZVoGjsR_f>^1Cs@cYj!@7%E>*`mXrZGsluh2Ub5BonxZrjFxrVsS@eyc#00;c>r|8~w&WrG+G8)Jybdh#pAw z6DGWT!i3aWtpX^XSIeSK6<)q>>3RrKrG@_uti}j=bct6Slt%_MINz03?Ce&CGD#K| ztt;@pWcwTMUz?k$RlDDGb-i~xCoCj><0KIDh$L}6>L4yTD3LQ3Xx)P*9JJRp6g=lR z?mx<+*(2}t{2G}q+ZFpO7uG1b$nnwh{IphZ3WRZ78G!^F__4qYQOAB7n_%HahRNw| zA$V_ACm`*owzkkO&YI3U7OOx(E$+Dm2NvBEcK~ur$@Yi(0Ic8%`Y|}J^4X(aeXN~5 zA-~B>!3L#ZLXds=sBWR`FGd^%!9xuIK@!6@TaC|jXO z|NLb2vxvpT{&14@S3WZ@875p&0SvwMsUT)<@p*plAD$bfDH!8P$Sp%cmBo(DpCBvG z?%L(Ui)nRodWObpY(K+Iq`3H3i{m@J(`g+`m%u*avcQ)yH#5QC%Lh4@^^}1`^%Hw$ zZ(^vnnm%E#k7^+=K{<~>cw06`5FxS@!&a)7%+Ms$?JoHE8A%za9^>8!z6F{70Bi*( zGNjeDWQO{Z5Q>PW=P{SXDL{mD)Hk={^(^#HvEu{iEE)uUEv%2IrvD}57!ym}& z#l+yb(%s-J?(CzZ&Gkn3e?%=Cq0EBu{|}&oVP|5A?LD}q|I?k44#6=l%GaxfIY_%P zwn)#|mi6!FIv*_NL{O8{p;woGB$LZzWdxbm5khi=gYD_&-!`*^ezY<^LR+=(lG#mM z^n3gOq|M1U{7+|PhZd)r#{Gjca|y^JUIJlU*L=o%mC&JmHRZck!@5<5o&VM+AR_tw zyqKQrf8NFzWGc#F7SL<0D=i;oXer#KGNh}01++l;Hg;!%(`)qIOpDqMyu=u>!-`Q3-Eg;CwsU;0;=g8(7HwhjG$_qU}e9L4-I6Bb)K{}!BT+}1wB z{*T<|n@=;7vTaQmKdQnznu32GO#WE7{~GfYsL2;%ThlQ^pga`dvkX$cx}l|PM9w%o z7kN}AVNDumyB*0}RFgA>d&3CcSa0IIZ{}aGMtZ$XJ3yR7v=Qk(dAXH_{!iw%ftrV* z>01#cj}4#ZW)IoHkwANU(HvMgfXN4!#OJ%hgqtpYcbT)?g7xC`bH8JG!+@!-If-8`xXO}=hqlJ%%_4M$NyYVPM`6mF!qh|Zl0Q3~m|!>1 zew9HQue;ywm~S8RFSiB_JmxchNpOPB=VqsANUh#*vx;qP>5i5u`3mlvrN>~AK~S*K-wozSvvwt^>P=o3Eb+<%6rJL)_ETIZDO;&I#L zoOiAC3M466+H+p#yqt$FNLX=p4aX_NtUOW={_YBB4JvCdN|MJ@h{~8mqk3D|fqxyI zm*s?)^Sd47LTNSZ1f(g(E|)udNGSsNHuMw+nh+MLMO$uoc#3Lom_^UT@k2&T3&tvt zo&?MeFYUdV@RQu-*T2~$J#++pG>f{U1wpF86lQW%a-6fz|52K+AoGljLX!{>eFPWO zXjm&W`UyU(!L>hYoH=HpwAVX;?q8fZWGk3 zT-hP+Fz9Wpw9ok?Baf+_-s{f_f0TEUjvQMDq%v32V(a$_kqaN_@E4=ULTHHsAu!CV z^9{fVtB{wA>gRphimneV`x3O~ZZAdT#P+Pi=^*CFY^wYT3uq@ZnkY6Fzc;J5*u!`h z(|TgV;UlDzvxk`zuj%poX|z&Yu(sn@h+7ma7Y_HqY@O*p_Xd?EqVt==JoD*ybTo5u z#5`VPsE^hkXvTU!al*YkbPTqQk&suEi7dO-u8M|1@`fj6 zuC&Nh)B7oKLC(VzIv$&HP+blNC%+cFMco8W4@4o`)g@A4(`RxJY`lwyHhhs6Y~#Do zh3XRjFQN0gj+sXqr7*4uJgX)+rgvbD{Uw|69;OnuV)(;0_ImS^56*Gsm0m9~iR#JS zY;9cEdM? z(q-+F#fIR|-C$cMZ?e<@eit{g%!({(*-sPS%>HtQvvo*rE>Yt}ObfAnM=AJDA4`?( z>-tC9W9bfxq%F%{|3v0Ml@pYHa z8oaTCNo9x_nnur@BNMu8{WWgavpU8d_KR3$sP|{udnICEarr`rUM#2@>sJZuwPa~M zTt9{8;>1NcD>Z#=jQ+FQDeunf_Pk(C(3a(fyEfHIOdp^1zpIP<@tJ2*vO>NXbdxK6 zBCo z4h?{3hPO45eq7g`2NOEWK9o*ZuiU?m7hMhrT zdZ@Zw_5zD|WF#)tX;BKz+MgdUi3vf|1^Vo!4qSAMkI8IzD@`}@|2FbURaSrbuzX$` zT(UXpsB@x&(9TsZeEx$pZE&CU z5G_DTG{9hIREMvQ!>8>SH1f71f^aQZr2IZqO_-Dmtexr_l0#vod`UqZd*z92XJQMH zTSL)Pmc){3j?U7FgA|w7ypO=qY(EuQ{=k%~=Ke{5!K{Msc?Sslm{>*PyZDcALh*lK zUVWQI=ph5$b-v7h4-Lub4}2n*>bP;NS)KdaS{2@7;iKzUIi747<>mW&X^FXYsZX@t z$KL=gYeM(G(Y7w=VO{-ctlfnz6QQ@?)&pCoR4a@j9u`W6G3x1ZrQGdAlSG&eXYjZ? zp-G+*vRLb^wBIH;a7BvMaf z>zSEJByi0k&ExVY2||T0QA#^*mrGV*g19BNH{o9KfLEMlD1!Bz(Q)`AueTxfMD>vW z?f64wC`ehmFnnY9Al{u>T^8#UwMHBNSPfq+1|Yayn#N*_AV#=u}31Ha02O-WCHXN3KIOdjKUO zjGUP@rSC!%KPxkjdghQ;bQ_N{Iq47KcOQh^3>jdKOWfnYdtBup11C_dn2?$aa31az zm0qjvvRL+VHkA0lEnX+uZ%l=VzX_KU`>B84)h(gUem&t3=UeEDap$GsvpR>@lPOS_ zD^f;(Pl6fEz&Z||tN!PKwh>t49PkjgVD$@f+UD+68Deb9c=)UwYt{;xI8-R6Q`=I> z&AXnF*);Zp5MVdh1Axu|@-=e?epd*fg4`R*3z{ar8M~sMTTUNdZv2{sODZg~*qC}p z?bDmz(5&aj7VXNR(nmgzIYvc87YeRXy8#1!QqZn!XHUK;YdFPz!6h0@VGCk6r>HR9 zIayu&sZEGWRk;4WQz^XRa51VX3ral0A2st#F?e|?SI#Dfv!CSQW^PP`E%BZGrWlCE zDLL6`w8Qcq^?F)3S9*9N=lm`FlF?nH8U(FTq`SyOvw%hjxCvslo82;=2QYKaGKV)- zDh}a$UG09gdR$Y$;yMZROt>HGR`Lx9)RyNtU$Kq_=b19C%CL_E8pbG;q)igTe<_du zf24el%_piF-1G52S#}lUZ;21t2WSZqAhR%~U1j?IxZWn6H~MWYwi}(2-lns59Jh*e z{N@0wSctlS3rF+!r2j$bt2A!_e*7Mv(}RxqDbe=pB|`$7F(@t&>Nxv;dV2Y|(pjX( zb)`p3J^?5hD)#52t9NXizq!1)LlF?WokKUl(hCf^KNDrQ8P2DNzA(*ITx?#!eBCl`~u|-7T)I|4*`c#Ll zB#(tF{BD)3606W4sKYG0GdLEHDbJ}3V&K$s~kmVJM0+aw=X0VLZRc@L7TOegG# zBs!A#_5B>vAe7Y%NWPX_;+DBU{qTLrcAY_Bk9@jcTe0G-DDbUfkJ6Id%4M^Y?i;D8 z^!R$Y$W<4*_843bUFGb_c(Qhdtt;jZSe__mU&^5i=}vV&%3s3oNt_uQp^gPIB`fTu zXnF0}qt%|a^mv7~ptw|Brs2TF$Ktf6){qva$gz+h3`+hy!BwxbIyR- zy?vy#EFnJwj9)|z_1&isy(V|ph!2eV%@2BmbwyY+9PI^(+LAkiP0yjY1M&0Ij;a9|QNt&b>G3@2z#5U9Az9i3uJE$xSr;7HtOt}Oiq=5wMc!=GPsw#BvC7~RBzzFv)agLbU z-601|kC^3|m9zxWgD9YJ?XBUj1nk0kjE2lmO#reJYDlUA_+q zm5+1gA~CVvA?U}AI>(J&_Glq@(?rs?|=sgNRX%YB}(%Qienh_-T++?pd^cP~?tR0xH0uj3j!(@4U%-QdN zx541guEujAcf9!W1tegM9RP^H7@{7fVIyvzW)y}n-Np~*#}mQT%H^H@k3nWmzd5=sdv;b z7S=JC_px{X+Kq5LqTESPX9WO6`uYKfNX8G@#W{d^C`c#$3BNC&6*qH)D+esVM^u2L zk3Ah~IT)yAk%yPKY+8`F=I@^dTBu?4IYTB%KImU?R!lmGCOh zKY5RiVJ`6$c(x&e&ZS^0~%MI~+X+P_U&| zq0Tbb1M&}0MNqUxvd@3w zpF_dRqwN1t1F)HBHaeViKU;E`@x{L)+E$>)OnX>XB>YJ(=xfFjw$w;LXlpPtM%4*Z zd{)B(N|nm5?Q|Ud95DKg4*1dhH^|zLSm8zoSGt=IQA+!HCI#q7KUU9r*_K5Xq#%nK zckHf;5}Fx!bnV{LfN|Wulp%}6^#J{vq9a3m9cLtZWa4JBD$mU7Z)gtR@&myOp~$)C zdUQTxv|&uqPg1FAl5lPdU|k93V~^UxdThLWcX(|^tm(w4-u{_xtUpom-6CDEvv;+W zVzeV$TUl|#hAv7Rq`oyY6Etq4c{Ovlo8`q$esrCL%VeUBFx zvt@MPzE}D&j^2W@_1he?PlkI9v^Q&7ZNN5RHr@)(E}MRf2&SZS|kfa&eSt zyD!ygq=qkRC%>MTU9qJbqo%2;&hHnsy0zAp0kV?Dnv`q(Aa5c`3J6o=a`*i7{`IE!gVRQjtPuvz>bTspup#b~6uG=`?CGW}19h;Kan?aH|~kU3oS$lwSY3KhTn^&9&HS?tFnC4==& zF@sSnb(fBzzTK>SDY2UHMw$$eMLN+J^={kaa9(%vPi%+M$mdmJ~?D@s++@^ zMM{`4%fHiU2RjcJp3Q*Ww2(w9OkKtsow29Glv82C1zb_n8l1A**<07t7TDq^ZD2gV z+QC-AD8_qbHs)=UA-R3RG<{$y+0LaaH9cL8*~|LtM`~uB+%)dByVozv{379`Kij60wh4Y=7JNx|lt>pGO3H?$?KPF<*-Vye|xA zUPirx8VnczKP#KZWB7{;;rKjF_pjZdXV6wl>b2j{#MSVq0l8A=mKMo{LH9KPREQ!R z%KqIw&j4s|T+;nr5ff^{z|9)dv*d|H!3!Jjy6i>A>ksdabb?JTFfmReu>ek5xoGk` zmBVxA+!r&3l%}rNVz4;u-=?3+mPQq zHN+mag;=i721Btyn(uq{BhYz(&49C8?qDysx_n^kYUtfFsrr1^J{Ehfk&9`!jcQ7N zjE!7ViV|^@UYLvM1crZ}*P0iOW$CkjEa`&)C!Hd7yXaQ8Gp+clZT!CF?~8d1qpKDiZE3V?zTJ!TYuBmVsRB zC-d6Ihtp&FvAQJv`&QX>3ydt~j{q8Z_ZdmOmsvXB&P4*d^ft8al;h`NhVFz)*waO9 zccOY4YyG>WG!GXOiMF`6qPk3R62uO*NT7jn+#RjV8#QJ9SrOpR>Xa}=Z{!uXd4*>j z8}(fHvsO2*q`lyOC(gv5MSr6MVTGha-LUkBZbsNx3h?kOIz?I_)jSVWvEUnL4sD!N z&{}5cdF?3RhpkB6>YQM};*pKolU3;BJ~FItp5J_6IvRZ%{5n~pOz8`QAg?7iCM!#R z`N|vewkbo(!Fy)7F=)E+)>m`Eqzk!zwOfitMEU9L*<@3(>8XFPXa1T z88AAmvT?Ce)x(Lyh1B2e#)+$2=DFw?5qaa3rJh-)0Q;w1X-jtO6Ur~Zsriv^L4Z)^ zo|q}OexG9{!Z=o^=6~wP0=T+x6Pz&LOLsLjK>dTP&a=|(zg$ODmjUN+WAuhKpAP`< zHZUluw6I!$$1tf-`yWd-;A~E5P@;EH_5siKf1dBRO;Uvm$(^%G;Ex#$s|dFk)iU8goxF(z01LhP)C zYgNbLZc{faP?^{=c&Ya>`0&FMoZt_PKT~E#xWAdi$UgJRU@b$_Jaw`O)p`zio}OY> z;-@nq_uqJ{BHV~V4@Cnd=;|1wLDPskixpARKvj2tT@N%@!HRo0PA;Ib!p8Z_Wnv1( z(q%Gubp19rbKG-gca-gW-v8M3{V0x@_kvEojHCt z)6wfh1EaH#5uxoqNwMep z$*A`W%A9~B)6JSS6Tqqp6my^(i7hR1SurJvXjFcCHOUM|CgJG4Ci6Vi#gu$cQwrOa5Rl0onV)WaaQuKF1^{+asgMbH<5M<) z6EK^g#=IM<`CX@!!uLE@_+%0PP{~V9FW&{hXU>np&KZvS<>g#BJF5@S9#1F~wQrD<044g2KW4+nJ@p~Wdg|zSCCzN5Ek^iPx*-j6A4vh1T{!{&5BG)e zvWmxv<}v@ET^*!)97q+=40-k;>VL|u1E?WLsgWbSC-!=p%ZcTqro5cJru3y(wWs^REcg4GRXxj>2Bn zbBy=;xq)lTm_4#?LW|UcYf443K+Pzw(Z#V>F`TcF^#a&>GRlz=_BK>>7Rh2en}(`e zrDa^OYmDc@MKy}!>Bp9a7%$pz&(XuqsVYQd(rIsultFkSTA>s+(XE$tvf&9A#4^W@ zqIS>V4fi9lfV&eh+xyIP|E?G3TOsJg%=g87B=x*!M3)c{zM27kMdMOroKJdjQr~N# zKYhm{AA+|xe$Cb&!>!_M{e=VMemAOAvj$i=-`#HaK7lxrY(|3{O^D^KQYB0P=yVU& zm*$FcOP^X18=k!7wy3yWzv1<_3S849Q~;J^J3sfo`jQUc170SOF-iv%eOAnM@UPTm z5*%jisXO^je})o~g&`~IYXQIx)-{|^VXn)Z1W^~$@|WkHC~ZhDzE7DXJ#_m;$xbvw z-Xpw2ReVN*A5cQu7$h%geGziWN`1nB+6yJ4e7@bXGOPtfm^7CW(u2{Ct zpFb?-2us9N-yV#hwq>1&H|@U|72F9v&_6SI5cm@DqODXXtV!BCf3{C5Z0-j(jybW< zA;CP_%WXvr_=ZBlXDDiNn^t7<@SkpgBtKtNl<8kIaTDaf6P4z6Q^RhrOXtp2`IX~UfOUsc~#+Cs1?N;L< z&40;h3Ib%xekPf1a2`$h+P94*2$5p?PWU10Mi64#{Ez+Kf1{2I4Fb|kg%CVx7KT-T ztB8AjGtVq-S4oN`_6ZR5o+32Y^*(rtV3T`q?l<&q-H8W9<{#YL+>zedz-2S;2q%Lo zzB|5;u2+Gf{w%k63T7qjn2FuyD5ka7H@hbj?5e@9QLodUWZoBn+z~ zO1k3{?z2RA_j1C@|30ToDsUmAoxfsV>b?a0nbxx=TEhNr!kEaVDtNMwqa%FbF6igI z>ISV^W)g<$=!UiOLB$asFdH3?&CCvmyheKqJ#XJbAT;2l?FFxjC)P+LW!59RaGr|l zy^+1kbily+eYCc;s+8O)%S=@PbuX!hZ1Kb4t#UMF3`bzDsA&oo6p&PRKf#&Y=V&c4rWCRzE@S?WJU*~=rLHfUh~LZd z99fTFM6ZQnG=XRz%^mCGdxY@<&s+sAF}PmQ`7_oLgfQrsmA%_`o)7*c@KKc z-Gs_k&PD$2W`h5o$E76GZP^{oF;G?jgW+63(uWpZHuR)C@22~0Ho(Cv^7#W@M9%pe zcbE4A$;Po3vJDi54|kWcm{u{qIt5S$N2e!?q;QyD?!AM1V9)In;-*`5cqZS$pC7g-+367hz?096 zH*7$s`h!M5lUcWgej{Lox3UO%c|O2`PAw9EFl`l5tJR@2-KLi{H-n4N0()PECOizM z30JV?Ev=Z*Z?aR~1@Rreti%T98yyTB3>9-fpqix~?D;WHT~WxfyeSEGPwBdZi>IU$ zX#RXuAC7jI*+F5ACX8fJWBE9+XY){LNg#6W=)T!7;ZBG3jdal+D|EUb=J5pTFU?nV z{ABgsm8C}4CEiW#c2G`Id*p?)H=LXyM)x_3SOnlY!UJM={Y&y_%T@YK@QpLB^(7Nt zivEW96KoESj=0|Om-ab0xtI@<5-1W_Y zB(|X^p4MByWyQLrVF0{3!_=WiqV5;hd%Mgvhk@|22!}Sy790kCd`q0|JwWb33@aA- zPg{x;N-f79j1NRj>#GV^SizN^`aE<6KcY)c#+13F5&V)y{$mxb)86gttRnDlQf>VA zb@|+?GI=#zlW9HkYH^JdS$%n$fu2#8&&{p9;VP$yZT%~9Pn^(bI}(G?Itfefr2Wfd zQ%p&%vG{N_-!GQ%&mD3((c&r2Ol+pxP^sOyN5vM98mbddhh}4;cy1MDb%3oHk(H#k z1YJiCxY&LHM4sS}=17IWFJtOqKs4D%;&+d2K-UrNnyiRObBTnUF*N&Q$3TVEp z@A`5k^0)Qo&>mhJa@Q*hBa8^FT}roYVZ^x;O2=G?UF~-CcE>c-l^UG(@`NUo7J-ZF znAv4=2;@puu19BDEmx*U=nRBwk_v;G!Jw#E@??l&*Y#kYwR(NDbWTnDjo(^5r^J-5!*1|N3CoNNg}LM6`<7;tT-XzVan>djty2)%VjfXRq2Lv+6YM zzHw$ZM8g|&NNf^M$s{SMcO&tFY{zv67E~q;75CZh-i$YEMM$%BQ8Bn6L;F@Hrw zAFp7H7_&s2+~|^^j@DpYyMDQb&vbVrpfx(324?BVx8EV}dKF7U$#wnTcLB^GSNJ+f z`J@)a)r4|YcXtmkubG$_5T^WC;qK~I$fX{!#c*`IxDYunv&r7a;Jo(u4Q5ACX=4C! z15o7`^$z@wgISc;aQ2%E=9&B0&`QA@;@!FUAM{H957(-@oQ%Dar8lpXay zJ`rkW7QoC^#Qu75ODVv|9|(;zig6R+_T%!2?`G}-uJeJL*%bMKXB(uk_Vk zsOvjuLfyUlmjW%ogVE1?ownq8RcRmvgT{!*uF&eKZweQD_%bunABl!Hz#pN;(Ln_$ zfbPzA^ND-*xp5>9;fS(t^nuF-Y_j-|m|~~FSb~lgntms)L*W@C{wr0z;gV^v0%CgZ zxaDDP32%Dbfc|1+=ejZuxy?io6s4<*a<$(L}!p{395gFU# z`Y!6|w@gm1h1laf(k*Iks=4Mf2rW6)5BS~EOE80hg0^L=%<$jrV+?u<@yXC{x_<=f zcJTr5oqgLpTYwU5ZUs)i_%mP6o~RS_FlKr2Fu1()E@TtB1KU$K5%j!YA4|KA|mjR6A?Iirpx{|Jv>g9!;IL z1f-S4X+7}s=R~myvR(_zM8BH-bOS7BdXzCyb?gItC%ySLPZJAb`hLT4Q>4T&jaNDi zbw4TN29^?aqw7Poa!^};g~*$#>155BhXV)7mad<%1~mA>JfuH*<+`6}u8PM*RsFu! z&8agJ1W*i67W0-jgh5p7d0Xl$CN%BgHhH$k%GlkUW|92-?&EGjYk{rFNAhYd!)zf=^D)Di3Ef zAEKG}`M^9^|G4e`BX9U!G4?xB&!Z0aCaO|k8yeYqjAb8d&Fq`N3hHm8mR(#-pOtu> zuZwfoRBJt0>b__sXoLH*#AAH9oQt0n<72qld3*5eGn)EaH#*-iAPi3VBhXJ0rj*PJ z;FQULmnsWIV$FXi*R*H^!o59Duj#4I_v{sS9N(fM@3*ux!EMx@a2#fTwJC4zOJX4$ zNdk%g|Kf1b%)?86X;9a26I=>Dc$rz;G6lCm0Ij>$+Yq`P|84<* zaH%%Xq^2A`y9O@kIT~)T) z#XsQKSL3yob@Q%-tSp=0RjB(ztlaJu1@)gMjNl{RX4SFatQ&*l5&;R1kJn9K&zn|Q zigkcJF!{a*@H3DBImkupT^vc$yCt@PvaWePdZF=G5|rUq)!nnRmMy?uTHwoadX?&6 zTZpo)w95IQ9QH1}*|`>f`CnLfklkTn0_wqEDGsrpGcq=`HjZFuiSY0Jv~1AoauZbq zz#@Kh_`y^EFrOXL0L4$gJf4$56GAy2)hF2$*gmL!>}ULRxtpMMg^f_vV3xPONPn^x zMeHrJC+`kdpXv#mG#PbzX~j9?YMXGkKlu>Jnu2olICp{F9w4avZkHMSmVHq?ZdMZTMN z?Nw#SuwQ2N)oVzsBI}5*03B0oZS9lQ%|)BM#~!@nj$h!`c4K1KjBg|)U?LJiaS$pq zI^a)OdbfVpKXt^EaQaJQ`+_Xh8(9 zll^_wVc=O9?!ENqtzEO|3D+mX;oXEkF{9;~3KHdHuH$v-?|FZmP7}l|JRMiirz~-Q zKSR0N(c8#_kv0X7Z|pTH?_u+oi)oA;Zz3dx%XnQUm6o1+z*;| z8itOu^r5Y#0<)Qh8m6qPKY7dklAlG8Y(W)U?=HDBTb1`KS;*zfp+_z#u*Yqy`23?~ zj&clnejp;_ z>zB!^hD*-2$N`tHeB-{CjL7-xT!EzL-azsNqi7a2F<}p zhsE99-912X*Tvl}cRAlV=f8FDUp2M$*2??N&P+euJ>C5bY^3fq=rEofif2|y7G#xG z&uVnk0^hWSZ!~3O^BSlnhM=`-)pFx<^rhwxRM96Y8t=rRttU2m54yc{9(t=&qw7;! zy@sm0ytu1)NYu}N)<|_#El-%)mZfar$mw+|AqG4cON;vY z;cMv8ouSV|KNh*f930bI=XYLZHF3HYJ|SxzH$GmlKS-Af489n52t>?SE=u9^U8JW)KQ<8 zq-Q~o_o%YdnbMS5q~fCdY8^wU7-vj`iOK|F=8c zZ|UhYg@kh&3$JPhhzAJ*c1e&% zth@&iMltzvIP1vkhyTI8$@Bn1L`+32Ho{>6%kq3*YO0{6k9h(WrK?n0L#0-RA=bL_ zoTVsk^k~KQB+W*Yk&jh`O|p4GW3T#6tJs=B1^37N8{|Sw9QFiZW-mJOFJCYYD{9p{ zGjSWEy;Bs)YHTeH0NNF=cjx^*82`9$&~rQ{=Y0n*Z23KPPjRYc=PTt@M><^&ja>2! zEXNaAx0^&BtvS9u=JIt2YM=JlQv*UY^qG_1K$4sCJo|0P@%Rw(fRjH z6ojD85#*zfs@gwy+l>OxEmhh-yx9Mx35I>7xT9KRiT^LR{eK>0^-)!(b!4dvA{F{y zZ}xw^nfMFzU9^A&ORE^cDZ68wWoK*t~FSQlNrb#lyqPq(=)QAwXJW`J(If8Eqtn(w2bBiPzFtDvHwjGUPXT z#D5;i31xF`kTFU4vp0uT-@?X5)X9nU`1m-}BY2Wt0R#&YtW2)N4;g&RJhr-#TGr0f+`1t(;13_fMmb{wz9H9)_{~l7SM8OS<$so!M zj?_z&o8b9!b>p|^JB?bSV6yLNf*)0-H6O{F^ghHT(5m7jSP@)UW&QpA(OV`)37VDZ zNoDjTd)R0bC)AAG`+wDN;dP_`J^pmR{N*UlIA)pzN$maVM@_A*X;)TOYHXHSoLyb} zfHz!NF$mlNu2=!^q_GbA}D3-FpD9tE)R@%<5S05f~1VzS)n$C+Aa_0~&IJK4m{YfvIePn7Lwk zo}bFf$_d7;wh?A#X@&yfSZX6!i`N1nPsGzSgL&g<|GqyL+}>xl3HyFt9-G>Ato1XF zyM;>alIrTvHvs?D0Qyp=SF`b1NvyZim-!4#*&g1*vkd{a^GsGi!`05j6{z&vW*ni> z1Gx{r%jDa?$iMzsqVQh~LO9snYDR>yOh*>BC$zmyOa_=2YEd>|kckG8>9sTOIM9p# zwGN^`)`4*~t2!?DjboiX6&6upbMvByjh;LO`+h&{zVS@@W1>D4lT4)dMg)yW-uOrA z`^V7ygj@PLONTRg)6afG)zp0e&cep#ED)2Y$+pt;W1SmBF}L=YkN#0~MGznh^=F-wq~g6y=9{Z@p&!Yr|^87R8$InZiyIGQEb>2RNU zs$H!$hDm1BKi8;89~9HGV6iLi7*>A2$hThL`Hzs{Lz#u3j|(&nx@Cy!wK@(yWi?6_ zdPwp;tT}NyAI9?LTJ0{Bq?NN(7pLt?jhh;PUINTOmEZ1pS0r{u9B=c+^EFQP>M9Mz|1b4}>Eg(ZOaWzQQZyuc~0-=7kY4B%t_xp+_ z1}m*f1V_7J|EFQCd0{B(C&T$o_%^|R?u-qa>XPpvp()9NP&u=>7`obQXS_d_^u5kd zhHY(q{S3!-q@+I>Ng;`x)IhjAigNPT=upD_(olk{-KzU6Z;lObsaMC>_1uL2Vw4IA zxOO(H@wW`t)T?xlq}9ycA!T;+ng$&9Gx0eSV0Y@yFL8F_K;YtEeY1@BPk3 z7$Tp^sbVQ#g=>a-b`)jz>$QwIuO&b}`C@|ih<*>?!Eec1`Xc&2GfyN(B4A#_^>Y%J zuAmn5VpA(7ztrYZZoHMxJfDwyOo(b92qMV?rR7ege=*2?V9@W1JXx&fQCl`stTmq| zqErcg8?j`rDEa}TTk#JtL_panS*k^`$2G(@AAD}~diX&ps%dRqUaxSmbEMh`+aeB% zIWN1D8M>fyArE>)PA#b34t46Z)@KA`Ee$$584w2t;GFR4lB)Il$ybx`4TbQYD+FIF44e*w~}S#^a>i90`z}lOF%fO z0qK*C($l=U{`To|{r3@VgvvPNL3PmK#3A85h!C!feju)(5A4NZA*LCMOk)FNf=eTR zXyt#J0TG0Ue96p=qWP4;cDs6o#&*y}(;YV}fjUSis0cw_DKxHRRizGKHJ{pg=>FU3 zOJ{)d+FhDb&q+iBCL;`g#?b(}!A8c(Jl6iBne2tY&O^nK-g zzYG=N+?i{0IUxw7(59+YnEH<@_?MbOpfsRn1&Jg?BJNYFd8>zTT5b#o7zK|$^eCZq zR;e`H($C(L>h5UCuRkfXy=QAnYBb)om`Y}m7ES+ER0~VT1zvB}P=kjRJuO<&?slw+tpar|T(>?^T38rw65;_m$YN(Y(`Wsh1oue~~a&>hz>BTaR z&L#DKG(Qe_M52MyryKt|E)ia$&`Dg^(pQ_g3}#jFL(%=yTz<=>%1R*J7ia_aE&^4PI{%DW32Ca@K6PG2(Y`?iZr2=V2>`QX1Vfa_R zrf7~0+#YnvH2=#)nk=ZYcC|{W|KOv-oJi2~Kc)!iA7Dut6oHwFTZ1&Cj)@#M=y?Xr zAJ#`mdNgVPF6e5~KR5J0+CmtFi_);##g0j!N2*_yIsO;@@jm?W5FY&$JuJ{~lEgSl zP?Kaq-64MftbiznJ|t}v^Z}?EqV$Xv#x@jdm6{O@D+m{~Z_mw<_QH2m$jZmq|fkf%pLb7?m91pr#6et`KoN zss7dX|5?Q}>L0E*W;M;n?(aXy_+RhS6!aSvP3J&7#sB`*FH9LdDlEaHCTL;KpTcCZ z^IhcSW|21~Xtk)7>t51l{>HJ{7V^aCHzO+yJgSK?mOW~~A`9q0y z!py&ugWj?lZ5ITgNgiqoD`EfH5tUd8hHRwPx~yhZ&i!h%jzjp*LD+9qUI?lduAU(GZ0p4J6FY561H!0<|`!*(Sye~@&3qNho=yQa! z!eM#i{pEb+ItcbVoqcQ|AeCn%&UtR4h7?fnwKIN;^|A`q&gpMOxu*O)!riD2eASk; z+!fZ6cY<6YBV~hvxb&j^8T2T%M zR^DR4W4Z&l%5>tJe>kmqg&LpAWH#$=->p8bR(YE$2iDtK*%si;*L<~|lNwI}t@rCQ z{Kg7)(6E(7`7Wrofr{1>BkXA#tnk6iiCMresR#s@?=2W9f2C045L~ne8gu;MN#L}$ z;ln<*eVKax(a}_^ZTL9W1T&s*7$zHnzJudAOmTG;rL8l7M_pn_+lq5J7V_g%b0hkb zmS)DVF6sX17L~6<7dDU+oUy>h!g^?KotB{18hUWPrn?3@TKHJ6%m;)Um>yZpOCQpl zaX328%h-=RWbegD%W(z zLjd`1e}X4^+NvV@z@67;%?@r6-?wiYPG+Zn-Vfw}fp7c5ic)u#76qB&X zYCK$ds_meIJ5m;%x0mO~Y0qZ==%sv!Hf~KBc7O+HSkqx*H?RVpKCWUE&N_&T_ciIV zKxdNIvd3i^$R3Z1#$WA1Hsl~0nEDW^&14LH8ll-2+rq%U>?Xh&dg2jju{VEwhhpe~ zekQ3z(_d`}K|r?7V)DjX5E6p|QC3yx+0DS;9gjfqcPzxrfr@yj%Pk6@j*Ey+PmTr2 zE}Dhul|YniM``2G2)g*KTbHLRNlT)nWf5vksBj9w&N26>0r4MThc;0K_$pRNJqo>* zt3hy(%Pqu+cM~+?MP32yJ3MHj@XW?CGug5-R(+y_ShV=%>}x`x|A4$D6aEP<9QF^| zmZ|>oec!X{BfA*Y4M|g`0v_B{Uoqta?2@_9PvPJ6A;DfJJ1*Yh`Ax#oUb;}z6=!{V z;Uet(*15$>r28xv%YFwQ-yM+>wmg(GL#I^L6rESv9dVo7nhcDclzW92bzG94`OtIt zcg%0mfB4+`9#cZnvhzj6YSTh@T-fOa+Er?wbyWQoB>~kTsQ`lB!+SoAmPWQUmj#fW z1zr};eZ$OX`la``HsZc(*n$O+i==CEG&FeYcu%k;!XpTvu@UmtV3Xi~m71f=`8rZ5 z`R6*eoTi@vRo$y7vT^faUq=P8@&?UDME<-dQ8Omeax6BN~JBphHhb9rd#hj=(<~rxp zTKQ>>%XppypxQgc76xL^bRq@)nT)+mdVU4AkdL&vEU@lR)@BAh$IVZ0?^-B*^ z3Tz=#zA$NGHt)X4VBZqrL7BWBA9`Ewtu}Qb(gEB(bwi$#Gn#Y351Z_j2yozL?{6H& zge|6jdK3>bC~C+#54im@CjC!oJypGh0t+7bkg2lwO$(YY5vF+BwvnTb`%hJ)j? zrGHany2GPqaDQe0^Tr`)gC9KjknyO2`NJvKz``~CD{f<=<~6>ZwV%Lom9LMmx5F9^gy!AgBp3!8`yQsMja#1WQJKEQ`Lux;4> zA3h_z!XP$j%Poz(u!y|P0_;gQP~UJGs)$+pHi6*b5ZRhYRG#XxH*RYS*CGc=6HF_N z^_zODOS|q!wDAEa>x#9MHLZcc+nITkCX7zw_tTeCwGrt%KBjqpRHJ8%5a$6M4}`TE z;A5h8<2>9W4mp!NlaS+MIKjmyh_oJFnHLTbECeMz{J$aAMO)bX2o*QC0c)tXsbc? zmYWGBc4RUu#!yJI_z$_8qZv~tKC6*glp1Q$@Q0}VzHUDs>QxDrYMli&~q|e5G>Wf_DXrAw#Tye7snKF9pl|9Xt6Cu;xHfUYa5Z z5(ZMYlx=GX!<5Bw7)v##fj#fRc$Py(iKHYv9~)I^`V>nwBF;<}$wsgEg($B)+k9%r~TqDbmK zA9)}Q9K#e(;vbIu+<$W1R|ALM|7$d%|MF_LeGgGV_AFZ+83XLkv~`E4nl`;*2WKjo zavx>UVlJe?(ZUSbwwaTYg&h~_k8Bgj4q2RR+7#hoO!mHV^>bgn;qaGFS1xuC3LbCq zmJ=;ZHaiVW$F-FGEr0L2`$r1Ld2G)D!30ZHT+Sbk z`0WBbxTo!x#wzmU075vg!aN=2S?CWo$_4%?8Fq@NdlS<__Ow2YjZm++%bOx9!45;02XgTd3jt6nwGQs^L@PWo& z6=au&Qc(j{md`ZCIZOC?gj&TB6X&>+AGdJsmkb$lv*KB3` zQ(A!BP1B$LLTrfBsA!tgW>RQY(Az(KBhn5B?Aac%5D!66`SYF5l<54UZyK^<6gXe(Mf*5 zZm(yZu8M3xOzqw){p5CH z<4>8IR*_X(>Uo##RGivXD-R~MVRXn6@2#8}LF_5!!Xb+yl#(2R_x<70to!76k({<+q;8Ub z#?z+l+8B+&=7E1PQvIvN;QUMft`tZ_$~qf82C z>>pMeILukuR(aM0$2L>^FbyKIBA3W_9 z$|k&LZbH*g)JFt|%k2javyV6qyL1oyWjKqGb6E?nvYzGptI^9T_F4^u|1&glmD~x6 zMPI^^>uRe#XdA=6{m!|Ao1r1t{>r<>=UvBQ7(sfgboY9H;s(w@y1MxA3ZpYyT2CHC z!nNMDIQxvf7z_>OG97zR*}`Bn=mI(Ji_41(FU2Ib|JtHRmS@in;CwJPJ`~oBj6_4v zlL!lcGpW2-W;R;7R1ooY$;O{FCm-v8`_ZFgwp~W2QRK*WQM${OeG%#1{c{O(A#lM0 zK7}Ie`+`y_Jy~3$gyI6u*f*gDQ+%M$SC@%wr-k9ijiIY10VQ(+^6k^yn-nPnZ;DeZ z%P7OOibb3Fjw#3>Eh(xlRc|#&(D4vAaXVw1F_vly(!$qb3#G<$(SPiCOu=l&IgjnS zzZZOVA=&~gni86>p2769>lFFfWL&t)+IDxJ;5rA$1gyPKDr|`M#c3?!ojXNqq^Lpp zyCeTqlgtjEx1cwD^di43s-SthmZyiP%y424DU=M<-M5V{hbIG;`LG1Ie*cPE<73f2 zF2$IFP*{WI)|H=N+w60p;buzLXwWhA@+zB)@4+@D0c>@eeN~Q*d3a1acdDq|)p%a^ z*nTkIOvEJ*`5$0vq5jBD>@xym%c-GU`=+$F;M1hg*F+^kHl;mD3IWH;1#8 z#>;~YyAV*kfcy2O`>&V#(|*cJ!)snm9?YjQm=GEekK`!;cbey3ZkqThI}&)AIp+T9 zL1H>r>+!R|dg!U@rD&yZ=a&u1wDQMkMo-t=Pfml+1FRXY?gv^;CP+OARHDrZ83XoR zi|#RO-+f_8cA15R`S{$_=AX@c4xcjbEWKOCkoBnr&TtQKE!!(neCU=R!jLn0izoo5 zNkd;ZCXipYd0FybYuO++`s(F^ht7~;2IT@bxig-e2pz`Klhp1jMqsVqN(H=SK4s+PDMO$UDABx-ghXw zkSdtrIX>sSP}KFvFl7QNpTJ(?$UKQQP82(Wc@kVKtIM#hk0GFa;^;0Hp8{9+!Q&C= zygnH=r|+-(;)e@-E#cfOPg+gt2F)I@vjEZTu}_2xg%QLBH%E|H!X{)m3?3ZJ_N-h z^}TWXEvS}d`%?Xr|x+46e?uyE%~x{D2WsyF8KC3RB?mnrQnEzqsKUe+3ERhZ78GkZDiZN{>Z>W zphlqKVl$#081~!YU@s7y%4Ne?;H?QP=L=ar3b{y8ypXs^#P?vUG~TofD525IasScN zQH6<~F()+H;EC@>1}2dvN+xOzBUU1UDX)45A_o=}KU=etB*Bki4GS=83Sn!&;7c(q zdS<0UiqW1nMl@!VGr)??t2Ta}p-`c!%xFmq@s$!)L_p- zOluy86^*0b8&BBNs`Z&PUlm4|QdBltJ_-U)6@zUKE~Hggp<(e|N%mw&tCuE8I&-jJ zF+9eI*Qz$ilG4_y(uvBBp06C)GL^l?7&2U0nwde9MVR^;yX;r`Z9%v9mBn@@e4?wV za<_)P_AT0&m3bhB`MqoU1%D(=W!iMJ#6k(Si3sMh;kTEhnKMLq!Bdc64I(f^*4`7y z7j+Kw8+ip3_^EtZ60odjf7Sw5ddUa4a`Nxn+UpS&+7YCvG!*%wRT8zl(FVV0`9KMl-CwbDLWcLZu4oCyxe)mh)4 z79{x17`=0@fAXe;i+Ln?cA%Q|xh;iyyt8(hfccK_a8l6dsxlSVo}ZWRXW#ykuaooK z@V$y3zLnn7@U)!R_dbryp8sa@|^ z@r-()0HLfW+bl)RHYETdwe~tExB|e?n}QCx+E}62?erx4h!CL)`Tk1kla?-<_8Xa; zA8cOJk7&P(>1gcAc`f~7T)I>(0#Am&UF_?)G1?2%Z6+bC=YP#66zhIQGNopG5*qI1 zM~{_!7}Rfj%m>Tiz9^X+NguPtwQz9bb9w)>ZkKN(Si<-~FkFGxdho}z#Vjcy6X6&p z5r5i=3prkP>lua3@r`qs#RJj@=48gH_u|G$Zh0T=gzKCyvGn|_{Mc0eGCm*Uc=jDX zu*ACO>AdT_Yl|pDih0cGPoM|Y(((Hi_m!+8va5cJA`6z=Ux&?Wx+dOLH^gNHpJ1;x zPohnMBp;G^IOx;Q3c3n z!%v4|cwFk=xKV$VI}`11E~b1Sy#BqJU((=&lbc@-c$=gh3Y2(5dO#YRRnm@>s`*w<0sCyk`{LS7~E3;(r)w( zdEn~Krd@N~#nBp<@Ck@hnubUomT|_$)d5-(C%tivVV}E5+s`i2J~;aPU;_6j_};7z z3um1xdzW&`?8VSzJ#B&@xJq5e^0}~vKQ+K?YfA} zjNm!k<=e})a;jwZE0~E~hj2tv#H?H-I&4=@1s|CKY*VG*@s6pEC7llvIX1Gi4_OlYnYn z!6n|5(*p*u)WBA&+Gz>-;MjIV=Z1!Ukw?x6V4d{?P)#9h+J;;r*%<;|3z2Ag0F;2R z87AAJK9v)%Nf#$(ydu2SmQQ2{`2gme&!;K>T5@#oczZ-RG+>Fqj+fkU#;2x)ONHWX z7Y4_WF@!OW5riSW1TW~c+v}15V5~suc-ps^`b{4VFtU2bEulQr4Vp2S)=U%O3*j*&<#cX5k(9e*8w zzJ0W3ddB!97|?ZHuOGX^>V8JNomSuwxi37_Z_dXNb2Sw~C7Oh);`u$Fe%xF(q?-UA zJV6a3Ug9XB{TtqXE&()QE?B?3GFv=XYX&a93<%LeXM0@?Bzm zWGg2EktoR{70Zgy#?e}WRUGRMujwQl7+~v3?bvwfTQ8mmfhpv$sJ$85t^hj!##2q| zU71qnSYqTp@-1?}yxKwBSxuBJnCO)JQ_qBmoFLat35tT8wQHNW+U>m2vlX@a6L*9c z_K7*=b+r1eXPCFaC*gs&oCY)7`qvIq>%+p~Fz+pudz$fVn>Wbl53*Y zhfM*njg0oFt>%JIlX2a=_*J6$v$6uQ zh$;yL*|&sgKt(KDLp19lg5HCW2ohu`(#d8h!B#9kL2+JbXN>8J5}sV)gpy68yu6ZO zluK%kf;$@}GsQ0U#CzO@T7$G_E5peyXk99UM z$7)5_*1G~{_*gJ%h?CNq8zMJATlPZq z2Q25gh#00C0|^P!l`v#T8Qdqn15E-sR9m|_C?lf_j*xy>SYq{PVs6w6q0JAOw+Ady zS(HR1f)F?2tav(v3^t3>@ZB^WZC9ld{qB#3fVr85wg5f6G|eP=uxapaAQjTa$~s09 zTDmBjXu7}Yo>FR!I@T0i`D2A>yMg#$rx$*-CP0{ejQ=uTu#)@aMCmr;II#a!t^>$y z-sUo&enc|%OxV!xMpIzUrS6OkG>G_nlP}u9#L{;3Gz^kY_UX9pX&aMavvAM^V1o8pzzNIj9AV>)9zOHNA29`_+R4)TW)eBz z0*+7x!yB1G>QT)aHST!myQ60qUr=)d$n*mutKPIJjbX`38yEFfR?&bx>l~xb0t*_% z7pp6?cu4)X>5_}@jTia9haMTyxVbty-1Rh=eUwaU+G$JHeT=7lU(kAP&O{_|i)EM> zJRuO;wN|KB^hN%@8A=&HvVv9`c(xm$Lnga()tR?})Wlutrys4E9CEn^jCJZ9?bv~N zN9k=p3kKANHUCr#0Nz}Y1_xaaZEf|JkuBeD6Re>i_@Mjwsz$~OZZSG6#Vq2`PVk@; zYMXUG_FmS~pm(?HXL3^ORx~*S8~jS_eH)Zy>E~!O_k)jnPc!0{aeyf-ih$iuk=lmu?3qc zYL~BT@rhTF_Q&&M>yRdDtV(V1)*>MdSjqXV+TuAqSV`5Lvcuxr>kEIJ4#+=1i^4Vy~t=N#{a+5xX5J0Y)<6q{Ww!XTyK9) z)3)Iv$GOQc2lQD187*``&bvgbt^9rKC5(%EEnSlfl`Oe^?rd!4>SzTjtiiDHhI<7Bi|f^}5Fhe| z%w|FvTq1Tn8Fz>%aEEYKtL4J`F@lxAXT`tF!HkI55%OY989v$vbn>i9IdV8(mm9MM zT&0Dqy^r-RZ+n34N`IBCuFViU4~2;dk{i({#5r-fbc2R42P1xuj7b@X8XKJoUOu&* z=3ozM%=Ex3gWHpwA%nv`1#^1rgp^3_H}7|u=9y9$_0~VH{Q1o~R`+&Ah9%-mbwMC# zt!!hLXRj^ck8+vedh{@f0pWC4hXsS4Xd^1g{P>KIA&*xaR|&Mw*XiowC2Y2#^**;^ zY9Py|YC>=^iTro-&w~oJ_2y#L2OU5=xqPEwITg`Prm@Xu$lLoavYBfQ z(_WV$Rq>5?KU8p$;LHWX4ShI&Jo#(}(XgDw6~l_D@2o`dTr}{6kfR>cf8z-1!!*w6 z1r-gKWr}6Px1Hm+64$?73VeR6k7=Y)I7^?GuKtXoDMWpdrc!D40GWe`+L~>R-j^1R z4^8r-DPPZA5qx+RB)G@xHd!hP0`HfO#TO_u^?ViGU||bpW1UIsdM!c(urjUb+t&-w z*3(TFEr39aj|l@b<~H~Bf6sU6xSY?uEe_^ zy%?vV!$ETQLYT@SuKeW}da>Bn+yL$0yjVl1|;s~q*&EpP?E=CwMHWoXV8 zDOj)BkQ8zNZKm=AnFn}hjoI&zWh#1A1FOm^Y?YnyF>opm=uW$#JPp2xpL1RHL{pGY z2z=}2Icx+X0(zpoxKE;8?a;`+==@BOPr|7oS3`J@Ija6tw6(5`58>_l>s~KDevk^D z45QlKF?sIj>Um+8_CGNh!Mi$tp=tb}qfVRS^Ia(psawc7n(L?ECIEmoDC{f=d|up* z`NCJya#0K0c2(j09oHuVi_tM`gs3ZqgPfLXTgG9`jLloGd5pn9JF^J*V5rcJ`!n=@ zOrtdhp{0L?4w|hOB+)BzR;f?ckYAfNKr?ddIdgK91uOW?(rQ2%*N-FJqYAs2$n!ct zZ|bOAXN>#kh{G!q_npP|6W1x-=~Iwb|bC6^~~QB5Jf zwEeNCpn~K<)}cIa2Oy|N4)m-^UH@u>GA%8{(eV6U5oS#Vskp=11<7SLKDvNoxTkO% zKY@sNC!O_asXhn@fSO=SEG2S1M_!op^l>>gS&Gu}i0m9Z{Nf$F_yrIU_|fF`WF zzGE3o>iE;G7Vp@y_IFFdC%66TWq(~K<`8#yl4H~<*j$0}BY6;{yq~TIP-Vag|C;n~ zP5>y79phj6rxS{^feB7#5sNeEp@~m?72V|QdoZlf`~CaFW5@F}p7n^54i$xoq%ngI zn&-h@(UuR*(B=rm*Y_p*LCl50ttEfC{uUfJrGE?N_W}l?P)DTIfp>7+DKe}W)Ep#3 zMNpN4lVb8o$y*M@``4!w?E23yu5htOy zZbOUyC|v-PV(R(0mt@ZJt(ufcqS+bhsJtbyx|oo0r*jSrvUt$!+IMdQUG6_z0E($^ zXl8dc8;0(=Un3~S6^`OCmTGSvQ8y88l7&MGyHot$%|<&O`8Sj3M9=g^g5gTu5NOL{ zGUS6!sPKRE$ZFZWPh$YD9&B{HhwjrwB%u8vu>M9)0CI+$VEbYW;w-6BYX{gFVRDo@ zO_1uD!Ulc;-71?gATTZHr@I=Ev?6hnbCP}UHsPl{MWotps>8!WC&px^%L5ARYAJk( zt=kfqZnOf`>Yu}X#0PCMtVtEki4-=RU@1U=)vOU{YqTyIJ-QU1v}Zk$y*Xj`>n(mk zwj+#q3cH`3Ca0sdo!a|5AFGhRy*Q2QVY>jmK1x3V*8@g6Ew};=_ATt~P4X78F+)vR z4^yUtL&dFgL=MJZ$-W`Fg&s2hKGx#x*Yq(C9d^`)kmqhT_tc`ek$*|xC-d90N_ z_LUethY1_xZf$Y0oMYjj*3S(<(jeCC@r11fy`EKK*xiOe4@2T|*%H$Vs0)=M4{D1Q zeXaXOW_HxrgU$GpT=0{Xrw$qW88??uc(5{_&iO_!5V%>tsjPjw^)jddr+UJU(&ZNl zt17;uo@!zxAGh|B=kKYPWYm9HZ0IlQTuM-eJ{QJtkZD;9z1ta`6Z8=Di1spj?`gfh z-zdUqV^k(E+dyKbV+n8Mc1IJLqkzr;=rg18dGBGm_XfMy@J4gILfpU6aflz>(QMV+ z{b`+0#=fAzOi<#EVKcf!yxCORTYS7lEKSU3+8BsAwtB~PZ=bf>PFK13c3w>f(ASYcjZ-u)0Q5pcfz7iB{&L`$icDhX0ygEpJeo;=3< zDQ>t>w`sBNGwq>I^Hau69#YpVmm@f?@P+B-5pFqUtn?h^HXqE`EFXI~F@!4~*|#M3 z`vQMCP`tGWCE;EZQ05_s%P?iHd2t~?u(7^L;K8t3xtK#>6 zIwqI?Z)-7iM<~lHmUk`y^8N(MJwZKXY8as!yp?1;NeRyXT5q`TYTDiT(Q#uxwe?4q z^y3lLs6Ca-5aPplqL?t#51q%>B1BfPrZA1M~CqV%NbEN7d-n#LU%g@Q{n%ebS8} z(Qo_oF}A0+Kd7ok+`PBtIAMJK?<9rK1Ad^2QIM~6M9_8p>XGd;)zu9vsnUda!JBy? zt5xlbx`_C){KlKJmi?KT_V*2R-Qs<`EXgHX^tWPP!C1*%sByP$5M6LnwP{_=g>rOi z55T-ciLAB4G-iAn5}4r;8@Xq63;mGus>hq{bG0}@>I9iyJ(l=MJa4&o`I`M@6x@I5 zkeuKlVH@?<8w=ML?joc2EkroUMur@0j8BMbpZu zU!2SXwhXQ=IaH1wCMRC!2mnmm?&i@D!8>n-5#O<^BCU4rzC$t?Xhn8Qks(Zuqhks;d&-7;bxDQ;e@YFP9<@>#c=J+IY>)!A26y(|yg>f* z`TgMZPBT(!5t87~`+TMnnET*Wi7Rhz2evhSU$zEf9=yK6o7`O*EEs|>(04U3M1o+_ z0kfAXphF_ei zQ}XNw*9c2cyoYqygBGKe&HKKmN>{p-Y9Ue@m7o}ZVGL|dm&~+CBU~k&BNr+A?U2QO z1ZSG*+bPO5qrN!0H{fDh zzx-bGa69)k*ekc!st%5+FGy9IxG0l*0826qelVsEt1Ylq3FKA9 z0sI`S$yL!4J*tWGb>dY~0QK$ld(H1F7Q;HO+zDk9S;r*t5PW94C5NCKr^4ELTN)xL zTNU`D!g*agqVYonG$#IFm(GoFeKPmsrvhM{(`HkvuUU<&(yYGF7fkn%3g%2{6{_DH zT3@*3KkGI? zTmxS4m=hvEFw@wzvUnk}%iUT5Zrt7~Z$|z$I4}YjG=zs|A(|7;DisdIdMi{?x~Lgo zO{LoyxbmbV?Ag)vl??|pT|$8l`BQT|heuS&v&?kEJ5ObGW_h4w8HiUq*UuYp_Kput zHt#lH`ZAV<%xE!1?&PubX?obqoxL-Hu@6Q+#Jur-LjZ=z5cSR-jl47Yc2*t~F=fZG z?R~(nTV(zgnnFaawVzQxd$G@_vi80B{Nxfvjk@hK*A5d)@HX0+et&0WK_oU<*Leyu zwOSFfUjqyO7&LHuK65UNqxv5HCINTo9M3pSSk%+*8<_NOwXJKy$N?3+4CFsoarz2s zO1-ZH+dV}yF=GlI@tgJxtqgl)-3H$I#mESbbi36l1GLw8{sdJV9tqN5iKg7xvpi9f zpky+l0EPnxYhWN~s>x}VO7`9{W;8^&Z2Bik z9lFxnm;QkNG!k#PC%)!xb^4lQ1^ z?0a0@RAks;#eJ7kI~Sf(1RaU|>S?m%H3y*rnG?@TV_#KKV7>^!n|XNN0@Hdh!9kC5 zzG3wyu6$2>yIviaG~fIca!uNJ1KSU@x7&3%NU9dnnm06$mTYH*!|e3~r-}n(5tc6x ziyo=Jcw0BLgE*jsRP7F?mKz%E&I#8AsRoJtBw8j#_~og|{wCCRdq`bBXcgu@XmvQ9 z$!@rCalJEV_-^HvZX%&xdCMGdD)5YHMZjsuD3=<%q7h%wmyt=b*J19RP5c;LXlW_n)}osv ziQEM#+y<4_YUxCk^F>zZE(EQMy4| zLSQtE95LXt*ZcAK{`mb1cHj4&=RB`-o$ES>{&xg%$LS#Njmny{FwTL@^?OR!TH@kp z-cAV)gFHSW<|Laihkj;l(PnHAt=PL_w>0=z#Qi8Wd?m8gA|7c4ik4mRi?4h-#RZ+0 zB$6^ZyR#ve`_Q4*RS%b+IL~5=+fL;eAyWJa)Wu)@Chka1$5r0^AbzUBlWDKFXiTVv z_Bq~}#Ok8@AEIOn=W3D@nTE%M8Cl)P`AXSt?DDF_*LY1-pM;VJKl>16^H+sZMy1fF z-09<&(1!?_-uDegse0D`e{yU~M+@cAzn~R@vHFNxx#XL=nbpG{U7+yUusAyMrp}Tr zFF(&9oL6Y-<#poLldIn+p02p~DqjJK7z7vf;6QHErrSqH@z7q{(dcskpQwz?uR6$P zFUhy;!5gq7?}v*KiJYdDZu3gK_f=BxB3}n0 zB}Bn-Garmm9BK4E!_mEB1ut*Oi=fV4S54sy8ozSUyWjzpFAt^+UTUM*kv_r1A)0`F zeSblpL<@)K{rZa^0>~F16UoAN-t-hz=tUNJv6E0-sYAQMKjz52Dig#bi(5+xkJM+F++UDx^8RSz- zs2lhGT;ExTyqnQ&Rb0!5vnmS`tIFhLOj9eO;WHv-?>XR2yE*D5j~2SzJ3u!8P2fyS zy;5dqaob#9-`0v`_g-FDIeh1VwIwMbEKktHaN4;Wo*+a)!(Y-NpNPLNObA%U_aEnUJOKHUD)L!kJ@Q*OqBIekmlKQZeGREZ%>}O2jD>sGaE0I9Lb%?oOxr0 z=X^}*AxU3%AePZ?WqMhqE&w=sj(v={5Y9NiDR>dsGf+|MtPm>irgqdw!}Q*7XeYCx z(-H0i4-JioKlRur{pvr0L`Oac3M|WJNH6r8|ABh*I6l%(_<{INvC227@M92SaJ3@^ z56Y81qgAPa4MD=sAJPGgLoW`g1QyRAKkL2kNfLPZo5 z2$sN?m^)%qU{>nd)w5Qul+-S0L)$sjLjU&n7vI=!`?tHPoB0L5>{jhsd+St z8p3319~#!%#L!EiPm12|+KT*(KdpY-|H&gIxTO0n?%1QJ9}x)7m$(Sl7x?(6A_5kf zvo?=UZJ2FkQdEBoULiL3+~HpNlD&Ry0Zr!Y5AgGqAHSx`k0bde!3Ao^_VzMo_a(18 z@z!v9&GU3|dK;ah!{=S#c~ew+O|SmkXjdvfBK_-=@~o1o-e*!#r>mls>CopQYOhne z<~*N1GOgdMZS+>?+49^htAoJBps?wyA;^t;RmU7MbiU}XRphf zUANJl);M6HZsll?Ym&_~!%G;=yNyp##xWz2R!*xJqbvIwQmklc&TfZIv2Q*}ampAl zB)X$*ZFF&>_yGYBpz{`*`QjTy3X{XUmKf80z{pD81p~Rs6K^^JUW_B}65dJhX#uTP+i0NyT!qcLF{BN4fKA<@=!%jvUf# zV<2K+A1|yZ>T_yZ6?;{hGehtiBIk2Tn>pra}(&Qb)i zTOTRD09R!Dzi<>1{!qz|Z}?)d({9}#q6U4=q8T%2v4RDEQZTWc;yi1wHtLE=#s0g- zBxQc%TgRpqRC{&*P)frI4dXARLHX&JdNrLDs*e3=Y?l5*nX6C~Ye)A7z&ooSpJy;Z z<1#TR<~?#P*5GAB|Cy4r0@3w9inF!-Xd(M$Iup*S++gkPP4~!AJBh6FJ?HzJE{Wub zIzaA^nS{ST_JFtuyP5>Qd&;WY<*vz&HyUI}HHl-?I?=Y^)jNZp(kqI#LINSY{Iy;s zO}S-#GW#}PvebuJ7E_mJ;auTD=K{@iGcV!&ZspK^T2w{DPlI4`6+vFXoI5&|E#KaU z2?;o9Brua0VXG1QzmB!yi9&(PoeKMsigJvEbU-DKGPtr$i{oQ~wqi2MPlO1v7HS{a z0F{WCjdoGb;yfi}7{LBU|H{7ffsjgIrI)fG5FtSv4)rcD$yinuGq|}Q; zI&BUpz_E~h;vXGW%21Ybt&?rji*k3A!T=#dVeSPSo49Ee}7VKqIajRZSbO%HQXqNwHKmZDfD0Pgr} zZ=*JVaBo9cplCRhw|wKxj*^A)qr;v}`P?6i#8|B5Y-%gu(Dv<=9h{dTol`y}Rij!U z%VEEyPWwk_2|tsYqyLI27!%k@bU_H%tS{1>zzzlx6_?4-g=uMfl|C3>5{iA27P7VW z=#Hg*9~ZvOOi;|K1;_@B)0pyioDMQ~&`Vy~E#){X|5sTX;*y?XKS`^h$|- zu?xAEzb6 zX9NWXwAb@MlkX!-=Og3aCrIZZ!)<2rakU;mCrMRN{+!M%FfF04l;uIC97b*X-{(=^ zlIre3QLU4+Yb_gB8@D-yuu~sBjH1Dy4M(ArY{f4#IPzVw01ghgmir#$u`L!dE7vHD zB^uuB6yK~&u>dNJb`pQ`9Dz`19f`1$lfZu56V0_09*{{~A|VNI?bG<(@L z0J6t4c=ra%PR=7Gpx=V~<|mD=D+aSE?05GV@Pv5$WzRfA@{yFx%jY7>pRuP5md2{a z#3F7Q{4tz8AeDJ3Svipy67=-|`8`v{+>A%{-(`|&&OHtze3 zd2R0PG+ZCr(ZAD#TH2Cmdl-;QOIQ5SZA!jvP%g(RRvP`HP3NIyri+nlrwq}CW35yg z)uD3n7R`)QBy|~e!2hieu|ys`*kzHtO|HzsT25zC|tS6ZYS{mwRs^ zxnW5_O?J$W!Bn6DSUh7+5-ZVj#QDkTHbsTR_6Lg^hL3j5pa<%7u<#Q3BWRqE87iTi zS}@X7v`8-S>1{5HhK4SWqM$?1s-CK|NBqA5fz*T}4=ts?3;2Gt`={|Q00OvHVCiPm5l4+ zB;{&i2q~d5;T1Uv0@%mYCqy2Nrx=Z~b-@FHWx{526c+pUk?3LbPP!YtPsggbi2Xf& zJY>X%`6Vpmj$QSok(OBEH?N=enEYa8zATjR!S{bZ0^`6Gi3#if7N!&yF_g6kmCHXl zX5ziUMx5Bxe3mI;x8mI`!Fbpy<{Pk?b^hW~KIZKP$8hmGfvBbhU6sZH6Ff_CKP{>atJkd}4D&kmb;9?jE6^1-A5cm? z>%9)UTZp2T1a{uFVXc5s1*-S}X{p|VvS&wu)}BCtgf|p#_b21+{nPWi=$WW5m_}=@ zx(H`_B=w^mcgeAImc74|T6WgdnQJ`ATxVuxVvfktUg98gWd3cUYMaK=)JT4rUsS90 zuy~J|X-(NrtHm2q==BrFqAj~&{ohxQI2_%JGf?IM57dap+-tp0L{gJ54AAjXflKl} zkr=)|IIW5ka!I{1@({5oLL#wDLVm- zg$bl!A8x1+C>~JfhJ9=AWYX8OxS(9F>iAZ~S~loYLF5R_`C7p`+OLTr5O~)*b{F%nDYoGBGcU?fXC&MG`L=_bA$@v0Dg2r>A zLNe^ab@z)Ql%H`2ExzJhPu>E`c%#2cgyNz6z7)=dxfPVA`sh>jS{S7u;Fd*$pUA6r zzV25FAB*_j8OS8*<8P{CnK#NAvwoDulYm&?jrmvF9R<+`EZa=xpKMQIP-f1+yD=I( zLLyynQ)z$;-;tSqF!@mj^Lj66p0GqqZtjC%ll3o`MZO`67}g(D5wF^cOJ4Nd6=8X= zv1K+F`$khak7)f&TG*H~84tZ^AB~F|V~f8Tqr8VDqos-Lv=ByRx)gwbZHw)l(^{*0 z9Imj`gmwrv-J^n?R@&v?Tl{Lsi>N?^?1vE&K~u^V@Fj~>zI57saS$Z=hIOVJ$}rxb zpS}Hth7mABjfiN;t{;#Vj%dDqOKq^nnfj1#k8Axg%XiB?{Wt9+21U_{$CKo$8PMDs zAO$I2CrKT;DQ~St%U#aiDiu@fA#;Xbwf4IE(I9;z!JT5 ze9d5c4!mWmhyXZyD!Uix_5 zG-4B5$4h^#H&(I2UGE?xX#ZULmZrexZs6wI7ystLo75<0p0Ul2(M{A&r9fl)b1 z_xnd)cM_634X=Q2yuAEJRoMT`{Rq8siv@6@!LQ+3hF0HA}L*SLSg54w+O1wkCMt^YQfrHpMl5>R*^jzGtpq4!gA+8*3t0zEAy zV5^fby0Z{^Z_0CNfc?Ab)6m;yWlWmSq~tI^Q4z6%zs4OqE_FbhOKU}5D~Ao^DVRw38{nXS z*yXLTEnw7%?d$)d+vP#frFV_y>gI5$@y9c=_mADeC_%q1noa-xlnR0nt-44<*NyTH zjzA)tzBl0tOb4pAa*89Vtrudg)vc=_WajF3gt^CnG#`h+_%cDvIPBq^I7nH_QZERx zYP}%LN<+>xHf18a`ryUfSM2vb&^kN3TE+p7M)1;D_&gS)993Y*B&1EA?2kbXtgseCN_Hz5#-d`9qpRf}^=6lyQib$4Ud$KfCTIZK|HCF@-O&+Uh2M z{rfsq_3aPQV64?~_u)*`?|tGuF=}Z-Up^lEp-bkZ8o%VmU03H54qT$|$rkWuyj3O&B(y$|`NYu(Y@SN3#6QYJo zuHyW=sKGMstG?Jv{h-}fH7}EO^%@e)lXktnP}z`qrjh$XpS-Y%)Elj;{8=Dc@jG%< z=f_PW_7PY6B?c(Gt}HqR2c=yvS~x+*T6;{}`pkd8z<~+! zWqg$+phxh0zM$~D53pzAdPDBWP5NGYhCE2hV9}Lnyz{YhxAUX^lj+xh3Z@|$wL9lD zx3?(TYa90P-;I%$W(m+Q=Vqaj_vQK|K|;MsYTJguRDi&Z9_27Y`IObG$DE+azjc&5 z^LarfIfjR%H>hdJmE4ce5nNAvUCq9wz!S}?r)w|Cp4M{ksSCFj2j^IHh@DVFSSWe=yg z*P!@3yK1mOUYQUNs{eS<5yc_1pUgGN3lumtuCTLEAU>k*{SH7p^=Du|Jc4SyLlHvc zimpyHuNTID{yE`!_Dos=CjXk;k1>Gkl5C*GHZPU-v7uT44Lp<S{WyJR4WVdKq${@jOzrQv||(&K(bh*Sw2s1ZIc@NEHe^axNK zR*smo*(jXqk7ah%suWl9XXL?02Ft+{Rg)%>TTOi&6)gi2+k^2O8^#JP%~>TgPX0 zVe?n?wP3Gm+gFW`^^f*k0Xkz+ZFWjMI=jM=jmDa`JHiMBnX$C) zA6QN?ltiU%WbX6XDR;Od2^$xnI4uQRWu@!+VPAn2+OU#q(o1kpW$^S-{Fr!%5xGul zAM;)hk7)*p6EjYi-Jk4cy;s4kagsZh_Taw;C-&#`P=$E#F@0=eH4!rsdudVoBe{(k z-*(}h3O&PnOBikxGa$NMEBo>SF5>kPLV{tcK#KY&5|g0uoxS`hhI(qjzk(C^nvWOT z8hmTHQ|#I#@-6&K!M(=7X+@C^6Kr@{#cQp=4FTZbsibFu5i7WAnFhbWBz|yVFjj+MJea5D$Pf$^22Rj zIQEsiWA%BgY7mv3H7S^69TqE6s1%FW)pp2JglbwXuB4pwkX##>cm$5-kHPNr2 zh*N)$Hrs3rhmxIJ5fu$&~y&47s3(F2r*cb-tIpF(lox$3eVmuzJVIit&EB@kmuPrLzFb z4Ewo){5$9X)2rvV;DFOQ;?$nH`P1Xb1;$>`{ZqykPeY>hfm#R4vZZ!qHdu-Sri(`N{d!|5 zRsR?X+pXfbW`-&NBR&Jcecc&Ej^!b~=E#2q=TAgZ@;j3JJ_Dw+{Z)cBQf${N?tkHu z{EmqCUjwFX;_j9c!fkDp-8C}jaCka0#v*=QrqeoPaH@-Bi%WxkZQ;Pp@4FQ)UZ^~K zWT&sb*P0FWnEqB&s(B)E6EHaqV_x_WN7xQ zaEA%DBTP8$Q9ji{b3IU}9IQ%WYB}O4`s?z*T*mdcQ!|Tb&-3S8zv8Z#QquCnk>b}Q z7_LK_fs?OT8sM$^bxAxH_+*EO=rCc}8L?bSUfH^<%ReOy31@Ug^YS1Pd*2hcGa{?# z?zVUb->ua8T`|@8pu#dPpC@fzEFyykkkEHk6WrO7a~O@hWMM-B64s?Ll|t;r1dOf( zINb9}eaY+oC_!2F8N~oUMdBXBW1m)50F>l)m-}?>F_uB!wA?EvG#1hyV{WVJ&@A{F zrJK^19aW#im7Z44u3C=4hlwQ)Jb;$rktEtID`IErwwRCw`~g^{lwzTpI35RA%XfsQ zC}kJgQxI>3dRK0o>k`YI7;vs*61Q<-eN_<#dyfELGrZ<|nCH~k^A!E_Gy62nz&#IV zr;Rs+eO8$vQy9OL);8~=z?i__z8f0Y67Q`n*+LRF93W|jcy9CfmyJm+2n*{wQG1-R zwh8|pA)5X@SE!Jf$eTXSRXG9}^SjSKWj7}eDhS~|16rif{Sjwe-fdS!3z@GWFE{z+njq}`8zB6!|onH+SK4xqD6sag&?O*X)5v=z3E7q&zf4d~+{V||mChBuE z2YHXv?_TNRZ=pEupGnW;oz!Cc(Nl(0WkVcN3a$wAVr<_dihVy|BQ) zTT7E0r@#D+7D9TWh4WAY7NB$9XT?I7{f)E3b^=6`@%td9M6Sz29Pm10wg}!zD+-58 zQK2zbqU4+fO2MB$bECbcEdfN=0vTRV2&9J5vxD1Cp_39dA6qs-mjoJ?n-N$$PG%ws zoCLmSjV0W=QvM(tg+A7koM}VA>f7mp?(5uC{bAyCc!HE)$5{Y_5YyVw!*{U&_-W_m zX3Bt7s4fx5>=bWnLN7e>@X{V@F%c}WM{hw?HlLze?zf|ymrg@@&Qfu#sUZ*}HhiT7 zx)qRTrYBtU-)DxHw2reksShL`@@$Xf8tWQeF9^7m$n71HW*br+@aE^-{u%8k#zxwJ z*4dck|3q@;a0L{0rVq9kpqW+`%0D(f1OS^Wqa8%QX$E55KG7@^Lv>C_vDS|bj|J~u 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 literal 0 HcmV?d00001 diff --git a/jax/api.py b/jax/api.py index 4989ba281a9e..429f09f23e89 100644 --- a/jax/api.py +++ b/jax/api.py @@ -40,12 +40,12 @@ from . import dtypes from .core import eval_jaxpr from .api_util import (wraps, flatten_fun, apply_flat_fun, flatten_fun_nokwargs, - flatten_fun_nokwargs2) + flatten_fun_nokwargs2, argnums_partial) from .tree_util import (tree_map, tree_flatten, tree_unflatten, tree_structure, tree_transpose, tree_leaves, tree_multimap, treedef_is_leaf, _replace_nones) -from .util import (unzip2, curry, partial, safe_map, safe_zip, - WrapHashably, Hashable, prod, split_list, extend_name_stack, wrap_name) +from .util import (unzip2, curry, partial, safe_map, safe_zip, prod, + split_list, extend_name_stack, wrap_name) from .lib import xla_bridge as xb # Unused imports to be exported from .lib.xla_bridge import (device_count, local_device_count, devices, local_devices, @@ -59,6 +59,7 @@ from .interpreters import parallel from .interpreters import masking from .interpreters.masking import ensure_poly +from .custom_derivatives import custom_jvp, custom_vjp from .config import flags, config, bool_env AxisName = Any @@ -131,7 +132,7 @@ def jit(fun: Callable, static_argnums: Union[int, Iterable[int]] = (), @wraps(fun) def f_jitted(*args, **kwargs): - if _thread_local_state.jit_is_disabled or config.read('jax_disable_jit'): + if _jit_is_disabled(): return fun(*args, **kwargs) if static_argnums and max(static_argnums) >= len(args): msg = ("Jitted function has static_argnums={} but was called with only {}" @@ -140,7 +141,7 @@ def f_jitted(*args, **kwargs): f = lu.wrap_init(fun) if static_argnums: dyn_argnums = [i for i in range(len(args)) if i not in static_argnums] - f, dyn_args = _argnums_partial(f, dyn_argnums, args) + f, dyn_args = argnums_partial(f, dyn_argnums, args) else: dyn_args = args args_flat, in_tree = tree_flatten((dyn_args, kwargs)) @@ -196,6 +197,9 @@ def disable_jit(): finally: _thread_local_state.jit_is_disabled = prev_val +def _jit_is_disabled(): + return _thread_local_state.jit_is_disabled or config.read('jax_disable_jit') + def xla_computation(fun: Callable, static_argnums: Union[int, Iterable[int]] = (), @@ -413,7 +417,7 @@ def value_and_grad_f(*args, **kwargs): raise TypeError(msg.format(argnums, max_argnum + 1, len(args))) f = lu.wrap_init(fun, kwargs) - f_partial, dyn_args = _argnums_partial(f, argnums, args) + f_partial, dyn_args = argnums_partial(f, argnums, args) if not has_aux: ans, vjp_py = _vjp(f_partial, *dyn_args) else: @@ -476,7 +480,7 @@ def jacfwd(fun: Callable, argnums: Union[int, Sequence[int]] = 0, def jacfun(*args, **kwargs): f = lu.wrap_init(fun, kwargs) - f_partial, dyn_args = _argnums_partial(f, argnums, args) + f_partial, dyn_args = argnums_partial(f, argnums, args) holomorphic or tree_map(_check_real_input_jacfwd, dyn_args) pushfwd = partial(_jvp, f_partial, dyn_args) y, jac = vmap(pushfwd, out_axes=(None, batching.last))(_std_basis(dyn_args)) @@ -521,7 +525,7 @@ def jacrev(fun: Callable, argnums: Union[int, Sequence[int]] = 0, """ def jacfun(*args, **kwargs): f = lu.wrap_init(fun, kwargs) - f_partial, dyn_args = _argnums_partial(f, argnums, args) + f_partial, dyn_args = argnums_partial(f, argnums, args) y, pullback = _vjp(f_partial, *dyn_args) holomorphic or tree_map(_check_real_output_jacrev, y) jac = vmap(pullback)(_std_basis(y)) @@ -914,7 +918,7 @@ def f_pmapped(*args, **kwargs): f = lu.wrap_init(fun) if static_broadcasted_argnums: dyn_argnums = [i for i in range(len(args)) if i not in static_broadcasted_argnums] - f, dyn_args = _argnums_partial(f, dyn_argnums, args) + f, dyn_args = argnums_partial(f, dyn_argnums, args) else: dyn_args = args args, in_tree = tree_flatten((dyn_args, kwargs)) @@ -1441,32 +1445,6 @@ def device_get(x): return tree_map(_device_get, x) -def _argnums_partial(f: lu.WrappedFun, dyn_argnums, args): - if isinstance(dyn_argnums, int): - dyn_argnums = (dyn_argnums,) - else: - dyn_argnums = tuple(dyn_argnums) - fixed_args = tuple([core.unit if i in dyn_argnums else _wrap_hashably(arg) - for i, arg in enumerate(args)]) - dyn_args = tuple(args[i] for i in dyn_argnums) - return _argnums_partial_(f, dyn_argnums, fixed_args), dyn_args - -def _wrap_hashably(arg): - try: - hash(arg) - except TypeError: - return WrapHashably(arg) # e.g. ndarrays, DeviceArrays - else: - return Hashable(arg) - -@lu.transformation -def _argnums_partial_(dyn_argnums, fixed_args, *dyn_args, **kwargs): - args = [None if arg is core.unit else arg.val for arg in fixed_args] - for i, arg in zip(dyn_argnums, dyn_args): - args[i] = arg - ans = yield args, kwargs - yield ans - def _check_args(args): for arg in args: if not (isinstance(arg, core.Tracer) or _valid_jaxtype(arg)): @@ -1482,534 +1460,6 @@ def _valid_jaxtype(arg): return True -class CustomTransformsFunction(object): - def __init__(self, fun, prim): - self.fun = fun - self.prim = prim - wraps(fun)(self) - - def __repr__(self): - return ''.format(fun=self.__name__) - - def __call__(self, *args): - # TODO(mattjj): instead of tracing to a jaxpr, use process_call - args_flat, in_tree = tree_flatten(args) - flat_fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(self.fun), in_tree) - in_pvals = [pe.PartialVal((raise_to_shaped(core.get_aval(x)), core.unit)) - for x in args_flat] - jaxpr, _, consts = pe.trace_to_jaxpr(flat_fun, in_pvals, instantiate=True) - outs = self.prim.bind(*it.chain(consts, args_flat), jaxpr=jaxpr, - in_tree=in_tree, out_tree=out_tree(), - num_consts=len(consts)) - return tree_unflatten(out_tree(), outs) - -def custom_transforms(fun): - """Wraps a function so that its transformation behavior can be controlled. - - A primary use case of ``custom_transforms`` is defining custom VJP rules (aka - custom gradients) for a Python function, while still supporting other - transformations like ``jax.jit`` and ``jax.vmap``. Custom differentiation - rules can be supplied using the ``jax.defjvp`` and ``jax.defvjp`` functions. - - The ``custom_transforms`` decorator wraps ``fun`` so that its transformation - behavior can be overridden, but not all transformation rules need to be - specified manually. The default behavior is retained for any non-overridden - rules. - - The function ``fun`` must satisfy the same constraints required for jit - compilation. In particular the shapes of arrays in the computation of ``fun`` - may depend on the shapes of ``fun``'s arguments, but not their values. - Value dependent Python control flow is also not yet supported. - - Args: - fun: a Python callable. Must be functionally pure. Its arguments and return - value should be arrays, scalars, or (nested) standard Python containers - (tuple/list/dict) thereof. - - Returns: - A Python callable with the same input/output and transformation behavior as - ``fun``, but for which custom transformation rules can be supplied, e.g. - using ``jax.defvjp``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> print(jax.grad(f)(3.)) - -5.4667816 - >>> jax.defvjp(f, lambda g, x: g * x) - >>> print(jax.grad(f)(3.)) - 3.0 - """ - name = getattr(fun, '__name__', '') - fun_p = core.Primitive(name) - fun_p.multiple_results = True - - def fun_impl(*args, **params): - consts, args = split_list(args, [params['num_consts']]) - return core.eval_jaxpr(params['jaxpr'], consts, *args) - fun_p.def_impl(fun_impl) - - def fun_jvp(primals, tangents, **params): - return ad.jvp(lu.wrap_init(fun_impl, params)).call_wrapped(primals, tangents) - ad.primitive_jvps[fun_p] = fun_jvp - - def fun_batch(args, dims, **params): - return batching.batch_fun(lu.wrap_init(fun_impl, params), args, dims) - batching.primitive_batchers[fun_p] = fun_batch - - def fun_abstract_eval(*avals, **params): - return pe.abstract_eval_fun(fun_impl, *avals, **params) - fun_p.def_abstract_eval(fun_abstract_eval) - - def fun_translation(c, *xla_args, **params): - return xla.lower_fun(fun_impl)(c, *xla_args, **params) - xla.translations[fun_p] = fun_translation - - return CustomTransformsFunction(fun, fun_p) - -def _check_custom_transforms_type(name, fun): - if type(fun) is not CustomTransformsFunction: - msg = ("{} requires a custom_transforms function as its first argument, " - "but got type {}.") - raise TypeError(msg.format(name, type(fun))) - -def defjvp_all(fun, custom_jvp): - """Define a custom JVP rule for a ``custom_transforms`` function. - - If ``fun`` represents a function with signature ``a -> b``, then - ``custom_jvp`` represents a function with signature ``(a, T a) -> (b, T b)``, - where we use ``T x`` to represent a tangent type for the type ``x``. - - In more detail, ``custom_jvp`` must take two arguments, both tuples of length - equal to the number of positional arguments to ``fun``. The first argument to - ``custom_jvp`` represents the input primal values, and the second represents - the input tangent values. ``custom_jvp`` must return a pair where the first - element represents the output primal value and the second element represents - the output tangent value. - - Defining a custom JVP rule also affects the default VJP rule, which is derived - from the JVP rule automatically via transposition. - - Args: - fun: a custom_transforms function. - custom_jvp: a Python callable specifying the JVP rule, taking two tuples as - arguments specifying the input primal values and tangent values, - respectively. The tuple elements can be arrays, scalars, or (nested) - standard Python containers (tuple/list/dict) thereof. The output must be a - pair representing the primal output and tangent output, which can be - arrays, scalars, or (nested) standard Python containers. Must be - functionally pure. - - Returns: - None. A side-effect is that ``fun`` is associated with the JVP rule - specified by ``custom_jvp``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - -10.933563 - >>> jax.defjvp_all(f, lambda ps, ts: (np.sin(ps[0] ** 2), 8. * ts[0])) - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - 16.0 - """ - _check_custom_transforms_type("defjvp_all", fun) - def custom_transforms_jvp(primals, tangents, **params): - num_consts, in_tree = params['num_consts'], params['in_tree'] - _, args_flat = split_list(primals, [num_consts]) - consts_dot, args_dot_flat = split_list(tangents, [num_consts]) - if not all(t is ad_util.zero for t in consts_dot): - msg = ("Detected differentiation with respect to closed-over values with " - "custom JVP rule, which isn't supported.") - raise ValueError(msg) - args = tree_unflatten(in_tree, args_flat) - args_dot = tree_unflatten(in_tree, args_dot_flat) - out, out_dot = custom_jvp(args, args_dot) - out_flat, out_tree = tree_flatten(out) - out_dot_flat, out_tree2 = tree_flatten(out_dot) - if out_tree != out_tree2: - msg = ("Custom JVP rule returned different tree structures for primals " - "and tangents, but they must be equal: {} and {}.") - raise TypeError(msg.format(out_tree, out_tree2)) - return out_flat, out_dot_flat - ad.primitive_jvps[fun.prim] = custom_transforms_jvp - -def defjvp(fun, *jvprules): - """Definine JVP rules for each argument separately. - - This function is a convenience wrapper around ``jax.defjvp_all`` for - separately defining JVP rules for each of the function's arguments. This - convenience wrapper does not provide a mechanism for depending on anything - other than the function arguments and its primal output value, though - depending on intermediate results is possible using ``jax.defjvp_all``. - - The signature of each component JVP rule is ``lambda g, ans, *primals: ...`` - where ``g`` represents the tangent of the corresponding positional argument, - ``ans`` represents the output primal, and ``*primals`` represents all the - primal positional arguments. - - Defining a custom JVP rule also affects the default VJP rule, which is derived - from the JVP rule automatically via transposition. - - Args: - fun: a custom_transforms function. - *jvprules: a sequence of functions or Nones specifying the JVP rule for each - corresponding positional argument. When an element is None, it indicates - that the Jacobian from the corresponding input to the output is zero. - - Returns: - None. A side-effect is that ``fun`` is associated with the JVP rule - specified by ``*jvprules``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - -10.933563 - >>> jax.defjvp(f, lambda g, ans, x: 8. * g + ans) - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - 16.412119 - """ - _check_custom_transforms_type("defjvp", fun) - def custom_jvp(primals, tangents): - ans = fun(*primals) - tangents_out = [rule(t, ans, *primals) for rule, t in zip(jvprules, tangents) - if rule is not None and t is not ad_util.zero] - return ans, functools.reduce(ad.add_tangents, tangents_out, ad_util.zero) - defjvp_all(fun, custom_jvp) - -def defvjp_all(fun, custom_vjp): - """Define a custom VJP rule for a ``custom_transforms`` function. - - If ``fun`` represents a function with signature ``a -> b``, then - ``custom_vjp`` represents a function with signature ``a -> (b, CT b -> CT a)`` - where we use ``CT x`` to represent a cotangent type for the type ``x``. That - is, ``custom_vjp`` should take the same arguments as ``fun`` and return a pair - where the first element represents the primal value of ``fun`` applied to the - arguments, and the second element is a VJP function that maps from output - cotangents to input cotangents, returning a tuple with length equal to the - number of positional arguments supplied to ``fun``. - - The VJP function returned as the second element of the output of - ``custom_vjp`` can close over intermediate values computed when evaluating the - primal value of ``fun``. That is, use lexical closure to share work between - the forward pass and the backward pass of reverse-mode automatic - differentiation. - - See also ``jax.custom_gradient``. - - Args: - fun: a custom_transforms function. - custom_vjp: a Python callable specifying the VJP rule, taking the same - arguments as ``fun`` and returning a pair where the first element is the - value of ``fun`` applied to the arguments and the second element is a - Python callable representing the VJP map from output cotangents to input - cotangents. The returned VJP function must accept a value with the same - shape as the value of ``fun`` applied to the arguments and must return a - tuple with length equal to the number of positional arguments to ``fun``. - Arguments can be arrays, scalars, or (nested) standard Python containers - (tuple/list/dict) thereof. Must be functionally pure. - - Returns: - None. A side-effect is that ``fun`` is associated with the VJP rule - specified by ``custom_vjp``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> print(jax.grad(f)(3.)) - -5.4667816 - >>> jax.defvjp_all(f, lambda x: (np.sin(x ** 2), lambda g: (g * x,))) - >>> print(f(3.)) - 0.4121185 - >>> print(jax.grad(f)(3.)) - 3.0 - - An example with a function on two arguments, so that the VJP function must - return a tuple of length two: - - >>> @jax.custom_transforms - ... def f(x, y): - ... return x * y - ... - >>> jax.defvjp_all(f, lambda x, y: (x * y, lambda g: (y, x))) - >>> print(f(3., 4.)) - 12.0 - >>> print(jax.grad(f, argnums=(0, 1))(3., 4.)) - (4.0, 3.0) - """ - _check_custom_transforms_type("defvjp_all", fun) - def custom_transforms_vjp(*consts_and_args, **params): - num_consts, in_tree = params['num_consts'], params['in_tree'] - consts, args_flat = split_list(consts_and_args, [num_consts]) - args = tree_unflatten(params['in_tree'], args_flat) - out, vjp = custom_vjp(*args) - out_flat, out_tree = tree_flatten(out) - if out_tree != params['out_tree']: - msg = ( - "First output of `custom_vjp`: {} doesn't match the structure of " - "the output of `fun`: {}\n" - "{}\n" - "vs\n" - "{}\n".format(custom_vjp, fun, out_tree, params['out_tree']) - ) - raise TypeError(msg) - def vjp_flat(*cts_flat): - cts = tree_unflatten(out_tree, cts_flat) - args_cts_flat, in_tree2 = tree_flatten(vjp(cts)) - if in_tree != in_tree2: - msg = ( - "Output of the `vjp`: {} doesn't match the structure of args of " - "`fun`: {}\n" - "{}\n" - "vs\n" - "{}\n".format(vjp, fun, in_tree2, in_tree) - ) - raise TypeError(msg) - return [core.unit] * num_consts + list(args_cts_flat) - return out_flat, vjp_flat - ad.defvjp_all(fun.prim, custom_transforms_vjp) - -def defvjp(fun, *vjprules): - """Define VJP rules for each argument separately. - - This function is a convenience wrapper around ``jax.defvjp_all`` for - separately defining VJP rules for each of the function's arguments. This - convenience wrapper does not provide a mechanism for depending on anything - other than the function arguments and its primal output value, though - depending on intermediate results is possible using ``jax.defvjp_all``. - - The signature of each component VJP rule is ``lambda g, ans, *primals: ...`` - where ``g`` represents the output cotangent, ``ans`` represents the output - primal, and ``*primals`` represents all the primal positional arguments. - - Args: - fun: a custom_transforms function. - *vjprules: a sequence of functions or Nones specifying the VJP rule for each - corresponding positional argument. When an element is None, it indicates - that the Jacobian from the corresponding input to the output is zero. - - Returns: - None. A side-effect is that ``fun`` is associated with the VJP rule - specified by ``*vjprules``. - - For example: - - >>> @jax.custom_transforms - ... def f(x, y): - ... return np.sin(x ** 2 + y) - ... - >>> print(f(3., 4.)) - 0.42016703 - >>> print(jax.grad(f)(3., 4.)) - 5.4446807 - >>> print(jax.grad(f, 1)(3., 4.)) - 0.9074468 - >>> jax.defvjp(f, None, lambda g, ans, x, y: g + x + y + ans) - >>> print(jax.grad(f)(3., 4.)) - 0.0 - >>> print(jax.grad(f, 1)(3., 4.)) - 8.420167 - """ - _check_custom_transforms_type("defvjp", fun) - def custom_vjp(*primals): - ans = fun(*primals) - # TODO(mattjj): avoid instantiating zeros? - def vjpfun(ct): - return tuple(vjp(ct, ans, *primals) if vjp else ad_util.zeros_like_jaxval(x) - for x, vjp in zip(primals, vjprules)) - return ans, vjpfun - defvjp_all(fun, custom_vjp) - -def custom_gradient(fun): - """Convenience function for defining custom VJP rules (aka custom gradients). - - While the canonical way to define custom VJP rules is via ``jax.defvjp_all`` - and its convenience wrappers, the ``custom_gradient`` convenience wrapper - follows TensorFlow's ``tf.custom_gradient`` API. The difference here is that - ``custom_gradient`` can be used as a decorator on one function that returns - both the primal value (representing the output of the mathematical function to - be differentiated) and the VJP (gradient) function. - - See https://www.tensorflow.org/api_docs/python/tf/custom_gradient. - - If the mathematical function to be differentiated has type signature - ``a -> b``, then the Python callable ``fun`` should have signature - ``a -> (b, CT b -> CT a)`` where we use ``CT x`` to denote a cotangent type - for ``x``. See the example below. That is, ``fun`` should return a pair where - the first element represents the value of the mathematical function to be - differentiated and the second element is a function that represents the custom - VJP rule. - - The custom VJP function returned as the second element of the output of ``fun`` - can close over intermediate values computed when evaluating the function to be - differentiated. That is, use lexical closure to share work between the forward - pass and the backward pass of reverse-mode automatic differentiation. - - Args: - fun: a Python callable specifying both the mathematical function to be - differentiated and its reverse-mode differentiation rule. It should return - a pair consisting of an output value and a Python callable that represents - the custom gradient function. - - Returns: - A Python callable with signature ``a -> b``, i.e. that returns the output - value specified by the first element of ``fun``'s output pair. A side effect - is that under-the-hood ``jax.defvjp_all`` is called to set up the returned - Python callable with the custom VJP rule specified by the second element - of ``fun``'s output pair. - - For example: - - >>> @jax.custom_gradient - ... def f(x): - ... return x ** 2, lambda g: (g * x,) - ... - >>> print(f(3.)) - 9.0 - >>> print(jax.grad(f)(3.)) - 3.0 - - An example with a function on two arguments, so that the VJP function must - return a tuple of length two: - - >>> @jax.custom_gradient - ... def f(x, y): - ... return x * y, lambda g: (y, x) - ... - >>> print(f(3., 4.)) - 12.0 - >>> print(jax.grad(f, argnums=(0, 1))(3., 4.)) - (4.0, 3.0) - """ - def primal_fun(*args, **kwargs): - ans, _ = fun(*args, **kwargs) - return ans - primal_fun = custom_transforms(primal_fun) - defvjp_all(primal_fun, fun) - return primal_fun - - -def jarrett(fun): - new_fun = custom_transforms(fun) - - def elementwise_jvp(primals, tangents): - pushfwd = partial(jvp, fun, primals) - y, jacs = vmap(pushfwd, out_axes=(None, 0))(_elementwise_std_basis(tangents)) - flat_tangents, _ = tree_flatten(tangents) - out_tangent = sum([t * jac for t, jac in zip(flat_tangents, jacs)]) - return y, out_tangent - defjvp_all(new_fun, elementwise_jvp) - - return new_fun - -def _elementwise_std_basis(pytree): - leaves, _ = tree_flatten(pytree) - arity = len(leaves) - dims = map(onp.size, leaves) - # TODO(mattjj): use symbolic constants - dtype = dtypes.result_type(*leaves) - if not dtypes.issubdtype(dtype, onp.floating): - msg = ("Jacobian only defined for functions with floating input and output " - "dtypes (i.e. dtypes that model real numbers), got {}.") - raise TypeError(msg.format(dtype)) # TODO(mattjj, dougalm): handle complex - basis_array = onp.stack([onp.concatenate( - [onp.ones(dims[j], dtype) if i == j else onp.zeros(dims[j], dtype) - for j in range(arity)]) for i in range(arity)]) - return _unravel_array_into_pytree(pytree, 1, basis_array) - - -# This function mostly exists for making slides about JAX. -def _make_graphviz(fun): - """Adapts `fun` to return a graphviz dot string of its program representation. - - Args: - fun: The function whose `jaxpr` is to be rendered into graphviz dot. Its - positional arguments and return value should be arrays, scalars, or - standard Python containers (tuple/list/dict) thereof. - - Returns: - A wrapped version of `fun`, set up to return a graphviz dot string. - - See make_jaxpr for a related function. - """ - # TODO(mattjj): handle eqn.restructure - # TODO(mattjj): handle subjaxprs - - def pv_like(x): - aval = xla.abstractify(x) - return pe.PartialVal((aval, core.unit)) - - id_names = ("id{}".format(i) for i in it.count()) - - def jaxpr_to_graphviz(jaxpr, consts): - fragment = [] - - fragment.extend(map(invar_node, jaxpr.invars, jaxpr.invars)) - fragment.extend(map(constant_node, jaxpr.constvars, consts)) - - for eqn in jaxpr.eqns: - id_name = next(id_names) - fragment.append(function_node(id_name, eqn.primitive.name)) - fragment.extend(edge(invar, id_name) for invar in eqn.invars) - fragment.extend(edge(id_name, outvar) for outvar in eqn.outvars) - for ov in jaxpr.outvars: - fragment.append(outvar_node(ov, "out")) - return graph(''.join(fragment)) - - edge = '{} -> {} [color=gray30];\n'.format - function_node = '{} [label="{}", shape=box, color=lightskyblue, style=filled];\n'.format - invar_node = '{} [rank=2, label="{}", color=mediumspringgreen, style=filled];\n'.format - outvar_node = '{} [label="{}", fillcolor=indianred1, style="filled,dashed", color=black];\n'.format - constant_node = '{} [rank=2, label="{}", color=goldenrod1, style=filled];\n'.format - freevar_node = '{} [rank=2, label="{}", color=palegreen, style=filled];\n'.format - graph = 'digraph G {{{}}}'.format - - @wraps(fun) - def graphviz_maker(*args, **kwargs): - wrapped = lu.wrap_init(fun, kwargs) - jax_args, in_tree = tree_flatten((args, kwargs)) - jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) - pvals = map(pv_like, jax_args) - jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) - return jaxpr_to_graphviz(jaxpr, consts) - - graphviz_maker.__name__ = "make_graphviz({})".format(graphviz_maker.__name__) - return graphviz_maker - - class ShapeDtypeStruct(object): __slots__ = ["shape", "dtype"] def __init__(self, shape, dtype): diff --git a/jax/api_util.py b/jax/api_util.py index 8e1b46623ac0..f9fc6cd6663d 100644 --- a/jax/api_util.py +++ b/jax/api_util.py @@ -16,7 +16,8 @@ from .tree_util import (build_tree, tree_flatten, tree_unflatten, treedef_is_leaf) from . import linear_util as lu -from .util import safe_map, unzip2, partial, curry +from .util import safe_map, unzip2, partial, curry, WrapHashably, Hashable +from .core import unit map = safe_map @@ -70,3 +71,29 @@ def flatten_fun_nokwargs2(in_tree, *args_flat): ans_flat, ans_tree = tree_flatten(ans) aux_flat, aux_tree = tree_flatten(aux) yield (ans_flat, aux_flat), (ans_tree, aux_tree) + +def argnums_partial(f, dyn_argnums, args): + if isinstance(dyn_argnums, int): + dyn_argnums = (dyn_argnums,) + else: + dyn_argnums = tuple(dyn_argnums) + fixed_args = tuple([unit if i in dyn_argnums else wrap_hashably(arg) + for i, arg in enumerate(args)]) + dyn_args = tuple(args[i] for i in dyn_argnums) + return _argnums_partial(f, dyn_argnums, fixed_args), dyn_args + +def wrap_hashably(arg): + try: + hash(arg) + except TypeError: + return WrapHashably(arg) # e.g. ndarrays, DeviceArrays + else: + return Hashable(arg) + +@lu.transformation +def _argnums_partial(dyn_argnums, fixed_args, *dyn_args, **kwargs): + args = [None if arg is unit else arg.val for arg in fixed_args] + for i, arg in zip(dyn_argnums, dyn_args): + args[i] = arg + ans = yield args, kwargs + yield ans diff --git a/jax/core.py b/jax/core.py index 799a09d13425..265093465c8c 100644 --- a/jax/core.py +++ b/jax/core.py @@ -300,13 +300,6 @@ def __init__(self, master, sublevel): self.level = master.level self.sublevel = sublevel - def escaped_tracer_error(self, detail): - msg = ("Encountered an unexpected tracer. Perhaps this tracer escaped " - "through global state from a previously traced function.\n" - "The functions being transformed should not save traced values to " - "global state.\nDetails: {}.") - raise ValueError(msg.format(detail)) - def full_raise(self, val): if not isinstance(val, Tracer): return self.pure(val) @@ -318,36 +311,43 @@ def full_raise(self, val): elif val._trace.sublevel < sublevel: return self.sublift(val) else: - self.escaped_tracer_error( + escaped_tracer_error( "Can't lift sublevels {} to {}".format(val._trace.sublevel, sublevel)) elif val._trace.level < level: if val._trace.sublevel > sublevel: - self.escaped_tracer_error( + escaped_tracer_error( "Incompatible sublevel: {}, {}".format(val._trace, (level, sublevel))) return self.lift(val) elif val._trace.level > level: - self.escaped_tracer_error( + escaped_tracer_error( "Can't lift level {} to {}".format(val, self)) else: # val._trace.level == self.level: - self.escaped_tracer_error("Different traces at same level: {}, {}".format(val, self)) - + escaped_tracer_error("Different traces at same level: {}, {}".format(val, self)) def pure(self, val): - assert False + raise NotImplementedError("must override") def lift(self, tracer): - assert False + raise NotImplementedError("must override") def sublift(self, tracer): - assert False + raise NotImplementedError("must override") def process_primitive(self, primitive, tracers, params): - assert False, "Must override" + raise NotImplementedError("must override") def __repr__(self): return '{}(level={}/{})'.format( self.__class__.__name__, self.level, self.sublevel) +def escaped_tracer_error(detail): + msg = ("Encountered an unexpected tracer. Perhaps this tracer escaped " + "through global state from a previously traced function.\n" + "The functions being transformed should not save traced values to " + "global state.\nDetails: {}.") + raise UnexpectedTracerError(msg.format(detail)) + +class UnexpectedTracerError(Exception): pass class Tracer(object): __array_priority__ = 1000 @@ -355,7 +355,10 @@ class Tracer(object): def __array__(self, *args, **kw): raise Exception("Tracer can't be used with raw numpy functions. " - "You might have\n import numpy as np\ninstead of\n import jax.numpy as np") + "You might have\n" + " import numpy as np\n" + "instead of\n" + " import jax.numpy as np") def __init__(self, trace): self._trace = trace @@ -368,7 +371,7 @@ def __len__(self): @property def aval(self): - assert False + raise NotImplementedError("must override") def __neg__(self): return self.aval._neg(self) def __pos__(self): return self.aval._pos(self) diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py new file mode 100644 index 000000000000..a8709a40919a --- /dev/null +++ b/jax/custom_derivatives.py @@ -0,0 +1,542 @@ +# coding=utf-8 +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import partial, update_wrapper +import inspect +import itertools as it + +from . import core +from . import linear_util as lu +from .tree_util import tree_flatten, tree_unflatten +from .util import safe_zip, safe_map, unzip2, split_list, curry +from .api_util import flatten_fun_nokwargs, argnums_partial, wrap_hashably +from .abstract_arrays import raise_to_shaped +from .ad_util import zero +from .interpreters import partial_eval as pe +from .interpreters import ad +from .interpreters import batching +from .interpreters import xla + +map = safe_map +zip = safe_zip + + +### util + +def _resolve_kwargs(fun, args, kwargs): + ba = inspect.signature(fun).bind(*args, **kwargs) + ba.apply_defaults() + if ba.kwargs: + raise TypeError("keyword arguments could not be resolved to positions") + else: + return ba.args + +def _initial_style_jaxpr(fun, in_avals): + in_pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] + jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=True, + stage_out_calls=True) + out_avals = map(raise_to_shaped, unzip2(out_pvals)[0]) + const_avals = [raise_to_shaped(core.get_aval(c)) for c in consts] + typed_jaxpr = core.TypedJaxpr(pe.convert_constvars_jaxpr(jaxpr), + (), const_avals + in_avals, out_avals) + return typed_jaxpr, consts + +def _add_args(f, extra_args, left): + return _add_args_(f, tuple(map(wrap_hashably, extra_args)), left) + +@lu.transformation +def _add_args_(extra_args, left, *args, **kwargs): + extra_args = tuple([arg.val for arg in extra_args]) + args = (extra_args + args) if left else (args + extra_args) + yield (yield args, kwargs) + +@curry +def transformation_with_equal_aux(gen, fun: lu.WrappedFun, *gen_static_args): + out_store = StoreEqualValues() + out_thunk = lambda: out_store.val + return fun.wrap(gen, gen_static_args, out_store), out_thunk + +class StoreEqualValues(lu.Store): + """A Store that allows storing equal values multiple times.""" + def store(self, val): + if self._val is not lu._EMPTY_STORE_VALUE: + try: + same = self._val == val + except: + same = False + if not same: + raise lu.StoreException("Store occupied") + self._val = val + + +### JVPs + +class custom_jvp: + """Set up a JAX-transformable function for a custom JVP rule definition. + + This class is meant to be used as a function decorator. Instances are + callables that behave similarly to the underlying function to which the + decorator was applied, except when a differentiation transformation (like + ``jax.jvp`` or ``jax.grad``) is applied, in which case a custom user-supplied + JVP rule function is used instead of tracing into and performing automatic + differentiation of the underlying function's implementation. There is a single + instance method, ``defjvp``, which defines the custom JVP rule. + + For example: + + import jax.numpy as np + + @jax.custom_jvp + def f(x, y): + return np.sin(x) * y + + @f.defjvp + def f_jvp(primals, tangents): + x, y = primals + x_dot, y_dot = tangents + primal_out = f(x, y) + tangent_out = np.cos(x) * x_dot * y - np.sin(x) * y_dot + return primal_out, tangent_out + + For a more detailed introduction, see the tutorial_. + + .. _tutorial: https://jax.readthedocs.io/en/latest/notebooks/Custom_derivative_rules_for_Python_code.html + """ + + def __init__(self, fun, nondiff_argnums=()): + self.fun = fun + self.nondiff_argnums = nondiff_argnums + self.jvp = None + update_wrapper(self, fun) + + def defjvp(self, jvp): + """Define a custom JVP rule for the function represented by this instance. + + Args: + jvp: a Python callable representing the custom JVP rule. When there are no + ``nondiff_argnums``, the ``jvp`` function should accept two arguments, + where the first is a tuple of primal inputs and the second is a tuple of + tangent inputs. The lengths of both tuples is equal to the number of + parameters of the ``custom_jvp`` function. The ``jvp`` function should + produce as output a pair where the first element is the primal output + and the second element is the tangent output. Elements of the input and + output tuples may be arrays or any nested tuples/lists/dicts thereof. + + Returns: + None. + + Example: + + import jax.numpy as np + + @jax.custom_jvp + def f(x, y): + return np.sin(x) * y + + @f.defjvp + def f_jvp(primals, tangents): + x, y = primals + x_dot, y_dot = tangents + primal_out = f(x, y) + tangent_out = np.cos(x) * x_dot * y - np.sin(x) * y_dot + return primal_out, tangent_out + """ + self.jvp = jvp + + def __call__(self, *args, **kwargs): + if not self.jvp: + msg = "No JVP defined for custom_jvp function {} using defjvp." + raise AttributeError(msg.format(self.__name__)) from None + args = _resolve_kwargs(self.fun, args, kwargs) + if self.nondiff_argnums: + dyn_argnums = [i for i in range(len(args)) if i not in self.nondiff_argnums] + f_, dyn_args = argnums_partial(lu.wrap_init(self.fun), dyn_argnums, args) + static_args = [args[i] for i in self.nondiff_argnums] + jvp = _add_args(lu.wrap_init(self.jvp), static_args, left=True) + else: + f_, dyn_args = lu.wrap_init(self.fun), args + jvp = lu.wrap_init(self.jvp) + args_flat, in_tree = tree_flatten(dyn_args) + flat_fun, out_tree1 = flatten_fun_nokwargs(f_, in_tree) + flat_jvp, out_tree2 = _flatten_jvp(jvp, in_tree) + out_flat = custom_jvp_call(flat_fun, *args_flat, jvp=flat_jvp) + try: out_tree = out_tree1() + except lu.StoreException: out_tree = out_tree2() + return tree_unflatten(out_tree, out_flat) + +@transformation_with_equal_aux +def _flatten_jvp(in_tree, *args): + primals_in, tangents_in = split_list(args, [len(args) // 2]) + py_primals = tree_unflatten(in_tree, primals_in) + py_tangents = tree_unflatten(in_tree, tangents_in) + py_primals_out, py_tangents_out = yield (py_primals, py_tangents), {} + primals_out, out_tree = tree_flatten(py_primals_out) + tangents_out, out_tree2 = tree_flatten(py_tangents_out) + if out_tree != out_tree2: + msg = ("Custom JVP rule must produce primal and tangent outputs with equal " + "container (pytree) structures, but got {} and {}.") + raise TypeError(msg.format(out_tree, out_tree2)) from None + yield primals_out + tangents_out, out_tree + +def _custom_deriv_call_bind(primitive, f, *args, **params): + top_trace = core.find_top_trace(args) + level = (core.trace_state.trace_stack.next_level(True) + if top_trace is None else top_trace.level) + if top_trace is None: + with core.new_sublevel(): + return primitive.impl(f, *args, **params) + else: + tracers = map(top_trace.full_raise, args) + outs = top_trace.process_call(primitive, f, tracers, params) + outs = map(core.full_lower, outs) + return outs + +def _custom_call_impl(f, *args, **params): + return f.call_wrapped(*args) + +custom_jvp_call_p = core.Primitive('custom_jvp_call') +custom_jvp_call_p.multiple_results = True +custom_jvp_call = partial(_custom_deriv_call_bind, custom_jvp_call_p) +custom_jvp_call_p.def_custom_bind(custom_jvp_call) +custom_jvp_call_p.def_impl(_custom_call_impl) + +def _custom_jvp_call_jvp(trace, call_primitive, fun, tracers, params): + primals_in, tangents_in = unzip2((t.primal, t.tangent) for t in tracers) + primals_in = map(core.full_lower, primals_in) + tangents_in = map(ad.instantiate_zeros, primals_in, tangents_in) + outs = params['jvp'].call_wrapped(*it.chain(primals_in, tangents_in)) + primals_out, tangents_out = split_list(outs, [len(outs) // 2]) + return map(partial(ad.JVPTracer, trace), primals_out, tangents_out) +ad.call_jvp_rules[custom_jvp_call_p] = _custom_jvp_call_jvp + +def _custom_jvp_call_vmap(trace, call_primitive, fun, tracers, params): + in_vals, in_dims = unzip2((t.val, t.batch_dim) for t in tracers) + jvp = params['jvp'] + fun, out_dims = batching.batch_subtrace(fun, trace.master, in_dims) + jvp, out_dims2 = batching.batch_subtrace(jvp, trace.master, in_dims * 2) + out_vals = custom_jvp_call(fun, *in_vals, jvp=jvp) + try: out_dims = out_dims() + except lu.StoreException: out_dims = out_dims2()[:len(out_vals)] + return [batching.BatchTracer(trace, v, d) for v, d in zip(out_vals, out_dims)] +batching.call_batching_rules[custom_jvp_call_p] = _custom_jvp_call_vmap + +def _custom_jvp_call_partial_eval(trace, call_primitive, fun, tracers, params): + return custom_jvp_call_jaxpr(fun, params['jvp'], *tracers) +pe.call_partial_eval_rules[custom_jvp_call_p] = _custom_jvp_call_partial_eval + + +def custom_jvp_call_jaxpr(fun, jvp, *args): + in_avals = [raise_to_shaped(core.get_aval(x)) for x in args] + jaxpr, consts = _initial_style_jaxpr(fun, in_avals) + return custom_jvp_call_jaxpr_p.bind(*it.chain(consts, args), jaxpr=jaxpr, + jvp=jvp, num_consts=len(consts)) + +def _custom_call_jaxpr_impl(*args, jaxpr, **kwargs): + del kwargs + return core.jaxpr_as_fun(jaxpr)(*args) + +def _custom_call_jaxpr_abstract_eval(*args, jaxpr, **kwargs): + del kwargs + return jaxpr.out_avals + +def _custom_jvp_call_jaxpr_jvp(primals, tangents, jaxpr, jvp, num_consts): + _, primals = split_list(primals, [num_consts]) + zero_tangents, tangents = split_list(tangents, [num_consts]) + assert all(t is zero for t in zero_tangents) + outs = jvp.call_wrapped(*(primals + tangents)) + primals_out, tangents_out = split_list(outs, [len(outs) // 2]) + return primals_out, tangents_out + +def _custom_jvp_call_jaxpr_vmap(args, in_dims, jaxpr, jvp, num_consts): + size, = {x.shape[d] for x, d in zip(args, in_dims) + if d is not batching.not_mapped} + args = [batching.moveaxis(x, d, 0) if d is not batching.not_mapped and d != 0 + else x for x, d in zip(args, in_dims)] + in_batched = [d is not batching.not_mapped for d in in_dims] + del in_dims + batched_jaxpr, out_batched = batching.batch_jaxpr(jaxpr, size, in_batched, False) + out_dims = [0 if b else batching.not_mapped for b in out_batched] + + jvp_in_dims = [0 if b else batching.not_mapped for b in in_batched] * 2 + batched_jvp = batching.batch_fun(jvp, jvp_in_dims, lambda: out_dims * 2) + + batched_outs = custom_jvp_call_jaxpr_p.bind( + *args, jaxpr=batched_jaxpr, jvp=batched_jvp, num_consts=num_consts) + return batched_outs, out_dims + +# If a (multi)linear function is defined with a custom jvp, then +# custom_jvp_call_jaxpr can appear in jaxprs to be transposed. We transpose it +# like a core.call. +def _custom_jvp_call_jaxpr_transpose(cts, *args, jaxpr, **kwargs): + name = 'custom_jvp_call_jaxpr_linear' + return ad.call_transpose(core.call_p, dict(name=name), jaxpr.jaxpr, + tuple(jaxpr.literals) + args, cts) + +custom_jvp_call_jaxpr_p = core.Primitive('custom_jvp_call_jaxpr') +custom_jvp_call_jaxpr_p.multiple_results = True +custom_jvp_call_jaxpr_p.def_impl(_custom_call_jaxpr_impl) +custom_jvp_call_jaxpr_p.def_abstract_eval(_custom_call_jaxpr_abstract_eval) +ad.primitive_jvps[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_jvp +ad.primitive_transposes[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_transpose +batching.primitive_batchers[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_vmap +xla.initial_style_translations[custom_jvp_call_jaxpr_p] = \ + xla.lower_fun_initial_style(_custom_call_jaxpr_impl) + + +### VJPs + +class custom_vjp: + """Set up a JAX-transformable function for a custom VJP rule definition. + + This class is meant to be used as a function decorator. Instances are + callables that behave similarly to the underlying function to which the + decorator was applied, except when a reverse-mode differentiation + transformation (like ``jax.grad``) is applied, in which case a custom + user-supplied VJP rule function is used instead of tracing into and performing + automatic differentiation of the underlying function's implementation. There + is a single instance method, ``defvjp``, which defines the custom VJP rule. + + This decorator precludes the use of forward-mode automatic differentiation. + + For example: + + import jax.numpy as np + + @jax.custom_vjp + def f(x, y): + return np.sin(x) * y + + def f_fwd(x, y): + return f(x, y), (np.cos(x), np.sin(x), y) + + def f_bwd(res, g): + cos_x, sin_x, y = res + return (cos_x * g * y, -sin_x * g) + + f.defvjp(f_fwd, f_bwd) + + For a more detailed introduction, see the tutorial_. + + .. _tutorial: https://jax.readthedocs.io/en/latest/notebooks/Custom_derivative_rules_for_Python_code.html + """ + + def __init__(self, fun, nondiff_argnums=()): + self.fun = fun + self.nondiff_argnums = nondiff_argnums + self.fwd = None + self.bwd = None + update_wrapper(self, fun) + + def defvjp(self, fwd, bwd): + """Define a custom VJP rule for the function represented by this instance. + + Args: + fwd: a Python callable representing the forward pass of the custom VJP + rule. When there are no ``nondiff_argnums``, the ``fwd`` function has + the same input signature as the underlying primal function. It should + return as output a pair, where the first element represents the primal + output and the second element represents any "residual" values to store + from the forward pass for use on the backward pass by the function + ``bwd``. Input arguments and elements of the output pair may be arrays + or nested tuples/lists/dicts thereof. + bwd: a Python callable representing the backward pass of the custom VJP + rule. When there are no ``nondiff_argnums``, the ``bwd`` function takes + two arguments, where the first is the "residual" values produced on the + forward pass by ``fwd``, and the second is the output cotangent with the + same structure as the primal function output. The output of ``bwd`` must + be a tuple of length equal to the number of arguments of the primal + function, and the tuple elements may be arrays or nested + tuples/lists/dicts thereof so as to match the structure of the primal + input arguments. + + Returns: + None. + + Example: + + import jax.numpy as np + + @jax.custom_vjp + def f(x, y): + return np.sin(x) * y + + def f_fwd(x, y): + return f(x, y), (np.cos(x), np.sin(x), y) + + def f_bwd(res, g): + cos_x, sin_x, y = res + return (cos_x * g * y, -sin_x * g) + + f.defvjp(f_fwd, f_bwd) + """ + self.fwd = fwd + self.bwd = bwd + + def __call__(self, *args, **kwargs): + if not self.fwd or not self.bwd: + msg = "No VJP defined for custom_vjp function {} using defvjp." + raise AttributeError(msg.format(self.__name__)) + args = _resolve_kwargs(self.fun, args, kwargs) + if self.nondiff_argnums: + dyn_argnums = [i for i in range(len(args)) if i not in self.nondiff_argnums] + f_, dyn_args = argnums_partial(lu.wrap_init(self.fun), dyn_argnums, args) + static_args = [args[i] for i in self.nondiff_argnums] + fwd, _ = argnums_partial(lu.wrap_init(self.fwd), dyn_argnums, args) + bwd = _add_args(lu.wrap_init(self.bwd), static_args, left=True) + else: + f_, dyn_args = lu.wrap_init(self.fun), args + fwd, bwd = lu.wrap_init(self.fwd), lu.wrap_init(self.bwd) + args_flat, in_tree = tree_flatten(dyn_args) + flat_fun, out_tree = flatten_fun_nokwargs(f_, in_tree) + flat_fwd, out_trees = _flatten_fwd(fwd, in_tree) + flat_bwd = _flatten_bwd(bwd, in_tree, out_trees) + out_flat = custom_vjp_call(flat_fun, *args_flat, fwd=flat_fwd, bwd=flat_bwd, + out_trees=out_trees) + try: out_tree = out_tree() + except lu.StoreException: out_tree, _ = out_trees() + return tree_unflatten(out_tree, out_flat) + +custom_vjp_call_p = core.Primitive('custom_vjp_call') +custom_vjp_call_p.multiple_results = True +custom_vjp_call = partial(_custom_deriv_call_bind, custom_vjp_call_p) +custom_vjp_call_p.def_custom_bind(custom_vjp_call) +custom_vjp_call_p.def_impl(_custom_call_impl) + +@transformation_with_equal_aux +def _flatten_fwd(in_tree, *args): + py_args = tree_unflatten(in_tree, args) + py_outs, res = yield py_args, {} + out, out_tree = tree_flatten(py_outs) + res, res_tree = tree_flatten(res) + yield res + out, (out_tree, res_tree) + +@lu.transformation +def _flatten_bwd(in_tree, out_trees, *args): + out_tree, res_tree = out_trees() + res, cts_out = split_list(args, [res_tree.num_leaves]) + py_res = tree_unflatten(res_tree, res) + py_cts_out = tree_unflatten(out_tree, cts_out) + py_cts_in = yield (py_res, py_cts_out), {} + cts_in, in_tree2 = tree_flatten(py_cts_in) + if in_tree != in_tree2: + msg = ("Custom VJP rule must produce an output with the same container " + "(pytree) structure as the args tuple of the primal function, " + "and in particular must produce a tuple of length equal to the " + "number of arguments to the primal function, but got VJP output " + "structure {} for primal input structure {}.") + raise TypeError(msg.format(in_tree2, in_tree)) from None + yield cts_in + +def _custom_vjp_call_jvp(trace, call_primitive, fun, tracers, params): + primals_in, tangents_in = unzip2((t.primal, t.tangent) for t in tracers) + tangents_in = map(ad.instantiate_zeros, primals_in, tangents_in) + fwd, bwd, out_trees = params['fwd'], params['bwd'], params['out_trees'] + res_and_primals_out = fwd.call_wrapped(*map(core.full_lower, primals_in)) + out_tree, res_tree = out_trees() + res, primals_out = split_list(res_and_primals_out, [res_tree.num_leaves]) + avals_out = [raise_to_shaped(core.get_aval(x)) for x in primals_out] + tangents_out = custom_lin_p.bind( + *it.chain(res, tangents_in), num_res=res_tree.num_leaves, bwd=bwd, + avals_out=avals_out) + return map(partial(ad.JVPTracer, trace), primals_out, tangents_out) +ad.call_jvp_rules[custom_vjp_call_p] = _custom_vjp_call_jvp + +def _custom_vjp_call_vmap(trace, call_primitive, fun, tracers, params): + in_vals, in_dims = unzip2((t.val, t.batch_dim) for t in tracers) + fwd, bwd, out_trees = params['fwd'], params['bwd'], params['out_trees'] + fun, out_dims = batching.batch_subtrace(fun, trace.master, in_dims) + fwd, out_dims2 = batching.batch_subtrace(fwd, trace.master, in_dims) + bwd = batching.batch_fun(bwd, out_dims2, in_dims) + out_vals = custom_vjp_call(fun, *in_vals, fwd=fwd, bwd=bwd, + out_trees=out_trees) + try: out_dims = out_dims() + except lu.StoreException: out_dims = out_dims2() + out_dims = out_dims[-len(out_vals) % len(out_dims):] + return [batching.BatchTracer(trace, v, d) for v, d in zip(out_vals, out_dims)] +batching.call_batching_rules[custom_vjp_call_p] = _custom_vjp_call_vmap + +def _custom_vjp_call_partial_eval(trace, call_primitive, fun, tracers, params): + return custom_vjp_call_jaxpr(fun, params['fwd'], params['bwd'], + params['out_trees'], *tracers) +pe.call_partial_eval_rules[custom_vjp_call_p] = _custom_vjp_call_partial_eval + + +custom_lin_p = core.Primitive('custom_lin') +custom_lin_p.def_abstract_eval(lambda *_, avals_out, **__: avals_out) +custom_lin_p.multiple_results = True + +def _raise_custom_vjp_error_on_jvp(*args, **kwargs): + raise TypeError("can't apply forward-mode autodiff (jvp) to a custom_vjp " + "function.") +custom_lin_p.def_impl(_raise_custom_vjp_error_on_jvp) + +def _custom_lin_transpose(cts_out, *invals, num_res, bwd, avals_out): + res, _ = split_list(invals, [num_res]) + cts_out = map(ad.instantiate_zeros_aval, avals_out, cts_out) + cts_in = bwd.call_wrapped(*(res + cts_out)) + cts_in_flat, in_tree = tree_flatten(cts_in) + return [None] * num_res + cts_in_flat +ad.primitive_transposes[custom_lin_p] = _custom_lin_transpose + + +def custom_vjp_call_jaxpr(fun, fwd, bwd, out_trees, *args): + in_avals = [raise_to_shaped(core.get_aval(x)) for x in args] + jaxpr, consts = _initial_style_jaxpr(fun, in_avals) + return custom_vjp_call_jaxpr_p.bind( + *it.chain(consts, args), jaxpr=jaxpr, fwd=fwd, bwd=bwd, + out_trees=out_trees, num_consts=len(consts)) + +def _custom_vjp_call_jaxpr_jvp(primals, tangents, jaxpr, fwd, bwd, out_trees, + num_consts): + _, primals = split_list(primals, [num_consts]) + zero_tangents, tangents = split_list(tangents, [num_consts]) + assert all(t is zero for t in zero_tangents) + res_and_primals_out = fwd.call_wrapped(*primals) + out_tree, res_tree = out_trees() + res, primals_out = split_list(res_and_primals_out, [res_tree.num_leaves]) + avals_out = [raise_to_shaped(core.get_aval(x)) for x in primals_out] + tangents_out = custom_lin_p.bind( + *it.chain(res, tangents), num_res=res_tree.num_leaves, bwd=bwd, + avals_out=avals_out) + return primals_out, tangents_out + +def _custom_vjp_call_jaxpr_vmap(args, in_dims, jaxpr, fwd, bwd, out_trees, + num_consts): + size, = {x.shape[d] for x, d in zip(args, in_dims) + if d is not batching.not_mapped} + args = [batching.moveaxis(x, d, 0) if d is not batching.not_mapped and d != 0 + else x for x, d in zip(args, in_dims)] + in_batched = [d is not batching.not_mapped for d in in_dims] + del in_dims + batched_jaxpr, out_batched = batching.batch_jaxpr(jaxpr, size, in_batched, False) + out_dims = [0 if b else batching.not_mapped for b in out_batched] + + fwd_in_dims = [0 if b else batching.not_mapped for b in in_batched] + batched_fwd, fwd_out_dims = batching.batch_fun2(fwd, fwd_in_dims) + batched_bwd = batching.batch_fun(bwd, fwd_out_dims, fwd_in_dims) + + batched_outs = custom_vjp_call_jaxpr_p.bind( + *args, jaxpr=batched_jaxpr, fwd=batched_fwd, bwd=batched_bwd, + out_trees=out_trees, num_consts=num_consts) + return batched_outs, out_dims + +custom_vjp_call_jaxpr_p = core.Primitive('custom_vjp_call_jaxpr') +custom_vjp_call_jaxpr_p.multiple_results = True +custom_vjp_call_jaxpr_p.def_impl(_custom_call_jaxpr_impl) +custom_vjp_call_jaxpr_p.def_abstract_eval(_custom_call_jaxpr_abstract_eval) +ad.primitive_jvps[custom_vjp_call_jaxpr_p] = _custom_vjp_call_jaxpr_jvp +batching.primitive_batchers[custom_vjp_call_jaxpr_p] = _custom_vjp_call_jaxpr_vmap +xla.initial_style_translations[custom_vjp_call_jaxpr_p] = \ + xla.lower_fun_initial_style(_custom_call_jaxpr_impl) diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index f21394abc335..a12f453add2d 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -370,7 +370,7 @@ def end_tracing_body(self): in_tracers=in_tracers, out_tracers=body_out_tracers, trace=self.trace) - except ValueError as e: + except core.UnexpectedTracerError as e: if "Tracer not among input tracers" in str(e): raise ValueError("Body of cond_range or while_range should not use the " "index variable returned by iterator.") from e diff --git a/jax/experimental/ode.py b/jax/experimental/ode.py index 719c0dad5397..a52d7a81b3c3 100644 --- a/jax/experimental/ode.py +++ b/jax/experimental/ode.py @@ -23,20 +23,36 @@ """ -import functools +from functools import partial +import operator as op import time import jax -from jax.flatten_util import ravel_pytree -import jax.lax import jax.numpy as np -import jax.ops -from jax.test_util import check_vjp +from jax import lax +from jax import ops +from jax.util import safe_map, safe_zip +from jax.flatten_util import ravel_pytree +from jax.test_util import check_grads +from jax.tree_util import tree_map +from jax import linear_util as lu import numpy as onp import scipy.integrate as osp_integrate +map = safe_map +zip = safe_zip + + +def ravel_first_arg(f, unravel): + return ravel_first_arg_(lu.wrap_init(f), unravel).call_wrapped + +@lu.transformation +def ravel_first_arg_(unravel, y_flat, *args): + y = unravel(y_flat) + ans = yield (y,) + args, {} + ans_flat, _ = ravel_pytree(ans) + yield ans_flat -@jax.jit def interp_fit_dopri(y0, y1, k, dt): # Fit a polynomial to the results of a Runge-Kutta step. dps_c_mid = np.array([ @@ -46,562 +62,234 @@ def interp_fit_dopri(y0, y1, k, dt): y_mid = y0 + dt * np.dot(dps_c_mid, k) return np.array(fit_4th_order_polynomial(y0, y1, y_mid, k[0], k[-1], dt)) - -@jax.jit def fit_4th_order_polynomial(y0, y1, y_mid, dy0, dy1, dt): - """Fit fourth order polynomial over function interval. - - Args: - y0: function value at the start of the interval. - y1: function value at the end of the interval. - y_mid: function value at the mid-point of the interval. - dy0: derivative value at the start of the interval. - dy1: derivative value at the end of the interval. - dt: width of the interval. - Returns: - Coefficients `[a, b, c, d, e]` for the polynomial - p = a * x ** 4 + b * x ** 3 + c * x ** 2 + d * x + e - """ - v = np.stack([dy0, dy1, y0, y1, y_mid]) - a = np.dot(np.hstack([-2. * dt, 2. * dt, np.array([-8., -8., 16.])]), v) - b = np.dot(np.hstack([5. * dt, -3. * dt, np.array([18., 14., -32.])]), v) - c = np.dot(np.hstack([-4. * dt, dt, np.array([-11., -5., 16.])]), v) + a = -2.*dt*dy0 + 2.*dt*dy1 - 8.*y0 - 8.*y1 + 16.*y_mid + b = 5.*dt*dy0 - 3.*dt*dy1 + 18.*y0 + 14.*y1 - 32.*y_mid + c = -4.*dt*dy0 + dt*dy1 - 11.*y0 - 5.*y1 + 16.*y_mid d = dt * dy0 e = y0 return a, b, c, d, e - -@functools.partial(jax.jit, static_argnums=(0,)) def initial_step_size(fun, t0, y0, order, rtol, atol, f0): - """Empirically choose initial step size. - - Args: - fun: Function to evaluate like `func(y, t)` to compute the time - derivative of `y`. - t0: initial time. - y0: initial value for the state. - order: order of interpolation - rtol: relative local error tolerance for solver. - atol: absolute local error tolerance for solver. - f0: initial value for the derivative, computed from `func(t0, y0)`. - Returns: - Initial step size for odeint algorithm. - - Algorithm from: - E. Hairer, S. P. Norsett G. Wanner, - Solving Ordinary Differential Equations I: Nonstiff Problems, Sec. II.4. - """ + # Algorithm from: + # E. Hairer, S. P. Norsett G. Wanner, + # Solving Ordinary Differential Equations I: Nonstiff Problems, Sec. II.4. scale = atol + np.abs(y0) * rtol d0 = np.linalg.norm(y0 / scale) d1 = np.linalg.norm(f0 / scale) - order_pow = (1. / (order + 1.)) - h0 = np.where(np.any(np.asarray([d0 < 1e-5, d1 < 1e-5])), - 1e-6, - 0.01 * d0 / d1) + h0 = np.where((d0 < 1e-5) | (d1 < 1e-5), 1e-6, 0.01 * d0 / d1) y1 = y0 + h0 * f0 f1 = fun(y1, t0 + h0) d2 = np.linalg.norm((f1 - f0) / scale) / h0 - h1 = np.where(np.all(np.asarray([d1 <= 1e-15, d2 <= 1e-15])), + h1 = np.where((d1 <= 1e-15) & (d2 <= 1e-15), np.maximum(1e-6, h0 * 1e-3), - (0.01 / np.max(d1 + d2))**order_pow) + (0.01 / np.max(d1 + d2)) ** (1. / (order + 1.))) return np.minimum(100. * h0, h1) - -@functools.partial(jax.jit, static_argnums=(0,)) def runge_kutta_step(func, y0, f0, t0, dt): - """Take an arbitrary Runge-Kutta step and estimate error. - - Args: - func: Function to evaluate like `func(y, t)` to compute the time - derivative of `y`. - y0: initial value for the state. - f0: initial value for the derivative, computed from `func(t0, y0)`. - t0: initial time. - dt: time step. - alpha, beta, c: Butcher tableau describing how to take the Runge-Kutta - step. - - Returns: - y1: estimated function at t1 = t0 + dt - f1: derivative of the state at t1 - y1_error: estimated error at t1 - k: list of Runge-Kutta coefficients `k` used for calculating these terms. - """ # Dopri5 Butcher tableaux alpha = np.array([1 / 5, 3 / 10, 4 / 5, 8 / 9, 1., 1., 0]) - beta = np.array( - [[1 / 5, 0, 0, 0, 0, 0, 0], - [3 / 40, 9 / 40, 0, 0, 0, 0, 0], - [44 / 45, -56 / 15, 32 / 9, 0, 0, 0, 0], - [19372 / 6561, -25360 / 2187, 64448 / 6561, -212 / 729, 0, 0, 0], - [9017 / 3168, -355 / 33, 46732 / 5247, 49 / 176, -5103 / 18656, 0, 0], - [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, 0]]) - c_sol = np.array([35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, - 0]) + beta = np.array([ + [1 / 5, 0, 0, 0, 0, 0, 0], + [3 / 40, 9 / 40, 0, 0, 0, 0, 0], + [44 / 45, -56 / 15, 32 / 9, 0, 0, 0, 0], + [19372 / 6561, -25360 / 2187, 64448 / 6561, -212 / 729, 0, 0, 0], + [9017 / 3168, -355 / 33, 46732 / 5247, 49 / 176, -5103 / 18656, 0, 0], + [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, 0] + ]) + c_sol = np.array([35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, 0]) c_error = np.array([35 / 384 - 1951 / 21600, 0, 500 / 1113 - 22642 / 50085, 125 / 192 - 451 / 720, -2187 / 6784 - -12231 / 42400, 11 / 84 - 649 / 6300, -1. / 60.]) - def _fori_body_fun(i, val): + def body_fun(i, k): ti = t0 + dt * alpha[i-1] - yi = y0 + dt * np.dot(beta[i-1, :], val) + yi = y0 + dt * np.dot(beta[i-1, :], k) ft = func(yi, ti) - return jax.ops.index_update(val, jax.ops.index[i, :], ft) + return ops.index_update(k, jax.ops.index[i, :], ft) - k = jax.lax.fori_loop( - 1, - 7, - _fori_body_fun, - jax.ops.index_update(np.zeros((7, f0.shape[0])), jax.ops.index[0, :], f0)) + k = ops.index_update(np.zeros((7, f0.shape[0])), ops.index[0, :], f0) + k = lax.fori_loop(1, 7, body_fun, k) y1 = dt * np.dot(c_sol, k) + y0 y1_error = dt * np.dot(c_error, k) f1 = k[-1] return y1, f1, y1_error, k - -@jax.jit def error_ratio(error_estimate, rtol, atol, y0, y1): err_tol = atol + rtol * np.maximum(np.abs(y0), np.abs(y1)) err_ratio = error_estimate / err_tol - return np.mean(err_ratio**2) + return np.mean(err_ratio ** 2) - -@jax.jit -def optimal_step_size(last_step, - mean_error_ratio, - safety=0.9, - ifactor=10.0, - dfactor=0.2, - order=5.0): +def optimal_step_size(last_step, mean_error_ratio, safety=0.9, ifactor=10.0, + dfactor=0.2, order=5.0): """Compute optimal Runge-Kutta stepsize.""" mean_error_ratio = np.max(mean_error_ratio) - dfactor = np.where(mean_error_ratio < 1, - 1.0, - dfactor) + dfactor = np.where(mean_error_ratio < 1, 1.0, dfactor) err_ratio = np.sqrt(mean_error_ratio) factor = np.maximum(1.0 / ifactor, - np.minimum(err_ratio**(1.0 / order) / safety, - 1.0 / dfactor)) - return np.where(mean_error_ratio == 0, - last_step * ifactor, - last_step / factor,) - + np.minimum(err_ratio**(1.0 / order) / safety, 1.0 / dfactor)) + return np.where(mean_error_ratio == 0, last_step * ifactor, last_step / factor) -@functools.partial(jax.jit, static_argnums=(0,)) -def odeint(ofunc, y0, t, *args, **kwargs): +def odeint(func, y0, t, *args, rtol=1.4e-8, atol=1.4e-8, mxstep=np.inf): """Adaptive stepsize (Dormand-Prince) Runge-Kutta odeint implementation. Args: - ofunc: Function to evaluate `yt = ofunc(y, t, *args)` that - returns the time derivative of `y`. - y0: initial value for the state. - t: Timespan for `ofunc` evaluation like `np.linspace(0., 10., 101)`. - *args: Additional arguments to `ofunc` beyond y0 and t. - **kwargs: Two relevant keyword arguments: - 'rtol': Relative local error tolerance for solver. - 'atol': Absolute local error tolerance for solver. - 'mxstep': Maximum number of steps to take for each timepoint. + func: function to evaluate the time derivative of the solution `y` at time + `t` as `func(y, t, *args)`, producing the same shape/structure as `y0`. + y0: array or pytree of arrays representing the initial value for the state. + t: array of float times for evaluation, like `np.linspace(0., 10., 101)`, + in which the values must be strictly increasing. + *args: tuple of additional arguments for `func`. + rtol: float, relative local error tolerance for solver (optional). + atol: float, absolute local error tolerance for solver (optional). + mxstep: int, maximum number of steps to take for each timepoint (optional). Returns: - Integrated system values at each timepoint. + Values of the solution `y` (i.e. integrated system values) at each time + point in `t`, represented as an array (or pytree of arrays) with the same + shape/structure as `y0` except with a new leading axis of length `len(t)`. """ - rtol = kwargs.get('rtol', 1.4e-8) - atol = kwargs.get('atol', 1.4e-8) - mxstep = kwargs.get('mxstep', np.inf) - - @functools.partial(jax.jit, static_argnums=(0,)) - def _fori_body_fun(func, i, val): - """Internal fori_loop body to interpolate an integral at each timestep.""" - t, cur_y, cur_f, cur_t, dt, last_t, interp_coeff, solution = val - cur_y, cur_f, cur_t, dt, last_t, interp_coeff, _ = jax.lax.while_loop( - lambda x: (x[2] < t[i]) & (x[-1] < mxstep), - functools.partial(_while_body_fun, func), - (cur_y, cur_f, cur_t, dt, last_t, interp_coeff, 0.)) - - relative_output_time = (t[i] - last_t) / (cur_t - last_t) - out_x = np.polyval(interp_coeff, relative_output_time) - - return (t, cur_y, cur_f, cur_t, dt, last_t, interp_coeff, - jax.ops.index_update(solution, - jax.ops.index[i, :], - out_x)) - - @functools.partial(jax.jit, static_argnums=(0,)) - def _while_body_fun(func, x): - """Internal while_loop body to determine interpolation coefficients.""" - cur_y, cur_f, cur_t, dt, last_t, interp_coeff, j = x - next_t = cur_t + dt - next_y, next_f, next_y_error, k = runge_kutta_step( - func, cur_y, cur_f, cur_t, dt) - error_ratios = error_ratio(next_y_error, rtol, atol, cur_y, next_y) - new_interp_coeff = interp_fit_dopri(cur_y, next_y, k, dt) - dt = optimal_step_size(dt, error_ratios) - - next_j = j + 1 - new_rav, unravel = ravel_pytree( - (next_y, next_f, next_t, dt, cur_t, new_interp_coeff, next_j)) - old_rav, _ = ravel_pytree( - (cur_y, cur_f, cur_t, dt, last_t, interp_coeff, next_j)) - - return unravel(np.where(np.all(error_ratios <= 1.), - new_rav, - old_rav)) - - func = lambda y, t: ofunc(y, t, *args) - f0 = func(y0, t[0]) - dt = initial_step_size(func, t[0], y0, 4, rtol, atol, f0) + return _odeint_wrapper(func, rtol, atol, mxstep, y0, t, *args) + +@partial(jax.jit, static_argnums=(0, 1, 2, 3)) +def _odeint_wrapper(func, rtol, atol, mxstep, y0, ts, *args): + y0, unravel = ravel_pytree(y0) + func = ravel_first_arg(func, unravel) + out = _odeint(func, rtol, atol, mxstep, y0, ts, *args) + return jax.vmap(unravel)(out) + +@partial(jax.custom_vjp, nondiff_argnums=(0, 1, 2, 3)) +def _odeint(func, rtol, atol, mxstep, y0, ts, *args): + func_ = lambda y, t: func(y, t, *args) + + def scan_fun(carry, target_t): + + def cond_fun(state): + i, _, _, t, _, _, _ = state + return (t < target_t) & (i < mxstep) + + def body_fun(state): + i, y, f, t, dt, last_t, interp_coeff = state + next_y, next_f, next_y_error, k = runge_kutta_step(func_, y, f, t, dt) + next_t = t + dt + error_ratios = error_ratio(next_y_error, rtol, atol, y, next_y) + new_interp_coeff = interp_fit_dopri(y, next_y, k, dt) + dt = optimal_step_size(dt, error_ratios) + + new = [i + 1, next_y, next_f, next_t, dt, t, new_interp_coeff] + old = [i + 1, y, f, t, dt, last_t, interp_coeff] + return map(partial(np.where, np.all(error_ratios <= 1.)), new, old) + + _, *carry = lax.while_loop(cond_fun, body_fun, [0] + carry) + _, _, t, _, last_t, interp_coeff = carry + relative_output_time = (target_t - last_t) / (t - last_t) + y_target = np.polyval(interp_coeff, relative_output_time) + return carry, y_target + + f0 = func_(y0, ts[0]) + dt = initial_step_size(func_, ts[0], y0, 4, rtol, atol, f0) interp_coeff = np.array([y0] * 5) + init_carry = [y0, f0, ts[0], dt, ts[0], interp_coeff] + _, ys = lax.scan(scan_fun, init_carry, ts[1:]) + return np.concatenate((y0[None], ys)) - return jax.lax.fori_loop(1, - t.shape[0], - functools.partial(_fori_body_fun, func), - (t, y0, f0, t[0], dt, t[0], interp_coeff, - jax.ops.index_update( - np.zeros((t.shape[0], y0.shape[0])), - jax.ops.index[0, :], - y0)))[-1] - +def _odeint_fwd(func, rtol, atol, mxstep, y0, ts, *args): + ys = _odeint(func, rtol, atol, mxstep, y0, ts, *args) + return ys, (ys, ts, args) -def vjp_odeint(ofunc, y0, t, *args, **kwargs): - """Return a function that calculates `vjp(odeint(func(y, t, *args))`. +def _odeint_rev(func, rtol, atol, mxstep, res, g): + ys, ts, args = res - Args: - ofunc: Function `ydot = ofunc(y, t, *args)` to compute the time - derivative of `y`. - y0: initial value for the state. - t: Timespan for `ofunc` evaluation like `np.linspace(0., 10., 101)`. - *args: Additional arguments to `ofunc` beyond y0 and t. - **kwargs: Two relevant keyword arguments: - 'rtol': Relative local error tolerance for solver. - 'atol': Absolute local error tolerance for solver. - 'mxstep': Maximum number of steps to take for each timepoint. - - Returns: - VJP function `vjp = vjp_all(g)` where `yt = ofunc(y, t, *args)` - and g is used for VJP calculation. To evaluate the gradient w/ the VJP, - supply `g = np.ones_like(yt)`. To evaluate the reverse Jacobian do a vmap - over the standard basis of yt. - """ - rtol = kwargs.get('rtol', 1.4e-8) - atol = kwargs.get('atol', 1.4e-8) - mxstep = kwargs.get('mxstep', np.inf) - - flat_args, unravel_args = ravel_pytree(args) - flat_func = lambda y, t, flat_args: ofunc(y, t, *unravel_args(flat_args)) - - @jax.jit - def aug_dynamics(augmented_state, t, flat_args): + def aug_dynamics(augmented_state, t, *args): """Original system augmented with vjp_y, vjp_t and vjp_args.""" - state_len = int(np.floor_divide( - augmented_state.shape[0] - flat_args.shape[0] - 1, 2)) - y = augmented_state[:state_len] - adjoint = augmented_state[state_len:2*state_len] - dy_dt, vjpfun = jax.vjp(flat_func, y, t, flat_args) - return np.hstack([np.ravel(dy_dt), np.hstack(vjpfun(-adjoint))]) - - rev_aug_dynamics = lambda y, t, flat_args: -aug_dynamics(y, -t, flat_args) - - @jax.jit - def _fori_body_fun(i, val): - """fori_loop function for VJP calculation.""" - rev_yt, rev_t, rev_tarray, rev_gi, vjp_y, vjp_t0, vjp_args, time_vjp_list = val - this_yt = rev_yt[i, :] - this_t = rev_t[i] - this_tarray = rev_tarray[i, :] - this_gi = rev_gi[i, :] - # this is g[i-1, :] when g has been reversed - this_gim1 = rev_gi[i+1, :] - state_len = this_yt.shape[0] - vjp_cur_t = np.dot(flat_func(this_yt, this_t, flat_args), this_gi) - vjp_t0 = vjp_t0 - vjp_cur_t - # Run augmented system backwards to the previous observation. - aug_y0 = np.hstack((this_yt, vjp_y, vjp_t0, vjp_args)) - aug_ans = odeint(rev_aug_dynamics, - aug_y0, - this_tarray, - flat_args, - rtol=rtol, - atol=atol, - mxstep=mxstep) - vjp_y = aug_ans[1][state_len:2*state_len] + this_gim1 - vjp_t0 = aug_ans[1][2*state_len] - vjp_args = aug_ans[1][2*state_len+1:] - time_vjp_list = jax.ops.index_update(time_vjp_list, i, vjp_cur_t) - return rev_yt, rev_t, rev_tarray, rev_gi, vjp_y, vjp_t0, vjp_args, time_vjp_list - - @jax.jit - def vjp_all(g, yt, t): - """Calculate the VJP g * Jac(odeint(ofunc, y0, t, *args)).""" - rev_yt = yt[-1::-1, :] - rev_t = t[-1::-1] - rev_tarray = -np.array([t[-1:0:-1], t[-2::-1]]).T - rev_gi = g[-1::-1, :] - - vjp_y = g[-1, :] - vjp_t0 = 0. - vjp_args = np.zeros_like(flat_args) - time_vjp_list = np.zeros_like(t) - - result = jax.lax.fori_loop(0, - rev_t.shape[0]-1, - _fori_body_fun, - (rev_yt, - rev_t, - rev_tarray, - rev_gi, - vjp_y, - vjp_t0, - vjp_args, - time_vjp_list)) - - time_vjp_list = jax.ops.index_update(result[-1], -1, result[-3]) - vjp_times = np.hstack(time_vjp_list)[::-1] - vjp_args = unravel_args(result[-2]) - return (result[-4], vjp_times, *vjp_args) - - primals_out = odeint(flat_func, y0, t, flat_args, rtol=rtol, atol=atol, mxstep=mxstep) - vjp_fun = lambda g: vjp_all(g, primals_out, t) - - return primals_out, vjp_fun - - -def build_odeint(ofunc, rtol=1.4e-8, atol=1.4e-8, mxstep=onp.inf): - """Return `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)`. - - Given the function ofunc(y, t, *args), return the jitted function - `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)` with - the VJP of `f` defined using `vjp_odeint`, where: - - `y0` is the initial condition of the ODE integration, - `t` is the time course of the integration, and - `*args` are all other arguments to `ofunc`. - - Args: - ofunc: The function to be wrapped into an ODE integration. - rtol: relative local error tolerance for solver. - atol: absolute local error tolerance for solver. - mxstep: Maximum number of steps to take for each timepoint. - - Returns: - `f(y0, t, args) = odeint(ofunc(y, t, *args), y0, t, args)` - """ - ct_odeint = jax.custom_transforms( - lambda y0, t, *args: odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol, mxstep=mxstep)) - - v = lambda y0, t, *args: vjp_odeint(ofunc, y0, t, *args, rtol=rtol, atol=atol, mxstep=mxstep) - jax.defvjp_all(ct_odeint, v) - - return jax.jit(ct_odeint) - - -def my_odeint_grad(fun): - """Calculate the Jacobian of an odeint.""" - @jax.jit - def _gradfun(*args, **kwargs): - ys, pullback = vjp_odeint(fun, *args, **kwargs) - my_grad = pullback(np.ones_like(ys)) - return my_grad - return _gradfun - - -def my_odeint_jacrev(fun): - """Calculate the Jacobian of an odeint.""" - @jax.jit - def _jacfun(*args, **kwargs): - ys, pullback = vjp_odeint(fun, *args, **kwargs) - my_jac = jax.vmap(pullback)(jax.api._std_basis(ys)) - my_jac = jax.api.tree_map( - functools.partial(jax.api._unravel_array_into_pytree, ys, 0), my_jac) - my_jac = jax.api.tree_transpose( - jax.api.tree_structure(args), jax.api.tree_structure(ys), my_jac) - return my_jac - return _jacfun - - -def nd(f, x, eps=0.0001): - flat_x, unravel = ravel_pytree(x) - dim = len(flat_x) - g = onp.zeros_like(flat_x) - for i in range(dim): - d = onp.zeros_like(flat_x) - d[i] = eps - g[i] = (f(unravel(flat_x + d)) - f(unravel(flat_x - d))) / (2.0 * eps) - return g - - -def test_grad_vjp_odeint(): - """Compare numerical and exact differentiation of a simple odeint.""" - - def f(y, t, arg1, arg2): - return -np.sqrt(t) - y + arg1 - np.mean((y + arg2)**2) - - def onearg_odeint(args): - return np.sum( - odeint(f, *args, atol=1e-8, rtol=1e-8)) - - dim = 10 - t0 = 0.1 - t1 = 0.2 - y0 = np.linspace(0.1, 0.9, dim) - arg1 = 0.1 - arg2 = 0.2 - wrap_args = (y0, np.array([t0, t1]), arg1, arg2) - - numerical_grad = nd(onearg_odeint, wrap_args) - exact_grad, _ = ravel_pytree(my_odeint_grad(f)(*wrap_args)) - - assert np.allclose(numerical_grad, exact_grad) - - -def plot_gradient_field(ax, func, xlimits, ylimits, numticks=30): - """Plot the gradient field of `func` on `ax`.""" - x = np.linspace(*xlimits, num=numticks) - y = np.linspace(*ylimits, num=numticks) - x_mesh, y_mesh = np.meshgrid(x, y) - zs = jax.vmap(func)(y_mesh.ravel(), x_mesh.ravel()) - z_mesh = zs.reshape(x_mesh.shape) - ax.quiver(x_mesh, y_mesh, np.ones(z_mesh.shape), z_mesh) - ax.set_xlim(xlimits) - ax.set_ylim(ylimits) - - -@jax.jit -def pend(y, t, arg1, arg2): - """Simple pendulum system for odeint testing.""" - del t + y, y_bar, *_ = augmented_state + y_dot, vjpfun = jax.vjp(func, y, -t, *args) + return (-y_dot, *vjpfun(y_bar)) + + y_bar = g[-1] + ts_bar = [] + t0_bar = 0. + + def scan_fun(carry, i): + y_bar, t0_bar, args_bar = carry + # Compute effect of moving measurement time + t_bar = np.dot(func(ys[i], ts[i], *args), g[i]) + t0_bar = t0_bar - t_bar + # Run augmented system backwards to previous observation + _, y_bar, t0_bar, args_bar = odeint( + aug_dynamics, (ys[i], y_bar, t0_bar, args_bar), np.array([ts[i - 1], ts[i]]), + *args, rtol=rtol, atol=atol, mxstep=mxstep) + y_bar, t0_bar, args_bar = tree_map(op.itemgetter(1), (y_bar, t0_bar, args_bar)) + # Add gradient from current output + y_bar = y_bar + g[i - 1] + return (y_bar, t0_bar, args_bar), t_bar + + init_carry = (g[-1], 0., tree_map(np.zeros_like, args)) + (y_bar, t0_bar, args_bar), rev_ts_bar = lax.scan( + scan_fun, init_carry, np.arange(len(ts) - 1, 0, -1)) + ts_bar = np.concatenate([np.array([t0_bar]), rev_ts_bar[::-1]]) + return (y_bar, ts_bar, *args_bar) + +_odeint.defvjp(_odeint_fwd, _odeint_rev) + + +def pend(np, y, _, m, g): theta, omega = y - dydt = np.array([omega, -arg1*omega - arg2*np.sin(theta)]) - return dydt - - -@jax.jit -def swoop(y, t, arg1, arg2): - return np.array(y - np.sin(t) - np.cos(t) * arg1 + arg2) - - -@jax.jit -def decay(y, t, arg1, arg2): - return -np.sqrt(t) - y + arg1 - np.mean((y + arg2)**2) - + return [omega, -m * omega - g * np.sin(theta)] def benchmark_odeint(fun, y0, tspace, *args): """Time performance of JAX odeint method against scipy.integrate.odeint.""" - n_trials = 5 + n_trials = 10 + n_repeat = 100 + y0, tspace = onp.array(y0), onp.array(tspace) + onp_fun = partial(fun, onp) + scipy_times = [] for k in range(n_trials): start = time.time() - scipy_result = osp_integrate.odeint(fun, y0, tspace, args) + for _ in range(n_repeat): + scipy_result = osp_integrate.odeint(onp_fun, y0, tspace, args) end = time.time() - print('scipy odeint elapsed time ({} of {}): {}'.format( - k+1, n_trials, end-start)) + print('scipy odeint elapsed time ({} of {}): {}'.format(k+1, n_trials, end-start)) + scipy_times.append(end - start) + y0, tspace = np.array(y0), np.array(tspace) + jax_fun = partial(fun, np) + jax_times = [] for k in range(n_trials): start = time.time() - jax_result = odeint(fun, np.array(y0), np.array(tspace), *args) + for _ in range(n_repeat): + jax_result = odeint(jax_fun, y0, tspace, *args) jax_result.block_until_ready() end = time.time() - print('JAX odeint elapsed time ({} of {}): {}'.format( - k+1, n_trials, end-start)) + print('JAX odeint elapsed time ({} of {}): {}'.format(k+1, n_trials, end-start)) + jax_times.append(end - start) + print('(avg scipy time) / (avg jax time) = {}'.format( + onp.mean(scipy_times[1:]) / onp.mean(jax_times[1:]))) print('norm(scipy result-jax result): {}'.format( np.linalg.norm(np.asarray(scipy_result) - jax_result))) - return scipy_result, jax_result - def pend_benchmark_odeint(): - _, _ = benchmark_odeint(pend, - (onp.pi - 0.1, 0.0), - onp.linspace(0., 10., 101), - 0.25, - 9.8) - - -def test_odeint_grad(): - """Test the gradient behavior of various ODE integrations.""" - def _test_odeint_grad(func, *args): - def onearg_odeint(fargs): - return np.sum(odeint(func, *fargs)) - - numerical_grad = nd(onearg_odeint, args) - exact_grad, _ = ravel_pytree(my_odeint_grad(func)(*args)) - assert np.allclose(numerical_grad, exact_grad) - - ts = np.array((0.1, 0.2)) - y0 = np.linspace(0.1, 0.9, 10) - big_y0 = np.linspace(1.1, 10.9, 10) - - # check pend() - for cond in ( - (np.array((onp.pi - 0.1, 0.0)), ts, 0.25, 0.98), - (np.array((onp.pi * 0.1, 0.0)), ts, 0.1, 0.4), - ): - _test_odeint_grad(pend, *cond) - - # check swoop - for cond in ( - (y0, ts, 0.1, 0.2), - (big_y0, ts, 0.1, 0.3), - ): - _test_odeint_grad(swoop, *cond) - - # check decay - for cond in ( - (y0, ts, 0.1, 0.2), - (big_y0, ts, 0.1, 0.3), - ): - _test_odeint_grad(decay, *cond) - - -def test_odeint_vjp(): - """Use check_vjp to check odeint VJP calculations.""" - - # check pend() - y = np.array([np.pi - 0.1, 0.0]) - t = np.linspace(0., 10., 11) - b = 0.25 - c = 9.8 - wrap_args = (y, t, b, c) - pend_odeint_wrap = lambda y, t, *args: odeint(pend, y, t, *args) - pend_vjp_wrap = lambda y, t, *args: vjp_odeint(pend, y, t, *args) - check_vjp(pend_odeint_wrap, pend_vjp_wrap, wrap_args) - - # check swoop() - y = np.array([0.1]) - t = np.linspace(0., 10., 11) - arg1 = 0.1 - arg2 = 0.2 - wrap_args = (y, t, arg1, arg2) - swoop_odeint_wrap = lambda y, t, *args: odeint(swoop, y, t, *args) - swoop_vjp_wrap = lambda y, t, *args: vjp_odeint(swoop, y, t, *args) - check_vjp(swoop_odeint_wrap, swoop_vjp_wrap, wrap_args) - - # decay() check_vjp hangs! - - -def test_defvjp_all(): - """Use build_odeint to check odeint VJP calculations.""" - n_trials = 5 - swoop_build = build_odeint(swoop) - jacswoop = jax.jit(jax.jacrev(swoop_build)) - y = np.array([0.1]) - t = np.linspace(0., 2., 11) - arg1 = 0.1 - arg2 = 0.2 - wrap_args = (y, t, arg1, arg2) - for k in range(n_trials): - start = time.time() - rslt = jacswoop(*wrap_args) - rslt.block_until_ready() - end = time.time() - print('JAX jacrev elapsed time ({} of {}): {}'.format( - k+1, n_trials, end-start)) + _, _ = benchmark_odeint(pend, [np.pi - 0.1, 0.0], np.linspace(0., 10., 101), + 0.25, 9.8) +def pend_check_grads(): + def f(y0, ts, *args): + return odeint(partial(pend, np), y0, ts, *args) -if __name__ == '__main__': + y0 = [np.pi - 0.1, 0.0] + ts = np.linspace(0., 1., 11) + args = (0.25, 9.8) - test_odeint_grad() - test_odeint_vjp() + check_grads(f, (y0, ts, *args), modes=["rev"], order=2, + atol=1e-1, rtol=1e-1) + + +if __name__ == '__main__': + pend_benchmark_odeint() + pend_check_grads() diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index ef718f228fc2..687423bbd92e 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -277,8 +277,8 @@ def get_primitive_transpose(p): return primitive_transposes[p] except KeyError as err: raise NotImplementedError( - "Reverse-mode differentiation rule for '{}' not implemented".format(p) - ) from err + "Transpose rule (for reverse-mode differentiation) for '{}' " + "not implemented".format(p)) from err class JVPTrace(Trace): @@ -307,15 +307,19 @@ def process_primitive(self, primitive, tracers, params): def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): assert call_primitive.multiple_results - primals = [t.primal for t in tracers] - tangents = [t.tangent for t in tracers] - nonzero_tangents, in_tree_def = tree_flatten(tangents) - f_jvp, out_tree_def = traceable(jvp_subtrace(f, self.master), len(primals), in_tree_def) - name = params.get('name', f.__name__) - params = dict(params, name=wrap_name(name, 'jvp')) - result = call_primitive.bind(f_jvp, *(primals + nonzero_tangents), **params) - primal_out, tangent_out = tree_unflatten(out_tree_def(), result) - return [JVPTracer(self, p, t) for p, t in zip(primal_out, tangent_out)] + if call_primitive in call_jvp_rules: + return call_jvp_rules[call_primitive](self, call_primitive, f, tracers, params) + else: + primals = [t.primal for t in tracers] + tangents = [t.tangent for t in tracers] + nonzero_tangents, in_tree_def = tree_flatten(tangents) + f_jvp, out_tree_def = traceable(jvp_subtrace(f, self.master), + len(primals), in_tree_def) + name = params.get('name', f.__name__) + params = dict(params, name=wrap_name(name, 'jvp')) + result = call_primitive.bind(f_jvp, *(primals + nonzero_tangents), **params) + primal_out, tangent_out = tree_unflatten(out_tree_def(), result) + return [JVPTracer(self, p, t) for p, t in zip(primal_out, tangent_out)] def post_process_call(self, call_primitive, out_tracers, params): primals, tangents = unzip2((t.primal, t.tangent) for t in out_tracers) @@ -371,7 +375,8 @@ def _primal_tangent_shapes_match(primal, tangent): # -------------------- Primitives -------------------- -primitive_jvps: Dict[core.Primitive, Callable] = {} +primitive_jvps : Dict[core.Primitive, Callable] = {} +call_jvp_rules : Dict[core.Primitive, Callable] = {} primitive_transposes: Dict[core.Primitive, Callable] = {} @@ -430,65 +435,6 @@ def add_tangents(x, y): return add_jaxvals(x, y) -def defvjp_all(prim, custom_vjp): - # see https://github.com/google/jax/pull/636 - name = prim.name - - def fun_jvp(xs, ts, **params): - ts = map(instantiate_zeros, xs, ts) - primals_and_tangents = fun_jvp_p.bind(*it.chain(xs, ts), **params) - primals, tangents = split_list(primals_and_tangents, [len(primals_and_tangents) // 2]) - if prim.multiple_results: - return primals, tangents - else: - primal, = primals - tangent, = tangents - return primal, tangent - primitive_jvps[prim] = fun_jvp - - fun_jvp_p = core.Primitive('{name}_jvp'.format(name=name)) - fun_jvp_p.multiple_results = True - def fun_jvp_partial_eval(trace, *tracers, **params): - primals, tangents = split_list(tracers, [len(tracers) // 2]) - primals_out, vjp_py = custom_vjp(*primals, **params) - if not prim.multiple_results: - primals_out = [primals_out] - out_avals = [raise_to_shaped(get_aval(x)) for x in primals_out] - ct_pvals = [pe.PartialVal((aval, core.unit)) for aval in out_avals] - jaxpr, _, res = pe.trace_to_jaxpr(lu.wrap_init(vjp_py), ct_pvals, instantiate=True) - tangents_out = fun_lin_p.bind(*it.chain(res, tangents), trans_jaxpr=jaxpr, - num_res=len(res), out_avals=out_avals) - return primals_out + tangents_out - pe.custom_partial_eval_rules[fun_jvp_p] = fun_jvp_partial_eval - - fun_lin_p = core.Primitive('{name}_lin'.format(name=name)) - fun_lin_p.multiple_results = True - fun_lin_p.def_abstract_eval(lambda *_, **kwargs: kwargs['out_avals']) - def fun_lin_transpose(cts, *args, **kwargs): - num_res, trans_jaxpr = kwargs['num_res'], kwargs['trans_jaxpr'] - res, _ = split_list(args, [num_res]) - cts = map(instantiate_zeros_aval, kwargs['out_avals'], cts) - outs = core.eval_jaxpr(trans_jaxpr, res, *cts) - return [None] * num_res + outs - primitive_transposes[fun_lin_p] = fun_lin_transpose - -def defvjp(prim, *vjps): - def vjpmaker(*primals): - ans = prim.bind(*primals) - vjpfun = lambda ct: [vjp(ct, *primals) if vjp else zeros_like_jaxval(x) - for x, vjp in zip(primals, vjps)] - return ans, vjpfun - defvjp_all(prim, vjpmaker) - -def defvjp2(prim, *vjps): - def vjpmaker(*primals): - ans = prim.bind(*primals) - vjpfun = lambda ct: [vjp(ct, ans, *primals) if vjp else zeros_like_jaxval(x) - for x, vjp in zip(primals, vjps)] - return ans, vjpfun - defvjp_all(prim, vjpmaker) - - def defbilinear_broadcasting(bcast, prim, lhs_rule, rhs_rule): assert isinstance(prim, Primitive) lhs_jvp = lambda g, x, y, **kwargs: prim.bind(bcast(g, y), y, **kwargs) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index befd76f07fab..83b61ae2b8b9 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -28,28 +28,49 @@ map = safe_map -def batch(fun: lu.WrappedFun, in_vals, in_dims, out_dim_dests): - size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} - out_vals, out_dims = batch_fun(fun, in_vals, in_dims) - return map(partial(matchaxis, size), out_dims, out_dim_dests(), out_vals) - -def batch_fun(fun: lu.WrappedFun, in_vals, in_dims): - with new_master(BatchTrace) as master: - fun, out_dims = batch_subtrace(fun, master, in_dims) - out_vals = fun.call_wrapped(*in_vals) - del master - return out_vals, out_dims() +def batch(fun : lu.WrappedFun, in_vals, in_dims, out_dim_dests): + # executes a batched version of `fun` following out_dim_dests + batched_fun = batch_fun(fun, in_dims, out_dim_dests) + return batched_fun.call_wrapped(*in_vals) @lu.transformation_with_aux -def batch_subtrace(master, in_dims, *in_vals): +def batch_subtrace(master, in_dims, *in_vals, **params): trace = BatchTrace(master, core.cur_sublevel()) in_tracers = [BatchTracer(trace, val, dim) if dim is not None else val for val, dim in zip(in_vals, in_dims)] - outs = yield in_tracers, {} + outs = yield in_tracers, params out_tracers = map(trace.full_raise, outs) out_vals, out_dims = unzip2((t.val, t.batch_dim) for t in out_tracers) yield out_vals, out_dims +def batch_fun(fun : lu.WrappedFun, in_dims, out_dim_dests): + # transformation version of batch, which doesn't call the function + fun, out_dims = batch_subtrace(fun) + return _batch_fun(fun, in_dims, out_dims, out_dim_dests) + +@lu.transformation +def _batch_fun(in_dims, out_dims, out_dim_dests, *in_vals, **params): + in_dims = in_dims() if callable(in_dims) else in_dims + size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} + with new_master(BatchTrace) as master: + out_vals = yield (master, in_dims,) + in_vals, params + del master + out_dim_dests = out_dim_dests() if callable(out_dim_dests) else out_dim_dests + out_vals = map(partial(matchaxis, size), out_dims(), out_dim_dests, out_vals) + yield out_vals + +def batch_fun2(fun : lu.WrappedFun, in_dims): + # like `batch_fun` but returns output batch dims (so no out_dim_dests) + fun, out_dims = batch_subtrace(fun) + return _batch_fun2(fun, in_dims), out_dims + +@lu.transformation +def _batch_fun2(in_dims, *in_vals, **params): + with new_master(BatchTrace) as master: + out_vals = yield (master, in_dims,) + in_vals, params + del master + yield out_vals + ### tracer @@ -112,17 +133,19 @@ def process_primitive(self, primitive, tracers, params): def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): assert call_primitive.multiple_results - name = params.get('name', f.__name__) - params = dict(params, name=wrap_name(name, 'vmap')) - if call_primitive in pe.map_primitives: + params = dict(params, name=wrap_name(params.get('name', f.__name__), 'vmap')) + if call_primitive in call_batching_rules: + return call_batching_rules[call_primitive](self, call_primitive, f, tracers, params) + elif call_primitive in pe.map_primitives: return self.process_map(call_primitive, f, tracers, params) - vals, dims = unzip2((t.val, t.batch_dim) for t in tracers) - if all(bdim is not_mapped for bdim in dims): - return call_primitive.bind(f, *vals, **params) else: - f, dims_out = batch_subtrace(f, self.master, dims) - vals_out = call_primitive.bind(f, *vals, **params) - return [BatchTracer(self, v, d) for v, d in zip(vals_out, dims_out())] + vals, dims = unzip2((t.val, t.batch_dim) for t in tracers) + if all(bdim is not_mapped for bdim in dims): + return call_primitive.bind(f, *vals, **params) + else: + f, dims_out = batch_subtrace(f, self.master, dims) + vals_out = call_primitive.bind(f, *vals, **params) + return [BatchTracer(self, v, d) for v, d in zip(vals_out, dims_out())] def process_map(self, map_primitive, f: lu.WrappedFun, tracers, params): vals, dims = unzip2((t.val, t.batch_dim) for t in tracers) @@ -151,7 +174,8 @@ def todo(x): ### primitives BatchingRule = Callable[..., Tuple[Any, Union[int, Tuple[int, ...]]]] -primitive_batchers: Dict[core.Primitive, BatchingRule] = {} +primitive_batchers : Dict[core.Primitive, BatchingRule] = {} +call_batching_rules : Dict[core.Primitive, BatchingRule] = {} def get_primitive_batcher(p): try: diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index ec5a247f11c6..b5ac96507248 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -124,7 +124,7 @@ def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): name = wrap_name(name, 'pe') params = dict(params, name=name) if call_primitive in call_partial_eval_rules: - return call_partial_eval_rules[call_primitive](self, f, tracers, params) + return call_partial_eval_rules[call_primitive](self, call_primitive, f, tracers, params) if call_primitive in map_primitives: return self.process_map(call_primitive, f, tracers, params) in_pvs, in_consts = unzip2([t.pval for t in tracers]) @@ -285,7 +285,7 @@ def __init__(self, trace, pval, recipe): assert isinstance(pval, PartialVal) pv, const = pval if isinstance(const, Tracer) and const._trace.level >= trace.level: - trace.escaped_tracer_error( + core.escaped_tracer_error( "Tracer from a higher level: {} in trace {}".format(const, trace)) self._trace = trace self.pval = pval @@ -348,10 +348,8 @@ def partial_val_aval(pv, const): else: raise TypeError(pv) - def trace_to_jaxpr(fun: lu.WrappedFun, pvals: Sequence[PartialVal], instantiate=False, stage_out_calls=False, bottom=False): - """Traces a function, given abstract inputs, to a jaxpr.""" trace_type = StagingJaxprTrace if stage_out_calls else JaxprTrace with new_master(trace_type, bottom=bottom) as master: fun = trace_to_subjaxpr(fun, master, instantiate) @@ -454,7 +452,7 @@ def getconstvar(c): processed_eqn_ids.add(recipe.eqn_id) elif isinstance(recipe, LambdaBinding): if not any(t is in_tracer for in_tracer in in_tracers): - t._trace.escaped_tracer_error("Tracer not among input tracers {}".format(t)) + core.escaped_tracer_error("Tracer not among input tracers {}".format(t)) assert in_tracers, "Lambda binding with no args" elif isinstance(recipe, FreeVar): env[getvar(t)] = recipe.val @@ -539,7 +537,7 @@ def _split_aval(unknown, aval): remat_call_p.def_impl(core.call_impl) remat_call_p.multiple_results = True -def _remat_partial_eval(trace, f, tracers, params): +def _remat_partial_eval(trace, _, f, tracers, params): concrete = params['concrete'] # Unlike JaxprTrace.process_call, we want to form a jaxpr for the entirety of diff --git a/jax/lax/lax.py b/jax/lax/lax.py index d03dea529df5..2e05b0b2b1a3 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1853,7 +1853,9 @@ def _pow_jvp_rhs(g, ans, x, y): ad.defjvp_zero(xor_p) def _add_transpose(t, x, y): - # assert ad.is_undefined_primal(x) and ad.is_undefined_primal(y) # not affine + # The following linearity assertion is morally true, but because in some cases we + # instantiate zeros for convenience, it doesn't always hold. + # assert ad.is_undefined_primal(x) and ad.is_undefined_primal(y) return [t, t] add_p = standard_naryop([_num, _num], 'add') @@ -1862,7 +1864,9 @@ def _add_transpose(t, x, y): def _sub_transpose(t, x, y): - assert ad.is_undefined_primal(x) and ad.is_undefined_primal(y) + # The following linearity assertion is morally true, but because in some cases + # we instantiate zeros for convenience, it doesn't always hold. + # assert ad.is_undefined_primal(x) and ad.is_undefined_primal(y) return [t, neg(t) if t is not ad_util.zero else ad_util.zero] sub_p = standard_naryop([_num, _num], 'sub') diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 3a391c00feb7..2dd657e9dfd3 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -26,7 +26,7 @@ import numpy as onp -from jax import api +import jax from jax import core from jax import dtypes from jax.lax import lax @@ -44,7 +44,8 @@ from jax.util import (partial, unzip2, safe_map, safe_zip, split_list, split_dict, cache, extend_name_stack) from jax.tree_util import (tree_flatten, tree_unflatten, treedef_is_leaf, - treedef_children, treedef_tuple) + treedef_children, treedef_tuple, tree_leaves, + tree_multimap) from jax import ad_util _map = safe_map @@ -78,7 +79,11 @@ def typematch(aval1, aval2): return (raise_to_shaped(aval1).strip_weak_type() == raise_to_shaped(aval2).strip_weak_type()) -class FixedPointError(Exception): pass +def _disable_jit_impl(prim, interp, *args, **kwargs): + if jax.api._jit_is_disabled(): + return interp(*args, **kwargs) + else: + return xla.apply_primitive(prim, *args, **kwargs) ### fori_loop and while_loop @@ -210,6 +215,12 @@ def while_loop(cond_fun, body_fun, init_val): Returns: The output from the final iteration of body_fun, of type ``a``. """ + if jax.api._jit_is_disabled(): + val = init_val + while cond_fun(val): + val = body_fun(val) + return val + init_vals, in_tree = tree_flatten((init_val,)) init_avals = tuple(_map(_abstractify, init_vals)) cond_jaxpr, cond_consts, cond_tree = _initial_style_jaxpr(cond_fun, in_tree, init_avals) @@ -430,6 +441,13 @@ def cond(pred, true_operand, true_fun, false_operand, false_fun): else: msg = ("Pred type must be either boolean or number, got {}.") raise TypeError(msg.format(pred_dtype)) + + if jax.api._jit_is_disabled(): + if pred: + return true_fun(true_operand) + else: + return false_fun(false_operand) + true_ops, true_tree = tree_flatten((true_operand,)) true_avals = tuple(_map(_abstractify, true_ops)) true_jaxpr, true_consts, true_out_tree = _initial_style_jaxpr(true_fun, true_tree, true_avals) @@ -783,7 +801,7 @@ def scan(f, init, xs, length=None): the second output of ``f`` when scanned over the leading axis of the inputs. """ init_flat, init_tree = tree_flatten(init) - xs_flat, _ = tree_flatten(xs) + xs_flat, xs_tree = tree_flatten(xs) in_flat, in_tree = tree_flatten((init, xs)) try: @@ -811,6 +829,17 @@ def scan(f, init, xs, length=None): else: length, = unique_lengths + if jax.api._jit_is_disabled(): + carry = init + ys = [] + for i in range(length): + xs_slice = [_index_array(i, core.get_aval(x), x) for x in xs_flat] + carry, y = f(carry, tree_unflatten(xs_tree, xs_slice)) + ys.append(y) + stack = lambda y, *ys: (y if core.get_aval(y) is core.abstract_unit + else jax.numpy.stack((y, *ys))) + return carry, tree_multimap(stack, *ys) + carry_avals = tuple(_map(_abstractify, init_flat)) x_shapes = [masking.padded_shape_as_value(x.shape[1:]) for x in xs_flat] x_dtypes = [x.dtype for x in xs_flat] @@ -1363,7 +1392,7 @@ def custom_root(f, initial_guess, solve, tangent_solve): _check_tree("solve", "initial_guess", solution_tree, in_tree) def linearize_and_solve(x, b): - unchecked_zeros, f_jvp = api.linearize(f, x) + unchecked_zeros, f_jvp = jax.linearize(f, x) return tangent_solve(f_jvp, b) l_and_s_jaxpr, l_and_s_consts, out_tree = _initial_style_jaxpr( @@ -1445,7 +1474,7 @@ def _transpose_function(linear_fun, primals): # TODO(shoyer): can we use something more direct than the vjp machinery? # It's particularly awkward that we need the second argument to give # particular values of the primals, which are entirely arbitrary. - _, vjp_fun = api.vjp(linear_fun, primals) + _, vjp_fun = jax.vjp(linear_fun, primals) def transposed_fun(x): (y,) = vjp_fun(x) diff --git a/jax/linear_util.py b/jax/linear_util.py index 534eebafbbcc..6373201a9d6d 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -81,7 +81,8 @@ def __init__(self): self._val = _EMPTY_STORE_VALUE def store(self, val): - assert self._val is _EMPTY_STORE_VALUE, "Store occupied" + if self._val is not _EMPTY_STORE_VALUE: + raise StoreException("Store occupied") self._val = val @property diff --git a/jax/nn/functions.py b/jax/nn/functions.py index 051d7f6d1b52..0d34409a8b09 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -17,15 +17,15 @@ import numpy as onp +from jax import custom_jvp from jax import dtypes -from jax import custom_transforms, defjvp from jax import lax from jax.scipy.special import expit import jax.numpy as np # activations -@custom_transforms +@custom_jvp def relu(x): r"""Rectified linear unit activation function. @@ -35,7 +35,11 @@ def relu(x): \mathrm{relu}(x) = \max(x, 0) """ return np.maximum(x, 0) -defjvp(relu, lambda g, ans, x: lax.select(x > 0, g, lax.full_like(g, 0))) +def _relu_jvp(primals, tangents): + x, = primals + t, = tangents + return relu(x), lax.select(x > 0, t, lax.full_like(t, 0)) +relu.defjvp(_relu_jvp) def softplus(x): r"""Softplus activation function. diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 9856b3fb3397..0443b2d27647 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -38,7 +38,7 @@ import numpy as onp import opt_einsum -from jax import jit, device_put, custom_transforms, defjvp +from jax import jit, device_put from .. import core from .. import dtypes from ..abstract_arrays import UnshapedArray, ShapedArray, ConcreteArray @@ -423,6 +423,7 @@ def fn(x1, x2): arctan = _one_to_one_unop(onp.arctan, lax.atan, True) sinh = _one_to_one_unop(onp.sinh, lax.sinh, True) cosh = _one_to_one_unop(onp.cosh, lax.cosh, True) +arcsinh = _one_to_one_unop(onp.arcsinh, lax.asinh, True) tanh = _one_to_one_unop(onp.tanh, lax.tanh, True) arcsinh = _one_to_one_unop(onp.arcsinh, lax.asinh, True) arccosh = _one_to_one_unop(onp.arccosh, lax.acosh, True) diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 512adb35af6a..728ee83ea1e6 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -20,15 +20,15 @@ import operator from typing import Tuple, Union, cast -from jax import jit, ops, vmap +from jax import jit, vmap, custom_jvp from .. import lax +from .. import ops from .. import lax_linalg from .. import dtypes from .lax_numpy import _not_implemented from .lax_numpy import _wraps from .vectorize import vectorize from . import lax_numpy as np -from ..api import custom_transforms, defjvp from ..util import get_module_functions from ..third_party.numpy.linalg import cond, tensorinv, tensorsolve @@ -110,15 +110,8 @@ def matrix_rank(M, tol=None): return np.sum(S > tol) -# TODO(pfau): make this work for complex types -def _jvp_slogdet(g, ans, x): - jvp_sign = np.zeros(x.shape[:-2]) - jvp_logdet = np.trace(solve(x, g), axis1=-1, axis2=-2) - return jvp_sign, jvp_logdet - - +@custom_jvp @_wraps(onp.linalg.slogdet) -@custom_transforms @jit def slogdet(a): a = _promote_arg_dtypes(np.asarray(a)) @@ -143,7 +136,15 @@ def slogdet(a): is_zero, np.array(-np.inf, dtype=dtype), np.sum(np.log(np.abs(diag)), axis=-1)) return sign, np.real(logdet) -defjvp(slogdet, _jvp_slogdet) +def _slogdet_jvp(primals, tangents): + x, = primals + g, = tangents + if np.issubdtype(np._dtype(x), np.complexfloating): + raise NotImplementedError # TODO(pfau): make this work for complex types + sign, ans = slogdet(x) + sign_dot, ans_dot = np.zeros_like(sign), np.trace(solve(x, g), axis1=-1, axis2=-2) + return (sign, ans), (sign_dot, ans_dot) +slogdet.defjvp(_slogdet_jvp) @_wraps(onp.linalg.det) diff --git a/jax/random.py b/jax/random.py index 7c61801d0282..3af4b54c72ef 100644 --- a/jax/random.py +++ b/jax/random.py @@ -30,7 +30,7 @@ from . import numpy as np from . import tree_util from . import dtypes -from .api import custom_transforms, defjvp, jit, vmap +from .api import jit, vmap from .numpy.lax_numpy import _constant_like, asarray, stack from jax.lib import xla_bridge from jax.lib import cuda_prng diff --git a/jax/scipy/special.py b/jax/scipy/special.py index a443e153c6bb..cd29c118f5f0 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -12,13 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. +from functools import partial import numpy as np import scipy.special as osp_special -from .. import lax from .. import util -from ..api import custom_transforms, defjvp +from .. import lax +from .. import api from ..numpy import lax_numpy as jnp from ..numpy.lax_numpy import (_wraps, asarray, _reduction_dims, _constant_like, _promote_args_inexact) @@ -78,21 +79,26 @@ def erfinv(x): return lax.erf_inv(x) -@_wraps(osp_special.logit, update_doc=False) -@custom_transforms +@api.custom_jvp def logit(x): - x = asarray(x) return lax.log(lax.div(x, lax.sub(lax._const(x, 1), x))) -defjvp(logit, lambda g, ans, x: g / (x * (1 - x))) +def _logit_jvp(primals, tangents): + (x,), (t,) = primals, tangents + ans = logit(x) + t_out = lax.div(lax.mul(x, lax.sub(lax._const(x, 1), x))) + return ans, t_out +logit.defjvp(_logit_jvp) -@_wraps(osp_special.expit, update_doc=False) -@custom_transforms +@api.custom_jvp def expit(x): - x = asarray(x) - one = lax._const(x, 1) - return lax.div(one, lax.add(one, lax.exp(lax.neg(x)))) -defjvp(expit, lambda g, ans, x: g * ans * (lax._const(ans, 1) - ans)) + return 1 / (1 + lax.exp(-x)) +def _expit_jvp(primals, tangents): + (x,), (t,) = primals, tangents + ans = expit(x) + t_out = t * ans * (1 - ans) + return ans, t_out +expit.defjvp(_expit_jvp) @_wraps(osp_special.logsumexp) @@ -405,7 +411,7 @@ def _create_polynomial(var, coeffs): return x_nan_replaced -@custom_transforms +@partial(api.custom_jvp, nondiff_argnums=(1,)) def log_ndtr(x, series_order=3): r"""Log Normal distribution function. @@ -507,6 +513,12 @@ def log_ndtr(x, series_order=3): _log_ndtr_lower(lax.min(x, lower_segment), series_order))) +def _log_ndtr_jvp(series_order, primals, tangents): + (x,), (t,) = primals, tangents + ans = log_ndtr(x, series_order=series_order) + t_out = lax.mul(t, lax.exp(lax.sub(_norm_logpdf(x), ans))) + return ans, t_out +log_ndtr.defjvp(_log_ndtr_jvp) def _log_ndtr_lower(x, series_order): """Asymptotic expansion version of `Log[cdf(x)]`, appropriate for `x<<-1`.""" @@ -548,9 +560,6 @@ def _norm_logpdf(x): log_normalizer = _constant_like(x, _norm_logpdf_constant) return lax.sub(lax.mul(neg_half, lax.square(x)), log_normalizer) -defjvp(log_ndtr, - lambda g, ans, x: lax.mul(g, lax.exp(lax.sub(_norm_logpdf(x), ans)))) - @_wraps(osp_special.i0e) def i0e(x): return lax.bessel_i0e(x) diff --git a/tests/api_test.py b/tests/api_test.py index 22cc102f4b74..64492a2b70ce 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -271,7 +271,7 @@ def foo(x): ad.defjvp(foo_p, lambda g, x: foo(g)) jtu.check_raises(lambda: grad(foo)(1.0), NotImplementedError, - "Reverse-mode differentiation rule for 'foo' not implemented") + "Transpose rule (for reverse-mode differentiation) for 'foo' not implemented") def test_device_put_and_get(self): x = onp.arange(12.).reshape((3, 4)).astype("float32") @@ -540,39 +540,6 @@ def test_vjp_mismatched_arguments(self): "Type of cotangent input to vjp pullback.*does not match type", lambda: pullback((onp.float16(42)))) - def test_jarrett_jvps(self): - def f1(x): - return np.sin(np.sin(np.sin(x))) - f2 = api.jarrett(f1) - - for x in [3., onp.array([2., 3., 4.])]: - self.assertAllClose(f1(x), f2(x), check_dtypes=True) - - _, f1_vjp = api.vjp(f1, x) - _, f2_vjp = api.vjp(f2, x) - self.assertAllClose(f1_vjp(x), f2_vjp(x), check_dtypes=True) - - # TODO(mattjj): test that constants/literals are set up properly - # jaxpr2 = api.make_jaxpr(f2_vjp)(x) - # assert len(jaxpr2.constvars) == 1 - - def test_jarrett_jvps2(self): - def f1(x, y): - return np.sin(x) * np.cos(y) * np.sin(x) * np.cos(y) - f2 = api.jarrett(f1) - - # TODO(mattjj): doesn't work for (3., onp.array([4., 5.])) - for x, y in [(3., 4.), (onp.array([5., 6.]), onp.array([7., 8.]))]: - self.assertAllClose(f1(x, y), f2(x, y), check_dtypes=True) - - _, f1_vjp = api.vjp(f1, x, y) - _, f2_vjp = api.vjp(f2, x, y) - self.assertAllClose(f1_vjp(y), f2_vjp(y), check_dtypes=True) - - # TODO(mattjj): test that constants/literals are set up properly - # jaxpr2 = api.make_jaxpr(f2_vjp)(y) - # assert len(jaxpr2.constvars) == 2 - def test_jvp_jit_cached(self): """Bug in caching in presence of JVP and JIT.""" @@ -629,199 +596,6 @@ def f(z): def test_complex_input_jacfwd_raises_error(self): self.assertRaises(TypeError, lambda: jacfwd(lambda x: np.sin(x))(1 + 2j)) - def test_defvjp_all(self): - foo_p = Primitive('foo') - def foo(x): return 2. * foo_p.bind(x) - - ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (4 * g * np.sin(x),))) - val_ans, grad_ans = api.value_and_grad(foo)(3.) - self.assertAllClose(val_ans, 2 * 3.**2, check_dtypes=False) - self.assertAllClose(grad_ans, 4 * 2 * onp.sin(3.), check_dtypes=False) - - def test_defvjp_all_const(self): - foo_p = Primitive('foo') - def foo(x): return foo_p.bind(x) - - ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (12.,))) - val_ans, grad_ans = api.value_and_grad(foo)(3.) - self.assertAllClose(val_ans, 9., check_dtypes=False) - self.assertAllClose(grad_ans, 12., check_dtypes=True) - - def test_defvjp_all_higher_order_revmode(self): - foo_p = Primitive('foo') - def foo(x): return 2. * foo_p.bind(x) - - ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (g * x ** 2,))) - ans = api.grad(api.grad(foo))(3.) - self.assertAllClose(ans, 2 * 2 * 3., check_dtypes=False) - - def test_defvjp_all_multiple_arguments(self): - # also tests passing in symbolic zero tangents b/c we differentiate wrt only - # the first argument in one case - - foo_p = Primitive('foo') - def foo(x, y): return foo_p.bind(x, y) - - def vjpfun(x, y): - out = x**2 + y**3 - vjp = lambda g: (g + x + y, g * x * 9.) - return out, vjp - - ad.defvjp_all(foo_p, vjpfun) - val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) - self.assertAllClose(val_ans, 3.**2 + 4.**3, check_dtypes=False) - self.assertAllClose(grad_ans, 1. + 3. + 4., check_dtypes=False) - - ans = api.grad(foo, (0, 1))(3., 4.) - self.assertAllClose(ans, (1. + 3. + 4., 1. * 3. * 9.), check_dtypes=False) - - def test_defvjp_all_custom_transforms(self): - @api.custom_transforms - def foo(x): - return np.sin(x) - - api.defvjp_all(foo, lambda x: (np.sin(x), lambda g: (g * x,))) - val_ans, grad_ans = api.value_and_grad(foo)(3.) - self.assertAllClose(val_ans, onp.sin(3.), check_dtypes=False) - self.assertAllClose(grad_ans, 3., check_dtypes=False) - - # TODO(mattjj): add defvjp_all test with pytree arguments - - def test_defvjp(self): - @api.custom_transforms - def foo(x, y): - return np.sin(x * y) - - api.defvjp(foo, None, lambda g, _, x, y: g * x * y) - val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) - self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) - self.assertAllClose(grad_ans, 0., check_dtypes=False) - - ans_0, ans_1 = api.grad(foo, (0, 1))(3., 4.) - self.assertAllClose(ans_0, 0., check_dtypes=False) - self.assertAllClose(ans_1, 3. * 4., check_dtypes=False) - - def test_defvjp_higher_order(self): - @api.custom_transforms - def foo(x): - return np.sin(2. * x) - - api.defvjp(foo, lambda g, _, x: g * np.cos(x)) - ans = api.grad(api.grad(foo))(2.) - expected = api.grad(api.grad(np.sin))(2.) - self.assertAllClose(ans, expected, check_dtypes=False) - - def test_defvjp_use_ans(self): - @api.custom_transforms - def foo(x, y): - return np.sin(x * y) - - api.defvjp(foo, None, lambda g, ans, x, y: g * x * y + np.cos(ans)) - val_ans, grad_ans = api.value_and_grad(foo, 1)(3., 4.) - self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) - self.assertAllClose(grad_ans, 3. * 4. + onp.cos(onp.sin(3. * 4)), - check_dtypes=False) - - # TODO - # def test_defjvp_closure_error(self): - # def foo(x): - # @api.custom_transforms - # def bar(y): - # return x * y - - # api.defjvp(bar, lambda y_dot, ans, y: x * y) - # return bar(x) - # jtu.check_raises( - # lambda: api.jvp(foo, (1.,), (1.,)), ValueError, - # "Detected differentiation with respect to closed-over values with " - # "custom JVP rule, which isn't supported.") - - # TODO - # def test_defvjp_closure_error(self): - # def foo(x): - # @api.custom_transforms - # def bar(y): - # return x * y - - # api.defvjp(bar, lambda g, ans, y: x * y) - # return bar(x) - # jtu.check_raises( - # lambda: grad(foo)(1.,), ValueError, - # "Detected differentiation w.r.t. variables from outside " - # "the scope of , but defvjp and " - # "defvjp_all only support differentiation w.r.t. positional arguments.") - - def test_custom_transforms_eval_with_pytrees(self): - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans = f((1, 2)) - self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) - - def test_custom_transforms_jit_with_pytrees(self): - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans = jit(f)((1, 2)) - self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) - - def test_custom_transforms_jit_with_pytrees_consts(self): - # The purpose of this test is to exercise the custom_transforms default - # translation rule in how it deals with constants that are too large to be - # treated as literals (at the time of writing). - z = onp.arange(10.) - - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': z * b} - - ans = jit(f)((1, 2)) - self.assertAllClose(ans, {'hi': 2 * 1, 'bye': z * 2}, check_dtypes=False) - - def test_custom_transforms_jvp_with_pytrees(self): - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans, out_tangent = api.jvp(f, ((1, 2),), ((3, 4),)) - self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) - self.assertEqual(out_tangent, {'hi': 2 * 3, 'bye': 2 * 4}) - - def test_custom_transforms_vmap_with_pytrees(self): - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans = api.vmap(f)((onp.arange(3), onp.ones((3, 2)))) - expected = {'hi': 2 * onp.arange(3), 'bye': 2 * onp.ones((3, 2))} - self.assertAllClose(ans, expected, check_dtypes=False) - - def test_custom_transforms_jvp_with_closure(self): - def f(x): - @api.custom_transforms - def g(y): - return x * y - return g(x) - - ans = api.grad(f)(1.) - expected = 2. - self.assertAllClose(ans, expected, check_dtypes=False) - - def test_custom_gradient(self): - @api.custom_gradient - def f(x): - return x ** 2, lambda g: (g * x,) - - self.assertAllClose(f(3.), 9., check_dtypes=False) - self.assertAllClose(api.grad(f)(3.), 3., check_dtypes=False) - def test_legacy_devicearray_repr(self): dx = device_put(3.) str(dx.item()) # doesn't crash @@ -1182,55 +956,6 @@ def check_warning(warn, nowarn): check_warning(lambda: np.tri(2, dtype="float64"), lambda: np.tri(2, dtype="float32")) - def test_custom_vjp_zeros(self): - @api.custom_transforms - def f(x, y): - return 2 * x, 3 * y - - def f_vjp(x, y): - return (2 * x, 3 * y), lambda ts: (4 * ts[0], 5 * ts[1]) - - api.defvjp_all(f, f_vjp, ) - api.grad(lambda x, y: f(x, y)[0])(1., 2.) # doesn't crash - - def test_custom_transforms_vjp_nones(self): - # issue rasied by jsnoek@ and jumper@ - @jax.custom_transforms - def solve(a, b): - return np.dot(np.linalg.inv(a), b) - # print(solve(a, b)) - - def solve_vjp(a, b): - x = solve(a, b) - def vjp(x_tangent): - dx = np.dot(solve(a, x_tangent), x.T) - out = (dx, b * 0.) - return out - return x, vjp - jax.defvjp_all(solve, solve_vjp) - gf = grad(lambda a,b: np.sum(solve(a, b))) - - n = 3 - a_in = np.linspace(0, 1, n)[:, None] - a = np.dot(a_in, a_in.T) + np.eye(n) * 0.1 - real_x = onp.random.RandomState(0).randn(n) - b = np.dot(a + np.eye(a.shape[0]), real_x) - print(gf(a, b)) # doesn't crash - - def test_vmap_in_axes_list(self): - # https://github.com/google/jax/issues/2367 - dictionary = {'a': 5., 'b': np.ones(2)} - x = np.zeros(3) - y = np.arange(3.) - - - def f(dct, x, y): - return dct['a'] + dct['b'] + x + y - - out1 = api.vmap(f, (None, 0, 0))(dictionary, x, y) - out2 = api.vmap(f, [None, 0, 0])(dictionary, x, y) - self.assertAllClose(out1, out2, check_dtypes=True) - def test_vmap_in_axes_tree_prefix_error(self): # https://github.com/google/jax/issues/795 self.assertRaisesRegex( @@ -1772,7 +1497,7 @@ def helper_save_tracer(self, x): def test_escaped_tracers_diffent_top_level_traces(self): api.jit(self.helper_save_tracer)(0.) with self.assertRaisesRegex( - ValueError, + core.UnexpectedTracerError, re.compile( "Encountered an unexpected tracer.*Different traces at same level", re.DOTALL)): @@ -1781,7 +1506,7 @@ def test_escaped_tracers_diffent_top_level_traces(self): def test_escaped_tracers_cant_lift_sublevels(self): api.jit(self.helper_save_tracer)(0.) with self.assertRaisesRegex( - ValueError, + core.UnexpectedTracerError, re.compile( "Encountered an unexpected tracer.*Can't lift sublevels 1 to 0", re.DOTALL)): @@ -1790,7 +1515,7 @@ def test_escaped_tracers_cant_lift_sublevels(self): def test_escaped_tracers_tracer_from_higher_level(self): api.grad(self.helper_save_tracer)(0.) with self.assertRaisesRegex( - ValueError, + core.UnexpectedTracerError, re.compile( "Encountered an unexpected tracer.*Tracer from a higher level", re.DOTALL)): @@ -1802,7 +1527,7 @@ def func1(x): # Use the tracer return x + self._saved_tracer with self.assertRaisesRegex( - ValueError, + core.UnexpectedTracerError, re.compile("Encountered an unexpected tracer.*Incompatible sublevel", re.DOTALL)): api.jit(func1)(2.) @@ -1812,8 +1537,9 @@ def func1(x): api.grad(self.helper_save_tracer)(0.) return x + self._saved_tracer with self.assertRaisesRegex( - ValueError, re.compile("Encountered an unexpected tracer.*Can't lift", - re.DOTALL)): + core.UnexpectedTracerError, + re.compile("Encountered an unexpected tracer.*Can't lift", + re.DOTALL)): api.grad(func1)(2.) def test_escaped_tracers_not_among_input_tracers(self): @@ -1823,7 +1549,8 @@ def func1(x): return x + self._saved_tracer with self.assertRaisesRegex( - ValueError, re.compile( + core.UnexpectedTracerError, + re.compile( "Encountered an unexpected tracer.*Tracer not among input tracers", re.DOTALL)): api.jit(func1)(2.) @@ -1870,7 +1597,7 @@ def f(x): """, str(jaxpr)) def testExamplesJaxprDoc(self): - """Tests examples included in the Understanding JAXPRs doc (docs/jaxpr.rst).""" + """Tests examples included in the Understanding jaxprs doc (docs/jaxpr.rst).""" from jax import numpy as jnp def func1(first, second): temp = first + jnp.sin(second) * 3. @@ -2221,6 +1948,607 @@ def test_zeros_ones_compilation(self): self.assertAllClose(x, onp.ones(3), check_dtypes=False) self.assertAllClose(y, onp.ones(3) + onp.ones(3), check_dtypes=False) +class CustomJVPTest(jtu.JaxTestCase): + + def test_basic(self): + @api.custom_jvp + def f(x): + return np.sin(x) + def f_jvp(primals, tangents): + x, = primals + g, = tangents + return f(x), 2 * np.cos(x) * g + f.defjvp(f_jvp) + + x = 3. + self.assertAllClose(f(x), np.sin(x), check_dtypes=True) + self.assertAllClose(api.jvp(f, (x,), (1.,)), + (np.sin(x), 2 * np.cos(x)), + check_dtypes=True) + self.assertAllClose(api.grad(f)(x), 2 * np.cos(x), check_dtypes=True) + + def test_invariance(self): + @api.custom_jvp + def f(x): + return np.cos(2 * x) / 2. + def f_jvp(primals, tangents): + x, = primals + g, = tangents + return (f(x), 3 * g) + f.defjvp(f_jvp) + def f2(x): + y, _ = api.jvp(f, (x,), (x,)) + return y + def f3(x): + y, _ = api.jvp(f2, (x,), (x,)) + return y + x = 1. + self.assertAllClose(api.jvp(f, (x,), (x,)), + api.jvp(f2, (x,), (x,)), + check_dtypes=False) + self.assertAllClose(api.jvp(f, (x,), (x,)), + api.jvp(f3, (x,), (x,)), + check_dtypes=False) + + def test_python_control_flow(self): + @api.custom_jvp + def f(x): + if x > 0: + return np.sin(x) + else: + return np.cos(x) + def f_jvp(primals, tangents): + x, = primals + g, = tangents + if x > 0: + return f(x), 2 * g + else: + return f(x), 3 * g + f.defjvp(f_jvp) + x = 2. + self.assertAllClose(f(x), np.sin(x), check_dtypes=True) + self.assertAllClose(f(-x), np.cos(-x), check_dtypes=True) + self.assertAllClose(api.jvp(f, (x,), (1.,)), + (np.sin(x), 2.), + check_dtypes=False) + self.assertAllClose(api.jvp(f, (-x,), (1.,)), + (np.cos(-x), 3.), + check_dtypes=False) + self.assertAllClose(api.grad(f)(x), 2., check_dtypes=False) + self.assertAllClose(api.grad(f)(-x), 3., check_dtypes=False) + + def test_vmap(self): + @api.custom_jvp + def f(x): + assert np.ndim(x) == 0 + return np.sin(x) + def f_jvp(primals, tangents): + x, = primals + g, = tangents + assert np.ndim(x) == np.ndim(g) == 0 + return f(x), 2 * np.cos(x) * g + f.defjvp(f_jvp) + + x = np.arange(3.) + xx = np.arange(6.).reshape(2, 3) + + # vmap of f + self.assertAllClose(api.vmap(f)(x), np.sin(x), check_dtypes=True) + self.assertAllClose(api.vmap(api.vmap(f))(xx), np.sin(xx), check_dtypes=True) + + # vmap of jvp of f + self.assertAllClose(api.vmap(lambda x: api.jvp(f, (x,), (x,)))(x), + (np.sin(x), 2 * np.cos(x) * x), + check_dtypes=True) + self.assertAllClose(api.vmap(api.vmap(lambda x: api.jvp(f, (x,), (x,))))(xx), + (np.sin(xx), 2 * np.cos(xx) * xx), + check_dtypes=True) + + # jvp of vmap of f + self.assertAllClose(api.jvp(api.vmap(f), (x,), (x,)), + (np.sin(x), 2 * np.cos(x) * x), + check_dtypes=True) + self.assertAllClose(api.jvp(api.vmap(api.vmap(f)), (xx,), (xx,)), + (np.sin(xx), 2 * np.cos(xx) * xx), + check_dtypes=True) + + # vmap of jvp of vmap of f + self.assertAllClose(api.vmap(lambda x: api.jvp(api.vmap(f), (x,), (x,)))(xx), + (np.sin(xx), 2 * np.cos(xx) * xx), + check_dtypes=True) + + def test_jit(self): + @api.custom_jvp + def f(x): + return np.sin(x) + def f_jvp(primals, tangents): + x, = primals + g, = tangents + return f(x), 2 * np.cos(x) * g + f.defjvp(f_jvp) + + x = 3. + + # jit + self.assertAllClose(api.jit(f)(x), np.sin(x), check_dtypes=True) + self.assertAllClose(api.jit(api.jit(f))(x), np.sin(x), check_dtypes=True) + + # jit of jvp + self.assertAllClose(api.jit(lambda x: api.jvp(f, (x,), (x,)))(x), + (np.sin(x), 2 * np.cos(x) * x), + check_dtypes=False) + + # jvp of jit + self.assertAllClose(api.jvp(api.jit(f), (x,), (x,)), + (np.sin(x), 2 * np.cos(x) * x), + check_dtypes=False) + + def test_pytrees(self): + @api.custom_jvp + def f(x): + return {'b': np.sin(x['a'])} + def f_jvp(primals, tangents): + x, = primals + g, = tangents + return f(x), {'b': 2 * np.cos(x['a']) * g['a']} + f.defjvp(f_jvp) + x = {'a': 3.} + self.assertAllClose(f(x)['b'], np.sin(x['a']), check_dtypes=True) + self.assertAllClose(api.jvp(f, (x,), (x,)), + ({'b': np.sin(x['a'])}, + {'b': 2 * np.cos(x['a']) * x['a']}), + check_dtypes=False) + + def test_kwargs(self): + # from https://github.com/google/jax/issues/1938 + @api.custom_jvp + def my_fun(x, y, c=1.): + return c * (x + y) + def my_jvp(primals, tangents): + x, y, c = primals + t_x, t_y, t_c = tangents + return my_fun(x, y, c), t_c + my_fun.defjvp(my_jvp) + f = lambda x, y: np.square(my_fun(x, y, c=2.)).sum() + f(10., 5.) # doesn't crash + api.jvp(f, (10., 5.), (1., 1.)) # doesn't crash + + def test_initial_style(self): + @api.custom_jvp + def f(x): + return 3 * x + def f_jvp(primals, tangents): + x, = primals + g, = tangents + return f(x), 2 * g + f.defjvp(f_jvp) + + def foo(x): + out, _ = lax.scan(lambda c, _: (f(c), None), x, None, length=1) + return out + + ans = api.grad(foo)(3.) + expected = 2. + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(api.grad(foo))(3.) + expected = 0. + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_initial_style_vmap(self): + @api.custom_jvp + def f(x): + assert np.ndim(x) == 0 + return 3 * x + def f_jvp(primals, tangents): + x, = primals + g, = tangents + return f(x), 2 * g + f.defjvp(f_jvp) + + def foo(x): + out, _ = lax.scan(lambda c, _: (f(c), None), x, None, length=1) + return out + + ans = api.vmap(foo)(np.ones(3)) + expected = 3. * np.ones(3) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(lambda x: api.vmap(foo)(x).sum())(np.ones(3)) + expected = 2. * np.ones(3) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_closed_over_tracers_error_message(self): + def f(x): + @api.custom_jvp + def g(y): + return x + y + def g_jvp(primals, tangents): + (y,), (t,) = primals, tangents + return g(x), 2 * y + g.defjvp(g_jvp) + return g(1.) + + self.assertRaises( + core.UnexpectedTracerError, lambda: api.jvp(f, (3.,), (1.,))) + self.assertRaises( + core.UnexpectedTracerError, lambda: api.grad(f)(3.)) + + def test_nondiff_arg(self): + @partial(api.custom_jvp, nondiff_argnums=(0,)) + def app(f, x): + return f(x) + def app_jvp(f, primals, tangents): + (x,), (t,) = primals, tangents + return app(f, x), 3 * t + app.defjvp(app_jvp) + + ans = app(lambda x: 2 * x, 1) + expected = 2 + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.jvp(lambda x: app(lambda y: 2 * y, x), (1.,), (1.,)) + expected = (2., 3.) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_nondiff_arg_tracer(self): + @partial(api.custom_jvp, nondiff_argnums=(0,)) + def f(x, y): + return x * y + def f_jvp(x, primals, tangents): + (y,), (t_y,) = primals, tangents + return f(x, y), 5 * t_y + f.defjvp(f_jvp) + + @jit + def g(x, y): + return f(x, y) + + ans = api.jvp(lambda y: g(2., y), (3.,), (1.,)) + expected = (6., 5.) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_vmap_axes(self): + raise unittest.SkipTest("TODO") # TODO(mattjj): write test + + def test_pmap(self): + raise unittest.SkipTest("TODO") # TODO(mattjj): write test + + def test_missing_jvp_rule_error(self): + @api.custom_jvp + def foo(x): + return x ** 2 + + self.assertRaisesRegex( + AttributeError, + r"No JVP defined for custom_jvp function foo using defjvp.", + lambda: foo(2)) + self.assertRaisesRegex( + AttributeError, + r"No JVP defined for custom_jvp function foo using defjvp.", + lambda: api.jvp(foo, (2.,), (1.,))) + self.assertRaisesRegex( + AttributeError, + r"No JVP defined for custom_jvp function foo using defjvp.", + lambda: api.grad(foo)(2.)) + + def test_jvp_rule_inconsistent_pytree_structures_error(self): + @api.custom_jvp + def f(x): + return (x**2,) + + @f.defjvp + def foo_jvp(primals, tangents): + x, = primals + t, = tangents + return f(x), [2 * x * t, x] + + f(2.) # doesn't crash + self.assertRaisesRegex( + TypeError, + re.escape( + "Custom JVP rule must produce primal and tangent outputs " + "with equal container (pytree) structures, but got " + "{} and {}.".format( + tree_util.tree_structure((1,)), + tree_util.tree_structure([1, 2])) + ), + lambda: api.jvp(f, (2.,), (1.,))) + + +class CustomVJPTest(jtu.JaxTestCase): + + def test_basic(self): + @api.custom_vjp + def f(x): + return np.sin(x) + def f_fwd(x): + return f(x), np.cos(x) + def f_rev(cos_x, g): + return (2 * cos_x * g,) + f.defvjp(f_fwd, f_rev) + + x = 3. + self.assertAllClose(f(x), np.sin(x), check_dtypes=True) + self.assertAllClose(api.grad(f)(x), 2 * np.cos(x), check_dtypes=True) + self.assertAllClose(api.value_and_grad(f)(x), + (np.sin(x), 2 * np.cos(x)), + check_dtypes=True) + + def test_invariance(self): + @api.custom_vjp + def f(x): + return np.cos(2 * x) / 2. + def f_fwd(x): + return (f(x), x) + def f_rev(x, g): + return (g * 3,) + f.defvjp(f_fwd, f_rev) + def f2(x): + y, _ = api.value_and_grad(f)(x) + return y + def f3(x): + y, _ = api.value_and_grad(f2)(x) + return y + x = 1. + self.assertAllClose(f(x), f2(x), check_dtypes=False) + self.assertAllClose(f(x), f3(x), check_dtypes=False) + self.assertAllClose(api.grad(f)(x), api.grad(f2)(x), + check_dtypes=False) + self.assertAllClose(api.grad(f)(x), api.grad(f3)(x), + check_dtypes=False) + + def test_python_control_flow(self): + @api.custom_vjp + def f(x): + if x > 0: + return np.sin(x) + else: + return np.cos(x) + def f_fwd(x): + if x > 0: + return f(x), x + else: + return f(x), x + def f_rev(x, g): + if x > 0: + return (2 * g,) + else: + return (3 * g,) + f.defvjp(f_fwd, f_rev) + + x = 2. + self.assertAllClose(f(x), np.sin(x), check_dtypes=True) + self.assertAllClose(f(-x), np.cos(-x), check_dtypes=True) + self.assertAllClose(api.value_and_grad(f)(x), (np.sin(x), 2.), + check_dtypes=False) + self.assertAllClose(api.value_and_grad(f)(-x), (np.cos(-x), 3.), + check_dtypes=False) + + def test_vmap(self): + @api.custom_vjp + def f(x): + assert np.ndim(x) == 0 + return np.sin(x) + def f_fwd(x): + assert np.ndim(x) == 0 + return f(x), np.cos(x) + def f_rev(cos_x, g): + return (2 * cos_x * g,) + f.defvjp(f_fwd, f_rev) + + x = np.arange(3.) + xx = np.arange(6.).reshape(2, 3) + + # vmap of f + self.assertAllClose(api.vmap(f)(x), np.sin(x), check_dtypes=True) + self.assertAllClose(api.vmap(api.vmap(f))(xx), np.sin(xx), check_dtypes=True) + + # vmap of grad of f + self.assertAllClose(api.vmap(api.grad(f))(x), 2 * np.cos(x), + check_dtypes=True) + self.assertAllClose(api.vmap(api.value_and_grad(f))(x), + (np.sin(x), 2 * np.cos(x)), + check_dtypes=True) + self.assertAllClose(api.vmap(api.vmap(api.grad(f)))(xx), 2 * np.cos(xx), + check_dtypes=True) + self.assertAllClose(api.vmap(api.vmap(api.value_and_grad(f)))(xx), + (np.sin(xx), 2 * np.cos(xx)), + check_dtypes=True) + + # grad of vmap of f + self.assertAllClose(api.grad(lambda x: api.vmap(f)(x).sum())(x), + 2 * np.cos(x), + check_dtypes=True) + self.assertAllClose(api.grad(lambda x: api.vmap(api.vmap(f))(x).sum())(xx), + 2 * np.cos(xx), + check_dtypes=True) + + # vmap of grad of vmap of f + self.assertAllClose(api.vmap(api.grad(lambda x: api.vmap(f)(x).sum()))(xx), + 2 * np.cos(xx), + check_dtypes=True) + + def test_jit(self): + @api.custom_vjp + def f(x): + return np.sin(x) + def f_fwd(x): + return f(x), np.cos(x) + def f_rev(cos_x, g): + return (2 * cos_x * g,) + f.defvjp(f_fwd, f_rev) + + x = 3. + + # jit + self.assertAllClose(api.jit(f)(x), np.sin(x), check_dtypes=True) + self.assertAllClose(api.jit(api.jit(f))(x), np.sin(x), check_dtypes=True) + + # jit of grad + self.assertAllClose(api.jit(api.grad(f))(x), 2 * np.cos(x), + check_dtypes=False) + + # grad of jit + self.assertAllClose(api.grad(api.jit(f))(x), 2 * np.cos(x), + check_dtypes=False) + + def test_pytrees(self): + @api.custom_vjp + def f(x): + return {'b': np.sin(x['a'])} + def f_fwd(x): + return f(x), {'r': np.cos(x['a'])} + def f_bwd(res, g): + cos_x = res['r'] + return ({'a': 2 * cos_x * g['b']},) + f.defvjp(f_fwd, f_bwd) + x = {'a': 3.} + self.assertAllClose(f(x)['b'], np.sin(x['a']), check_dtypes=True) + self.assertAllClose(api.grad(lambda x: f(x)['b'])(x), + {'a': 2 * np.cos(x['a'])}, + check_dtypes=True) + + def test_jvp_error(self): + @api.custom_vjp + def f(x): + return np.sin(x) + def f_fwd(x): + return f(x), np.cos(x) + def f_rev(cos_x, g): + return (2 * cos_x * g,) + f.defvjp(f_fwd, f_rev) + + self.assertRaisesRegex( + TypeError, + r"can't apply forward-mode autodiff \(jvp\) to a custom_vjp function.", + lambda: api.jvp(f, (3.,), (1.,))) + self.assertRaisesRegex( + TypeError, + r"can't apply forward-mode autodiff \(jvp\) to a custom_vjp function.", + lambda: api.jvp(api.vmap(f), (np.arange(3.),), (np.ones(3),))) + + def test_kwargs(self): + # from https://github.com/google/jax/issues/1938 + @api.custom_vjp + def my_fun(x, y, c=1.): + return c * (x + y) + my_fun.defvjp(lambda x, y, c=1.: (my_fun(c, y, c), None), + lambda _, g: (g, g, g)) + f = lambda x, y: np.square(my_fun(x, y, c=2.)).sum() + f(10., 5.) # doesn't crash + api.grad(f)(10., 5.) # doesn't crash + + def test_initial_style(self): + @api.custom_vjp + def f(x): + return np.sin(x) + def f_fwd(x): + return f(x), np.cos(x) + def f_rev(cos_x, g): + return (2 * cos_x * g,) + f.defvjp(f_fwd, f_rev) + + def foo(x): + out, _ = lax.scan(lambda c, _: (f(c), None), x, None, length=1) + return out + + ans = api.grad(foo)(3.) + expected = 2. * np.cos(3.) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(api.grad(foo))(3.) + expected = -2. * np.sin(3.) + self.assertAllClose(ans, expected, check_dtypes=True) + + def test_initial_style_vmap(self): + @api.custom_vjp + def f(x): + assert np.ndim(x) == 0 + return 3 * x + def f_fwd(x): + return f(x), np.cos(x) + def f_rev(cos_x, g): + return (2 * cos_x * g,) + f.defvjp(f_fwd, f_rev) + + def foo(x): + out, _ = lax.scan(lambda c, _: (f(c), None), x, None, length=1) + return out + + ans = api.vmap(foo)(np.arange(3.)) + expected = 3. * np.arange(3.) + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(lambda x: api.vmap(foo)(x).sum())(np.arange(3.)) + expected = 2. * np.cos(np.arange(3.)) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_nondiff_arg(self): + @partial(api.custom_vjp, nondiff_argnums=(0,)) + def app(f, x): + return f(x) + def app_fwd(f, x): + return app(f, x), np.cos(x) + def app_rev(f, cos_x, g): + return (cos_x * g,) + app.defvjp(app_fwd, app_rev) + + ans = app(lambda x: 2 * x, 1) + expected = 2 + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.value_and_grad(lambda x: app(lambda y: 2 * y, x))(1.) + expected = (2., np.cos(1.)) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_vmap_axes(self): + raise unittest.SkipTest("TODO") # TODO(mattjj): write test + + def test_pmap(self): + raise unittest.SkipTest("TODO") # TODO(mattjj): write test + + def test_missing_vjp_rule_error(self): + @api.custom_vjp + def foo(x): + return x ** 2 + + self.assertRaisesRegex( + AttributeError, + r"No VJP defined for custom_vjp function foo using defvjp.", + lambda: foo(2)) + self.assertRaisesRegex( + AttributeError, + r"No VJP defined for custom_vjp function foo using defvjp.", + lambda: api.grad(foo)(2.)) + + def test_vjp_rule_inconsistent_pytree_structures_error(self): + @api.custom_vjp + def f(x): + return x + + def foo_fwd(x): + return x, None + + def foo_bwd(_, g): + return g + + f.defvjp(foo_fwd, foo_bwd) + + f(2) # doesn't crash + self.assertRaisesRegex( + TypeError, + re.escape( + "Custom VJP rule must produce an output with the same container " + "(pytree) structure as the args tuple of the primal function, " + "and in particular must produce a tuple of length equal to the " + "number of arguments to the primal function, but got VJP output " + "structure {} for primal input structure {}.".format( + tree_util.tree_structure(1), + tree_util.tree_structure((1,))) + ), + lambda: api.grad(f)(2.)) + if __name__ == '__main__': absltest.main() From f658eb5bf510e0c3e1d31056285c42cd3d9568d0 Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 22 Mar 2020 19:50:06 +0100 Subject: [PATCH 0929/1053] Add back support for custom_transforms (#2484) * add also the tests * mark the old APIs as deprecated --- jax/api.py | 534 +++++++++++++++++++++++++++++++++++++++++ jax/interpreters/ad.py | 59 +++++ tests/api_test.py | 243 +++++++++++++++++++ 3 files changed, 836 insertions(+) diff --git a/jax/api.py b/jax/api.py index 429f09f23e89..d96e6b3d97e2 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1460,6 +1460,540 @@ def _valid_jaxtype(arg): return True +class CustomTransformsFunction(object): + def __init__(self, fun, prim): + self.fun = fun + self.prim = prim + wraps(fun)(self) + + def __repr__(self): + return ''.format(fun=self.__name__) + + def __call__(self, *args): + # TODO(mattjj): instead of tracing to a jaxpr, use process_call + args_flat, in_tree = tree_flatten(args) + flat_fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(self.fun), in_tree) + in_pvals = [pe.PartialVal((raise_to_shaped(core.get_aval(x)), core.unit)) + for x in args_flat] + jaxpr, _, consts = pe.trace_to_jaxpr(flat_fun, in_pvals, instantiate=True) + outs = self.prim.bind(*it.chain(consts, args_flat), jaxpr=jaxpr, + in_tree=in_tree, out_tree=out_tree(), + num_consts=len(consts)) + return tree_unflatten(out_tree(), outs) + +def custom_transforms(fun): + """Wraps a function so that its transformation behavior can be controlled. + + A primary use case of ``custom_transforms`` is defining custom VJP rules (aka + custom gradients) for a Python function, while still supporting other + transformations like ``jax.jit`` and ``jax.vmap``. Custom differentiation + rules can be supplied using the ``jax.defjvp`` and ``jax.defvjp`` functions. + + The ``custom_transforms`` decorator wraps ``fun`` so that its transformation + behavior can be overridden, but not all transformation rules need to be + specified manually. The default behavior is retained for any non-overridden + rules. + + The function ``fun`` must satisfy the same constraints required for jit + compilation. In particular the shapes of arrays in the computation of ``fun`` + may depend on the shapes of ``fun``'s arguments, but not their values. + Value dependent Python control flow is also not yet supported. + + Args: + fun: a Python callable. Must be functionally pure. Its arguments and return + value should be arrays, scalars, or (nested) standard Python containers + (tuple/list/dict) thereof. + + Returns: + A Python callable with the same input/output and transformation behavior as + ``fun``, but for which custom transformation rules can be supplied, e.g. + using ``jax.defvjp``. + + For example: + + >>> @jax.custom_transforms + ... def f(x): + ... return np.sin(x ** 2) + ... + >>> print(f(3.)) + 0.4121185 + >>> print(jax.grad(f)(3.)) + -5.4667816 + >>> jax.defvjp(f, lambda g, x: g * x) + >>> print(jax.grad(f)(3.)) + 3.0 + """ + + warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + name = getattr(fun, '__name__', '') + fun_p = core.Primitive(name) + fun_p.multiple_results = True + + def fun_impl(*args, **params): + consts, args = split_list(args, [params['num_consts']]) + return core.eval_jaxpr(params['jaxpr'], consts, *args) + fun_p.def_impl(fun_impl) + + def fun_jvp(primals, tangents, **params): + return ad.jvp(lu.wrap_init(fun_impl, params)).call_wrapped(primals, tangents) + ad.primitive_jvps[fun_p] = fun_jvp + + def fun_batch(args, dims, **params): + return batching.batch_fun(lu.wrap_init(fun_impl, params), args, dims) + batching.primitive_batchers[fun_p] = fun_batch + + def fun_abstract_eval(*avals, **params): + return pe.abstract_eval_fun(fun_impl, *avals, **params) + fun_p.def_abstract_eval(fun_abstract_eval) + + def fun_translation(c, *xla_args, **params): + return xla.lower_fun(fun_impl)(c, *xla_args, **params) + xla.translations[fun_p] = fun_translation + + return CustomTransformsFunction(fun, fun_p) + +def _check_custom_transforms_type(name, fun): + if type(fun) is not CustomTransformsFunction: + msg = ("{} requires a custom_transforms function as its first argument, " + "but got type {}.") + raise TypeError(msg.format(name, type(fun))) + +def defjvp_all(fun, custom_jvp): + """Define a custom JVP rule for a ``custom_transforms`` function. + + If ``fun`` represents a function with signature ``a -> b``, then + ``custom_jvp`` represents a function with signature ``(a, T a) -> (b, T b)``, + where we use ``T x`` to represent a tangent type for the type ``x``. + + In more detail, ``custom_jvp`` must take two arguments, both tuples of length + equal to the number of positional arguments to ``fun``. The first argument to + ``custom_jvp`` represents the input primal values, and the second represents + the input tangent values. ``custom_jvp`` must return a pair where the first + element represents the output primal value and the second element represents + the output tangent value. + + Defining a custom JVP rule also affects the default VJP rule, which is derived + from the JVP rule automatically via transposition. + + Args: + fun: a custom_transforms function. + custom_jvp: a Python callable specifying the JVP rule, taking two tuples as + arguments specifying the input primal values and tangent values, + respectively. The tuple elements can be arrays, scalars, or (nested) + standard Python containers (tuple/list/dict) thereof. The output must be a + pair representing the primal output and tangent output, which can be + arrays, scalars, or (nested) standard Python containers. Must be + functionally pure. + + Returns: + None. A side-effect is that ``fun`` is associated with the JVP rule + specified by ``custom_jvp``. + + For example: + + >>> @jax.custom_transforms + ... def f(x): + ... return np.sin(x ** 2) + ... + >>> print(f(3.)) + 0.4121185 + >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) + >>> print(out_primal) + 0.4121185 + >>> print(out_tangent) + -10.933563 + >>> jax.defjvp_all(f, lambda ps, ts: (np.sin(ps[0] ** 2), 8. * ts[0])) + >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) + >>> print(out_primal) + 0.4121185 + >>> print(out_tangent) + 16.0 + """ + warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defjvp_all", fun) + def custom_transforms_jvp(primals, tangents, **params): + num_consts, in_tree = params['num_consts'], params['in_tree'] + _, args_flat = split_list(primals, [num_consts]) + consts_dot, args_dot_flat = split_list(tangents, [num_consts]) + if not all(t is ad_util.zero for t in consts_dot): + msg = ("Detected differentiation with respect to closed-over values with " + "custom JVP rule, which isn't supported.") + raise ValueError(msg) + args = tree_unflatten(in_tree, args_flat) + args_dot = tree_unflatten(in_tree, args_dot_flat) + out, out_dot = custom_jvp(args, args_dot) + out_flat, out_tree = tree_flatten(out) + out_dot_flat, out_tree2 = tree_flatten(out_dot) + if out_tree != out_tree2: + msg = ("Custom JVP rule returned different tree structures for primals " + "and tangents, but they must be equal: {} and {}.") + raise TypeError(msg.format(out_tree, out_tree2)) + return out_flat, out_dot_flat + ad.primitive_jvps[fun.prim] = custom_transforms_jvp + +def defjvp(fun, *jvprules): + """Definine JVP rules for each argument separately. + + This function is a convenience wrapper around ``jax.defjvp_all`` for + separately defining JVP rules for each of the function's arguments. This + convenience wrapper does not provide a mechanism for depending on anything + other than the function arguments and its primal output value, though + depending on intermediate results is possible using ``jax.defjvp_all``. + + The signature of each component JVP rule is ``lambda g, ans, *primals: ...`` + where ``g`` represents the tangent of the corresponding positional argument, + ``ans`` represents the output primal, and ``*primals`` represents all the + primal positional arguments. + + Defining a custom JVP rule also affects the default VJP rule, which is derived + from the JVP rule automatically via transposition. + + Args: + fun: a custom_transforms function. + *jvprules: a sequence of functions or Nones specifying the JVP rule for each + corresponding positional argument. When an element is None, it indicates + that the Jacobian from the corresponding input to the output is zero. + + Returns: + None. A side-effect is that ``fun`` is associated with the JVP rule + specified by ``*jvprules``. + + For example: + + >>> @jax.custom_transforms + ... def f(x): + ... return np.sin(x ** 2) + ... + >>> print(f(3.)) + 0.4121185 + >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) + >>> print(out_primal) + 0.4121185 + >>> print(out_tangent) + -10.933563 + >>> jax.defjvp(f, lambda g, ans, x: 8. * g + ans) + >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) + >>> print(out_primal) + 0.4121185 + >>> print(out_tangent) + 16.412119 + """ + warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defjvp", fun) + def custom_jvp(primals, tangents): + ans = fun(*primals) + tangents_out = [rule(t, ans, *primals) for rule, t in zip(jvprules, tangents) + if rule is not None and t is not ad_util.zero] + return ans, functools.reduce(ad.add_tangents, tangents_out, ad_util.zero) + defjvp_all(fun, custom_jvp) + +def defvjp_all(fun, custom_vjp): + """Define a custom VJP rule for a ``custom_transforms`` function. + + If ``fun`` represents a function with signature ``a -> b``, then + ``custom_vjp`` represents a function with signature ``a -> (b, CT b -> CT a)`` + where we use ``CT x`` to represent a cotangent type for the type ``x``. That + is, ``custom_vjp`` should take the same arguments as ``fun`` and return a pair + where the first element represents the primal value of ``fun`` applied to the + arguments, and the second element is a VJP function that maps from output + cotangents to input cotangents, returning a tuple with length equal to the + number of positional arguments supplied to ``fun``. + + The VJP function returned as the second element of the output of + ``custom_vjp`` can close over intermediate values computed when evaluating the + primal value of ``fun``. That is, use lexical closure to share work between + the forward pass and the backward pass of reverse-mode automatic + differentiation. + + See also ``jax.custom_gradient``. + + Args: + fun: a custom_transforms function. + custom_vjp: a Python callable specifying the VJP rule, taking the same + arguments as ``fun`` and returning a pair where the first element is the + value of ``fun`` applied to the arguments and the second element is a + Python callable representing the VJP map from output cotangents to input + cotangents. The returned VJP function must accept a value with the same + shape as the value of ``fun`` applied to the arguments and must return a + tuple with length equal to the number of positional arguments to ``fun``. + Arguments can be arrays, scalars, or (nested) standard Python containers + (tuple/list/dict) thereof. Must be functionally pure. + + Returns: + None. A side-effect is that ``fun`` is associated with the VJP rule + specified by ``custom_vjp``. + + For example: + + >>> @jax.custom_transforms + ... def f(x): + ... return np.sin(x ** 2) + ... + >>> print(f(3.)) + 0.4121185 + >>> print(jax.grad(f)(3.)) + -5.4667816 + >>> jax.defvjp_all(f, lambda x: (np.sin(x ** 2), lambda g: (g * x,))) + >>> print(f(3.)) + 0.4121185 + >>> print(jax.grad(f)(3.)) + 3.0 + + An example with a function on two arguments, so that the VJP function must + return a tuple of length two: + + >>> @jax.custom_transforms + ... def f(x, y): + ... return x * y + ... + >>> jax.defvjp_all(f, lambda x, y: (x * y, lambda g: (y, x))) + >>> print(f(3., 4.)) + 12.0 + >>> print(jax.grad(f, argnums=(0, 1))(3., 4.)) + (4.0, 3.0) + """ + warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defvjp_all", fun) + def custom_transforms_vjp(*consts_and_args, **params): + num_consts, in_tree = params['num_consts'], params['in_tree'] + consts, args_flat = split_list(consts_and_args, [num_consts]) + args = tree_unflatten(params['in_tree'], args_flat) + out, vjp = custom_vjp(*args) + out_flat, out_tree = tree_flatten(out) + if out_tree != params['out_tree']: + msg = ( + "First output of `custom_vjp`: {} doesn't match the structure of " + "the output of `fun`: {}\n" + "{}\n" + "vs\n" + "{}\n".format(custom_vjp, fun, out_tree, params['out_tree']) + ) + raise TypeError(msg) + def vjp_flat(*cts_flat): + cts = tree_unflatten(out_tree, cts_flat) + args_cts_flat, in_tree2 = tree_flatten(vjp(cts)) + if in_tree != in_tree2: + msg = ( + "Output of the `vjp`: {} doesn't match the structure of args of " + "`fun`: {}\n" + "{}\n" + "vs\n" + "{}\n".format(vjp, fun, in_tree2, in_tree) + ) + raise TypeError(msg) + return [core.unit] * num_consts + list(args_cts_flat) + return out_flat, vjp_flat + ad.defvjp_all(fun.prim, custom_transforms_vjp) + +def defvjp(fun, *vjprules): + """Define VJP rules for each argument separately. + + This function is a convenience wrapper around ``jax.defvjp_all`` for + separately defining VJP rules for each of the function's arguments. This + convenience wrapper does not provide a mechanism for depending on anything + other than the function arguments and its primal output value, though + depending on intermediate results is possible using ``jax.defvjp_all``. + + The signature of each component VJP rule is ``lambda g, ans, *primals: ...`` + where ``g`` represents the output cotangent, ``ans`` represents the output + primal, and ``*primals`` represents all the primal positional arguments. + + Args: + fun: a custom_transforms function. + *vjprules: a sequence of functions or Nones specifying the VJP rule for each + corresponding positional argument. When an element is None, it indicates + that the Jacobian from the corresponding input to the output is zero. + + Returns: + None. A side-effect is that ``fun`` is associated with the VJP rule + specified by ``*vjprules``. + + For example: + + >>> @jax.custom_transforms + ... def f(x, y): + ... return np.sin(x ** 2 + y) + ... + >>> print(f(3., 4.)) + 0.42016703 + >>> print(jax.grad(f)(3., 4.)) + 5.4446807 + >>> print(jax.grad(f, 1)(3., 4.)) + 0.9074468 + >>> jax.defvjp(f, None, lambda g, ans, x, y: g + x + y + ans) + >>> print(jax.grad(f)(3., 4.)) + 0.0 + >>> print(jax.grad(f, 1)(3., 4.)) + 8.420167 + """ + warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defvjp", fun) + def custom_vjp(*primals): + ans = fun(*primals) + # TODO(mattjj): avoid instantiating zeros? + def vjpfun(ct): + return tuple(vjp(ct, ans, *primals) if vjp else ad_util.zeros_like_jaxval(x) + for x, vjp in zip(primals, vjprules)) + return ans, vjpfun + defvjp_all(fun, custom_vjp) + +def custom_gradient(fun): + """Convenience function for defining custom VJP rules (aka custom gradients). + + While the canonical way to define custom VJP rules is via ``jax.defvjp_all`` + and its convenience wrappers, the ``custom_gradient`` convenience wrapper + follows TensorFlow's ``tf.custom_gradient`` API. The difference here is that + ``custom_gradient`` can be used as a decorator on one function that returns + both the primal value (representing the output of the mathematical function to + be differentiated) and the VJP (gradient) function. + + See https://www.tensorflow.org/api_docs/python/tf/custom_gradient. + + If the mathematical function to be differentiated has type signature + ``a -> b``, then the Python callable ``fun`` should have signature + ``a -> (b, CT b -> CT a)`` where we use ``CT x`` to denote a cotangent type + for ``x``. See the example below. That is, ``fun`` should return a pair where + the first element represents the value of the mathematical function to be + differentiated and the second element is a function that represents the custom + VJP rule. + + The custom VJP function returned as the second element of the output of ``fun`` + can close over intermediate values computed when evaluating the function to be + differentiated. That is, use lexical closure to share work between the forward + pass and the backward pass of reverse-mode automatic differentiation. + + Args: + fun: a Python callable specifying both the mathematical function to be + differentiated and its reverse-mode differentiation rule. It should return + a pair consisting of an output value and a Python callable that represents + the custom gradient function. + + Returns: + A Python callable with signature ``a -> b``, i.e. that returns the output + value specified by the first element of ``fun``'s output pair. A side effect + is that under-the-hood ``jax.defvjp_all`` is called to set up the returned + Python callable with the custom VJP rule specified by the second element + of ``fun``'s output pair. + + For example: + + >>> @jax.custom_gradient + ... def f(x): + ... return x ** 2, lambda g: (g * x,) + ... + >>> print(f(3.)) + 9.0 + >>> print(jax.grad(f)(3.)) + 3.0 + + An example with a function on two arguments, so that the VJP function must + return a tuple of length two: + + >>> @jax.custom_gradient + ... def f(x, y): + ... return x * y, lambda g: (y, x) + ... + >>> print(f(3., 4.)) + 12.0 + >>> print(jax.grad(f, argnums=(0, 1))(3., 4.)) + (4.0, 3.0) + """ + def primal_fun(*args, **kwargs): + ans, _ = fun(*args, **kwargs) + return ans + primal_fun = custom_transforms(primal_fun) + defvjp_all(primal_fun, fun) + return primal_fun + + +def jarrett(fun): + new_fun = custom_transforms(fun) + + def elementwise_jvp(primals, tangents): + pushfwd = partial(jvp, fun, primals) + y, jacs = vmap(pushfwd, out_axes=(None, 0))(_elementwise_std_basis(tangents)) + flat_tangents, _ = tree_flatten(tangents) + out_tangent = sum([t * jac for t, jac in zip(flat_tangents, jacs)]) + return y, out_tangent + defjvp_all(new_fun, elementwise_jvp) + + return new_fun + +def _elementwise_std_basis(pytree): + leaves, _ = tree_flatten(pytree) + arity = len(leaves) + dims = map(onp.size, leaves) + # TODO(mattjj): use symbolic constants + dtype = dtypes.result_type(*leaves) + if not dtypes.issubdtype(dtype, onp.floating): + msg = ("Jacobian only defined for functions with floating input and output " + "dtypes (i.e. dtypes that model real numbers), got {}.") + raise TypeError(msg.format(dtype)) # TODO(mattjj, dougalm): handle complex + basis_array = onp.stack([onp.concatenate( + [onp.ones(dims[j], dtype) if i == j else onp.zeros(dims[j], dtype) + for j in range(arity)]) for i in range(arity)]) + return _unravel_array_into_pytree(pytree, 1, basis_array) + + +# This function mostly exists for making slides about JAX. +def _make_graphviz(fun): + """Adapts `fun` to return a graphviz dot string of its program representation. + + Args: + fun: The function whose `jaxpr` is to be rendered into graphviz dot. Its + positional arguments and return value should be arrays, scalars, or + standard Python containers (tuple/list/dict) thereof. + + Returns: + A wrapped version of `fun`, set up to return a graphviz dot string. + + See make_jaxpr for a related function. + """ + # TODO(mattjj): handle eqn.restructure + # TODO(mattjj): handle subjaxprs + + def pv_like(x): + aval = xla.abstractify(x) + return pe.PartialVal((aval, core.unit)) + + id_names = ("id{}".format(i) for i in it.count()) + + def jaxpr_to_graphviz(jaxpr, consts): + fragment = [] + + fragment.extend(map(invar_node, jaxpr.invars, jaxpr.invars)) + fragment.extend(map(constant_node, jaxpr.constvars, consts)) + + for eqn in jaxpr.eqns: + id_name = next(id_names) + fragment.append(function_node(id_name, eqn.primitive.name)) + fragment.extend(edge(invar, id_name) for invar in eqn.invars) + fragment.extend(edge(id_name, outvar) for outvar in eqn.outvars) + for ov in jaxpr.outvars: + fragment.append(outvar_node(ov, "out")) + return graph(''.join(fragment)) + + edge = '{} -> {} [color=gray30];\n'.format + function_node = '{} [label="{}", shape=box, color=lightskyblue, style=filled];\n'.format + invar_node = '{} [rank=2, label="{}", color=mediumspringgreen, style=filled];\n'.format + outvar_node = '{} [label="{}", fillcolor=indianred1, style="filled,dashed", color=black];\n'.format + constant_node = '{} [rank=2, label="{}", color=goldenrod1, style=filled];\n'.format + freevar_node = '{} [rank=2, label="{}", color=palegreen, style=filled];\n'.format + graph = 'digraph G {{{}}}'.format + + @wraps(fun) + def graphviz_maker(*args, **kwargs): + wrapped = lu.wrap_init(fun, kwargs) + jax_args, in_tree = tree_flatten((args, kwargs)) + jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) + pvals = map(pv_like, jax_args) + jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) + return jaxpr_to_graphviz(jaxpr, consts) + + graphviz_maker.__name__ = "make_graphviz({})".format(graphviz_maker.__name__) + return graphviz_maker + + class ShapeDtypeStruct(object): __slots__ = ["shape", "dtype"] def __init__(self, shape, dtype): diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 687423bbd92e..6483c9879032 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -435,6 +435,65 @@ def add_tangents(x, y): return add_jaxvals(x, y) +def defvjp_all(prim, custom_vjp): + # see https://github.com/google/jax/pull/636 + name = prim.name + + def fun_jvp(xs, ts, **params): + ts = map(instantiate_zeros, xs, ts) + primals_and_tangents = fun_jvp_p.bind(*it.chain(xs, ts), **params) + primals, tangents = split_list(primals_and_tangents, [len(primals_and_tangents) // 2]) + if prim.multiple_results: + return primals, tangents + else: + primal, = primals + tangent, = tangents + return primal, tangent + primitive_jvps[prim] = fun_jvp + + fun_jvp_p = core.Primitive('{name}_jvp'.format(name=name)) + fun_jvp_p.multiple_results = True + def fun_jvp_partial_eval(trace, *tracers, **params): + primals, tangents = split_list(tracers, [len(tracers) // 2]) + primals_out, vjp_py = custom_vjp(*primals, **params) + if not prim.multiple_results: + primals_out = [primals_out] + out_avals = [raise_to_shaped(get_aval(x)) for x in primals_out] + ct_pvals = [pe.PartialVal((aval, core.unit)) for aval in out_avals] + jaxpr, _, res = pe.trace_to_jaxpr(lu.wrap_init(vjp_py), ct_pvals, instantiate=True) + tangents_out = fun_lin_p.bind(*it.chain(res, tangents), trans_jaxpr=jaxpr, + num_res=len(res), out_avals=out_avals) + return primals_out + tangents_out + pe.custom_partial_eval_rules[fun_jvp_p] = fun_jvp_partial_eval + + fun_lin_p = core.Primitive('{name}_lin'.format(name=name)) + fun_lin_p.multiple_results = True + fun_lin_p.def_abstract_eval(lambda *_, **kwargs: kwargs['out_avals']) + def fun_lin_transpose(cts, *args, **kwargs): + num_res, trans_jaxpr = kwargs['num_res'], kwargs['trans_jaxpr'] + res, _ = split_list(args, [num_res]) + cts = map(instantiate_zeros_aval, kwargs['out_avals'], cts) + outs = core.eval_jaxpr(trans_jaxpr, res, *cts) + return [None] * num_res + outs + primitive_transposes[fun_lin_p] = fun_lin_transpose + +def defvjp(prim, *vjps): + def vjpmaker(*primals): + ans = prim.bind(*primals) + vjpfun = lambda ct: [vjp(ct, *primals) if vjp else zeros_like_jaxval(x) + for x, vjp in zip(primals, vjps)] + return ans, vjpfun + defvjp_all(prim, vjpmaker) + +def defvjp2(prim, *vjps): + def vjpmaker(*primals): + ans = prim.bind(*primals) + vjpfun = lambda ct: [vjp(ct, ans, *primals) if vjp else zeros_like_jaxval(x) + for x, vjp in zip(primals, vjps)] + return ans, vjpfun + defvjp_all(prim, vjpmaker) + + def defbilinear_broadcasting(bcast, prim, lhs_rule, rhs_rule): assert isinstance(prim, Primitive) lhs_jvp = lambda g, x, y, **kwargs: prim.bind(bcast(g, y), y, **kwargs) diff --git a/tests/api_test.py b/tests/api_test.py index 64492a2b70ce..1c9e8ce118ef 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -596,6 +596,200 @@ def f(z): def test_complex_input_jacfwd_raises_error(self): self.assertRaises(TypeError, lambda: jacfwd(lambda x: np.sin(x))(1 + 2j)) + def test_defvjp_all(self): + foo_p = Primitive('foo') + def foo(x): return 2. * foo_p.bind(x) + + ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (4 * g * np.sin(x),))) + val_ans, grad_ans = api.value_and_grad(foo)(3.) + self.assertAllClose(val_ans, 2 * 3.**2, check_dtypes=False) + self.assertAllClose(grad_ans, 4 * 2 * onp.sin(3.), check_dtypes=False) + + def test_defvjp_all_const(self): + foo_p = Primitive('foo') + def foo(x): return foo_p.bind(x) + + ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (12.,))) + val_ans, grad_ans = api.value_and_grad(foo)(3.) + self.assertAllClose(val_ans, 9., check_dtypes=False) + self.assertAllClose(grad_ans, 12., check_dtypes=True) + + def test_defvjp_all_higher_order_revmode(self): + foo_p = Primitive('foo') + def foo(x): return 2. * foo_p.bind(x) + + ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (g * x ** 2,))) + ans = api.grad(api.grad(foo))(3.) + self.assertAllClose(ans, 2 * 2 * 3., check_dtypes=False) + + def test_defvjp_all_multiple_arguments(self): + # also tests passing in symbolic zero tangents b/c we differentiate wrt only + # the first argument in one case + + foo_p = Primitive('foo') + def foo(x, y): return foo_p.bind(x, y) + + def vjpfun(x, y): + out = x**2 + y**3 + vjp = lambda g: (g + x + y, g * x * 9.) + return out, vjp + + ad.defvjp_all(foo_p, vjpfun) + val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) + self.assertAllClose(val_ans, 3.**2 + 4.**3, check_dtypes=False) + self.assertAllClose(grad_ans, 1. + 3. + 4., check_dtypes=False) + + ans = api.grad(foo, (0, 1))(3., 4.) + self.assertAllClose(ans, (1. + 3. + 4., 1. * 3. * 9.), check_dtypes=False) + + def test_defvjp_all_custom_transforms(self): + @api.custom_transforms + def foo(x): + return np.sin(x) + + api.defvjp_all(foo, lambda x: (np.sin(x), lambda g: (g * x,))) + val_ans, grad_ans = api.value_and_grad(foo)(3.) + self.assertAllClose(val_ans, onp.sin(3.), check_dtypes=False) + self.assertAllClose(grad_ans, 3., check_dtypes=False) + + # TODO(mattjj): add defvjp_all test with pytree arguments + + def test_defvjp(self): + @api.custom_transforms + def foo(x, y): + return np.sin(x * y) + + api.defvjp(foo, None, lambda g, _, x, y: g * x * y) + val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) + self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) + self.assertAllClose(grad_ans, 0., check_dtypes=False) + + ans_0, ans_1 = api.grad(foo, (0, 1))(3., 4.) + self.assertAllClose(ans_0, 0., check_dtypes=False) + self.assertAllClose(ans_1, 3. * 4., check_dtypes=False) + + def test_defvjp_higher_order(self): + @api.custom_transforms + def foo(x): + return np.sin(2. * x) + + api.defvjp(foo, lambda g, _, x: g * np.cos(x)) + ans = api.grad(api.grad(foo))(2.) + expected = api.grad(api.grad(np.sin))(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_defvjp_use_ans(self): + @api.custom_transforms + def foo(x, y): + return np.sin(x * y) + + api.defvjp(foo, None, lambda g, ans, x, y: g * x * y + np.cos(ans)) + val_ans, grad_ans = api.value_and_grad(foo, 1)(3., 4.) + self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) + self.assertAllClose(grad_ans, 3. * 4. + onp.cos(onp.sin(3. * 4)), + check_dtypes=False) + + # TODO + # def test_defjvp_closure_error(self): + # def foo(x): + # @api.custom_transforms + # def bar(y): + # return x * y + + # api.defjvp(bar, lambda y_dot, ans, y: x * y) + # return bar(x) + # jtu.check_raises( + # lambda: api.jvp(foo, (1.,), (1.,)), ValueError, + # "Detected differentiation with respect to closed-over values with " + # "custom JVP rule, which isn't supported.") + + # TODO + # def test_defvjp_closure_error(self): + # def foo(x): + # @api.custom_transforms + # def bar(y): + # return x * y + + # api.defvjp(bar, lambda g, ans, y: x * y) + # return bar(x) + # jtu.check_raises( + # lambda: grad(foo)(1.,), ValueError, + # "Detected differentiation w.r.t. variables from outside " + # "the scope of , but defvjp and " + # "defvjp_all only support differentiation w.r.t. positional arguments.") + + def test_custom_transforms_eval_with_pytrees(self): + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans = f((1, 2)) + self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) + + def test_custom_transforms_jit_with_pytrees(self): + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans = jit(f)((1, 2)) + self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) + + def test_custom_transforms_jit_with_pytrees_consts(self): + # The purpose of this test is to exercise the custom_transforms default + # translation rule in how it deals with constants that are too large to be + # treated as literals (at the time of writing). + z = onp.arange(10.) + + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': z * b} + + ans = jit(f)((1, 2)) + self.assertAllClose(ans, {'hi': 2 * 1, 'bye': z * 2}, check_dtypes=False) + + def test_custom_transforms_jvp_with_pytrees(self): + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans, out_tangent = api.jvp(f, ((1, 2),), ((3, 4),)) + self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) + self.assertEqual(out_tangent, {'hi': 2 * 3, 'bye': 2 * 4}) + + def test_custom_transforms_vmap_with_pytrees(self): + raise unittest.SkipTest("Test deprecated custom_transforms") + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans = api.vmap(f)((onp.arange(3), onp.ones((3, 2)))) + expected = {'hi': 2 * onp.arange(3), 'bye': 2 * onp.ones((3, 2))} + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_custom_transforms_jvp_with_closure(self): + def f(x): + @api.custom_transforms + def g(y): + return x * y + return g(x) + + ans = api.grad(f)(1.) + expected = 2. + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_custom_gradient(self): + @api.custom_gradient + def f(x): + return x ** 2, lambda g: (g * x,) + + self.assertAllClose(f(3.), 9., check_dtypes=False) + self.assertAllClose(api.grad(f)(3.), 3., check_dtypes=False) + def test_legacy_devicearray_repr(self): dx = device_put(3.) str(dx.item()) # doesn't crash @@ -956,6 +1150,55 @@ def check_warning(warn, nowarn): check_warning(lambda: np.tri(2, dtype="float64"), lambda: np.tri(2, dtype="float32")) + def test_custom_vjp_zeros(self): + @api.custom_transforms + def f(x, y): + return 2 * x, 3 * y + + def f_vjp(x, y): + return (2 * x, 3 * y), lambda ts: (4 * ts[0], 5 * ts[1]) + + api.defvjp_all(f, f_vjp, ) + api.grad(lambda x, y: f(x, y)[0])(1., 2.) # doesn't crash + + def test_custom_transforms_vjp_nones(self): + # issue rasied by jsnoek@ and jumper@ + @jax.custom_transforms + def solve(a, b): + return np.dot(np.linalg.inv(a), b) + # print(solve(a, b)) + + def solve_vjp(a, b): + x = solve(a, b) + def vjp(x_tangent): + dx = np.dot(solve(a, x_tangent), x.T) + out = (dx, b * 0.) + return out + return x, vjp + jax.defvjp_all(solve, solve_vjp) + gf = grad(lambda a,b: np.sum(solve(a, b))) + + n = 3 + a_in = np.linspace(0, 1, n)[:, None] + a = np.dot(a_in, a_in.T) + np.eye(n) * 0.1 + real_x = onp.random.RandomState(0).randn(n) + b = np.dot(a + np.eye(a.shape[0]), real_x) + print(gf(a, b)) # doesn't crash + + def test_vmap_in_axes_list(self): + # https://github.com/google/jax/issues/2367 + dictionary = {'a': 5., 'b': np.ones(2)} + x = np.zeros(3) + y = np.arange(3.) + + + def f(dct, x, y): + return dct['a'] + dct['b'] + x + y + + out1 = api.vmap(f, (None, 0, 0))(dictionary, x, y) + out2 = api.vmap(f, [None, 0, 0])(dictionary, x, y) + self.assertAllClose(out1, out2, check_dtypes=True) + def test_vmap_in_axes_tree_prefix_error(self): # https://github.com/google/jax/issues/795 self.assertRaisesRegex( From 61d885cf959710358d069146226cab0f2a969c70 Mon Sep 17 00:00:00 2001 From: George Necula Date: Mon, 23 Mar 2020 08:08:16 +0200 Subject: [PATCH 0930/1053] Revert previous commit (remove old custom_transforms API) (#2489) * Revert "Add back support for custom_transforms" This reverts commit 3abe61f1aed3810f7dc922c87e5cfec1c879fd27. From c76f32b1be7a6e22a23948fc8265a5351b54007f Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 23 Mar 2020 12:18:59 -0700 Subject: [PATCH 0931/1053] remove jarrett and _make_graphviz, bitrot might want to revive jarrett later! --- jax/api.py | 88 ------------------------------------------------------ 1 file changed, 88 deletions(-) diff --git a/jax/api.py b/jax/api.py index d96e6b3d97e2..48c3d0d252ba 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1906,94 +1906,6 @@ def primal_fun(*args, **kwargs): return primal_fun -def jarrett(fun): - new_fun = custom_transforms(fun) - - def elementwise_jvp(primals, tangents): - pushfwd = partial(jvp, fun, primals) - y, jacs = vmap(pushfwd, out_axes=(None, 0))(_elementwise_std_basis(tangents)) - flat_tangents, _ = tree_flatten(tangents) - out_tangent = sum([t * jac for t, jac in zip(flat_tangents, jacs)]) - return y, out_tangent - defjvp_all(new_fun, elementwise_jvp) - - return new_fun - -def _elementwise_std_basis(pytree): - leaves, _ = tree_flatten(pytree) - arity = len(leaves) - dims = map(onp.size, leaves) - # TODO(mattjj): use symbolic constants - dtype = dtypes.result_type(*leaves) - if not dtypes.issubdtype(dtype, onp.floating): - msg = ("Jacobian only defined for functions with floating input and output " - "dtypes (i.e. dtypes that model real numbers), got {}.") - raise TypeError(msg.format(dtype)) # TODO(mattjj, dougalm): handle complex - basis_array = onp.stack([onp.concatenate( - [onp.ones(dims[j], dtype) if i == j else onp.zeros(dims[j], dtype) - for j in range(arity)]) for i in range(arity)]) - return _unravel_array_into_pytree(pytree, 1, basis_array) - - -# This function mostly exists for making slides about JAX. -def _make_graphviz(fun): - """Adapts `fun` to return a graphviz dot string of its program representation. - - Args: - fun: The function whose `jaxpr` is to be rendered into graphviz dot. Its - positional arguments and return value should be arrays, scalars, or - standard Python containers (tuple/list/dict) thereof. - - Returns: - A wrapped version of `fun`, set up to return a graphviz dot string. - - See make_jaxpr for a related function. - """ - # TODO(mattjj): handle eqn.restructure - # TODO(mattjj): handle subjaxprs - - def pv_like(x): - aval = xla.abstractify(x) - return pe.PartialVal((aval, core.unit)) - - id_names = ("id{}".format(i) for i in it.count()) - - def jaxpr_to_graphviz(jaxpr, consts): - fragment = [] - - fragment.extend(map(invar_node, jaxpr.invars, jaxpr.invars)) - fragment.extend(map(constant_node, jaxpr.constvars, consts)) - - for eqn in jaxpr.eqns: - id_name = next(id_names) - fragment.append(function_node(id_name, eqn.primitive.name)) - fragment.extend(edge(invar, id_name) for invar in eqn.invars) - fragment.extend(edge(id_name, outvar) for outvar in eqn.outvars) - for ov in jaxpr.outvars: - fragment.append(outvar_node(ov, "out")) - return graph(''.join(fragment)) - - edge = '{} -> {} [color=gray30];\n'.format - function_node = '{} [label="{}", shape=box, color=lightskyblue, style=filled];\n'.format - invar_node = '{} [rank=2, label="{}", color=mediumspringgreen, style=filled];\n'.format - outvar_node = '{} [label="{}", fillcolor=indianred1, style="filled,dashed", color=black];\n'.format - constant_node = '{} [rank=2, label="{}", color=goldenrod1, style=filled];\n'.format - freevar_node = '{} [rank=2, label="{}", color=palegreen, style=filled];\n'.format - graph = 'digraph G {{{}}}'.format - - @wraps(fun) - def graphviz_maker(*args, **kwargs): - wrapped = lu.wrap_init(fun, kwargs) - jax_args, in_tree = tree_flatten((args, kwargs)) - jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) - pvals = map(pv_like, jax_args) - jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals) - return jaxpr_to_graphviz(jaxpr, consts) - - graphviz_maker.__name__ = "make_graphviz({})".format(graphviz_maker.__name__) - return graphviz_maker - - class ShapeDtypeStruct(object): __slots__ = ["shape", "dtype"] def __init__(self, shape, dtype): From 83bf048f8a39b527095ebf6d5500b053738b9e86 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 23 Mar 2020 14:29:22 -0700 Subject: [PATCH 0932/1053] separate out deprecated custom_transforms stuff --- docs/jax.rst | 3 +- jax/api.py | 531 ++++++++++------------------------------- jax/interpreters/ad.py | 120 +++++----- tests/api_test.py | 461 +++++++++++++++++------------------ 4 files changed, 417 insertions(+), 698 deletions(-) diff --git a/docs/jax.rst b/docs/jax.rst index c7a876059035..a576b3a8db74 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -41,7 +41,8 @@ Automatic differentiation .. autofunction:: jvp .. autofunction:: linearize .. autofunction:: vjp -.. autofunction:: custom_gradient +.. autofunction:: custom_jvp +.. autofunction:: custom_vjp Vectorization (:code:`vmap`) diff --git a/jax/api.py b/jax/api.py index 48c3d0d252ba..e6340a043c2b 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1460,6 +1460,116 @@ def _valid_jaxtype(arg): return True +class ShapeDtypeStruct(object): + __slots__ = ["shape", "dtype"] + def __init__(self, shape, dtype): + self.shape = shape + self.dtype = onp.dtype(dtype) + + size = property(lambda self: onp.prod(self.shape)) + ndim = property(lambda self: len(self.shape)) + + def __len__(self): + try: + return self.shape[0] + except IndexError as e: + raise TypeError("len() of unsized object") from e # same as numpy error + + def __repr__(self): + return "{}(shape={}, dtype={})".format( + type(self).__name__, self.shape, self.dtype.name) + + __str__ = __repr__ + + def __eq__(self, other): + if not isinstance(other, ShapeDtypeStruct): + return False + else: + return (other.shape, other.dtype) == (self.shape, self.dtype) + + def __hash__(self): + return hash((self.shape, self.dtype)) + +def eval_shape(fun: Callable, *args, **kwargs): + """Compute the shape/dtype of ``fun(*args, **kwargs)`` without any FLOPs. + + This utility function is useful for performing shape inference. Its + input/output behavior is defined by:: + + def eval_shape(fun, *args, **kwargs): + out = fun(*args, **kwargs) + return jax.tree_util.tree_map(shape_dtype_struct, out) + + def shape_dtype_struct(x): + return ShapeDtypeStruct(x.shape, x.dtype) + + class ShapeDtypeStruct(object): + __slots__ = ["shape", "dtype"] + def __init__(self, shape, dtype): + self.shape = shape + self.dtype = dtype + + In particular, the output is a pytree of objects that have ``shape`` and + ``dtype`` attributes, but nothing else about them is guaranteed by the API. + + But instead of applying ``fun`` directly, which might be expensive, it uses + JAX's abstract interpretation machinery to evaluate the shapes without doing + any FLOPs. + + Using ``eval_shape`` can also catch shape errors, and will raise same shape + errors as evaluating ``fun(*args, **kwargs)``. + + Args: + *args: a positional argument tuple of arrays, scalars, or (nested) standard + Python containers (tuples, lists, dicts, namedtuples, i.e. pytrees) of + those types. Since only the ``shape`` and ``dtype`` attributes are + accessed, only values that duck-type arrays are required, rather than real + ndarrays. The duck-typed objects cannot be namedtuples because those are + treated as standard Python containers. See the example below. + **kwargs: a keyword argument dict of arrays, scalars, or (nested) standard + Python containers (pytrees) of those types. As in ``args``, array values + need only be duck-typed to have ``shape`` and ``dtype`` attributes. + + For example: + + >>> f = lambda A, x: np.tanh(np.dot(A, x)) + >>> class MyArgArray(object): + ... def __init__(self, shape, dtype): + ... self.shape = shape + ... self.dtype = dtype + ... + >>> A = MyArgArray((2000, 3000), np.float32) + >>> x = MyArgArray((3000, 1000), np.float32) + >>> out = jax.eval_shape(f, A, x) # no FLOPs performed + >>> print(out.shape) + (2000, 1000) + >>> print(out.dtype) + dtype('float32') + """ + def abstractify(x): + return ShapedArray(onp.shape(x), dtypes.result_type(x)) + args_flat, in_tree = tree_flatten((args, kwargs)) + wrapped_fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) + out = pe.abstract_eval_fun(wrapped_fun.call_wrapped, + *map(abstractify, args_flat)) + out = [ShapeDtypeStruct(x.shape, x.dtype) for x in out] + return tree_unflatten(out_tree(), out) + + +def checkpoint(fun: Callable, concrete: bool = False) -> Callable: + @wraps(fun) + def fun_remat(*args, **kwargs): + args_flat, in_tree = tree_flatten((args, kwargs)) + flat_fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) + out_flat = pe.remat_call(flat_fun, *args_flat, name=flat_fun.__name__, + concrete=concrete) + return tree_unflatten(out_tree(), out_flat) + return fun_remat +remat = checkpoint + + +# TODO(mattjj): delete everything below here (deprecated custom_transforms) + class CustomTransformsFunction(object): def __init__(self, fun, prim): self.fun = fun @@ -1482,49 +1592,9 @@ def __call__(self, *args): return tree_unflatten(out_tree(), outs) def custom_transforms(fun): - """Wraps a function so that its transformation behavior can be controlled. - - A primary use case of ``custom_transforms`` is defining custom VJP rules (aka - custom gradients) for a Python function, while still supporting other - transformations like ``jax.jit`` and ``jax.vmap``. Custom differentiation - rules can be supplied using the ``jax.defjvp`` and ``jax.defvjp`` functions. - - The ``custom_transforms`` decorator wraps ``fun`` so that its transformation - behavior can be overridden, but not all transformation rules need to be - specified manually. The default behavior is retained for any non-overridden - rules. - - The function ``fun`` must satisfy the same constraints required for jit - compilation. In particular the shapes of arrays in the computation of ``fun`` - may depend on the shapes of ``fun``'s arguments, but not their values. - Value dependent Python control flow is also not yet supported. - - Args: - fun: a Python callable. Must be functionally pure. Its arguments and return - value should be arrays, scalars, or (nested) standard Python containers - (tuple/list/dict) thereof. - - Returns: - A Python callable with the same input/output and transformation behavior as - ``fun``, but for which custom transformation rules can be supplied, e.g. - using ``jax.defvjp``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> print(jax.grad(f)(3.)) - -5.4667816 - >>> jax.defvjp(f, lambda g, x: g * x) - >>> print(jax.grad(f)(3.)) - 3.0 - """ - + """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + name = getattr(fun, '__name__', '') fun_p = core.Primitive(name) fun_p.multiple_results = True @@ -1559,57 +1629,9 @@ def _check_custom_transforms_type(name, fun): raise TypeError(msg.format(name, type(fun))) def defjvp_all(fun, custom_jvp): - """Define a custom JVP rule for a ``custom_transforms`` function. - - If ``fun`` represents a function with signature ``a -> b``, then - ``custom_jvp`` represents a function with signature ``(a, T a) -> (b, T b)``, - where we use ``T x`` to represent a tangent type for the type ``x``. - - In more detail, ``custom_jvp`` must take two arguments, both tuples of length - equal to the number of positional arguments to ``fun``. The first argument to - ``custom_jvp`` represents the input primal values, and the second represents - the input tangent values. ``custom_jvp`` must return a pair where the first - element represents the output primal value and the second element represents - the output tangent value. - - Defining a custom JVP rule also affects the default VJP rule, which is derived - from the JVP rule automatically via transposition. - - Args: - fun: a custom_transforms function. - custom_jvp: a Python callable specifying the JVP rule, taking two tuples as - arguments specifying the input primal values and tangent values, - respectively. The tuple elements can be arrays, scalars, or (nested) - standard Python containers (tuple/list/dict) thereof. The output must be a - pair representing the primal output and tangent output, which can be - arrays, scalars, or (nested) standard Python containers. Must be - functionally pure. - - Returns: - None. A side-effect is that ``fun`` is associated with the JVP rule - specified by ``custom_jvp``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - -10.933563 - >>> jax.defjvp_all(f, lambda ps, ts: (np.sin(ps[0] ** 2), 8. * ts[0])) - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - 16.0 - """ + """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defjvp_all", fun) def custom_transforms_jvp(primals, tangents, **params): num_consts, in_tree = params['num_consts'], params['in_tree'] @@ -1632,53 +1654,9 @@ def custom_transforms_jvp(primals, tangents, **params): ad.primitive_jvps[fun.prim] = custom_transforms_jvp def defjvp(fun, *jvprules): - """Definine JVP rules for each argument separately. - - This function is a convenience wrapper around ``jax.defjvp_all`` for - separately defining JVP rules for each of the function's arguments. This - convenience wrapper does not provide a mechanism for depending on anything - other than the function arguments and its primal output value, though - depending on intermediate results is possible using ``jax.defjvp_all``. - - The signature of each component JVP rule is ``lambda g, ans, *primals: ...`` - where ``g`` represents the tangent of the corresponding positional argument, - ``ans`` represents the output primal, and ``*primals`` represents all the - primal positional arguments. - - Defining a custom JVP rule also affects the default VJP rule, which is derived - from the JVP rule automatically via transposition. - - Args: - fun: a custom_transforms function. - *jvprules: a sequence of functions or Nones specifying the JVP rule for each - corresponding positional argument. When an element is None, it indicates - that the Jacobian from the corresponding input to the output is zero. - - Returns: - None. A side-effect is that ``fun`` is associated with the JVP rule - specified by ``*jvprules``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - -10.933563 - >>> jax.defjvp(f, lambda g, ans, x: 8. * g + ans) - >>> out_primal, out_tangent = jax.jvp(f, (3.,), (2.,)) - >>> print(out_primal) - 0.4121185 - >>> print(out_tangent) - 16.412119 - """ + """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defjvp", fun) def custom_jvp(primals, tangents): ans = fun(*primals) @@ -1688,71 +1666,9 @@ def custom_jvp(primals, tangents): defjvp_all(fun, custom_jvp) def defvjp_all(fun, custom_vjp): - """Define a custom VJP rule for a ``custom_transforms`` function. - - If ``fun`` represents a function with signature ``a -> b``, then - ``custom_vjp`` represents a function with signature ``a -> (b, CT b -> CT a)`` - where we use ``CT x`` to represent a cotangent type for the type ``x``. That - is, ``custom_vjp`` should take the same arguments as ``fun`` and return a pair - where the first element represents the primal value of ``fun`` applied to the - arguments, and the second element is a VJP function that maps from output - cotangents to input cotangents, returning a tuple with length equal to the - number of positional arguments supplied to ``fun``. - - The VJP function returned as the second element of the output of - ``custom_vjp`` can close over intermediate values computed when evaluating the - primal value of ``fun``. That is, use lexical closure to share work between - the forward pass and the backward pass of reverse-mode automatic - differentiation. - - See also ``jax.custom_gradient``. - - Args: - fun: a custom_transforms function. - custom_vjp: a Python callable specifying the VJP rule, taking the same - arguments as ``fun`` and returning a pair where the first element is the - value of ``fun`` applied to the arguments and the second element is a - Python callable representing the VJP map from output cotangents to input - cotangents. The returned VJP function must accept a value with the same - shape as the value of ``fun`` applied to the arguments and must return a - tuple with length equal to the number of positional arguments to ``fun``. - Arguments can be arrays, scalars, or (nested) standard Python containers - (tuple/list/dict) thereof. Must be functionally pure. - - Returns: - None. A side-effect is that ``fun`` is associated with the VJP rule - specified by ``custom_vjp``. - - For example: - - >>> @jax.custom_transforms - ... def f(x): - ... return np.sin(x ** 2) - ... - >>> print(f(3.)) - 0.4121185 - >>> print(jax.grad(f)(3.)) - -5.4667816 - >>> jax.defvjp_all(f, lambda x: (np.sin(x ** 2), lambda g: (g * x,))) - >>> print(f(3.)) - 0.4121185 - >>> print(jax.grad(f)(3.)) - 3.0 - - An example with a function on two arguments, so that the VJP function must - return a tuple of length two: - - >>> @jax.custom_transforms - ... def f(x, y): - ... return x * y - ... - >>> jax.defvjp_all(f, lambda x, y: (x * y, lambda g: (y, x))) - >>> print(f(3., 4.)) - 12.0 - >>> print(jax.grad(f, argnums=(0, 1))(3., 4.)) - (4.0, 3.0) - """ + """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defvjp_all", fun) def custom_transforms_vjp(*consts_and_args, **params): num_consts, in_tree = params['num_consts'], params['in_tree'] @@ -1786,47 +1702,9 @@ def vjp_flat(*cts_flat): ad.defvjp_all(fun.prim, custom_transforms_vjp) def defvjp(fun, *vjprules): - """Define VJP rules for each argument separately. - - This function is a convenience wrapper around ``jax.defvjp_all`` for - separately defining VJP rules for each of the function's arguments. This - convenience wrapper does not provide a mechanism for depending on anything - other than the function arguments and its primal output value, though - depending on intermediate results is possible using ``jax.defvjp_all``. - - The signature of each component VJP rule is ``lambda g, ans, *primals: ...`` - where ``g`` represents the output cotangent, ``ans`` represents the output - primal, and ``*primals`` represents all the primal positional arguments. - - Args: - fun: a custom_transforms function. - *vjprules: a sequence of functions or Nones specifying the VJP rule for each - corresponding positional argument. When an element is None, it indicates - that the Jacobian from the corresponding input to the output is zero. - - Returns: - None. A side-effect is that ``fun`` is associated with the VJP rule - specified by ``*vjprules``. - - For example: - - >>> @jax.custom_transforms - ... def f(x, y): - ... return np.sin(x ** 2 + y) - ... - >>> print(f(3., 4.)) - 0.42016703 - >>> print(jax.grad(f)(3., 4.)) - 5.4446807 - >>> print(jax.grad(f, 1)(3., 4.)) - 0.9074468 - >>> jax.defvjp(f, None, lambda g, ans, x, y: g + x + y + ans) - >>> print(jax.grad(f)(3., 4.)) - 0.0 - >>> print(jax.grad(f, 1)(3., 4.)) - 8.420167 - """ + """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") + _check_custom_transforms_type("defvjp", fun) def custom_vjp(*primals): ans = fun(*primals) @@ -1838,177 +1716,12 @@ def vjpfun(ct): defvjp_all(fun, custom_vjp) def custom_gradient(fun): - """Convenience function for defining custom VJP rules (aka custom gradients). - - While the canonical way to define custom VJP rules is via ``jax.defvjp_all`` - and its convenience wrappers, the ``custom_gradient`` convenience wrapper - follows TensorFlow's ``tf.custom_gradient`` API. The difference here is that - ``custom_gradient`` can be used as a decorator on one function that returns - both the primal value (representing the output of the mathematical function to - be differentiated) and the VJP (gradient) function. - - See https://www.tensorflow.org/api_docs/python/tf/custom_gradient. - - If the mathematical function to be differentiated has type signature - ``a -> b``, then the Python callable ``fun`` should have signature - ``a -> (b, CT b -> CT a)`` where we use ``CT x`` to denote a cotangent type - for ``x``. See the example below. That is, ``fun`` should return a pair where - the first element represents the value of the mathematical function to be - differentiated and the second element is a function that represents the custom - VJP rule. - - The custom VJP function returned as the second element of the output of ``fun`` - can close over intermediate values computed when evaluating the function to be - differentiated. That is, use lexical closure to share work between the forward - pass and the backward pass of reverse-mode automatic differentiation. - - Args: - fun: a Python callable specifying both the mathematical function to be - differentiated and its reverse-mode differentiation rule. It should return - a pair consisting of an output value and a Python callable that represents - the custom gradient function. - - Returns: - A Python callable with signature ``a -> b``, i.e. that returns the output - value specified by the first element of ``fun``'s output pair. A side effect - is that under-the-hood ``jax.defvjp_all`` is called to set up the returned - Python callable with the custom VJP rule specified by the second element - of ``fun``'s output pair. - - For example: - - >>> @jax.custom_gradient - ... def f(x): - ... return x ** 2, lambda g: (g * x,) - ... - >>> print(f(3.)) - 9.0 - >>> print(jax.grad(f)(3.)) - 3.0 - - An example with a function on two arguments, so that the VJP function must - return a tuple of length two: + """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" + warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") - >>> @jax.custom_gradient - ... def f(x, y): - ... return x * y, lambda g: (y, x) - ... - >>> print(f(3., 4.)) - 12.0 - >>> print(jax.grad(f, argnums=(0, 1))(3., 4.)) - (4.0, 3.0) - """ def primal_fun(*args, **kwargs): ans, _ = fun(*args, **kwargs) return ans primal_fun = custom_transforms(primal_fun) defvjp_all(primal_fun, fun) return primal_fun - - -class ShapeDtypeStruct(object): - __slots__ = ["shape", "dtype"] - def __init__(self, shape, dtype): - self.shape = shape - self.dtype = onp.dtype(dtype) - - size = property(lambda self: onp.prod(self.shape)) - ndim = property(lambda self: len(self.shape)) - - def __len__(self): - try: - return self.shape[0] - except IndexError as e: - raise TypeError("len() of unsized object") from e # same as numpy error - - def __repr__(self): - return "{}(shape={}, dtype={})".format( - type(self).__name__, self.shape, self.dtype.name) - - __str__ = __repr__ - - def __eq__(self, other): - if not isinstance(other, ShapeDtypeStruct): - return False - else: - return (other.shape, other.dtype) == (self.shape, self.dtype) - - def __hash__(self): - return hash((self.shape, self.dtype)) - -def eval_shape(fun: Callable, *args, **kwargs): - """Compute the shape/dtype of ``fun(*args, **kwargs)`` without any FLOPs. - - This utility function is useful for performing shape inference. Its - input/output behavior is defined by:: - - def eval_shape(fun, *args, **kwargs): - out = fun(*args, **kwargs) - return jax.tree_util.tree_map(shape_dtype_struct, out) - - def shape_dtype_struct(x): - return ShapeDtypeStruct(x.shape, x.dtype) - - class ShapeDtypeStruct(object): - __slots__ = ["shape", "dtype"] - def __init__(self, shape, dtype): - self.shape = shape - self.dtype = dtype - - In particular, the output is a pytree of objects that have ``shape`` and - ``dtype`` attributes, but nothing else about them is guaranteed by the API. - - But instead of applying ``fun`` directly, which might be expensive, it uses - JAX's abstract interpretation machinery to evaluate the shapes without doing - any FLOPs. - - Using ``eval_shape`` can also catch shape errors, and will raise same shape - errors as evaluating ``fun(*args, **kwargs)``. - - Args: - *args: a positional argument tuple of arrays, scalars, or (nested) standard - Python containers (tuples, lists, dicts, namedtuples, i.e. pytrees) of - those types. Since only the ``shape`` and ``dtype`` attributes are - accessed, only values that duck-type arrays are required, rather than real - ndarrays. The duck-typed objects cannot be namedtuples because those are - treated as standard Python containers. See the example below. - **kwargs: a keyword argument dict of arrays, scalars, or (nested) standard - Python containers (pytrees) of those types. As in ``args``, array values - need only be duck-typed to have ``shape`` and ``dtype`` attributes. - - For example: - - >>> f = lambda A, x: np.tanh(np.dot(A, x)) - >>> class MyArgArray(object): - ... def __init__(self, shape, dtype): - ... self.shape = shape - ... self.dtype = dtype - ... - >>> A = MyArgArray((2000, 3000), np.float32) - >>> x = MyArgArray((3000, 1000), np.float32) - >>> out = jax.eval_shape(f, A, x) # no FLOPs performed - >>> print(out.shape) - (2000, 1000) - >>> print(out.dtype) - dtype('float32') - """ - def abstractify(x): - return ShapedArray(onp.shape(x), dtypes.result_type(x)) - args_flat, in_tree = tree_flatten((args, kwargs)) - wrapped_fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) - out = pe.abstract_eval_fun(wrapped_fun.call_wrapped, - *map(abstractify, args_flat)) - out = [ShapeDtypeStruct(x.shape, x.dtype) for x in out] - return tree_unflatten(out_tree(), out) - - -def checkpoint(fun: Callable, concrete: bool = False) -> Callable: - @wraps(fun) - def fun_remat(*args, **kwargs): - args_flat, in_tree = tree_flatten((args, kwargs)) - flat_fun, out_tree = flatten_fun(lu.wrap_init(fun), in_tree) - out_flat = pe.remat_call(flat_fun, *args_flat, name=flat_fun.__name__, - concrete=concrete) - return tree_unflatten(out_tree(), out_flat) - return fun_remat -remat = checkpoint diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 6483c9879032..52fc761770a6 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -435,65 +435,6 @@ def add_tangents(x, y): return add_jaxvals(x, y) -def defvjp_all(prim, custom_vjp): - # see https://github.com/google/jax/pull/636 - name = prim.name - - def fun_jvp(xs, ts, **params): - ts = map(instantiate_zeros, xs, ts) - primals_and_tangents = fun_jvp_p.bind(*it.chain(xs, ts), **params) - primals, tangents = split_list(primals_and_tangents, [len(primals_and_tangents) // 2]) - if prim.multiple_results: - return primals, tangents - else: - primal, = primals - tangent, = tangents - return primal, tangent - primitive_jvps[prim] = fun_jvp - - fun_jvp_p = core.Primitive('{name}_jvp'.format(name=name)) - fun_jvp_p.multiple_results = True - def fun_jvp_partial_eval(trace, *tracers, **params): - primals, tangents = split_list(tracers, [len(tracers) // 2]) - primals_out, vjp_py = custom_vjp(*primals, **params) - if not prim.multiple_results: - primals_out = [primals_out] - out_avals = [raise_to_shaped(get_aval(x)) for x in primals_out] - ct_pvals = [pe.PartialVal((aval, core.unit)) for aval in out_avals] - jaxpr, _, res = pe.trace_to_jaxpr(lu.wrap_init(vjp_py), ct_pvals, instantiate=True) - tangents_out = fun_lin_p.bind(*it.chain(res, tangents), trans_jaxpr=jaxpr, - num_res=len(res), out_avals=out_avals) - return primals_out + tangents_out - pe.custom_partial_eval_rules[fun_jvp_p] = fun_jvp_partial_eval - - fun_lin_p = core.Primitive('{name}_lin'.format(name=name)) - fun_lin_p.multiple_results = True - fun_lin_p.def_abstract_eval(lambda *_, **kwargs: kwargs['out_avals']) - def fun_lin_transpose(cts, *args, **kwargs): - num_res, trans_jaxpr = kwargs['num_res'], kwargs['trans_jaxpr'] - res, _ = split_list(args, [num_res]) - cts = map(instantiate_zeros_aval, kwargs['out_avals'], cts) - outs = core.eval_jaxpr(trans_jaxpr, res, *cts) - return [None] * num_res + outs - primitive_transposes[fun_lin_p] = fun_lin_transpose - -def defvjp(prim, *vjps): - def vjpmaker(*primals): - ans = prim.bind(*primals) - vjpfun = lambda ct: [vjp(ct, *primals) if vjp else zeros_like_jaxval(x) - for x, vjp in zip(primals, vjps)] - return ans, vjpfun - defvjp_all(prim, vjpmaker) - -def defvjp2(prim, *vjps): - def vjpmaker(*primals): - ans = prim.bind(*primals) - vjpfun = lambda ct: [vjp(ct, ans, *primals) if vjp else zeros_like_jaxval(x) - for x, vjp in zip(primals, vjps)] - return ans, vjpfun - defvjp_all(prim, vjpmaker) - - def defbilinear_broadcasting(bcast, prim, lhs_rule, rhs_rule): assert isinstance(prim, Primitive) lhs_jvp = lambda g, x, y, **kwargs: prim.bind(bcast(g, y), y, **kwargs) @@ -618,3 +559,64 @@ def _perm(primal_counts, tangent_counts, lst): def _interleave(xs, ys): assert len(xs) == len(ys) return [e for pair in zip(xs, ys) for l in pair for e in l] + + +# TODO(mattjj): delete everything below here (deprecated custom_transforms) + +def defvjp_all(prim, custom_vjp): + # see https://github.com/google/jax/pull/636 + name = prim.name + + def fun_jvp(xs, ts, **params): + ts = map(instantiate_zeros, xs, ts) + primals_and_tangents = fun_jvp_p.bind(*it.chain(xs, ts), **params) + primals, tangents = split_list(primals_and_tangents, [len(primals_and_tangents) // 2]) + if prim.multiple_results: + return primals, tangents + else: + primal, = primals + tangent, = tangents + return primal, tangent + primitive_jvps[prim] = fun_jvp + + fun_jvp_p = core.Primitive('{name}_jvp'.format(name=name)) + fun_jvp_p.multiple_results = True + def fun_jvp_partial_eval(trace, *tracers, **params): + primals, tangents = split_list(tracers, [len(tracers) // 2]) + primals_out, vjp_py = custom_vjp(*primals, **params) + if not prim.multiple_results: + primals_out = [primals_out] + out_avals = [raise_to_shaped(get_aval(x)) for x in primals_out] + ct_pvals = [pe.PartialVal((aval, core.unit)) for aval in out_avals] + jaxpr, _, res = pe.trace_to_jaxpr(lu.wrap_init(vjp_py), ct_pvals, instantiate=True) + tangents_out = fun_lin_p.bind(*it.chain(res, tangents), trans_jaxpr=jaxpr, + num_res=len(res), out_avals=out_avals) + return primals_out + tangents_out + pe.custom_partial_eval_rules[fun_jvp_p] = fun_jvp_partial_eval + + fun_lin_p = core.Primitive('{name}_lin'.format(name=name)) + fun_lin_p.multiple_results = True + fun_lin_p.def_abstract_eval(lambda *_, **kwargs: kwargs['out_avals']) + def fun_lin_transpose(cts, *args, **kwargs): + num_res, trans_jaxpr = kwargs['num_res'], kwargs['trans_jaxpr'] + res, _ = split_list(args, [num_res]) + cts = map(instantiate_zeros_aval, kwargs['out_avals'], cts) + outs = core.eval_jaxpr(trans_jaxpr, res, *cts) + return [None] * num_res + outs + primitive_transposes[fun_lin_p] = fun_lin_transpose + +def defvjp(prim, *vjps): + def vjpmaker(*primals): + ans = prim.bind(*primals) + vjpfun = lambda ct: [vjp(ct, *primals) if vjp else zeros_like_jaxval(x) + for x, vjp in zip(primals, vjps)] + return ans, vjpfun + defvjp_all(prim, vjpmaker) + +def defvjp2(prim, *vjps): + def vjpmaker(*primals): + ans = prim.bind(*primals) + vjpfun = lambda ct: [vjp(ct, ans, *primals) if vjp else zeros_like_jaxval(x) + for x, vjp in zip(primals, vjps)] + return ans, vjpfun + defvjp_all(prim, vjpmaker) diff --git a/tests/api_test.py b/tests/api_test.py index 1c9e8ce118ef..3ee837fa8e54 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -596,200 +596,6 @@ def f(z): def test_complex_input_jacfwd_raises_error(self): self.assertRaises(TypeError, lambda: jacfwd(lambda x: np.sin(x))(1 + 2j)) - def test_defvjp_all(self): - foo_p = Primitive('foo') - def foo(x): return 2. * foo_p.bind(x) - - ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (4 * g * np.sin(x),))) - val_ans, grad_ans = api.value_and_grad(foo)(3.) - self.assertAllClose(val_ans, 2 * 3.**2, check_dtypes=False) - self.assertAllClose(grad_ans, 4 * 2 * onp.sin(3.), check_dtypes=False) - - def test_defvjp_all_const(self): - foo_p = Primitive('foo') - def foo(x): return foo_p.bind(x) - - ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (12.,))) - val_ans, grad_ans = api.value_and_grad(foo)(3.) - self.assertAllClose(val_ans, 9., check_dtypes=False) - self.assertAllClose(grad_ans, 12., check_dtypes=True) - - def test_defvjp_all_higher_order_revmode(self): - foo_p = Primitive('foo') - def foo(x): return 2. * foo_p.bind(x) - - ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (g * x ** 2,))) - ans = api.grad(api.grad(foo))(3.) - self.assertAllClose(ans, 2 * 2 * 3., check_dtypes=False) - - def test_defvjp_all_multiple_arguments(self): - # also tests passing in symbolic zero tangents b/c we differentiate wrt only - # the first argument in one case - - foo_p = Primitive('foo') - def foo(x, y): return foo_p.bind(x, y) - - def vjpfun(x, y): - out = x**2 + y**3 - vjp = lambda g: (g + x + y, g * x * 9.) - return out, vjp - - ad.defvjp_all(foo_p, vjpfun) - val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) - self.assertAllClose(val_ans, 3.**2 + 4.**3, check_dtypes=False) - self.assertAllClose(grad_ans, 1. + 3. + 4., check_dtypes=False) - - ans = api.grad(foo, (0, 1))(3., 4.) - self.assertAllClose(ans, (1. + 3. + 4., 1. * 3. * 9.), check_dtypes=False) - - def test_defvjp_all_custom_transforms(self): - @api.custom_transforms - def foo(x): - return np.sin(x) - - api.defvjp_all(foo, lambda x: (np.sin(x), lambda g: (g * x,))) - val_ans, grad_ans = api.value_and_grad(foo)(3.) - self.assertAllClose(val_ans, onp.sin(3.), check_dtypes=False) - self.assertAllClose(grad_ans, 3., check_dtypes=False) - - # TODO(mattjj): add defvjp_all test with pytree arguments - - def test_defvjp(self): - @api.custom_transforms - def foo(x, y): - return np.sin(x * y) - - api.defvjp(foo, None, lambda g, _, x, y: g * x * y) - val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) - self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) - self.assertAllClose(grad_ans, 0., check_dtypes=False) - - ans_0, ans_1 = api.grad(foo, (0, 1))(3., 4.) - self.assertAllClose(ans_0, 0., check_dtypes=False) - self.assertAllClose(ans_1, 3. * 4., check_dtypes=False) - - def test_defvjp_higher_order(self): - @api.custom_transforms - def foo(x): - return np.sin(2. * x) - - api.defvjp(foo, lambda g, _, x: g * np.cos(x)) - ans = api.grad(api.grad(foo))(2.) - expected = api.grad(api.grad(np.sin))(2.) - self.assertAllClose(ans, expected, check_dtypes=False) - - def test_defvjp_use_ans(self): - @api.custom_transforms - def foo(x, y): - return np.sin(x * y) - - api.defvjp(foo, None, lambda g, ans, x, y: g * x * y + np.cos(ans)) - val_ans, grad_ans = api.value_and_grad(foo, 1)(3., 4.) - self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) - self.assertAllClose(grad_ans, 3. * 4. + onp.cos(onp.sin(3. * 4)), - check_dtypes=False) - - # TODO - # def test_defjvp_closure_error(self): - # def foo(x): - # @api.custom_transforms - # def bar(y): - # return x * y - - # api.defjvp(bar, lambda y_dot, ans, y: x * y) - # return bar(x) - # jtu.check_raises( - # lambda: api.jvp(foo, (1.,), (1.,)), ValueError, - # "Detected differentiation with respect to closed-over values with " - # "custom JVP rule, which isn't supported.") - - # TODO - # def test_defvjp_closure_error(self): - # def foo(x): - # @api.custom_transforms - # def bar(y): - # return x * y - - # api.defvjp(bar, lambda g, ans, y: x * y) - # return bar(x) - # jtu.check_raises( - # lambda: grad(foo)(1.,), ValueError, - # "Detected differentiation w.r.t. variables from outside " - # "the scope of , but defvjp and " - # "defvjp_all only support differentiation w.r.t. positional arguments.") - - def test_custom_transforms_eval_with_pytrees(self): - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans = f((1, 2)) - self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) - - def test_custom_transforms_jit_with_pytrees(self): - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans = jit(f)((1, 2)) - self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) - - def test_custom_transforms_jit_with_pytrees_consts(self): - # The purpose of this test is to exercise the custom_transforms default - # translation rule in how it deals with constants that are too large to be - # treated as literals (at the time of writing). - z = onp.arange(10.) - - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': z * b} - - ans = jit(f)((1, 2)) - self.assertAllClose(ans, {'hi': 2 * 1, 'bye': z * 2}, check_dtypes=False) - - def test_custom_transforms_jvp_with_pytrees(self): - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans, out_tangent = api.jvp(f, ((1, 2),), ((3, 4),)) - self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) - self.assertEqual(out_tangent, {'hi': 2 * 3, 'bye': 2 * 4}) - - def test_custom_transforms_vmap_with_pytrees(self): - raise unittest.SkipTest("Test deprecated custom_transforms") - @api.custom_transforms - def f(x): - a, b = x[0], x[1] - return {'hi': 2 * a, 'bye': 2 * b} - - ans = api.vmap(f)((onp.arange(3), onp.ones((3, 2)))) - expected = {'hi': 2 * onp.arange(3), 'bye': 2 * onp.ones((3, 2))} - self.assertAllClose(ans, expected, check_dtypes=False) - - def test_custom_transforms_jvp_with_closure(self): - def f(x): - @api.custom_transforms - def g(y): - return x * y - return g(x) - - ans = api.grad(f)(1.) - expected = 2. - self.assertAllClose(ans, expected, check_dtypes=False) - - def test_custom_gradient(self): - @api.custom_gradient - def f(x): - return x ** 2, lambda g: (g * x,) - - self.assertAllClose(f(3.), 9., check_dtypes=False) - self.assertAllClose(api.grad(f)(3.), 3., check_dtypes=False) - def test_legacy_devicearray_repr(self): dx = device_put(3.) str(dx.item()) # doesn't crash @@ -1150,41 +956,6 @@ def check_warning(warn, nowarn): check_warning(lambda: np.tri(2, dtype="float64"), lambda: np.tri(2, dtype="float32")) - def test_custom_vjp_zeros(self): - @api.custom_transforms - def f(x, y): - return 2 * x, 3 * y - - def f_vjp(x, y): - return (2 * x, 3 * y), lambda ts: (4 * ts[0], 5 * ts[1]) - - api.defvjp_all(f, f_vjp, ) - api.grad(lambda x, y: f(x, y)[0])(1., 2.) # doesn't crash - - def test_custom_transforms_vjp_nones(self): - # issue rasied by jsnoek@ and jumper@ - @jax.custom_transforms - def solve(a, b): - return np.dot(np.linalg.inv(a), b) - # print(solve(a, b)) - - def solve_vjp(a, b): - x = solve(a, b) - def vjp(x_tangent): - dx = np.dot(solve(a, x_tangent), x.T) - out = (dx, b * 0.) - return out - return x, vjp - jax.defvjp_all(solve, solve_vjp) - gf = grad(lambda a,b: np.sum(solve(a, b))) - - n = 3 - a_in = np.linspace(0, 1, n)[:, None] - a = np.dot(a_in, a_in.T) + np.eye(n) * 0.1 - real_x = onp.random.RandomState(0).randn(n) - b = np.dot(a + np.eye(a.shape[0]), real_x) - print(gf(a, b)) # doesn't crash - def test_vmap_in_axes_list(self): # https://github.com/google/jax/issues/2367 dictionary = {'a': 5., 'b': np.ones(2)} @@ -2793,5 +2564,237 @@ def foo_bwd(_, g): lambda: api.grad(f)(2.)) +class DeprecatedCustomTransformsTest(jtu.JaxTestCase): + + def test_defvjp_all(self): + foo_p = Primitive('foo') + def foo(x): return 2. * foo_p.bind(x) + + ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (4 * g * np.sin(x),))) + val_ans, grad_ans = api.value_and_grad(foo)(3.) + self.assertAllClose(val_ans, 2 * 3.**2, check_dtypes=False) + self.assertAllClose(grad_ans, 4 * 2 * onp.sin(3.), check_dtypes=False) + + def test_defvjp_all_const(self): + foo_p = Primitive('foo') + def foo(x): return foo_p.bind(x) + + ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (12.,))) + val_ans, grad_ans = api.value_and_grad(foo)(3.) + self.assertAllClose(val_ans, 9., check_dtypes=False) + self.assertAllClose(grad_ans, 12., check_dtypes=True) + + def test_defvjp_all_higher_order_revmode(self): + foo_p = Primitive('foo') + def foo(x): return 2. * foo_p.bind(x) + + ad.defvjp_all(foo_p, lambda x: (x**2, lambda g: (g * x ** 2,))) + ans = api.grad(api.grad(foo))(3.) + self.assertAllClose(ans, 2 * 2 * 3., check_dtypes=False) + + def test_defvjp_all_multiple_arguments(self): + # also tests passing in symbolic zero tangents b/c we differentiate wrt only + # the first argument in one case + + foo_p = Primitive('foo') + def foo(x, y): return foo_p.bind(x, y) + + def vjpfun(x, y): + out = x**2 + y**3 + vjp = lambda g: (g + x + y, g * x * 9.) + return out, vjp + + ad.defvjp_all(foo_p, vjpfun) + val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) + self.assertAllClose(val_ans, 3.**2 + 4.**3, check_dtypes=False) + self.assertAllClose(grad_ans, 1. + 3. + 4., check_dtypes=False) + + ans = api.grad(foo, (0, 1))(3., 4.) + self.assertAllClose(ans, (1. + 3. + 4., 1. * 3. * 9.), check_dtypes=False) + + def test_defvjp_all_custom_transforms(self): + @api.custom_transforms + def foo(x): + return np.sin(x) + + api.defvjp_all(foo, lambda x: (np.sin(x), lambda g: (g * x,))) + val_ans, grad_ans = api.value_and_grad(foo)(3.) + self.assertAllClose(val_ans, onp.sin(3.), check_dtypes=False) + self.assertAllClose(grad_ans, 3., check_dtypes=False) + + # TODO(mattjj): add defvjp_all test with pytree arguments + + def test_defvjp(self): + @api.custom_transforms + def foo(x, y): + return np.sin(x * y) + + api.defvjp(foo, None, lambda g, _, x, y: g * x * y) + val_ans, grad_ans = api.value_and_grad(foo)(3., 4.) + self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) + self.assertAllClose(grad_ans, 0., check_dtypes=False) + + ans_0, ans_1 = api.grad(foo, (0, 1))(3., 4.) + self.assertAllClose(ans_0, 0., check_dtypes=False) + self.assertAllClose(ans_1, 3. * 4., check_dtypes=False) + + def test_defvjp_higher_order(self): + @api.custom_transforms + def foo(x): + return np.sin(2. * x) + + api.defvjp(foo, lambda g, _, x: g * np.cos(x)) + ans = api.grad(api.grad(foo))(2.) + expected = api.grad(api.grad(np.sin))(2.) + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_defvjp_use_ans(self): + @api.custom_transforms + def foo(x, y): + return np.sin(x * y) + + api.defvjp(foo, None, lambda g, ans, x, y: g * x * y + np.cos(ans)) + val_ans, grad_ans = api.value_and_grad(foo, 1)(3., 4.) + self.assertAllClose(val_ans, onp.sin(3. * 4.), check_dtypes=False) + self.assertAllClose(grad_ans, 3. * 4. + onp.cos(onp.sin(3. * 4)), + check_dtypes=False) + + # TODO + # def test_defjvp_closure_error(self): + # def foo(x): + # @api.custom_transforms + # def bar(y): + # return x * y + + # api.defjvp(bar, lambda y_dot, ans, y: x * y) + # return bar(x) + # jtu.check_raises( + # lambda: api.jvp(foo, (1.,), (1.,)), ValueError, + # "Detected differentiation with respect to closed-over values with " + # "custom JVP rule, which isn't supported.") + + # TODO + # def test_defvjp_closure_error(self): + # def foo(x): + # @api.custom_transforms + # def bar(y): + # return x * y + + # api.defvjp(bar, lambda g, ans, y: x * y) + # return bar(x) + # jtu.check_raises( + # lambda: grad(foo)(1.,), ValueError, + # "Detected differentiation w.r.t. variables from outside " + # "the scope of , but defvjp and " + # "defvjp_all only support differentiation w.r.t. positional arguments.") + + def test_custom_transforms_eval_with_pytrees(self): + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans = f((1, 2)) + self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) + + def test_custom_transforms_jit_with_pytrees(self): + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans = jit(f)((1, 2)) + self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) + + def test_custom_transforms_jit_with_pytrees_consts(self): + # The purpose of this test is to exercise the custom_transforms default + # translation rule in how it deals with constants that are too large to be + # treated as literals (at the time of writing). + z = onp.arange(10.) + + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': z * b} + + ans = jit(f)((1, 2)) + self.assertAllClose(ans, {'hi': 2 * 1, 'bye': z * 2}, check_dtypes=False) + + def test_custom_transforms_jvp_with_pytrees(self): + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans, out_tangent = api.jvp(f, ((1, 2),), ((3, 4),)) + self.assertEqual(ans, {'hi': 2 * 1, 'bye': 2 * 2}) + self.assertEqual(out_tangent, {'hi': 2 * 3, 'bye': 2 * 4}) + + def test_custom_transforms_vmap_with_pytrees(self): + raise unittest.SkipTest("Test deprecated custom_transforms") + @api.custom_transforms + def f(x): + a, b = x[0], x[1] + return {'hi': 2 * a, 'bye': 2 * b} + + ans = api.vmap(f)((onp.arange(3), onp.ones((3, 2)))) + expected = {'hi': 2 * onp.arange(3), 'bye': 2 * onp.ones((3, 2))} + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_custom_transforms_jvp_with_closure(self): + def f(x): + @api.custom_transforms + def g(y): + return x * y + return g(x) + + ans = api.grad(f)(1.) + expected = 2. + self.assertAllClose(ans, expected, check_dtypes=False) + + def test_custom_gradient(self): + @api.custom_gradient + def f(x): + return x ** 2, lambda g: (g * x,) + + self.assertAllClose(f(3.), 9., check_dtypes=False) + self.assertAllClose(api.grad(f)(3.), 3., check_dtypes=False) + + def test_custom_vjp_zeros(self): + @api.custom_transforms + def f(x, y): + return 2 * x, 3 * y + + def f_vjp(x, y): + return (2 * x, 3 * y), lambda ts: (4 * ts[0], 5 * ts[1]) + + api.defvjp_all(f, f_vjp, ) + api.grad(lambda x, y: f(x, y)[0])(1., 2.) # doesn't crash + + def test_custom_transforms_vjp_nones(self): + # issue rasied by jsnoek@ and jumper@ + @jax.custom_transforms + def solve(a, b): + return np.dot(np.linalg.inv(a), b) + # print(solve(a, b)) + + def solve_vjp(a, b): + x = solve(a, b) + def vjp(x_tangent): + dx = np.dot(solve(a, x_tangent), x.T) + out = (dx, b * 0.) + return out + return x, vjp + jax.defvjp_all(solve, solve_vjp) + gf = grad(lambda a,b: np.sum(solve(a, b))) + + n = 3 + a_in = np.linspace(0, 1, n)[:, None] + a = np.dot(a_in, a_in.T) + np.eye(n) * 0.1 + real_x = onp.random.RandomState(0).randn(n) + b = np.dot(a + np.eye(a.shape[0]), real_x) + print(gf(a, b)) # doesn't crash + + if __name__ == '__main__': absltest.main() From 0cf84f925b049264ca2f18d95d87b7305ab36bac Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 23 Mar 2020 18:43:02 -0700 Subject: [PATCH 0933/1053] fix custom_transforms bug --- jax/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index e6340a043c2b..a39e1c83cc4a 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1609,7 +1609,8 @@ def fun_jvp(primals, tangents, **params): ad.primitive_jvps[fun_p] = fun_jvp def fun_batch(args, dims, **params): - return batching.batch_fun(lu.wrap_init(fun_impl, params), args, dims) + batched, out_dims = batching.batch_fun2(lu.wrap_init(fun_impl, params), dims) + return batched.call_wrapped(*args), out_dims() batching.primitive_batchers[fun_p] = fun_batch def fun_abstract_eval(*avals, **params): From b05ac57938e942b9b011ebe9991126bf7245dbca Mon Sep 17 00:00:00 2001 From: botev Date: Wed, 25 Mar 2020 02:10:06 +0000 Subject: [PATCH 0934/1053] Making isclose handle correctly infinite and NaN values. --- jax/numpy/lax_numpy.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0443b2d27647..4b7991aabe1c 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -974,7 +974,7 @@ def moveaxis(a, source, destination): @_wraps(onp.isclose) -def isclose(a, b, rtol=1e-05, atol=1e-08): +def isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False): a, b = _promote_args("isclose", asarray(a), asarray(b)) dtype = _dtype(a) if issubdtype(dtype, inexact): @@ -985,6 +985,27 @@ def isclose(a, b, rtol=1e-05, atol=1e-08): out = lax.le( lax.abs(lax.sub(a, b)), lax.add(atol, lax.mul(rtol, lax.abs(b)))) + # This corrects the comparisons for infinite and nan values + a_inf = isinf(a) + b_inf = isinf(b) + any_inf = logical_or(a_inf, b_inf) + both_inf = logical_and(a_inf, b_inf) + # Make all elements where either a or b are infinite to False + out = logical_and(out, logical_not(any_inf)) + # Make all elements where both a or b are the same inf to True + same_value = lax.eq(a, b) + same_inf = logical_and(both_inf, same_value) + out = logical_or(out, same_inf) + + # Make all elements where either a or b is NaN to False + a_nan = isnan(a) + b_nan = isnan(b) + any_nan = logical_or(a_nan, b_nan) + out = logical_and(out, logical_not(any_nan)) + if equal_nan: + # Make all elements where both a and b is NaN to True + both_nan = logical_and(a_nan, b_nan) + out = logical_or(out, both_nan) return _maybe_numpy_1_13_isclose_behavior(a, out) else: return lax.eq(a, b) From 74c20509ebcf9d467fafbcb5e655475a0e4bdc77 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 24 Mar 2020 20:43:33 -0700 Subject: [PATCH 0935/1053] improve custom_jvp error messages, fixes #2502 --- jax/core.py | 7 +++++++ jax/custom_derivatives.py | 17 ++++++++++++++++- jax/lax/lax_control_flow.py | 6 +++--- tests/api_test.py | 26 +++++++++++++++++++++++--- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/jax/core.py b/jax/core.py index 265093465c8c..970794d9a22c 100644 --- a/jax/core.py +++ b/jax/core.py @@ -708,6 +708,13 @@ def strip_weak_type(self): """Returns a copy of the aval with weak_type=False.""" return UnshapedArray(self.dtype) if self.weak_type else self + @property + def shape(self): + msg = ("UnshapedArray has no shape. Please open an issue at " + "https://github.com/google/jax/issues because it's unexpected for " + "UnshapedArray instances to ever be produced.") + raise TypeError(msg) + class ShapedArray(UnshapedArray): __slots__ = ['shape'] array_abstraction_level = 1 diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py index a8709a40919a..685c9dbb54c5 100644 --- a/jax/custom_derivatives.py +++ b/jax/custom_derivatives.py @@ -186,8 +186,23 @@ def _flatten_jvp(in_tree, *args): tangents_out, out_tree2 = tree_flatten(py_tangents_out) if out_tree != out_tree2: msg = ("Custom JVP rule must produce primal and tangent outputs with equal " - "container (pytree) structures, but got {} and {}.") + "container (pytree) structures, but got {} and {} respectively.") raise TypeError(msg.format(out_tree, out_tree2)) from None + primal_avals_out = [raise_to_shaped(core.get_aval(x)) for x in primals_out] + tangent_avals_out = [raise_to_shaped(core.get_aval(t)) for t in tangents_out] + if primal_avals_out != tangent_avals_out: + if len(primal_avals_out) == 1: + (av1,), (av2,) = primal_avals_out, tangent_avals_out + msg = ("Custom JVP rule must produce primal and tangent outputs with " + "equal shapes and dtypes, but got {} and {} respectively.") + raise TypeError(msg.format(av1.str_short(), av2.str_short())) + else: + msg = ("Custom JVP rule must produce primal and tangent outputs with " + "equal shapes and dtypes, but got:\n{}") + disagreements = ( + " primal {} for tangent {}".format(av1.str_short(), av2.str_short()) + for av1, av2 in zip(primal_avals_out, tangent_avals_out) if av1 != av2) + raise TypeError(msg.format('\n'.join(disagreements))) yield primals_out + tangents_out, out_tree def _custom_deriv_call_bind(primitive, f, *args, **params): diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 2dd657e9dfd3..8287a7a2feb3 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -1309,9 +1309,9 @@ def _check_tree(func_name, expected_name, actual_tree, expected_tree): def _check_tree_and_avals(what, tree1, avals1, tree2, avals2): """Raises TypeError if (tree1, avals1) does not match (tree2, avals2). - Corresponding `tree` and `avals` must match in the sense that the number of leaves in - `tree` must be equal to the length of `avals`. - `what` will be prepended to details of the mismatch in TypeError. + Corresponding `tree` and `avals` must match in the sense that the number of + leaves in `tree` must be equal to the length of `avals`. `what` will be + prepended to details of the mismatch in TypeError. """ if tree1 != tree2: msg = ("{} must have same type structure, got {} and {}.") diff --git a/tests/api_test.py b/tests/api_test.py index 3ee837fa8e54..5dc7d93ca47d 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -2228,7 +2228,7 @@ def test_vmap_axes(self): def test_pmap(self): raise unittest.SkipTest("TODO") # TODO(mattjj): write test - def test_missing_jvp_rule_error(self): + def test_missing_jvp_rule_error_message(self): @api.custom_jvp def foo(x): return x ** 2 @@ -2246,7 +2246,7 @@ def foo(x): r"No JVP defined for custom_jvp function foo using defjvp.", lambda: api.grad(foo)(2.)) - def test_jvp_rule_inconsistent_pytree_structures_error(self): + def test_jvp_rule_inconsistent_pytree_structures_error_message(self): @api.custom_jvp def f(x): return (x**2,) @@ -2263,12 +2263,32 @@ def foo_jvp(primals, tangents): re.escape( "Custom JVP rule must produce primal and tangent outputs " "with equal container (pytree) structures, but got " - "{} and {}.".format( + "{} and {} respectively.".format( tree_util.tree_structure((1,)), tree_util.tree_structure([1, 2])) ), lambda: api.jvp(f, (2.,), (1.,))) + def test_primal_tangent_aval_disagreement_error_message(self): + @api.custom_jvp + def f(x): + return x ** 2 + + @f.defjvp + def foo_jvp(primals, tangents): + x, = primals + t, = tangents + return f(x), np.reshape(t, (1,)) + + f(2.) # doesn't crash + self.assertRaisesRegex( + TypeError, + re.escape( + "Custom JVP rule must produce primal and tangent outputs " + "with equal shapes and dtypes, but got float32[] and float32[1] " + "respectively."), + lambda: api.jvp(f, (np.float32(2.),), (np.float32(1.),))) + class CustomVJPTest(jtu.JaxTestCase): From d1e8f43abe5c369ee5405e423c5ba601d2cc631c Mon Sep 17 00:00:00 2001 From: George Necula Date: Wed, 25 Mar 2020 11:07:50 +0200 Subject: [PATCH 0936/1053] Better error message for indexing with floats (#2496) Now the error message is 'Indexer must have integer or boolean type'. Before it was 'len() of unsized object' --- jax/numpy/lax_numpy.py | 4 ++-- tests/lax_numpy_indexing_test.py | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 0443b2d27647..2dd0c4d424cb 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3032,8 +3032,8 @@ def _index_to_gather(x_shape, idx): y_axis += 1 x_axis += 1 else: - if abstract_i and not (issubdtype(abstract_i.dtype, integer) or - issubdtype(abstract_i.dtype, bool_)): + if (abstract_i is not None and + not (issubdtype(abstract_i.dtype, integer) or issubdtype(abstract_i.dtype, bool_))): msg = ("Indexer must have integer or boolean type, got indexer " "with type {} at position {}, indexer value {}") raise TypeError(msg.format(abstract_i.dtype.name, idx_pos, i)) diff --git a/tests/lax_numpy_indexing_test.py b/tests/lax_numpy_indexing_test.py index 0a11933ba1cb..96cb105414ce 100644 --- a/tests/lax_numpy_indexing_test.py +++ b/tests/lax_numpy_indexing_test.py @@ -754,8 +754,20 @@ def testBooleanIndexingWithEmptyResult(self): self.assertAllClose(ans, expected, check_dtypes=False) def testFloatIndexingError(self): - x = jnp.array([1, 2, 3]) - self.assertRaises(TypeError, lambda: x[3.5]) + BAD_INDEX_TYPE_ERROR = "Indexer must have integer or boolean type, got indexer with type" + with self.assertRaisesRegex(TypeError, BAD_INDEX_TYPE_ERROR): + jnp.zeros(2)[0.] + with self.assertRaisesRegex(TypeError, BAD_INDEX_TYPE_ERROR): + jnp.zeros((2, 2))[(0, 0.)] + with self.assertRaisesRegex(TypeError, BAD_INDEX_TYPE_ERROR): + jnp.zeros((2, 2))[(0, 0.)] + with self.assertRaisesRegex(TypeError, BAD_INDEX_TYPE_ERROR): + api.jit(lambda idx: jnp.zeros((2, 2))[idx])((0, 0.)) + with self.assertRaisesRegex(TypeError, BAD_INDEX_TYPE_ERROR): + ops.index_add(jnp.zeros(2), 0., 1.) + with self.assertRaisesRegex(TypeError, BAD_INDEX_TYPE_ERROR): + ops.index_update(jnp.zeros(2), 0., 1.) + def testIndexOutOfBounds(self): # https://github.com/google/jax/issues/2245 array = jnp.ones(5) From 6f2f779a3d0ab831e1715347324a1810551c9aca Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 19 Mar 2020 14:55:16 +0100 Subject: [PATCH 0937/1053] Started a FAQ for JAX --- docs/faq.rst | 41 +++++++++++++++++++++++++++++++++++++++++ docs/index.rst | 1 + 2 files changed, 42 insertions(+) create mode 100644 docs/faq.rst diff --git a/docs/faq.rst b/docs/faq.rst new file mode 100644 index 000000000000..8440872f7015 --- /dev/null +++ b/docs/faq.rst @@ -0,0 +1,41 @@ +JAX Frequently Asked Questions +============================== + +We are collecting here answers to frequently asked questions. +Contributions welcome! + +Gradients contain `NaN` where using ``where`` +------------------------------------------------ + +If you define a function using ``where`` to avoid an undefined value, if you +are not careful you may obtain a `NaN` for reverse differentiation:: + + def my_log(x): + return np.where(x > 0., np.log(x), 0.) + + my_log(0.) ==> 0. # Ok + jax.grad(my_log)(0.) ==> NaN + +A short explanation is that during ``grad`` computation the adjoint corresponding +to the undefined ``np.log(x)`` is a ``NaN`` and when it gets accumulated to the +adjoint of the ``np.where``. The correct way to write such functions is to ensure +that there is a ``np.where`` *inside* the partially-defined function, to ensure +that the adjoint is always finite:: + + def safe_for_grad_log(x): + return np.log(np.where(x > 0., x, 1.) + + safe_for_grad_log(0.) ==> 0. # Ok + jax.grad(safe_for_grad_log)(0.) ==> 0. # Ok + +The inner ``np.where`` may be needed in addition to the original one, e.g.: + + def my_log_or_y(x, y): + """Return log(x) if x > 0 or y""" + return np.where(x > 0., np.log(np.where(x > 0., x, 1.), y) + + +Additional reading: + + * [Issue: gradients through np.where when one of branches is nan](https://github.com/google/jax/issues/1052#issuecomment-514083352) + * [How to avoid NaN gradients when using ``where``](https://github.com/tensorflow/probability/blob/master/discussion/where-nan.pdf) \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 0966b98fca26..ab46511e59e8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,6 +33,7 @@ For an introduction to JAX, start at the :caption: Notes CHANGELOG + faq jaxpr async_dispatch concurrency From 86e3046e21d0b5374824656e4e8eeca1e20fea2a Mon Sep 17 00:00:00 2001 From: George Necula Date: Sun, 22 Mar 2020 06:47:14 +0100 Subject: [PATCH 0938/1053] Added a FAQ for impure functions --- docs/faq.rst | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/faq.rst b/docs/faq.rst index 8440872f7015..23208047f61d 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -4,6 +4,48 @@ JAX Frequently Asked Questions We are collecting here answers to frequently asked questions. Contributions welcome! +`jit` changes the behavior of my function +----------------------------------------- + +If you have a Python function that changes behavior after using `jit`, perhaps +your function uses global state, or has side-effects. In the following code, the +`impure_func` uses the global `y` and has a side-effect due to `print`:: + + y = 0 + + # @jit # Different behavior with jit + def impure_func(x): + print("Inside:", y) + return x + y + + for y in range(3): + print("Result:", impure_func(y)) + +Without `jit` the output is:: + + Inside: 0 + Result: 0 + Inside: 1 + Result: 2 + Inside: 2 + Result: 4 + +and with `jit` it is: + + Inside: 0 + Result: 0 + Result: 1 + Result: 2 + +For `jit` the function is executed once using the Python interpreter, at which time the +`Inside` printing happens, and the first value of `y` is observed. Then the function +is compiled and cached, and executed multiple times with different values of `x`, but +with the same first value of `y`. + +Additional reading: + + * [JAX - The Sharp Bits: Pure Functions](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#%F0%9F%94%AA-Pure-functions) + Gradients contain `NaN` where using ``where`` ------------------------------------------------ From f88d49b43ce2a111cacbeb8028741005cea34b57 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 24 Mar 2020 10:22:49 +0100 Subject: [PATCH 0939/1053] Added FAQ entry about creating JAX arrays --- docs/faq.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/faq.rst b/docs/faq.rst index 23208047f61d..7bcfcd5457c7 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -4,6 +4,26 @@ JAX Frequently Asked Questions We are collecting here answers to frequently asked questions. Contributions welcome! +Creating arrays with `jax.numpy.array` is slower than with `numpy.array` +------------------------------------------------------------------------ + +The following code is relatively fast when using NumPy, and slow when using +JAX's NumPy:: + + import numpy as np + np.array([0] * int(1e6)) + +The reason is that in NumPy the `numpy.array` function is implemented in C, while +the `jax.numpy.array` is implemented in Python, and it needs to iterate over a long +list to convert each list element to an array element. + +An alternative would be to create the array with original NumPy and then convert +it to a JAX array:: + + from jax import numpy as jnp + jnp.array(np.array([0] * int(1e6))) + + `jit` changes the behavior of my function ----------------------------------------- From 9ec0ac6e20ff83d9bb7807bc0b3017a3714039e5 Mon Sep 17 00:00:00 2001 From: botev Date: Wed, 25 Mar 2020 09:59:43 +0000 Subject: [PATCH 0940/1053] Added test for isclose. --- tests/lax_numpy_test.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index cb5b276d402a..fa0a0a83e76f 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1579,6 +1579,31 @@ def testMemoryView(self): onp.array([0x2a], dtype=onp.uint8), check_dtypes=True) + def testIsClose(self): + c_isclose = api.jit(jnp.isclose) + c_isclose_nan = api.jit(partial(jnp.isclose, equal_nan=True)) + n = 2 + + rng = onp.random.RandomState(0) + x = rng.randn(n, 1) + y = rng.randn(n, 1) + inf = onp.asarray(n * [onp.inf]).reshape([n, 1]) + nan = onp.asarray(n * [onp.nan]).reshape([n, 1]) + args = [x, y, inf, -inf, nan] + + for arg0 in args: + for arg1 in args: + result_np = onp.isclose(arg0, arg1) + result_jax = jnp.isclose(arg0, arg1) + result_jit = c_isclose(arg0, arg1) + self.assertTrue(jnp.all(jnp.equal(result_np, result_jax))) + self.assertTrue(jnp.all(jnp.equal(result_np, result_jit))) + result_np = onp.isclose(arg0, arg1, equal_nan=True) + result_jax = jnp.isclose(arg0, arg1, equal_nan=True) + result_jit = c_isclose_nan(arg0, arg1) + self.assertTrue(jnp.all(jnp.equal(result_np, result_jax))) + self.assertTrue(jnp.all(jnp.equal(result_np, result_jit))) + def testAllClose(self): rng = onp.random.RandomState(0) x = rng.randn(2, 2) From da9b52324af6c73b94cf7fe70d301cccf9c85c7e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 25 Mar 2020 14:53:23 -0700 Subject: [PATCH 0941/1053] remove incorrect sentence in notebook --- docs/notebooks/How_JAX_primitives_work.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/How_JAX_primitives_work.ipynb b/docs/notebooks/How_JAX_primitives_work.ipynb index 59b46bb48273..cd29d17d80af 100644 --- a/docs/notebooks/How_JAX_primitives_work.ipynb +++ b/docs/notebooks/How_JAX_primitives_work.ipynb @@ -554,7 +554,7 @@ "\n", "\n", "For example, the abstraction of a vector with 3 elements may be `ShapedArray(float32[3])`, or `ConcreteArray([1., 2., 3.])`. \n", - "In the latter case, JAX uses the actual concrete value wrapped as an abstract value. Nevertheless, the abstract evaluation is not supposed to look at the concrete values, but only at the shapes and types.\n" + "In the latter case, JAX uses the actual concrete value wrapped as an abstract value.\n" ] }, { From fc0f875b02edc0f48edbe2f2b91158f415ae5fe8 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 25 Mar 2020 17:05:57 -0700 Subject: [PATCH 0942/1053] improve ref to Tao's 3rd edition of Analysis I --- docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb index 9de88eda0b2b..56bbe7bd62b0 100644 --- a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -531,7 +531,7 @@ "colab_type": "text" }, "source": [ - "But mathematically if we think of $f$ as a function on $\\mathbb{R}_+$ then it is differentiable at 0 [Rudin Definition 5.1, or Tao Definition 10.1.1]. Alternatively, we might say as a convention we want to consider the directional derivative from the right. So there is a sensible value for the Python function `grad(f)` to return at `0.0`, namely `1.0`, even though JAX's machinery for differentiation over reals doesn't produce it.\n", + "But mathematically if we think of $f$ as a function on $\\mathbb{R}_+$ then it is differentiable at 0 [Rudin's Real and Complex Analysis Definition 5.1, or Tao's Analysis I 3rd ed. Definition 10.1.1 and Example 10.1.6]. Alternatively, we might say as a convention we want to consider the directional derivative from the right. So there is a sensible value for the Python function `grad(f)` to return at `0.0`, namely `1.0`, even though JAX's machinery for differentiation over reals doesn't produce it.\n", "\n", "We can use a custom JVP rule! In particular, we can define the JVP rule in terms of the derivative function $x \\mapsto \\frac{\\sqrt{x} + 2}{2(\\sqrt{x} + 1)^2}$ on $\\mathbb{R}_+$," ] @@ -2341,4 +2341,4 @@ ] } ] -} \ No newline at end of file +} From 32747476874fcd32f6feaa42128369b2973220bb Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 25 Mar 2020 18:17:55 -0700 Subject: [PATCH 0943/1053] fix derivatives reference (wrong Rudin!) --- docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb index 56bbe7bd62b0..fd03a8b94a46 100644 --- a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -531,7 +531,7 @@ "colab_type": "text" }, "source": [ - "But mathematically if we think of $f$ as a function on $\\mathbb{R}_+$ then it is differentiable at 0 [Rudin's Real and Complex Analysis Definition 5.1, or Tao's Analysis I 3rd ed. Definition 10.1.1 and Example 10.1.6]. Alternatively, we might say as a convention we want to consider the directional derivative from the right. So there is a sensible value for the Python function `grad(f)` to return at `0.0`, namely `1.0`, even though JAX's machinery for differentiation over reals doesn't produce it.\n", + "But mathematically if we think of $f$ as a function on $\\mathbb{R}_+$ then it is differentiable at 0 [Rudin's Principles of Mathematical Analysis Definition 5.1, or Tao's Analysis I 3rd ed. Definition 10.1.1 and Example 10.1.6]. Alternatively, we might say as a convention we want to consider the directional derivative from the right. So there is a sensible value for the Python function `grad(f)` to return at `0.0`, namely `1.0`, even though JAX's machinery for differentiation over reals doesn't produce it.\n", "\n", "We can use a custom JVP rule! In particular, we can define the JVP rule in terms of the derivative function $x \\mapsto \\frac{\\sqrt{x} + 2}{2(\\sqrt{x} + 1)^2}$ on $\\mathbb{R}_+$," ] From c3e3d4807edc0dac4ba9ac71ff4c0397d8f44770 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 25 Mar 2020 20:19:49 -0700 Subject: [PATCH 0944/1053] temporarily revert parts of #2026 pending bug fix --- jax/nn/functions.py | 10 +++------- jax/numpy/linalg.py | 19 ++++++++----------- jax/scipy/special.py | 36 +++++++++++++----------------------- 3 files changed, 24 insertions(+), 41 deletions(-) diff --git a/jax/nn/functions.py b/jax/nn/functions.py index 0d34409a8b09..026e70703f82 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -17,7 +17,7 @@ import numpy as onp -from jax import custom_jvp +from jax import custom_transforms, defjvp from jax import dtypes from jax import lax from jax.scipy.special import expit @@ -25,7 +25,7 @@ # activations -@custom_jvp +@custom_transforms def relu(x): r"""Rectified linear unit activation function. @@ -35,11 +35,7 @@ def relu(x): \mathrm{relu}(x) = \max(x, 0) """ return np.maximum(x, 0) -def _relu_jvp(primals, tangents): - x, = primals - t, = tangents - return relu(x), lax.select(x > 0, t, lax.full_like(t, 0)) -relu.defjvp(_relu_jvp) +defjvp(relu, lambda g, ans, x: lax.select(x > 0, g, lax.full_like(g, 0))) def softplus(x): r"""Softplus activation function. diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index 728ee83ea1e6..ff0668017c50 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -20,7 +20,7 @@ import operator from typing import Tuple, Union, cast -from jax import jit, vmap, custom_jvp +from jax import jit, vmap from .. import lax from .. import ops from .. import lax_linalg @@ -29,6 +29,7 @@ from .lax_numpy import _wraps from .vectorize import vectorize from . import lax_numpy as np +from ..api import custom_transforms, defjvp from ..util import get_module_functions from ..third_party.numpy.linalg import cond, tensorinv, tensorsolve @@ -110,8 +111,8 @@ def matrix_rank(M, tol=None): return np.sum(S > tol) -@custom_jvp @_wraps(onp.linalg.slogdet) +@custom_transforms @jit def slogdet(a): a = _promote_arg_dtypes(np.asarray(a)) @@ -136,15 +137,11 @@ def slogdet(a): is_zero, np.array(-np.inf, dtype=dtype), np.sum(np.log(np.abs(diag)), axis=-1)) return sign, np.real(logdet) -def _slogdet_jvp(primals, tangents): - x, = primals - g, = tangents - if np.issubdtype(np._dtype(x), np.complexfloating): - raise NotImplementedError # TODO(pfau): make this work for complex types - sign, ans = slogdet(x) - sign_dot, ans_dot = np.zeros_like(sign), np.trace(solve(x, g), axis1=-1, axis2=-2) - return (sign, ans), (sign_dot, ans_dot) -slogdet.defjvp(_slogdet_jvp) +def _jvp_slogdet(g, ans, x): + jvp_sign = np.zeros(x.shape[:-2]) + jvp_logdet = np.trace(solve(x, g), axis1=-1, axis2=-2) + return jvp_sign, jvp_logdet +defjvp(slogdet, _jvp_slogdet) @_wraps(onp.linalg.det) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index cd29c118f5f0..aa11c5df9233 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -20,6 +20,7 @@ from .. import util from .. import lax from .. import api +from ..api import custom_transforms, defjvp from ..numpy import lax_numpy as jnp from ..numpy.lax_numpy import (_wraps, asarray, _reduction_dims, _constant_like, _promote_args_inexact) @@ -79,26 +80,21 @@ def erfinv(x): return lax.erf_inv(x) -@api.custom_jvp +@_wraps(osp_special.logit, update_doc=False) +@custom_transforms def logit(x): + x = asarray(x) return lax.log(lax.div(x, lax.sub(lax._const(x, 1), x))) -def _logit_jvp(primals, tangents): - (x,), (t,) = primals, tangents - ans = logit(x) - t_out = lax.div(lax.mul(x, lax.sub(lax._const(x, 1), x))) - return ans, t_out -logit.defjvp(_logit_jvp) +defjvp(logit, lambda g, ans, x: g / (x * (1 - x))) -@api.custom_jvp +@_wraps(osp_special.expit, update_doc=False) +@custom_transforms def expit(x): - return 1 / (1 + lax.exp(-x)) -def _expit_jvp(primals, tangents): - (x,), (t,) = primals, tangents - ans = expit(x) - t_out = t * ans * (1 - ans) - return ans, t_out -expit.defjvp(_expit_jvp) + x = asarray(x) + one = lax._const(x, 1) + return lax.div(one, lax.add(one, lax.exp(lax.neg(x)))) +defjvp(expit, lambda g, ans, x: g * ans * (lax._const(ans, 1) - ans)) @_wraps(osp_special.logsumexp) @@ -411,7 +407,7 @@ def _create_polynomial(var, coeffs): return x_nan_replaced -@partial(api.custom_jvp, nondiff_argnums=(1,)) +@custom_transforms def log_ndtr(x, series_order=3): r"""Log Normal distribution function. @@ -512,13 +508,7 @@ def log_ndtr(x, series_order=3): lax.log(_ndtr(lax.max(x, lower_segment))), _log_ndtr_lower(lax.min(x, lower_segment), series_order))) - -def _log_ndtr_jvp(series_order, primals, tangents): - (x,), (t,) = primals, tangents - ans = log_ndtr(x, series_order=series_order) - t_out = lax.mul(t, lax.exp(lax.sub(_norm_logpdf(x), ans))) - return ans, t_out -log_ndtr.defjvp(_log_ndtr_jvp) +defjvp(log_ndtr, lambda g, ans, x: lax.mul(g, lax.exp(lax.sub(_norm_logpdf(x), ans)))) def _log_ndtr_lower(x, series_order): """Asymptotic expansion version of `Log[cdf(x)]`, appropriate for `x<<-1`.""" From 3700fab73ba41c22f8e65d1aceab4e4cb359e788 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 25 Mar 2020 20:24:11 -0700 Subject: [PATCH 0945/1053] remove deprecation warnings --- jax/api.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/jax/api.py b/jax/api.py index a39e1c83cc4a..3a561f9312dd 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1593,7 +1593,6 @@ def __call__(self, *args): def custom_transforms(fun): """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" - warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") name = getattr(fun, '__name__', '') fun_p = core.Primitive(name) @@ -1631,7 +1630,6 @@ def _check_custom_transforms_type(name, fun): def defjvp_all(fun, custom_jvp): """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" - warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") _check_custom_transforms_type("defjvp_all", fun) def custom_transforms_jvp(primals, tangents, **params): @@ -1656,7 +1654,6 @@ def custom_transforms_jvp(primals, tangents, **params): def defjvp(fun, *jvprules): """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" - warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") _check_custom_transforms_type("defjvp", fun) def custom_jvp(primals, tangents): @@ -1668,7 +1665,6 @@ def custom_jvp(primals, tangents): def defvjp_all(fun, custom_vjp): """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" - warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") _check_custom_transforms_type("defvjp_all", fun) def custom_transforms_vjp(*consts_and_args, **params): @@ -1704,7 +1700,6 @@ def vjp_flat(*cts_flat): def defvjp(fun, *vjprules): """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" - warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") _check_custom_transforms_type("defvjp", fun) def custom_vjp(*primals): @@ -1718,7 +1713,6 @@ def vjpfun(ct): def custom_gradient(fun): """This API is deprecated. See jax.custom_jvp and jax.custom_vjp instead.""" - warn("custom_transforms is deprecated and replaced by custom_vjp/custom_jvp.") def primal_fun(*args, **kwargs): ans, _ = fun(*args, **kwargs) From 42dbfd43d4b219dd31a102d63b6fb241acbb2426 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 26 Mar 2020 16:52:29 -0700 Subject: [PATCH 0946/1053] attempt to fix link formatting with nbsphinx --- docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb index fd03a8b94a46..3f5478b2ac3b 100644 --- a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -33,7 +33,7 @@ "\n", "This notebook is about #1. To read instead about #2, see the [notebook on adding primitives](https://jax.readthedocs.io/en/latest/notebooks/How_JAX_primitives_work.html).\n", "\n", - "For an introduction to JAX's automatic differentiation API, see [The Autodiff Cookbook](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html). This notebook assumes some familiarity with [`jax.jvp`](https://jax.readthedocs.io/en/latest/jax.html#jax.jvp) and [`jax.grad`](https://jax.readthedocs.io/en/latest/jax.html#jax.vjp), and the mathematical meaning of JVPs and VJPs." + "For an introduction to JAX's automatic differentiation API, see [The Autodiff Cookbook](https://jax.readthedocs.io/en/latest/notebooks/autodiff_cookbook.html). This notebook assumes some familiarity with [jax.jvp](https://jax.readthedocs.io/en/latest/jax.html#jax.jvp) and [jax.grad](https://jax.readthedocs.io/en/latest/jax.html#jax.grad), and the mathematical meaning of JVPs and VJPs." ] }, { From 0499b8457fce77dbb773c8e8ea599ba544650878 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Thu, 26 Mar 2020 19:07:48 -0700 Subject: [PATCH 0947/1053] Instantiate zeros in _custom_vjp_call_jaxpr_jvp --- jax/custom_derivatives.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py index 685c9dbb54c5..f0eb06b814ec 100644 --- a/jax/custom_derivatives.py +++ b/jax/custom_derivatives.py @@ -518,6 +518,7 @@ def _custom_vjp_call_jaxpr_jvp(primals, tangents, jaxpr, fwd, bwd, out_trees, _, primals = split_list(primals, [num_consts]) zero_tangents, tangents = split_list(tangents, [num_consts]) assert all(t is zero for t in zero_tangents) + tangents = map(ad.instantiate_zeros, primals, tangents) res_and_primals_out = fwd.call_wrapped(*primals) out_tree, res_tree = out_trees() res, primals_out = split_list(res_and_primals_out, [res_tree.num_leaves]) From 24bbd2bc1d4b0427119cbbc9f7cb4ba1dfdbd438 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Fri, 27 Mar 2020 10:50:57 -0700 Subject: [PATCH 0948/1053] Fix pmap_benchmark.py import (#2524) --- benchmarks/pmap_benchmark.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmarks/pmap_benchmark.py b/benchmarks/pmap_benchmark.py index c467af4c8e15..654c2ce2201e 100644 --- a/benchmarks/pmap_benchmark.py +++ b/benchmarks/pmap_benchmark.py @@ -23,9 +23,10 @@ import jax from jax import numpy as np from jax import pmap -from jax.benchmarks import benchmark from jax.config import config +import benchmark + import numpy as onp From f371bfc0bfe927051738d7a8cdca2b4581b45e2f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 27 Mar 2020 21:24:26 -0400 Subject: [PATCH 0949/1053] Improve speed of LU decomposition on TPU. (#2526) Increase the block size, which helps with compilation time. Merge the two row permutations in the outer loop, which means we do row-at-a-time gathers. --- jax/lax_linalg.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/jax/lax_linalg.py b/jax/lax_linalg.py index dd51ecf4a44c..a0c6bcf9cd0c 100644 --- a/jax/lax_linalg.py +++ b/jax/lax_linalg.py @@ -496,7 +496,7 @@ def body(k, state): return lax.fori_loop(0, min(m, n), body, (pivot, perm, a)) -def _lu_blocked(a, block_size=32): +def _lu_blocked(a, block_size=128): """Blocked LU decomposition, as an unrolled loop.""" m, n = a.shape r = min(m, n) @@ -504,13 +504,12 @@ def _lu_blocked(a, block_size=32): for k in range(0, r, block_size): b = min(r - k, block_size) block_pivot, perm, lu_block = _lu_unblocked(a[k:, k:k+b]) - a = ops.index_update(a, ops.index[k:, k:k+b], lu_block) - a = ops.index_update(a, ops.index[k:, :k], a[perm + k, :k]) + a = ops.index_update(a, ops.index[k:, :], a[perm + k, :]) + a = ops.index_update(a, ops.index[k:, k:k+b], lu_block) pivot = ops.index_update(pivot, ops.index[k:k+b], block_pivot + k) if k + b < n: - a = ops.index_update(a, ops.index[k:, k+b:], a[perm + k, k+b:]) a = ops.index_update( a, ops.index[k:k+b, k+b:], triangular_solve(a[k:k+b, k:k+b], a[k:k+b, k+b:], From 415cde5b18299aa8aa7dd35908c42dcaf4ea121e Mon Sep 17 00:00:00 2001 From: Lucas Beyer Date: Sat, 28 Mar 2020 12:32:44 +0100 Subject: [PATCH 0950/1053] Make it more explicit that default JVP assumes |R It's just an attempt to make this implicit assumption, as it only became clear to me after our discussion in chat, not after reading this. --- docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb index 3f5478b2ac3b..9af90d1b56db 100644 --- a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -531,7 +531,7 @@ "colab_type": "text" }, "source": [ - "But mathematically if we think of $f$ as a function on $\\mathbb{R}_+$ then it is differentiable at 0 [Rudin's Principles of Mathematical Analysis Definition 5.1, or Tao's Analysis I 3rd ed. Definition 10.1.1 and Example 10.1.6]. Alternatively, we might say as a convention we want to consider the directional derivative from the right. So there is a sensible value for the Python function `grad(f)` to return at `0.0`, namely `1.0`, even though JAX's machinery for differentiation over reals doesn't produce it.\n", + "But mathematically if we think of $f$ as a function on $\\mathbb{R}_+$ then it is differentiable at 0 [Rudin's Principles of Mathematical Analysis Definition 5.1, or Tao's Analysis I 3rd ed. Definition 10.1.1 and Example 10.1.6]. Alternatively, we might say as a convention we want to consider the directional derivative from the right. So there is a sensible value for the Python function `grad(f)` to return at `0.0`, namely `1.0`. By default, JAX's machinery for differentiation assumes all functions are defined over $\\mathbb{R}$ and thus doesn't produce `1.0` here.\n", "\n", "We can use a custom JVP rule! In particular, we can define the JVP rule in terms of the derivative function $x \\mapsto \\frac{\\sqrt{x} + 2}{2(\\sqrt{x} + 1)^2}$ on $\\mathbb{R}_+$," ] From 1b5978953b01d34f07f252e193a963f9b9a1ebf5 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 28 Mar 2020 11:56:12 -0700 Subject: [PATCH 0951/1053] add ShardedDeviceArray to ad vspace op handlers fixes #2529 (thanks, @dpfau !) --- jax/lax/lax.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 2e05b0b2b1a3..12f5ba8494cd 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1498,9 +1498,10 @@ def zeros_like_array(x): return full_like(x, 0) for t in itertools.chain(dtypes.python_scalar_dtypes.keys(), array_types, - [xla.DeviceArray]): + [xla.DeviceArray, pxla.ShardedDeviceArray]): ad_util.jaxval_adders[t] = add ad_util.jaxval_zeros_likers[xla.DeviceArray] = zeros_like_array +ad_util.jaxval_zeros_likers[pxla.ShardedDeviceArray] = zeros_like_array ### primitives From f99720b70ab615c966ba321fb1a35503be33fca6 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 28 Mar 2020 14:55:58 -0700 Subject: [PATCH 0952/1053] add type annotations to core.py tracing machinery also add .copy() method to core.trace_state global trace state --- jax/core.py | 123 ++++++++++++++++++------------- jax/interpreters/partial_eval.py | 7 +- mypy.ini | 2 + 3 files changed, 78 insertions(+), 54 deletions(-) diff --git a/jax/core.py b/jax/core.py index 970794d9a22c..76e2daf782e0 100644 --- a/jax/core.py +++ b/jax/core.py @@ -274,33 +274,20 @@ def write(v, val): return map(read, jaxpr.outvars) -def full_lower(val): - if isinstance(val, Tracer): - return val.full_lower() - else: - return val - - -def find_top_trace(xs): - try: - top_trace = max((x._trace for x in xs if isinstance(x, Tracer)), - key=attrgetter('level')) - except ValueError: - return None - else: - return type(top_trace)(top_trace.master, cur_sublevel()) - - # -------------------- tracing -------------------- -class Trace(object): - def __init__(self, master, sublevel): +class Trace: + master: 'MasterTrace' + level: int + sublevel: 'Sublevel' + + def __init__(self, master: 'MasterTrace', sublevel: 'Sublevel') -> None: self.master = master self.level = master.level self.sublevel = sublevel - def full_raise(self, val): + def full_raise(self, val) -> 'Tracer': if not isinstance(val, Tracer): return self.pure(val) level = self.level @@ -311,18 +298,19 @@ def full_raise(self, val): elif val._trace.sublevel < sublevel: return self.sublift(val) else: - escaped_tracer_error( - "Can't lift sublevels {} to {}".format(val._trace.sublevel, sublevel)) + raise escaped_tracer_error("Can't lift sublevels {} to {}" + .format(val._trace.sublevel, sublevel)) elif val._trace.level < level: if val._trace.sublevel > sublevel: - escaped_tracer_error( - "Incompatible sublevel: {}, {}".format(val._trace, (level, sublevel))) + raise escaped_tracer_error("Incompatible sublevel: {}, {}" + .format(val._trace, (level, sublevel))) return self.lift(val) elif val._trace.level > level: - escaped_tracer_error( - "Can't lift level {} to {}".format(val, self)) + raise escaped_tracer_error("Can't lift level {} to {}" + .format(val, self)) else: # val._trace.level == self.level: - escaped_tracer_error("Different traces at same level: {}, {}".format(val, self)) + raise escaped_tracer_error("Different traces at same level: {}, {}" + .format(val, self)) def pure(self, val): raise NotImplementedError("must override") @@ -342,13 +330,14 @@ def __repr__(self): def escaped_tracer_error(detail): msg = ("Encountered an unexpected tracer. Perhaps this tracer escaped " - "through global state from a previously traced function.\n" - "The functions being transformed should not save traced values to " - "global state.\nDetails: {}.") - raise UnexpectedTracerError(msg.format(detail)) + "through global state from a previously traced function.\n" + "The functions being transformed should not save traced values to " + "global state.\nDetails: {}.") + return UnexpectedTracerError(msg.format(detail)) class UnexpectedTracerError(Exception): pass + class Tracer(object): __array_priority__ = 1000 __slots__ = ['_trace', '__weakref__'] @@ -452,74 +441,91 @@ def __copy__(self): def __deepcopy__(self, unused_memo): return self - # these can be used to set up forwarding of properties and instance methods from # Tracer instances to the underlying avals aval_property = namedtuple("aval_property", ["fget"]) aval_method = namedtuple("aval_method", ["fun"]) -class MasterTrace(object): - def __init__(self, level, trace_type): +class MasterTrace: + level: int + trace_type: Type[Trace] + + def __init__(self, level, trace_type) -> None: self.level = level self.trace_type = trace_type - def __repr__(self): + def __repr__(self) -> str: return "MasterTrace({},{})".format(self.level, self.trace_type.__name__) - def __hash__(self): + def __hash__(self) -> int: return hash((self.level, self.trace_type)) - def __eq__(self, other): - return self.level == other.level and self.trace_type == other.trace_type + def __eq__(self, other: object) -> bool: + return (isinstance(other, MasterTrace) and + self.level == other.level and self.trace_type == other.trace_type) +class TraceStack: + upward: List[MasterTrace] + downward: List[MasterTrace] -class TraceStack(object): def __init__(self): self.upward = [] self.downward = [] - def next_level(self, bottom): + def next_level(self, bottom: bool) -> int: if bottom: return - (len(self.downward) + 1) else: return len(self.upward) - def push(self, val, bottom): + def push(self, master_trace: MasterTrace, bottom: bool) -> None: if bottom: - self.downward.append(val) + self.downward.append(master_trace) else: - self.upward.append(val) + self.upward.append(master_trace) - def pop(self, bottom): + def pop(self, bottom: bool) -> None: if bottom: self.downward.pop() else: self.upward.pop() - def __repr__(self): + def __repr__(self) -> str: return 'Trace stack\n{} ---\n{}'.format( map(' {}\n'.format, self.upward[::-1]), map(' {}\n'.format, self.downward)) + def copy(self): + new = TraceStack() + new.upward = self.upward[:] + new.downward = self.downward[:] + return new class Sublevel(int): pass + # The global state of the tracer is accessed by a thread-local object. # This allows concurrent tracing in separate threads; passing traced objects # between threads is forbidden. class TraceState(threading.local): - def __init__(self): + trace_stack: TraceStack + substack: List[Sublevel] + + def __init__(self) -> None: self.trace_stack = TraceStack() self.substack = [Sublevel(0)] + def copy(self): + new = TraceState() + new.trace_stack = self.trace_stack.copy() + new.substack = self.substack[:] + return new trace_state = TraceState() - -def cur_sublevel(): +def cur_sublevel() -> Sublevel: return trace_state.substack[-1] - @contextmanager def new_master(trace_type: Type[Trace], bottom=False) -> Generator[MasterTrace, None, None]: level = trace_state.trace_stack.next_level(bottom) @@ -538,9 +544,8 @@ def new_master(trace_type: Type[Trace], bottom=False) -> Generator[MasterTrace, print(trace_state.trace_stack) raise Exception('Leaked trace {}'.format(t())) - @contextmanager -def new_sublevel(): +def new_sublevel() -> Generator[None, None, None]: sublevel = Sublevel(len(trace_state.substack)) trace_state.substack.append(sublevel) try: @@ -554,6 +559,22 @@ def new_sublevel(): if t() is not None: raise Exception('Leaked sublevel {}'.format(t())) +def full_lower(val): + if isinstance(val, Tracer): + return val.full_lower() + else: + return val + +def find_top_trace(xs): + try: + top_trace = max((x._trace for x in xs if isinstance(x, Tracer)), + key=attrgetter('level')) + except ValueError: + return None + else: + return type(top_trace)(top_trace.master, cur_sublevel()) + + # -------------------- abstract values -------------------- diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index b5ac96507248..20db12316c97 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -285,8 +285,8 @@ def __init__(self, trace, pval, recipe): assert isinstance(pval, PartialVal) pv, const = pval if isinstance(const, Tracer) and const._trace.level >= trace.level: - core.escaped_tracer_error( - "Tracer from a higher level: {} in trace {}".format(const, trace)) + raise core.escaped_tracer_error( + "Tracer from a higher level: {} in trace {}".format(const, trace)) self._trace = trace self.pval = pval self.recipe = recipe @@ -452,7 +452,8 @@ def getconstvar(c): processed_eqn_ids.add(recipe.eqn_id) elif isinstance(recipe, LambdaBinding): if not any(t is in_tracer for in_tracer in in_tracers): - core.escaped_tracer_error("Tracer not among input tracers {}".format(t)) + raise core.escaped_tracer_error( + "Tracer not among input tracers {}".format(t)) assert in_tracers, "Lambda binding with no args" elif isinstance(recipe, FreeVar): env[getvar(t)] = recipe.val diff --git a/mypy.ini b/mypy.ini index ce2c0c8c02ac..bf899cbaa53b 100644 --- a/mypy.ini +++ b/mypy.ini @@ -10,3 +10,5 @@ ignore_missing_imports = True ignore_missing_imports = True [mypy-scipy.*] ignore_missing_imports = True +[mypy-jax.interpreters.autospmd] +ignore_errors = True From 67283a08ecdd3eab03b35355fb819d1dc9c3fcb0 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 28 Mar 2020 13:52:40 -0700 Subject: [PATCH 0953/1053] add new custom_jvp tests from #2500 Co-authored-by: Dougal Maclaurin --- tests/api_test.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/tests/api_test.py b/tests/api_test.py index 5dc7d93ca47d..24a9d8319478 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -2289,6 +2289,76 @@ def foo_jvp(primals, tangents): "respectively."), lambda: api.jvp(f, (np.float32(2.),), (np.float32(1.),))) + def test_multiple_rule_invocations(self): + @jax.custom_jvp + def expit(x): + return 1 / (1 + lax.exp(-x)) + + @expit.defjvp + def _expit_jvp(primals, tangents): + (x,), (t,) = primals, tangents + ans = expit(x) + t_out = t * ans * (1 - ans) + return ans, t_out + + def scanned_fun(c, _): + return [expit(c[0])] + [c[i-1] + c[i] for i in range(1, len(c))], None + + def foo(x): + c, _ = lax.scan(scanned_fun, [x, 0., 0., 0., 0.], None, length=10) + return c[-1] + + # just make sure these don't crash + foo(3.) + grad(foo)(3.) + grad(lambda x: jax.vmap(foo)(x).sum())(np.arange(3.)) + + def test_hard_stuff(self): + arr = np.ones((5, 2, 2)) + api.jit(jax.vmap(np.linalg.det))(arr) # doesn't crash + + def test_hard_stuff2(self): + @jax.custom_jvp + def f(x): + return lax.tie_in(x, onp.zeros(x.shape, x.dtype)) + + @f.defjvp + def f_jvp(primals, tangents): + x, = primals + t, = tangents + return f(x), t + + # don't crash + jax.jit(jax.vmap(f))(np.arange(3.)) + jax.jit(jax.vmap(jax.grad(f)))(np.arange(3.)) + jax.jit(jax.grad(lambda x: jax.vmap(f)(x).sum()))(np.arange(3.)) + jax.grad(lambda x: jax.vmap(f)(x).sum())(np.arange(3.)) + jax.jvp(jax.vmap(f), (np.arange(3.),), (np.ones(3),)) + + def test_hard_stuff3(self): + @jax.custom_jvp + def relu(x): + return np.maximum(x, 0) + + @relu.defjvp + def _relu_jvp(primals, tangents): + x, = primals + t, = tangents + return relu(x), lax.select(x > 0, t, lax.full_like(t, 0)) + + def scanned_fun(c, _): + return [relu(c[0])] + [c[i-1] + c[i] for i in range(1, len(c))], None + + def f(x): + c, _ = lax.scan(scanned_fun, [x, 0., 0., 0., 0.], None, length=10) + return c[-1] + + # don't crash + jax.jit(jax.vmap(f))(np.arange(3.)) + jax.jit(jax.vmap(jax.grad(f)))(np.arange(3.)) + jax.jit(jax.grad(lambda x: jax.vmap(f)(x).sum()))(np.arange(3.)) + jax.grad(lambda x: jax.vmap(f)(x).sum())(np.arange(3.)) + jax.jvp(jax.jit(jax.vmap(f)), (np.arange(3.),), (np.ones(3),)) class CustomVJPTest(jtu.JaxTestCase): From ead80118377579aea33f26e85be6ef2f20063b6f Mon Sep 17 00:00:00 2001 From: David Duvenaud Date: Sun, 29 Mar 2020 16:28:17 -0400 Subject: [PATCH 0954/1053] Added lots of trivial jet rules. Co-Authored-By: jessebett Co-Authored-By: Jacob Kelly --- jax/experimental/jet.py | 102 ++++++++++++++++++++---------- tests/jet_test.py | 133 +++++++++++++++++++++++++--------------- 2 files changed, 151 insertions(+), 84 deletions(-) diff --git a/jax/experimental/jet.py b/jax/experimental/jet.py index f4cd4004048f..3e7ce8d62f46 100644 --- a/jax/experimental/jet.py +++ b/jax/experimental/jet.py @@ -14,16 +14,17 @@ from functools import partial -from collections import Counter import numpy as onp from jax import core -from jax.util import unzip2, prod +from jax.util import unzip2 from jax.tree_util import (register_pytree_node, tree_structure, treedef_is_leaf, tree_flatten, tree_unflatten) import jax.linear_util as lu - +from jax.interpreters import xla +from jax.lax import lax +from jax.lax import lax_fft def jet(fun, primals, series): try: @@ -124,8 +125,33 @@ class ZeroSeries(object): pass register_pytree_node(ZeroSeries, lambda z: ((), None), lambda _, xs: zero_series) +### rule definitions + jet_rules = {} +def defzero(prim): + jet_rules[prim] = partial(zero_prop, prim) + +def zero_prop(prim, primals_in, series_in, **params): + primal_out = prim.bind(*primals_in, **params) + return primal_out, zero_series + +defzero(lax.le_p) +defzero(lax.lt_p) +defzero(lax.gt_p) +defzero(lax.ge_p) +defzero(lax.eq_p) +defzero(lax.ne_p) +defzero(lax.and_p) +defzero(lax.or_p) +defzero(lax.xor_p) +defzero(lax.floor_p) +defzero(lax.ceil_p) +defzero(lax.round_p) +defzero(lax.sign_p) +defzero(lax.stop_gradient_p) + + def deflinear(prim): jet_rules[prim] = partial(linear_prop, prim) @@ -134,14 +160,6 @@ def linear_prop(prim, primals_in, series_in, **params): series_out = [prim.bind(*terms_in, **params) for terms_in in zip(*series_in)] return primal_out, series_out - -### rule definitions - -from jax.lax import lax - -def fact(n): - return lax.exp(lax.lgamma(n+1.)) - deflinear(lax.neg_p) deflinear(lax.real_p) deflinear(lax.complex_p) @@ -159,15 +177,26 @@ def fact(n): deflinear(lax.reduce_sum_p) deflinear(lax.reduce_window_sum_p) deflinear(lax.tie_in_p) +deflinear(lax_fft.fft_p) +deflinear(xla.device_put_p) + + + +### More complicated rules + +def fact(n): + return lax.exp(lax.lgamma(n+1.)) + +def _scale(k, j): + return 1. / (fact(k - j) * fact(j - 1)) def _exp_taylor(primals_in, series_in): x, = primals_in series, = series_in u = [x] + series v = [lax.exp(x)] + [None] * len(series) - def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) for k in range(1,len(v)): - v[k] = fact(k-1) * sum([scale(k, j)* v[k-j] * u[j] for j in range(1, k+1)]) + v[k] = fact(k-1) * sum([_scale(k, j)* v[k-j] * u[j] for j in range(1, k+1)]) primal_out, *series_out = v return primal_out, series_out jet_rules[lax.exp_p] = _exp_taylor @@ -177,9 +206,8 @@ def _log_taylor(primals_in, series_in): series, = series_in u = [x] + series v = [lax.log(x)] + [None] * len(series) - def scale(k, j): return 1. / (fact(k-j) * fact(j-1)) for k in range(1, len(v)): - conv = sum([scale(k, j) * v[j] * u[k-j] for j in range(1, k)]) + conv = sum([_scale(k, j) * v[j] * u[k-j] for j in range(1, k)]) v[k] = (u[k] - fact(k - 1) * conv) / u[0] primal_out, *series_out = v return primal_out, series_out @@ -223,22 +251,30 @@ def _gather_taylor_rule(primals_in, series_in, **params): return primal_out, series_out jet_rules[lax.gather_p] = _gather_taylor_rule -def _reduce_max_taylor_rule(primals_in, series_in, **params): - operand, = primals_in - gs, = series_in - primal_out = lax.reduce_max_p.bind(operand, **params) - axes = params.pop("axes", None) - primal_dtype = gs[0].dtype - shape = [1 if i in axes else d for i, d in enumerate(operand.shape)] - location_indicators = lax.convert_element_type( - lax._eq_meet(operand, lax.reshape(primal_out, shape)), primal_dtype) - counts = lax._reduce_sum(location_indicators, axes) - def _reduce_chooser_taylor_rule(g): - return lax.div(lax._reduce_sum(lax.mul(g, location_indicators), axes), counts) - series_out = [_reduce_chooser_taylor_rule(g) for g in gs] +def _gen_reduce_choose_taylor_rule(chooser_fun): + def chooser_taylor_rule(primals_in, series_in, **params): + operand, = primals_in + gs, = series_in + primal_out = chooser_fun(operand, **params) + axes = params.pop("axes", None) + primal_dtype = gs[0].dtype + shape = [1 if i in axes else d for i, d in enumerate(operand.shape)] + location_indicators = lax.convert_element_type( + lax._eq_meet(operand, lax.reshape(primal_out, shape)), primal_dtype) + counts = lax._reduce_sum(location_indicators, axes) + def _reduce_chooser_taylor_rule(g): + return lax.div(lax._reduce_sum(lax.mul(g, location_indicators), axes), counts) + series_out = [_reduce_chooser_taylor_rule(g) for g in gs] + return primal_out, series_out + return chooser_taylor_rule +jet_rules[lax.reduce_max_p] = _gen_reduce_choose_taylor_rule(lax.reduce_max_p.bind) +jet_rules[lax.reduce_min_p] = _gen_reduce_choose_taylor_rule(lax.reduce_min_p.bind) + +def _abs_taylor_rule(x, series_in, **params): + x, = x + primal_out = lax.abs_p.bind(x, **params) + negs = lax.select(lax.lt(x, 0.0), lax.full_like(x, -1), lax.full_like(x, 1.0)) + fix_sign = lambda y: negs * y + series_out = [fix_sign(*terms_in, **params) for terms_in in zip(*series_in)] return primal_out, series_out -jet_rules[lax.reduce_max_p] = _reduce_max_taylor_rule - - -from jax.interpreters import xla -deflinear(xla.device_put_p) +jet_rules[lax.abs_p] = _abs_taylor_rule diff --git a/tests/jet_test.py b/tests/jet_test.py index b6374786d63b..853eb2608246 100644 --- a/tests/jet_test.py +++ b/tests/jet_test.py @@ -13,28 +13,25 @@ # limitations under the License. -from functools import partial, reduce -import operator as op -from unittest import SkipTest +from functools import reduce from absl.testing import absltest -from absl.testing import parameterized import numpy as onp -from jax import core from jax import test_util as jtu - import jax.numpy as np from jax import random -from jax import jacobian, jit +from jax import jacfwd from jax.experimental import stax -from jax.experimental.jet import jet, fact +from jax.experimental.jet import jet, fact, zero_series +from jax.tree_util import tree_map +from jax import lax from jax.config import config config.parse_flags_with_absl() - def jvp_taylor(fun, primals, series): + # Computes the Taylor series the slow way, with nested jvp. order, = set(map(len, series)) def composition(eps): taylor_terms = [sum([eps ** (i+1) * terms[i] / fact(i + 1) @@ -42,7 +39,7 @@ def composition(eps): nudged_args = [x + t for x, t in zip(primals, taylor_terms)] return fun(*nudged_args) primal_out = fun(*primals) - terms_out = [repeated(jacobian, i+1)(composition)(0.) for i in range(order)] + terms_out = [repeated(jacfwd, i+1)(composition)(0.) for i in range(order)] return primal_out, terms_out def repeated(f, n): @@ -50,6 +47,9 @@ def rfun(p): return reduce(lambda x, _: f(x), range(n), p) return rfun +def transform(lims, x): + return x * (lims[1] - lims[0]) + lims[0] + class JetTest(jtu.JaxTestCase): def check_jet(self, fun, primals, series, atol=1e-5, rtol=1e-5, @@ -58,24 +58,13 @@ def check_jet(self, fun, primals, series, atol=1e-5, rtol=1e-5, expected_y, expected_terms = jvp_taylor(fun, primals, series) self.assertAllClose(y, expected_y, atol=atol, rtol=rtol, check_dtypes=check_dtypes) - self.assertAllClose(terms, expected_terms, atol=atol, rtol=rtol, - check_dtypes=check_dtypes) - @jtu.skip_on_devices("tpu") - def test_exp(self): - order, dim = 4, 3 - rng = onp.random.RandomState(0) - primal_in = rng.randn(dim) - terms_in = [rng.randn(dim) for _ in range(order)] - self.check_jet(np.exp, (primal_in,), (terms_in,), atol=1e-4, rtol=1e-4) + # TODO(duvenaud): Lower zero_series to actual zeros automatically. + if terms == zero_series: + terms = tree_map(np.zeros_like, expected_terms) - @jtu.skip_on_devices("tpu") - def test_log(self): - order, dim = 4, 3 - rng = onp.random.RandomState(0) - primal_in = np.exp(rng.randn(dim)) - terms_in = [rng.randn(dim) for _ in range(order)] - self.check_jet(np.log, (primal_in,), (terms_in,), atol=1e-4, rtol=1e-4) + self.assertAllClose(terms, expected_terms, atol=atol, rtol=rtol, + check_dtypes=check_dtypes) @jtu.skip_on_devices("tpu") def test_dot(self): @@ -95,6 +84,7 @@ def test_conv(self): order = 3 input_shape = (1, 5, 5, 1) key = random.PRNGKey(0) + # TODO(duvenaud): Check all types of padding init_fun, apply_fun = stax.Conv(3, (2, 2), padding='VALID') _, (W, b) = init_fun(key, input_shape) @@ -114,38 +104,79 @@ def f(W, b, x): self.check_jet(f, primals, series_in, check_dtypes=False) - @jtu.skip_on_devices("tpu") - def test_div(self): - primals = 1., 5. - order = 4 + def unary_check(self, fun, lims=[-2, 2], order=3): + dims = 2, 3 rng = onp.random.RandomState(0) - series_in = ([rng.randn() for _ in range(order)], [rng.randn() for _ in range(order)]) - self.check_jet(op.truediv, primals, series_in) + primal_in = transform(lims, rng.rand(*dims)) + terms_in = [rng.randn(*dims) for _ in range(order)] + self.check_jet(fun, (primal_in,), (terms_in,), atol=1e-4, rtol=1e-4) - @jtu.skip_on_devices("tpu") - def test_sub(self): - primals = 1., 5. - order = 4 + def binary_check(self, fun, lims=[-2, 2], order=3): + dims = 2, 3 rng = onp.random.RandomState(0) - series_in = ([rng.randn() for _ in range(order)], [rng.randn() for _ in range(order)]) - self.check_jet(op.sub, primals, series_in) + primal_in = (transform(lims, rng.rand(*dims)), + transform(lims, rng.rand(*dims))) + series_in = ([rng.randn(*dims) for _ in range(order)], + [rng.randn(*dims) for _ in range(order)]) + self.check_jet(fun, primal_in, series_in, atol=1e-4, rtol=1e-4) @jtu.skip_on_devices("tpu") - def test_gather(self): - order, dim = 4, 3 - rng = onp.random.RandomState(0) - x = rng.randn(dim) - terms_in = [rng.randn(dim) for _ in range(order)] - self.check_jet(lambda x: x[1:], (x,), (terms_in,)) + def test_exp(self): self.unary_check(np.exp) + @jtu.skip_on_devices("tpu") + def test_neg(self): self.unary_check(np.negative) + @jtu.skip_on_devices("tpu") + def test_floor(self): self.unary_check(np.floor) + @jtu.skip_on_devices("tpu") + def test_ceil(self): self.unary_check(np.ceil) + @jtu.skip_on_devices("tpu") + def test_round(self): self.unary_check(np.round) + @jtu.skip_on_devices("tpu") + def test_sign(self): self.unary_check(np.sign) + @jtu.skip_on_devices("tpu") + def test_log(self): self.unary_check(np.log, lims=[0.8, 4.0]) + @jtu.skip_on_devices("tpu") + def test_gather(self): self.unary_check(lambda x: x[1:]) + @jtu.skip_on_devices("tpu") + def test_reduce_max(self): self.unary_check(lambda x: x.max(axis=1)) + @jtu.skip_on_devices("tpu") + def test_reduce_min(self): self.unary_check(lambda x: x.min(axis=1)) + @jtu.skip_on_devices("tpu") + def test_all_max(self): self.unary_check(np.max) + @jtu.skip_on_devices("tpu") + def test_all_min(self): self.unary_check(np.min) + @jtu.skip_on_devices("tpu") + def test_stopgrad(self): self.unary_check(lax.stop_gradient) + @jtu.skip_on_devices("tpu") + def test_abs(self): self.unary_check(np.abs) + @jtu.skip_on_devices("tpu") + def test_fft(self): self.unary_check(np.fft.fft) @jtu.skip_on_devices("tpu") - def test_reduce_max(self): - dim1, dim2 = 3, 5 - order = 6 - rng = onp.random.RandomState(0) - x = rng.randn(dim1, dim2) - terms_in = [rng.randn(dim1, dim2) for _ in range(order)] - self.check_jet(lambda x: x.max(axis=1), (x,), (terms_in,)) + def test_div(self): self.binary_check(lambda x, y: x / y, lims=[0.8, 4.0]) + @jtu.skip_on_devices("tpu") + def test_sub(self): self.binary_check(lambda x, y: x - y) + @jtu.skip_on_devices("tpu") + def test_add(self): self.binary_check(lambda x, y: x + y) + @jtu.skip_on_devices("tpu") + def test_mul(self): self.binary_check(lambda x, y: x * y) + @jtu.skip_on_devices("tpu") + def test_le(self): self.binary_check(lambda x, y: x <= y) + @jtu.skip_on_devices("tpu") + def test_gt(self): self.binary_check(lambda x, y: x > y) + @jtu.skip_on_devices("tpu") + def test_lt(self): self.binary_check(lambda x, y: x < y) + @jtu.skip_on_devices("tpu") + def test_ge(self): self.binary_check(lambda x, y: x >= y) + @jtu.skip_on_devices("tpu") + def test_eq(self): self.binary_check(lambda x, y: x == y) + @jtu.skip_on_devices("tpu") + def test_ne(self): self.binary_check(lambda x, y: x != y) + @jtu.skip_on_devices("tpu") + def test_and(self): self.binary_check(lambda x, y: np.logical_and(x, y)) + @jtu.skip_on_devices("tpu") + def test_or(self): self.binary_check(lambda x, y: np.logical_or(x, y)) + @jtu.skip_on_devices("tpu") + def test_xor(self): self.binary_check(lambda x, y: np.logical_xor(x, y)) if __name__ == '__main__': From fcc1e76c5adda49e7027b901c0e3443a648a0332 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 29 Mar 2020 13:56:26 -0700 Subject: [PATCH 0955/1053] add docstring / reference doc link for axis_index fixes #2534 --- docs/jax.lax.rst | 1 + jax/interpreters/pxla.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/docs/jax.lax.rst b/docs/jax.lax.rst index 4c2caf3d588a..dcb333701654 100644 --- a/docs/jax.lax.rst +++ b/docs/jax.lax.rst @@ -163,3 +163,4 @@ Parallelism support is experimental. pmin ppermute pswapaxes + axis_index diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index c71811c58bf1..5419ca1e8cc2 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -248,6 +248,43 @@ def apply_parallel_primitive(prim, *args, **params): def axis_index(axis_name): + """Return the index along the pmapped axis ``axis_name``. + + Args: + axis_name: hashable Python object used to name the pmapped axis (see the + ``pmap`` docstring for more details). + + Returns: + An integer representing the index. + + For example, with 8 XLA devices available: + + >>> from functools import partial + >>> @partial(pmap, axis_name='i') + ... def f(_): + ... return lax.axis_index('i') + ... + >>> f(np.zeros(4)) + ShardedDeviceArray([0, 1, 2, 3], dtype=int32) + >>> f(np.zeros(8)) + ShardedDeviceArray([0, 1, 2, 3, 4, 5, 6, 7], dtype=int32) + >>> @partial(pmap, axis_name='i') + ... @partial(pmap, axis_name='j') + ... def f(_): + ... return lax.axis_index('i'), lax.axis_index('j') + ... + >>> x, y = f(np.zeros((4, 2))) + >>> print(x) + [[0 0] + [1 1] + [2 2] + [3 3]] + >>> print(y) + [[0 1] + [0 1] + [0 1] + [0 1]] + """ dynamic_axis_env = _thread_local_state.dynamic_axis_env frame = dynamic_axis_env[axis_name] sizes = dynamic_axis_env.sizes[:dynamic_axis_env.index(frame)+1] From 1762a8653137e29825c45afbcea39d8188a5a6a4 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 29 Mar 2020 14:45:17 -0700 Subject: [PATCH 0956/1053] workaround for pmap output PRED arrays on cpu/gpu --- jax/api.py | 1 + jax/interpreters/pxla.py | 25 +++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/jax/api.py b/jax/api.py index 3a561f9312dd..816f3bb0879b 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1640,6 +1640,7 @@ def custom_transforms_jvp(primals, tangents, **params): msg = ("Detected differentiation with respect to closed-over values with " "custom JVP rule, which isn't supported.") raise ValueError(msg) + args_dot_flat = map(ad.instantiate_zeros, args_flat, args_dot_flat) args = tree_unflatten(in_tree, args_flat) args_dot = tree_unflatten(in_tree, args_dot_flat) out, out_dot = custom_jvp(args, args_dot) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 5419ca1e8cc2..315b6c3d564a 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -703,7 +703,7 @@ def _pmap_translation_rule(c, axis_env, c, call_jaxpr, backend, new_env, (), extend_name_stack(name_stack, wrap_name(name, 'pmap')), *in_nodes_sharded) out_avals = [v.aval for v in call_jaxpr.outvars] - outs = [_xla_unshard(c, aval, new_env, shard) + outs = [_xla_unshard(c, aval, new_env, shard, backend=backend) for aval, shard in zip(out_avals, sharded_outs)] return c.Tuple(*outs) @@ -723,17 +723,30 @@ def _xla_shard(c, aval, axis_env, x): raise TypeError((aval, c.GetShape(x))) # TODO(b/110096942): more efficient gather -def _xla_unshard(c, aval, axis_env, x): +def _xla_unshard(c, aval, axis_env, x, backend): if aval is core.abstract_unit: return x elif isinstance(aval, ShapedArray): - dims = list(c.GetShape(x).dimensions()) - padded = c.Broadcast(c.Constant(onp.array(0, aval.dtype)), - [axis_env.sizes[-1]] + dims) + # TODO(mattjj): remove this logic when AllReduce PRED supported on CPU / GPU + convert_bool = (onp.issubdtype(aval.dtype, onp.bool_) + and xb.get_backend(backend).platform in ('cpu', 'gpu')) + if convert_bool: + x = c.ConvertElementType(x, xb.dtype_to_etype(onp.float32)) + + xla_shape = c.GetShape(x) + dims = list(xla_shape.dimensions()) + padded = c.Broadcast(c.Constant(onp.array(0, xla_shape.numpy_dtype())), + [axis_env.sizes[-1]] + dims) zero = c.Constant(onp.zeros((), dtype=onp.uint32)) idxs = [_unravel_index(c, axis_env)] + [zero] * len(dims) padded = c.DynamicUpdateSlice(padded, c.Reshape(x, None, [1] + dims), idxs) - return c.CrossReplicaSum(padded, xla.axis_groups(axis_env, axis_env.names[-1])) + out = c.CrossReplicaSum(padded, xla.axis_groups(axis_env, axis_env.names[-1])) + + # TODO(mattjj): remove this logic when AllReduce PRED supported on CPU / GPU + if convert_bool: + nonzero = c.Ne(out, c.Constant(onp.array(0, dtype=onp.float32))) + out = c.ConvertElementType(nonzero, xb.dtype_to_etype(onp.bool_)) + return out else: raise TypeError((aval, c.GetShape(x))) From 6193e5e4dc42b42783ab2363d8e2f34249bfe3cb Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sat, 28 Mar 2020 14:15:46 -0700 Subject: [PATCH 0957/1053] revamp custom_jvp/vjp implementation to fix bugs Co-authored-by: Dougal Maclaurin --- design_notes/custom_derivatives.md | 65 ++--- images/custom_jvp_schematic.png | Bin 182949 -> 0 bytes jax/api.py | 2 +- jax/core.py | 9 + jax/custom_derivatives.py | 393 ++++++++++++++--------------- jax/interpreters/ad.py | 62 ++++- jax/interpreters/batching.py | 57 ++++- jax/interpreters/partial_eval.py | 16 +- jax/interpreters/pxla.py | 2 +- jax/interpreters/xla.py | 2 +- jax/lax/lax_control_flow.py | 5 +- jax/linear_util.py | 21 ++ tests/api_test.py | 25 +- 13 files changed, 373 insertions(+), 286 deletions(-) delete mode 100644 images/custom_jvp_schematic.png diff --git a/design_notes/custom_derivatives.md b/design_notes/custom_derivatives.md index 41fb6df644d3..1f01f0b4da73 100644 --- a/design_notes/custom_derivatives.md +++ b/design_notes/custom_derivatives.md @@ -317,47 +317,25 @@ rely on the ability to round-trip to a jaxpr and back to a Python callable while preserving semantics. That must mean preserving custom differentiation rule semantics too. -The solution is for the partial evaluation rule for `custom_jvp_call` to stage -out an initial-style call-like primitive that can be still be processed -correctly by `eval`, `jit`, `jvp` and/or `vmap` transformations. That means a -staged-out call-like primitive that carries with it enough information about `f` -and `f_jvp` to support all these transformations. We refer to this additional -primitive as `custom_jvp_call_jaxpr`. It is similar to `custom_jvp_call` except -it’s parameterized by a jaxpr for the primal function f rather than a Python -callable. The jaxpr for `f` is formed up-front before binding the primitive, -similar to other initial-style primitives. - -(Three footnotes. First, we could refer to both the Python trace-time primitive -`custom_jvp_call`, which takes a wrapped Python callable as an argument, and the -jaxpr language primitive `custom_jvp_call_jaxpr`, which has a jaxpr as a -parameter, as simply "`custom_jvp_call`", analogously to how we refer to both -versions of `xla_call` as just "`xla_call`", but here we chose to use different -names to make the distinction more explicit. Second, for implementation -simplicity, both `custom_jvp_call` and `custom_jvp_call_jaxpr` have partial eval -rules that don’t do any nontrivial partial evaluation and instead stage -everything out. That doesn’t constrain automatic differentiation because -`custom_jvp_call_jaxpr`'s JVP rule doesn’t itself bind a call primitive but -instead just invokes the custom JVP rule callable. Third, we don’t form a jaxpr -for the JVP rule callable up-front, and instead keep it as a Python callable, to -avoid a recursion problem: in the common case that the JVP rule itself calls the -underlying custom-JVP function, we can’t trace the JVP rule up-front without -getting an infinite recursion. By not forming a jaxpr, we’re solving this in the -same way we always do: rules are Python callbacks invoked when a transformation -is applied, not part of the primitive, and though the rule here is associated -directly with the primitive, rather than being in a global dict, that’s just an -implementation detail.) +The solution is to use a bit of dynamic scoping: when we're staging out to a +jaxpr for an initial-style primitive, like those in lax_control_flow.py, we set +a bit on the global trace state. When that bit is set, instead of using the +final-style `custom_jvp_call` primitive, we use an initial-style +`custom_jvp_call_jaxpr` primitive, and trace the functions `f` and `f_jvp` to +jaxprs up-front to make initial-style processing easier. The +`custom_jvp_call_jaxpr` primitive is otherwise similar to the final-style +version. + +(Footnote: while morally we form jaxprs for both `f` and `f_jvp` before binding +`custom_jvp_call_jaxpr`, we need to delay the formation of the jaxpr of `f_jvp` +because it may call the custom-JVP function and thus eager processing would lead +to an infinite recursion. We delay that jaxpr formation in a thunk.) If we gave up on [the Python flexibility problem](the-python-flexibility-problem), we could get away with only having `custom_jvp_call_jaxpr` and not having the separate Python-level primitive -`custom_jvp_call`. One way to view the relationship between the two primitives -is in this schematic: +`custom_jvp_call`. -
    - -
    ## API @@ -456,17 +434,4 @@ There are some other bells and whistles to the API: custom backward-pass function, and as a primitive it only has a transpose rule. * This mechanism is described more in [#636](https://github.com/google/jax/issues/636). -* Added a variant of `transformation_with_aux` called - `transformation_with_equal_aux` to allow repeated stores of equal values due - to running the same function multiple times. - * The custom rules functions, like `f_jvp` and `f_fwd`/`f_bwd` in the examples - above, are not “linear” in the sense of linear_util.py when used in - `custom_jvp_call_jaxpr` and `custom_vjp_call_jaxpr`, respectively. They may be - invoked multiple times as a jaxpr is processed in initial style. It’s - usually fine for rules to be invoked multiple times, but these rules must - plumb aux data out to the api.py-level caller, namely output pytree aux - data. - * (Recall from a footnote above that we can’t solve this by forming jaxprs for - the rules up-front because that can lead to infinite recursion.) - - +* To prevent diff --git a/images/custom_jvp_schematic.png b/images/custom_jvp_schematic.png deleted file mode 100644 index a06f0800ed8803387e46d19dac6cf6c883cd2291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182949 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%0D(f1OS^Wqa8%QX$E55KG7@^Lv>C_vDS|bj|J~u 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 diff --git a/jax/api.py b/jax/api.py index 3a561f9312dd..f0142d64b01d 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1406,7 +1406,7 @@ def jaxpr_maker(*args, **kwargs): jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) in_pvals = map(pv_like, jax_args) jaxpr, out_pvals, consts = pe.trace_to_jaxpr( - jaxtree_fun, in_pvals, instantiate=True, stage_out_calls=True) + jaxtree_fun, in_pvals, instantiate=True, stage_out=True) out_avals = map(raise_to_shaped, unzip2(out_pvals)[0]) in_avals = tuple(raise_to_shaped(in_aval) for in_aval, _ in in_pvals) typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) diff --git a/jax/core.py b/jax/core.py index 76e2daf782e0..af02fdb1642a 100644 --- a/jax/core.py +++ b/jax/core.py @@ -511,15 +511,18 @@ class Sublevel(int): pass class TraceState(threading.local): trace_stack: TraceStack substack: List[Sublevel] + initial_style: bool def __init__(self) -> None: self.trace_stack = TraceStack() self.substack = [Sublevel(0)] + self.initial_style = False def copy(self): new = TraceState() new.trace_stack = self.trace_stack.copy() new.substack = self.substack[:] + new.initial_style = self.initial_style return new trace_state = TraceState() @@ -574,6 +577,12 @@ def find_top_trace(xs): else: return type(top_trace)(top_trace.master, cur_sublevel()) +@contextmanager +def initial_style_staging(): + prev, trace_state.initial_style = trace_state.initial_style, True + yield + trace_state.initial_style = prev + # -------------------- abstract values -------------------- diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py index f0eb06b814ec..fdf6e51597f6 100644 --- a/jax/custom_derivatives.py +++ b/jax/custom_derivatives.py @@ -16,6 +16,7 @@ from functools import partial, update_wrapper import inspect import itertools as it +import operator as op from . import core from . import linear_util as lu @@ -28,6 +29,7 @@ from .interpreters import ad from .interpreters import batching from .interpreters import xla +from .interpreters.batching import not_mapped, batch_jaxpr map = safe_map zip = safe_zip @@ -43,16 +45,6 @@ def _resolve_kwargs(fun, args, kwargs): else: return ba.args -def _initial_style_jaxpr(fun, in_avals): - in_pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] - jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=True, - stage_out_calls=True) - out_avals = map(raise_to_shaped, unzip2(out_pvals)[0]) - const_avals = [raise_to_shaped(core.get_aval(c)) for c in consts] - typed_jaxpr = core.TypedJaxpr(pe.convert_constvars_jaxpr(jaxpr), - (), const_avals + in_avals, out_avals) - return typed_jaxpr, consts - def _add_args(f, extra_args, left): return _add_args_(f, tuple(map(wrap_hashably, extra_args)), left) @@ -62,23 +54,27 @@ def _add_args_(extra_args, left, *args, **kwargs): args = (extra_args + args) if left else (args + extra_args) yield (yield args, kwargs) -@curry -def transformation_with_equal_aux(gen, fun: lu.WrappedFun, *gen_static_args): - out_store = StoreEqualValues() - out_thunk = lambda: out_store.val - return fun.wrap(gen, gen_static_args, out_store), out_thunk - -class StoreEqualValues(lu.Store): - """A Store that allows storing equal values multiple times.""" - def store(self, val): - if self._val is not lu._EMPTY_STORE_VALUE: +def _memoize(thunk): + cell = [] + saved_state = core.trace_state.copy() + def memoized(): + if not cell: + prev_state, core.trace_state = core.trace_state, saved_state try: - same = self._val == val - except: - same = False - if not same: - raise lu.StoreException("Store occupied") - self._val = val + cell.append(thunk()) + finally: + core.trace_state = prev_state + return cell[0] + return memoized + +def _initial_style_jaxpr(fun, in_avals): + in_pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] + jaxpr, out_pvals, consts = pe.trace_to_jaxpr(fun, in_pvals, instantiate=True, + bottom=True, stage_out=False) + assert not any(isinstance(c, core.Tracer) for c in consts) + out_avals = map(raise_to_shaped, unzip2(out_pvals)[0]) + typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) + return typed_jaxpr ### JVPs @@ -158,7 +154,7 @@ def f_jvp(primals, tangents): def __call__(self, *args, **kwargs): if not self.jvp: msg = "No JVP defined for custom_jvp function {} using defjvp." - raise AttributeError(msg.format(self.__name__)) from None + raise AttributeError(msg.format(self.__name__)) args = _resolve_kwargs(self.fun, args, kwargs) if self.nondiff_argnums: dyn_argnums = [i for i in range(len(args)) if i not in self.nondiff_argnums] @@ -171,23 +167,31 @@ def __call__(self, *args, **kwargs): args_flat, in_tree = tree_flatten(dyn_args) flat_fun, out_tree1 = flatten_fun_nokwargs(f_, in_tree) flat_jvp, out_tree2 = _flatten_jvp(jvp, in_tree) - out_flat = custom_jvp_call(flat_fun, *args_flat, jvp=flat_jvp) - try: out_tree = out_tree1() - except lu.StoreException: out_tree = out_tree2() + if core.trace_state.initial_style: + out_flat = custom_jvp_call_jaxpr(flat_fun, flat_jvp, *args_flat) + out_tree = out_tree1() + else: + out_flat = custom_jvp_call(flat_fun, flat_jvp, *args_flat) + _, out_tree = lu.merge_linear_aux(out_tree1, out_tree2) return tree_unflatten(out_tree, out_flat) -@transformation_with_equal_aux +@lu.transformation_with_aux def _flatten_jvp(in_tree, *args): primals_in, tangents_in = split_list(args, [len(args) // 2]) py_primals = tree_unflatten(in_tree, primals_in) py_tangents = tree_unflatten(in_tree, tangents_in) - py_primals_out, py_tangents_out = yield (py_primals, py_tangents), {} + pair_out = yield (py_primals, py_tangents), {} + if not isinstance(pair_out, (list, tuple)) and len(pair_out) == 2: + msg = ("Custom JVP rule must produce a pair (list or tuple of length two) " + "representing primal and tangent outputs, got {}.") + raise TypeError(msg.format(pair_out)) + py_primals_out, py_tangents_out = pair_out primals_out, out_tree = tree_flatten(py_primals_out) tangents_out, out_tree2 = tree_flatten(py_tangents_out) if out_tree != out_tree2: msg = ("Custom JVP rule must produce primal and tangent outputs with equal " "container (pytree) structures, but got {} and {} respectively.") - raise TypeError(msg.format(out_tree, out_tree2)) from None + raise TypeError(msg.format(out_tree, out_tree2)) primal_avals_out = [raise_to_shaped(core.get_aval(x)) for x in primals_out] tangent_avals_out = [raise_to_shaped(core.get_aval(t)) for t in tangents_out] if primal_avals_out != tangent_avals_out: @@ -205,109 +209,92 @@ def _flatten_jvp(in_tree, *args): raise TypeError(msg.format('\n'.join(disagreements))) yield primals_out + tangents_out, out_tree -def _custom_deriv_call_bind(primitive, f, *args, **params): +def _custom_jvp_call_bind(prim, fun, jvp, *args): top_trace = core.find_top_trace(args) level = (core.trace_state.trace_stack.next_level(True) if top_trace is None else top_trace.level) if top_trace is None: with core.new_sublevel(): - return primitive.impl(f, *args, **params) + outs = prim.impl(fun, jvp, *args) else: tracers = map(top_trace.full_raise, args) - outs = top_trace.process_call(primitive, f, tracers, params) - outs = map(core.full_lower, outs) - return outs + outs = top_trace.process_custom_jvp_call(prim, fun, jvp, tracers) + return map(core.full_lower, outs) -def _custom_call_impl(f, *args, **params): - return f.call_wrapped(*args) +def _custom_jvp_call_impl(fun, _, *args): + return fun.call_wrapped(*args) custom_jvp_call_p = core.Primitive('custom_jvp_call') custom_jvp_call_p.multiple_results = True -custom_jvp_call = partial(_custom_deriv_call_bind, custom_jvp_call_p) +custom_jvp_call = partial(_custom_jvp_call_bind, custom_jvp_call_p) custom_jvp_call_p.def_custom_bind(custom_jvp_call) -custom_jvp_call_p.def_impl(_custom_call_impl) - -def _custom_jvp_call_jvp(trace, call_primitive, fun, tracers, params): - primals_in, tangents_in = unzip2((t.primal, t.tangent) for t in tracers) - primals_in = map(core.full_lower, primals_in) - tangents_in = map(ad.instantiate_zeros, primals_in, tangents_in) - outs = params['jvp'].call_wrapped(*it.chain(primals_in, tangents_in)) - primals_out, tangents_out = split_list(outs, [len(outs) // 2]) - return map(partial(ad.JVPTracer, trace), primals_out, tangents_out) -ad.call_jvp_rules[custom_jvp_call_p] = _custom_jvp_call_jvp - -def _custom_jvp_call_vmap(trace, call_primitive, fun, tracers, params): - in_vals, in_dims = unzip2((t.val, t.batch_dim) for t in tracers) - jvp = params['jvp'] - fun, out_dims = batching.batch_subtrace(fun, trace.master, in_dims) - jvp, out_dims2 = batching.batch_subtrace(jvp, trace.master, in_dims * 2) - out_vals = custom_jvp_call(fun, *in_vals, jvp=jvp) - try: out_dims = out_dims() - except lu.StoreException: out_dims = out_dims2()[:len(out_vals)] - return [batching.BatchTracer(trace, v, d) for v, d in zip(out_vals, out_dims)] -batching.call_batching_rules[custom_jvp_call_p] = _custom_jvp_call_vmap - -def _custom_jvp_call_partial_eval(trace, call_primitive, fun, tracers, params): - return custom_jvp_call_jaxpr(fun, params['jvp'], *tracers) -pe.call_partial_eval_rules[custom_jvp_call_p] = _custom_jvp_call_partial_eval +custom_jvp_call_p.def_impl(_custom_jvp_call_impl) def custom_jvp_call_jaxpr(fun, jvp, *args): in_avals = [raise_to_shaped(core.get_aval(x)) for x in args] - jaxpr, consts = _initial_style_jaxpr(fun, in_avals) - return custom_jvp_call_jaxpr_p.bind(*it.chain(consts, args), jaxpr=jaxpr, - jvp=jvp, num_consts=len(consts)) - -def _custom_call_jaxpr_impl(*args, jaxpr, **kwargs): - del kwargs - return core.jaxpr_as_fun(jaxpr)(*args) - -def _custom_call_jaxpr_abstract_eval(*args, jaxpr, **kwargs): - del kwargs - return jaxpr.out_avals - -def _custom_jvp_call_jaxpr_jvp(primals, tangents, jaxpr, jvp, num_consts): - _, primals = split_list(primals, [num_consts]) - zero_tangents, tangents = split_list(tangents, [num_consts]) - assert all(t is zero for t in zero_tangents) - outs = jvp.call_wrapped(*(primals + tangents)) - primals_out, tangents_out = split_list(outs, [len(outs) // 2]) - return primals_out, tangents_out + fun_jaxpr = _initial_style_jaxpr(fun, in_avals) + jvp_jaxpr_thunk = _memoize(lambda: _initial_style_jaxpr(jvp, in_avals * 2)) + return custom_jvp_call_jaxpr_p.bind(*args, fun_jaxpr=fun_jaxpr, + jvp_jaxpr_thunk=jvp_jaxpr_thunk) -def _custom_jvp_call_jaxpr_vmap(args, in_dims, jaxpr, jvp, num_consts): - size, = {x.shape[d] for x, d in zip(args, in_dims) - if d is not batching.not_mapped} - args = [batching.moveaxis(x, d, 0) if d is not batching.not_mapped and d != 0 - else x for x, d in zip(args, in_dims)] - in_batched = [d is not batching.not_mapped for d in in_dims] - del in_dims - batched_jaxpr, out_batched = batching.batch_jaxpr(jaxpr, size, in_batched, False) - out_dims = [0 if b else batching.not_mapped for b in out_batched] +def _custom_jvp_call_jaxpr_impl(*args, fun_jaxpr, **_): + return core.jaxpr_as_fun(fun_jaxpr)(*args) + +def _custom_jvp_call_jaxpr_abstract_eval(*_, fun_jaxpr, **__): + return fun_jaxpr.out_avals - jvp_in_dims = [0 if b else batching.not_mapped for b in in_batched] * 2 - batched_jvp = batching.batch_fun(jvp, jvp_in_dims, lambda: out_dims * 2) +custom_jvp_call_jaxpr_p = core.Primitive('custom_jvp_call_jaxpr') +custom_jvp_call_jaxpr_p.multiple_results = True +custom_jvp_call_jaxpr_p.def_impl(_custom_jvp_call_jaxpr_impl) +custom_jvp_call_jaxpr_p.def_abstract_eval(_custom_jvp_call_jaxpr_abstract_eval) + +def _custom_jvp_call_jaxpr_jvp(primals, tangents, *, fun_jaxpr, jvp_jaxpr_thunk): + jvp_jaxpr = jvp_jaxpr_thunk() + outs = core.jaxpr_as_fun(jvp_jaxpr)(*(primals + tangents)) + return split_list(outs, [len(outs) // 2]) +ad.primitive_jvps[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_jvp + +def _custom_jvp_call_jaxpr_vmap(args, in_dims, *, fun_jaxpr, jvp_jaxpr_thunk): + size, = {x.shape[d] for x, d in zip(args, in_dims) if d is not not_mapped} + args = [batching.moveaxis(x, d, 0) if d is not not_mapped and d != 0 + else x for x, d in zip(args, in_dims)] + num_out = len(fun_jaxpr.out_avals) + + in_batched = [d is not not_mapped for d in in_dims] + batched_fun_jaxpr, out_batched = batch_jaxpr(fun_jaxpr, size, in_batched, False) + out_dims1 = [0 if b else not_mapped for b in out_batched] + out_dims2 = [] + + @_memoize + def batched_jvp_jaxpr_thunk(): + jvp_jaxpr = jvp_jaxpr_thunk() + _, all_batched = batch_jaxpr(jvp_jaxpr, size, in_batched * 2, False) + primals_batched, tangents_batched = split_list(all_batched, [num_out]) + out_batched = map(op.or_, primals_batched, tangents_batched) + out_dims2.append([0 if b else not_mapped for b in out_batched]) + batched_jvp_jaxpr, _ = batch_jaxpr(jvp_jaxpr, size, in_batched * 2, + out_batched * 2) + return batched_jvp_jaxpr batched_outs = custom_jvp_call_jaxpr_p.bind( - *args, jaxpr=batched_jaxpr, jvp=batched_jvp, num_consts=num_consts) + *args, fun_jaxpr=batched_fun_jaxpr, jvp_jaxpr_thunk=batched_jvp_jaxpr_thunk) + out_dims = out_dims2[0] if out_dims2 else out_dims1 return batched_outs, out_dims +batching.primitive_batchers[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_vmap + +xla.initial_style_translations[custom_jvp_call_jaxpr_p] = \ + xla.lower_fun_initial_style(_custom_jvp_call_jaxpr_impl) # If a (multi)linear function is defined with a custom jvp, then # custom_jvp_call_jaxpr can appear in jaxprs to be transposed. We transpose it # like a core.call. -def _custom_jvp_call_jaxpr_transpose(cts, *args, jaxpr, **kwargs): +def _custom_jvp_call_jaxpr_transpose(cts, *args, fun_jaxpr, jvp_jaxpr_thunk): + del jvp_jaxpr_thunk name = 'custom_jvp_call_jaxpr_linear' - return ad.call_transpose(core.call_p, dict(name=name), jaxpr.jaxpr, + return ad.call_transpose(core.call_p, dict(name=name), fun_jaxpr.jaxpr, tuple(jaxpr.literals) + args, cts) - -custom_jvp_call_jaxpr_p = core.Primitive('custom_jvp_call_jaxpr') -custom_jvp_call_jaxpr_p.multiple_results = True -custom_jvp_call_jaxpr_p.def_impl(_custom_call_jaxpr_impl) -custom_jvp_call_jaxpr_p.def_abstract_eval(_custom_call_jaxpr_abstract_eval) -ad.primitive_jvps[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_jvp ad.primitive_transposes[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_transpose -batching.primitive_batchers[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_vmap -xla.initial_style_translations[custom_jvp_call_jaxpr_p] = \ - xla.lower_fun_initial_style(_custom_call_jaxpr_impl) ### VJPs @@ -417,22 +404,28 @@ def __call__(self, *args, **kwargs): flat_fun, out_tree = flatten_fun_nokwargs(f_, in_tree) flat_fwd, out_trees = _flatten_fwd(fwd, in_tree) flat_bwd = _flatten_bwd(bwd, in_tree, out_trees) - out_flat = custom_vjp_call(flat_fun, *args_flat, fwd=flat_fwd, bwd=flat_bwd, - out_trees=out_trees) - try: out_tree = out_tree() - except lu.StoreException: out_tree, _ = out_trees() + if core.trace_state.initial_style: + out_flat = custom_vjp_call_jaxpr(flat_fun, flat_fwd, flat_bwd, + *args_flat, out_trees=out_trees) + out_tree = out_tree() + else: + out_flat = custom_vjp_call(flat_fun, flat_fwd, flat_bwd, + *args_flat, out_trees=out_trees) + fst, aux = lu.merge_linear_aux(out_tree, out_trees) + out_tree = aux if fst else aux[0] return tree_unflatten(out_tree, out_flat) -custom_vjp_call_p = core.Primitive('custom_vjp_call') -custom_vjp_call_p.multiple_results = True -custom_vjp_call = partial(_custom_deriv_call_bind, custom_vjp_call_p) -custom_vjp_call_p.def_custom_bind(custom_vjp_call) -custom_vjp_call_p.def_impl(_custom_call_impl) - -@transformation_with_equal_aux +@lu.transformation_with_aux def _flatten_fwd(in_tree, *args): py_args = tree_unflatten(in_tree, args) - py_outs, res = yield py_args, {} + pair_out = yield py_args, {} + if not isinstance(pair_out, (list, tuple)) and len(pair_out) == 2: + msg = ("Custom VJP fwd function must produce a pair (list or tuple of " + "length two) representing primal outputs and residuals (values " + "stored from the forward pass for use on the backward pass), " + "got {}.") + raise TypeError(msg.format(pair_out)) + py_outs, res = pair_out out, out_tree = tree_flatten(py_outs) res, res_tree = tree_flatten(res) yield res + out, (out_tree, res_tree) @@ -454,105 +447,91 @@ def _flatten_bwd(in_tree, out_trees, *args): raise TypeError(msg.format(in_tree2, in_tree)) from None yield cts_in -def _custom_vjp_call_jvp(trace, call_primitive, fun, tracers, params): - primals_in, tangents_in = unzip2((t.primal, t.tangent) for t in tracers) - tangents_in = map(ad.instantiate_zeros, primals_in, tangents_in) - fwd, bwd, out_trees = params['fwd'], params['bwd'], params['out_trees'] - res_and_primals_out = fwd.call_wrapped(*map(core.full_lower, primals_in)) - out_tree, res_tree = out_trees() - res, primals_out = split_list(res_and_primals_out, [res_tree.num_leaves]) - avals_out = [raise_to_shaped(core.get_aval(x)) for x in primals_out] - tangents_out = custom_lin_p.bind( - *it.chain(res, tangents_in), num_res=res_tree.num_leaves, bwd=bwd, - avals_out=avals_out) - return map(partial(ad.JVPTracer, trace), primals_out, tangents_out) -ad.call_jvp_rules[custom_vjp_call_p] = _custom_vjp_call_jvp - -def _custom_vjp_call_vmap(trace, call_primitive, fun, tracers, params): - in_vals, in_dims = unzip2((t.val, t.batch_dim) for t in tracers) - fwd, bwd, out_trees = params['fwd'], params['bwd'], params['out_trees'] - fun, out_dims = batching.batch_subtrace(fun, trace.master, in_dims) - fwd, out_dims2 = batching.batch_subtrace(fwd, trace.master, in_dims) - bwd = batching.batch_fun(bwd, out_dims2, in_dims) - out_vals = custom_vjp_call(fun, *in_vals, fwd=fwd, bwd=bwd, - out_trees=out_trees) - try: out_dims = out_dims() - except lu.StoreException: out_dims = out_dims2() - out_dims = out_dims[-len(out_vals) % len(out_dims):] - return [batching.BatchTracer(trace, v, d) for v, d in zip(out_vals, out_dims)] -batching.call_batching_rules[custom_vjp_call_p] = _custom_vjp_call_vmap - -def _custom_vjp_call_partial_eval(trace, call_primitive, fun, tracers, params): - return custom_vjp_call_jaxpr(fun, params['fwd'], params['bwd'], - params['out_trees'], *tracers) -pe.call_partial_eval_rules[custom_vjp_call_p] = _custom_vjp_call_partial_eval - - -custom_lin_p = core.Primitive('custom_lin') -custom_lin_p.def_abstract_eval(lambda *_, avals_out, **__: avals_out) -custom_lin_p.multiple_results = True - -def _raise_custom_vjp_error_on_jvp(*args, **kwargs): - raise TypeError("can't apply forward-mode autodiff (jvp) to a custom_vjp " - "function.") -custom_lin_p.def_impl(_raise_custom_vjp_error_on_jvp) - -def _custom_lin_transpose(cts_out, *invals, num_res, bwd, avals_out): - res, _ = split_list(invals, [num_res]) - cts_out = map(ad.instantiate_zeros_aval, avals_out, cts_out) - cts_in = bwd.call_wrapped(*(res + cts_out)) - cts_in_flat, in_tree = tree_flatten(cts_in) - return [None] * num_res + cts_in_flat -ad.primitive_transposes[custom_lin_p] = _custom_lin_transpose - - -def custom_vjp_call_jaxpr(fun, fwd, bwd, out_trees, *args): +def _custom_vjp_call_bind(prim, fun, fwd, bwd, *args, out_trees): + top_trace = core.find_top_trace(args) + level = (core.trace_state.trace_stack.next_level(True) + if top_trace is None else top_trace.level) + if top_trace is None: + with core.new_sublevel(): + outs = prim.impl(fun, fwd, bwd, *args, out_trees=out_trees) + else: + tracers = map(top_trace.full_raise, args) + outs = top_trace.process_custom_vjp_call(prim, fun, fwd, bwd, tracers, + out_trees=out_trees) + outs = map(core.full_lower, outs) + return map(core.full_lower, outs) + +def _custom_vjp_call_impl(fun, fwd, bwd, *args, out_trees): + del fwd, bwd, out_trees # Unused. + return fun.call_wrapped(*args) + +custom_vjp_call_p = core.Primitive('custom_vjp_call') +custom_vjp_call_p.multiple_results = True +custom_vjp_call = partial(_custom_vjp_call_bind, custom_vjp_call_p) +custom_vjp_call_p.def_custom_bind(custom_vjp_call) +custom_vjp_call_p.def_impl(_custom_vjp_call_impl) + +def custom_vjp_call_jaxpr(fun, fwd, bwd, *args, out_trees): in_avals = [raise_to_shaped(core.get_aval(x)) for x in args] - jaxpr, consts = _initial_style_jaxpr(fun, in_avals) - return custom_vjp_call_jaxpr_p.bind( - *it.chain(consts, args), jaxpr=jaxpr, fwd=fwd, bwd=bwd, - out_trees=out_trees, num_consts=len(consts)) - -def _custom_vjp_call_jaxpr_jvp(primals, tangents, jaxpr, fwd, bwd, out_trees, - num_consts): - _, primals = split_list(primals, [num_consts]) - zero_tangents, tangents = split_list(tangents, [num_consts]) - assert all(t is zero for t in zero_tangents) + fun_jaxpr = _initial_style_jaxpr(fun, in_avals) + fwd_jaxpr_thunk = _memoize(lambda: _initial_style_jaxpr(fwd, in_avals)) + return custom_vjp_call_jaxpr_p.bind(*args, fun_jaxpr=fun_jaxpr, + fwd_jaxpr_thunk=fwd_jaxpr_thunk, bwd=bwd, + out_trees=out_trees) + +def _custom_vjp_call_jaxpr_impl(*args, fun_jaxpr, **_): + return core.jaxpr_as_fun(fun_jaxpr)(*args) + +def _custom_vjp_call_jaxpr_abstract_eval(*_, fun_jaxpr, **__): + return fun_jaxpr.out_avals + +custom_vjp_call_jaxpr_p = core.Primitive('custom_vjp_call_jaxpr') +custom_vjp_call_jaxpr_p.multiple_results = True +custom_vjp_call_jaxpr_p.def_impl(_custom_vjp_call_jaxpr_impl) +custom_vjp_call_jaxpr_p.def_abstract_eval(_custom_vjp_call_jaxpr_abstract_eval) + +def _custom_vjp_call_jaxpr_jvp(primals, tangents, *, fun_jaxpr, fwd_jaxpr_thunk, + bwd, out_trees): tangents = map(ad.instantiate_zeros, primals, tangents) - res_and_primals_out = fwd.call_wrapped(*primals) + fwd_jaxpr = fwd_jaxpr_thunk() out_tree, res_tree = out_trees() + res_and_primals_out = core.jaxpr_as_fun(fwd_jaxpr)(*primals) res, primals_out = split_list(res_and_primals_out, [res_tree.num_leaves]) avals_out = [raise_to_shaped(core.get_aval(x)) for x in primals_out] - tangents_out = custom_lin_p.bind( - *it.chain(res, tangents), num_res=res_tree.num_leaves, bwd=bwd, - avals_out=avals_out) + tangents_out = ad.custom_lin_p.bind( + *res, *tangents, num_res=res_tree.num_leaves, bwd=bwd, avals_out=avals_out) return primals_out, tangents_out +ad.primitive_jvps[custom_vjp_call_jaxpr_p] = _custom_vjp_call_jaxpr_jvp -def _custom_vjp_call_jaxpr_vmap(args, in_dims, jaxpr, fwd, bwd, out_trees, - num_consts): - size, = {x.shape[d] for x, d in zip(args, in_dims) - if d is not batching.not_mapped} - args = [batching.moveaxis(x, d, 0) if d is not batching.not_mapped and d != 0 +def _custom_vjp_call_jaxpr_vmap(args, in_dims, *, fun_jaxpr, fwd_jaxpr_thunk, + bwd, out_trees): + size, = {x.shape[d] for x, d in zip(args, in_dims) if d is not not_mapped} + args = [batching.moveaxis(x, d, 0) if d is not not_mapped and d != 0 else x for x, d in zip(args, in_dims)] - in_batched = [d is not batching.not_mapped for d in in_dims] - del in_dims - batched_jaxpr, out_batched = batching.batch_jaxpr(jaxpr, size, in_batched, False) - out_dims = [0 if b else batching.not_mapped for b in out_batched] - fwd_in_dims = [0 if b else batching.not_mapped for b in in_batched] - batched_fwd, fwd_out_dims = batching.batch_fun2(fwd, fwd_in_dims) + in_batched = [d is not not_mapped for d in in_dims] + batched_fun_jaxpr, out_batched = batch_jaxpr(fun_jaxpr, size, in_batched, False) + out_dims1 = [0 if b else not_mapped for b in out_batched] + out_dims2 = [] + + @_memoize + def batched_fwd_jaxpr_thunk(): + fwd_jaxpr = fwd_jaxpr_thunk() + batched_fwd_jaxpr, out_batched = batch_jaxpr(fwd_jaxpr, size, in_batched, False) + out_dims2.append([0 if b else not_mapped for b in out_batched]) + return batched_fwd_jaxpr + + fwd_in_dims = [0 if b else not_mapped for b in in_batched] + fwd_out_dims = lambda: out_dims2[0] batched_bwd = batching.batch_fun(bwd, fwd_out_dims, fwd_in_dims) batched_outs = custom_vjp_call_jaxpr_p.bind( - *args, jaxpr=batched_jaxpr, fwd=batched_fwd, bwd=batched_bwd, - out_trees=out_trees, num_consts=num_consts) + *args, fun_jaxpr=batched_fun_jaxpr, + fwd_jaxpr_thunk=batched_fwd_jaxpr_thunk, bwd=batched_bwd, + out_trees=out_trees) + out_dims = out_dims2[0] if out_dims2 else out_dims1 return batched_outs, out_dims - -custom_vjp_call_jaxpr_p = core.Primitive('custom_vjp_call_jaxpr') -custom_vjp_call_jaxpr_p.multiple_results = True -custom_vjp_call_jaxpr_p.def_impl(_custom_call_jaxpr_impl) -custom_vjp_call_jaxpr_p.def_abstract_eval(_custom_call_jaxpr_abstract_eval) -ad.primitive_jvps[custom_vjp_call_jaxpr_p] = _custom_vjp_call_jaxpr_jvp batching.primitive_batchers[custom_vjp_call_jaxpr_p] = _custom_vjp_call_jaxpr_vmap + xla.initial_style_translations[custom_vjp_call_jaxpr_p] = \ - xla.lower_fun_initial_style(_custom_call_jaxpr_impl) + xla.lower_fun_initial_style(_custom_vjp_call_jaxpr_impl) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index 52fc761770a6..e7f2ebc0e5b0 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -307,19 +307,16 @@ def process_primitive(self, primitive, tracers, params): def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): assert call_primitive.multiple_results - if call_primitive in call_jvp_rules: - return call_jvp_rules[call_primitive](self, call_primitive, f, tracers, params) - else: - primals = [t.primal for t in tracers] - tangents = [t.tangent for t in tracers] - nonzero_tangents, in_tree_def = tree_flatten(tangents) - f_jvp, out_tree_def = traceable(jvp_subtrace(f, self.master), - len(primals), in_tree_def) - name = params.get('name', f.__name__) - params = dict(params, name=wrap_name(name, 'jvp')) - result = call_primitive.bind(f_jvp, *(primals + nonzero_tangents), **params) - primal_out, tangent_out = tree_unflatten(out_tree_def(), result) - return [JVPTracer(self, p, t) for p, t in zip(primal_out, tangent_out)] + primals = [t.primal for t in tracers] + tangents = [t.tangent for t in tracers] + nonzero_tangents, in_tree_def = tree_flatten(tangents) + f_jvp, out_tree_def = traceable(jvp_subtrace(f, self.master), + len(primals), in_tree_def) + name = params.get('name', f.__name__) + params = dict(params, name=wrap_name(name, 'jvp')) + result = call_primitive.bind(f_jvp, *(primals + nonzero_tangents), **params) + primal_out, tangent_out = tree_unflatten(out_tree_def(), result) + return [JVPTracer(self, p, t) for p, t in zip(primal_out, tangent_out)] def post_process_call(self, call_primitive, out_tracers, params): primals, tangents = unzip2((t.primal, t.tangent) for t in out_tracers) @@ -333,6 +330,26 @@ def todo(x): return map(partial(JVPTracer, trace), primals, tangents) return out, todo + def process_custom_jvp_call(self, _, __, f_jvp, tracers): + primals_in, tangents_in = unzip2((t.primal, t.tangent) for t in tracers) + primals_in = map(core.full_lower, primals_in) + tangents_in = map(instantiate_zeros, primals_in, tangents_in) + outs = f_jvp.call_wrapped(*it.chain(primals_in, tangents_in)) + primals_out, tangents_out = split_list(outs, [len(outs) // 2]) + return map(partial(JVPTracer, self), primals_out, tangents_out) + + def process_custom_vjp_call(self, _, __, fwd, bwd, tracers, *, out_trees): + primals_in, tangents_in = unzip2((t.primal, t.tangent) for t in tracers) + tangents_in = map(instantiate_zeros, primals_in, tangents_in) + res_and_primals_out = fwd.call_wrapped(*map(core.full_lower, primals_in)) + out_tree, res_tree = out_trees() + res, primals_out = split_list(res_and_primals_out, [res_tree.num_leaves]) + avals_out = [raise_to_shaped(core.get_aval(x)) for x in primals_out] + tangents_out = custom_lin_p.bind( + *res, *tangents_in, num_res=res_tree.num_leaves, bwd=bwd, + avals_out=avals_out) + return map(partial(JVPTracer, self), primals_out, tangents_out) + def join(self, xt, yt): xz, yz = xt is zero, yt is zero if xz == yz: @@ -376,7 +393,6 @@ def _primal_tangent_shapes_match(primal, tangent): primitive_jvps : Dict[core.Primitive, Callable] = {} -call_jvp_rules : Dict[core.Primitive, Callable] = {} primitive_transposes: Dict[core.Primitive, Callable] = {} @@ -561,6 +577,24 @@ def _interleave(xs, ys): return [e for pair in zip(xs, ys) for l in pair for e in l] +custom_lin_p = core.Primitive('custom_lin') +custom_lin_p.def_abstract_eval(lambda *_, avals_out, **__: avals_out) +custom_lin_p.multiple_results = True + +def _raise_custom_vjp_error_on_jvp(*_, **__): + raise TypeError("can't apply forward-mode autodiff (jvp) to a custom_vjp " + "function.") +custom_lin_p.def_impl(_raise_custom_vjp_error_on_jvp) + +def _custom_lin_transpose(cts_out, *invals, num_res, bwd, avals_out): + res, _ = split_list(invals, [num_res]) + cts_out = map(instantiate_zeros_aval, avals_out, cts_out) + cts_in = bwd.call_wrapped(*res, *cts_out) + cts_in_flat, _ = tree_flatten(cts_in) # already checked tree structure + return [None] * num_res + cts_in_flat +primitive_transposes[custom_lin_p] = _custom_lin_transpose + + # TODO(mattjj): delete everything below here (deprecated custom_transforms) def defvjp_all(prim, custom_vjp): diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 83b61ae2b8b9..cd3a52bf3982 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -21,7 +21,7 @@ from ..abstract_arrays import ShapedArray, raise_to_shaped from ..ad_util import add_jaxvals, add_jaxvals_p, zeros_like_jaxval, zeros_like_p from .. import linear_util as lu -from ..util import unzip2, partial, safe_map, wrap_name +from ..util import unzip2, partial, safe_map, wrap_name, split_list from . import xla from . import partial_eval as pe @@ -43,6 +43,7 @@ def batch_subtrace(master, in_dims, *in_vals, **params): out_vals, out_dims = unzip2((t.val, t.batch_dim) for t in out_tracers) yield out_vals, out_dims + def batch_fun(fun : lu.WrappedFun, in_dims, out_dim_dests): # transformation version of batch, which doesn't call the function fun, out_dims = batch_subtrace(fun) @@ -134,9 +135,7 @@ def process_primitive(self, primitive, tracers, params): def process_call(self, call_primitive, f: lu.WrappedFun, tracers, params): assert call_primitive.multiple_results params = dict(params, name=wrap_name(params.get('name', f.__name__), 'vmap')) - if call_primitive in call_batching_rules: - return call_batching_rules[call_primitive](self, call_primitive, f, tracers, params) - elif call_primitive in pe.map_primitives: + if call_primitive in pe.map_primitives: return self.process_map(call_primitive, f, tracers, params) else: vals, dims = unzip2((t.val, t.batch_dim) for t in tracers) @@ -170,12 +169,33 @@ def todo(x): return map(partial(BatchTracer, trace), x, dims) return vals, todo + def process_custom_jvp_call(self, prim, fun, jvp, tracers): + in_vals, in_dims = unzip2((t.val, t.batch_dim) for t in tracers) + fun, out_dims1 = batch_subtrace(fun, self.master, in_dims) + jvp, out_dims2 = batch_custom_jvp_subtrace(jvp, self.master, in_dims) + out_vals = prim.bind(fun, jvp, *in_vals) + fst, out_dims = lu.merge_linear_aux(out_dims1, out_dims2) + if not fst: + assert out_dims == out_dims[:len(out_dims) // 2] * 2 + out_dims = out_dims[:len(out_dims) // 2] + return [BatchTracer(self, v, d) for v, d in zip(out_vals, out_dims)] + + def process_custom_vjp_call(self, prim, fun, fwd, bwd, tracers, *, out_trees): + in_vals, in_dims = unzip2((t.val, t.batch_dim) for t in tracers) + fun, out_dims1 = batch_subtrace(fun, self.master, in_dims) + fwd, out_dims2 = batch_subtrace(fwd, self.master, in_dims) + bwd = batch_fun(bwd, out_dims2, in_dims) + out_vals = prim.bind(fun, fwd, bwd, *in_vals, out_trees=out_trees) + fst, out_dims = lu.merge_linear_aux(out_dims1, out_dims2) + if not fst: + out_dims = out_dims[-len(out_vals) % len(out_dims):] + return [BatchTracer(self, v, d) for v, d in zip(out_vals, out_dims)] + ### primitives BatchingRule = Callable[..., Tuple[Any, Union[int, Tuple[int, ...]]]] primitive_batchers : Dict[core.Primitive, BatchingRule] = {} -call_batching_rules : Dict[core.Primitive, BatchingRule] = {} def get_primitive_batcher(p): try: @@ -354,3 +374,30 @@ def batched_traceable(size, batched, instantiate, *vals): out_batched = [d is not not_mapped or inst for d, inst in zip(out_dims, instantiate)] yield out_vals, out_batched + + +@lu.transformation_with_aux +def batch_custom_jvp_subtrace(master, in_dims, *in_vals): + size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} + trace = BatchTrace(master, core.cur_sublevel()) + in_tracers = [BatchTracer(trace, val, dim) if dim is not None else val + for val, dim in zip(in_vals, in_dims * 2)] + outs = yield in_tracers, {} + out_tracers = map(trace.full_raise, outs) + out_vals, out_dims = unzip2((t.val, t.batch_dim) for t in out_tracers) + out_primals, out_tangents = split_list(out_vals, [len(out_vals) // 2]) + out_primal_bds, out_tangent_bds = split_list(out_dims, [len(out_vals) // 2]) + out_dims = map(_merge_bdims, out_primal_bds, out_tangent_bds) + out_primals = map(partial(matchaxis, size), out_primal_bds, out_dims, out_primals) + out_tangents = map(partial(matchaxis, size), out_tangent_bds, out_dims, out_tangents) + yield out_primals + out_tangents, out_dims * 2 + +def _merge_bdims(x, y): + if x == y: + return x + elif x is not_mapped: + return y + elif y is not_mapped: + return x + else: + return x # arbitrary diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 20db12316c97..ecbc5d73060d 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -226,6 +226,14 @@ def todo(x): return out_tracers return out, todo + def process_custom_jvp_call(self, prim, fun, jvp, tracers): + assert self.master.trace_type is StagingJaxprTrace + return fun.call_wrapped(*tracers) + + def process_custom_vjp_call(self, prim, fun, fwd, bwd, tracers, out_trees): + assert self.master.trace_type is StagingJaxprTrace + return fun.call_wrapped(*tracers) + # This subclass is used just for its type tag, which switches the behavior of # process_call to stage out into the jaxpr any call primitives encountered # (rather than doing partial evaluation into the call). @@ -254,8 +262,8 @@ def _unmapped_aval(size, aval): call_partial_eval_rules: Dict[core.Primitive, Callable] = {} -def partial_eval(f, trace, pvs): - f = trace_to_subjaxpr(f, trace.master, False) +def partial_eval(f, trace, pvs, instantiate=False): + f = trace_to_subjaxpr(f, trace.master, instantiate) return partial_eval_wrapper(f, tuple(pvs)) @@ -349,8 +357,8 @@ def partial_val_aval(pv, const): raise TypeError(pv) def trace_to_jaxpr(fun: lu.WrappedFun, pvals: Sequence[PartialVal], - instantiate=False, stage_out_calls=False, bottom=False): - trace_type = StagingJaxprTrace if stage_out_calls else JaxprTrace + instantiate=False, stage_out=False, bottom=False): + trace_type = StagingJaxprTrace if stage_out else JaxprTrace with new_master(trace_type, bottom=bottom) as master: fun = trace_to_subjaxpr(fun, master, instantiate) jaxpr, (out_pvals, consts, env) = fun.call_wrapped(pvals) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index c71811c58bf1..46dcedab226a 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -459,7 +459,7 @@ def dynamic_fun(dummy, *args): # We add a dummy first invar, to carry the trace details to `dynamic_fun` pval = pe.PartialVal([core.abstract_unit, core.unit]) # dummy value for axis env jaxpr, out_pvals, consts = pe.trace_to_jaxpr( - dynamic_fun, [pval] + pvals, instantiate=False, stage_out_calls=True, bottom=True) + dynamic_fun, [pval] + pvals, instantiate=False, stage_out=True, bottom=True) jaxpr.invars = jaxpr.invars[1:] # ignore dummy out_pvs, out_consts = unzip2(out_pvals) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 69a6311745bf..641425cd541b 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -471,7 +471,7 @@ def _xla_callable(fun: lu.WrappedFun, device, backend, name, *arg_specs): abstract_args, arg_devices = unzip2(arg_specs) pvals = [pe.PartialVal((aval, core.unit)) for aval in abstract_args] jaxpr, pvals, consts = pe.trace_to_jaxpr( - fun, pvals, instantiate=False, stage_out_calls=True, bottom=True) + fun, pvals, instantiate=False, stage_out=True, bottom=True) _map(prefetch, it.chain(consts, jaxpr_literals(jaxpr))) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index 8287a7a2feb3..a460e28c0335 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -57,8 +57,9 @@ def _initial_style_jaxpr(fun: Callable, in_tree, in_avals): in_pvals = [pe.PartialVal((aval, core.unit)) for aval in in_avals] wrapped_fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(fun), in_tree) - jaxpr, out_pvals, consts = pe.trace_to_jaxpr( - wrapped_fun, in_pvals, instantiate=True, stage_out_calls=True) + with core.initial_style_staging(): + jaxpr, out_pvals, consts = pe.trace_to_jaxpr( + wrapped_fun, in_pvals, instantiate=True, stage_out=False) out_avals = _map(raise_to_shaped, unzip2(out_pvals)[0]) const_avals = tuple(raise_to_shaped(core.get_aval(c)) for c in consts) typed_jaxpr = core.TypedJaxpr(pe.convert_constvars_jaxpr(jaxpr), diff --git a/jax/linear_util.py b/jax/linear_util.py index 6373201a9d6d..01de83986fca 100644 --- a/jax/linear_util.py +++ b/jax/linear_util.py @@ -229,3 +229,24 @@ def memoized_fun(fun: WrappedFun, *args): def hashable_partial(x, *args): ans = yield (x,) + args, {} yield ans + + +def merge_linear_aux(aux1, aux2): + try: + out1 = aux1() + except StoreException: + # store 1 was not occupied, so store 2 better be + try: + out2 = aux2() + except StoreException: + raise StoreException("neither store occupied") + else: + return False, out2 + else: + # store 1 was occupied, so let's check store 2 is not occupied + try: + out2 = aux2() + except StoreException: + return True, out1 + else: + raise StoreException("both stores occupied") diff --git a/tests/api_test.py b/tests/api_test.py index 24a9d8319478..fa4d90cf2548 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -2173,6 +2173,8 @@ def foo(x): self.assertAllClose(ans, expected, check_dtypes=False) def test_closed_over_tracers_error_message(self): + raise unittest.SkipTest("TODO") # TODO(mattjj) + def f(x): @api.custom_jvp def g(y): @@ -2420,7 +2422,6 @@ def f_rev(x, g): else: return (3 * g,) f.defvjp(f_fwd, f_rev) - x = 2. self.assertAllClose(f(x), np.sin(x), check_dtypes=True) self.assertAllClose(f(-x), np.cos(-x), check_dtypes=True) @@ -2606,6 +2607,28 @@ def app_rev(f, cos_x, g): expected = (2., np.cos(1.)) self.assertAllClose(ans, expected, check_dtypes=False) + def test_nondiff_arg_tracer(self): + @partial(api.custom_vjp, nondiff_argnums=(0,)) + def f(x, y): + return x * y + def f_fwd(x, y): + return f(x, y), np.cos(y) + def f_rev(x, cos_y, g): + return (cos_y * g,) + f.defvjp(f_fwd, f_rev) + + @jit + def g(x, y): + return f(x, y) + + ans = g(2, 3.) + expected = 6. + self.assertAllClose(ans, expected, check_dtypes=False) + + ans = api.grad(g, 1)(2., 3.) + expected = np.cos(3.) + self.assertAllClose(ans, expected, check_dtypes=False) + def test_vmap_axes(self): raise unittest.SkipTest("TODO") # TODO(mattjj): write test From 7a4c4d555c125052ad4204ce4ab7b2b3553c1078 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 29 Mar 2020 20:48:08 -0700 Subject: [PATCH 0958/1053] use custom_jvp for internal functions --- jax/custom_derivatives.py | 25 +++++++++++++++++++++++-- jax/nn/functions.py | 6 +++--- jax/numpy/linalg.py | 20 ++++++++++++-------- jax/scipy/special.py | 18 +++++++++++------- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py index fdf6e51597f6..88d201617b48 100644 --- a/jax/custom_derivatives.py +++ b/jax/custom_derivatives.py @@ -13,14 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -from functools import partial, update_wrapper +from functools import partial, update_wrapper, reduce import inspect import itertools as it import operator as op from . import core from . import linear_util as lu -from .tree_util import tree_flatten, tree_unflatten +from .tree_util import tree_flatten, tree_unflatten, tree_map, tree_multimap from .util import safe_zip, safe_map, unzip2, split_list, curry from .api_util import flatten_fun_nokwargs, argnums_partial, wrap_hashably from .abstract_arrays import raise_to_shaped @@ -76,6 +76,12 @@ def _initial_style_jaxpr(fun, in_avals): typed_jaxpr = core.TypedJaxpr(jaxpr, consts, in_avals, out_avals) return typed_jaxpr +def sum_tangents(x, *xs): + return reduce(ad.add_tangents, xs, x) + +def zeros_like_pytree(x): + return tree_map(lambda _: zero, x) + ### JVPs @@ -151,6 +157,21 @@ def f_jvp(primals, tangents): """ self.jvp = jvp + def defjvps(self, *jvps): + """Convenience wrapper for defining JVPs for each argument separately.""" + if self.nondiff_argnums: + raise TypeError("Can't use ``defjvps`` with ``nondiff_argnums``.") + + def jvp(primals, tangents): + primal_out = self(*primals) + zeros = zeros_like_pytree(primal_out) + all_tangents_out = [jvp(t, primal_out, *primals) if jvp else zeros + for t, jvp in zip(tangents, jvps)] + tangent_out = tree_multimap(sum_tangents, *all_tangents_out) + return primal_out, tangent_out + + self.defjvp(jvp) + def __call__(self, *args, **kwargs): if not self.jvp: msg = "No JVP defined for custom_jvp function {} using defjvp." diff --git a/jax/nn/functions.py b/jax/nn/functions.py index 026e70703f82..325e0d6d2ea1 100644 --- a/jax/nn/functions.py +++ b/jax/nn/functions.py @@ -17,7 +17,7 @@ import numpy as onp -from jax import custom_transforms, defjvp +from jax import custom_jvp from jax import dtypes from jax import lax from jax.scipy.special import expit @@ -25,7 +25,7 @@ # activations -@custom_transforms +@custom_jvp def relu(x): r"""Rectified linear unit activation function. @@ -35,7 +35,7 @@ def relu(x): \mathrm{relu}(x) = \max(x, 0) """ return np.maximum(x, 0) -defjvp(relu, lambda g, ans, x: lax.select(x > 0, g, lax.full_like(g, 0))) +relu.defjvps(lambda g, ans, x: lax.select(x > 0, g, lax.full_like(g, 0))) def softplus(x): r"""Softplus activation function. diff --git a/jax/numpy/linalg.py b/jax/numpy/linalg.py index ff0668017c50..8e5ad3be8ec3 100644 --- a/jax/numpy/linalg.py +++ b/jax/numpy/linalg.py @@ -20,7 +20,7 @@ import operator from typing import Tuple, Union, cast -from jax import jit, vmap +from jax import jit, vmap, custom_jvp from .. import lax from .. import ops from .. import lax_linalg @@ -29,7 +29,6 @@ from .lax_numpy import _wraps from .vectorize import vectorize from . import lax_numpy as np -from ..api import custom_transforms, defjvp from ..util import get_module_functions from ..third_party.numpy.linalg import cond, tensorinv, tensorsolve @@ -111,8 +110,8 @@ def matrix_rank(M, tol=None): return np.sum(S > tol) +@custom_jvp @_wraps(onp.linalg.slogdet) -@custom_transforms @jit def slogdet(a): a = _promote_arg_dtypes(np.asarray(a)) @@ -137,11 +136,16 @@ def slogdet(a): is_zero, np.array(-np.inf, dtype=dtype), np.sum(np.log(np.abs(diag)), axis=-1)) return sign, np.real(logdet) -def _jvp_slogdet(g, ans, x): - jvp_sign = np.zeros(x.shape[:-2]) - jvp_logdet = np.trace(solve(x, g), axis1=-1, axis2=-2) - return jvp_sign, jvp_logdet -defjvp(slogdet, _jvp_slogdet) + +@slogdet.defjvp +def _slogdet_jvp(primals, tangents): + x, = primals + g, = tangents + if np.issubdtype(np._dtype(x), np.complexfloating): + raise NotImplementedError # TODO(pfau): make this work for complex types + sign, ans = slogdet(x) + sign_dot, ans_dot = np.zeros_like(sign), np.trace(solve(x, g), axis1=-1, axis2=-2) + return (sign, ans), (sign_dot, ans_dot) @_wraps(onp.linalg.det) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index aa11c5df9233..ee54562789a1 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -20,7 +20,6 @@ from .. import util from .. import lax from .. import api -from ..api import custom_transforms, defjvp from ..numpy import lax_numpy as jnp from ..numpy.lax_numpy import (_wraps, asarray, _reduction_dims, _constant_like, _promote_args_inexact) @@ -80,21 +79,21 @@ def erfinv(x): return lax.erf_inv(x) +@api.custom_jvp @_wraps(osp_special.logit, update_doc=False) -@custom_transforms def logit(x): x = asarray(x) return lax.log(lax.div(x, lax.sub(lax._const(x, 1), x))) -defjvp(logit, lambda g, ans, x: g / (x * (1 - x))) +logit.defjvp(lambda g, ans, x: g / (x * (1 - x))) +@api.custom_jvp @_wraps(osp_special.expit, update_doc=False) -@custom_transforms def expit(x): x = asarray(x) one = lax._const(x, 1) return lax.div(one, lax.add(one, lax.exp(lax.neg(x)))) -defjvp(expit, lambda g, ans, x: g * ans * (lax._const(ans, 1) - ans)) +expit.defjvps(lambda g, ans, x: g * ans * (lax._const(ans, 1) - ans)) @_wraps(osp_special.logsumexp) @@ -407,7 +406,7 @@ def _create_polynomial(var, coeffs): return x_nan_replaced -@custom_transforms +@partial(api.custom_jvp, nondiff_argnums=(1,)) def log_ndtr(x, series_order=3): r"""Log Normal distribution function. @@ -508,7 +507,12 @@ def log_ndtr(x, series_order=3): lax.log(_ndtr(lax.max(x, lower_segment))), _log_ndtr_lower(lax.min(x, lower_segment), series_order))) -defjvp(log_ndtr, lambda g, ans, x: lax.mul(g, lax.exp(lax.sub(_norm_logpdf(x), ans)))) +def _log_ndtr_jvp(series_order, primals, tangents): + (x,), (t,) = primals, tangents + ans = log_ndtr(x, series_order=series_order) + t_out = lax.mul(t, lax.exp(lax.sub(_norm_logpdf(x), ans))) + return ans, t_out +log_ndtr.defjvp(_log_ndtr_jvp) def _log_ndtr_lower(x, series_order): """Asymptotic expansion version of `Log[cdf(x)]`, appropriate for `x<<-1`.""" From b2b68e5461cb6d08d2224a68b9a5680d6a9b5772 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 29 Mar 2020 20:51:51 -0700 Subject: [PATCH 0959/1053] fix bugs, add tests --- jax/custom_derivatives.py | 8 ++-- jax/interpreters/batching.py | 15 ++++--- jax/interpreters/partial_eval.py | 2 +- tests/api_test.py | 69 ++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 11 deletions(-) diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py index 88d201617b48..ca2bb21fff7c 100644 --- a/jax/custom_derivatives.py +++ b/jax/custom_derivatives.py @@ -202,7 +202,7 @@ def _flatten_jvp(in_tree, *args): py_primals = tree_unflatten(in_tree, primals_in) py_tangents = tree_unflatten(in_tree, tangents_in) pair_out = yield (py_primals, py_tangents), {} - if not isinstance(pair_out, (list, tuple)) and len(pair_out) == 2: + if not isinstance(pair_out, (list, tuple)) or len(pair_out) != 2: msg = ("Custom JVP rule must produce a pair (list or tuple of length two) " "representing primal and tangent outputs, got {}.") raise TypeError(msg.format(pair_out)) @@ -314,7 +314,7 @@ def _custom_jvp_call_jaxpr_transpose(cts, *args, fun_jaxpr, jvp_jaxpr_thunk): del jvp_jaxpr_thunk name = 'custom_jvp_call_jaxpr_linear' return ad.call_transpose(core.call_p, dict(name=name), fun_jaxpr.jaxpr, - tuple(jaxpr.literals) + args, cts) + tuple(fun_jaxpr.literals) + args, cts) ad.primitive_transposes[custom_jvp_call_jaxpr_p] = _custom_jvp_call_jaxpr_transpose @@ -440,7 +440,7 @@ def __call__(self, *args, **kwargs): def _flatten_fwd(in_tree, *args): py_args = tree_unflatten(in_tree, args) pair_out = yield py_args, {} - if not isinstance(pair_out, (list, tuple)) and len(pair_out) == 2: + if not isinstance(pair_out, (list, tuple)) or len(pair_out) != 2: msg = ("Custom VJP fwd function must produce a pair (list or tuple of " "length two) representing primal outputs and residuals (values " "stored from the forward pass for use on the backward pass), " @@ -544,7 +544,7 @@ def batched_fwd_jaxpr_thunk(): fwd_in_dims = [0 if b else not_mapped for b in in_batched] fwd_out_dims = lambda: out_dims2[0] - batched_bwd = batching.batch_fun(bwd, fwd_out_dims, fwd_in_dims) + batched_bwd = batching.batch_fun(bwd, fwd_out_dims, fwd_in_dims, sum_match=True) batched_outs = custom_vjp_call_jaxpr_p.bind( *args, fun_jaxpr=batched_fun_jaxpr, diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index cd3a52bf3982..1bb51e44cb0d 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -44,20 +44,21 @@ def batch_subtrace(master, in_dims, *in_vals, **params): yield out_vals, out_dims -def batch_fun(fun : lu.WrappedFun, in_dims, out_dim_dests): +def batch_fun(fun : lu.WrappedFun, in_dims, out_dim_dests, sum_match=False): # transformation version of batch, which doesn't call the function fun, out_dims = batch_subtrace(fun) - return _batch_fun(fun, in_dims, out_dims, out_dim_dests) + return _batch_fun(fun, sum_match, in_dims, out_dims, out_dim_dests) @lu.transformation -def _batch_fun(in_dims, out_dims, out_dim_dests, *in_vals, **params): +def _batch_fun(sum_match, in_dims, out_dims, out_dim_dests, *in_vals, **params): in_dims = in_dims() if callable(in_dims) else in_dims size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} with new_master(BatchTrace) as master: out_vals = yield (master, in_dims,) + in_vals, params del master out_dim_dests = out_dim_dests() if callable(out_dim_dests) else out_dim_dests - out_vals = map(partial(matchaxis, size), out_dims(), out_dim_dests, out_vals) + out_vals = map(partial(matchaxis, size, sum_match=sum_match), + out_dims(), out_dim_dests, out_vals) yield out_vals def batch_fun2(fun : lu.WrappedFun, in_dims): @@ -184,7 +185,7 @@ def process_custom_vjp_call(self, prim, fun, fwd, bwd, tracers, *, out_trees): in_vals, in_dims = unzip2((t.val, t.batch_dim) for t in tracers) fun, out_dims1 = batch_subtrace(fun, self.master, in_dims) fwd, out_dims2 = batch_subtrace(fwd, self.master, in_dims) - bwd = batch_fun(bwd, out_dims2, in_dims) + bwd = batch_fun(bwd, out_dims2, in_dims, sum_match=True) out_vals = prim.bind(fun, fwd, bwd, *in_vals, out_trees=out_trees) fst, out_dims = lu.merge_linear_aux(out_dims1, out_dims2) if not fst: @@ -317,7 +318,7 @@ def moveaxis(x, src, dst): perm.insert(dst, src) return x.transpose(perm) -def matchaxis(sz, src, dst, x): +def matchaxis(sz, src, dst, x, sum_match=False): if core.get_aval(x) is core.abstract_unit: return core.unit if src == dst: @@ -328,6 +329,8 @@ def matchaxis(sz, src, dst, x): return moveaxis(x, src, -1) elif src is not_mapped and dst is not not_mapped: return broadcast(x, sz, dst) + elif dst is None and sum_match: + return x.sum(src) else: raise ValueError((src, dst)) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index ecbc5d73060d..f8e39e585d64 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -279,7 +279,7 @@ def partial_eval_wrapper(avals, *consts): def abstract_eval_fun(fun, *avals, **params): pvals_in = [PartialVal((a, unit)) for a in avals] _, pvals_out, _ = trace_to_jaxpr(lu.wrap_init(fun, params), pvals_in, - instantiate=True) + instantiate=True, stage_out=True) avals_out, _ = unzip2(pvals_out) for aval_out in avals_out: assert isinstance(aval_out, AbstractValue) # instantiate=True diff --git a/tests/api_test.py b/tests/api_test.py index fa4d90cf2548..cbb89bf65535 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -2291,6 +2291,27 @@ def foo_jvp(primals, tangents): "respectively."), lambda: api.jvp(f, (np.float32(2.),), (np.float32(1.),))) + def test_jvp_rule_doesnt_return_pair_error_message(self): + # https://github.com/google/jax/issues/2516 + + @api.custom_jvp + def f(x): + return x ** 2 + + @f.defjvp + def foo_jvp(primals, tangents): + x, = primals + t, = tangents + return t + + f(2.) # doesn't crash + self.assertRaisesRegex( + TypeError, + re.escape( + "Custom JVP rule must produce a pair (list or tuple of length two) " + "representing primal and tangent outputs, got 1.0"), + lambda: api.jvp(f, (2.,), (1.,))) + def test_multiple_rule_invocations(self): @jax.custom_jvp def expit(x): @@ -2362,6 +2383,22 @@ def f(x): jax.grad(lambda x: jax.vmap(f)(x).sum())(np.arange(3.)) jax.jvp(jax.jit(jax.vmap(f)), (np.arange(3.),), (np.ones(3),)) + def test_eval_shape(self): + @jax.custom_jvp + def expit(x): + return 1 / (1 + lax.exp(-x)) + + @expit.defjvp + def _expit_jvp(primals, tangents): + (x,), (t,) = primals, tangents + ans = expit(x) + t_out = t * ans * (1 - ans) + return ans, t_out + + # don't crash + api.eval_shape(expit, np.ones((2, 3))) + api.eval_shape(api.grad(lambda x: expit(x).sum()), np.ones((2, 3))) + class CustomVJPTest(jtu.JaxTestCase): def test_basic(self): @@ -2676,6 +2713,38 @@ def foo_bwd(_, g): ), lambda: api.grad(f)(2.)) + def test_issue2511(self): + arr = np.ones((5, 2, 2)) + foo = lambda x: api.vmap(np.linalg.det, (0,))(x) + api.jit(foo)(arr) # doesn't crash + + def test_odeint_vmap_grad(self): + # https://github.com/google/jax/issues/2531 + from jax.experimental.ode import odeint + + def dx_dt(x, *args): + return 0.1 * x + + def f(x, y): + y0 = np.array([x, y]) + t = np.array([0., 5.]) + y = odeint(dx_dt, y0, t) + return y[-1].sum() + + def g(x): + # Two initial values for the ODE + y0_arr = np.array([[x, 0.1], + [x, 0.2]]) + + # Run ODE twice + t = np.array([0., 5.]) + y = jax.vmap(lambda y0: odeint(dx_dt, y0, t))(y0_arr) + return y[:,-1].sum() + + ans = jax.grad(g)(2.) # don't crash + expected = jax.grad(f, 0)(2., 0.1) + jax.grad(f, 0)(2., 0.2) + self.assertAllClose(ans, expected, check_dtypes=False) + class DeprecatedCustomTransformsTest(jtu.JaxTestCase): From 74d358d0362e9bf3cc42de425758e874e5466377 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 29 Mar 2020 23:00:40 -0700 Subject: [PATCH 0960/1053] skip ode test on import error (internal) --- tests/api_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/api_test.py b/tests/api_test.py index cbb89bf65535..6abdcd739daa 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -2720,7 +2720,11 @@ def test_issue2511(self): def test_odeint_vmap_grad(self): # https://github.com/google/jax/issues/2531 - from jax.experimental.ode import odeint + # TODO(mattjj): factor out an ode tests file + try: + from jax.experimental.ode import odeint + except ImportError: + raise unittest.SkipTest("missing jax.experimental") from None def dx_dt(x, *args): return 0.1 * x From bdc0c3bf43f2c76bd475180904799c62e2ae1dc3 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Sun, 29 Mar 2020 23:29:55 -0700 Subject: [PATCH 0961/1053] remove remat context check, add initial staging --- jax/interpreters/partial_eval.py | 23 +---------------------- jax/lax/lax.py | 4 ---- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index f8e39e585d64..fbabba3296a6 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -566,11 +566,7 @@ def _remat_partial_eval(trace, _, f, tracers, params): # Using the instantiated tracers, run call_bind like JaxprTrace.process_call. in_pvs, in_consts = unzip2(t.pval for t in instantiated_tracers) fun, aux = partial_eval(f, trace, in_pvs) - if concrete: - # TODO(mattjj): remove `remat_context` when confident no accidental FLOPs - with remat_context(): - out_flat = remat_call_p.bind(fun, *in_consts, **params) - else: + with core.initial_style_staging(): out_flat = remat_call_p.bind(fun, *in_consts, **params) out_pvs, jaxpr, env = aux() env = map(trace.full_raise, env) @@ -653,23 +649,6 @@ def _reconstruct_pval(pval1, const2, unknown): else: return PartialVal((None, const2)) -# TODO(mattjj): for https://github.com/google/jax/pull/1749 we allowed -# standard_abstract_eval to perform concrete evaluation (i.e. FLOPs), but we -# don't think it should happen except for in a remat context -@contextlib.contextmanager -def remat_context(): - try: - prev_state = _thread_local_state.remat - _thread_local_state.remat = True - yield - finally: - _thread_local_state.remat = prev_state - -class _ThreadLocalState(threading.local): - def __init__(self): - self.remat = False -_thread_local_state = _ThreadLocalState() - def move_binders_to_front(typed_jaxpr, to_move): assert not typed_jaxpr.jaxpr.constvars diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 12f5ba8494cd..700f2c0cc8d9 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1525,10 +1525,6 @@ def standard_abstract_eval(prim, shape_rule, dtype_rule, *args, **kwargs): least_specialized = _max( map(type, args), key=operator.attrgetter('array_abstraction_level')) if least_specialized is ConcreteArray: - msg = ("If you see this error, please let us know by opening an issue at\n" - "https://github.com/google/jax/issues \n" - "since we thought this was unreachable!") - assert pe._thread_local_state.remat, msg return ConcreteArray(prim.impl(*[x.val for x in args], **kwargs)) elif least_specialized is ShapedArray: return ShapedArray(shape_rule(*args, **kwargs), dtype_rule(*args, **kwargs)) From a6a837a65ef175a7222a3517b87c19627aa13371 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 00:35:45 -0700 Subject: [PATCH 0962/1053] add some stage_out=True indicators --- jax/api.py | 3 ++- jax/interpreters/xla.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index 41e3fce2c483..9d405f4004ae 100644 --- a/jax/api.py +++ b/jax/api.py @@ -311,7 +311,8 @@ def computation_maker(*args, **kwargs): avals = map(xla.abstractify, jax_args) pvals = [pe.PartialVal((aval, core.unit)) for aval in avals] jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals, - instantiate=instantiate_const_outputs) + instantiate=instantiate_const_outputs, + stage_out=True) axis_env_ = make_axis_env(xla.jaxpr_replicas(jaxpr)) c = xb.make_computation_builder('xla_computation_{}'.format(fun_name)) xla_consts = map(c.Constant, consts) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 641425cd541b..9c22385f8d81 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -653,7 +653,7 @@ def f(c, *xla_args, **params): avals = [_array_aval_from_xla_shape(c.GetShape(x)) for x in xla_args] pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( - lu.wrap_init(fun, params), pvals, instantiate=True) + lu.wrap_init(fun, params), pvals, instantiate=True, stage_out=True) consts = _map(c.Constant, consts) outs = jaxpr_subcomp(c, jaxpr, None, AxisEnv(1), consts, '', *xla_args) return c.Tuple(*outs) @@ -670,7 +670,7 @@ def lower_fun_initial_style(fun): def f(c, axis_env, name_stack, avals, backend, *xla_args, **params): pvals = [pe.PartialVal((a, core.unit)) for a in avals] jaxpr, _, consts = pe.trace_to_jaxpr( - lu.wrap_init(fun, params), pvals, instantiate=True) + lu.wrap_init(fun, params), pvals, instantiate=True, stage_out=True) consts = _map(c.Constant, consts) outs = jaxpr_subcomp(c, jaxpr, backend, axis_env, consts, name_stack, *xla_args) From 9d8823c912977949eb15198c07d9a38b4b56f890 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 00:41:04 -0700 Subject: [PATCH 0963/1053] add initial_style_staging to custom_transforms --- jax/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index 9d405f4004ae..6703cfb9ab55 100644 --- a/jax/api.py +++ b/jax/api.py @@ -1586,7 +1586,8 @@ def __call__(self, *args): flat_fun, out_tree = flatten_fun_nokwargs(lu.wrap_init(self.fun), in_tree) in_pvals = [pe.PartialVal((raise_to_shaped(core.get_aval(x)), core.unit)) for x in args_flat] - jaxpr, _, consts = pe.trace_to_jaxpr(flat_fun, in_pvals, instantiate=True) + with core.initial_style_staging(): + jaxpr, _, consts = pe.trace_to_jaxpr(flat_fun, in_pvals, instantiate=True) outs = self.prim.bind(*it.chain(consts, args_flat), jaxpr=jaxpr, in_tree=in_tree, out_tree=out_tree(), num_consts=len(consts)) From f766c5e7b58c0b42bab4d8d75ee33aa78a3944cc Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 11:31:29 -0700 Subject: [PATCH 0964/1053] allow duck-typing in xla_computation arguments --- jax/api.py | 5 ++++- tests/api_test.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/jax/api.py b/jax/api.py index 6703cfb9ab55..0b79074b8d9b 100644 --- a/jax/api.py +++ b/jax/api.py @@ -303,12 +303,15 @@ def make_axis_env(nreps): names, sizes = zip(*axis_env) return xla.AxisEnv(nreps, names, sizes) + def abstractify(x): + return ShapedArray(onp.shape(x), dtypes.result_type(x)) + @wraps(fun) def computation_maker(*args, **kwargs): wrapped = lu.wrap_init(fun) jax_args, in_tree = tree_flatten((args, kwargs)) jaxtree_fun, out_tree = flatten_fun(wrapped, in_tree) - avals = map(xla.abstractify, jax_args) + avals = map(abstractify, jax_args) pvals = [pe.PartialVal((aval, core.unit)) for aval in avals] jaxpr, _, consts = pe.trace_to_jaxpr(jaxtree_fun, pvals, instantiate=instantiate_const_outputs, diff --git a/tests/api_test.py b/tests/api_test.py index 6abdcd739daa..823a298faab7 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -838,6 +838,23 @@ def foo(x, y, z): self.assertEqual(param_shapes[0].xla_element_type(), xb.xla_client.PrimitiveType.TUPLE) + def test_xla_computation_duck_typing(self): + def foo(x, y, z): + return x + y + z + + x = jax.ShapeDtypeStruct((), onp.float32) + y = jax.ShapeDtypeStruct((), onp.float32) + z = jax.ShapeDtypeStruct((), onp.float32) + + c = api.xla_computation(foo)(x, y, z) + self.assertEqual(len(c.GetProgramShape().parameter_shapes()), 3) + + c = api.xla_computation(foo, tuple_args=True)(1., 2., 3.) + param_shapes = c.GetProgramShape().parameter_shapes() + self.assertEqual(len(param_shapes), 1) + self.assertEqual(param_shapes[0].xla_element_type(), + xb.xla_client.PrimitiveType.TUPLE) + def test_staging_out_multi_replica(self): def f(x): return api.pmap(np.mean)(x) From 70a3f47bed6caba8c944e4d5b724c81fccb1bdae Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 11:57:03 -0700 Subject: [PATCH 0965/1053] comments/defaults for process_custom_{jv,vj}p_call --- jax/core.py | 16 ++++++++++++++++ jax/interpreters/partial_eval.py | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/jax/core.py b/jax/core.py index af02fdb1642a..e53253446bbf 100644 --- a/jax/core.py +++ b/jax/core.py @@ -328,6 +328,22 @@ def __repr__(self): return '{}(level={}/{})'.format( self.__class__.__name__, self.level, self.sublevel) + def procecss_call(self, call_primitive, f, tracers, params): + raise NotImplementedError("must override to handle call-like primitives") + + def process_custom_jvp_call(self, primitive, fun, jvp, tracers): + # As a default implementation, drop the custom differentiation rule. This + # behavior is desirable when staging out of the JAX system, but not when + # there are further differentiation transformations to be applied. Override + # this method to allow differentiation to be performed downstream. + del primitive, jvp # Unused. + return fun.call_wrapped(*tracers) + + def process_custom_vjp_call(self, primitive, fun, fwd, bwd, tracers, out_trees): + # See comment in the above process_custom_jvp_call method. + del primitive, fwd, bwd, out_trees # Unused. + return fun.call_wrapped(*tracers) + def escaped_tracer_error(detail): msg = ("Encountered an unexpected tracer. Perhaps this tracer escaped " "through global state from a previously traced function.\n" diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index fbabba3296a6..8df67df3744e 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -227,10 +227,20 @@ def todo(x): return out, todo def process_custom_jvp_call(self, prim, fun, jvp, tracers): + # We form jaxprs using JaxprTraces for two distinct purposes: to stage + # program representations completely out of the JAX system (e.g. for XLA + # using jit or pmap), and to build a representation of a function that may + # require further JAX transformations (e.g. in "initial-style" higher-order + # primitives, like for control flow). In particular, in the latter case we + # need custom differentiation rules to stick around, but in the former we do + # not. This method call should only be reachable in the former case, and so + # we check that the former case is indicated (with a StagingJaxprTrace) and + # then drop the differentiation rules. assert self.master.trace_type is StagingJaxprTrace return fun.call_wrapped(*tracers) def process_custom_vjp_call(self, prim, fun, fwd, bwd, tracers, out_trees): + # See comment in the above process_custom_jvp_call method. assert self.master.trace_type is StagingJaxprTrace return fun.call_wrapped(*tracers) From b43051e488f345b85f8b6e98b98ebef15b1eb37e Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 13:49:56 -0700 Subject: [PATCH 0966/1053] minor fix to custom_transforms --- jax/interpreters/ad.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jax/interpreters/ad.py b/jax/interpreters/ad.py index e7f2ebc0e5b0..0b730e0adcf8 100644 --- a/jax/interpreters/ad.py +++ b/jax/interpreters/ad.py @@ -622,7 +622,9 @@ def fun_jvp_partial_eval(trace, *tracers, **params): primals_out = [primals_out] out_avals = [raise_to_shaped(get_aval(x)) for x in primals_out] ct_pvals = [pe.PartialVal((aval, core.unit)) for aval in out_avals] - jaxpr, _, res = pe.trace_to_jaxpr(lu.wrap_init(vjp_py), ct_pvals, instantiate=True) + with core.initial_style_staging(): + jaxpr, _, res = pe.trace_to_jaxpr(lu.wrap_init(vjp_py), ct_pvals, + instantiate=True) tangents_out = fun_lin_p.bind(*it.chain(res, tangents), trans_jaxpr=jaxpr, num_res=len(res), out_avals=out_avals) return primals_out + tangents_out From 1275bc5d6bd4a643c3480d4f5dc7965359f0e3a1 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 13:50:32 -0700 Subject: [PATCH 0967/1053] don't pass `-n 1` to pytest in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8df31c498b19..0bba0288d138 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,5 +47,5 @@ script: echo "===== Checking with mypy ====" time mypy --config-file=mypy.ini jax ; else - pytest -n 1 tests examples -W ignore ; + pytest tests examples -W ignore ; fi From 0c7e134cf4d7ff057a37aa7eba0b498daee2524d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 30 Mar 2020 16:56:54 -0400 Subject: [PATCH 0968/1053] Update XLA and increment jaxlib version to 0.1.43. (#2546) --- WORKSPACE | 6 +++--- jaxlib/version.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1265b10eb933..87cf09507648 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "9fd878b7da8ceb5ced72f4bd1a61cda3a4812272457ccb3b5a417acc25e4b45e", - strip_prefix = "tensorflow-3dc37733523f2b0df52965ec2e68023a491a39d7", + sha256 = "35adf5c69284ec1a93de7a86dabeac6492dc73e4f035d42b4e6c55a9340051f8", + strip_prefix = "tensorflow-433d40514b4e35a31f9f7b3ef15724fc3b28b87c", urls = [ - "https://github.com/tensorflow/tensorflow/archive/3dc37733523f2b0df52965ec2e68023a491a39d7.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/433d40514b4e35a31f9f7b3ef15724fc3b28b87c.tar.gz", ], ) diff --git a/jaxlib/version.py b/jaxlib/version.py index e1707a10ccbc..53aaaffe8a7a 100644 --- a/jaxlib/version.py +++ b/jaxlib/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.42" +__version__ = "0.1.43" From acb241468d4390adda240ca9a25515b45f4b6894 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 30 Mar 2020 19:43:23 -0400 Subject: [PATCH 0969/1053] Update XLA to fix CUDA 9.2 build problem. (#2547) --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87cf09507648..ec86832768f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -28,10 +28,10 @@ http_archive( # and update the sha256 with the result. http_archive( name = "org_tensorflow", - sha256 = "35adf5c69284ec1a93de7a86dabeac6492dc73e4f035d42b4e6c55a9340051f8", - strip_prefix = "tensorflow-433d40514b4e35a31f9f7b3ef15724fc3b28b87c", + sha256 = "4884940ee7f6531ee7f0c65b2a7d06360f9db971b6bbf08903ba21dc269f8945", + strip_prefix = "tensorflow-6ad1b2ed49143bdf4f6152a61fb8e810bd940fb4", urls = [ - "https://github.com/tensorflow/tensorflow/archive/433d40514b4e35a31f9f7b3ef15724fc3b28b87c.tar.gz", + "https://github.com/tensorflow/tensorflow/archive/6ad1b2ed49143bdf4f6152a61fb8e810bd940fb4.tar.gz", ], ) From df3b5fe42df0d1668f1b9b7c4f4e7ad126c84aff Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 17:48:07 -0700 Subject: [PATCH 0970/1053] fix a while-loop-of-pmap bug (thanks @jaspersnoek) --- jax/interpreters/xla.py | 6 ++++-- tests/lax_control_flow_test.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 9c22385f8d81..b857f7e0400c 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -188,7 +188,7 @@ def xla_primitive_callable(prim, *arg_specs, **params): built_c = primitive_computation(prim, AxisEnv(nreps), backend, tuple_args, *avals, **params) options = xb.get_compile_options( - num_replicas=1, + num_replicas=nreps, num_partitions=1, device_assignment=device and (device.id,)) compiled = built_c.Compile(compile_options=options, backend=backend) @@ -264,7 +264,9 @@ def _execute_replicated_primitive(prim, compiled, backend, tuple_args, [device_put(x, device) for x in args if x is not token] for device in compiled.local_devices()] out_buf = compiled.ExecuteOnLocalDevices( - input_bufs, tuple_arguments=tuple_args)[0][0] + input_bufs, tuple_arguments=tuple_args)[0] + if not prim.multiple_results: + out_buf, = out_buf return result_handler(out_buf) def check_nans(prim, bufs): diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 455ebc192640..c25b56624703 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1816,6 +1816,23 @@ def arange(n): expected = onp.arange(10) self.assertAllClose(ans, expected, check_dtypes=False) + def test_while_loop_of_pmap(self): + # code from jsnoek@ + def body(i, x): + result = api.pmap(lambda z: lax.psum(np.sin(z), 'i'), axis_name='i')(x) + return result + x + f_loop = lambda x: lax.fori_loop(0, 3, body, x) + ans = f_loop(np.ones(8)) + del body, f_loop + + def body2(i, x): + result = np.broadcast_to(np.sin(x).sum(), x.shape) + return result + x + g_loop = lambda x: lax.fori_loop(0, 3, body2, x) + expected = g_loop(np.ones(8)) + + self.assertAllClose(ans, expected, check_dtypes=False) + if __name__ == '__main__': absltest.main() From 375575a5e599ed056756fc9da43e50525390b997 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 17:53:47 -0700 Subject: [PATCH 0971/1053] skip new test on cpu unless num_devices > 1 --- tests/lax_control_flow_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index c25b56624703..961825f157e7 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1817,6 +1817,9 @@ def arange(n): self.assertAllClose(ans, expected, check_dtypes=False) def test_while_loop_of_pmap(self): + if api.device_count() == 1 and xla_bridge.get_backend().platform == 'cpu': + raise SkipTest("test segfaults on cpu") # TODO(mattjj): follow up w/ xla + # code from jsnoek@ def body(i, x): result = api.pmap(lambda z: lax.psum(np.sin(z), 'i'), axis_name='i')(x) From bd726fcd80709e48aa9854a79a925d3324bf8a75 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 19:37:11 -0700 Subject: [PATCH 0972/1053] update custom derivatives tutorial notebook * add clip_gradient example * add defjvps convenience wrapper --- ...tom_derivative_rules_for_Python_code.ipynb | 741 +++++++++++++++--- 1 file changed, 611 insertions(+), 130 deletions(-) diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb index 9af90d1b56db..199f5382b1d0 100644 --- a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -24,7 +24,7 @@ "source": [ "# Custom derivative rules for JAX-transformable Python functions\n", "\n", - "*mattjj@ Mar 19 2020*\n", + "*mattjj@ Mar 19 2020, last updated Mar 30 2020*\n", "\n", "There are two ways to define differentiation rules in JAX:\n", "\n", @@ -46,6 +46,16 @@ "## TL;DR" ] }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZgMNRtXyWIW8", + "colab_type": "text" + }, + "source": [ + "#### Custom JVPs with `jax.custom_jvp`" + ] + }, { "cell_type": "code", "metadata": { @@ -77,11 +87,11 @@ "metadata": { "id": "RrNf588X_kJF", "colab_type": "code", + "outputId": "33bc1c36-b720-442f-b385-8ebe025319e3", "colab": { "base_uri": "https://localhost:8080/", "height": 85 - }, - "outputId": "246fe70d-2348-4e3e-f58d-766ef16304bc" + } }, "source": [ "from jax import jvp, grad\n", @@ -92,7 +102,59 @@ "print(y_dot)\n", "print(grad(f)(2., 3.))" ], - "execution_count": 3, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2.7278922\n", + "2.7278922\n", + "-1.2484405\n", + "-1.2484405\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1kHd3cKOWQgB", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Equivalent alternative using the defjvps convenience wrapper\n", + "\n", + "@custom_jvp\n", + "def f(x, y):\n", + " return np.sin(x) * y\n", + "\n", + "f.defjvps(lambda x_dot, primal_out, x, y: np.cos(x) * x_dot * y,\n", + " lambda y_dot, primal_out, x, y: -np.sin(x) * y_dot)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Zn81cHeYWVOw", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "outputId": "fb5e7e94-488f-4c30-a851-5e7c0a8173bf" + }, + "source": [ + "print(f(2., 3.))\n", + "y, y_dot = jvp(f, (2., 3.), (1., 0.))\n", + "print(y)\n", + "print(y_dot)\n", + "print(grad(f)(2., 3.))" + ], + "execution_count": 4, "outputs": [ { "output_type": "stream", @@ -106,6 +168,16 @@ } ] }, + { + "cell_type": "markdown", + "metadata": { + "id": "N2DOGCREWXFj", + "colab_type": "text" + }, + "source": [ + "#### Custom VJPs with `jax.custom_vjp`" + ] + }, { "cell_type": "code", "metadata": { @@ -137,16 +209,16 @@ "metadata": { "id": "HpSozxKUCXgp", "colab_type": "code", + "outputId": "e515914b-a65b-49ba-a746-c343308451e7", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "889eb046-19bf-49c7-d8a9-c037b8325fe9" + } }, "source": [ "print(grad(f)(2., 3.))" ], - "execution_count": 5, + "execution_count": 6, "outputs": [ { "output_type": "stream", @@ -200,7 +272,7 @@ "metadata": { "id": "6lWbTvs40ET-", "colab_type": "code", - "outputId": "b7b9d021-5a34-42ee-cba6-90d3a3e1ee55", + "outputId": "739b4df9-7c64-4fb4-c0ce-c04fa7d86db4", "colab": { "base_uri": "https://localhost:8080/", "height": 34 @@ -214,7 +286,7 @@ "\n", "log1pexp(3.)" ], - "execution_count": 6, + "execution_count": 7, "outputs": [ { "output_type": "execute_result", @@ -226,7 +298,7 @@ "metadata": { "tags": [] }, - "execution_count": 6 + "execution_count": 7 } ] }, @@ -245,7 +317,7 @@ "metadata": { "id": "XgtGKFld02UD", "colab_type": "code", - "outputId": "06691c5d-a3c6-4632-a5c7-96eb7379c978", + "outputId": "a2722ad0-00d6-48d9-f5fa-cc87779bbe53", "colab": { "base_uri": "https://localhost:8080/", "height": 68 @@ -258,7 +330,7 @@ "print(jit(grad(log1pexp))(3.))\n", "print(vmap(jit(grad(log1pexp)))(np.arange(3.)))" ], - "execution_count": 7, + "execution_count": 8, "outputs": [ { "output_type": "stream", @@ -286,7 +358,7 @@ "metadata": { "id": "sVM6iwIO22sB", "colab_type": "code", - "outputId": "39338c73-dd3a-4915-de26-8c634ba96375", + "outputId": "1a1624bc-15fa-43c0-a9d0-ac17c80e8097", "colab": { "base_uri": "https://localhost:8080/", "height": 34 @@ -295,7 +367,7 @@ "source": [ "print(grad(log1pexp)(100.))" ], - "execution_count": 8, + "execution_count": 9, "outputs": [ { "output_type": "stream", @@ -323,7 +395,7 @@ "metadata": { "id": "dO6uZlYR4TVp", "colab_type": "code", - "outputId": "3f573ed5-a7a6-49f8-bb03-a26abc4fd4ef", + "outputId": "36835248-669f-4025-8931-783072bed9f9", "colab": { "base_uri": "https://localhost:8080/", "height": 119 @@ -334,7 +406,7 @@ "\n", "make_jaxpr(grad(log1pexp))(100.)" ], - "execution_count": 9, + "execution_count": 10, "outputs": [ { "output_type": "execute_result", @@ -351,7 +423,7 @@ "metadata": { "tags": [] }, - "execution_count": 9 + "execution_count": 10 } ] }, @@ -403,16 +475,16 @@ "metadata": { "id": "rhiMHulfKBIF", "colab_type": "code", + "outputId": "45256c6b-19fd-4bac-baf8-4892298048bd", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "36c4065b-5e77-4a4c-eedb-857f00a24cf7" + } }, "source": [ "print(grad(log1pexp)(100.))" ], - "execution_count": 11, + "execution_count": 12, "outputs": [ { "output_type": "stream", @@ -428,22 +500,80 @@ "metadata": { "id": "9cLDuAo6KGUu", "colab_type": "code", + "outputId": "c8194a60-7e48-4fb2-d78d-569b38841b42", "colab": { "base_uri": "https://localhost:8080/", "height": 68 + } + }, + "source": [ + "print(jit(log1pexp)(3.))\n", + "print(jit(grad(log1pexp))(3.))\n", + "print(vmap(jit(grad(log1pexp)))(np.arange(3.)))" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "text": [ + "3.0485873\n", + "0.95257413\n", + "[0.5 0.7310586 0.8807971]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9sVUGbGkUOqO", + "colab_type": "text" + }, + "source": [ + "Here's a `defjvps` convenience wrapper to express the same thing:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xfQTp8F7USEM", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def log1pexp(x):\n", + " return np.log(1. + np.exp(x))\n", + "\n", + "log1pexp.defjvps(lambda t, ans, x: (1 - 1/(1 + np.exp(x))) * t)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "dtdh-PLaUsvw", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 }, - "outputId": "c0f25e98-e4a0-47fe-ee74-a843f3697d55" + "outputId": "588a0619-0b5c-42ed-b2cf-955255b0f7a7" }, "source": [ + "print(grad(log1pexp)(100.))\n", "print(jit(log1pexp)(3.))\n", "print(jit(grad(log1pexp))(3.))\n", "print(vmap(jit(grad(log1pexp)))(np.arange(3.)))" ], - "execution_count": 12, + "execution_count": 15, "outputs": [ { "output_type": "stream", "text": [ + "1.0\n", "3.0485873\n", "0.95257413\n", "[0.5 0.7310586 0.8807971]\n" @@ -504,16 +634,16 @@ "metadata": { "id": "piI0u5MiHhQh", "colab_type": "code", + "outputId": "35bdee7d-41d7-44ed-b326-43d494cf71fa", "colab": { "base_uri": "https://localhost:8080/", - "height": 0 - }, - "outputId": "5e1ed5f0-271a-4c35-860a-d69cd069b439" + "height": 34 + } }, "source": [ "print(grad(f)(0.))" ], - "execution_count": 14, + "execution_count": 17, "outputs": [ { "output_type": "stream", @@ -564,16 +694,68 @@ "metadata": { "id": "Gsh9ZvMTKi1O", "colab_type": "code", + "outputId": "fb288478-eb53-4362-aa46-24ea18003bec", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "print(grad(f)(0.))" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Usbp_gxaVVea", + "colab_type": "text" + }, + "source": [ + "Here's the convenience wrapper version:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qXnrxIfaVYCs", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x):\n", + " return x / (1 + np.sqrt(x))\n", + "\n", + "f.defjvps(lambda t, ans, x: ((np.sqrt(x) + 2) / (2 * (np.sqrt(x) + 1)**2)) * t)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "uUU5qRmEViK1", + "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", - "height": 0 + "height": 34 }, - "outputId": "4ce69b63-166b-4e18-cf79-6550046b510a" + "outputId": "109052a3-2176-4d7f-b63a-09d86898ce8b" }, "source": [ "print(grad(f)(0.))" ], - "execution_count": 16, + "execution_count": 21, "outputs": [ { "output_type": "stream", @@ -584,6 +766,141 @@ } ] }, + { + "cell_type": "markdown", + "metadata": { + "id": "7J2A85wbSAmF", + "colab_type": "text" + }, + "source": [ + "### Gradient clipping\n", + "\n", + "While in some cases we want to express a mathematical differentiation computation, in other cases we may even want to take a step away from mathematics to adjust the computation autodiff performs. One canonical example is reverse-mode gradient clipping.\n", + "\n", + "For gradient clipping, we can use `np.clip` together with a `jax.custom_vjp` reverse-mode-only rule:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8jfjSanIW_tJ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from functools import partial\n", + "from jax import custom_vjp\n", + "\n", + "@partial(custom_vjp, nondiff_argnums=(0, 1))\n", + "def clip_gradient(lo, hi, x):\n", + " return x # identity function\n", + "\n", + "def clip_gradient_fwd(lo, hi, x):\n", + " return x, None # no residual values to save\n", + "\n", + "def clip_gradient_bwd(lo, hi, _, g):\n", + " return (np.clip(g, lo, hi),)\n", + "\n", + "clip_gradient.defvjp(clip_gradient_fwd, clip_gradient_bwd)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "4OLU_vf8Xw2J", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "outputId": "36b37747-6330-4990-a056-04780c218d79" + }, + "source": [ + "import matplotlib.pyplot as plt\n", + "from jax import vmap\n", + "\n", + "t = np.linspace(0, 10, 1000)\n", + "\n", + "plt.plot(np.sin(t))\n", + "plt.plot(vmap(grad(np.sin))(t))" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 23 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "iS8nRuBZYLcD", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "outputId": "a22b17bc-df65-4531-9427-40d9ce834d38" + }, + "source": [ + "def clip_sin(x):\n", + " x = clip_gradient(-0.75, 0.75, x)\n", + " return np.sin(x)\n", + "\n", + "plt.plot(clip_sin(t))\n", + "plt.plot(vmap(grad(clip_sin))(t))" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -604,7 +921,7 @@ }, "source": [ "\n", - "When trying to track down the source of a `nan` runtime error, or just examine carefully the cotangent (gradient) values being propagated, it can be useful to insert a debugger at a point in the backward pass that corresponds to a specific point in the primal computation.\n", + "When trying to track down the source of a `nan` runtime error, or just examine carefully the cotangent (gradient) values being propagated, it can be useful to insert a debugger at a point in the backward pass that corresponds to a specific point in the primal computation. You can do that with `jax.custom_vjp`.\n", "\n", "We'll defer an example until the next section." ] @@ -690,16 +1007,16 @@ "metadata": { "id": "42Ydd7_6aLXU", "colab_type": "code", + "outputId": "a8b367eb-0701-4a22-b4a5-7074abd375a0", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "29833920-bea5-4853-d55b-10c66a27fd32" + } }, "source": [ "print(newton_sqrt(2.))" ], - "execution_count": 19, + "execution_count": 27, "outputs": [ { "output_type": "stream", @@ -725,16 +1042,16 @@ "metadata": { "id": "t_YSXieT3Yyk", "colab_type": "code", + "outputId": "796b9153-b5d7-4503-d496-480d9773cad7", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "a6b00ffe-cba1-4177-c50d-0f1b55ceed31" + } }, "source": [ "print(jit(vmap(newton_sqrt))(np.array([1., 2., 3., 4.])))" ], - "execution_count": 20, + "execution_count": 28, "outputs": [ { "output_type": "stream", @@ -785,9 +1102,6 @@ "colab": {} }, "source": [ - "from functools import partial\n", - "\n", - "from jax import custom_vjp\n", "from jax import vjp\n", "\n", "@partial(custom_vjp, nondiff_argnums=(0,))\n", @@ -830,16 +1144,16 @@ "metadata": { "id": "iKzfT6d_mEoB", "colab_type": "code", + "outputId": "31b93e63-6487-484b-e9a7-4b75c216fc01", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "99482a53-f7b5-4715-ffcb-66fb0346a7b3" + } }, "source": [ "print(newton_sqrt(2.))" ], - "execution_count": 22, + "execution_count": 30, "outputs": [ { "output_type": "stream", @@ -855,17 +1169,17 @@ "metadata": { "id": "Hmcpjr6gmtkO", "colab_type": "code", + "outputId": "7f7c5025-11bb-48f1-e1df-9b30e05b6a19", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "f76cc1d0-de93-4e1c-c1f3-509d3f04df32" + } }, "source": [ "print(grad(newton_sqrt)(2.))\n", "print(grad(grad(newton_sqrt))(2.))" ], - "execution_count": 23, + "execution_count": 31, "outputs": [ { "output_type": "stream", @@ -892,17 +1206,17 @@ "metadata": { "id": "jj_JnI9Pm4jg", "colab_type": "code", + "outputId": "0efc9081-980f-47cd-95a2-476024545692", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "bae61d39-5f13-452b-b700-897d1f9a38d3" + } }, "source": [ "print(grad(np.sqrt)(2.))\n", "print(grad(grad(np.sqrt))(2.))" ], - "execution_count": 24, + "execution_count": 32, "outputs": [ { "output_type": "stream", @@ -979,11 +1293,11 @@ "metadata": { "id": "fxhlECvW7Krj", "colab_type": "code", + "outputId": "a727d3c5-ab82-4c0c-f77f-ac0500e84f5c", "colab": { "base_uri": "https://localhost:8080/", "height": 68 - }, - "outputId": "3dc9640f-ae25-458d-854b-e60330a1812d" + } }, "source": [ "from jax import jvp\n", @@ -994,7 +1308,7 @@ "print(y)\n", "print(y_dot)" ], - "execution_count": 26, + "execution_count": 34, "outputs": [ { "output_type": "stream", @@ -1052,11 +1366,11 @@ "metadata": { "id": "hl9Io86pQD6s", "colab_type": "code", + "outputId": "e8794287-da8f-47e8-a1ce-eaa41831a591", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "3d0ce20f-823c-4cca-8f7b-b40cf3f0c3bd" + } }, "source": [ "from jax import grad\n", @@ -1064,7 +1378,7 @@ "print(grad(f)(3.))\n", "print(grad(grad(f))(3.))" ], - "execution_count": 27, + "execution_count": 35, "outputs": [ { "output_type": "stream", @@ -1124,16 +1438,16 @@ "metadata": { "id": "QpKwA0oA8DfE", "colab_type": "code", + "outputId": "44aba2b3-200c-4cb7-f275-4cd9404d4068", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "53871c47-509d-4f4f-cdae-75ffc414467f" + } }, "source": [ "print(grad(f)(2., 3.))" ], - "execution_count": 29, + "execution_count": 37, "outputs": [ { "output_type": "stream", @@ -1144,6 +1458,173 @@ } ] }, + { + "cell_type": "markdown", + "metadata": { + "id": "YPsPS3rdaGo2", + "colab_type": "text" + }, + "source": [ + "The `defjvps` convenience wrapper lets us define a JVP for each argument separately, and the results are computed separately then summed:\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CsQIUhUkajua", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x):\n", + " return np.sin(x)\n", + "\n", + "f.defjvps(lambda t, ans, x: np.cos(x) * t)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "zfSgXrPEap-i", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "b9401e3a-cbce-4aca-bad6-490524cfce7e" + }, + "source": [ + "print(grad(f)(3.))" + ], + "execution_count": 39, + "outputs": [ + { + "output_type": "stream", + "text": [ + "-0.9899925\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iYUCLJghbPiP", + "colab_type": "text" + }, + "source": [ + "Here's the `defjvps` convenience wrapper version:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Vx4Jv9s9bCi1", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x, y):\n", + " return x ** 2 * y\n", + "\n", + "f.defjvps(lambda x_dot, primal_out, x, y: 2 * x * y * x_dot,\n", + " lambda y_dot, primal_out, x, y: x ** 2 * y_dot)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "o9ezUYsjbbvC", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "67a9f25d-89ad-4abc-908b-8a97062da239" + }, + "source": [ + "print(grad(f)(2., 3.))\n", + "print(grad(f, 0)(2., 3.)) # same as above\n", + "print(grad(f, 1)(2., 3.))" + ], + "execution_count": 41, + "outputs": [ + { + "output_type": "stream", + "text": [ + "12.0\n", + "12.0\n", + "4.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nuIUkaxibVfD", + "colab_type": "text" + }, + "source": [ + "As a shorthand, with `defjvps` you can pass a `None` value to indicate that the JVP for a particular argument is zero:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "z4z3esdZbTzQ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "@custom_jvp\n", + "def f(x, y):\n", + " return x ** 2 * y\n", + "\n", + "f.defjvps(lambda x_dot, primal_out, x, y: 2 * x * y * x_dot,\n", + " None)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "jOtQfp-5btSo", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "ded61c3a-14a1-4965-b988-7a7c94eeaf53" + }, + "source": [ + "print(grad(f)(2., 3.))\n", + "print(grad(f, 0)(2., 3.)) # same as above\n", + "print(grad(f, 1)(2., 3.))" + ], + "execution_count": 43, + "outputs": [ + { + "output_type": "stream", + "text": [ + "12.0\n", + "12.0\n", + "0.0\n" + ], + "name": "stdout" + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -1179,7 +1660,7 @@ "\n", "@f.defjvp\n", "def f_jvp(primals, tangents):\n", - " print('called f_jvp!')\n", + " print('called f_jvp!') # a harmless side-effect\n", " x, = primals\n", " t, = tangents\n", " return f(x), np.cos(x) * t" @@ -1192,18 +1673,18 @@ "metadata": { "id": "xAlRea95PjA5", "colab_type": "code", + "outputId": "b20e8a49-1ba3-4be0-dcb7-83b2b7cca0d5", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "26fcf10c-22bb-4bae-94a6-be6f22d5ef34" + } }, "source": [ "from jax import vmap, jit\n", "\n", "print(f(3.))" ], - "execution_count": 31, + "execution_count": 45, "outputs": [ { "output_type": "stream", @@ -1220,17 +1701,17 @@ "metadata": { "id": "dyD2ow4NmpI-", "colab_type": "code", + "outputId": "19081712-d417-4678-ba19-d60f8a86bd78", "colab": { "base_uri": "https://localhost:8080/", "height": 85 - }, - "outputId": "b88e980a-6fe0-4c17-d76b-e03e4692f16f" + } }, "source": [ "print(vmap(f)(np.arange(3.)))\n", "print(jit(f)(3.))" ], - "execution_count": 32, + "execution_count": 46, "outputs": [ { "output_type": "stream", @@ -1259,17 +1740,17 @@ "metadata": { "id": "hKF0xyAxPyLZ", "colab_type": "code", + "outputId": "7919ce76-d1a0-478b-a9d4-cf6050250c97", "colab": { "base_uri": "https://localhost:8080/", "height": 68 - }, - "outputId": "2ec1142f-0273-4c21-9b28-5d4490bcba12" + } }, "source": [ "y, y_dot = jvp(f, (3.,), (1.,))\n", "print(y_dot)" ], - "execution_count": 33, + "execution_count": 47, "outputs": [ { "output_type": "stream", @@ -1287,16 +1768,16 @@ "metadata": { "id": "Z1KaEgA58MEG", "colab_type": "code", + "outputId": "3554eb34-a95d-48b4-e291-f7aa0885c02f", "colab": { "base_uri": "https://localhost:8080/", "height": 68 - }, - "outputId": "f231d379-b296-4a36-8fc3-924476c57edb" + } }, "source": [ "print(grad(f)(3.))" ], - "execution_count": 34, + "execution_count": 48, "outputs": [ { "output_type": "stream", @@ -1324,16 +1805,16 @@ "metadata": { "id": "B6PLJooTQgVp", "colab_type": "code", + "outputId": "f53dba7d-fa93-4419-98b9-8c6568ac4741", "colab": { "base_uri": "https://localhost:8080/", "height": 85 - }, - "outputId": "10b1dd9f-f6fa-4774-bb77-7d222a6bc2c4" + } }, "source": [ "grad(grad(f))(3.)" ], - "execution_count": 35, + "execution_count": 49, "outputs": [ { "output_type": "stream", @@ -1354,7 +1835,7 @@ "metadata": { "tags": [] }, - "execution_count": 35 + "execution_count": 49 } ] }, @@ -1401,17 +1882,17 @@ "metadata": { "id": "QCHmJ56Na2G3", "colab_type": "code", + "outputId": "fcc3fd07-6a14-47eb-e86a-a820c9917a16", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "13c86bfa-03f7-45db-aefd-2958b2b60578" + } }, "source": [ "print(grad(f)(1.))\n", "print(grad(f)(-1.))" ], - "execution_count": 37, + "execution_count": 51, "outputs": [ { "output_type": "stream", @@ -1469,11 +1950,11 @@ "metadata": { "id": "E8W-H2S0Ngdr", "colab_type": "code", + "outputId": "62e3afa0-d10f-4e72-e567-9ee9b8dd7c3d", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "d0f25cc0-8454-42a4-b13b-10863beeb6ea" + } }, "source": [ "from jax import grad\n", @@ -1481,7 +1962,7 @@ "print(f(3.))\n", "print(grad(f)(3.))" ], - "execution_count": 39, + "execution_count": 53, "outputs": [ { "output_type": "stream", @@ -1548,16 +2029,16 @@ "metadata": { "id": "EnRtIhhLnkry", "colab_type": "code", + "outputId": "4d28ce02-26e5-4d04-fb4a-767892844c88", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "b949c30c-62b8-4ed5-ea76-6910aca4da69" + } }, "source": [ "print(grad(f)(2., 3.))" ], - "execution_count": 41, + "execution_count": 55, "outputs": [ { "output_type": "stream", @@ -1619,16 +2100,16 @@ "metadata": { "id": "r0aZ79OmOAR5", "colab_type": "code", + "outputId": "e62fd6d9-ec63-4a41-c4cd-5be2c8095818", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "0b06b579-ba48-405a-98eb-c54069ac2f59" + } }, "source": [ "print(f(3.))" ], - "execution_count": 43, + "execution_count": 57, "outputs": [ { "output_type": "stream", @@ -1645,16 +2126,16 @@ "metadata": { "id": "7ToB9BYlm6uN", "colab_type": "code", + "outputId": "6835b89c-847a-4b82-ac19-1e19a7b9858c", "colab": { "base_uri": "https://localhost:8080/", "height": 85 - }, - "outputId": "8413a918-95b3-40ed-9062-202002550af4" + } }, "source": [ "print(grad(f)(3.))" ], - "execution_count": 44, + "execution_count": 58, "outputs": [ { "output_type": "stream", @@ -1673,11 +2154,11 @@ "metadata": { "id": "s1Pn_qCIODcF", "colab_type": "code", + "outputId": "991797e7-ec9d-45b8-b88c-1548d9919334", "colab": { "base_uri": "https://localhost:8080/", "height": 68 - }, - "outputId": "e9921a2e-4488-4cf9-bb0e-e2f2cae98806" + } }, "source": [ "from jax import vjp\n", @@ -1685,7 +2166,7 @@ "y, f_vjp = vjp(f, 3.)\n", "print(y)" ], - "execution_count": 45, + "execution_count": 59, "outputs": [ { "output_type": "stream", @@ -1703,16 +2184,16 @@ "metadata": { "id": "dvgQtDHaOHuo", "colab_type": "code", + "outputId": "02447bcd-2885-4883-cc09-a2b352ee3864", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "cbc26c6f-871a-46fc-a0b5-2c855b236f4b" + } }, "source": [ "print(f_vjp(1.))" ], - "execution_count": 46, + "execution_count": 60, "outputs": [ { "output_type": "stream", @@ -1739,11 +2220,11 @@ "metadata": { "id": "3RGQRbI_OSEX", "colab_type": "code", + "outputId": "f971d7d3-b323-4467-bbc2-3157f3381b64", "colab": { "base_uri": "https://localhost:8080/", "height": 68 - }, - "outputId": "2c4a7602-566b-4bb0-a591-5f2568a5427e" + } }, "source": [ "from jax import jvp\n", @@ -1753,7 +2234,7 @@ "except TypeError as e:\n", " print('ERROR! {}'.format(e))" ], - "execution_count": 47, + "execution_count": 61, "outputs": [ { "output_type": "stream", @@ -1910,18 +2391,18 @@ "metadata": { "id": "My8pbOlPppJj", "colab_type": "code", + "outputId": "8430db76-7c94-412d-d261-60614dff2dbc", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "2ef4c080-7ecb-425f-dbf9-8e2807529365" + } }, "source": [ "pt = Point(1., 2.)\n", "\n", "print(f(pt))" ], - "execution_count": 51, + "execution_count": 65, "outputs": [ { "output_type": "stream", @@ -1937,16 +2418,16 @@ "metadata": { "id": "a9qyiCAhqLd3", "colab_type": "code", + "outputId": "4184570b-a4b1-4297-da32-746b80bfb63f", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "36dfdb67-f5ca-4833-e37e-4e2488b96c0d" + } }, "source": [ "print(grad(fun)(pt))" ], - "execution_count": 52, + "execution_count": 66, "outputs": [ { "output_type": "stream", @@ -2004,18 +2485,18 @@ "metadata": { "id": "3onW7t6nrJ4E", "colab_type": "code", + "outputId": "75910cfc-dee5-461c-a646-2f9dcba8f674", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "ad13ae57-72e4-4b90-ac25-d4d6aa0f8161" + } }, "source": [ "pt = Point(1., 2.)\n", "\n", "print(f(pt))" ], - "execution_count": 54, + "execution_count": 68, "outputs": [ { "output_type": "stream", @@ -2031,16 +2512,16 @@ "metadata": { "id": "ryyeKIXtrNpd", "colab_type": "code", + "outputId": "e707a38e-f72f-40a6-ece4-499d21c9e5cb", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "4ce36200-6e27-4ba5-912a-8e86e7500bd0" + } }, "source": [ "print(grad(fun)(pt))" ], - "execution_count": 55, + "execution_count": 69, "outputs": [ { "output_type": "stream", @@ -2111,16 +2592,16 @@ "metadata": { "id": "5W-yEw9IB34S", "colab_type": "code", + "outputId": "0a0d493c-a1fd-4f76-8cec-f18522aa5774", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "d6bea705-49c9-4821-e1d5-f0a6e431130f" + } }, "source": [ "print(app(lambda x: x ** 3, 3.))" ], - "execution_count": 57, + "execution_count": 71, "outputs": [ { "output_type": "stream", @@ -2136,16 +2617,16 @@ "metadata": { "id": "zbVIlOmqB7_O", "colab_type": "code", + "outputId": "280d4b0a-e68b-4996-dd50-d66d129c8eec", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "d690ebab-e3b9-4836-adf8-2be0a743a5d6" + } }, "source": [ "print(grad(app, 1)(lambda x: x ** 3, 3.))" ], - "execution_count": 58, + "execution_count": 72, "outputs": [ { "output_type": "stream", @@ -2192,16 +2673,16 @@ "metadata": { "id": "J7GsvJTgCfS0", "colab_type": "code", + "outputId": "6963fd03-c952-467d-c117-39a53253b2b9", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "76b6754c-9465-493a-b191-492915c0614c" + } }, "source": [ "print(app2(lambda x: x ** 3, 3., lambda y: 5 * y))" ], - "execution_count": 60, + "execution_count": 74, "outputs": [ { "output_type": "stream", @@ -2217,16 +2698,16 @@ "metadata": { "id": "kPP8Jt1CCb1X", "colab_type": "code", + "outputId": "77f7d0a0-951b-44df-fb44-540a0e968072", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "152e181f-6ede-4fc6-9dbe-10bdc6483d64" + } }, "source": [ "print(grad(app2, 1)(lambda x: x ** 3, 3., lambda y: 5 * y))" ], - "execution_count": 61, + "execution_count": 75, "outputs": [ { "output_type": "stream", @@ -2285,16 +2766,16 @@ "metadata": { "id": "qSgcWa1eDj4r", "colab_type": "code", + "outputId": "6c34436a-1bdb-49db-a57f-b50f053c0cd4", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "28289e33-a96e-4f2d-e8c3-479232dfb36d" + } }, "source": [ "print(app(lambda x: x ** 2, 4.))" ], - "execution_count": 63, + "execution_count": 77, "outputs": [ { "output_type": "stream", @@ -2310,16 +2791,16 @@ "metadata": { "id": "tccagflcDmaz", "colab_type": "code", + "outputId": "d28015b9-47a9-4adc-e643-3fea37ac1d46", "colab": { "base_uri": "https://localhost:8080/", "height": 34 - }, - "outputId": "12eae540-65a9-4c17-ea82-e0965fae924e" + } }, "source": [ "print(grad(app, 1)(lambda x: x ** 2, 4.))" ], - "execution_count": 64, + "execution_count": 78, "outputs": [ { "output_type": "stream", @@ -2337,8 +2818,8 @@ "colab_type": "text" }, "source": [ - "See `fixed_point` above for another usage example." + "See `clip_gradient` and `fixed_point` above for other usage examples." ] } ] -} +} \ No newline at end of file From 15009c9014f0729d6198ea0140e27f2066ac6584 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 19:45:45 -0700 Subject: [PATCH 0973/1053] add docstring for defjvps, fix sphinx docs --- jax/custom_derivatives.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py index ca2bb21fff7c..bf8e9c5da48b 100644 --- a/jax/custom_derivatives.py +++ b/jax/custom_derivatives.py @@ -96,7 +96,7 @@ class custom_jvp: differentiation of the underlying function's implementation. There is a single instance method, ``defjvp``, which defines the custom JVP rule. - For example: + For example:: import jax.numpy as np @@ -139,7 +139,7 @@ def defjvp(self, jvp): Returns: None. - Example: + Example:: import jax.numpy as np @@ -158,7 +158,28 @@ def f_jvp(primals, tangents): self.jvp = jvp def defjvps(self, *jvps): - """Convenience wrapper for defining JVPs for each argument separately.""" + """Convenience wrapper for defining JVPs for each argument separately. + + This convenience wrapper cannot be used together with ``nondiff_argnums``. + + Args: + *jvps: a sequence of functions, one for each positional argument of the + ``custom_jvp`` function. Each function takes as arguments the tangent + value for the corresponding primal input, the primal output, and the + primal inputs. See the example below. + + Returns: + None. + + Example:: + + @jax.custom_jvp + def f(x, y): + return np.sin(x) * y + + f.defjvps(lambda x_dot, primal_out, x, y: np.cos(x) * x_dot * y, + lambda y_dot, primal_out, x, y: -np.sin(x) * y_dot) + """ if self.nondiff_argnums: raise TypeError("Can't use ``defjvps`` with ``nondiff_argnums``.") @@ -333,7 +354,7 @@ class custom_vjp: This decorator precludes the use of forward-mode automatic differentiation. - For example: + For example:: import jax.numpy as np @@ -387,7 +408,7 @@ def defvjp(self, fwd, bwd): Returns: None. - Example: + Example:: import jax.numpy as np From 1f03d48c836227a9fe39022ba4cc4212fbdba9e9 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 20:10:39 -0700 Subject: [PATCH 0974/1053] try resetting global tracer state in loops_test.py attempting to address #2507 --- tests/loops_test.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/loops_test.py b/tests/loops_test.py index b8f99e4d34b8..6dd21c5d73e2 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -27,6 +27,15 @@ from jax.config import config config.parse_flags_with_absl() +# Attempted fix for https://github.com/google/jax/issues/2507 based on resetting +# the global trace state. It could be that methods like _BodyTracer.end_subtrace +# are not cleaning up global trace state after exceptions because they don't use +# a try/finally pattern. This is just a guess though! +# TODO(mattjj,necula): check this attempted fix +from jax import core +def tearDownModule(): + core.trace_state = core.TraceState() + class LoopsTest(jtu.JaxTestCase): def test_scope_no_loops(self): From b015e5716999b80e1bdb15749e5f040dec8955c0 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 20:12:33 -0700 Subject: [PATCH 0975/1053] try re-enabling control tests that trigger #2507 --- examples/control_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/control_test.py b/examples/control_test.py index b172b2752be5..354e895765dc 100644 --- a/examples/control_test.py +++ b/examples/control_test.py @@ -215,7 +215,6 @@ def testMpcWithLqrProblem(self): self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) - @jtu.skip_on_devices("cpu") # TODO(mattjj,froystig): only fails on travis? def testMpcWithLqrProblemSpecifiedGenerally(self): randn = onp.random.RandomState(0).randn dim, T, num_iters = 2, 10, 3 @@ -229,7 +228,6 @@ def testMpcWithLqrProblemSpecifiedGenerally(self): self.assertAllClose(U[1:], np.zeros((T - 1, 2)), check_dtypes=True) - @jtu.skip_on_devices("cpu") # TODO(mattjj,froystig): only fails on travis? def testMpcWithNonlinearProblem(self): def cost(t, x, u): return (x[0] ** 2. + 1e-3 * u[0] ** 2.) / (t + 1.) From 909fee6a2d4b0cdb70bb3c85d5cb9a317996c596 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 20:22:04 -0700 Subject: [PATCH 0976/1053] try adding sphinx-autodoc-typehints --- docs/conf.py | 1 + docs/requirements.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 90f8a92390a5..9ef10a9dd8cd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -60,6 +60,7 @@ 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', 'nbsphinx', + 'sphinx_autodoc_typehints', ] intersphinx_mapping = { diff --git a/docs/requirements.txt b/docs/requirements.txt index ac8fd2a93de7..c7f76dce02e1 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -3,6 +3,7 @@ sphinx_rtd_theme jaxlib ipykernel nbsphinx +sphinx-autodoc-typehints # The next packages are for notebooks matplotlib sklearn From e7be43da8a6b03b109a5c280a21924b8a2294ee5 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 21:09:12 -0700 Subject: [PATCH 0977/1053] update api.py docstrings for sphinx highlighting --- jax/api.py | 214 ++++++++++++++++++++++++++--------------------------- 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/jax/api.py b/jax/api.py index 0b79074b8d9b..8c42bfedf991 100644 --- a/jax/api.py +++ b/jax/api.py @@ -85,23 +85,22 @@ def __init__(self): def jit(fun: Callable, static_argnums: Union[int, Iterable[int]] = (), device=None, backend: Optional[str] = None) -> Callable: - """Sets up `fun` for just-in-time compilation with XLA. + """Sets up ``fun`` for just-in-time compilation with XLA. Args: fun: Function to be jitted. Should be a pure function, as side-effects may only be executed once. Its arguments and return value should be arrays, scalars, or (nested) standard Python containers (tuple/list/dict) thereof. - - Positional arguments indicated by `static_argnums` can be anything at all, - provided they are hashable and have an equality operation defined. Static - arguments are included as part of a compilation cache key, which is why - hash and equality operators must be defined. + Positional arguments indicated by ``static_argnums`` can be anything at + all, provided they are hashable and have an equality operation defined. + Static arguments are included as part of a compilation cache key, which is + why hash and equality operators must be defined. static_argnums: An int or collection of ints specifying which positional arguments to treat as static (compile-time constant). Operations that only depend on static arguments will be constant-folded. Calling the jitted function with different values for these constants will trigger recompilation. If the jitted function is called with fewer positional - arguments than indicated by `static_argnums` then an error is raised. + arguments than indicated by ``static_argnums`` then an error is raised. Defaults to (). device: This is an experimental feature and the API is likely to change. Optional, the Device the jitted function will run on. (Available devices @@ -111,10 +110,10 @@ def jit(fun: Callable, static_argnums: Union[int, Iterable[int]] = (), Optional, a string representing the xla backend. 'cpu','gpu', or 'tpu'. Returns: - A wrapped version of `fun`, set up for just-in-time compilation. + A wrapped version of ``fun``, set up for just-in-time compilation. - In the following example, `selu` can be compiled into a single fused kernel by - XLA: + In the following example, ``selu`` can be compiled into a single fused kernel + by XLA: >>> @jax.jit >>> def selu(x, alpha=1.67, lmbda=1.05): @@ -157,9 +156,9 @@ def f_jitted(*args, **kwargs): @contextmanager def disable_jit(): - """Context manager that disables `jit` behavior under its dynamic context. + """Context manager that disables ``jit`` behavior under its dynamic context. - For debugging purposes, it is useful to have a mechanism that disables `jit` + For debugging purposes, it is useful to have a mechanism that disables ``jit`` everywhere in a dynamic context. Values that have a data dependence on the arguments to a jitted function are @@ -179,10 +178,10 @@ def disable_jit(): Value of y is Traced [5 7 9] - Here `y` has been abstracted by `jit` to a `ShapedArray`, which represents an - array with a fixed shape and type but an arbitrary value. It's also traced. If - we want to see a concrete value while debugging, and avoid the tracer too, we - can use the `disable_jit` context manager: + Here ``y`` has been abstracted by ``jit`` to a ``ShapedArray``, which + represents an array with a fixed shape and type but an arbitrary value. It's + also traced. If we want to see a concrete value while debugging, and avoid the + tracer too, we can use the ``disable_jit`` context manager: >>> with jax.disable_jit(): >>> print(f(np.array([1, 2, 3]))) @@ -328,28 +327,28 @@ def computation_maker(*args, **kwargs): def grad(fun: Callable, argnums: Union[int, Sequence[int]] = 0, has_aux: bool = False, holomorphic: bool = False) -> Callable: - """Creates a function which evaluates the gradient of `fun`. + """Creates a function which evaluates the gradient of ``fun``. Args: fun: Function to be differentiated. Its arguments at positions specified by - `argnums` should be arrays, scalars, or standard Python containers. It - should return a scalar (which includes arrays with shape `()` but not - arrays with shape `(1,)` etc.) + ``argnums`` should be arrays, scalars, or standard Python containers. It + should return a scalar (which includes arrays with shape ``()`` but not + arrays with shape ``(1,)`` etc.) argnums: Optional, integer or sequence of integers. Specifies which positional argument(s) to differentiate with respect to (default 0). - has_aux: Optional, bool. Indicates whether `fun` returns a pair where the + has_aux: Optional, bool. Indicates whether ``fun`` returns a pair where the first element is considered the output of the mathematical function to be differentiated and the second element is auxiliary data. Default False. - holomorphic: Optional, bool. Indicates whether `fun` is promised to be + holomorphic: Optional, bool. Indicates whether ``fun`` is promised to be holomorphic. Default False. Returns: - A function with the same arguments as `fun`, that evaluates the gradient of - `fun`. If `argnums` is an integer then the gradient has the same shape and - type as the positional argument indicated by that integer. If argnums is a - tuple of integers, the gradient is a tuple of values with the same shapes - and types as the corresponding arguments. If `has_aux` is True then a pair - of (gradient, auxiliary_data) is returned. + A function with the same arguments as ``fun``, that evaluates the gradient + of ``fun``. If ``argnums`` is an integer then the gradient has the same + shape and type as the positional argument indicated by that integer. If + argnums is a tuple of integers, the gradient is a tuple of values with the + same shapes and types as the corresponding arguments. If ``has_aux`` is True + then a pair of (gradient, auxiliary_data) is returned. For example: @@ -379,28 +378,28 @@ def grad_f_aux(*args, **kwargs): def value_and_grad(fun: Callable, argnums: Union[int, Sequence[int]] = 0, has_aux: bool = False, holomorphic: bool = False) -> Callable: - """Creates a function which evaluates both `fun` and the gradient of `fun`. + """Create a function which evaluates both ``fun`` and the gradient of ``fun``. Args: fun: Function to be differentiated. Its arguments at positions specified by - `argnums` should be arrays, scalars, or standard Python containers. It - should return a scalar (which includes arrays with shape `()` but not - arrays with shape `(1,)` etc.) + ``argnums`` should be arrays, scalars, or standard Python containers. It + should return a scalar (which includes arrays with shape ``()`` but not + arrays with shape ``(1,)`` etc.) argnums: Optional, integer or sequence of integers. Specifies which positional argument(s) to differentiate with respect to (default 0). - has_aux: Optional, bool. Indicates whether `fun` returns a pair where the + has_aux: Optional, bool. Indicates whether ``fun`` returns a pair where the first element is considered the output of the mathematical function to be differentiated and the second element is auxiliary data. Default False. - holomorphic: Optional, bool. Indicates whether `fun` is promised to be + holomorphic: Optional, bool. Indicates whether ``fun`` is promised to be holomorphic. Default False. Returns: - A function with the same arguments as `fun` that evaluates both `fun` and - the gradient of `fun` and returns them as a pair (a two-element tuple). If - `argnums` is an integer then the gradient has the same shape and type as the - positional argument indicated by that integer. If argnums is a sequence of - integers, the gradient is a tuple of values with the same shapes and types - as the corresponding arguments. + A function with the same arguments as ``fun`` that evaluates both ``fun`` + and the gradient of ``fun`` and returns them as a pair (a two-element + tuple). If ``argnums`` is an integer then the gradient has the same shape + and type as the positional argument indicated by that integer. If argnums is + a sequence of integers, the gradient is a tuple of values with the same + shapes and types as the corresponding arguments. """ docstr = ("Value and gradient of {fun} with respect to positional " @@ -458,18 +457,18 @@ def _check_scalar(x): def jacfwd(fun: Callable, argnums: Union[int, Sequence[int]] = 0, holomorphic: bool = False) -> Callable: - """Jacobian of `fun` evaluated column-by-column using forward-mode AD. + """Jacobian of ``fun`` evaluated column-by-column using forward-mode AD. Args: fun: Function whose Jacobian is to be computed. argnums: Optional, integer or sequence of integers. Specifies which - positional argument(s) to differentiate with respect to (default `0`). - holomorphic: Optional, bool. Indicates whether `fun` is promised to be + positional argument(s) to differentiate with respect to (default ``0``). + holomorphic: Optional, bool. Indicates whether ``fun`` is promised to be holomorphic. Default False. Returns: - A function with the same arguments as `fun`, that evaluates the Jacobian of - `fun` using forward-mode automatic differentiation. + A function with the same arguments as ``fun``, that evaluates the Jacobian of + ``fun`` using forward-mode automatic differentiation. >>> def f(x): ... return jax.numpy.asarray( @@ -497,25 +496,25 @@ def _check_real_input_jacfwd(x): aval = core.get_aval(x) if not dtypes.issubdtype(aval.dtype, onp.floating): msg = ("jacfwd only defined for functions with input dtypes that are " - "sub-dtypes of `np.floating` (i.e. that model real values), but got " - "{}. For holomorphic differentiation, pass holomorphic=True.") + "sub-dtypes of `np.floating` (i.e. that model real values), but " + "got {}. For holomorphic differentiation, pass holomorphic=True.") raise TypeError(msg.format(aval.dtype.name)) def jacrev(fun: Callable, argnums: Union[int, Sequence[int]] = 0, holomorphic: bool = False) -> Callable: - """Jacobian of `fun` evaluated row-by-row using reverse-mode AD. + """Jacobian of ``fun`` evaluated row-by-row using reverse-mode AD. Args: fun: Function whose Jacobian is to be computed. - argnums: Optional, integer or sequence of integers. Specifies which positional - argument(s) to differentiate with respect to (default `0`). - holomorphic: Optional, bool. Indicates whether `fun` is promised to be + argnums: Optional, integer or sequence of integers. Specifies which + positional argument(s) to differentiate with respect to (default ``0``). + holomorphic: Optional, bool. Indicates whether ``fun`` is promised to be holomorphic. Default False. Returns: - A function with the same arguments as `fun`, that evaluates the Jacobian of - `fun` using reverse-mode automatic differentiation. + A function with the same arguments as ``fun``, that evaluates the Jacobian of + ``fun`` using reverse-mode automatic differentiation. >>> def f(x): ... return jax.numpy.asarray( @@ -545,25 +544,25 @@ def _check_real_output_jacrev(x): aval = core.get_aval(x) if not dtypes.issubdtype(aval.dtype, onp.floating): msg = ("jacrev only defined for functions with output dtypes that are " - "sub-dtypes of `np.floating` (i.e. that model real values), but got " - "{}. For holomorphic differentiation, pass holomorphic=True.") + "sub-dtypes of `np.floating` (i.e. that model real values), but " + "got {}. For holomorphic differentiation, pass holomorphic=True.") raise TypeError(msg.format(aval.dtype.name)) def hessian(fun: Callable, argnums: Union[int, Sequence[int]] = 0, holomorphic: bool = False) -> Callable: - """Hessian of `fun`. + """Hessian of ``fun`` as a dense array. Args: fun: Function whose Hessian is to be computed. argnums: Optional, integer or sequence of integers. Specifies which - positional argument(s) to differentiate with respect to (default `0`). - holomorphic: Optional, bool. Indicates whether `fun` is promised to be + positional argument(s) to differentiate with respect to (default ``0``). + holomorphic: Optional, bool. Indicates whether ``fun`` is promised to be holomorphic. Default False. Returns: - A function with the same arguments as `fun`, that evaluates the Hessian of - `fun`. + A function with the same arguments as ``fun``, that evaluates the Hessian of + ``fun``. >>> g = lambda(x): x[0]**3 - 2*x[0]*x[1] - x[1]**6 >>> print(jax.hessian(g)(jax.numpy.array([1., 2.]))) @@ -599,7 +598,7 @@ def _dtype(x): def vmap(fun: Callable, in_axes=0, out_axes=0) -> Callable: - """Vectorizing map. Creates a function which maps `fun` over argument axes. + """Vectorizing map. Creates a function which maps ``fun`` over argument axes. Args: fun: Function to be mapped over additional axes. @@ -796,7 +795,7 @@ def pmap(fun: Callable, axis_name: Optional[AxisName] = None, Operations that only depend on static arguments will be constant-folded. Calling the pmaped function with different values for these constants will trigger recompilation. If the pmaped function is called with fewer - positional arguments than indicated by `static_argnums` then an error is + positional arguments than indicated by ``static_argnums`` then an error is raised. Each of the static arguments will be broadcasted to all devices. Defaults to (). devices: This is an experimental feature and the API is likely to change. @@ -1130,24 +1129,26 @@ def _shape_spec_consistent(spec, expr): def jvp(fun: Callable, primals, tangents) -> Tuple[Any, Any]: - """Computes a (forward-mode) Jacobian-vector product of `fun`. + """Computes a (forward-mode) Jacobian-vector product of ``fun``. Args: fun: Function to be differentiated. Its arguments should be arrays, scalars, or standard Python containers of arrays or scalars. It should return an array, scalar, or standard Python container of arrays or scalars. - primals: The primal values at which the Jacobian of `fun` should be + primals: The primal values at which the Jacobian of ``fun`` should be evaluated. Should be either a tuple or a list of arguments, - and its length should equal to the number of positional parameters of `fun`. + and its length should equal to the number of positional parameters of + ``fun``. tangents: The tangent vector for which the Jacobian-vector product should be evaluated. Should be either a tuple or a list of tangents, with the same - tree structure and array shapes as `primals`. + tree structure and array shapes as ``primals``. Returns: - A `(primals_out, tangents_out)` pair, where `primals_out` is - `fun(*primals)`, and `tangents_out` is the Jacobian-vector product of - `function` evaluated at `primals` with `tangents`. The `tangents_out` value - has the same Python tree structure and shapes as `primals_out`. + A ``(primals_out, tangents_out)`` pair, where ``primals_out`` is + ``fun(*primals)``, and ``tangents_out`` is the Jacobian-vector product of + ``function`` evaluated at ``primals`` with ``tangents``. The + ``tangents_out`` value has the same Python tree structure and shapes as + ``primals_out``. For example: @@ -1185,49 +1186,49 @@ def _jvp(fun: lu.WrappedFun, primals, tangents): tree_unflatten(out_tree(), out_tangents)) def linearize(fun: Callable, *primals) -> Tuple[Any, Callable]: - """Produce a linear approximation to `fun` using `jvp` and partial evaluation. + """Produce a linear approximation to ``fun`` using ``jvp`` and partial eval. Args: fun: Function to be differentiated. Its arguments should be arrays, scalars, or standard Python containers of arrays or scalars. It should return an array, scalar, or standard python container of arrays or scalars. - primals: The primal values at which the Jacobian of `fun` should be + primals: The primal values at which the Jacobian of ``fun`` should be evaluated. Should be a tuple of arrays, scalar, or standard Python container thereof. The length of the tuple is equal to the number of - positional parameters of `fun`. + positional parameters of ``fun``. Returns: - A pair where the first element is the value of `f(*primals)` and the second - element is a function that evaluates the (forward-mode) Jacobian-vector - product of `fun` evaluated at `primals` without re-doing the linearization - work. + A pair where the first element is the value of ``f(*primals)`` and the + second element is a function that evaluates the (forward-mode) + Jacobian-vector product of ``fun`` evaluated at ``primals`` without re-doing + the linearization work. - In terms of values computed, `linearize` behaves much like a curried `jvp`, - where these two code blocks compute the same values:: + In terms of values computed, ``linearize`` behaves much like a curried + ``jvp``, where these two code blocks compute the same values:: y, out_tangent = jax.jvp(f, (x,), (in_tangent,)) y, f_jvp = jax.linearize(f, x) out_tangent = f_jvp(in_tangent) - However, the difference is that `linearize` uses partial evaluation so that - the function `f` is not re-linearized on calls to `f_jvp`. In general that + However, the difference is that ``linearize`` uses partial evaluation so that + the function ``f`` is not re-linearized on calls to ``f_jvp``. In general that means the memory usage scales with the size of the computation, much like in - reverse-mode. (Indeed, `linearize` has a similar signature to `vjp`!) + reverse-mode. (Indeed, ``linearize`` has a similar signature to ``vjp``!) - This function is mainly useful if you want to apply `f_jvp` multiple times, + This function is mainly useful if you want to apply ``f_jvp`` multiple times, i.e. to evaluate a pushforward for many different input tangent vectors at the same linearization point. Moreover if all the input tangent vectors are known - at once, it can be more efficient to vectorize using `vmap`, as in:: + at once, it can be more efficient to vectorize using ``vmap``, as in:: pushfwd = partial(jvp, f, (x,)) y, out_tangents = vmap(pushfwd, out_axes=(None, 0))((in_tangents,)) - By using `vmap` and `jvp` together like this we avoid the stored-linearization + By using ``vmap`` and ``jvp`` together like this we avoid the stored-linearization memory cost that scales with the depth of the computation, which is incurred - by both `linearize` and `vjp`. + by both ``linearize`` and ``vjp``. - Here's a more complete example of using `linearize`: + Here's a more complete example of using ``linearize``: >>> def f(x): return 3. * np.sin(x) + np.cos(x / 2.) ... @@ -1294,19 +1295,19 @@ def _vjp_pullback_wrapper(fun, cotangent_dtypes, io_tree, py_args): def vjp(fun: Callable, *primals, **kwargs ) -> Union[Tuple[Any, Callable], Tuple[Any, Callable, Any]]: - """Compute a (reverse-mode) vector-Jacobian product of `fun`. + """Compute a (reverse-mode) vector-Jacobian product of ``fun``. - :py:func:`grad` is implemented as a special case of :py:func:`vjp`. + :py:func:``grad`` is implemented as a special case of :py:func:``vjp``. Args: fun: Function to be differentiated. Its arguments should be arrays, scalars, or standard Python containers of arrays or scalars. It should return an array, scalar, or standard Python container of arrays or scalars. - primals: A sequence of primal values at which the Jacobian of `fun` - should be evaluated. The length of `primals` should be equal to the number - of positional parameters to `fun`. Each primal value should be a tuple of - arrays, scalar, or standard Python containers thereof. - has_aux: Optional, bool. Indicates whether `fun` returns a pair where the + primals: A sequence of primal values at which the Jacobian of ``fun`` + should be evaluated. The length of ``primals`` should be equal to the + number of positional parameters to ``fun``. Each primal value should be a + tuple of arrays, scalar, or standard Python containers thereof. + has_aux: Optional, bool. Indicates whether ``fun`` returns a pair where the first element is considered the output of the mathematical function to be differentiated and the second element is auxiliary data. Default False. @@ -1360,23 +1361,22 @@ def make_jaxpr(fun: Callable) -> Callable[..., core.TypedJaxpr]: """Creates a function that produces its jaxpr given example args. Args: - fun: The function whose `jaxpr` is to be computed. Its positional arguments - and return value should be arrays, scalars, or standard Python containers - (tuple/list/dict) thereof. + fun: The function whose ``jaxpr`` is to be computed. Its positional + arguments and return value should be arrays, scalars, or standard Python + containers (tuple/list/dict) thereof. Returns: - A wrapped version of `fun` that when applied to example arguments returns a - TypedJaxpr representation of `fun` on those arguments. - - A `jaxpr` is JAX's intermediate representation for program traces. The `jaxpr` - language is based on the simply-typed first-order lambda calculus with - let-bindings. `make_jaxpr` adapts a function to return its `jaxpr`, which we - can inspect to understand what JAX is doing internally. + A wrapped version of ``fun`` that when applied to example arguments returns a + ``TypedJaxpr`` representation of ``fun`` on those arguments. - The `jaxpr` returned is a trace of `fun` abstracted to `ShapedArray` level. - Other levels of abstraction exist internally. + A ``jaxpr`` is JAX's intermediate representation for program traces. The + ``jaxpr`` language is based on the simply-typed first-order lambda calculus + with let-bindings. ``make_jaxpr`` adapts a function to return its ``jaxpr``, + which we can inspect to understand what JAX is doing internally. The ``jaxpr`` + returned is a trace of ``fun`` abstracted to ``ShapedArray`` level. Other + levels of abstraction exist internally. - We do not describe the semantics of the `jaxpr` language in detail here, but + We do not describe the semantics of the ``jaxpr`` language in detail here, but instead give a few examples. >>> def f(x): return jax.numpy.sin(jax.numpy.cos(x)) From 7a9c550ed143b01f97ec4e2a15f4937994918326 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 21:30:47 -0700 Subject: [PATCH 0978/1053] add sphinx-autodoc-typehints to travis install --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0bba0288d138..e5c4a73976f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ install: # The following are needed to test the Colab notebooks and the documentation building - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then conda install --yes -c conda-forge pandoc ipykernel; - conda install --yes sphinx sphinx_rtd_theme nbsphinx jupyter_client matplotlib; + conda install --yes sphinx sphinx_rtd_theme nbsphinx sphinx-autodoc-typehints jupyter_client matplotlib; pip install sklearn; fi script: From e017a923a224737d8dd9fb145febe5ff479f3d4a Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 22:06:00 -0700 Subject: [PATCH 0979/1053] fix typo --- jax/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/core.py b/jax/core.py index e53253446bbf..01916a6a0560 100644 --- a/jax/core.py +++ b/jax/core.py @@ -328,7 +328,7 @@ def __repr__(self): return '{}(level={}/{})'.format( self.__class__.__name__, self.level, self.sublevel) - def procecss_call(self, call_primitive, f, tracers, params): + def process_call(self, call_primitive, f, tracers, params): raise NotImplementedError("must override to handle call-like primitives") def process_custom_jvp_call(self, primitive, fun, jvp, tracers): From 27604c3989ee15a58235a0e6e9b13fd8243fa8a9 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 22:11:35 -0700 Subject: [PATCH 0980/1053] fix typo in notebook --- docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb index 199f5382b1d0..0a0b24e9a054 100644 --- a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -1518,7 +1518,7 @@ "colab_type": "text" }, "source": [ - "Here's the `defjvps` convenience wrapper version:" + "Here's a `defjvps` example with multiple arguments:" ] }, { @@ -2822,4 +2822,4 @@ ] } ] -} \ No newline at end of file +} From a4ceae1c001967a1fdedaa054b4ee8f05ca2ca1b Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Mon, 30 Mar 2020 22:12:38 -0700 Subject: [PATCH 0981/1053] fix link in custom derivatives tutorial notebook --- docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb index 0a0b24e9a054..f3551a6a7598 100644 --- a/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb +++ b/docs/notebooks/Custom_derivative_rules_for_Python_code.ipynb @@ -1983,7 +1983,7 @@ "source": [ "In words, we again start with a a primal function `f` that takes inputs of type `a` and produces outputs of type `b`. We associate with it two functions, `f_fwd` and `f_bwd`, which describe how to perform the forward- and backward-passes of reverse-mode autodiff, respectively.\n", "\n", - "The function `f_fwd` describes the forward pass, not only the primal computation but also what values to save for use on the backward pass. Its input signature is just like that of the primal function `f`, in that it takes a primal input of type `a`. But as output it produces a pair, where the first element is the primal output `b` and the second element is any \"residual\" data of type `c` to be stored for use by the backward pass. (This second output is analogous to [PyTorch's `save_for_backward` mechanism](https://pytorch.org/tutorials/beginner/examples_autograd/two_layer_net_custom_function.html).)\n", + "The function `f_fwd` describes the forward pass, not only the primal computation but also what values to save for use on the backward pass. Its input signature is just like that of the primal function `f`, in that it takes a primal input of type `a`. But as output it produces a pair, where the first element is the primal output `b` and the second element is any \"residual\" data of type `c` to be stored for use by the backward pass. (This second output is analogous to [PyTorch's save_for_backward mechanism](https://pytorch.org/tutorials/beginner/examples_autograd/two_layer_net_custom_function.html).)\n", "\n", "The function `f_bwd` describes the backward pass. It takes two inputs, where the first is the residual data of type `c` produced by `f_fwd` and the second is the output cotangents of type `CT b` corresponding to the output of the primal function. It produces an output of type `CT a` representing the cotangents corresponding to the input of the primal function. In particular, the output of `f_bwd` must be a sequence (e.g. a tuple) of length equal to the number of arguments to the primal function." ] From fd52fbf411c41914b36e26958f04ce4b8e3adfd4 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 31 Mar 2020 10:36:47 +0200 Subject: [PATCH 0982/1053] Fix import in benchmarks This works on my machine as 'python benchmarks/pmap_benchmark.py'. It also follows the code in examples. This will need a copybara rule to change the import to 'from jax.benchmarks import benchmark' --- benchmarks/pmap_benchmark.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/pmap_benchmark.py b/benchmarks/pmap_benchmark.py index 654c2ce2201e..0a60ba0731f6 100644 --- a/benchmarks/pmap_benchmark.py +++ b/benchmarks/pmap_benchmark.py @@ -25,7 +25,7 @@ from jax import pmap from jax.config import config -import benchmark +from benchmarks import benchmark import numpy as onp From 59ed4aeaed4637f2c6e14f925ee873e2e1dcad92 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 31 Mar 2020 11:11:47 +0200 Subject: [PATCH 0983/1053] Disable test_while_loop_of_pmap on all platforms Issue: #2554 Disable the test so that we can continue the google3 tests --- tests/lax_control_flow_test.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 961825f157e7..4e08a8055967 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1816,10 +1816,9 @@ def arange(n): expected = onp.arange(10) self.assertAllClose(ans, expected, check_dtypes=False) + @jtu.skip_on_devices("tpu", "gpu", "cpu")# TODO(mattjj): follow up w/ xla + # Issue #2554 def test_while_loop_of_pmap(self): - if api.device_count() == 1 and xla_bridge.get_backend().platform == 'cpu': - raise SkipTest("test segfaults on cpu") # TODO(mattjj): follow up w/ xla - # code from jsnoek@ def body(i, x): result = api.pmap(lambda z: lax.psum(np.sin(z), 'i'), axis_name='i')(x) From bd1708c70734eeae116c00ecf8e65da1aa01dbf3 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 31 Mar 2020 10:02:38 -0400 Subject: [PATCH 0984/1053] Update changelog and README for jaxlib 0.1.43. (#2556) --- README.md | 4 ++-- docs/CHANGELOG.rst | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0f639cc4237f..ab903f6cc6ab 100644 --- a/README.md +++ b/README.md @@ -412,7 +412,7 @@ PYTHON_VERSION=cp37 # alternatives: cp36, cp37, cp38 CUDA_VERSION=cuda92 # alternatives: cuda92, cuda100, cuda101, cuda102 PLATFORM=linux_x86_64 # alternatives: linux_x86_64 BASE_URL='https://storage.googleapis.com/jax-releases' -pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.42-$PYTHON_VERSION-none-$PLATFORM.whl +pip install --upgrade $BASE_URL/$CUDA_VERSION/jaxlib-0.1.43-$PYTHON_VERSION-none-$PLATFORM.whl pip install --upgrade jax # install jax ``` @@ -436,7 +436,7 @@ more. To try automatic detection of the correct version for your system, you can run: ```bash -pip install --upgrade https://storage.googleapis.com/jax-releases/`nvcc -V | sed -En "s/.* release ([0-9]*)\.([0-9]*),.*/cuda\1\2/p"`/jaxlib-0.1.42-`python3 -V | sed -En "s/Python ([0-9]*)\.([0-9]*).*/cp\1\2/p"`-none-linux_x86_64.whl jax +pip install --upgrade https://storage.googleapis.com/jax-releases/`nvcc -V | sed -En "s/.* release ([0-9]*)\.([0-9]*),.*/cuda\1\2/p"`/jaxlib-0.1.43-`python3 -V | sed -En "s/Python ([0-9]*)\.([0-9]*).*/cp\1\2/p"`-none-linux_x86_64.whl jax ``` Please let us know on [the issue tracker](https://github.com/google/jax/issues) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index a029eea4931f..047e224d53f0 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -12,6 +12,11 @@ These are the release notes for JAX. jax 0.1.63 (unreleased) --------------------------- +jaxlib 0.1.43 (March 31, 2020) +------------------------------ + +* Fixed a performance regression for Resnet-50 on GPU. + jax 0.1.62 (March 21, 2020) --------------------------- From 29c581bdb40d43cfe89f7b62ad0e2b68847e7e6f Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 31 Mar 2020 11:54:57 -0700 Subject: [PATCH 0985/1053] don't hardcode array size in test Fixes #2554 --- tests/lax_control_flow_test.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 4e08a8055967..11774d97bb10 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1816,22 +1816,21 @@ def arange(n): expected = onp.arange(10) self.assertAllClose(ans, expected, check_dtypes=False) - @jtu.skip_on_devices("tpu", "gpu", "cpu")# TODO(mattjj): follow up w/ xla - # Issue #2554 def test_while_loop_of_pmap(self): # code from jsnoek@ + def body(i, x): result = api.pmap(lambda z: lax.psum(np.sin(z), 'i'), axis_name='i')(x) return result + x f_loop = lambda x: lax.fori_loop(0, 3, body, x) - ans = f_loop(np.ones(8)) + ans = f_loop(np.ones(api.device_count())) del body, f_loop def body2(i, x): result = np.broadcast_to(np.sin(x).sum(), x.shape) return result + x g_loop = lambda x: lax.fori_loop(0, 3, body2, x) - expected = g_loop(np.ones(8)) + expected = g_loop(np.ones(api.device_count())) self.assertAllClose(ans, expected, check_dtypes=False) From 949d42315ac37be09682dc99e4d71812e3b562aa Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 31 Mar 2020 13:07:59 -0700 Subject: [PATCH 0986/1053] improve error message for #2554 --- jax/interpreters/xla.py | 5 +++++ tests/lax_control_flow_test.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index b857f7e0400c..b368afbc5c25 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -185,6 +185,11 @@ def xla_primitive_callable(prim, *arg_specs, **params): nreps = initial_style_primitive_replicas(params) else: nreps = 1 + if nreps > xb.device_count(backend): + msg = ("compiling a primitive computation `{}` that requires {} replicas, " + "but only {} XLA devices are available on backend {}.") + raise ValueError(msg.format(prim, nreps, xb.device_count(backend), + backend.platform)) built_c = primitive_computation(prim, AxisEnv(nreps), backend, tuple_args, *avals, **params) options = xb.get_compile_options( diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 11774d97bb10..dbe87b5f7883 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -1834,6 +1834,23 @@ def body2(i, x): self.assertAllClose(ans, expected, check_dtypes=False) + def test_while_loop_of_pmap_error_message(self): + + def body(i, x): + result = api.pmap(lambda z: lax.psum(np.sin(z), 'i'), axis_name='i')(x) + return result + x + f_loop = lambda x: lax.fori_loop(0, 3, body, x) + + too_big = 2 * api.device_count() + + self.assertRaisesRegex( + ValueError, + re.escape( + "compiling a primitive computation `while` that requires {} " + "replicas, but only {} XLA devices are available on backend {}." + .format(too_big, api.device_count(), jtu.device_under_test())), + lambda: f_loop(np.ones(too_big))) + if __name__ == '__main__': absltest.main() From bfbd0b800fe0008e5fd4db07415d6278b18d5f04 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 31 Mar 2020 17:09:14 -0400 Subject: [PATCH 0987/1053] Move tuple_arguments onto Compile() instead of Execute(). (#2559) Update minimum jaxlib version to 0.1.43. --- .travis.yml | 2 +- jax/interpreters/pxla.py | 19 +++++++++--------- jax/interpreters/sharded_jit.py | 3 +-- jax/interpreters/xla.py | 35 ++++++++++++++++----------------- jax/lib/__init__.py | 2 +- 5 files changed, 29 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index e5c4a73976f5..0d18adcc384c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ install: # The jaxlib version should match the minimum jaxlib version in # jax/lib/__init__.py. This tests JAX PRs against the oldest permitted # jaxlib. - - pip install jaxlib==0.1.41 + - pip install jaxlib==0.1.43 - pip install -v . # The following are needed to test the Colab notebooks and the documentation building - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index eca1cca69f2a..331aece5f138 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -572,12 +572,13 @@ def dynamic_fun(dummy, *args): % (num_global_replicas, len(devices))) device_assignment = tuple(d.id for d in devices) - compiled = built.Compile( - compile_options=xb.get_compile_options( + compile_options = xb.get_compile_options( num_replicas=num_global_replicas, num_partitions=1, - device_assignment=device_assignment), - backend=xb.get_backend(backend)) + device_assignment=device_assignment) + compile_options.tuple_arguments = tuple_args + compiled = built.Compile(compile_options=compile_options, + backend=xb.get_backend(backend)) handle_args = partial(shard_args, backend, compiled.local_devices(), assign_shards_to_replicas(num_local_replicas, axis_size), @@ -585,8 +586,8 @@ def dynamic_fun(dummy, *args): handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, out_pvals, compiled.local_devices(), backend) - return partial(execute_replicated, compiled, backend, handle_args, handle_outs, - tuple_args) + return partial(execute_replicated, compiled, backend, handle_args, + handle_outs) multi_host_supported_collectives: Set[core.Primitive] = set() @@ -667,11 +668,9 @@ def _pval_to_result_handler(axis_size, nrep, pval, devices, backend): else: return aval_to_result_handler(axis_size, nrep, pv) -def execute_replicated(compiled, backend, in_handler, out_handler, tuple_args, - *args): +def execute_replicated(compiled, backend, in_handler, out_handler, *args): input_bufs = in_handler(args) - out_bufs = compiled.ExecuteOnLocalDevices( - list(input_bufs), tuple_arguments=tuple_args) + out_bufs = compiled.ExecuteOnLocalDevices(list(input_bufs)) return out_handler(out_bufs) diff --git a/jax/interpreters/sharded_jit.py b/jax/interpreters/sharded_jit.py index edece2d05214..5ab567476b0c 100644 --- a/jax/interpreters/sharded_jit.py +++ b/jax/interpreters/sharded_jit.py @@ -203,8 +203,7 @@ def _sharded_jit_translation_rule(c, axis_env, freevar_nodes, def _execute_spatially_partitioned(compiled, in_handler, out_handler, *args): input_bufs = in_handler(args) - out_bufs = compiled.ExecuteOnLocalDevices( - list(input_bufs), tuple_arguments=False) + out_bufs = compiled.ExecuteOnLocalDevices(list(input_bufs)) return out_handler(out_bufs) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index b368afbc5c25..0171677e0727 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -196,13 +196,14 @@ def xla_primitive_callable(prim, *arg_specs, **params): num_replicas=nreps, num_partitions=1, device_assignment=device and (device.id,)) + options.tuple_arguments = tuple_args compiled = built_c.Compile(compile_options=options, backend=backend) if nreps == 1: return partial(_execute_compiled_primitive, prim, compiled, backend, - tuple_args, handle_result) + handle_result) else: return partial(_execute_replicated_primitive, prim, compiled, backend, - tuple_args, handle_result) + handle_result) def _device_from_arg_devices(devices): """Given devices of inputs, determine where to perform a computation. @@ -254,22 +255,20 @@ def primitive_computation(prim, axis_env, backend, tuple_args, *avals, **params) def primitive_subcomputation(prim, *avals, **params): return primitive_computation(prim, AxisEnv(1), None, False, *avals, **params) -def _execute_compiled_primitive(prim, compiled, backend, tuple_args, - result_handler, *args): +def _execute_compiled_primitive(prim, compiled, backend, result_handler, *args): device, = compiled.local_devices() input_bufs = [device_put(x, device) for x in args if x is not token] - out_bufs = compiled.Execute(input_bufs, tuple_arguments=tuple_args) + out_bufs = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: check_nans(prim, out_bufs) return result_handler(out_bufs if prim.multiple_results else out_bufs[0]) -def _execute_replicated_primitive(prim, compiled, backend, tuple_args, - result_handler, *args): +def _execute_replicated_primitive(prim, compiled, backend, result_handler, + *args): input_bufs = [ [device_put(x, device) for x in args if x is not token] for device in compiled.local_devices()] - out_buf = compiled.ExecuteOnLocalDevices( - input_bufs, tuple_arguments=tuple_args)[0] + out_buf = compiled.ExecuteOnLocalDevices(input_bufs)[0] if not prim.multiple_results: out_buf, = out_buf return result_handler(out_buf) @@ -520,12 +519,13 @@ def _xla_callable(fun: lu.WrappedFun, device, backend, name, *arg_specs): num_replicas=nreps, num_partitions=1, device_assignment=(device.id,) if device else None) + options.tuple_arguments = tuple_args compiled = built.Compile(compile_options=options, backend=xb.get_backend(backend)) if nreps == 1: - return partial(_execute_compiled, compiled, backend, result_handlers, tuple_args) + return partial(_execute_compiled, compiled, backend, result_handlers) else: - return partial(_execute_replicated, compiled, backend, result_handlers, tuple_args) + return partial(_execute_replicated, compiled, backend, result_handlers) def _xla_callable_device(nreps, backend, device, arg_devices): if nreps > 1: @@ -565,19 +565,18 @@ def _pval_to_result_handler(device, pval): else: return aval_to_result_handler(device, pv) -def _execute_compiled(compiled, backend, handlers, tuple_args, *args): +def _execute_compiled(compiled, backend, handlers, *args): device, = compiled.local_devices() input_bufs = [device_put(x, device) for x in args if x is not token] - out_bufs = compiled.Execute(input_bufs, tuple_arguments=tuple_args) + out_bufs = compiled.Execute(input_bufs) if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] -def _execute_replicated(compiled, backend, handlers, tuple_args, *args): +def _execute_replicated(compiled, backend, handlers, *args): input_bufs = [ [device_put(x, device) for x in args if x is not token] for device in compiled.local_devices()] - out_bufs = compiled.ExecuteOnLocalDevices( - input_bufs, tuple_arguments=tuple_args)[0] + out_bufs = compiled.ExecuteOnLocalDevices(input_bufs)[0] if FLAGS.jax_debug_nans: check_nans(xla_call_p, out_bufs) return [handler(out_buf) for handler, out_buf in zip(handlers, out_bufs)] @@ -960,10 +959,10 @@ def _lazy_force_computation(sticky, aval, device, lexpr) -> Callable[[DeviceArra force_fun: Callable[[DeviceValue], DeviceArray] if lazy.is_constant(lexpr): def force_fun(_): - return handler(compiled.Execute([], tuple_arguments=False)[0]) + return handler(compiled.Execute([])[0]) else: def force_fun(x): - return handler(compiled.Execute([x.device_buffer], tuple_arguments=False)[0]) + return handler(compiled.Execute([x.device_buffer])[0]) return force_fun diff --git a/jax/lib/__init__.py b/jax/lib/__init__.py index 4670d86c9b87..e60afcf0719f 100644 --- a/jax/lib/__init__.py +++ b/jax/lib/__init__.py @@ -17,7 +17,7 @@ import jaxlib -_minimum_jaxlib_version = (0, 1, 41) +_minimum_jaxlib_version = (0, 1, 43) try: from jaxlib import version as jaxlib_version except Exception as err: From c28c46e1911ccb2154a633ce171dfdbdc74e4738 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 31 Mar 2020 15:52:41 -0700 Subject: [PATCH 0988/1053] Add ShardedDeviceArray indexing benchmark. (#2549) Example output: ``` ---------Benchmark summary for ShardedDeviceArray_indexing--------- indices_fn mean %std relative ------------------ -------- ------- ---------- integer_indices 0.16901 8.52522 1 integer_2D_indices 18.4918 0 109.412 ``` --- benchmarks/benchmark.py | 11 +++++++++-- benchmarks/pmap_benchmark.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/benchmarks/benchmark.py b/benchmarks/benchmark.py index f5f5977b048d..a16cfd7ff778 100644 --- a/benchmarks/benchmark.py +++ b/benchmarks/benchmark.py @@ -92,18 +92,25 @@ def benchmark_suite(prepare: Callable[..., Callable], params_list: List[Dict], times = [] for params in params_list: f = prepare(**params) - subname = name + "".join("_%s=%s" % (n, p) for n, p in params.items()) + subname = name + "".join("_%s=%s" % (n, _param_str(p)) + for n, p in params.items()) times.append(benchmark(f, name=subname, target_total_secs=target_total_secs)) print("---------Benchmark summary for %s---------" % name) param_names = list(params_list[0].keys()) - print(tabulate([tuple(params.values()) + + print(tabulate([tuple(map(_param_str, params.values())) + (t.mean(), _pstd(t), t.mean() / times[0].mean()) for params, t in safe_zip(params_list, times)], param_names + ["mean", "%std", "relative"])) print() +def _param_str(param): + if callable(param): + return param.__name__ + return str(param) + + def _pstd(x): return x.std() / x.mean() * 100 diff --git a/benchmarks/pmap_benchmark.py b/benchmarks/pmap_benchmark.py index 0a60ba0731f6..137a882836cc 100644 --- a/benchmarks/pmap_benchmark.py +++ b/benchmarks/pmap_benchmark.py @@ -84,9 +84,37 @@ def benchmark_fn(): benchmark.benchmark_suite(get_benchmark_fn, params, "pmap_shard_outputs") +def sharded_device_array_indexing_benchmark(): + """Benchmark focusing on ShardedDeviceArray indexing.""" + def get_benchmark_fn(indices_fn): + nshards = min(8, jax.local_device_count()) + shape = (nshards, 8, 8) + def benchmark_fn(): + arr = pmap(lambda x: x)(np.arange(np.prod(shape)).reshape(shape)) + indices = indices_fn() + for idx in indices: + arr[idx] + return benchmark_fn + + num_internal_iters = 1000 + + def integer_indices(): + return (i for _ in range(num_internal_iters) for i in range(8)) + + def integer_2D_indices(): + return ((i,i) for _ in range(num_internal_iters) for i in range(8)) + + params = [] + params.append({"indices_fn": integer_indices}) + params.append({"indices_fn": integer_2D_indices}) + benchmark.benchmark_suite(get_benchmark_fn, params, + "ShardedDeviceArray_indexing") + + def run_all_benchmarks(): pmap_shard_args_benchmark() pmap_shard_outputs_benchmark() + sharded_device_array_indexing_benchmark() def main(unused_argv): From 4fa153439e3dee41dd1469a55729b72fee383580 Mon Sep 17 00:00:00 2001 From: Madison May Date: Tue, 31 Mar 2020 19:59:57 -0400 Subject: [PATCH 0989/1053] FIX: batch norm w/ no scale, center --- jax/experimental/stax.py | 8 +++----- tests/stax_test.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/jax/experimental/stax.py b/jax/experimental/stax.py index d2413181c18a..b5881a0f6bae 100644 --- a/jax/experimental/stax.py +++ b/jax/experimental/stax.py @@ -134,12 +134,10 @@ def apply_fun(params, x, **kwargs): # TODO(phawkins): np.expand_dims should accept an axis tuple. # (https://github.com/numpy/numpy/issues/12290) ed = tuple(None if i in axis else slice(None) for i in range(np.ndim(x))) - beta = beta[ed] - gamma = gamma[ed] z = normalize(x, axis, epsilon=epsilon) - if center and scale: return gamma * z + beta - if center: return z + beta - if scale: return gamma * z + if center and scale: return gamma[ed] * z + beta[ed] + if center: return z + beta[ed] + if scale: return gamma[ed] * z return z return init_fun, apply_fun diff --git a/tests/stax_test.py b/tests/stax_test.py index 0c009a593e60..27d9dc858889 100644 --- a/tests/stax_test.py +++ b/tests/stax_test.py @@ -212,6 +212,19 @@ def testIssue182(self): assert out_shape == out.shape assert onp.allclose(onp.sum(onp.asarray(out), -1), 1.) + def testBatchNormNoScaleOrCenter(self): + key = random.PRNGKey(0) + axes = (0, 1, 2) + init_fun, apply_fun = stax.BatchNorm(axis=axes, center=False, scale=False) + input_shape = (4, 5, 6, 7) + inputs = random_inputs(onp.random.RandomState(0), input_shape) + + out_shape, params = init_fun(key, input_shape) + out = apply_fun(params, inputs) + means = onp.mean(out, axis=(0, 1, 2)) + std_devs = onp.std(out, axis=(0, 1, 2)) + assert onp.allclose(means, onp.zeros_like(means), atol=1e-4) + assert onp.allclose(std_devs, onp.ones_like(std_devs), atol=1e-4) def testBatchNormShapeNHWC(self): key = random.PRNGKey(0) From e3a9a56b17049fa121d322115fef318598669d68 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 31 Mar 2020 17:47:54 -0700 Subject: [PATCH 0990/1053] Remove unused argument from pxla.shard_args (#2560) --- jax/interpreters/pxla.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 331aece5f138..1e8f5fe91e64 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -46,11 +46,10 @@ def identity(x): return x -def shard_args(backend, devices, assignments, axis_size, args): +def shard_args(devices, assignments, axis_size, args): """Shard each argument data array along its leading axis. Args: - backend: the platform to be used devices: list of Devices mapping replica index to a physical device. assignments: list of integers with the same length as `devices` mapping replica index to an index along the leading axis (i.e. a shard). @@ -580,7 +579,7 @@ def dynamic_fun(dummy, *args): compiled = built.Compile(compile_options=compile_options, backend=xb.get_backend(backend)) - handle_args = partial(shard_args, backend, compiled.local_devices(), + handle_args = partial(shard_args, compiled.local_devices(), assign_shards_to_replicas(num_local_replicas, axis_size), axis_size) handle_outs = _pvals_to_results_handler(axis_size, num_local_replicas, From 83b9575145c4d59bb6bf318be8bb659fa05e3f8c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Tue, 31 Mar 2020 18:46:15 -0700 Subject: [PATCH 0991/1053] add callable typechecks to more api.py functions --- jax/api.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/jax/api.py b/jax/api.py index 8c42bfedf991..93f200f6a589 100644 --- a/jax/api.py +++ b/jax/api.py @@ -480,6 +480,7 @@ def jacfwd(fun: Callable, argnums: Union[int, Sequence[int]] = 0, [ 0. , 16. , -2. ], [ 1.6209068 , 0. , 0.84147096]] """ + _check_callable(fun) def jacfun(*args, **kwargs): f = lu.wrap_init(fun, kwargs) @@ -526,6 +527,8 @@ def jacrev(fun: Callable, argnums: Union[int, Sequence[int]] = 0, [ 0. , 16. , -2. ], [ 1.6209068 , 0. , 0.84147096]] """ + _check_callable(fun) + def jacfun(*args, **kwargs): f = lu.wrap_init(fun, kwargs) f_partial, dyn_args = argnums_partial(f, argnums, args) @@ -662,6 +665,7 @@ def vmap(fun: Callable, in_axes=0, out_axes=0) -> Callable: >>> print(vfoo(tree)).shape (6, 2, 5) """ + _check_callable(fun) docstr = ("Vectorized version of {fun}. Takes similar arguments as {fun} " "but with additional array axes over which {fun} is mapped.") @@ -673,7 +677,6 @@ def vmap(fun: Callable, in_axes=0, out_axes=0) -> Callable: # rather than raising an error. https://github.com/google/jax/issues/2367 in_axes = tuple(in_axes) - _check_callable(fun) if (not isinstance(in_axes, (list, tuple, type(None), int)) or not isinstance(out_axes, (list, tuple, type(None), int))): msg = ("vmap arguments in_axes and out_axes must each be an integer, None, " @@ -1062,6 +1065,7 @@ def pfun(*args): def mask(fun: Callable, in_shapes, out_shape) -> Callable: + _check_callable(fun) in_specs, in_shapes_tree = tree_flatten(in_shapes) out_specs, out_shapes_tree = tree_flatten(out_shape) @@ -1113,6 +1117,7 @@ def _bind_shapes(shape_exprs, shapes): @curry def shapecheck(in_shapes, out_shape, fun): + _check_callable(fun) in_shapes, in_tree = tree_flatten(in_shapes) in_shapes = map(masking.parse_spec, in_shapes) out_shapes, out_tree = tree_flatten(out_shape) @@ -1158,6 +1163,7 @@ def jvp(fun: Callable, primals, tangents) -> Tuple[Any, Any]: >>> print(v) 0.19900084 """ + _check_callable(fun) return _jvp(lu.wrap_init(fun), primals, tangents) def _jvp(fun: lu.WrappedFun, primals, tangents): @@ -1242,6 +1248,7 @@ def linearize(fun: Callable, *primals) -> Tuple[Any, Callable]: >>> print(f_jvp(4.)) -6.676704 """ + _check_callable(fun) f = lu.wrap_init(fun) primals_flat, in_tree = tree_flatten((primals, {})) jaxtree_fun, out_tree = flatten_fun(f, in_tree) @@ -1249,11 +1256,11 @@ def linearize(fun: Callable, *primals) -> Tuple[Any, Callable]: out_tree = out_tree() out_primal_py = tree_unflatten(out_tree, out_primals) primal_avals = list(map(core.get_aval, primals_flat)) - lifted_jvp = partial(lift_linearized, jaxpr, primal_avals, consts, + lifted_jvp = partial(_lift_linearized, jaxpr, primal_avals, consts, (in_tree, out_tree), out_pvals) return out_primal_py, lifted_jvp -def lift_linearized(jaxpr, primal_avals, consts, io_tree, out_pvals, *py_args): +def _lift_linearized(jaxpr, primal_avals, consts, io_tree, out_pvals, *py_args): def fun(*tangents): tangent_avals = list(map(core.get_aval, tangents)) for primal_aval, tangent_aval in zip(primal_avals, tangent_avals): @@ -1331,6 +1338,7 @@ def vjp(fun: Callable, *primals, **kwargs >>> print(ybar) -0.2524413 """ + _check_callable(fun) return _vjp(lu.wrap_init(fun), *primals, **kwargs) def _vjp(fun: lu.WrappedFun, *primals, **kwargs): From d2a827a08a87a85c2ba62fcadbc4d28cf5a4c092 Mon Sep 17 00:00:00 2001 From: George Necula Date: Tue, 31 Mar 2020 10:01:19 +0200 Subject: [PATCH 0992/1053] Ensure the global trace_state is restored on errors in loops This is an attempted fix for https://github.com/google/jax/issues/2507 --- jax/experimental/loops.py | 58 +++++++++++++++++++++------------------ tests/loops_test.py | 15 +++++----- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/jax/experimental/loops.py b/jax/experimental/loops.py index a12f453add2d..e32d84aa9cf4 100644 --- a/jax/experimental/loops.py +++ b/jax/experimental/loops.py @@ -136,6 +136,7 @@ class Scope(object): def __init__(self): self._mutable_state = {} # state to be functionalized, indexed by name. self._active_ranges = [] # stack of active ranges, last one is the innermost. + self._count_subtraces = 0 # How many net started subtraces, for error recovery def range(self, first, second=None, third=None): """Creates an iterator for bounded iterations to be functionalized. @@ -246,7 +247,7 @@ def __setattr__(self, key, value): Called for *all* attribute setting. """ - if key in ["_active_ranges", "_mutable_state"]: + if key in ["_active_ranges", "_mutable_state", "_count_subtraces"]: object.__setattr__(self, key, value) else: if self._active_ranges and key not in self._mutable_state: @@ -258,15 +259,34 @@ def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): - if exc_type is None: - if self._active_ranges: # We have some ranges that we did not exit properly - self._error_premature_exit_range() - return True - else: - # The exception may come from inside one or more ranges. We let the current - # exception propagate, assuming it terminates the tracing. If not, the - # tracers may be left in an inconsistent state. - return False # re-raise + try: + if exc_type is None: + if self._active_ranges: # We have some ranges that we did not exit properly + self._error_premature_exit_range() + return True + else: + # The exception may come from inside one or more ranges. We let the current + # exception propagate, assuming it terminates the tracing. If not, the + # tracers may be left in an inconsistent state. + return False # re-raise + finally: + # Ensure we leave the global trace_state as we found it + while self._count_subtraces > 0: + self.end_subtrace() + + def start_subtrace(self): + """Starts a nested trace, returns the Trace object.""" + # TODO: This follows the __enter__ part of core.new_master. + level = core.trace_state.trace_stack.next_level(False) + master = core.MasterTrace(level, pe.JaxprTrace) + core.trace_state.trace_stack.push(master, False) + self._count_subtraces += 1 + return pe.JaxprTrace(master, core.cur_sublevel()) + + def end_subtrace(self): + # TODO: This follows the __exit__ part of core.new_master + core.trace_state.trace_stack.pop(False) + self._count_subtraces -= 1 class _BodyTracer(object): @@ -333,7 +353,7 @@ def start_tracing_body(self): self.carried_state_names = sorted(self.scope._mutable_state.keys()) # TODO: This is the first part of partial_eval.trace_to_subjaxpr. Share. - self.trace = _BodyTracer.start_subtrace() + self.trace = self.scope.start_subtrace() # Set the scope._mutable_state to new tracing variables. for key, initial in self.carried_state_initial.items(): mt_aval = _BodyTracer.abstractify(initial) @@ -376,7 +396,7 @@ def end_tracing_body(self): "index variable returned by iterator.") from e raise # End the subtrace for the loop body, before we trace the condition - _BodyTracer.end_subtrace() + self.scope.end_subtrace() carried_init_val = tuple([self.carried_state_initial[ms] for ms in self.carried_state_names]) @@ -392,20 +412,6 @@ def end_tracing_body(self): for ms, mv in zip(self.carried_state_names, carried_mutable_state_unflattened): self.scope._mutable_state[ms] = mv - @staticmethod - def start_subtrace(): - """Starts a nested trace, returns the Trace object.""" - # TODO: This follows the __enter__ part of core.new_master. share - level = core.trace_state.trace_stack.next_level(False) - master = core.MasterTrace(level, pe.JaxprTrace) - core.trace_state.trace_stack.push(master, False) - return pe.JaxprTrace(master, core.cur_sublevel()) - - @staticmethod - def end_subtrace(): - # TODO: This follows the __exit__ part of core.new_master - core.trace_state.trace_stack.pop(False) - @staticmethod def abstractify(x): return abstract_arrays.raise_to_shaped(core.get_aval(x)) diff --git a/tests/loops_test.py b/tests/loops_test.py index 6dd21c5d73e2..fe7e954130cc 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -20,6 +20,7 @@ import re from jax import api, lax, ops +from jax import core from jax import numpy as np from jax import test_util as jtu from jax.experimental import loops @@ -27,17 +28,15 @@ from jax.config import config config.parse_flags_with_absl() -# Attempted fix for https://github.com/google/jax/issues/2507 based on resetting -# the global trace state. It could be that methods like _BodyTracer.end_subtrace -# are not cleaning up global trace state after exceptions because they don't use -# a try/finally pattern. This is just a guess though! -# TODO(mattjj,necula): check this attempted fix -from jax import core -def tearDownModule(): - core.trace_state = core.TraceState() class LoopsTest(jtu.JaxTestCase): + def tearDown(self) -> None: + # Check that the global state manipulated by loops is restored + if core.trace_state.trace_stack.downward or core.trace_state.trace_stack.upward: + core.trace_state = core.TraceState() + assert False # Fail this test + def test_scope_no_loops(self): def f_op(r): with loops.Scope() as s: From 025d8741d50746f248324e608a5242950d1d2ff3 Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Wed, 1 Apr 2020 09:01:59 +0200 Subject: [PATCH 0993/1053] Fix error message --- jax/experimental/stax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/experimental/stax.py b/jax/experimental/stax.py index d2413181c18a..d633e6a5516c 100644 --- a/jax/experimental/stax.py +++ b/jax/experimental/stax.py @@ -266,7 +266,7 @@ def apply_fun(params, inputs, **kwargs): if rng is None: msg = ("Dropout layer requires apply_fun to be called with a PRNG key " "argument. That is, instead of `apply_fun(params, inputs)`, call " - "it like `apply_fun(params, inputs, key)` where `key` is a " + "it like `apply_fun(params, inputs, rng)` where `rng` is a " "jax.random.PRNGKey value.") raise ValueError(msg) if mode == 'train': From ca23be63fbaed20192cda5f921afe177ac8dcf4d Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Sat, 28 Mar 2020 13:14:40 +0000 Subject: [PATCH 0994/1053] Add `jax.tree_util.all_leaves(iterable)`. In Haiku (https://github.com/deepmind/dm-haiku) we have `FlatMapping` which is an immutable Mapping subclass maintaining a flat internal representation. Our goal is to allow very cheap flatten/unflatten since these objects are used to represent parameters/state and are often passed in and out of JAX functions that flatten their inputs (e.g. jit/pmap). One challenge we have is that on unflatten we need a fast way of testing whether the list of leaves provided are flat or not (since we want to cache both the flat structure and the leaves). Consider the following case: ```python d = FlatMapping.from_mapping({"a": 1}) # Caches the result of jax.tree_flatten. l, t = jax.tree_flatten(d) # Fine, leaves are flat. l = list(map(lambda x: (x, x), l)) # leaves are no longer flat. d2 = jax.tree_unflatten(t, l) # Needs to recompute structure. jax.tree_leaves(d2) # Should return [1, 1] not [(1, 1)] ``` Actual implementation here: https://github.com/deepmind/dm-haiku/blob/d37b486e09696ef34f7396c11b04074cb73a963c/haiku/_src/data_structures.py#L204-L208 This function allows an efficient way to do this using the JAX public API. --- jax/tree_util.py | 19 +++++++++++++ jaxlib/pytree.cc | 61 +++++++++++++++++++++++++++++----------- tests/tree_util_tests.py | 28 ++++++++++++++---- 3 files changed, 86 insertions(+), 22 deletions(-) diff --git a/jax/tree_util.py b/jax/tree_util.py index ea19aaa6638c..857c6c792f04 100644 --- a/jax/tree_util.py +++ b/jax/tree_util.py @@ -87,6 +87,25 @@ def treedef_children(treedef): def treedef_is_leaf(treedef): return treedef.num_nodes == 1 +def all_leaves(iterable): + """Tests whether all elements in the given iterable are all leaves. + + >>> tree = {"a": [1, 2, 3]} + >>> assert all_leaves(jax.tree_leaves(tree)) + >>> assert not all_leaves([tree]) + + This function is useful in advanced cases, for example if a library allows + arbitrary map operations on a flat list of leaves it may want to check if + the result is still a flat list of leaves. + + Args: + iterable: Iterable of leaves. + + Returns: + True if all elements in the input are leaves false if not. + """ + return pytree.all_leaves(iterable) + def register_pytree_node(nodetype, flatten_func, unflatten_func): """Extends the set of types that are considered internal nodes in pytrees. diff --git a/jaxlib/pytree.cc b/jaxlib/pytree.cc index b55162280991..9728d7ed0078 100644 --- a/jaxlib/pytree.cc +++ b/jaxlib/pytree.cc @@ -111,6 +111,9 @@ class PyTreeDef { // Flattens a Pytree into a list of leaves and a PyTreeDef. static std::pair> Flatten(py::handle x); + // Tests whether the given list is a flat list of leaves. + static bool AllLeaves(const py::iterable& x); + // Flattens a Pytree up to this PyTreeDef. 'this' must be a tree prefix of // the tree-structure of 'x'. For example, if we flatten a value // [(1, (2, 3)), {"foo": 4}] with a treedef [(*, *), *], the result is the @@ -204,6 +207,10 @@ class PyTreeDef { py::handle xs, std::vector::const_reverse_iterator* it) const; + // Computes the node kind of a given Python object. + static Kind GetKind(const py::handle& obj, + CustomNodeRegistry::Registration const** custom); + // Nodes, in a post-order traversal. We use an ordered traversal to minimize // allocations, and post-order corresponds to the order we need to rebuild the // tree structure. @@ -243,28 +250,47 @@ bool PyTreeDef::operator==(const PyTreeDef& other) const { return true; } +/*static*/ PyTreeDef::Kind PyTreeDef::GetKind( + const py::handle& obj, + CustomNodeRegistry::Registration const** custom) { + const PyObject* ptr = obj.ptr(); + if (PyTuple_CheckExact(ptr)) return Kind::kTuple; + if (PyList_CheckExact(ptr)) return Kind::kList; + if (PyDict_CheckExact(ptr)) return Kind::kDict; + if ((*custom = CustomNodeRegistry::Lookup(obj.get_type()))) { + return Kind::kCustom; + } else if (py::isinstance(obj)) { + return Kind::kNone; + } else if (py::isinstance(obj) && py::hasattr(obj, "_fields")) { + // We can only identify namedtuples heuristically, here by the presence of + // a _fields attribute. + return Kind::kNamedTuple; + } else { + return Kind::kLeaf; + } +} + void PyTreeDef::FlattenHelper(py::handle handle, py::list* leaves, PyTreeDef* tree) { Node node; int start_num_nodes = tree->traversal_.size(); int start_num_leaves = leaves->size(); - if (py::isinstance(handle)) { - node.kind = Kind::kNone; - } else if (PyTuple_CheckExact(handle.ptr())) { + node.kind = GetKind(handle, &node.custom); + if (node.kind == Kind::kNone) { + // Nothing to do. + } else if (node.kind == Kind::kTuple) { py::tuple tuple = py::reinterpret_borrow(handle); - node.kind = Kind::kTuple; node.arity = tuple.size(); for (py::handle entry : tuple) { FlattenHelper(entry, leaves, tree); } - } else if (PyList_CheckExact(handle.ptr())) { + } else if (node.kind == Kind::kList) { py::list list = py::reinterpret_borrow(handle); - node.kind = Kind::kList; node.arity = list.size(); for (py::handle entry : list) { FlattenHelper(entry, leaves, tree); } - } else if (PyDict_CheckExact(handle.ptr())) { + } else if (node.kind == Kind::kDict) { py::dict dict = py::reinterpret_borrow(handle); py::list keys = py::reinterpret_steal(PyDict_Keys(dict.ptr())); if (PyList_Sort(keys.ptr())) { @@ -273,11 +299,9 @@ void PyTreeDef::FlattenHelper(py::handle handle, py::list* leaves, for (py::handle key : keys) { FlattenHelper(dict[key], leaves, tree); } - node.kind = Kind::kDict; node.arity = dict.size(); node.node_data = std::move(keys); - } else if ((node.custom = CustomNodeRegistry::Lookup(handle.get_type()))) { - node.kind = Kind::kCustom; + } else if (node.kind == Kind::kCustom) { py::tuple out = py::cast(node.custom->to_iterable(handle)); if (out.size() != 2) { throw std::runtime_error( @@ -289,19 +313,15 @@ void PyTreeDef::FlattenHelper(py::handle handle, py::list* leaves, ++node.arity; FlattenHelper(entry, leaves, tree); } - } else if (py::isinstance(handle) && - py::hasattr(handle, "_fields")) { - // We can only identify namedtuples heuristically, here by the presence of - // a _fields attribute. + } else if (node.kind == Kind::kNamedTuple) { py::tuple tuple = py::reinterpret_borrow(handle); - node.kind = Kind::kNamedTuple; node.arity = tuple.size(); node.node_data = py::reinterpret_borrow(tuple.get_type()); for (py::handle entry : tuple) { FlattenHelper(entry, leaves, tree); } } else { - node.kind = Kind::kLeaf; + CHECK(node.kind == Kind::kLeaf); leaves->append(py::reinterpret_borrow(handle)); } node.num_nodes = tree->traversal_.size() - start_num_nodes + 1; @@ -317,6 +337,14 @@ void PyTreeDef::FlattenHelper(py::handle handle, py::list* leaves, return std::make_pair(std::move(leaves), std::move(tree)); } +/*static*/ bool PyTreeDef::AllLeaves(const py::iterable& x) { + const CustomNodeRegistry::Registration* custom; + for (const py::handle& h : x) { + if (GetKind(h, &custom) != Kind::kLeaf) return false; + } + return true; +} + py::object PyTreeDef::Unflatten(py::iterable leaves) const { std::vector agenda; auto it = leaves.begin(); @@ -749,6 +777,7 @@ std::string PyTreeDef::ToString() const { PYBIND11_MODULE(pytree, m) { m.def("flatten", &PyTreeDef::Flatten); m.def("tuple", &PyTreeDef::Tuple); + m.def("all_leaves", &PyTreeDef::AllLeaves); py::class_(m, "PyTreeDef") .def("unflatten", &PyTreeDef::Unflatten) diff --git a/tests/tree_util_tests.py b/tests/tree_util_tests.py index 77d7a87b5717..a043fcd7b905 100644 --- a/tests/tree_util_tests.py +++ b/tests/tree_util_tests.py @@ -69,8 +69,8 @@ def tree_unflatten(cls, aux_data, children): def __eq__(self, other): return type(self) is type(other) and (self.x, self.y) == (other.x, other.y) -PYTREES = [ - ("foo",), +TREES = ( + (None,), ((),), (([()]),), ((1, 2),), @@ -84,18 +84,25 @@ def __eq__(self, other): (collections.defaultdict(dict, [("foo", 34), ("baz", 101), ("something", -42)]),), (ANamedTupleSubclass(foo="hello", bar=3.5),), -] +) + +LEAVES = ( + ("foo",), + (0.1,), + (1,), + (object(),), +) class TreeTest(jtu.JaxTestCase): - @parameterized.parameters(*PYTREES) + @parameterized.parameters(*(TREES + LEAVES)) def testRoundtrip(self, inputs): xs, tree = tree_util.tree_flatten(inputs) actual = tree_util.tree_unflatten(tree, xs) self.assertEqual(actual, inputs) - @parameterized.parameters(*PYTREES) + @parameterized.parameters(*(TREES + LEAVES)) def testRoundtripWithFlattenUpTo(self, inputs): _, tree = tree_util.tree_flatten(inputs) if not hasattr(tree, "flatten_up_to"): @@ -119,7 +126,7 @@ def testRoundtripPartial(self, inputs): self.assertEqual(actual.args, inputs.args) self.assertEqual(actual.keywords, inputs.keywords) - @parameterized.parameters(*PYTREES) + @parameterized.parameters(*(TREES + LEAVES)) def testRoundtripViaBuild(self, inputs): xs, tree = tree_util._process_pytree(tuple, inputs) actual = tree_util.build_tree(tree, xs) @@ -149,6 +156,15 @@ def testTreeMultimap(self): self.assertEqual(out, (((1, [3]), (2, None)), ((3, {"foo": "bar"}), (4, 7), (5, [5, 6])))) + @parameterized.parameters(*TREES) + def testAllLeavesWithTrees(self, tree): + leaves = tree_util.tree_leaves(tree) + self.assertTrue(tree_util.all_leaves(leaves)) + self.assertFalse(tree_util.all_leaves([tree])) + + @parameterized.parameters(*LEAVES) + def testAllLeavesWithLeaves(self, leaf): + self.assertTrue(tree_util.all_leaves([leaf])) if __name__ == "__main__": absltest.main() From 1d09b6be2660fcb2f887c9fd6ee7c72eb27f6a45 Mon Sep 17 00:00:00 2001 From: Tom Hennigan Date: Wed, 1 Apr 2020 14:58:17 +0100 Subject: [PATCH 0995/1053] Replace CHECK with assert. (#2569) --- jaxlib/pytree.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaxlib/pytree.cc b/jaxlib/pytree.cc index 9728d7ed0078..be264c7d70f4 100644 --- a/jaxlib/pytree.cc +++ b/jaxlib/pytree.cc @@ -321,7 +321,7 @@ void PyTreeDef::FlattenHelper(py::handle handle, py::list* leaves, FlattenHelper(entry, leaves, tree); } } else { - CHECK(node.kind == Kind::kLeaf); + assert(node.kind == Kind::kLeaf); leaves->append(py::reinterpret_borrow(handle)); } node.num_nodes = tree->traversal_.size() - start_num_nodes + 1; From c758aff88ba800f7da94060e13c24861274d585e Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 1 Apr 2020 10:54:47 -0400 Subject: [PATCH 0996/1053] Fix some missing cases of broadcasting in np.einsum. (#2512) * Fix some missing cases of broadcasting in np.einsum. In particular, np.einsum allows one side of a batch or contracting dimension to have size 1 even if the other side has a non-1 size. Implement np.matmul in terms of np.einsum. This allows us to reuse einsum's logic for performing broadcasting without explicitly broadcasting the LHS and RHS together. * Add regression test. Fixes #2189. --- jax/numpy/lax_numpy.py | 61 ++++++++++++++++++++++------------ tests/lax_numpy_einsum_test.py | 28 ++++++++++++++++ 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index fb26cb44e3fb..ec4ca1542981 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2317,25 +2317,20 @@ def dot(a, b, precision=None): # pylint: disable=missing-docstring def matmul(a, b, precision=None): # pylint: disable=missing-docstring _check_arraylike("matmul", a, b) a_is_vec, b_is_vec = (ndim(a) == 1), (ndim(b) == 1) - a = lax.reshape(a, (1,) + shape(a)) if a_is_vec else a - b = lax.reshape(b, shape(b) + (1,)) if b_is_vec else b - - a, b = _promote_dtypes(a, b) - batch_shape = lax.broadcast_shapes(shape(a)[:-2], shape(b)[:-2]) - a = broadcast_to(a, batch_shape + shape(a)[-2:]) - b = broadcast_to(b, batch_shape + shape(b)[-2:]) - batch_dims = tuple(range(len(batch_shape))) - dim_numbers = (((ndim(a) - 1,), (ndim(b) - 2,)), (batch_dims, batch_dims)) - result = lax.dot_general(a, b, dim_numbers, precision) - - if a_is_vec or b_is_vec: - m, n = shape(result)[-2:] - new_m = () if a_is_vec else (m,) - new_n = () if b_is_vec else (n,) - return lax.reshape(result, batch_shape + new_m + new_n) + # We lower to einsum here because it handles batch dimensions for us. + # np.matmul is stricter than np.einsum with respect to size 1 contracting + # dimensions, so we need an additional check. + if shape(a)[0 if a_is_vec else -1] != shape(b)[0 if b_is_vec else -2]: + msg = "matmul requires contracting dimension to match, got {} and {}" + raise ValueError(msg.format(shape(a), shape(b))) + if a_is_vec and b_is_vec: + return lax.dot(a, b, precision=precision) + elif a_is_vec: + return einsum('i,...ij->...j', a, b, precision=precision) + elif b_is_vec: + return einsum('...ij,j->...i', a, b, precision=precision) else: - return result - + return einsum('...ij,...jk->...ik', a, b, precision=precision) @_wraps(onp.vdot, lax_description=_PRECISION_DOC) def vdot(a, b, precision=None): @@ -2425,6 +2420,17 @@ def sum_repeats(operand, names, counts, keep_names): names = names.replace(name, '', count - 1) return operand, names + def filter_singleton_dims(operand, names, other_shape, other_names): + s = shape(operand) + new_shape = [] + new_names = [] + for i, d in enumerate(names): + other_i = other_names.find(d) + if s[i] != 1 or other_i == -1 or other_shape[other_i] == 1: + new_shape.append(s[i]) + new_names.append(d) + return reshape(operand, tuple(new_shape)), "".join(new_names) + for operand_indices, contracted_names, einstr in contractions: input_str, result_names = einstr.split('->') input_names = input_str.split(',') @@ -2445,9 +2451,18 @@ def sum_repeats(operand, names, counts, keep_names): elif len(operand_indices) == 2: lhs, rhs = map(operands.pop, operand_indices) - lhs_counts, rhs_counts = map(collections.Counter, input_names) lhs_names, rhs_names = input_names + # handle cases where one side of a contracting or batch dimension is 1 + # but its counterpart is not. + lhs, lhs_names = filter_singleton_dims(lhs, lhs_names, shape(rhs), + rhs_names) + rhs, rhs_names = filter_singleton_dims(rhs, rhs_names, shape(lhs), + lhs_names) + + lhs_counts = collections.Counter(lhs_names) + rhs_counts = collections.Counter(rhs_names) + # sum out unique contracted indices in lhs and rhs lhs_uniques = [name for name in contracted_names if lhs_counts[name] == 1 and rhs_counts[name] == 0] @@ -2465,14 +2480,16 @@ def sum_repeats(operand, names, counts, keep_names): contracted_names = contracted_names & (set(lhs_names) | set(rhs_names)) batch_names = (set(lhs_names) & set(rhs_names)) - contracted_names + lhs_batch, rhs_batch = unzip2((lhs_names.find(n), rhs_names.find(n)) for n in batch_names) # NOTE(mattjj): this can fail non-deterministically in python3, maybe # due to opt_einsum - assert _all(name in lhs_names and name in rhs_names and - lhs.shape[lhs_names.index(name)] == rhs.shape[rhs_names.index(name)] - for name in contracted_names) + assert _all( + name in lhs_names and name in rhs_names and + lhs.shape[lhs_names.index(name)] == rhs.shape[rhs_names.index(name)] + for name in contracted_names) # move batch dims to the front (required by lax.dot_general, and easier) batch_dims = tuple(range(len(batch_names))) diff --git a/tests/lax_numpy_einsum_test.py b/tests/lax_numpy_einsum_test.py index 0f553f4eb5f4..4033e778fa0d 100644 --- a/tests/lax_numpy_einsum_test.py +++ b/tests/lax_numpy_einsum_test.py @@ -315,6 +315,34 @@ def test_einsum_kpmurphy_example(self): self.assertAllClose(L, np.einsum('ntk,kd,dc->nc', S, W, V, optimize=path), check_dtypes=False, rtol=rtol) + def test_contraction_broadcasting(self): + r = rng() + x = r.randn(3, 4, 5) + y = r.randn(3, 1, 6) + s = 'cij,cjk->cik' + self._check(s, x, y) + + def test_batch_broadcasting(self): + r = rng() + x = r.randn(1, 4, 5) + y = r.randn(3, 5, 6) + s = 'cij,cjk->cik' + self._check(s, x, y) + + def test_batch_and_contraction_broadcasting(self): + r = rng() + x = r.randn(1, 4, 5) + y = r.randn(3, 1, 6) + s = 'cij,cjk->cik' + self._check(s, x, y) + + def test_broadcasting_issue_2189(self): + r = rng() + x = r.randn(2, 1, 3, 3) + y = r.randn(2, 4, 3) + s = '...ij,...j' + self._check(s, x, y) + if __name__ == '__main__': absltest.main() From 86a4073a756126bb659c7027b85eb309aed98d60 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 1 Apr 2020 08:25:32 -0700 Subject: [PATCH 0997/1053] enable beta test on float64 values (#1177) * enable beta test on float64 values cf. #1123 * Enable beta test on all platforms. It seems sufficiently fast now. Co-authored-by: Peter Hawkins --- tests/random_test.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/random_test.py b/tests/random_test.py index baca819d1dc6..a6a00547890f 100644 --- a/tests/random_test.py +++ b/tests/random_test.py @@ -226,11 +226,10 @@ def testBernoulliShape(self): "a": a, "b": b, "dtype": onp.dtype(dtype).name} for a in [0.2, 5.] for b in [0.2, 5.] - for dtype in [onp.float32, onp.float64])) - # TODO(phawkins): slow compilation times on cpu and tpu. - # TODO(mattjj): test fails after https://github.com/google/jax/pull/1123 - @jtu.skip_on_devices("cpu", "gpu", "tpu") + for dtype in [onp.float64])) # NOTE: KS test fails with float32 def testBeta(self, a, b, dtype): + if not FLAGS.jax_enable_x64: + raise SkipTest("skip test except on X64") key = random.PRNGKey(0) rand = lambda key, a, b: random.beta(key, a, b, (10000,), dtype) crand = api.jit(rand) From 651316f4c790ca2cad48ca019b83ea5e316798b8 Mon Sep 17 00:00:00 2001 From: Xiayun Sun Date: Wed, 1 Apr 2020 16:57:57 +0100 Subject: [PATCH 0998/1053] Fix issue 1465: fix jit in example (#1473) * fix jit in example * Avoid using static_argnums on a keyword argument; use a positional argument and a wrapper function for now. Co-authored-by: Peter Hawkins --- examples/advi.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/advi.py b/examples/advi.py index 3d2893f75eee..4b19b949c3c2 100644 --- a/examples/advi.py +++ b/examples/advi.py @@ -54,7 +54,7 @@ def batch_elbo(logprob, rng, params, num_samples): # ========= Helper function for plotting. ========= @partial(jit, static_argnums=(0, 1, 2, 4)) -def mesh_eval(func, x_limits, y_limits, params, num_ticks=101): +def _mesh_eval(func, x_limits, y_limits, params, num_ticks): # Evaluate func on a 2D grid defined by x_limits and y_limits. x = np.linspace(*x_limits, num=num_ticks) y = np.linspace(*y_limits, num=num_ticks) @@ -63,6 +63,8 @@ def mesh_eval(func, x_limits, y_limits, params, num_ticks=101): zs = vmap(func, in_axes=(0, None))(xy_vec, params) return X, Y, zs.reshape(X.shape) +def mesh_eval(func, x_limits, y_limits, params, num_ticks=101): + return _mesh_eval(func, x_limits, y_limits, params, num_ticks) # ========= Define an intractable unnormalized density ========= From 79ce698160ea8dfcbbd98cb47dfccb9c89824a1f Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 1 Apr 2020 12:35:12 -0400 Subject: [PATCH 0999/1053] Fix incorrect raise in np.clip and add a test. (#2571) --- jax/numpy/lax_numpy.py | 2 +- tests/lax_numpy_test.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index ec4ca1542981..7f73b4d5d94a 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1122,7 +1122,7 @@ def f(ary, indices_or_sections): @_wraps(onp.clip) def clip(a, a_min=None, a_max=None): if a_min is None and a_max is None: - raise "At most one of a_min and a_max may be None" + raise ValueError("At most one of a_min and a_max may be None") if a_min is not None: if _dtype(a_min) != _dtype(a): a_min = lax.convert_element_type(a_min, _dtype(a)) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index fa0a0a83e76f..ddcb699d5309 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -872,6 +872,10 @@ def testClipStaticBounds(self, shape, dtype, a_min, a_max, rng_factory): self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False) self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) + def testClipError(self): + with self.assertRaisesRegex(ValueError, "At most one of a_min and a_max.*"): + jnp.clip(jnp.zeros((3,))) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_{}_decimals={}".format( jtu.format_shape_dtype_string(shape, dtype), decimals), From 8c4a938cfa8aec11dcb67660313a25acb9d58fce Mon Sep 17 00:00:00 2001 From: Tzu-Wei Sung Date: Wed, 1 Apr 2020 12:29:48 -0700 Subject: [PATCH 1000/1053] Implement np.ldexp and np.frexp. (#1529) Co-authored-by: Peter Hawkins --- jax/numpy/lax_numpy.py | 87 ++++++++++++++++++++++++++++++++++++++++- jax/test_util.py | 4 +- tests/lax_numpy_test.py | 55 ++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 3 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 7f73b4d5d94a..e2c17a98d4e8 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -612,7 +612,6 @@ def exp2(x): x, = _promote_dtypes_inexact(x) return lax.exp(lax.mul(lax.log(_constant_like(x, 2)), x)) - @_wraps(onp.signbit) def signbit(x): x, = _promote_shapes("signbit", x) @@ -645,6 +644,92 @@ def signbit(x): x = lax.bitcast_convert_type(x, int_type) return lax.convert_element_type(x >> (info.nexp + info.nmant), onp.bool) +def _normalize_float(x): + info = finfo(_dtype(x)) + cond = lax.abs(x) < info.tiny + x1 = where(cond, x * (1 << info.nmant), x) + x2 = where(cond, + full_like(x, -info.nmant, dtype=onp.int32), + zeros_like(x, dtype=onp.int32)) + return lax.convert_element_type(x1, _dtype(x)), x2 + +_INT_DTYPES = { + 16: onp.int16, + 32: onp.int32, + 64: onp.int64, +} + +@_wraps(onp.ldexp) +@jit +def ldexp(x1, x2): + dtype = _result_dtype(onp.ldexp, x1, x2) + x1, x2 = _promote_shapes("ldexp", x1, x2) + x1 = lax.convert_element_type(x1, dtype) + + info = finfo(dtype) + mask = (1 << info.nexp) - 1 + bias = ((1 << info.nexp) - 1) >> 1 + + int_type = _INT_DTYPES[info.bits] + + x, e = _normalize_float(x1) + x2 += lax.convert_element_type(e, onp.int32) + x = lax.bitcast_convert_type(x, int_type) + x2 += ((x >> info.nmant) & mask) - bias + + # find underflow/overflow before denormalization + underflow_cond = x2 < -(bias + info.nmant) + overflow_cond = x2 > bias + + m = ones_like(x, dtype=dtype) + + # denormals + cond = x2 < -bias + 1 + x2 = where(cond, x2 + info.nmant, x2) + m = where(cond, m / (1 << info.nmant), m) + + x2 = lax.convert_element_type(x2, onp.int32) + x &= ~(mask << info.nmant) + x |= ((lax.convert_element_type(x2, int_type) + bias) << info.nmant) + + x = lax.convert_element_type(m, dtype) * lax.bitcast_convert_type(x, dtype) + + # underflow + x = where(underflow_cond, zeros_like(x, dtype=dtype), x) + # overflow + x = where(overflow_cond, lax.sign(x1) * full_like(x, onp.inf), x) + # ldexp(x1, x2) = x1 for x1 = inf, -inf, nan, 0 + return where(isinf(x1) | isnan(x1) | (x1 == 0), x1, x) + + +@_wraps(onp.frexp) +@jit +def frexp(x): + x = asarray(x) + if issubdtype(x.dtype, complexfloating): + raise TypeError("frexp does not support complex-valued inputs") + elif not issubdtype(x.dtype, floating): + x = lax.convert_element_type(x, float_) + + dtype = _dtype(x) + info = finfo(dtype) + mask = (1 << info.nexp) - 1 + bias = ((1 << info.nexp) - 1) >> 1 + + int_type = _INT_DTYPES[info.bits] + + x1, x2 = _normalize_float(x) + print(x1, x2) + x1 = lax.bitcast_convert_type(x1, int_type) + x2 += ((x1 >> info.nmant) & mask) - bias + 1 + x1 &= ~(mask << info.nmant) + x1 |= (bias - 1) << info.nmant + x1 = lax.bitcast_convert_type(x1, dtype) + + cond = isinf(x) | isnan(x) | (x == 0) + x2 = where(cond, zeros_like(x2), x2) + return where(cond, x, x1), lax.convert_element_type(x2, int32) + @_wraps(onp.remainder) def remainder(x1, x2): diff --git a/jax/test_util.py b/jax/test_util.py index c02eb54849e3..ade4ad6db088 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -451,8 +451,8 @@ def rand_small(): return partial(_rand_dtype, randn, scale=1e-3) -def rand_not_small(): - post = lambda x: x + onp.where(x > 0, 10., -10.) +def rand_not_small(offset=10.): + post = lambda x: x + onp.where(x > 0, offset, -offset) randn = npr.RandomState(0).randn return partial(_rand_dtype, randn, scale=3., post=post) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index ddcb699d5309..dd769e9b3827 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1214,6 +1214,61 @@ def testIdentity(self, n, dtype): self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_x1={}_x2={}_x1_rng={}".format( + jtu.format_shape_dtype_string(x1_shape, x1_dtype), + jtu.format_shape_dtype_string(x2_shape, onp.int32), + x1_rng_factory_id), + "x1_shape": x1_shape, "x1_dtype": x1_dtype, + "x2_shape": x2_shape, "x1_rng_factory": x1_rng_factory, + "x2_rng_factory": x2_rng_factory} + for x1_rng_factory_id, x1_rng_factory in + enumerate([jtu.rand_some_inf_and_nan, jtu.rand_some_zero]) + for x2_rng_factory in [partial(jtu.rand_int, -1075, 1024)] + for x1_shape, x2_shape in filter(_shapes_are_broadcast_compatible, + CombosWithReplacement(array_shapes, 2)) + for x1_dtype in default_dtypes)) + def testLdexp(self, x1_shape, x1_dtype, x2_shape, x1_rng_factory, x2_rng_factory): + # integer types are converted to float64 in numpy's implementation + if (x1_dtype not in [jnp.bfloat16, onp.float16, onp.float32] + and not FLAGS.jax_enable_x64): + self.skipTest("Only run float64 testcase when float64 is enabled.") + x1_rng = x1_rng_factory() + x2_rng = x2_rng_factory() + def onp_fun(x1, x2): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=RuntimeWarning) + return onp.ldexp(x1, x2) + jnp_fun = lambda x1, x2: jnp.ldexp(x1, x2) + args_maker = lambda: [x1_rng(x1_shape, x1_dtype), + x2_rng(x2_shape, onp.int32)] + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_x={}_rng_factory={}".format( + jtu.format_shape_dtype_string(shape, dtype), rng_factory_id), + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} + for rng_factory_id, rng_factory in enumerate([ + jtu.rand_some_inf_and_nan, + jtu.rand_some_zero, + partial(jtu.rand_not_small, offset=1e8), + ]) + for shape in all_shapes + for dtype in default_dtypes)) + def testFrexp(self, shape, dtype, rng_factory): + # integer types are converted to float64 in numpy's implementation + if (dtype not in [jnp.bfloat16, onp.float16, onp.float32] + and not FLAGS.jax_enable_x64): + self.skipTest("Only run float64 testcase when float64 is enabled.") + rng = rng_factory() + onp_fun = lambda x: onp.frexp(x) + jnp_fun = lambda x: jnp.frexp(x) + args_maker = lambda: [rng(shape, dtype)] + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) + + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_dtype_{}_offset={}_axis1={}_axis2={}".format( jtu.format_shape_dtype_string(shape, dtype), From 2d42c42a0827a01cc426135467e0015cad00ddf6 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 1 Apr 2020 17:18:17 -0400 Subject: [PATCH 1001/1053] Fix missing type promotion accidentally removed by #2512. (#2575) This is in fact covered by the existing tests, but we were unlucky and didn't hit them in the set of generated tests we selected. --- jax/numpy/lax_numpy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index e2c17a98d4e8..69111ee347e6 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2408,6 +2408,7 @@ def matmul(a, b, precision=None): # pylint: disable=missing-docstring if shape(a)[0 if a_is_vec else -1] != shape(b)[0 if b_is_vec else -2]: msg = "matmul requires contracting dimension to match, got {} and {}" raise ValueError(msg.format(shape(a), shape(b))) + a, b = _promote_dtypes(a, b) if a_is_vec and b_is_vec: return lax.dot(a, b, precision=precision) elif a_is_vec: From 2e87674aff0609d58eed07091d8e9fad8ee71d6c Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 1 Apr 2020 15:35:26 -0700 Subject: [PATCH 1002/1053] Refactor shard_args ShardedDeviceArray slow path. (#2562) --- jax/interpreters/pxla.py | 61 ++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 1e8f5fe91e64..021ed21f6088 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -67,30 +67,13 @@ def shard_args(devices, assignments, axis_size, args): for a, arg in enumerate(args): # The shard_arg_handlers allow an extensible set of types to be sharded, but # inline handling for ShardedDeviceArray as a special case for performance - if type(arg) is ShardedDeviceArray: - if nrep == len(arg.device_buffers): - # The argument is already prepared for the right number of replicas, so - # we just ensure that buf[r] is on devices[r] for each replica index r - # TODO(mattjj): compared to the other case, this logic has less looping - # but could incur more device-to-device data movement - for r, buf in enumerate(arg.device_buffers): - buffers[r][a] = buf if buf.device() == devices[r] else buf.copy_to_device(devices[r]) - else: - # The argument is prepared for a different number of replicas, so for - # each of our replica indices we check if there's already a buffer with - # the correct logical assignment on the correct device, and if not just - # copy one of them - prev_assignments = assign_shards_to_replicas(len(arg.device_buffers), axis_size) - candidates = defaultdict(list) - for r, buf in enumerate(arg.device_buffers): - candidates[prev_assignments[r]].append(buf) - for r in range(nrep): - for buf in candidates[assignments[r]]: - if buf.device() == devices[r]: - buffers[r][a] = buf - break - else: - buffers[r][a] = buf.copy_to_device(devices[r]) + if type(arg) is ShardedDeviceArray and nrep == len(arg.device_buffers): + # The argument is already prepared for the right number of replicas, so + # we just ensure that buf[r] is on devices[r] for each replica index r + # TODO(mattjj): compared to the other case, this logic has less looping + # but could incur more device-to-device data movement + for r, buf in enumerate(arg.device_buffers): + buffers[r][a] = buf if buf.device() == devices[r] else buf.copy_to_device(devices[r]) else: bufs = shard_arg_handlers[type(arg)](arg, devices, assignments) for r, buf in enumerate(bufs): @@ -393,16 +376,26 @@ def __getitem__(self, idx): else: return super(ShardedDeviceArray, self).__getitem__(idx) -# This handler code is effectively dead because we in-lined it in shard_args for -# performance reasons. -def _shard_sharded_device_array(x, devices, assignments): - n = len(devices) - if n == len(x.device_buffers): - return (b if b.device() == devices[r] else b.copy_to_device(devices[r]) - for r, b in enumerate(x.device_buffers)) - else: - return (xla.device_put(x[assignments[r]], devices[r]) for r in range(n)) -shard_arg_handlers[ShardedDeviceArray] = _shard_sharded_device_array + +# The fast path is handled directly in shard_args(). +def _shard_sharded_device_array_slow_path(x, devices, assignments): + # The array is sharded for a different number of replicas, so for each of our + # replica indices we check if there's already a buffer with the correct + # logical assignment on the correct device, and if not just copy one of them + prev_assignments = assign_shards_to_replicas(len(x.device_buffers), axis_size) + candidates = defaultdict(list) + for r, buf in enumerate(x.device_buffers): + candidates[prev_assignments[r]].append(buf) + bufs = [] + for r in range(devices): + for buf in candidates[assignments[r]]: + if buf.device() == devices[r]: + bufs.append(buf) + break + else: + bufs.append(buf.copy_to_device(devices[r])) + return bufs +shard_arg_handlers[ShardedDeviceArray] = _shard_sharded_device_array_slow_path def _sharded_device_array_constant_handler(c, val, canonicalize_types=True): return c.Constant(onp.asarray(val), canonicalize_types=canonicalize_types) From 1bb9aaa88c09a90a115c0304c05b0fc25932523b Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 1 Apr 2020 16:33:37 -0700 Subject: [PATCH 1003/1053] Revert "Refactor shard_args ShardedDeviceArray slow path. (#2562)" (#2577) This reverts commit 2e87674aff0609d58eed07091d8e9fad8ee71d6c. This refactoring was broken, but we apparently have no test coverage! mypy/linting would have caught it though. --- jax/interpreters/pxla.py | 61 ++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 021ed21f6088..1e8f5fe91e64 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -67,13 +67,30 @@ def shard_args(devices, assignments, axis_size, args): for a, arg in enumerate(args): # The shard_arg_handlers allow an extensible set of types to be sharded, but # inline handling for ShardedDeviceArray as a special case for performance - if type(arg) is ShardedDeviceArray and nrep == len(arg.device_buffers): - # The argument is already prepared for the right number of replicas, so - # we just ensure that buf[r] is on devices[r] for each replica index r - # TODO(mattjj): compared to the other case, this logic has less looping - # but could incur more device-to-device data movement - for r, buf in enumerate(arg.device_buffers): - buffers[r][a] = buf if buf.device() == devices[r] else buf.copy_to_device(devices[r]) + if type(arg) is ShardedDeviceArray: + if nrep == len(arg.device_buffers): + # The argument is already prepared for the right number of replicas, so + # we just ensure that buf[r] is on devices[r] for each replica index r + # TODO(mattjj): compared to the other case, this logic has less looping + # but could incur more device-to-device data movement + for r, buf in enumerate(arg.device_buffers): + buffers[r][a] = buf if buf.device() == devices[r] else buf.copy_to_device(devices[r]) + else: + # The argument is prepared for a different number of replicas, so for + # each of our replica indices we check if there's already a buffer with + # the correct logical assignment on the correct device, and if not just + # copy one of them + prev_assignments = assign_shards_to_replicas(len(arg.device_buffers), axis_size) + candidates = defaultdict(list) + for r, buf in enumerate(arg.device_buffers): + candidates[prev_assignments[r]].append(buf) + for r in range(nrep): + for buf in candidates[assignments[r]]: + if buf.device() == devices[r]: + buffers[r][a] = buf + break + else: + buffers[r][a] = buf.copy_to_device(devices[r]) else: bufs = shard_arg_handlers[type(arg)](arg, devices, assignments) for r, buf in enumerate(bufs): @@ -376,26 +393,16 @@ def __getitem__(self, idx): else: return super(ShardedDeviceArray, self).__getitem__(idx) - -# The fast path is handled directly in shard_args(). -def _shard_sharded_device_array_slow_path(x, devices, assignments): - # The array is sharded for a different number of replicas, so for each of our - # replica indices we check if there's already a buffer with the correct - # logical assignment on the correct device, and if not just copy one of them - prev_assignments = assign_shards_to_replicas(len(x.device_buffers), axis_size) - candidates = defaultdict(list) - for r, buf in enumerate(x.device_buffers): - candidates[prev_assignments[r]].append(buf) - bufs = [] - for r in range(devices): - for buf in candidates[assignments[r]]: - if buf.device() == devices[r]: - bufs.append(buf) - break - else: - bufs.append(buf.copy_to_device(devices[r])) - return bufs -shard_arg_handlers[ShardedDeviceArray] = _shard_sharded_device_array_slow_path +# This handler code is effectively dead because we in-lined it in shard_args for +# performance reasons. +def _shard_sharded_device_array(x, devices, assignments): + n = len(devices) + if n == len(x.device_buffers): + return (b if b.device() == devices[r] else b.copy_to_device(devices[r]) + for r, b in enumerate(x.device_buffers)) + else: + return (xla.device_put(x[assignments[r]], devices[r]) for r in range(n)) +shard_arg_handlers[ShardedDeviceArray] = _shard_sharded_device_array def _sharded_device_array_constant_handler(c, val, canonicalize_types=True): return c.Constant(onp.asarray(val), canonicalize_types=canonicalize_types) From 0c53ce9def83699f107f3b5a3f683d0b2a50986a Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 2 Apr 2020 11:13:40 +0200 Subject: [PATCH 1004/1053] Disable test with float16 on TPU --- jax/test_util.py | 4 ++++ tests/lax_numpy_test.py | 1 + 2 files changed, 5 insertions(+) diff --git a/jax/test_util.py b/jax/test_util.py index ade4ad6db088..fc9e86910317 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -314,6 +314,10 @@ def supported_dtypes(): dtypes.bfloat16, onp.float16, onp.float32, onp.float64, onp.complex64, onp.complex128} +def skip_if_unsupported_type(dtype): + if dtype not in supported_dtypes(): + raise SkipTest(f"Type {dtype} not supported on {device_under_test()}") + def skip_on_devices(*disabled_devices): """A decorator for test methods to skip the test on certain devices.""" def skip(test_method): diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index dd769e9b3827..9c7b9a17fb6b 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1261,6 +1261,7 @@ def testFrexp(self, shape, dtype, rng_factory): if (dtype not in [jnp.bfloat16, onp.float16, onp.float32] and not FLAGS.jax_enable_x64): self.skipTest("Only run float64 testcase when float64 is enabled.") + jtu.skip_if_unsupported_type(dtype) rng = rng_factory() onp_fun = lambda x: onp.frexp(x) jnp_fun = lambda x: jnp.frexp(x) From 32c45fbb42e716291c56060109c77e8f1e8adeea Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 2 Apr 2020 13:10:50 +0200 Subject: [PATCH 1005/1053] Another attempt to disable new failing test on TPU --- tests/lax_numpy_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 9c7b9a17fb6b..e6da258492a3 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1228,6 +1228,7 @@ def testIdentity(self, n, dtype): for x1_shape, x2_shape in filter(_shapes_are_broadcast_compatible, CombosWithReplacement(array_shapes, 2)) for x1_dtype in default_dtypes)) + @jtu.skip_on_devices("tpu") # TODO(b/153053081) def testLdexp(self, x1_shape, x1_dtype, x2_shape, x1_rng_factory, x2_rng_factory): # integer types are converted to float64 in numpy's implementation if (x1_dtype not in [jnp.bfloat16, onp.float16, onp.float32] @@ -1256,12 +1257,12 @@ def onp_fun(x1, x2): ]) for shape in all_shapes for dtype in default_dtypes)) + @jtu.skip_on_devices("tpu") def testFrexp(self, shape, dtype, rng_factory): # integer types are converted to float64 in numpy's implementation if (dtype not in [jnp.bfloat16, onp.float16, onp.float32] and not FLAGS.jax_enable_x64): self.skipTest("Only run float64 testcase when float64 is enabled.") - jtu.skip_if_unsupported_type(dtype) rng = rng_factory() onp_fun = lambda x: onp.frexp(x) jnp_fun = lambda x: jnp.frexp(x) From 84dc6cc1c4661afaa6cb0c1d61514131f31bab2c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 07:52:17 -0700 Subject: [PATCH 1006/1053] post process call of jet! Also included David's jet rule for lax.select. Co-authored-by: Jesse Bettencourt Co-authored-by: Jacob Kelly Co-authored-by: David Duvenaud --- jax/experimental/jet.py | 58 +++++++++++++++++++++++++++++++++-------- tests/jet_test.py | 27 ++++++++++++++++++- 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/jax/experimental/jet.py b/jax/experimental/jet.py index 3e7ce8d62f46..0e8973b5ba5c 100644 --- a/jax/experimental/jet.py +++ b/jax/experimental/jet.py @@ -49,19 +49,32 @@ def flatten_fun_output(*args): yield tree_flatten(ans) f, out_tree = flatten_fun_output(lu.wrap_init(fun)) - out_primals, out_terms = jet_transform(f).call_wrapped(primals, series) + out_primals, out_terms = jet_fun(jet_subtrace(f)).call_wrapped(primals, series) return tree_unflatten(out_tree(), out_primals), tree_unflatten(out_tree(), out_terms) @lu.transformation -def jet_transform(primals, series): +def jet_fun(primals, series): with core.new_master(JetTrace) as master: - trace = JetTrace(master, core.cur_sublevel()) - in_tracers = map(partial(JetTracer, trace), primals, series) - ans = yield in_tracers, {} - out_tracers = map(trace.full_raise, ans) - out_primals, out_terms = unzip2((t.primal, t.terms) for t in out_tracers) + out_primals, out_terms = yield (master, primals, series), {} + del master yield out_primals, out_terms +@lu.transformation +def jet_subtrace(master, primals, series): + trace = JetTrace(master, core.cur_sublevel()) + in_tracers = map(partial(JetTracer, trace), primals, series) + ans = yield in_tracers, {} + out_tracers = map(trace.full_raise, ans) + out_primals, out_terms = unzip2((t.primal, t.terms) for t in out_tracers) + yield out_primals, out_terms + +@lu.transformation_with_aux +def traceable(in_tree_def, *primals_and_series): + primals_in, series_in = tree_unflatten(in_tree_def, primals_and_series) + primals_out, series_out = yield (primals_in, series_in), {} + out_flat, out_tree_def = tree_flatten((primals_out, series_out)) + yield out_flat, out_tree_def + class JetTracer(core.Tracer): __slots__ = ["primal", "terms"] @@ -94,6 +107,7 @@ def sublift(self, val): return JetTracer(self, val.primal, val.terms) def process_primitive(self, primitive, tracers, params): + assert not primitive.multiple_results # TODO primals_in, series_in = unzip2((t.primal, t.terms) for t in tracers) order, = {len(terms) for terms in series_in if terms is not zero_series} series_in = [[zero_term] * order if s is zero_series else s @@ -107,10 +121,23 @@ def process_primitive(self, primitive, tracers, params): return JetTracer(self, primal_out, terms_out) def process_call(self, call_primitive, f, tracers, params): - assert False # TODO - - def post_process_call(self, call_primitive, out_tracer, params): - assert False # TODO + primals_in, series_in = unzip2((t.primal, t.terms) for t in tracers) + primals_and_series, in_tree_def = tree_flatten((primals_in, series_in)) + f_jet, out_tree_def = traceable(jet_subtrace(f, self.master), in_tree_def) + result = call_primitive.bind(f_jet, *primals_and_series, **params) + primals_out, series_out = tree_unflatten(out_tree_def(), result) + return [JetTracer(self, p, ts) for p, ts in zip(primals_out, series_out)] + + def post_process_call(self, call_primitive, out_tracers, params): + primals, series = unzip2((t.primal, t.terms) for t in out_tracers) + out, treedef = tree_flatten((primals, series)) + del primals, series + master = self.master + def todo(x): + primals, series = tree_unflatten(treedef, x) + trace = JetTrace(master, core.cur_sublevel()) + return map(partial(JetTracer, trace), primals, series) + return out, todo def join(self, xt, yt): assert False # TODO? @@ -278,3 +305,12 @@ def _abs_taylor_rule(x, series_in, **params): series_out = [fix_sign(*terms_in, **params) for terms_in in zip(*series_in)] return primal_out, series_out jet_rules[lax.abs_p] = _abs_taylor_rule + +def _select_taylor_rule(primal_in, series_in, **params): + b, x, y = primal_in + primal_out = lax.select_p.bind(b, x, y, **params) + sel = lambda _, x, y: lax.select(b, x, y) + series_out = [sel(*terms_in, **params) for terms_in in zip(*series_in)] + return primal_out, series_out +jet_rules[lax.select_p] = _select_taylor_rule + diff --git a/tests/jet_test.py b/tests/jet_test.py index 853eb2608246..033f1fec6053 100644 --- a/tests/jet_test.py +++ b/tests/jet_test.py @@ -21,7 +21,7 @@ from jax import test_util as jtu import jax.numpy as np from jax import random -from jax import jacfwd +from jax import jacfwd, jit from jax.experimental import stax from jax.experimental.jet import jet, fact, zero_series from jax.tree_util import tree_map @@ -178,6 +178,31 @@ def test_or(self): self.binary_check(lambda x, y: np.logical_or(x, y)) @jtu.skip_on_devices("tpu") def test_xor(self): self.binary_check(lambda x, y: np.logical_xor(x, y)) + def test_process_call(self): + def f(x): + return jit(lambda x: x * x)(x) + self.unary_check(f) + + def test_post_process_call(self): + def f(x): + return jit(lambda y: x * y)(2.) + + self.unary_check(f) + + def test_select(self): + M, K = 2, 3 + order = 3 + rng = onp.random.RandomState(0) + b = rng.rand(M, K) < 0.5 + x = rng.randn(M, K) + y = rng.randn(M, K) + primals = (b, x, y) + terms_b = [rng.randn(*b.shape) for _ in range(order)] + terms_x = [rng.randn(*x.shape) for _ in range(order)] + terms_y = [rng.randn(*y.shape) for _ in range(order)] + series_in = (terms_b, terms_x, terms_y) + self.check_jet(np.where, primals, series_in) + if __name__ == '__main__': absltest.main() From 5c0ac40c6a3c2f619eb38df6b4e0d613060c4ef5 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Thu, 2 Apr 2020 12:54:58 -0700 Subject: [PATCH 1007/1053] Revert jax.numpy.matmul to pre-#2512 version. (#2584) https://github.com/google/jax/pull/2512 was causing some Google-internal tests to take longer. --- jax/numpy/lax_numpy.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 69111ee347e6..b401a32b574b 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -2402,21 +2402,25 @@ def dot(a, b, precision=None): # pylint: disable=missing-docstring def matmul(a, b, precision=None): # pylint: disable=missing-docstring _check_arraylike("matmul", a, b) a_is_vec, b_is_vec = (ndim(a) == 1), (ndim(b) == 1) - # We lower to einsum here because it handles batch dimensions for us. - # np.matmul is stricter than np.einsum with respect to size 1 contracting - # dimensions, so we need an additional check. - if shape(a)[0 if a_is_vec else -1] != shape(b)[0 if b_is_vec else -2]: - msg = "matmul requires contracting dimension to match, got {} and {}" - raise ValueError(msg.format(shape(a), shape(b))) + a = lax.reshape(a, (1,) + shape(a)) if a_is_vec else a + b = lax.reshape(b, shape(b) + (1,)) if b_is_vec else b + a, b = _promote_dtypes(a, b) - if a_is_vec and b_is_vec: - return lax.dot(a, b, precision=precision) - elif a_is_vec: - return einsum('i,...ij->...j', a, b, precision=precision) - elif b_is_vec: - return einsum('...ij,j->...i', a, b, precision=precision) + batch_shape = lax.broadcast_shapes(shape(a)[:-2], shape(b)[:-2]) + a = broadcast_to(a, batch_shape + shape(a)[-2:]) + b = broadcast_to(b, batch_shape + shape(b)[-2:]) + batch_dims = tuple(range(len(batch_shape))) + dim_numbers = (((ndim(a) - 1,), (ndim(b) - 2,)), (batch_dims, batch_dims)) + result = lax.dot_general(a, b, dim_numbers, precision) + + if a_is_vec or b_is_vec: + m, n = shape(result)[-2:] + new_m = () if a_is_vec else (m,) + new_n = () if b_is_vec else (n,) + return lax.reshape(result, batch_shape + new_m + new_n) else: - return einsum('...ij,...jk->...ik', a, b, precision=precision) + return result + @_wraps(onp.vdot, lax_description=_PRECISION_DOC) def vdot(a, b, precision=None): From c72abf6dab27fb9f43178808f9357dfa795c5b7d Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 15:52:01 -0700 Subject: [PATCH 1008/1053] re-enable travis mypy testing (typo broke it) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0d18adcc384c..9bf39801b6bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,7 +44,7 @@ script: - if [ "$JAX_ONLY_DOCUMENTATION" = true ]; then sphinx-build -b html -D nbsphinx_execute=always docs docs/build/html ; elif [ "$JAX_ONLY_CHECK_TYPES" = true ]; then - echo "===== Checking with mypy ====" + echo "===== Checking with mypy ====" && time mypy --config-file=mypy.ini jax ; else pytest tests examples -W ignore ; From ab0a005452d04cae33164e88b616e45f6e5c19f5 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 17:18:47 -0700 Subject: [PATCH 1009/1053] check sublevel is reset in loops_test.py --- tests/api_test.py | 7 +++++++ tests/lax_control_flow_test.py | 7 +++++++ tests/loops_test.py | 4 +++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/api_test.py b/tests/api_test.py index 823a298faab7..2493821e5bb7 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -46,6 +46,13 @@ class APITest(jtu.JaxTestCase): + def tearDown(self) -> None: + if (core.trace_state.substack != [core.Sublevel(0)] or + core.trace_state.trace_stack.downward or + core.trace_state.trace_stack.upward): + core.trace_state = core.TraceState() + assert False # Fail this test + def test_grad_argnums(self): def f(x, y, z, flag=False): assert flag diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index dbe87b5f7883..90f52ef89cfa 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -61,6 +61,13 @@ def high_precision_dot(a, b): class LaxControlFlowTest(jtu.JaxTestCase): + def tearDown(self) -> None: + if (core.trace_state.substack != [core.Sublevel(0)] or + core.trace_state.trace_stack.downward or + core.trace_state.trace_stack.upward): + core.trace_state = core.TraceState() + assert False # Fail this test + def testWhileWithTuple(self): limit = 10 diff --git a/tests/loops_test.py b/tests/loops_test.py index fe7e954130cc..d0e4f43a97a3 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -33,7 +33,9 @@ class LoopsTest(jtu.JaxTestCase): def tearDown(self) -> None: # Check that the global state manipulated by loops is restored - if core.trace_state.trace_stack.downward or core.trace_state.trace_stack.upward: + if (core.trace_state.substack != [core.Sublevel(0)] or + core.trace_state.trace_stack.downward or + core.trace_state.trace_stack.upward): core.trace_state = core.TraceState() assert False # Fail this test From b78b7a03090aa4a7146ec32eb29b068f68bbf0ec Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 18:03:58 -0700 Subject: [PATCH 1010/1053] add global trace state checks to more tests --- jax/core.py | 11 +++++++++++ tests/api_test.py | 21 ++++++++++++++++----- tests/lax_control_flow_test.py | 6 +----- tests/loops_test.py | 7 +------ 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/jax/core.py b/jax/core.py index 01916a6a0560..f4e27d535cb0 100644 --- a/jax/core.py +++ b/jax/core.py @@ -542,6 +542,17 @@ def copy(self): return new trace_state = TraceState() +def reset_trace_state() -> bool: + "Reset the global trace state and return True if it was already clean." + global trace_state + if (trace_state.substack != [Sublevel(0)] or + trace_state.trace_stack.downward or + trace_state.trace_stack.upward): + trace_state = TraceState() + return False + else: + return True + def cur_sublevel() -> Sublevel: return trace_state.substack[-1] diff --git a/tests/api_test.py b/tests/api_test.py index 2493821e5bb7..365f4149ea36 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -47,11 +47,7 @@ class APITest(jtu.JaxTestCase): def tearDown(self) -> None: - if (core.trace_state.substack != [core.Sublevel(0)] or - core.trace_state.trace_stack.downward or - core.trace_state.trace_stack.upward): - core.trace_state = core.TraceState() - assert False # Fail this test + assert core.reset_trace_state() def test_grad_argnums(self): def f(x, y, z, flag=False): @@ -1596,6 +1592,9 @@ def func1(x): class JaxprTest(jtu.JaxTestCase): + def tearDown(self) -> None: + assert core.reset_trace_state() + def test_scalar_literals(self): jaxpr = api.make_jaxpr(lambda x: x + 2)(42) self.assertLen(jaxpr.jaxpr.constvars, 0) @@ -1808,6 +1807,9 @@ def inner(x): class LazyTest(jtu.JaxTestCase): + def tearDown(self) -> None: + assert core.reset_trace_state() + @contextmanager def count_compiles(self): @@ -1988,6 +1990,9 @@ def test_zeros_ones_compilation(self): class CustomJVPTest(jtu.JaxTestCase): + def tearDown(self) -> None: + assert core.reset_trace_state() + def test_basic(self): @api.custom_jvp def f(x): @@ -2425,6 +2430,9 @@ def _expit_jvp(primals, tangents): class CustomVJPTest(jtu.JaxTestCase): + def tearDown(self) -> None: + assert core.reset_trace_state() + def test_basic(self): @api.custom_vjp def f(x): @@ -2776,6 +2784,9 @@ def g(x): class DeprecatedCustomTransformsTest(jtu.JaxTestCase): + def tearDown(self) -> None: + assert core.reset_trace_state() + def test_defvjp_all(self): foo_p = Primitive('foo') def foo(x): return 2. * foo_p.bind(x) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index 90f52ef89cfa..d4794a4db79a 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -62,11 +62,7 @@ def high_precision_dot(a, b): class LaxControlFlowTest(jtu.JaxTestCase): def tearDown(self) -> None: - if (core.trace_state.substack != [core.Sublevel(0)] or - core.trace_state.trace_stack.downward or - core.trace_state.trace_stack.upward): - core.trace_state = core.TraceState() - assert False # Fail this test + assert core.reset_trace_state() def testWhileWithTuple(self): limit = 10 diff --git a/tests/loops_test.py b/tests/loops_test.py index d0e4f43a97a3..6f3a4b3fb4d3 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -32,12 +32,7 @@ class LoopsTest(jtu.JaxTestCase): def tearDown(self) -> None: - # Check that the global state manipulated by loops is restored - if (core.trace_state.substack != [core.Sublevel(0)] or - core.trace_state.trace_stack.downward or - core.trace_state.trace_stack.upward): - core.trace_state = core.TraceState() - assert False # Fail this test + assert core.reset_trace_state() def test_scope_no_loops(self): def f_op(r): From 6d4987cc04e47d338e6d37bd9a75c84f1664809c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 18:19:44 -0700 Subject: [PATCH 1011/1053] make core.trace_state resetting be thread-local --- jax/core.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jax/core.py b/jax/core.py index f4e27d535cb0..04d149e41bfe 100644 --- a/jax/core.py +++ b/jax/core.py @@ -544,11 +544,10 @@ def copy(self): def reset_trace_state() -> bool: "Reset the global trace state and return True if it was already clean." - global trace_state if (trace_state.substack != [Sublevel(0)] or trace_state.trace_stack.downward or trace_state.trace_stack.upward): - trace_state = TraceState() + trace_state.__init__() return False else: return True From 5d3f1bdf4c140db29c15d4dfca594ddfae27f577 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 20:14:12 -0700 Subject: [PATCH 1012/1053] tell mypy: using __init__ to reinitialize is OK --- jax/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/core.py b/jax/core.py index 04d149e41bfe..732a65ecde29 100644 --- a/jax/core.py +++ b/jax/core.py @@ -547,7 +547,7 @@ def reset_trace_state() -> bool: if (trace_state.substack != [Sublevel(0)] or trace_state.trace_stack.downward or trace_state.trace_stack.upward): - trace_state.__init__() + trace_state.__init__() # type: ignore return False else: return True From 297c90246d22dccfa8d280097a5fa653e992643c Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 21:04:12 -0700 Subject: [PATCH 1013/1053] make tracers tree-pretty-print their contents --- jax/core.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/jax/core.py b/jax/core.py index 01916a6a0560..ada0010d9963 100644 --- a/jax/core.py +++ b/jax/core.py @@ -449,7 +449,18 @@ def __getattr__(self, name): return attr def __repr__(self): - return 'Traced<{}>with<{}>'.format(self.aval, self._trace) + base = pp('Traced<{}>with<{}>'.format(self.aval, self._trace)) + contents = self._contents() + if contents: + base += pp(' with ') >> vcat(pp('{} = '.format(name)) >> pp_payload + for name, pp_payload in contents) + return str(base) + + def _contents(self): + try: + return [(name, pp(repr(getattr(self, name)))) for name in self.__slots__] + except AttributeError: + return () def __copy__(self): return self From f2de1bf3457b7cece346c8e8762f1bd67bfdcc32 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 22:01:43 -0700 Subject: [PATCH 1014/1053] add trace state check tearDown to JaxTestCase --- jax/test_util.py | 3 +++ tests/api_test.py | 18 ------------------ tests/lax_control_flow_test.py | 3 --- tests/loops_test.py | 3 --- 4 files changed, 3 insertions(+), 24 deletions(-) diff --git a/jax/test_util.py b/jax/test_util.py index fc9e86910317..ee1cc13fba2f 100644 --- a/jax/test_util.py +++ b/jax/test_util.py @@ -668,6 +668,9 @@ def cases_from_gens(*gens): class JaxTestCase(parameterized.TestCase): """Base class for JAX tests including numerical checks and boilerplate.""" + def tearDown(self) -> None: + assert core.reset_trace_state() + def assertArraysAllClose(self, x, y, check_dtypes, atol=None, rtol=None): """Assert that x and y are close (up to numerical tolerances).""" self.assertEqual(x.shape, y.shape) diff --git a/tests/api_test.py b/tests/api_test.py index 365f4149ea36..823a298faab7 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -46,9 +46,6 @@ class APITest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - def test_grad_argnums(self): def f(x, y, z, flag=False): assert flag @@ -1592,9 +1589,6 @@ def func1(x): class JaxprTest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - def test_scalar_literals(self): jaxpr = api.make_jaxpr(lambda x: x + 2)(42) self.assertLen(jaxpr.jaxpr.constvars, 0) @@ -1807,9 +1801,6 @@ def inner(x): class LazyTest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - @contextmanager def count_compiles(self): @@ -1990,9 +1981,6 @@ def test_zeros_ones_compilation(self): class CustomJVPTest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - def test_basic(self): @api.custom_jvp def f(x): @@ -2430,9 +2418,6 @@ def _expit_jvp(primals, tangents): class CustomVJPTest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - def test_basic(self): @api.custom_vjp def f(x): @@ -2784,9 +2769,6 @@ def g(x): class DeprecatedCustomTransformsTest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - def test_defvjp_all(self): foo_p = Primitive('foo') def foo(x): return 2. * foo_p.bind(x) diff --git a/tests/lax_control_flow_test.py b/tests/lax_control_flow_test.py index d4794a4db79a..dbe87b5f7883 100644 --- a/tests/lax_control_flow_test.py +++ b/tests/lax_control_flow_test.py @@ -61,9 +61,6 @@ def high_precision_dot(a, b): class LaxControlFlowTest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - def testWhileWithTuple(self): limit = 10 diff --git a/tests/loops_test.py b/tests/loops_test.py index 6f3a4b3fb4d3..60fbb5172601 100644 --- a/tests/loops_test.py +++ b/tests/loops_test.py @@ -31,9 +31,6 @@ class LoopsTest(jtu.JaxTestCase): - def tearDown(self) -> None: - assert core.reset_trace_state() - def test_scope_no_loops(self): def f_op(r): with loops.Scope() as s: From 0e49133e12c2a318e02e5c9dd3d664d730e0be45 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 22:52:07 -0700 Subject: [PATCH 1015/1053] add full lower to custom_jvp/vjp call bind fixes #2578 --- jax/custom_derivatives.py | 2 ++ tests/api_test.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/jax/custom_derivatives.py b/jax/custom_derivatives.py index bf8e9c5da48b..6e60bcd64b69 100644 --- a/jax/custom_derivatives.py +++ b/jax/custom_derivatives.py @@ -252,6 +252,7 @@ def _flatten_jvp(in_tree, *args): yield primals_out + tangents_out, out_tree def _custom_jvp_call_bind(prim, fun, jvp, *args): + args = map(core.full_lower, args) top_trace = core.find_top_trace(args) level = (core.trace_state.trace_stack.next_level(True) if top_trace is None else top_trace.level) @@ -490,6 +491,7 @@ def _flatten_bwd(in_tree, out_trees, *args): yield cts_in def _custom_vjp_call_bind(prim, fun, fwd, bwd, *args, out_trees): + args = map(core.full_lower, args) top_trace = core.find_top_trace(args) level = (core.trace_state.trace_stack.next_level(True) if top_trace is None else top_trace.level) diff --git a/tests/api_test.py b/tests/api_test.py index 365f4149ea36..ccdc5218c726 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -2781,6 +2781,19 @@ def g(x): expected = jax.grad(f, 0)(2., 0.1) + jax.grad(f, 0)(2., 0.2) self.assertAllClose(ans, expected, check_dtypes=False) + def test_lowering_out_of_traces(self): + # https://github.com/google/jax/issues/2578 + + class F(collections.namedtuple("F", ["a"])): + def __call__(self, x): + return jax.nn.relu(self.a) * x + + @jax.jit + def g(f, x): + return f(x) + + jax.grad(g, argnums=(1,))(F(2.0), 0.) # doesn't crash + class DeprecatedCustomTransformsTest(jtu.JaxTestCase): From ba8225f394b0e4aa5a9e09476cce8e917ebda527 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Thu, 2 Apr 2020 23:11:55 -0700 Subject: [PATCH 1016/1053] skip all parallelize tests (abandonware right now) --- tests/parallel_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/parallel_test.py b/tests/parallel_test.py index 7c8df34fb9ac..041b7287775a 100644 --- a/tests/parallel_test.py +++ b/tests/parallel_test.py @@ -15,7 +15,7 @@ import itertools import unittest -from unittest import SkipTest +from unittest import SkipTest, skip import numpy as onp from absl.testing import absltest @@ -130,6 +130,7 @@ def testMakeJaxprPapplyComposition(self): make_jaxpr(pfun)(onp.ones(3)) # doesn't crash +@skip("causing trace state errors that affect other tests") class ParallelizeTest(jtu.JaxTestCase): def dedup(self, arr, expected_rank): From 824ac86620572285b86dd09529f8869ef36883ad Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 3 Apr 2020 15:39:56 -0400 Subject: [PATCH 1017/1053] Reimplement np.cumsum and np.cumprod in terms of a parallel prefix scan. (#2596) * Reimplement np.cumsum and np.cumprod in terms of a parallel prefix scan. Unlike the existing implementation based on lax.reduce_window, this implementation is O(n log n) instead of O(n^2) and is arbitrarily differentiable. Fixes #1212, #2418, #2542. May help with issue #2380. * Relax gradient test tolerance. --- jax/numpy/lax_numpy.py | 75 ++++++++++++++++++++++++++++++++--------- tests/lax_numpy_test.py | 6 +++- 2 files changed, 65 insertions(+), 16 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index b401a32b574b..036f2e5a4697 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -33,6 +33,7 @@ import re import string import types +from typing import Callable import warnings import numpy as onp @@ -1569,7 +1570,59 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): td = lax.div(nansum(a, axis, dtype=dtype, keepdims=keepdims), normalizer) return td -def _make_cumulative_reduction(onp_reduction, window_reduce, init_val, + +# Parallel prefix-scan. See: +# https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda +# and +# Blelloch, Guy E. 1990. "Prefix Sums and Their Applications.", Technical Report +# CMU-CS-90-190, School of Computer Science, Carnegie Mellon University. +# +# Unlike the Blelloch algorithm, we use an out-of-place algorithm that uses 2n +# space. This is somewhat wasteful if we are interested only in the output of +# the forward pass, but more memory-efficient if we intend to differentiate +# through the implementation of the scan. +def _prescan_power_of_two(x, axis: int, op: Callable, unit): + n = x.shape[axis] + assert n != 0 and n & (n - 1) == 0, "n must be a power of 2" + + # Upsweep + xs = [] + for d in range(0, n.bit_length() - 1): + x1 = lax.slice_in_dim(x, 0, None, stride=2, axis=axis) + xs.append(x1) + x2 = lax.slice_in_dim(x, 1, None, stride=2, axis=axis) + x = op(x1, x2) + total = x + + # Downsweep + x = full_like(total, unit) + pad_left = [(0, 0, 0)] * len(x.shape) + pad_left[axis] = (1, 0, 1) + pad_right = [(0, 0, 0)] * len(x.shape) + pad_right[axis] = (0, 1, 1) + for w in reversed(xs): + x1 = lax.pad(x, x.dtype.type(0), pad_right) + x2 = lax.pad(x, x.dtype.type(0), pad_left) + w = lax.pad(w, x.dtype.type(0), pad_left) + x = x1 + op(x2, w) + + return x, total + +def _parallel_prefix_scan(x, axis: int, op: Callable, unit): + n = x.shape[axis] + + # Pads to the next largest power of two + nbits = n.bit_length() + if n == (1 << (nbits - 1)): + nbits -= 1 + padding = [(0, 0, 0)] * len(x.shape) + padding[axis] = (0, (1 << nbits) - n, 0) + x = lax.pad(x, x.dtype.type(unit), padding) + x, product = _prescan_power_of_two(x, axis, op, unit) + return concatenate((lax.slice_in_dim(x, 1, n, axis=axis), product), axis=axis) + + +def _make_cumulative_reduction(onp_reduction, op, unit, squash_nan=False): # We want to allow XLA to fuse the pad and reduce-window operators to # avoid materializing the padded output. @@ -1592,7 +1645,7 @@ def _cumulative_reduction(a, axis, dtype): axis, num_dims)) if squash_nan: - a = where(isnan(a), _constant_like(a, init_val), a) + a = where(isnan(a), _constant_like(a, unit), a) if not dtype and _dtype(a) == bool_: dtype = int_ @@ -1601,15 +1654,7 @@ def _cumulative_reduction(a, axis, dtype): if a_shape[axis] == 0: return a - - padding = [(0, 0, 0)] * num_dims - padding[axis] = (a_shape[axis] - 1, 0, 0) - a = lax.pad(a, _constant_like(a, init_val), padding) - strides = [1] * num_dims - window_dims = [1] * num_dims - window_dims[axis] = a_shape[axis] - return window_reduce( - a, window_dims, strides, xla_client.PaddingType.VALID) + return _parallel_prefix_scan(a, axis, op, unit) @_wraps(onp_reduction) def cumulative_reduction(a, axis=None, dtype=None): @@ -1619,14 +1664,14 @@ def cumulative_reduction(a, axis=None, dtype=None): cumsum = _make_cumulative_reduction( - onp.cumsum, lax._reduce_window_sum, 0, squash_nan=False) + onp.cumsum, add, 0, squash_nan=False) cumprod = _make_cumulative_reduction( - onp.cumprod, lax._reduce_window_prod, 1, squash_nan=False) + onp.cumprod, multiply, 1, squash_nan=False) cumproduct = cumprod nancumsum = _make_cumulative_reduction( - onp.nancumsum, lax._reduce_window_sum, 0, squash_nan=True) + onp.nancumsum, add, 0, squash_nan=True) nancumprod = _make_cumulative_reduction( - onp.nancumprod, lax._reduce_window_prod, 1, squash_nan=True) + onp.nancumprod, multiply, 1, squash_nan=True) ### Array-creation functions diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index e6da258492a3..a5310517084a 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1104,7 +1104,8 @@ def attempt_sideeffect(x): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "op={}_shape=[{}]_axis={}_out_dtype={}".format( - op, jtu.format_shape_dtype_string(shape, dtype), axis, out_dtype), + op, jtu.format_shape_dtype_string(shape, dtype), axis, + out_dtype.__name__), "axis": axis, "shape": shape, "dtype": dtype, "out_dtype": out_dtype, "rng_factory": jtu.rand_default, "jnp_op": getattr(jnp, op), "onp_op": getattr(onp, op)} @@ -1124,6 +1125,9 @@ def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, jnp_op, rng_fact self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) + grad_dtypes = [onp.float32, onp.float64, onp.complex64, onp.complex128] + if dtype in grad_dtypes and out_dtype in grad_dtypes: + check_grads(jnp_fun, args_maker(), order=2, rtol=1e-2) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_dtype={}_m={}_n={}_k={}".format( From 2b3befff322259f516468206a960d0faa648df97 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Fri, 3 Apr 2020 16:09:48 -0400 Subject: [PATCH 1018/1053] Make reduce_prod differentiable to arbitrary order. (#2597) * Make reduce_prod differentiable to arbitrary order. The previous strategy for computing the JVP of reduce_prod used a pair of reduce_window operations to form left and right products for each position. This PR instead builds an explicit reduction tree and differentiates through it, which while not as efficient as using XLA's built-in reductions, has the advantage of being differentiable to arbitrary order. . * Return the tree-reduction primals instead of returning the original primals in JVP rule. --- jax/lax/lax.py | 40 ++++++++++++++++++++++------------------ tests/lax_test.py | 12 +++++++----- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 700f2c0cc8d9..88b44ee28d8f 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -3514,7 +3514,9 @@ def _reduce_prod_translation_rule(c, operand, axes): return c.Reduce(operand, c.Constant(onp.array(1, dtype)), xla.primitive_subcomputation(mul_p, scalar, scalar), axes) -def _reduce_prod_jvp_rule(tangent, operand, axes): +def _reduce_prod_jvp_rule(primals, tangents, axes): + operand, = primals + tangent, = tangents input_shape = onp.array(operand.shape) n = onp.prod(input_shape[list(axes)]) @@ -3526,28 +3528,30 @@ def _reduce_prod_jvp_rule(tangent, operand, axes): operand = reshape(operand, new_shape, permutation) tangent = reshape(tangent, new_shape, permutation) - one = _const(operand, 1) - window_dims = [n] + [1] * len(non_axes) - window_strides = [1] * (len(non_axes) + 1) + def _reduce_prod_tree(x, axis=0): + """Reduce by repeatedly splitting the array and multiplying.""" + while x.shape[axis] > 1: + n = x.shape[axis] + n1 = (n + 1) // 2 + n2 = n - n1 + x1 = slice_in_dim(x, 0, n1) + x2 = slice_in_dim(x, n1, None) + if n2 != n1: + paddings = [(0, 0, 0)] * len(x.shape) + paddings[axis] = (0, 1, 0) + x2 = pad(x2, _const(x, 1), paddings) + x = x1 * x2 + shape = list(x.shape) + del shape[axis] + return reshape(x, shape) + + return api.jvp(_reduce_prod_tree, (operand,), (tangent,)) - # Form the partial products of all elements to the left and right of each - # element. - left_padding = [(n, -1, 0)] + [(0, 0, 0)] * len(non_axes) - right_padding = [(-1, n, 0)] + [(0, 0, 0)] * len(non_axes) - left_products = _reduce_window_prod(pad(operand, one, left_padding), - window_dims, window_strides, - xla_client.PaddingType.VALID) - right_products = _reduce_window_prod(pad(operand, one, right_padding), - window_dims, window_strides, - xla_client.PaddingType.VALID) - - # Multiply partial products with the tangents and sum. - return _reduce_sum(mul(tangent, mul(left_products, right_products)), (0,)) reduce_prod_p = standard_primitive( _reduce_op_shape_rule, partial(_reduce_number_dtype_rule, 'reduce_prod'), 'reduce_prod', _reduce_prod_translation_rule) -ad.defjvp(reduce_prod_p, _reduce_prod_jvp_rule) +ad.primitive_jvps[reduce_prod_p] = _reduce_prod_jvp_rule batching.defreducer(reduce_prod_p) diff --git a/tests/lax_test.py b/tests/lax_test.py index 08b9570606d6..949602f70d01 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -2296,11 +2296,13 @@ def testTransposeGrad(self, shape, dtype, perm, rng_factory): for init_val, op, dtypes in [ (0, lax.add, inexact_dtypes), # Precision problems for float16 tests. - (-onp.inf, lax.max, [t for t in inexact_dtypes if t != onp.float16]), - (onp.inf, lax.min, [t for t in inexact_dtypes if t != onp.float16]), + (-onp.inf, lax.max, + [t for t in inexact_dtypes if t not in [onp.float16, dtypes.bfloat16]]), + (onp.inf, lax.min, + [t for t in inexact_dtypes if t not in [onp.float16, dtypes.bfloat16]]), # The mul test overflows the range of a float16. - (1, lax.mul, [t for t in inexact_dtypes - if t not in (onp.float16, dtypes.bfloat16)]), + (1, lax.mul, + [t for t in inexact_dtypes if t not in [onp.float16, dtypes.bfloat16]]), ] for dtype in dtypes for shape, dims in [ @@ -2324,7 +2326,7 @@ def testReduceGrad(self, op, init_val, shape, dtype, dims, rng_factory): eps = (1.0 if dtypes.finfo(dtype).bits == 16 and op is lax.add else 1e-1 if dtype == dtypes.bfloat16 else 1e-2 if dtypes.finfo(dtype).bits == 32 else None) - check_grads(reduce, (operand,), 1, ["fwd", "rev"], tol, tol, eps) + check_grads(reduce, (operand,), 2, ["fwd", "rev"], tol, tol, eps) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_op={}_dtype={}_padding={}" From 72783bb71b1848442549ad9c6b699e88cd07d0cb Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Fri, 3 Apr 2020 13:27:02 -0700 Subject: [PATCH 1019/1053] Fix grad(logit) to use defjvps and enable it in tests --- jax/scipy/special.py | 2 +- tests/lax_scipy_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index ee54562789a1..47c388e7a328 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -84,7 +84,7 @@ def erfinv(x): def logit(x): x = asarray(x) return lax.log(lax.div(x, lax.sub(lax._const(x, 1), x))) -logit.defjvp(lambda g, ans, x: g / (x * (1 - x))) +logit.defjvps(lambda g, ans, x: g / (x * (1 - x))) @api.custom_jvp diff --git a/tests/lax_scipy_test.py b/tests/lax_scipy_test.py index 656c33b2ffbc..2783882120ca 100644 --- a/tests/lax_scipy_test.py +++ b/tests/lax_scipy_test.py @@ -68,7 +68,7 @@ def op_record(name, nargs, dtypes, rng_factory, test_grad, test_name=None): op_record("expit", 1, float_dtypes, jtu.rand_small_positive, True), # TODO: gammaln has slightly high error. op_record("gammaln", 1, float_dtypes, jtu.rand_positive, False), - op_record("logit", 1, float_dtypes, jtu.rand_small_positive, False), + op_record("logit", 1, float_dtypes, jtu.rand_uniform, True), op_record("log_ndtr", 1, float_dtypes, jtu.rand_default, True), op_record("ndtri", 1, float_dtypes, partial(jtu.rand_uniform, 0.05, 0.95), True), From 1b93bb51a887ed9835588f8094dc15d6b1941a19 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 3 Apr 2020 13:37:11 -0700 Subject: [PATCH 1020/1053] Implement scipy.sparse.linalg.cg (second try) (#2566) * super minimal starter code * Update optimizers.py * implement flip with axis = None * Create sparse.py * fix some imports * Update sparse.py * add partial function & test * Update lax_scipy_sparse_test.py * Update lax_scipy_sparse_test.py * add a test case for sparse pd matrix & add bigger dim * address comments * fix info return & create matrix with rng_factory * Update lax_scipy_sparse_test.py * Update lax_scipy_sparse_test.py * Update sparse.py * Update sparse.py * Update sparse.py * Update lax_scipy_sparse_test.py * Update lax_scipy_sparse_test.py * cast jax arrays into numpy array for scipy compatibility * Update sparse.py * Update sparse.py * fix None issue, but algo is not working * fix return of build_and_solve and output of while_loop * fix condition func of while loop * clearer variable names * mismatch error * Update lax_scipy_sparse_test.py * Fixes to jax.experimental.sparse.cg * Fix tests for gradients * Add support for preconditioners to cg * Move cg into scipy, update docs * doc tweak Co-authored-by: Tuan Nguyen --- docs/jax.scipy.rst | 10 +++ jax/scipy/sparse/__init__.py | 15 ++++ jax/scipy/sparse/linalg.py | 133 +++++++++++++++++++++++++++++++ tests/lax_scipy_sparse_test.py | 139 +++++++++++++++++++++++++++++++++ 4 files changed, 297 insertions(+) create mode 100644 jax/scipy/sparse/__init__.py create mode 100644 jax/scipy/sparse/linalg.py create mode 100644 tests/lax_scipy_sparse_test.py diff --git a/docs/jax.scipy.rst b/docs/jax.scipy.rst index e38d68cff77b..3ec690c349a9 100644 --- a/docs/jax.scipy.rst +++ b/docs/jax.scipy.rst @@ -37,6 +37,16 @@ jax.scipy.ndimage map_coordinates +jax.scipy.sparse.linalg +----------------------- + +.. automodule:: jax.scipy.sparse.linalg + +.. autosummary:: + :toctree: _autosummary + + cg + jax.scipy.special ----------------- diff --git a/jax/scipy/sparse/__init__.py b/jax/scipy/sparse/__init__.py new file mode 100644 index 000000000000..1d7527c91d3b --- /dev/null +++ b/jax/scipy/sparse/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import linalg diff --git a/jax/scipy/sparse/linalg.py b/jax/scipy/sparse/linalg.py new file mode 100644 index 000000000000..16ef69440b0b --- /dev/null +++ b/jax/scipy/sparse/linalg.py @@ -0,0 +1,133 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import partial +import textwrap + +import scipy.sparse.linalg +import jax.numpy as jnp +import numpy as np +from jax.numpy.lax_numpy import _wraps +from jax import lax + + +def _vdot(x, y): + return jnp.vdot(x, y, precision=lax.Precision.HIGHEST) + + +def _identity(x): + return x + + +def _cg_solve(A, b, x0=None, *, maxiter, tol=1e-5, atol=0.0, M=_identity): + # tolerance handling uses the "non-legacy" behavior of scipy.sparse.linalg.cg + bs = _vdot(b, b) + atol2 = jnp.maximum(tol ** 2 * bs, atol ** 2) + + # https://en.wikipedia.org/wiki/Conjugate_gradient_method#The_preconditioned_conjugate_gradient_method + + def cond_fun(value): + x, r, gamma, p, k = value + rs = gamma if M is _identity else _vdot(r, r) + return (rs > atol2) & (k < maxiter) + + def body_fun(value): + x, r, gamma, p, k = value + Ap = A(p) + alpha = gamma / _vdot(p, Ap) + x_ = x + alpha * p + r_ = r - alpha * Ap + z_ = M(r_) + gamma_ = _vdot(r_, z_) + beta_ = gamma_ / gamma + p_ = z_ + beta_ * p + return x_, r_, gamma_, p_, k + 1 + + r0 = b - A(x0) + p0 = z0 = M(r0) + gamma0 = _vdot(r0, z0) + initial_value = (x0, r0, gamma0, p0, 0) + + x_final, *_ = lax.while_loop(cond_fun, body_fun, initial_value) + + return x_final + + +def cg(A, b, x0=None, *, tol=1e-5, atol=0.0, maxiter=None, M=None): + """Use Conjugate Gradient iteration to solve ``Ax = b``. + + The numerics of JAX's ``cg`` should exact match SciPy's ``cg`` (up to + numerical precision), but note that the interface is slightly different: you + need to supply the linear operator ``A`` as a function instead of a sparse + matrix or ``LinearOperator``. + + Parameters + ---------- + A : function + Function that calculates the matrix-vector product ``Ax`` when called + like ``A(x)``. ``A`` must represent a hermitian, positive definite + matrix. + b : array + Right hand side of the linear system. Has shape (N,). + + Returns + ------- + x : array + The converged solution. + info : None + Placeholder for convergence information. In the future, JAX will report + the number of iterations when convergence is not achieved, like SciPy. + + Other Parameters + ---------------- + x0 : array + Starting guess for the solution. + tol, atol : float, optional + Tolerances for convergence, ``norm(residual) <= max(tol*norm(b), atol)``. + We do not implement SciPy's "legacy" behavior, so JAX's tolerance will + differ from SciPy unless you explicitly pass ``atol`` to SciPy's ``cg``. + maxiter : integer + Maximum number of iterations. Iteration will stop after maxiter + steps even if the specified tolerance has not been achieved. + M : function + Preconditioner for A. The preconditioner should approximate the + inverse of A. Effective preconditioning dramatically improves the + rate of convergence, which implies that fewer iterations are needed + to reach a given error tolerance. + + See also + -------- + scipy.sparse.linalg.cg + """ + if x0 is None: + x0 = jnp.zeros_like(b) + + if maxiter is None: + maxiter = 10 * len(b) # copied from scipy + + if M is None: + M = _identity + + if x0.shape != b.shape: + raise ValueError( + f'x0 and b must have matching shape: {x0.shape} vs {b.shape}') + if b.ndim != 1: + raise ValueError( + f'b must be one-dimensional, but has shape {b.shape}') + + cg_solve = partial( + _cg_solve, x0=x0, tol=tol, atol=atol, maxiter=maxiter, M=M) + x = lax.custom_linear_solve(A, b, cg_solve, symmetric=True) + info = None # TODO(shoyer): return the real iteration count here + return x, info diff --git a/tests/lax_scipy_sparse_test.py b/tests/lax_scipy_sparse_test.py new file mode 100644 index 000000000000..e51c16d36084 --- /dev/null +++ b/tests/lax_scipy_sparse_test.py @@ -0,0 +1,139 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import partial +from absl.testing import parameterized +from absl.testing import absltest + +from jax import jit +import jax.numpy as jnp +import numpy as np +import scipy.sparse.linalg +from jax import lax +from jax import test_util as jtu +import jax.scipy.sparse.linalg + + +float_types = [np.float32, np.float64] +complex_types = [np.complex64, np.complex128] + + +def matmul_high_precision(a, b): + return jnp.matmul(a, b, precision=lax.Precision.HIGHEST) + + +@jit +def posify(matrix): + return matmul_high_precision(matrix, matrix.T.conj()) + + +def lax_cg(A, b, M=None, tol=0.0, atol=0.0, **kwargs): + A = partial(matmul_high_precision, A) + if M is not None: + M = partial(matmul_high_precision, M) + x, _ = jax.scipy.sparse.linalg.cg(A, b, tol=tol, atol=atol, M=M, **kwargs) + return x + + +def scipy_cg(A, b, tol=0.0, atol=0.0, **kwargs): + x, _ = scipy.sparse.linalg.cg(A, b, tol=tol, atol=atol, **kwargs) + return x + + +def rand_sym_pos_def(rng, shape, dtype): + matrix = np.eye(N=shape[0], dtype=dtype) + rng(shape, dtype) + return matrix @ matrix.T.conj() + + +class LaxBackedScipyTests(jtu.JaxTestCase): + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_shape={}_preconditioner={}".format( + jtu.format_shape_dtype_string(shape, dtype), + preconditioner), + "shape": shape, "dtype": dtype, "rng_factory": rng_factory, + "preconditioner": preconditioner} + for shape in [(4, 4), (7, 7), (32, 32)] + for dtype in float_types + complex_types + for rng_factory in [jtu.rand_default] + for rng_factory in [jtu.rand_default] + for preconditioner in [None, 'random', 'identity', 'exact'])) + def test_cg_against_scipy(self, shape, dtype, rng_factory, preconditioner): + + rng = rng_factory() + A = rand_sym_pos_def(rng, shape, dtype) + b = rng(shape[:1], dtype) + + if preconditioner == 'identity': + M = np.eye(shape[0], dtype=dtype) + elif preconditioner == 'random': + M = np.linalg.inv(rand_sym_pos_def(rng, shape, dtype)) + elif preconditioner == 'exact': + M = np.linalg.inv(A) + else: + M = None + + def args_maker(): + return A, b + + self._CheckAgainstNumpy( + partial(scipy_cg, M=M, maxiter=1), + partial(lax_cg, M=M, maxiter=1), + args_maker, + check_dtypes=True, + tol=3e-5) + + self._CheckAgainstNumpy( + partial(scipy_cg, M=M, maxiter=3), + partial(lax_cg, M=M, maxiter=3), + args_maker, + check_dtypes=True, + tol=1e-4) + + self._CheckAgainstNumpy( + np.linalg.solve, + partial(lax_cg, M=M, atol=1e-6), + args_maker, + check_dtypes=True, + tol=2e-4) + + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_shape={}".format(jtu.format_shape_dtype_string(shape, dtype)), + "shape": shape, "dtype": dtype, "rng_factory": rng_factory} + for shape in [(2, 2)] + for dtype in float_types + for rng_factory in [jtu.rand_default])) + def test_cg_as_solve(self, shape, dtype, rng_factory): + + rng = rng_factory() + a = rng(shape, dtype) + b = rng(shape[:1], dtype) + + expected = np.linalg.solve(posify(a), b) + actual = lax_cg(posify(a), b) + self.assertAllClose(expected, actual, check_dtypes=True) + + actual = jit(lax_cg)(posify(a), b) + self.assertAllClose(expected, actual, check_dtypes=True) + + # numerical gradients are only well defined if ``a`` is guaranteed to be + # positive definite. + jtu.check_grads( + lambda x, y: lax_cg(posify(x), y), + (a, b), order=2, rtol=1e-2) + + +if __name__ == "__main__": + absltest.main() From 3c9fb35f646dc72506f48578ae8a5ae7670796f5 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Fri, 3 Apr 2020 14:37:29 -0700 Subject: [PATCH 1021/1053] Fix dtype error --- jax/scipy/special.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/scipy/special.py b/jax/scipy/special.py index 47c388e7a328..1835115b4503 100644 --- a/jax/scipy/special.py +++ b/jax/scipy/special.py @@ -84,7 +84,8 @@ def erfinv(x): def logit(x): x = asarray(x) return lax.log(lax.div(x, lax.sub(lax._const(x, 1), x))) -logit.defjvps(lambda g, ans, x: g / (x * (1 - x))) +logit.defjvps( + lambda g, ans, x: lax.div(g, lax.mul(x, lax.sub(lax._const(x, 1), x)))) @api.custom_jvp From c2f56fbd6ecb6d91079f0a527c075938e87782cf Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Fri, 3 Apr 2020 16:21:38 -0700 Subject: [PATCH 1022/1053] add notes to changelog --- docs/CHANGELOG.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 047e224d53f0..0a20a799a439 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -12,6 +12,16 @@ These are the release notes for JAX. jax 0.1.63 (unreleased) --------------------------- +* Added ``jax.custom_jvp`` and ``jax.custom_vjp`` from `#2026 `_, see the `tutorial notebook `_. Deprecated ``jax.custom_transforms`` and removed it from the docs (though it still works). +* Add ``scipy.sparse.linalg.cg`` `#2566 `_. +* Changed how Tracers are printed to show more useful information for debugging `#2591 `_. +* Made ``jax.numpy.isclose`` handle ``nan`` and ``inf`` correctly `#2501 `_. +* Added several new rules for ``jax.experimental.jet`` `#2537 `_. +* Fixed ``jax.experimental.stax.BatchNorm`` when ``scale``/``center`` isn't provided. +* Fix some missing cases of broadcasting in ``jax.numpy.einsum`` `#2512 `_. +* Implement ``jax.numpy.cumsum`` and ``jax.numpy.cumprod`` in terms of a parallel prefix scan `#2596 `_ and make ``reduce_prod`` differentiable to arbitray order `#2597 `_. + + jaxlib 0.1.43 (March 31, 2020) ------------------------------ From 48eb5243668fb2591e0ccf05bcf2b7e814c9874b Mon Sep 17 00:00:00 2001 From: Adam Roberts Date: Fri, 3 Apr 2020 18:03:42 -0700 Subject: [PATCH 1023/1053] Fix error handling when an attempt is made to pmap a scalar. --- jax/interpreters/pxla.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jax/interpreters/pxla.py b/jax/interpreters/pxla.py index 1e8f5fe91e64..57800e49744e 100644 --- a/jax/interpreters/pxla.py +++ b/jax/interpreters/pxla.py @@ -124,6 +124,8 @@ def shard_aval(size, aval): shard_aval_handlers: Dict[Type[core.AbstractValue], Callable[[int, Any], Any]] = {} shard_aval_handlers[core.AbstractUnit] = lambda size, x: x def _shard_abstract_array(size, x): + if not x.shape: + raise ValueError("Scalar cannot be split across {} shards.".format(size)) if x.shape[0] != size: raise ValueError("Axis size {} does not match leading dimension of " "shape {}".format(size, x.shape)) From 1cf708ea77fae0fc1418e0b944f0115646f7f2ec Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sat, 4 Apr 2020 15:55:46 -0700 Subject: [PATCH 1024/1053] Support pytrees in jax.scipy.linalg.cg (#2600) * Support pytrees in jax.scipy.linalg.cg Ideally there would be an easier way to write this, but for now this will do. * Fixup test --- jax/scipy/sparse/linalg.py | 55 +++++++++++++++++++++------------- tests/lax_scipy_sparse_test.py | 24 +++++++++++++++ 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/jax/scipy/sparse/linalg.py b/jax/scipy/sparse/linalg.py index 16ef69440b0b..16bbcc6c5932 100644 --- a/jax/scipy/sparse/linalg.py +++ b/jax/scipy/sparse/linalg.py @@ -13,17 +13,26 @@ # limitations under the License. from functools import partial +import operator import textwrap import scipy.sparse.linalg -import jax.numpy as jnp import numpy as np -from jax.numpy.lax_numpy import _wraps -from jax import lax +import jax.numpy as jnp +from jax import lax, device_put +from jax.tree_util import tree_leaves, tree_map, tree_multimap +# aliases for working with pytrees def _vdot(x, y): - return jnp.vdot(x, y, precision=lax.Precision.HIGHEST) + f = partial(jnp.vdot, precision=lax.Precision.HIGHEST) + return sum(tree_leaves(tree_multimap(f, x, y))) + +def _mul(scalar, tree): + return tree_map(partial(operator.mul, scalar), tree) + +_add = partial(tree_multimap, operator.add) +_sub = partial(tree_multimap, operator.sub) def _identity(x): @@ -31,6 +40,7 @@ def _identity(x): def _cg_solve(A, b, x0=None, *, maxiter, tol=1e-5, atol=0.0, M=_identity): + # tolerance handling uses the "non-legacy" behavior of scipy.sparse.linalg.cg bs = _vdot(b, b) atol2 = jnp.maximum(tol ** 2 * bs, atol ** 2) @@ -46,15 +56,15 @@ def body_fun(value): x, r, gamma, p, k = value Ap = A(p) alpha = gamma / _vdot(p, Ap) - x_ = x + alpha * p - r_ = r - alpha * Ap + x_ = _add(x, _mul(alpha, p)) + r_ = _sub(r, _mul(alpha, Ap)) z_ = M(r_) gamma_ = _vdot(r_, z_) beta_ = gamma_ / gamma - p_ = z_ + beta_ * p + p_ = _add(z_, _mul(beta_, p)) return x_, r_, gamma_, p_, k + 1 - r0 = b - A(x0) + r0 = _sub(b, A(x0)) p0 = z0 = M(r0) gamma0 = _vdot(r0, z0) initial_value = (x0, r0, gamma0, p0, 0) @@ -77,14 +87,16 @@ def cg(A, b, x0=None, *, tol=1e-5, atol=0.0, maxiter=None, M=None): A : function Function that calculates the matrix-vector product ``Ax`` when called like ``A(x)``. ``A`` must represent a hermitian, positive definite - matrix. - b : array - Right hand side of the linear system. Has shape (N,). + matrix, and must return array(s) with the same structure and shape as its + argument. + b : array or tree of arrays + Right hand side of the linear system representing a single vector. Can be + stored as an array or Python container of array(s) with any shape. Returns ------- - x : array - The converged solution. + x : array or tree of arrays + The converged solution. Has the same structure as ``b``. info : None Placeholder for convergence information. In the future, JAX will report the number of iterations when convergence is not achieved, like SciPy. @@ -92,7 +104,7 @@ def cg(A, b, x0=None, *, tol=1e-5, atol=0.0, maxiter=None, M=None): Other Parameters ---------------- x0 : array - Starting guess for the solution. + Starting guess for the solution. Must have the same structure as ``b``. tol, atol : float, optional Tolerances for convergence, ``norm(residual) <= max(tol*norm(b), atol)``. We do not implement SciPy's "legacy" behavior, so JAX's tolerance will @@ -111,20 +123,21 @@ def cg(A, b, x0=None, *, tol=1e-5, atol=0.0, maxiter=None, M=None): scipy.sparse.linalg.cg """ if x0 is None: - x0 = jnp.zeros_like(b) + x0 = tree_map(jnp.zeros_like, b) + + b, x0 = device_put((b, x0)) if maxiter is None: - maxiter = 10 * len(b) # copied from scipy + size = sum(bi.size for bi in tree_leaves(b)) + maxiter = 10 * size # copied from scipy if M is None: M = _identity - if x0.shape != b.shape: - raise ValueError( - f'x0 and b must have matching shape: {x0.shape} vs {b.shape}') - if b.ndim != 1: + shape = partial(tree_map, lambda x: x.shape) + if shape(x0) != shape(b): raise ValueError( - f'b must be one-dimensional, but has shape {b.shape}') + f'x0 and b must have matching shape: {shape(x0)} vs {shape(b)}') cg_solve = partial( _cg_solve, x0=x0, tol=tol, atol=atol, maxiter=maxiter, M=M) diff --git a/tests/lax_scipy_sparse_test.py b/tests/lax_scipy_sparse_test.py index e51c16d36084..5c435585ad87 100644 --- a/tests/lax_scipy_sparse_test.py +++ b/tests/lax_scipy_sparse_test.py @@ -134,6 +134,30 @@ def test_cg_as_solve(self, shape, dtype, rng_factory): lambda x, y: lax_cg(posify(x), y), (a, b), order=2, rtol=1e-2) + def test_cg_ndarray(self): + A = lambda x: 2 * x + b = jnp.arange(9.0).reshape((3, 3)) + expected = b / 2 + actual, _ = jax.scipy.sparse.linalg.cg(A, b) + self.assertAllClose(expected, actual, check_dtypes=True) + + def test_cg_pytree(self): + A = lambda x: {"a": x["a"] + 0.5 * x["b"], "b": 0.5 * x["a"] + x["b"]} + b = {"a": 1.0, "b": -4.0} + expected = {"a": 4.0, "b": -6.0} + actual, _ = jax.scipy.sparse.linalg.cg(A, b) + self.assertEqual(expected.keys(), actual.keys()) + self.assertAlmostEqual(expected["a"], actual["a"]) + self.assertAlmostEqual(expected["b"], actual["b"]) + + def test_cg_errors(self): + A = lambda x: x + b = jnp.zeros((2, 1)) + x0 = jnp.zeros((2,)) + with self.assertRaisesRegexp( + ValueError, "x0 and b must have matching shape"): + jax.scipy.sparse.linalg.cg(A, b, x0) + if __name__ == "__main__": absltest.main() From 99944d12045a8e16b42003c3f08fc60e8f3e2ec8 Mon Sep 17 00:00:00 2001 From: Sharad Vikram Date: Sat, 4 Apr 2020 23:19:39 -0700 Subject: [PATCH 1025/1053] Fix lax.broadcast_shapes returning numpy ints in shape tuple (#2471) * Fix lax.broadcast_shapes returning numpy ints in shape tuple * Use _canonicalize_dimension and add test --- jax/lax/lax.py | 4 ++-- tests/lax_test.py | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 88b44ee28d8f..745102f362ac 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -34,7 +34,7 @@ from .. import dtypes from .. import lazy from ..config import flags -from ..core import Primitive +from ..core import _canonicalize_dimension, Primitive from ..abstract_arrays import (UnshapedArray, ShapedArray, ConcreteArray, AbstractToken, array_types, make_shaped_array, raise_to_shaped, abstract_token, canonicalize_shape) @@ -70,7 +70,7 @@ def broadcast_shapes(*shapes): if not onp.all((shapes == result_shape) | (shapes == 1)): raise ValueError("Incompatible shapes for broadcasting: {}" .format(tuple(map(tuple, shapes)))) - return tuple(result_shape) + return tuple(map(_canonicalize_dimension, result_shape)) def _identity(x): return x diff --git a/tests/lax_test.py b/tests/lax_test.py index 949602f70d01..1490aa0ec870 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -3127,6 +3127,11 @@ def testShapeUsesBuiltinInt(self): x = lax.iota(onp.int32, 3) + 1 self.assertIsInstance(x.shape[0], int) # not np.int64 + def testBroadcastShapesReturnsPythonInts(self): + shape1, shape2 = (1, 2, 3), (2, 3) + out_shape = lax.broadcast_shapes(shape1, shape2) + self.assertTrue(all(type(s) is int for s in out_shape)) + # TODO Concatenate # TODO Reverse # TODO DynamicSlice From 7a5d1bc0773d9326209832304285fa2b7db1bdfa Mon Sep 17 00:00:00 2001 From: George Necula Date: Sat, 28 Mar 2020 16:50:31 +0100 Subject: [PATCH 1026/1053] Expand docstring for vmap with details about out_axes, and improve error checking The newly added test cases used to raise the following kinds of exceptions: AttributeError: 'float' object has no attribute 'shape' ValueError: (0, None) ValueError: vmap got inconsistent sizes for array axes to be mapped: arg 0 has shape (2,) and axis None is to be mapped so TypeError: only integer scalar arrays can be converted to a scalar index. --- jax/api.py | 38 ++++++++++++++++++++++++++++++--- jax/interpreters/batching.py | 10 ++++++--- tests/api_test.py | 41 ++++++++++++++++++++++++++++-------- 3 files changed, 74 insertions(+), 15 deletions(-) diff --git a/jax/api.py b/jax/api.py index 93f200f6a589..94cc1083b7af 100644 --- a/jax/api.py +++ b/jax/api.py @@ -617,9 +617,15 @@ def vmap(fun: Callable, in_axes=0, out_axes=0) -> Callable: ``in_axes`` can itself be a matching container, so that distinct array axes can be mapped for different container elements. ``in_axes`` must be a container tree prefix of the positional argument tuple passed to ``fun``. + + At least one positional argument must have `in_axes` not None. The sizes + of the mapped input axes for all mapped positional arguments must all + be equal. + out_axes: A nonnegative integer, None, or (nested) standard Python container (tuple/list/dict) thereof indicating where the mapped axis should appear - in the output. + in the output. All outputs with a mapped axis must have a non-None + `out_axes` specification. Returns: Batched/vectorized version of ``fun`` with arguments that correspond to @@ -664,6 +670,23 @@ def vmap(fun: Callable, in_axes=0, out_axes=0) -> Callable: >>> vfoo = vmap(foo, in_axes=((0, (1, 2)),)) >>> print(vfoo(tree)).shape (6, 2, 5) + + The results of a vectorized function can be mapped or unmapped. + For example, the function below returns a pair with the first + element mapped and the second unmapped. Only for unmapped results + we can specify `out_axes` to be None (to keep it unmapped). + + >>> print(vmap(lambda x, y: (x + y, y * 2.), in_axes=(0, None), out_axes=(0, None))(np.arange(2.), 4.)) + ([4., 5.], 8.) + + If the `out_axes` is specified for an unmapped result, the result is broadcast + across the mapped axis: + + >>> print(vmap(lambda x, y: (x + y, y * 2.), in_axes=(0, None), out_axes=0)(np.arange(2.), 4.)) + ([4., 5.], [8., 8.]) + + If the `out_axes` is specified for a mapped result, the result is + transposed accordingly. """ _check_callable(fun) docstr = ("Vectorized version of {fun}. Takes similar arguments as {fun} " @@ -683,11 +706,20 @@ def vmap(fun: Callable, in_axes=0, out_axes=0) -> Callable: "or a (nested) tuple of those types, got {} and {} respectively.") raise TypeError(msg.format(type(in_axes), type(out_axes))) + def _get_axis_size(i:int, shape: Tuple[int, ...], axis: int): + try: + return shape[axis] + except (IndexError, TypeError) as e: + raise ValueError(f"vmap got arg {i} of rank {len(shape)} but axis to be mapped {axis}") from e + def _check_axis_sizes(tree, vals, dims): - mapped_axis_sizes = {x.shape[d] for x, d in zip(vals, dims) if d is not None} + mapped_axis_sizes = {_get_axis_size(i, onp.shape(x), d) for i, (x, d) in enumerate(zip(vals, dims)) + if d is not None} try: - sizes, = mapped_axis_sizes + size, = mapped_axis_sizes except ValueError as e: + if not mapped_axis_sizes: + raise ValueError("vmap must have at least one non-None in_axes") from e msg = "vmap got inconsistent sizes for array axes to be mapped:\n{}" # we switch the error message based on whether args is a tuple of arrays, # in which case we can produce an error message based on argument indices, diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index 1bb51e44cb0d..fba55a446a06 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -50,15 +50,19 @@ def batch_fun(fun : lu.WrappedFun, in_dims, out_dim_dests, sum_match=False): return _batch_fun(fun, sum_match, in_dims, out_dims, out_dim_dests) @lu.transformation -def _batch_fun(sum_match, in_dims, out_dims, out_dim_dests, *in_vals, **params): +def _batch_fun(sum_match, in_dims, out_dims_thunk, out_dim_dests, *in_vals, **params): in_dims = in_dims() if callable(in_dims) else in_dims size, = {x.shape[d] for x, d in zip(in_vals, in_dims) if d is not not_mapped} with new_master(BatchTrace) as master: out_vals = yield (master, in_dims,) + in_vals, params del master out_dim_dests = out_dim_dests() if callable(out_dim_dests) else out_dim_dests - out_vals = map(partial(matchaxis, size, sum_match=sum_match), - out_dims(), out_dim_dests, out_vals) + out_dims = out_dims_thunk() + for od, od_dest in zip(out_dims, out_dim_dests): + if od is not None and not isinstance(od_dest, int) and not od_dest is last: + msg = f"vmap has mapped output but out_axes is {od_dest}" + raise ValueError(msg) + out_vals = map(partial(matchaxis, size, sum_match=sum_match), out_dims, out_dim_dests, out_vals) yield out_vals def batch_fun2(fun : lu.WrappedFun, in_dims): diff --git a/tests/api_test.py b/tests/api_test.py index dd4a59141063..6f751989b629 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1012,17 +1012,17 @@ def h(a, b): X = onp.random.randn(10, 4) U = onp.random.randn(10, 2) - self.assertRaisesRegex( + with self.assertRaisesRegexp( ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" r"arg 0 has shape \(10, 4\) and axis 0 is to be mapped" "\n" r"arg 1 has shape \(10, 2\) and axis 1 is to be mapped" "\n" "so\n" "arg 0 has an axis to be mapped of size 10\n" - "arg 1 has an axis to be mapped of size 2", - lambda: api.vmap(h, in_axes=(0, 1))(X, U)) + "arg 1 has an axis to be mapped of size 2"): + api.vmap(h, in_axes=(0, 1))(X, U) - self.assertRaisesRegex( + with self.assertRaisesRegexp( ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" r"arg 0 has shape \(10, 4\) and axis 0 is to be mapped" "\n" @@ -1030,15 +1030,38 @@ def h(a, b): r"arg 2 has shape \(10, 4\) and axis 0 is to be mapped" "\n" "so\n" "args 0, 2 have axes to be mapped of size 10\n" - "arg 1 has an axis to be mapped of size 2", - lambda: api.vmap(lambda x, y, z: None, in_axes=(0, 1, 0))(X, U, X)) + "arg 1 has an axis to be mapped of size 2"): + api.vmap(lambda x, y, z: None, in_axes=(0, 1, 0))(X, U, X) - self.assertRaisesRegex( + with self.assertRaisesRegexp( ValueError, "vmap got inconsistent sizes for array axes to be mapped:\n" "the tree of axis sizes is:\n" - r"\(10, \[2, 2\]\)", - lambda: api.vmap(h, in_axes=(0, 1))(X, [U, U])) + r"\(10, \[2, 2\]\)"): + api.vmap(h, in_axes=(0, 1))(X, [U, U]) + + with self.assertRaisesRegex(ValueError, "vmap got arg 0 of rank 0 but axis to be mapped 0"): + # The mapped inputs cannot be scalars + api.vmap(lambda x: x)(1.) + + with self.assertRaisesRegexp(ValueError, re.escape("vmap got arg 0 of rank 1 but axis to be mapped [1. 2.]")): + api.vmap(lambda x: x, in_axes=(np.array([1., 2.]),))(np.array([1., 2.])) + + with self.assertRaisesRegex(ValueError, "vmap must have at least one non-None in_axes"): + # If the output is mapped, there must be a non-None in_axes + api.vmap(lambda x: x, in_axes=None)(np.array([1., 2.])) + + with self.assertRaisesRegexp(ValueError, "vmap got arg 0 of rank 1 but axis to be mapped 1"): + api.vmap(lambda x: x, in_axes=1)(np.array([1., 2.])) + + # Error is: TypeError: only integer scalar arrays can be converted to a scalar index + with self.assertRaisesRegexp(ValueError, "axes specification must be a tree prefix of the corresponding value"): + api.vmap(lambda x: x, in_axes=0, out_axes=(2, 3))(np.array([1., 2.])) + + with self.assertRaisesRegexp(ValueError, "vmap has mapped output but out_axes is None"): + # If the output is mapped, then there must be some out_axes specified + api.vmap(lambda x: x, out_axes=None)(np.array([1., 2.])) + def test_vmap_structured_in_axes(self): From f5f35c5c3b9087aa4f122d934437c7f0ff36ba76 Mon Sep 17 00:00:00 2001 From: George Necula Date: Thu, 2 Apr 2020 14:44:36 +0200 Subject: [PATCH 1027/1053] Adapted vmap out_axes check to sum_match --- jax/interpreters/batching.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/batching.py b/jax/interpreters/batching.py index fba55a446a06..553e03329923 100644 --- a/jax/interpreters/batching.py +++ b/jax/interpreters/batching.py @@ -59,7 +59,7 @@ def _batch_fun(sum_match, in_dims, out_dims_thunk, out_dim_dests, *in_vals, **pa out_dim_dests = out_dim_dests() if callable(out_dim_dests) else out_dim_dests out_dims = out_dims_thunk() for od, od_dest in zip(out_dims, out_dim_dests): - if od is not None and not isinstance(od_dest, int) and not od_dest is last: + if od is not None and not isinstance(od_dest, int) and not od_dest is last and not sum_match: msg = f"vmap has mapped output but out_axes is {od_dest}" raise ValueError(msg) out_vals = map(partial(matchaxis, size, sum_match=sum_match), out_dims, out_dim_dests, out_vals) From 329321b0f1d95d386d97bf706e0507cd1e7b23ee Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 6 Apr 2020 11:22:01 -0400 Subject: [PATCH 1028/1053] Add backend-specific lowering for cumsum/cumprod on TPU. (#2614) * Add backend-specific lowering for cumsum/cumprod on TPU. Make cumsum/cumprod primitives so they can have backend-specific lowerings. * Disable cumulative reduction gradient test on TPU. --- jax/interpreters/xla.py | 21 ++++++-- jax/lax/lax.py | 114 ++++++++++++++++++++++++++++++++++++++++ jax/numpy/lax_numpy.py | 72 +++---------------------- tests/lax_numpy_test.py | 3 -- tests/lax_test.py | 66 +++++++++++++++++++++++ 5 files changed, 205 insertions(+), 71 deletions(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 0171677e0727..6c9680063fb2 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -646,7 +646,13 @@ def add_jaxvals_translation_rule(c, x, y): return c.Add(x, y) translations[ad_util.add_jaxvals_p] = add_jaxvals_translation_rule -def lower_fun(fun): +@lu.transformation +def _tuple_output(*args, **kwargs): + ans = yield args, kwargs + yield (ans,) + + +def lower_fun(fun, multiple_results=True): # This function can only be used to lower functions that take JAX array types # as arguments (and e.g. don't accept unit values), because it assumes it can # map from XLA types to JAX types. In general that mapping is not possible (as @@ -658,11 +664,18 @@ def f(c, *xla_args, **params): # TODO(mattjj): revise this 'calling convention' avals = [_array_aval_from_xla_shape(c.GetShape(x)) for x in xla_args] pvals = [pe.PartialVal((a, core.unit)) for a in avals] - jaxpr, _, consts = pe.trace_to_jaxpr( - lu.wrap_init(fun, params), pvals, instantiate=True, stage_out=True) + wrapped_fun = lu.wrap_init(fun, params) + if not multiple_results: + wrapped_fun = _tuple_output(wrapped_fun) + jaxpr, _, consts = pe.trace_to_jaxpr(wrapped_fun, pvals, instantiate=True, + stage_out=True) consts = _map(c.Constant, consts) outs = jaxpr_subcomp(c, jaxpr, None, AxisEnv(1), consts, '', *xla_args) - return c.Tuple(*outs) + if multiple_results: + return c.Tuple(*outs) + else: + assert len(outs) == 1, outs + return outs[0] return f def _array_aval_from_xla_shape(xla_shape): diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 745102f362ac..ca28b8aad499 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -1016,6 +1016,14 @@ def _select_and_gather_add(tangents, operand, select_prim, window_dimensions, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) +def cumsum(operand, axis: int): + """Computes a cumulative sum along `axis`.""" + return cumsum_p.bind(operand, axis=int(axis)) + +def cumprod(operand, axis: int): + """Computes a cumulative product along `axis`.""" + return cumprod_p.bind(operand, axis=int(axis)) + def sort(operand, dimension=-1): """Wraps XLA's `Sort `_ @@ -4041,6 +4049,112 @@ def _select_and_gather_add_batching_rule( max_bits=32) +# Parallel prefix-scan. See: +# https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda +# and +# Blelloch, Guy E. 1990. "Prefix Sums and Their Applications.", Technical Report +# CMU-CS-90-190, School of Computer Science, Carnegie Mellon University. +# +# Unlike the Blelloch algorithm, we use an out-of-place algorithm that uses 2n +# space. This is somewhat wasteful if we are interested only in the output of +# the forward pass, but more memory-efficient if we intend to differentiate +# through the implementation of the scan. +def _prescan_power_of_two(x, axis: int, op: Callable, unit): + n = x.shape[axis] + assert n != 0 and n & (n - 1) == 0, "n must be a power of 2" + + # Upsweep + xs = [] + for d in range(0, n.bit_length() - 1): + x1 = slice_in_dim(x, 0, None, stride=2, axis=axis) + xs.append(x1) + x2 = slice_in_dim(x, 1, None, stride=2, axis=axis) + x = op(x1, x2) + total = x + + # Downsweep + x = full_like(total, unit) + pad_left = [(0, 0, 0)] * len(x.shape) + pad_left[axis] = (1, 0, 1) + pad_right = [(0, 0, 0)] * len(x.shape) + pad_right[axis] = (0, 1, 1) + for w in reversed(xs): + x1 = pad(x, _const(x, 0), pad_right) + x2 = pad(x, _const(x, 0), pad_left) + w = pad(w, _const(x, 0), pad_left) + x = x1 + op(x2, w) + + return x, total + + +def _parallel_prefix_scan(x, axis: int, op: Callable, unit): + n = x.shape[axis] + if n == 0: + return x + # Pads to the next largest power of two + nbits = n.bit_length() + if n == (1 << (nbits - 1)): + nbits -= 1 + padding = [(0, 0, 0)] * len(x.shape) + padding[axis] = (0, (1 << nbits) - n, 0) + x = pad(x, _const(x, unit), padding) + x, total = _prescan_power_of_two(x, axis, op, unit) + return concatenate((slice_in_dim(x, 1, n, axis=axis), total), dimension=axis) + +def _cumred_shape_rule(x, axis): + if axis < 0 or axis >= x.ndim: + raise ValueError( + "axis {} is out of bounds for array of shape {}".format(axis, x.shape)) + return x.shape + + +def _cumred_jvp_rule(impl: Callable, primals, tangents, axis: int): + return api.jvp(partial(impl, axis=axis), primals, tangents) + + +def _cumred_tpu_translation_rule(window_reduce: Callable, unit, x, axis: int): + # On TPU, an implementation using reduce_window is handled specially by the + # compiler. However, irrespective of backend, we always use the parallel + # prefix scan implementation when differentiating because reduce_window is not + # arbitrarily differentiable. + n = x.shape[axis] + padding = [(0, 0, 0)] * x.ndim + padding[axis] = (n - 1, 0, 0) + x = pad(x, _const(x, unit), padding) + strides = [1] * x.ndim + window_dims = [1] * x.ndim + window_dims[axis] = n + return window_reduce(x, window_dims, strides, xla_client.PaddingType.VALID) + +def _cumred_batch_rule(prim, batched_args, batch_dims, axis: int): + operand, = batched_args + bdim, = batch_dims + axis = axis if axis < bdim else axis + 1 + return prim.bind(operand, axis=axis), bdim + + +_cumsum_impl = partial(_parallel_prefix_scan, op=add, unit=0) + +cumsum_p = standard_primitive( + _cumred_shape_rule, partial(_reduce_number_dtype_rule, "cumsum"), + 'cumsum', xla.lower_fun(_cumsum_impl, multiple_results=False)) +ad.primitive_jvps[cumsum_p] = partial(_cumred_jvp_rule, _cumsum_impl) +xla.backend_specific_translations['tpu'][cumsum_p] = xla.lower_fun( + partial(_cumred_tpu_translation_rule, _reduce_window_sum, 0), + multiple_results=False) +batching.primitive_batchers[cumsum_p] = partial(_cumred_batch_rule, cumsum_p) + +_cumprod_impl= partial(_parallel_prefix_scan, op=mul, unit=1) + +cumprod_p = standard_primitive( + _cumred_shape_rule, partial(_reduce_number_dtype_rule, "cumprod"), + 'cumprod', xla.lower_fun(_cumprod_impl, multiple_results=False)) +ad.primitive_jvps[cumprod_p] = partial(_cumred_jvp_rule, _cumprod_impl) +xla.backend_specific_translations['tpu'][cumprod_p] = xla.lower_fun( + partial(_cumred_tpu_translation_rule, _reduce_window_prod, 1), + multiple_results=False) +batching.primitive_batchers[cumprod_p] = partial(_cumred_batch_rule, cumprod_p) + sort_shape = lambda operand, dimension: operand.shape def _sort_jvp_rule(g, operand, dimension): diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 036f2e5a4697..869cf797ca69 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -1571,59 +1571,7 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=False): return td -# Parallel prefix-scan. See: -# https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda -# and -# Blelloch, Guy E. 1990. "Prefix Sums and Their Applications.", Technical Report -# CMU-CS-90-190, School of Computer Science, Carnegie Mellon University. -# -# Unlike the Blelloch algorithm, we use an out-of-place algorithm that uses 2n -# space. This is somewhat wasteful if we are interested only in the output of -# the forward pass, but more memory-efficient if we intend to differentiate -# through the implementation of the scan. -def _prescan_power_of_two(x, axis: int, op: Callable, unit): - n = x.shape[axis] - assert n != 0 and n & (n - 1) == 0, "n must be a power of 2" - - # Upsweep - xs = [] - for d in range(0, n.bit_length() - 1): - x1 = lax.slice_in_dim(x, 0, None, stride=2, axis=axis) - xs.append(x1) - x2 = lax.slice_in_dim(x, 1, None, stride=2, axis=axis) - x = op(x1, x2) - total = x - - # Downsweep - x = full_like(total, unit) - pad_left = [(0, 0, 0)] * len(x.shape) - pad_left[axis] = (1, 0, 1) - pad_right = [(0, 0, 0)] * len(x.shape) - pad_right[axis] = (0, 1, 1) - for w in reversed(xs): - x1 = lax.pad(x, x.dtype.type(0), pad_right) - x2 = lax.pad(x, x.dtype.type(0), pad_left) - w = lax.pad(w, x.dtype.type(0), pad_left) - x = x1 + op(x2, w) - - return x, total - -def _parallel_prefix_scan(x, axis: int, op: Callable, unit): - n = x.shape[axis] - - # Pads to the next largest power of two - nbits = n.bit_length() - if n == (1 << (nbits - 1)): - nbits -= 1 - padding = [(0, 0, 0)] * len(x.shape) - padding[axis] = (0, (1 << nbits) - n, 0) - x = lax.pad(x, x.dtype.type(unit), padding) - x, product = _prescan_power_of_two(x, axis, op, unit) - return concatenate((lax.slice_in_dim(x, 1, n, axis=axis), product), axis=axis) - - -def _make_cumulative_reduction(onp_reduction, op, unit, - squash_nan=False): +def _make_cumulative_reduction(onp_reduction, reduction, squash_nan=False): # We want to allow XLA to fuse the pad and reduce-window operators to # avoid materializing the padded output. # Consider removing `jit` once again if reduce-window is generalized to @@ -1652,9 +1600,7 @@ def _cumulative_reduction(a, axis, dtype): if dtype: a = lax.convert_element_type(a, dtype) - if a_shape[axis] == 0: - return a - return _parallel_prefix_scan(a, axis, op, unit) + return reduction(a, axis) @_wraps(onp_reduction) def cumulative_reduction(a, axis=None, dtype=None): @@ -1663,15 +1609,13 @@ def cumulative_reduction(a, axis=None, dtype=None): return cumulative_reduction -cumsum = _make_cumulative_reduction( - onp.cumsum, add, 0, squash_nan=False) -cumprod = _make_cumulative_reduction( - onp.cumprod, multiply, 1, squash_nan=False) +cumsum = _make_cumulative_reduction(onp.cumsum, lax.cumsum, squash_nan=False) +cumprod = _make_cumulative_reduction(onp.cumprod, lax.cumprod, squash_nan=False) cumproduct = cumprod -nancumsum = _make_cumulative_reduction( - onp.nancumsum, add, 0, squash_nan=True) -nancumprod = _make_cumulative_reduction( - onp.nancumprod, multiply, 1, squash_nan=True) +nancumsum = _make_cumulative_reduction(onp.nancumsum, lax.cumsum, + squash_nan=True) +nancumprod = _make_cumulative_reduction(onp.nancumprod, lax.cumprod, + squash_nan=True) ### Array-creation functions diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index a5310517084a..0e0d12ea0788 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -1125,9 +1125,6 @@ def testCumSumProd(self, axis, shape, dtype, out_dtype, onp_op, jnp_op, rng_fact self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=True, tol=tol) self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True) - grad_dtypes = [onp.float32, onp.float64, onp.complex64, onp.complex128] - if dtype in grad_dtypes and out_dtype in grad_dtypes: - check_grads(jnp_fun, args_maker(), order=2, rtol=1e-2) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_dtype={}_m={}_n={}_k={}".format( diff --git a/tests/lax_test.py b/tests/lax_test.py index 1490aa0ec870..04495fea021d 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -1269,6 +1269,29 @@ def fun(operand): self._CompileAndCheck(fun, args_maker, check_dtypes=True) # pylint: enable=cell-var-from-loop + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_op={}_shape={}_axis={}" + .format(op.__name__, jtu.format_shape_dtype_string(shape, dtype), axis), + "op": op, "onp_op": onp_op, "shape": shape, "dtype": dtype, + "axis": axis, "rng_factory": rng_factory} + for op, onp_op, types in [ + (lax.cumsum, onp.cumsum, default_dtypes), + (lax.cumprod, onp.cumprod, default_dtypes), + ] + for dtype in types + for shape in [[10], [3, 4, 5]] + for axis in range(len(shape)) + for rng_factory in [ + jtu.rand_default if dtypes.issubdtype(dtype, onp.integer) + else jtu.rand_small])) + def testCumulativeReduce(self, op, onp_op, shape, dtype, axis, rng_factory): + rng = rng_factory() + fun = partial(op, axis=axis) + onp_fun = partial(onp_op, axis=axis) + args_maker = lambda: [rng(shape, dtype)] + self._CompileAndCheck(fun, args_maker, check_dtypes=True) + self._CheckAgainstNumpy(fun, onp_fun, args_maker) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}".format( jtu.format_shape_dtype_string(shape, dtype), axis), @@ -2385,6 +2408,27 @@ def fun(operand): check_grads(fun, (operand,), gradient_order, ["fwd", "rev"], tol, tol, eps) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_op={}_shape={}_axis={}" + .format(op.__name__, jtu.format_shape_dtype_string(shape, dtype), axis), + "op": op, "shape": shape, "dtype": dtype, + "axis": axis, "rng_factory": rng_factory} + for op, types in [ + (lax.cumsum, [onp.float32, onp.float64]), + (lax.cumprod, [onp.float32, onp.float64]), + ] + for dtype in types + for shape in [[10], [3, 4, 5]] + for axis in range(len(shape)) + for rng_factory in [ + jtu.rand_default if dtypes.issubdtype(dtype, onp.integer) + else jtu.rand_small])) + @jtu.skip_on_devices("tpu") # TODO(b/153183305): wrong outputs + def testCumulativeReduceGrad(self, op, shape, dtype, axis, rng_factory): + rng = rng_factory() + check_grads(partial(op, axis=axis), (rng(shape, dtype),), order=2) + + # TODO(b/205052657): enable more tests when supported @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}_axis={}".format( @@ -3025,6 +3069,28 @@ def fun(operand): for bdims in all_bdims(shape): self._CheckBatching(fun, 3, bdims, (shape,), (dtype,), rng) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": "_op={}_shape={}_axis={}_bdims={}" + .format(op.__name__, jtu.format_shape_dtype_string(shape, dtype), axis, + bdims), + "op": op, "shape": shape, "dtype": dtype, "bdims": bdims, + "axis": axis, "rng_factory": rng_factory} + for op, types in [ + (lax.cumsum, [onp.float32, onp.float64]), + (lax.cumprod, [onp.float32, onp.float64]), + ] + for dtype in types + for shape in [[10], [3, 4, 5]] + for axis in range(len(shape)) + for bdims in all_bdims(shape) + for rng_factory in [ + jtu.rand_default if dtypes.issubdtype(dtype, onp.integer) + else jtu.rand_small])) + def testCumulativeReduce(self, op, shape, dtype, axis, bdims, rng_factory): + rng = rng_factory() + self._CheckBatching(partial(op, axis=axis), 7, bdims, (shape,), (dtype,), + rng) + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_dtype={}_padding={}".format(onp.dtype(dtype).name, padding), From 36c529d4e33eb811b296a8104d6ffeceb875ff09 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 6 Apr 2020 12:33:55 -0400 Subject: [PATCH 1029/1053] Handle n==0 case in TPU cumsum/cumprod. (#2617) --- jax/lax/lax.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index ca28b8aad499..b276e3773d33 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4118,6 +4118,8 @@ def _cumred_tpu_translation_rule(window_reduce: Callable, unit, x, axis: int): # prefix scan implementation when differentiating because reduce_window is not # arbitrarily differentiable. n = x.shape[axis] + if n == 0: + return x padding = [(0, 0, 0)] * x.ndim padding[axis] = (n - 1, 0, 0) x = pad(x, _const(x, unit), padding) From 7629c5aab49fa51df0f35510be4ca40ed53a21fb Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 6 Apr 2020 12:39:28 -0400 Subject: [PATCH 1030/1053] Add some missing functions to documents. (#2615) --- docs/jax.nn.rst | 1 + docs/jax.numpy.rst | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/jax.nn.rst b/docs/jax.nn.rst index 2f024e6617ac..924f6f951b39 100644 --- a/docs/jax.nn.rst +++ b/docs/jax.nn.rst @@ -41,3 +41,4 @@ Other functions softmax log_softmax normalize + one_hot diff --git a/docs/jax.numpy.rst b/docs/jax.numpy.rst index ba005e0d793e..2fdb10a163d3 100644 --- a/docs/jax.numpy.rst +++ b/docs/jax.numpy.rst @@ -115,6 +115,7 @@ Not every function in NumPy is implemented; contributions are welcome! floor floor_divide fmod + frexp full full_like gcd @@ -145,6 +146,7 @@ Not every function in NumPy is implemented; contributions are welcome! kaiser kron lcm + ldexp left_shift less less_equal From fc23e071bcb73d2181c890d240f94cdcec47a058 Mon Sep 17 00:00:00 2001 From: Igor Babuschkin Date: Mon, 6 Apr 2020 19:48:42 +0100 Subject: [PATCH 1031/1053] Also enable nan checking for complex numbers (#2616) --- jax/interpreters/xla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax/interpreters/xla.py b/jax/interpreters/xla.py index 6c9680063fb2..b1cd5ac9b234 100644 --- a/jax/interpreters/xla.py +++ b/jax/interpreters/xla.py @@ -279,7 +279,7 @@ def check_nans(prim, bufs): def _check_nans(name, xla_shape, buf): assert not xla_shape.is_tuple() - if dtypes.issubdtype(xla_shape.element_type(), onp.floating): + if dtypes.issubdtype(xla_shape.element_type(), onp.inexact): if onp.any(onp.isnan(buf.to_py())): msg = "invalid value (nan) encountered in {}" raise FloatingPointError(msg.format(name)) From cf4dd84b1452a089a85497fe66915dfda27508f3 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 6 Apr 2020 15:14:22 -0400 Subject: [PATCH 1032/1053] cumsum is linear, so its gradient can be linear also. (#2618) * cumsum is linear, so its gradient can be linear also. * Rename _impl functions to _prefix_scan. --- jax/lax/lax.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index b276e3773d33..00e3969dee5b 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -4101,22 +4101,28 @@ def _parallel_prefix_scan(x, axis: int, op: Callable, unit): x, total = _prescan_power_of_two(x, axis, op, unit) return concatenate((slice_in_dim(x, 1, n, axis=axis), total), dimension=axis) +_cumsum_prefix_scan = partial(_parallel_prefix_scan, op=add, unit=0) +_cumprod_prefix_scan = partial(_parallel_prefix_scan, op=mul, unit=1) + def _cumred_shape_rule(x, axis): if axis < 0 or axis >= x.ndim: raise ValueError( "axis {} is out of bounds for array of shape {}".format(axis, x.shape)) return x.shape +def _cumsum_transpose_rule(t, axis: int): + return [rev(cumsum(rev(t, (axis,)), axis=axis), (axis,))] -def _cumred_jvp_rule(impl: Callable, primals, tangents, axis: int): - return api.jvp(partial(impl, axis=axis), primals, tangents) +def _cumprod_jvp_rule(primals, tangents, axis: int): + # Irrespective of backend, we always use the parallel prefix scan + # implementation when differentiating because reduce_window is not + # arbitrarily differentiable. + return api.jvp(partial(_cumprod_prefix_scan, axis=axis), primals, tangents) def _cumred_tpu_translation_rule(window_reduce: Callable, unit, x, axis: int): # On TPU, an implementation using reduce_window is handled specially by the - # compiler. However, irrespective of backend, we always use the parallel - # prefix scan implementation when differentiating because reduce_window is not - # arbitrarily differentiable. + # compiler and is efficient. On other backends, it is O(n^2). n = x.shape[axis] if n == 0: return x @@ -4135,23 +4141,20 @@ def _cumred_batch_rule(prim, batched_args, batch_dims, axis: int): return prim.bind(operand, axis=axis), bdim -_cumsum_impl = partial(_parallel_prefix_scan, op=add, unit=0) - cumsum_p = standard_primitive( _cumred_shape_rule, partial(_reduce_number_dtype_rule, "cumsum"), - 'cumsum', xla.lower_fun(_cumsum_impl, multiple_results=False)) -ad.primitive_jvps[cumsum_p] = partial(_cumred_jvp_rule, _cumsum_impl) + 'cumsum', xla.lower_fun(_cumsum_prefix_scan, multiple_results=False)) +ad.deflinear(cumsum_p, _cumsum_transpose_rule) xla.backend_specific_translations['tpu'][cumsum_p] = xla.lower_fun( partial(_cumred_tpu_translation_rule, _reduce_window_sum, 0), multiple_results=False) batching.primitive_batchers[cumsum_p] = partial(_cumred_batch_rule, cumsum_p) -_cumprod_impl= partial(_parallel_prefix_scan, op=mul, unit=1) cumprod_p = standard_primitive( _cumred_shape_rule, partial(_reduce_number_dtype_rule, "cumprod"), - 'cumprod', xla.lower_fun(_cumprod_impl, multiple_results=False)) -ad.primitive_jvps[cumprod_p] = partial(_cumred_jvp_rule, _cumprod_impl) + 'cumprod', xla.lower_fun(_cumprod_prefix_scan, multiple_results=False)) +ad.primitive_jvps[cumprod_p] = _cumprod_jvp_rule xla.backend_specific_translations['tpu'][cumprod_p] = xla.lower_fun( partial(_cumred_tpu_translation_rule, _reduce_window_prod, 1), multiple_results=False) From 1472eb3adec030b0499a3d3d6c3bbaab67fdb3da Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 6 Apr 2020 12:49:11 -0700 Subject: [PATCH 1033/1053] DOC: note how derivatives are computed for CG (#2619) --- jax/scipy/sparse/linalg.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jax/scipy/sparse/linalg.py b/jax/scipy/sparse/linalg.py index 16bbcc6c5932..729224e42eef 100644 --- a/jax/scipy/sparse/linalg.py +++ b/jax/scipy/sparse/linalg.py @@ -82,6 +82,10 @@ def cg(A, b, x0=None, *, tol=1e-5, atol=0.0, maxiter=None, M=None): need to supply the linear operator ``A`` as a function instead of a sparse matrix or ``LinearOperator``. + Derivatives of ``cg`` are implemented via implicit differentiation with + another ``cg`` solve, rather than by differentiating _through_ the solver. + They will be accurate only if both solves converge. + Parameters ---------- A : function @@ -121,6 +125,7 @@ def cg(A, b, x0=None, *, tol=1e-5, atol=0.0, maxiter=None, M=None): See also -------- scipy.sparse.linalg.cg + jax.lax.custom_linear_solve """ if x0 is None: x0 = tree_map(jnp.zeros_like, b) From e8f989e38f03602d781c045d7133b1f88a2d7b0f Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Mon, 6 Apr 2020 14:45:02 -0700 Subject: [PATCH 1034/1053] Add import from scipy.sparse (#2621) * Add import from scipy.sparse * Fix formatting in cg docstring --- jax/scipy/__init__.py | 1 + jax/scipy/sparse/linalg.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/jax/scipy/__init__.py b/jax/scipy/__init__.py index 574f4e00a9f8..df7d83c7d8f3 100644 --- a/jax/scipy/__init__.py +++ b/jax/scipy/__init__.py @@ -14,5 +14,6 @@ from . import linalg from . import ndimage +from . import sparse from . import special from . import stats diff --git a/jax/scipy/sparse/linalg.py b/jax/scipy/sparse/linalg.py index 729224e42eef..0013ad7736b5 100644 --- a/jax/scipy/sparse/linalg.py +++ b/jax/scipy/sparse/linalg.py @@ -83,7 +83,7 @@ def cg(A, b, x0=None, *, tol=1e-5, atol=0.0, maxiter=None, M=None): matrix or ``LinearOperator``. Derivatives of ``cg`` are implemented via implicit differentiation with - another ``cg`` solve, rather than by differentiating _through_ the solver. + another ``cg`` solve, rather than by differentiating *through* the solver. They will be accurate only if both solves converge. Parameters From 3fe8bd027cbbd79c7374f310f67f55336403814b Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Mon, 6 Apr 2020 16:38:34 -0700 Subject: [PATCH 1035/1053] Adjust pmap_bechmark.py values to be more realistic. (#2622) --- benchmarks/pmap_benchmark.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmarks/pmap_benchmark.py b/benchmarks/pmap_benchmark.py index 137a882836cc..fb2dca27c5ca 100644 --- a/benchmarks/pmap_benchmark.py +++ b/benchmarks/pmap_benchmark.py @@ -50,12 +50,12 @@ def benchmark_fn(): return benchmark_fn params = [] - for nargs in (10, 100, 101, 500): - nshards = min(4, jax.local_device_count()) + for nargs in (10, 100, 101, 500, 1000, 5000): + nshards = min(8, jax.local_device_count()) params.append({"nargs": nargs, "nshards": nshards}) for nshards in (2, 4, 8, 100, 500): if nshards > jax.local_device_count(): continue - params.append({"nargs": 10, "nshards": nshards}) + params.append({"nargs": 100, "nshards": nshards}) benchmark.benchmark_suite(get_benchmark_fn, params, "pmap_shard_args") @@ -75,12 +75,12 @@ def benchmark_fn(): return benchmark_fn params = [] - for nouts in (10, 100, 500): - nshards = min(4, jax.local_device_count()) + for nouts in (10, 100, 500, 1000, 5000): + nshards = min(8, jax.local_device_count()) params.append({"nouts": nouts, "nshards": nshards}) for nshards in (2, 4, 8, 100, 500): if nshards > jax.local_device_count(): continue - params.append({"nouts": 10, "nshards": nshards}) + params.append({"nouts": 100, "nshards": nshards}) benchmark.benchmark_suite(get_benchmark_fn, params, "pmap_shard_outputs") From 6213f8b81e56b101383c34a1fb36b7642eb5107c Mon Sep 17 00:00:00 2001 From: Jin Dong Date: Mon, 6 Apr 2020 20:26:51 -0400 Subject: [PATCH 1036/1053] Remove unnecessary code in colabs (#2623) * fix misspell in autodiff_cookbook[modify colab directly] * remove unnecessary from __future__ code[modify colab directly] * change tf&tfds-nightly to stable version --- .../Neural_Network_and_Data_Loading.ipynb | 1 - docs/notebooks/autodiff_cookbook.ipynb | 4 ++-- .../neural_network_with_tfds_data.ipynb | 16 ---------------- docs/notebooks/vmapped_log_probs.ipynb | 4 ---- 4 files changed, 2 insertions(+), 23 deletions(-) diff --git a/docs/notebooks/Neural_Network_and_Data_Loading.ipynb b/docs/notebooks/Neural_Network_and_Data_Loading.ipynb index 6dffc931d240..9fe5bcc41968 100644 --- a/docs/notebooks/Neural_Network_and_Data_Loading.ipynb +++ b/docs/notebooks/Neural_Network_and_Data_Loading.ipynb @@ -61,7 +61,6 @@ "colab": {} }, "source": [ - "from __future__ import print_function, division, absolute_import\n", "import jax.numpy as np\n", "from jax import grad, jit, vmap\n", "from jax import random" diff --git a/docs/notebooks/autodiff_cookbook.ipynb b/docs/notebooks/autodiff_cookbook.ipynb index 1cfc92290eb2..1782cf6d3107 100644 --- a/docs/notebooks/autodiff_cookbook.ipynb +++ b/docs/notebooks/autodiff_cookbook.ipynb @@ -679,7 +679,7 @@ "\n", "and so on.\n", "\n", - "To implement `hessian`, we could have used `jacrev(jacrev(f))` or `jacrev(jacfwd(f))` or any other composition of the two. But forward-over-reverse is typically the most efficient. That's because in the inner Jacobian computation we're often differentiating a function wide Jacobian (maybe like a loss function $f : \\mathbb{R}^n \\to \\mathbb{R}$), while in the outer Jacobian computation we're differentiating a function with a square Jacobian (since $\\nabla f : \\mathbb{R}^n \\to \\mathbb{R}^n$), which is where forward-mode wins out." + "To implement `hessian`, we could have used `jacfwd(jacrev(f))` or `jacrev(jacfwd(f))` or any other composition of the two. But forward-over-reverse is typically the most efficient. That's because in the inner Jacobian computation we're often differentiating a function wide Jacobian (maybe like a loss function $f : \\mathbb{R}^n \\to \\mathbb{R}$), while in the outer Jacobian computation we're differentiating a function with a square Jacobian (since $\\nabla f : \\mathbb{R}^n \\to \\mathbb{R}^n$), which is where forward-mode wins out." ] }, { @@ -1545,4 +1545,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} +} \ No newline at end of file diff --git a/docs/notebooks/neural_network_with_tfds_data.ipynb b/docs/notebooks/neural_network_with_tfds_data.ipynb index 57b0dd7c65a2..fc31d7456bd0 100644 --- a/docs/notebooks/neural_network_with_tfds_data.ipynb +++ b/docs/notebooks/neural_network_with_tfds_data.ipynb @@ -87,7 +87,6 @@ "colab": {} }, "source": [ - "from __future__ import print_function, division, absolute_import\n", "import jax.numpy as np\n", "from jax import grad, jit, vmap\n", "from jax import random" @@ -338,21 +337,6 @@ "JAX is laser-focused on program transformations and accelerator-backed NumPy, so we don't include data loading or munging in the JAX library. There are already a lot of great data loaders out there, so let's just use them instead of reinventing anything. We'll use the `tensorflow/datasets` data loader." ] }, - { - "cell_type": "code", - "metadata": { - "colab_type": "code", - "id": "gEvWt8_u2pqG", - "colab": {} - }, - "source": [ - "# Install tensorflow-datasets\n", - "# TODO(rsepassi): Switch to stable version on release\n", - "!pip install -q --upgrade tfds-nightly tf-nightly" - ], - "execution_count": 0, - "outputs": [] - }, { "cell_type": "code", "metadata": { diff --git a/docs/notebooks/vmapped_log_probs.ipynb b/docs/notebooks/vmapped_log_probs.ipynb index bd59fa9b2fbc..7e5fb175abdf 100644 --- a/docs/notebooks/vmapped_log_probs.ipynb +++ b/docs/notebooks/vmapped_log_probs.ipynb @@ -48,10 +48,6 @@ "colab": {} }, "source": [ - "from __future__ import absolute_import\n", - "from __future__ import division\n", - "from __future__ import print_function\n", - "\n", "import functools\n", "import itertools\n", "import re\n", From bbed6f8b2eeb630493fe42ead37d20771844cff0 Mon Sep 17 00:00:00 2001 From: Jake Vanderplas Date: Mon, 6 Apr 2020 18:40:10 -0700 Subject: [PATCH 1037/1053] Add support for interpolation options in quantile() and percentile() (#2610) --- jax/numpy/lax_numpy.py | 32 ++++++++++++++++------- tests/lax_numpy_test.py | 57 ++++++++++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index 869cf797ca69..fa19570dd570 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3387,12 +3387,12 @@ def quantile(a, q, axis=None, out=None, overwrite_input=False, msg = ("jax.numpy.quantile does not support overwrite_input=True or " "out != None") raise ValueError(msg) - if interpolation != "linear": - raise NotImplementedError("Only interpolation='linear' is implemented") - return _quantile(a, q, axis, keepdims) + if interpolation not in ["linear", "lower", "higher", "midpoint", "nearest"]: + raise ValueError("interpolation can only be 'linear', 'lower', 'higher', 'midpoint', or 'nearest'") + return _quantile(a, q, axis, interpolation, keepdims) -@partial(jit, static_argnums=(2, 3)) -def _quantile(a, q, axis, keepdims): +@partial(jit, static_argnums=(2, 3, 4)) +def _quantile(a, q, axis, interpolation, keepdims): a = asarray(a) if axis is None: a = ravel(a) @@ -3421,7 +3421,7 @@ def _quantile(a, q, axis, keepdims): n = a_shape[axis] q = lax.mul(q, _constant_like(q, n - 1)) low = lax.floor(q) - high = lax.add(low, _constant_like(low, 1)) + high = lax.ceil(q) high_weight = lax.sub(q, low) low_weight = lax.sub(_constant_like(high_weight, 1), high_weight) @@ -3450,9 +3450,23 @@ def _quantile(a, q, axis, keepdims): broadcast_dimensions=(0,)) high_weight = lax.broadcast_in_dim(high_weight, high_value.shape, broadcast_dimensions=(0,)) - return lax.convert_element_type( - lax.add(lax.mul(low_value.astype(q.dtype), low_weight), - lax.mul(high_value.astype(q.dtype), high_weight)), a.dtype) + + if interpolation == "linear": + result = lax.add(lax.mul(low_value.astype(q.dtype), low_weight), + lax.mul(high_value.astype(q.dtype), high_weight)) + elif interpolation == "lower": + result = low_value + elif interpolation == "higher": + result = high_value + elif interpolation == "nearest": + pred = lax.le(high_weight, _constant_like(high_weight, 0.5)) + result = lax.select(pred, low_value, high_value) + elif interpolation == "midpoint": + result = lax.mul(lax.add(low_value, high_value), _constant_like(low_value, 0.5)) + else: + raise ValueError(f"interpolation={interpolation!r} not recognized") + + return lax.convert_element_type(result, a.dtype) @_wraps(onp.percentile) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 0e0d12ea0788..2b23a09f7996 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2090,19 +2090,19 @@ def testIx_(self, rng_factory, shapes, dtypes): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": - "_op={}_a_shape={}_q_shape={}_axis={}_keepdims={}".format( + "_op={}_a_shape={}_q_shape={}_axis={}_keepdims={}_interpolation={}".format( op, jtu.format_shape_dtype_string(a_shape, a_dtype), jtu.format_shape_dtype_string(q_shape, q_dtype), - axis, keepdims), + axis, keepdims, interpolation), "a_rng": jtu.rand_default(), "q_rng": q_rng, "op": op, "a_shape": a_shape, "a_dtype": a_dtype, "q_shape": q_shape, "q_dtype": q_dtype, "axis": axis, - "keepdims": keepdims} + "keepdims": keepdims, + "interpolation": interpolation} for (op, q_rng) in ( ("percentile", jtu.rand_uniform(low=0., high=100.)), ("quantile", jtu.rand_uniform(low=0., high=1.)), - ("median", jtu.rand_uniform(low=0., high=1.)), ) for a_dtype in float_dtypes for a_shape, axis in ( @@ -2112,20 +2112,20 @@ def testIx_(self, rng_factory, shapes, dtypes): ) for q_dtype in [onp.float32] for q_shape in scalar_shapes + [(4,)] - for keepdims in [False, True])) + for keepdims in [False, True] + for interpolation in ['linear', 'lower', 'higher', 'nearest', 'midpoint'])) def testQuantile(self, op, a_rng, q_rng, a_shape, a_dtype, q_shape, q_dtype, - axis, keepdims): + axis, keepdims, interpolation): if op == "quantile" and numpy_version < (1, 15): raise SkipTest("Numpy < 1.15 does not have np.quantile") - if op == "median": - args_maker = lambda: [a_rng(a_shape, a_dtype)] - else: - args_maker = lambda: [a_rng(a_shape, a_dtype), q_rng(q_shape, q_dtype)] + args_maker = lambda: [a_rng(a_shape, a_dtype), q_rng(q_shape, q_dtype)] def onp_fun(*args): args = [x if jnp.result_type(x) != jnp.bfloat16 else onp.asarray(x, onp.float32) for x in args] - return getattr(onp, op)(*args, axis=axis, keepdims=keepdims) - jnp_fun = partial(getattr(jnp, op), axis=axis, keepdims=keepdims) + return getattr(onp, op)(*args, axis=axis, keepdims=keepdims, + interpolation=interpolation) + jnp_fun = partial(getattr(jnp, op), axis=axis, keepdims=keepdims, + interpolation=interpolation) # TODO(phawkins): we currently set dtype=False because we aren't as # aggressive about promoting to float64. It's not clear we want to mimic # Numpy here. @@ -2137,6 +2137,39 @@ def onp_fun(*args): self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True, rtol=tol) + @parameterized.named_parameters(jtu.cases_from_list( + {"testcase_name": + "_op=median_a_shape={}_axis={}_keepdims={}".format( + jtu.format_shape_dtype_string(a_shape, a_dtype), + axis, keepdims), + "a_rng": jtu.rand_default(), + "a_shape": a_shape, "a_dtype": a_dtype, + "axis": axis, + "keepdims": keepdims} + for a_dtype in float_dtypes + for a_shape, axis in ( + ((7,), None), + ((47, 7), 0), + ((4, 101), 1), + ) + for keepdims in [False, True])) + def testMedian(self, a_rng, a_shape, a_dtype, axis, keepdims): + args_maker = lambda: [a_rng(a_shape, a_dtype)] + def onp_fun(*args): + args = [x if jnp.result_type(x) != jnp.bfloat16 else + onp.asarray(x, onp.float32) for x in args] + return onp.median(*args, axis=axis, keepdims=keepdims) + jnp_fun = partial(jnp.median, axis=axis, keepdims=keepdims) + # TODO(phawkins): we currently set dtype=False because we aren't as + # aggressive about promoting to float64. It's not clear we want to mimic + # Numpy here. + tol_spec = {onp.float32: 2e-4, onp.float64: 5e-6} + tol = jtu.tolerance(a_dtype, tol_spec) + self._CheckAgainstNumpy(onp_fun, jnp_fun, args_maker, check_dtypes=False, + tol=tol) + self._CompileAndCheck(jnp_fun, args_maker, check_dtypes=True, rtol=tol) + + @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_shape={}".format( jtu.format_shape_dtype_string(shape, dtype)), From 44e761b33d4c79bd64f78492f5e23f74e78e0a9d Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Mon, 6 Apr 2020 21:45:10 -0400 Subject: [PATCH 1038/1053] Enable a disabled convolution test. (#2624) --- tests/lax_test.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index 04495fea021d..bb71604362f7 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -441,23 +441,22 @@ def fun(lhs, rhs): for lhs_dilation, rhs_dilation in itertools.product( [(1, 1), (1, 2), (2, 2)], repeat=2) for rng_factory in [jtu.rand_small])) - def DISABLED_testConvWithGeneralPaddingAgainstNumpy( + def testConvWithGeneralPaddingAgainstNumpy( self, lhs_shape, rhs_shape, dtype, strides, padding, lhs_dilation, rhs_dilation, rng_factory): rng = rng_factory() - # TODO(mattjj): make this test pass - raise SkipTest("this test is incomplete") args_maker = lambda: [rng(lhs_shape, dtype), rng(rhs_shape, dtype)] def fun(lhs, rhs): return lax.conv_with_general_padding( - lhs, rhs, strides, padding, lhs_dilation, rhs_dilation) + lhs, rhs, strides, padding, lhs_dilation, rhs_dilation, + precision=lax.Precision.HIGHEST) def numpy_fun(lhs, rhs): return lax_reference.conv_with_general_padding( lhs, rhs, strides, padding, lhs_dilation, rhs_dilation) - self._CheckAgainstNumpy(fun, numpy_fun, args_maker) + self._CheckAgainstNumpy(numpy_fun, fun, args_maker) @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": "_lhs_shape={}_rhs_shape={}_strides={}_padding={}" From f3a57656edaaec4fb7ad56190c7f0ade4f351e93 Mon Sep 17 00:00:00 2001 From: Jake VanderPlas Date: Mon, 6 Apr 2020 21:29:24 -0700 Subject: [PATCH 1039/1053] jit: raise TypeError if called on generator function --- jax/api.py | 5 ++++- tests/api_test.py | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/jax/api.py b/jax/api.py index 94cc1083b7af..62cb6b4dc2c5 100644 --- a/jax/api.py +++ b/jax/api.py @@ -26,6 +26,7 @@ import collections import functools +import inspect import itertools as it import threading from typing import Any, Callable, Dict, Iterable, Optional, Sequence, Tuple, Union @@ -75,7 +76,9 @@ def _check_callable(fun): if not callable(fun): - raise TypeError("Expected a callable value, got {}".format(fun)) + raise TypeError(f"Expected a callable value, got {fun}") + if inspect.isgeneratorfunction(fun): + raise TypeError(f"Expected a function, got a generator function: {fun}") class _ThreadLocalState(threading.local): def __init__(self): diff --git a/tests/api_test.py b/tests/api_test.py index 6f751989b629..df1ab6db245b 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -877,7 +877,13 @@ def test_jit_device(self): def test_jit_of_noncallable(self): self.assertRaisesRegex(TypeError, "Expected a callable value.*", - lambda: api.jit(3)) + lambda: api.jit(3)) + + def test_jit_of_generator(self): + def gen(x): + yield x + self.assertRaisesRegex(TypeError, "Expected a function, got a generator function.*", + lambda: api.jit(gen)) def test_issue_1062(self): # code from https://github.com/google/jax/issues/1062 @shoyer From 5c74c396f91ee46cd3eee61f16a6d83dacecac87 Mon Sep 17 00:00:00 2001 From: Jake Vanderplas Date: Tue, 7 Apr 2020 05:56:23 -0700 Subject: [PATCH 1040/1053] Make median() more efficient & handle infs correctly (#2626) --- jax/numpy/lax_numpy.py | 2 +- tests/lax_numpy_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index fa19570dd570..b89658e6b638 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -3481,7 +3481,7 @@ def percentile(a, q, axis=None, out=None, overwrite_input=False, def median(a, axis=None, out=None, overwrite_input=False, keepdims=False): q = 0.5 return quantile(a, q, axis=axis, out=out, overwrite_input=overwrite_input, - keepdims=keepdims) + keepdims=keepdims, interpolation='midpoint') def _astype(arr, dtype): lax._check_user_dtype_supported(dtype, "astype") diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 2b23a09f7996..dfc322b5d474 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -2139,7 +2139,7 @@ def onp_fun(*args): @parameterized.named_parameters(jtu.cases_from_list( {"testcase_name": - "_op=median_a_shape={}_axis={}_keepdims={}".format( + "_a_shape={}_axis={}_keepdims={}".format( jtu.format_shape_dtype_string(a_shape, a_dtype), axis, keepdims), "a_rng": jtu.rand_default(), From fa383b4a9fdfd615093767e8af62275b43a56d7a Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 7 Apr 2020 09:38:10 -0400 Subject: [PATCH 1041/1053] Mark primitive parameters as keyword-only arguments in rules in lax.py. (#2625) * Mark primitive parameters as keyword-only arguments in rules in lax.py. * Fix dynamic update slice batching rule. * Fix dynamic slice batching rule. --- jax/lax/lax.py | 271 ++++++++++++++++++++++++++----------------------- 1 file changed, 143 insertions(+), 128 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 00e3969dee5b..7da7622f6b73 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -619,7 +619,8 @@ def broadcast_in_dim(operand, shape, broadcast_dimensions): `_ operator. """ - shape = _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions) + shape = _broadcast_in_dim_shape_rule( + operand, shape=shape, broadcast_dimensions=broadcast_dimensions) if onp.ndim(operand) == len(shape) and not len(broadcast_dimensions): return operand return broadcast_in_dim_p.bind( @@ -638,7 +639,7 @@ def reshape(operand, new_sizes, dimensions=None): if onp.shape(operand) and same_shape and same_dims: return operand else: - return reshape_p.bind( operand, new_sizes=new_sizes, + return reshape_p.bind(operand, new_sizes=new_sizes, dimensions=None if same_dims else tuple(dimensions)) def pad(operand, padding_value, padding_config): @@ -1803,7 +1804,7 @@ def _bessel_i1e_jvp(g, y, x): conj_p = unop(_complex_dtype, _complex_elem_types | _complex, 'conj') -def _conj_transpose_rule(t, x, input_dtype): +def _conj_transpose_rule(t, x, *, input_dtype): assert ad.is_undefined_primal(x) if dtypes.issubdtype(input_dtype, onp.complexfloating): return [conj(t)] @@ -1913,7 +1914,7 @@ def _broadcasting_select(c, which, x, y): return c.Select(which, x, y) -def _minmax_translation_rule(c, x, y, minmax=None, cmp=None): +def _minmax_translation_rule(c, x, y, *, minmax=None, cmp=None): dtype = c.GetShape(x).numpy_dtype() if dtypes.issubdtype(dtype, onp.complexfloating): comparator = cmp(c) @@ -1966,13 +1967,13 @@ def _minmax_translation_rule(c, x, y, minmax=None, cmp=None): ad.defjvp_zero(lt_p) -def _convert_element_type_shape_rule(operand, new_dtype, old_dtype): +def _convert_element_type_shape_rule(operand, *, new_dtype, old_dtype): return operand.shape -def _convert_element_type_dtype_rule(operand, new_dtype, old_dtype): +def _convert_element_type_dtype_rule(operand, *, new_dtype, old_dtype): return new_dtype -def _convert_element_type_translation_rule(c, operand, new_dtype, old_dtype): +def _convert_element_type_translation_rule(c, operand, *, new_dtype, old_dtype): new_etype = xla_client.dtype_to_etype(new_dtype) return c.ConvertElementType(operand, new_element_type=new_etype) @@ -1986,13 +1987,13 @@ def _convert_element_type_translation_rule(c, operand, new_dtype, old_dtype): masking.defvectorized(convert_element_type_p) -def _bitcast_convert_type_shape_rule(operand, new_dtype): +def _bitcast_convert_type_shape_rule(operand, *, new_dtype): return operand.shape -def _bitcast_convert_type_dtype_rule(operand, new_dtype): +def _bitcast_convert_type_dtype_rule(operand, *, new_dtype): return new_dtype -def _bitcast_convert_type_translation_rule(c, operand, new_dtype): +def _bitcast_convert_type_translation_rule(c, operand, *, new_dtype): new_etype = xla_bridge.dtype_to_etype(new_dtype) return c.BitcastConvertType(operand, new_element_type=new_etype) @@ -2005,7 +2006,7 @@ def _bitcast_convert_type_translation_rule(c, operand, new_dtype): def _conv_general_dilated_shape_rule( - lhs, rhs, window_strides, padding, lhs_dilation, rhs_dilation, + lhs, rhs, *, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, **unused_kwargs): assert type(dimension_numbers) is ConvDimensionNumbers if not feature_group_count > 0: @@ -2036,7 +2037,7 @@ def _conv_general_dilated_shape_rule( return tuple(onp.take(out_trans, onp.argsort(out_perm))) def _conv_general_dilated_dtype_rule( - lhs, rhs, window_strides, padding, lhs_dilation, rhs_dilation, + lhs, rhs, *, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, **unused_kwargs): return naryop_dtype_rule(_input_dtype, [_float, _float], 'conv_general_dilated', lhs, rhs) @@ -2045,7 +2046,7 @@ def _conv_general_dilated_dtype_rule( _conv_sdims = lambda spec: spec[2:] def _conv_general_dilated_transpose_lhs( - g, rhs, window_strides, padding, lhs_dilation, rhs_dilation, + g, rhs, *, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, lhs_shape, rhs_shape, precision): assert type(dimension_numbers) is ConvDimensionNumbers @@ -2070,7 +2071,7 @@ def _conv_general_dilated_transpose_lhs( feature_group_count=feature_group_count, precision=precision) def _conv_general_dilated_transpose_rhs( - g, lhs, window_strides, padding, lhs_dilation, rhs_dilation, + g, lhs, *, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, lhs_shape, rhs_shape, precision): assert type(dimension_numbers) is ConvDimensionNumbers @@ -2094,7 +2095,7 @@ def _conv_general_dilated_transpose_rhs( feature_group_count=feature_group_count, precision=precision) def _conv_general_dilated_translation_rule( - c, lhs, rhs, window_strides, padding, lhs_dilation, rhs_dilation, + c, lhs, rhs, *, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, precision, **unused_kwargs): assert type(dimension_numbers) is ConvDimensionNumbers dimension_numbers = _conv_general_proto(dimension_numbers) @@ -2104,7 +2105,7 @@ def _conv_general_dilated_translation_rule( precision_config=_precision_config(precision)) def _conv_general_dilated_batch_rule( - batched_args, batch_dims, window_strides, padding, + batched_args, batch_dims, *, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, precision, **unused_kwargs): lhs, rhs = batched_args @@ -2191,7 +2192,7 @@ def _precision_config(precision): return None -def _dot_general_shape_rule(lhs, rhs, dimension_numbers, precision): +def _dot_general_shape_rule(lhs, rhs, *, dimension_numbers, precision): (lhs_contracting, rhs_contracting), (lhs_batch, rhs_batch) = dimension_numbers if len(lhs_batch) != len(rhs_batch): msg = ("dot_general requires equal numbers of lhs_batch and rhs_batch " @@ -2230,11 +2231,11 @@ def _dot_general_shape_rule(lhs, rhs, dimension_numbers, precision): return batch_shape + lhs_tensored_shape + rhs_tensored_shape -def _dot_general_dtype_rule(lhs, rhs, dimension_numbers, precision): +def _dot_general_dtype_rule(lhs, rhs, *, dimension_numbers, precision): return naryop_dtype_rule(_input_dtype, [_num, _num], 'dot_general', lhs, rhs) -def _dot_general_transpose_lhs(g, y, dimension_numbers, precision, +def _dot_general_transpose_lhs(g, y, *, dimension_numbers, precision, swap_ans=False): (x_contract, y_contract), (x_batch, y_batch) = dimension_numbers x_ndim = g.ndim - y.ndim + len(x_batch) + 2 * len(x_contract) @@ -2250,14 +2251,15 @@ def _dot_general_transpose_lhs(g, y, dimension_numbers, precision, return transpose(dot_general(g, y, dims, precision=precision), tuple(out_axes)) -def _dot_general_transpose_rhs(g, x, dimension_numbers, precision): +def _dot_general_transpose_rhs(g, x, *, dimension_numbers, precision): (x_contract, y_contract), (x_batch, y_batch) = dimension_numbers swapped_dimension_numbers = ((y_contract, x_contract), (y_batch, x_batch)) - return _dot_general_transpose_lhs(g, x, swapped_dimension_numbers, - precision, swap_ans=True) + return _dot_general_transpose_lhs( + g, x, dimension_numbers=swapped_dimension_numbers, precision=precision, + swap_ans=True) -def _dot_general_batch_rule(batched_args, batch_dims, dimension_numbers, +def _dot_general_batch_rule(batched_args, batch_dims, *, dimension_numbers, precision): # there are three kinds of dimensions in a dot_general: # - contraction dimensions appear in lhs and rhs but not the result @@ -2310,11 +2312,11 @@ def _dot_general_batch_rule(batched_args, batch_dims, dimension_numbers, precision=precision) return batched_out, int(result_batch_dim) -def _dot_general_translation_rule(c, lhs, rhs, dimension_numbers, precision): +def _dot_general_translation_rule(c, lhs, rhs, *, dimension_numbers, precision): return c.DotGeneral(lhs, rhs, dimension_numbers, precision_config=_precision_config(precision)) -def _dot_general_masking_rule(padded_vals, logical_shapes, dimension_numbers, +def _dot_general_masking_rule(padded_vals, logical_shapes, *, dimension_numbers, precision): lhs, rhs = padded_vals lhs_shape, rhs_shape = logical_shapes @@ -2346,7 +2348,7 @@ def _broadcast_shape_rule(operand, sizes): _check_shapelike('broadcast', 'sizes', sizes) return tuple(sizes) + operand.shape -def _broadcast_batch_rule(batched_args, batch_dims, sizes): +def _broadcast_batch_rule(batched_args, batch_dims, *, sizes): operand, = batched_args bdim, = batch_dims new_bdim = None if bdim is None else bdim + len(sizes) @@ -2357,9 +2359,10 @@ def _broadcast_batch_rule(batched_args, batch_dims, sizes): ad.deflinear(broadcast_p, lambda t, sizes: [_reduce_sum(t, range(len(sizes)))]) batching.primitive_batchers[broadcast_p] = _broadcast_batch_rule -def _broadcast_in_dim_impl(operand, shape, broadcast_dimensions): +def _broadcast_in_dim_impl(operand, *, shape, broadcast_dimensions): if type(operand) is xla.DeviceArray: - shape = _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions) + shape = _broadcast_in_dim_shape_rule( + operand, shape=shape, broadcast_dimensions=broadcast_dimensions) aval = ShapedArray(shape, _dtype(operand)) lazy_expr = lazy.broadcast(operand._lazy_expr, shape, broadcast_dimensions) return xla.DeviceArray(aval, None, lazy_expr, operand.device_buffer) @@ -2367,7 +2370,7 @@ def _broadcast_in_dim_impl(operand, shape, broadcast_dimensions): return xla.apply_primitive(broadcast_in_dim_p, operand, shape=shape, broadcast_dimensions=broadcast_dimensions) -def _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions): +def _broadcast_in_dim_shape_rule(operand, *, shape, broadcast_dimensions): _check_shapelike('broadcast_in_dim', 'shape', shape) _check_shapelike('broadcast_in_dim', 'broadcast_dimensions', broadcast_dimensions) @@ -2399,11 +2402,11 @@ def _broadcast_in_dim_shape_rule(operand, shape, broadcast_dimensions): return shape -def _broadcast_in_dim_transpose_rule(t, shape, broadcast_dimensions): +def _broadcast_in_dim_transpose_rule(t, *, shape, broadcast_dimensions): axes = tuple(onp.delete(range(len(shape)), broadcast_dimensions)) return [_reduce_sum(t, axes)] -def _broadcast_in_dim_batch_rule(batched_args, batch_dims, shape, +def _broadcast_in_dim_batch_rule(batched_args, batch_dims, *, shape, broadcast_dimensions): operand, = batched_args bdim, = batch_dims @@ -2492,7 +2495,7 @@ def _concatenate_transpose_rule(t, *operands, dimension): return [slice(t, start, limit) if ad.is_undefined_primal(o) else None for o, start, limit in zip(operands, starts, limits)] -def _concatenate_batch_rule(batched_args, batch_dims, dimension): +def _concatenate_batch_rule(batched_args, batch_dims, *, dimension): size = next(op.shape[bdim] for op, bdim in zip(batched_args, batch_dims) if bdim is not None) operands = [batching.moveaxis(op, bdim, 0) if bdim is not None @@ -2511,20 +2514,20 @@ def _concatenate_batch_rule(batched_args, batch_dims, dimension): batching.primitive_batchers[concatenate_p] = _concatenate_batch_rule -def _pad_dtype_rule(operand, padding_value, padding_config): +def _pad_dtype_rule(operand, padding_value, *, padding_config): if operand.dtype != padding_value.dtype: msg = "pad operand and padding_value must be same dtype: got {} and {}." raise TypeError(msg.format(operand.dtype, padding_value.dtype)) return _input_dtype(operand, padding_value) -def _pad_shape_rule(operand, padding_value, padding_config): +def _pad_shape_rule(operand, padding_value, *, padding_config): lo, hi, interior = zip(*padding_config) out_shape = onp.add(onp.add(onp.add(lo, hi), operand.shape), onp.multiply(interior, onp.subtract(operand.shape, 1))) return tuple(out_shape) -def _pad_transpose(t, operand, padding_value, padding_config): +def _pad_transpose(t, operand, padding_value, *, padding_config): if t is ad_util.zero: return [ad_util.zero if ad.is_undefined_primal(operand) else None, ad_util.zero if ad.is_undefined_primal(padding_value) else None] @@ -2542,7 +2545,7 @@ def t_op(): return [t_operand, t_padv] -def _pad_batch_rule(batched_args, batch_dims, padding_config): +def _pad_batch_rule(batched_args, batch_dims, *, padding_config): operand, padding_value = batched_args operand_bdim, padding_value_bdim = batch_dims if padding_value_bdim is None: @@ -2560,7 +2563,7 @@ def _pad_batch_rule(batched_args, batch_dims, padding_config): # We have a nonstandard reshape impl so that we can be lazy about data movement. -def _reshape_impl(operand, new_sizes, dimensions): +def _reshape_impl(operand, *, new_sizes, dimensions): old_sizes = onp.shape(operand) if type(operand) is xla.DeviceArray and dimensions is None: bcast_dims = _is_singleton_reshape(old_sizes, new_sizes) @@ -2607,7 +2610,7 @@ def _is_axis_merge(s1, s2): def _is_axis_split(s1, s2): return _is_axis_merge(s2, s1) -def _reshape_shape_rule(operand, new_sizes, dimensions, **unused_kwargs): +def _reshape_shape_rule(operand, *, new_sizes, dimensions): if not onp.all(onp.greater_equal(new_sizes, 0)): msg = 'reshape new_sizes must all be positive, got {}.' raise TypeError(msg.format(new_sizes)) @@ -2621,13 +2624,13 @@ def _reshape_shape_rule(operand, new_sizes, dimensions, **unused_kwargs): raise TypeError(msg.format(dimensions, onp.shape(operand))) return tuple(new_sizes) -def _reshape_dtype_rule(operand, new_sizes, dimensions, **unused_kwargs): +def _reshape_dtype_rule(operand, *, new_sizes, dimensions): return operand.dtype -def _reshape_translation_rule(c, operand, new_sizes, dimensions): +def _reshape_translation_rule(c, operand, *, new_sizes, dimensions): return c.Reshape(operand, new_sizes=new_sizes, dimensions=dimensions) -def _reshape_transpose_rule(t, operand, new_sizes, dimensions): +def _reshape_transpose_rule(t, operand, *, new_sizes, dimensions): assert ad.is_undefined_primal(operand) if dimensions is None: return [reshape(t, operand.aval.shape)] @@ -2635,7 +2638,7 @@ def _reshape_transpose_rule(t, operand, new_sizes, dimensions): return [transpose(reshape(t, onp.take(operand.aval.shape, dimensions)), onp.argsort(dimensions))] -def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unused): +def _reshape_batch_rule(batched_args, batch_dims, *, new_sizes, dimensions): operand, = batched_args bdim, = batch_dims operand = batching.moveaxis(operand, bdim, 0) @@ -2650,7 +2653,7 @@ def _reshape_batch_rule(batched_args, batch_dims, new_sizes, dimensions, **unuse batching.primitive_batchers[reshape_p] = _reshape_batch_rule -def _rev_shape_rule(operand, dimensions): +def _rev_shape_rule(operand, *, dimensions): _check_shapelike('rev', 'dimensions', dimensions) if len(set(dimensions)) != len(dimensions): msg = 'rev dimensions must be unique, got {}.' @@ -2661,7 +2664,7 @@ def _rev_shape_rule(operand, dimensions): raise TypeError(msg.format(dimensions, operand.ndim)) return operand.shape -def _rev_batch_rule(batched_args, batch_dims, dimensions): +def _rev_batch_rule(batched_args, batch_dims, *, dimensions): operand, = batched_args bdim, = batch_dims new_dimensions = [i + 1 if i >= bdim else i for i in dimensions] @@ -2672,7 +2675,7 @@ def _rev_batch_rule(batched_args, batch_dims, dimensions): batching.primitive_batchers[rev_p] = _rev_batch_rule -def _transpose_impl(operand, permutation): +def _transpose_impl(operand, *, permutation): if type(operand) is xla.DeviceArray: lazy_expr = lazy.transpose(operand._lazy_expr, permutation) aval = ShapedArray(lazy_expr.shape, operand.dtype) @@ -2680,7 +2683,7 @@ def _transpose_impl(operand, permutation): else: return xla.apply_primitive(transpose_p, operand, permutation=permutation) -def _transpose_shape_rule(operand, permutation): +def _transpose_shape_rule(operand, *, permutation): if not isinstance(permutation, (tuple, list, onp.ndarray)): msg = "transpose permutation must be a tuple/list/ndarray, got {}." raise TypeError(msg.format(type(permutation))) @@ -2690,7 +2693,7 @@ def _transpose_shape_rule(operand, permutation): raise TypeError(msg.format(permutation, operand.shape)) return tuple(onp.take(operand.shape, permutation)) -def _transpose_batch_rule(batched_args, batch_dims, permutation): +def _transpose_batch_rule(batched_args, batch_dims, *, permutation): operand, = batched_args bdim, = batch_dims perm = (bdim,) + tuple(i if i < bdim else i+1 for i in permutation) @@ -2779,7 +2782,7 @@ def _select_batch_rule(batched_args, batch_dims, **unused_kwargs): batching.primitive_batchers[select_p] = _select_batch_rule -def _slice_shape_rule(operand, start_indices, limit_indices, strides): +def _slice_shape_rule(operand, *, start_indices, limit_indices, strides): _check_shapelike("slice", "start_indices", start_indices) _check_shapelike("slice", "limit_indices", limit_indices) if operand.ndim != len(start_indices): @@ -2818,10 +2821,11 @@ def _slice_shape_rule(operand, start_indices, limit_indices, strides): onp.add(onp.subtract(limit_indices, start_indices), strides) - 1, strides) return tuple(result_shape) -def _slice_translation_rule(c, operand, start_indices, limit_indices, strides): +def _slice_translation_rule(c, operand, *, start_indices, limit_indices, + strides): return c.Slice(operand, start_indices, limit_indices, strides) -def _slice_transpose_rule(t, operand, start_indices, limit_indices, strides): +def _slice_transpose_rule(t, operand, *, start_indices, limit_indices, strides): assert ad.is_undefined_primal(operand) operand_shape = operand.aval.shape if strides is None or onp.all(onp.equal(strides, 1)): @@ -2836,8 +2840,8 @@ def _slice_transpose_rule(t, operand, start_indices, limit_indices, strides): assert result.shape == operand_shape return [result] -def _slice_batching_rule(batched_args, batch_dims, start_indices, limit_indices, - strides): +def _slice_batching_rule(batched_args, batch_dims, *, start_indices, + limit_indices, strides): operand, = batched_args bdim, = batch_dims @@ -2892,7 +2896,7 @@ def _dynamic_slice_dtype_rule(operand, *start_indices, slice_sizes): def _dynamic_slice_translation_rule(c, operand, *start_indices, slice_sizes): return c.DynamicSlice(operand, start_indices, slice_sizes) -def _dynamic_slice_jvp(primals, tangents, slice_sizes): +def _dynamic_slice_jvp(primals, tangents, *, slice_sizes): tangent_out = ad_util.zero if tangents[0] is not ad_util.zero: tangent_out = dynamic_slice(tangents[0], primals[1:], slice_sizes) @@ -2917,7 +2921,7 @@ def _batch_dynamic_slice_indices(indices, bdims): dimension=1) return indices, 0 -def _dynamic_slice_batching_rule(batched_args, batch_dims, slice_sizes): +def _dynamic_slice_batching_rule(batched_args, batch_dims, *, slice_sizes): # A dynamic slice is a special case of gather; we can delegate to the gather # batching rule. # TODO(phawkins): consider removing dynamic_slice entirely and using gather @@ -2931,7 +2935,8 @@ def _dynamic_slice_batching_rule(batched_args, batch_dims, slice_sizes): start_index_map=dims) index, index_bdim = _batch_dynamic_slice_indices(start_indices, start_idx_bds) return _gather_batching_rule( - [operand, index], [operand_bd, index_bdim], dnums, slice_sizes) + [operand, index], [operand_bd, index_bdim], dimension_numbers=dnums, + slice_sizes=slice_sizes) dynamic_slice_p = standard_primitive( @@ -2942,7 +2947,7 @@ def _dynamic_slice_batching_rule(batched_args, batch_dims, slice_sizes): batching.primitive_batchers[dynamic_slice_p] = _dynamic_slice_batching_rule -def _dynamic_update_slice_shape_rule(operand, update, *start_indices, **kwargs): +def _dynamic_update_slice_shape_rule(operand, update, *start_indices): if operand.ndim != update.ndim: msg = ("dynamic_update_slice update must have the same rank as operand, " "got update shape {} for operand shape {}.") @@ -2957,7 +2962,7 @@ def _dynamic_update_slice_shape_rule(operand, update, *start_indices, **kwargs): raise TypeError(msg.format(update.shape, operand.shape)) return operand.shape -def _dynamic_update_slice_dtype_rule(operand, update, *start_indices, **kwargs): +def _dynamic_update_slice_dtype_rule(operand, update, *start_indices): _check_same_dtypes("dynamic_update_slice", False, operand.dtype, update.dtype) if any(i.dtype != start_indices[0].dtype or not dtypes.issubdtype(i.dtype, onp.integer) for i in start_indices): @@ -2992,8 +2997,7 @@ def _dynamic_update_slice_transpose_rule(t, operand, update, *start_indices): update_t = ds(t, start_indices, update_shape) if ad.is_undefined_primal(update) else None return [operand_t, update_t] + [None] * len(start_indices) -def _dynamic_update_slice_translation_rule(c, operand, update, *start_indices, - **kwargs): +def _dynamic_update_slice_translation_rule(c, operand, update, *start_indices): return c.DynamicUpdateSlice(operand, update, start_indices) def _dynamic_update_slice_batching_rule(batched_args, batch_dims): @@ -3011,8 +3015,8 @@ def _dynamic_update_slice_batching_rule(batched_args, batch_dims): scatter_dims_to_operand_dims=dims) index, index_bdim = _batch_dynamic_slice_indices(start_idx, start_idx_bd) return _scatter_batching_rule( - scatter, (operand, index, update), - (operand_bd, index_bdim, update_bd), None, None, dnums) + scatter, (operand, index, update), (operand_bd, index_bdim, update_bd), + update_jaxpr=None, update_consts=None, dimension_numbers=dnums) dynamic_update_slice_p = standard_primitive( @@ -3065,7 +3069,8 @@ def _gather_dtype_rule(operand, start_indices, **kwargs): raise ValueError("start_indices must have an integer type") return dtypes.canonicalize_dtype(operand.dtype) -def _gather_shape_rule(operand, start_indices, dimension_numbers, slice_sizes): +def _gather_shape_rule(operand, start_indices, *, dimension_numbers, + slice_sizes): if len(operand.shape) != len(slice_sizes): msg = ("slice_sizes must have rank equal to the gather operand; " "operand.shape={}, slice_sizes={}".format(operand.shape, slice_sizes)) @@ -3076,17 +3081,18 @@ def _gather_shape_rule(operand, start_indices, dimension_numbers, slice_sizes): return tuple(next(slice_sizes) if i in dimension_numbers.offset_dims else next(start_indices_shape) for i in range(result_rank)) -def _gather_translation_rule(c, operand, start_indices, dimension_numbers, +def _gather_translation_rule(c, operand, start_indices, *, dimension_numbers, slice_sizes): indices_shape = c.GetShape(start_indices) return c.Gather( operand, start_indices, _gather_dimensions_proto(indices_shape, dimension_numbers), slice_sizes) -def _gather_jvp_rule(g, operand, start_indices, dimension_numbers, slice_sizes): +def _gather_jvp_rule(g, operand, start_indices, *, dimension_numbers, + slice_sizes): return gather(g, start_indices, dimension_numbers, slice_sizes) -def _gather_transpose_rule(t, operand, start_indices, dimension_numbers, +def _gather_transpose_rule(t, operand, start_indices, *, dimension_numbers, slice_sizes): assert ad.is_undefined_primal(operand) operand_shape = operand.aval.shape @@ -3099,7 +3105,7 @@ def _gather_transpose_rule(t, operand, start_indices, dimension_numbers, scatter_dims_to_operand_dims=dimension_numbers.start_index_map) return [scatter_add(zeros, start_indices, t, scatter_dnums), ad_util.zero] -def _gather_batching_rule(batched_args, batch_dims, dimension_numbers, +def _gather_batching_rule(batched_args, batch_dims, *, dimension_numbers, slice_sizes): operand, start_indices = batched_args operand_bdim, start_indices_bdim = batch_dims @@ -3218,7 +3224,8 @@ def _scatter_translation_rule(c, operand, scatter_indices, updates, return c.Scatter(operand, scatter_indices, updates, update_computation, _scatter_dimensions_proto(indices_shape, dimension_numbers)) -def _scatter_add_jvp(primals, tangents, update_jaxpr, update_consts, dimension_numbers): +def _scatter_add_jvp(primals, tangents, *, update_jaxpr, update_consts, + dimension_numbers): operand, scatter_indices, updates = primals g_operand, g_scatter_indices, g_updates = tangents val_out = scatter_add_p.bind( @@ -3234,7 +3241,7 @@ def _scatter_add_jvp(primals, tangents, update_jaxpr, update_consts, dimension_n update_consts=update_consts, dimension_numbers=dimension_numbers) return val_out, tangent_out -def _scatter_add_transpose_rule(t, operand, scatter_indices, updates, +def _scatter_add_transpose_rule(t, operand, scatter_indices, updates, *, update_jaxpr, update_consts, dimension_numbers): assert not ad.is_undefined_primal(scatter_indices) if ad.is_undefined_primal(updates): @@ -3265,8 +3272,8 @@ def _scatter_add_transpose_rule(t, operand, scatter_indices, updates, slice_sizes=slice_sizes) return [operand_t, None, update_t] -def _scatter_batching_rule(scatter_op, batched_args, batch_dims, update_jaxpr, - update_consts, dimension_numbers): +def _scatter_batching_rule(scatter_op, batched_args, batch_dims, *, + update_jaxpr, update_consts, dimension_numbers): operand, scatter_indices, updates = batched_args operand_bdim, scatter_indices_bdim, updates_bdim = batch_dims del update_jaxpr, update_consts # Unused. @@ -3334,7 +3341,8 @@ def _scatter_batching_rule(scatter_op, batched_args, batch_dims, update_jaxpr, partial(_scatter_batching_rule, scatter_max)) -def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, dimension_numbers): +def _scatter_jvp(primals, tangents, *, update_jaxpr, update_consts, + dimension_numbers): operand, scatter_indices, updates = primals g_operand, g_scatter_indices, g_updates = tangents dnums = dimension_numbers @@ -3435,14 +3443,17 @@ def _scatter_jvp(primals, tangents, update_jaxpr, update_consts, dimension_numbe partial(_scatter_batching_rule, scatter)) -def _reduce_shape_rule(operand, init_value, computation, jaxpr, consts, dimensions): +def _reduce_shape_rule(operand, init_value, *, computation, jaxpr, consts, + dimensions): return tuple(onp.delete(operand.shape, dimensions)) -def _reduce_translation_rule(c, operand, init_value, computation, jaxpr, consts, dimensions): +def _reduce_translation_rule(c, operand, init_value, *, computation, jaxpr, + consts, dimensions): xla_computation = _reduction_computation(c, jaxpr, consts, init_value) return c.Reduce(operand, init_value, xla_computation, dimensions) -def _reduce_batch_rule(batched_args, batch_dims, computation, jaxpr, consts, dimensions): +def _reduce_batch_rule(batched_args, batch_dims, *, computation, jaxpr, consts, + dimensions): operand, init_value = batched_args operand_bdim, init_value_bdim = batch_dims if init_value_bdim is None: @@ -3486,17 +3497,17 @@ def _reduce_number_dtype_rule(name, operand, *args, **kw): "of number.".format(name, onp.dtype(operand.dtype).name)) return dtypes.canonicalize_dtype(operand.dtype) -def _reduce_sum_shape_rule(operand, axes): - return _reduce_op_shape_rule(operand, axes) +def _reduce_sum_shape_rule(operand, *, axes): + return _reduce_op_shape_rule(operand, axes=axes) -def _reduce_sum_translation_rule(c, operand, axes): +def _reduce_sum_translation_rule(c, operand, *, axes): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(0, dtype)), xla.primitive_subcomputation(add_p, scalar, scalar), axes) -def _reduce_sum_transpose_rule(cotangent, operand, axes): +def _reduce_sum_transpose_rule(cotangent, operand, *, axes): assert ad.is_undefined_primal(operand) input_shape = operand.aval.shape broadcast_dimensions = tuple(onp.delete(onp.arange(len(input_shape)), axes)) @@ -3513,16 +3524,16 @@ def _reduce_sum_transpose_rule(cotangent, operand, axes): lambda shape, dtype: onp.broadcast_to(onp.array(0, dtype), shape)) -def _reduce_op_shape_rule(operand, axes): +def _reduce_op_shape_rule(operand, *, axes): return tuple(onp.delete(operand.shape, axes)) -def _reduce_prod_translation_rule(c, operand, axes): +def _reduce_prod_translation_rule(c, operand, *, axes): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(onp.array(1, dtype)), xla.primitive_subcomputation(mul_p, scalar, scalar), axes) -def _reduce_prod_jvp_rule(primals, tangents, axes): +def _reduce_prod_jvp_rule(primals, tangents, *, axes): operand, = primals tangent, = tangents input_shape = onp.array(operand.shape) @@ -3563,16 +3574,16 @@ def _reduce_prod_tree(x, axis=0): batching.defreducer(reduce_prod_p) -def _reduce_chooser_shape_rule(operand, axes): +def _reduce_chooser_shape_rule(operand, *, axes): return tuple(onp.delete(operand.shape, axes)) -def _reduce_chooser_translation_rule(prim, identity, c, operand, axes): +def _reduce_chooser_translation_rule(prim, identity, c, operand, *, axes): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.Reduce(operand, c.Constant(identity(dtype)), xla.primitive_subcomputation(prim, scalar, scalar), axes) -def _reduce_chooser_jvp_rule(g, ans, operand, axes): +def _reduce_chooser_jvp_rule(g, ans, operand, *, axes): # TODO(mattjj): an alternative is to use variadic reduce to compute the chosen # locations in a single pass (rather than comparing equality) and use a # gather, and/or even push along the chosen elements of g (b/112040122) @@ -3598,13 +3609,13 @@ def _reduce_chooser_jvp_rule(g, ans, operand, axes): batching.defreducer(reduce_min_p) -def _reduce_logical_shape_rule(operand, axes): +def _reduce_logical_shape_rule(operand, *, axes): if operand.dtype != onp.bool_: msg = "logical reduction requires operand dtype bool, got {}." raise TypeError(msg.format(operand.dtype)) return tuple(onp.delete(operand.shape, axes)) -def _reduce_logical_translation_rule(prim, identity, c, operand, axes): +def _reduce_logical_translation_rule(prim, identity, c, operand, *, axes): scalar = ShapedArray((), onp.bool_) return c.Reduce(operand, c.Constant(identity(onp.bool_)), xla.primitive_subcomputation(prim, scalar, scalar), axes) @@ -3622,7 +3633,7 @@ def _reduce_logical_translation_rule(prim, identity, c, operand, axes): 'reduce_and', _reduce_and_translation_rule) batching.defreducer(reduce_and_p) -def _reduce_window_shape_rule(operand, init_value, jaxpr, consts, +def _reduce_window_shape_rule(operand, init_value, *, jaxpr, consts, window_dimensions, window_strides, padding): if operand.dtype != init_value.dtype: msg = ("reduce_window got inconsistent dtypes for operand and init_value: " @@ -3631,15 +3642,15 @@ def _reduce_window_shape_rule(operand, init_value, jaxpr, consts, return _common_reduce_window_shape_rule(operand, window_dimensions, window_strides, padding) -def _reduce_window_translation_rule(c, operand, init_value, jaxpr, consts, +def _reduce_window_translation_rule(c, operand, init_value, *, jaxpr, consts, window_dimensions, window_strides, padding): xla_computation = _reduction_computation(c, jaxpr, consts, init_value) return c.ReduceWindow(operand, init_value, xla_computation, window_dimensions, window_strides, padding) def _generic_reduce_window_batch_rule( - batched_args, batch_dims, jaxpr, consts, window_dimensions, window_strides, - padding): + batched_args, batch_dims, *, jaxpr, consts, window_dimensions, + window_strides, padding): operand, init = batched_args bdim, init_bdim = batch_dims if init_bdim is not None: @@ -3660,15 +3671,15 @@ def reduce_window(x, window_dimensions, window_strides, padding): batching.primitive_batchers[reduce_window_p] = _generic_reduce_window_batch_rule -def _reduce_window_sum_shape_rule(operand, window_dimensions, window_strides, +def _reduce_window_sum_shape_rule(operand, *, window_dimensions, window_strides, padding): if not dtypes.issubdtype(operand.dtype, onp.number): msg = "operand to reduce_window_sum must have a number dtype, got {}" raise TypeError(msg.format(onp.dtype(operand.dtype).name)) return _common_reduce_window_shape_rule(operand, window_dimensions, - window_strides, padding) + window_strides, padding) -def _reduce_window_sum_translation_rule(c, operand, window_dimensions, +def _reduce_window_sum_translation_rule(c, operand, *, window_dimensions, window_strides, padding): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) @@ -3676,7 +3687,7 @@ def _reduce_window_sum_translation_rule(c, operand, window_dimensions, xla.primitive_subcomputation(add_p, scalar, scalar), window_dimensions, window_strides, padding) -def _reduce_window_sum_transpose_rule(cotangent, operand, window_dimensions, +def _reduce_window_sum_transpose_rule(cotangent, operand, *, window_dimensions, window_strides, padding): assert ad.is_undefined_primal(operand) input_shape = operand.aval.shape @@ -3694,7 +3705,7 @@ def _reduce_window_sum_transpose_rule(cotangent, operand, window_dimensions, assert result.shape == input_shape return [result] -def _reduce_window_batch_rule(reduce_window, batched_args, bdims, +def _reduce_window_batch_rule(reduce_window, batched_args, bdims, *, window_dimensions, window_strides, padding): operand, = batched_args bdim, = bdims @@ -3717,14 +3728,14 @@ def _reduce_window_batch_rule(reduce_window, batched_args, bdims, _reduce_window_batch_rule, _reduce_window_sum) def _reduce_window_chooser_translation_rule( - prim, identity, c, operand, window_dimensions, window_strides, padding): + prim, identity, c, operand, *, window_dimensions, window_strides, padding): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) return c.ReduceWindow(operand, c.Constant(identity(dtype)), xla.primitive_subcomputation(prim, scalar, scalar), window_dimensions, window_strides, padding) -def _reduce_window_chooser_jvp_rule(prim, g, operand, window_dimensions, +def _reduce_window_chooser_jvp_rule(prim, g, operand, *, window_dimensions, window_strides, padding): assert prim is max_p or prim is min_p select_prim = ge_p if prim is max_p else le_p @@ -3732,8 +3743,8 @@ def _reduce_window_chooser_jvp_rule(prim, g, operand, window_dimensions, window_strides, padding) -def _common_reduce_window_shape_rule(operand, window_dimensions, window_strides, - padding): +def _common_reduce_window_shape_rule(operand, window_dimensions, + window_strides, padding): _check_shapelike("reduce_window", "window_dimensions", window_dimensions) _check_shapelike("reduce_window", "window_strides", window_strides) if operand.ndim != len(window_dimensions): @@ -3779,7 +3790,7 @@ def reduce_window_shape_tuple(operand_shape, window_dimensions, window_strides, def _select_and_scatter_shape_rule( - operand, source, init_value, select_jaxpr, select_consts, scatter_jaxpr, + operand, source, init_value, *, select_jaxpr, select_consts, scatter_jaxpr, scatter_consts, window_dimensions, window_strides, padding): _check_shapelike("select_and_scatter", "window_dimensions", window_dimensions) _check_shapelike("select_and_scatter", "window_strides", window_strides) @@ -3790,7 +3801,7 @@ def _select_and_scatter_shape_rule( return operand.shape def _select_and_scatter_translation( - c, operand, source, init_value, select_jaxpr, select_consts, scatter_jaxpr, + c, operand, source, init_value, *, select_jaxpr, select_consts, scatter_jaxpr, scatter_consts, window_dimensions, window_strides, padding): select = _reduction_computation(c, select_jaxpr, select_consts, init_value) scatter = _reduction_computation(c, scatter_jaxpr, scatter_consts, init_value) @@ -3803,11 +3814,12 @@ def _select_and_scatter_translation( def _select_and_scatter_add_shape_rule( - source, operand, select_prim, window_dimensions, window_strides, padding): + source, operand, *, select_prim, window_dimensions, window_strides, + padding): return operand.shape def _select_and_scatter_add_translation( - c, source, operand, select_prim, window_dimensions, window_strides, + c, source, operand, *, select_prim, window_dimensions, window_strides, padding): dtype = c.GetShape(operand).numpy_dtype() scalar = ShapedArray((), dtype) @@ -3818,7 +3830,7 @@ def _select_and_scatter_add_translation( padding, source, zero, scatter) def _select_and_scatter_add_jvp( - primals, tangents, select_prim, window_dimensions, window_strides, + primals, tangents, *, select_prim, window_dimensions, window_strides, padding): source, operand = primals g_source, g_operand = tangents @@ -3835,7 +3847,7 @@ def _select_and_scatter_add_jvp( return val_out, tangent_out def _select_and_scatter_add_transpose( - t, source, operand, select_prim, window_dimensions, window_strides, + t, source, operand, *, select_prim, window_dimensions, window_strides, padding): assert ad.is_undefined_primal(source) and not ad.is_undefined_primal(operand) source_t = _select_and_gather_add(t, operand, select_prim, window_dimensions, @@ -3882,7 +3894,8 @@ def _select_and_scatter_add_batch_rule(batched_args, batch_dims, **kwargs): _select_and_scatter_add_batch_rule def _select_and_gather_add_shape_rule( - tangents, operand, select_prim, window_dimensions, window_strides, padding): + tangents, operand, *, select_prim, window_dimensions, window_strides, + padding): if tangents.shape != operand.shape: msg = ("select_and_gather_add tangents and operand shapes must match, " "got {} and {}.") @@ -3899,7 +3912,7 @@ def _select_and_gather_add_shape_rule( def _select_and_gather_add_translation( - c, tangents, operand, select_prim, window_dimensions, window_strides, + c, tangents, operand, *, select_prim, window_dimensions, window_strides, padding, max_bits=64): shape = c.GetShape(operand) dtype = shape.numpy_dtype() @@ -3996,7 +4009,7 @@ def reducer(): return snd(out) def _select_and_gather_add_jvp( - primals, tangents, select_prim, window_dimensions, window_strides, + primals, tangents, *, select_prim, window_dimensions, window_strides, padding): source, operand = primals g_source, g_operand = tangents @@ -4013,7 +4026,7 @@ def _select_and_gather_add_jvp( return val_out, tangent_out def _select_and_gather_add_transpose( - t, tangents, operand, select_prim, window_dimensions, window_strides, + t, tangents, operand, *, select_prim, window_dimensions, window_strides, padding): assert ad.is_undefined_primal(tangents) and not ad.is_undefined_primal(operand) result = _select_and_scatter_add(t, operand, select_prim, window_dimensions, @@ -4021,7 +4034,7 @@ def _select_and_gather_add_transpose( return [result, None] def _select_and_gather_add_batching_rule( - batched_args, batch_dims, select_prim, window_dimensions, window_strides, + batched_args, batch_dims, *, select_prim, window_dimensions, window_strides, padding): t, x = batched_args t_bdim, x_bdim = batch_dims @@ -4104,23 +4117,24 @@ def _parallel_prefix_scan(x, axis: int, op: Callable, unit): _cumsum_prefix_scan = partial(_parallel_prefix_scan, op=add, unit=0) _cumprod_prefix_scan = partial(_parallel_prefix_scan, op=mul, unit=1) -def _cumred_shape_rule(x, axis): +def _cumred_shape_rule(x, *, axis: int): if axis < 0 or axis >= x.ndim: raise ValueError( "axis {} is out of bounds for array of shape {}".format(axis, x.shape)) return x.shape -def _cumsum_transpose_rule(t, axis: int): +def _cumsum_transpose_rule(t, *, axis: int): return [rev(cumsum(rev(t, (axis,)), axis=axis), (axis,))] -def _cumprod_jvp_rule(primals, tangents, axis: int): +def _cumprod_jvp_rule(primals, tangents, *, axis: int): # Irrespective of backend, we always use the parallel prefix scan # implementation when differentiating because reduce_window is not # arbitrarily differentiable. return api.jvp(partial(_cumprod_prefix_scan, axis=axis), primals, tangents) -def _cumred_tpu_translation_rule(window_reduce: Callable, unit, x, axis: int): +def _cumred_tpu_translation_rule(window_reduce: Callable, unit, x, *, + axis: int): # On TPU, an implementation using reduce_window is handled specially by the # compiler and is efficient. On other backends, it is O(n^2). n = x.shape[axis] @@ -4134,7 +4148,7 @@ def _cumred_tpu_translation_rule(window_reduce: Callable, unit, x, axis: int): window_dims[axis] = n return window_reduce(x, window_dims, strides, xla_client.PaddingType.VALID) -def _cumred_batch_rule(prim, batched_args, batch_dims, axis: int): +def _cumred_batch_rule(prim, batched_args, batch_dims, *, axis: int): operand, = batched_args bdim, = batch_dims axis = axis if axis < bdim else axis + 1 @@ -4162,11 +4176,11 @@ def _cumred_batch_rule(prim, batched_args, batch_dims, axis: int): sort_shape = lambda operand, dimension: operand.shape -def _sort_jvp_rule(g, operand, dimension): +def _sort_jvp_rule(g, operand, *, dimension): _, g_out = sort_key_val(operand, g, dimension) return g_out -def _sort_batch_rule(batched_args, batch_dims, dimension): +def _sort_batch_rule(batched_args, batch_dims, *, dimension): operand, = batched_args bdim, = batch_dims dimension = dimension % (operand.ndim - 1) @@ -4177,10 +4191,10 @@ def _sort_batch_rule(batched_args, batch_dims, dimension): ad.defjvp(sort_p, _sort_jvp_rule) batching.primitive_batchers[sort_p] = _sort_batch_rule -def _sort_key_val_abstract_eval(keys, values, dimension): +def _sort_key_val_abstract_eval(keys, values, *, dimension): return raise_to_shaped(keys), raise_to_shaped(values) -def _sort_key_val_jvp(primals, tangents, dimension): +def _sort_key_val_jvp(primals, tangents, *, dimension): # NOTE(mattjj): this re-sorts three times, but if we had a variadic # sort_key_val, or if we could apply a fixed permutation efficiently, we could # implement this jvp rule with a single sort. The apply_permutation primitive @@ -4195,17 +4209,18 @@ def _sort_key_val_jvp(primals, tangents, dimension): if keys_tangents is ad_util.zero: keys_tangents_out = ad_util.zero else: - keys_tangents_out = _sort_jvp_rule(keys_tangents, keys, dimension) + keys_tangents_out = _sort_jvp_rule(keys_tangents, keys, dimension=dimension) if values_tangents is ad_util.zero: values_tangents_out = ad_util.zero else: - values_tangents_out = _sort_jvp_rule(values_tangents, keys, dimension) + values_tangents_out = _sort_jvp_rule(values_tangents, keys, + dimension=dimension) tangents_out = keys_tangents_out, values_tangents_out return val_out, tangents_out -def _sort_key_val_transpose_rule(t, keys, values, dimension): +def _sort_key_val_transpose_rule(t, keys, values, *, dimension): t_keys, t_values = t assert t_keys is ad_util.zero iota = broadcasted_iota(onp.int32, keys.shape, dimension % keys.ndim) @@ -4214,7 +4229,7 @@ def _sort_key_val_transpose_rule(t, keys, values, dimension): values_result = sort_key_val(perm, t_values)[1] if ad.is_undefined_primal(values) else None return [keys_result, values_result] -def _sort_key_val_batch_rule(batched_args, batch_dims, dimension): +def _sort_key_val_batch_rule(batched_args, batch_dims, *, dimension): keys, values = batched_args keys_bdim, values_bdim = batch_dims assert keys_bdim is not None or values_bdim is not None @@ -4247,7 +4262,7 @@ def _sort_key_val_batch_rule(batched_args, batch_dims, dimension): ad.primitive_transposes[sort_key_val_p] = _sort_key_val_transpose_rule batching.primitive_batchers[sort_key_val_p] = _sort_key_val_batch_rule -def _top_k_abstract_eval(operand, k): +def _top_k_abstract_eval(operand, *, k): if k < 0: raise ValueError("k argument to top_k must be nonnegative, got {}".format(k)) if len(operand.shape) == 0: @@ -4356,13 +4371,13 @@ def infeed(token, shape=None): xs_and_token = infeed_p.bind(token, shapes=tuple(flat_shapes)) return (treedef.unflatten(xs_and_token[:-1]), xs_and_token[-1]) -def _infeed_abstract_eval(token, shapes=None): +def _infeed_abstract_eval(token, *, shapes): if token is not abstract_token: raise TypeError("First argument to infeed must be a token") return shapes + (abstract_token,) -def _infeed_translation_rule(c, token, shapes=None): +def _infeed_translation_rule(c, token, *, shapes): shape = tuple(map(xla.aval_to_xla_shape, shapes)) xs_and_token = c.Infeed(xla_client.Shape.tuple_shape(shape), token) xs = c.GetTupleElement(xs_and_token, 0) @@ -4410,7 +4425,7 @@ def rng_uniform(a, b, shape): """ return rng_uniform_p.bind(a, b, shape=tuple(shape)) -def _rng_uniform_abstract_eval(a, b, shape): +def _rng_uniform_abstract_eval(a, b, *, shape): if a.dtype != b.dtype: raise ValueError( "Arguments to rng_uniform must have identical dtypes, got {} " @@ -4421,7 +4436,7 @@ def _rng_uniform_abstract_eval(a, b, shape): .format(a.shape, b.shape)) return ShapedArray(shape, a.dtype) -def _rng_uniform_translation_rule(c, a, b, shape): +def _rng_uniform_translation_rule(c, a, b, *, shape): return c.RngUniform(a, b, shape) rng_uniform_p = Primitive("rng_uniform") From bd00e5919481e218ac8e6c5656fbabfbae4f8553 Mon Sep 17 00:00:00 2001 From: Jake VanderPlas Date: Tue, 7 Apr 2020 06:44:44 -0700 Subject: [PATCH 1042/1053] Implement np.copysign --- jax/numpy/lax_numpy.py | 8 ++++++++ tests/lax_numpy_test.py | 1 + 2 files changed, 9 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index fa19570dd570..5a24b6f613e0 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -493,6 +493,14 @@ def sign(x): return lax.sign(x) +@_wraps(onp.copysign) +def copysign(x1, x2): + if issubdtype(_dtype(x1), complexfloating) or issubdtype(_dtype(x2), complexfloating): + raise TypeError("copysign does not support complex-valued inputs") + x1, x2 = _promote_shapes("copysign", x1, x2) + return where(signbit(x2), -lax.abs(x1), lax.abs(x1)) + + @_wraps(onp.true_divide) def true_divide(x1, x2): x1, x2 = _promote_args_inexact("true_divide", x1, x2) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 2b23a09f7996..4522060c8e93 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -236,6 +236,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("sign", 1, number_dtypes + uint_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), + op_record('copysign', 2, default_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), op_record("sinc", 1, [t for t in number_dtypes if t != jnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], tolerance={onp.complex64: 1e-5}, inexact=True, From f20a1c968b2e0d2ec88319a2a17116793ee6fe4c Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 7 Apr 2020 11:21:39 -0400 Subject: [PATCH 1043/1053] Enable some GPU and TPU tests that now pass. (#2633) --- tests/lax_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/lax_test.py b/tests/lax_test.py index bb71604362f7..a7b8cf91b25f 100644 --- a/tests/lax_test.py +++ b/tests/lax_test.py @@ -503,7 +503,6 @@ def fun(lhs, rhs): # TODO(mattjj): test conv_general_dilated against numpy - @jtu.skip_on_devices("gpu") # b/147488740 def testConv0DIsDot(self): rng = jtu.rand_default() def args_maker(): @@ -2422,7 +2421,6 @@ def fun(operand): for rng_factory in [ jtu.rand_default if dtypes.issubdtype(dtype, onp.integer) else jtu.rand_small])) - @jtu.skip_on_devices("tpu") # TODO(b/153183305): wrong outputs def testCumulativeReduceGrad(self, op, shape, dtype, axis, rng_factory): rng = rng_factory() check_grads(partial(op, axis=axis), (rng(shape, dtype),), order=2) From 49c6c229da2644cd9e6105c0ed85ce551e42da48 Mon Sep 17 00:00:00 2001 From: Jake VanderPlas Date: Tue, 7 Apr 2020 09:50:40 -0700 Subject: [PATCH 1044/1053] Set check_dtypes=False in copysign --- tests/lax_numpy_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index 4522060c8e93..735c6a59b07e 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -236,7 +236,8 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("mod", 2, default_dtypes, all_shapes, jtu.rand_nonzero, []), op_record("sign", 1, number_dtypes + uint_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), - op_record('copysign', 2, default_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), + op_record('copysign', 2, default_dtypes, all_shapes, jtu.rand_some_inf_and_nan, [], + check_dtypes=False), op_record("sinc", 1, [t for t in number_dtypes if t != jnp.bfloat16], all_shapes, jtu.rand_default, ["rev"], tolerance={onp.complex64: 1e-5}, inexact=True, From 2512ec6ebebf1b26d2aefbe618b4c147c251d194 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Tue, 7 Apr 2020 13:25:50 -0400 Subject: [PATCH 1045/1053] Glob over subdirectories in top-level BUILD file. (#2636) Makes BUILD file more robust to directory structure changes. --- jax/BUILD | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/jax/BUILD b/jax/BUILD index 6b71ade5ff13..b7be05c3d33e 100644 --- a/jax/BUILD +++ b/jax/BUILD @@ -27,16 +27,14 @@ pytype_library( srcs = glob( [ "*.py", - "lib/*.py", - "interpreters/*.py", - "lax/*.py", - "numpy/*.py", - "ops/*.py", - "scipy/*.py", - "scipy/stats/*.py", - "third_party/*.py", - "third_party/numpy/*.py", - "nn/*.py", + "lib/**/*.py", + "interpreters/**/*.py", + "lax/**/*.py", + "numpy/**/*.py", + "ops/**/*.py", + "scipy/**/*.py", + "third_party/**/*.py", + "nn/**/*.py", ], exclude = [ "*_test.py", From 4d7b63c5ecb92419319fa1f5809d595ebce43fa7 Mon Sep 17 00:00:00 2001 From: Jacob Kelly Date: Tue, 7 Apr 2020 17:55:07 -0400 Subject: [PATCH 1046/1053] add expm1 and log1p --- jax/experimental/jet.py | 23 +++++++++++++++++++++++ tests/jet_test.py | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/jax/experimental/jet.py b/jax/experimental/jet.py index 0e8973b5ba5c..22be6005cc7c 100644 --- a/jax/experimental/jet.py +++ b/jax/experimental/jet.py @@ -228,6 +228,17 @@ def _exp_taylor(primals_in, series_in): return primal_out, series_out jet_rules[lax.exp_p] = _exp_taylor +def _expm1_taylor(primals_in, series_in): + x, = primals_in + series, = series_in + u = [x] + series + v = [lax.exp(x)] + [None] * len(series) + for k in range(1,len(v)): + v[k] = fact(k-1) * sum([_scale(k, j)* v[k-j] * u[j] for j in range(1, k+1)]) + primal_out, *series_out = v + return lax.expm1(x), series_out +jet_rules[lax.expm1_p] = _expm1_taylor + def _log_taylor(primals_in, series_in): x, = primals_in series, = series_in @@ -240,6 +251,18 @@ def _log_taylor(primals_in, series_in): return primal_out, series_out jet_rules[lax.log_p] = _log_taylor +def _log1p_taylor(primals_in, series_in): + x, = primals_in + series, = series_in + u = [x + 1] + series + v = [lax.log(x + 1)] + [None] * len(series) + for k in range(1, len(v)): + conv = sum([_scale(k, j) * v[j] * u[k-j] for j in range(1, k)]) + v[k] = (u[k] - fact(k - 1) * conv) / u[0] + primal_out, *series_out = v + return primal_out, series_out +jet_rules[lax.log1p_p] = _log1p_taylor + def _div_taylor_rule(primals_in, series_in, **params): x, y = primals_in x_terms, y_terms = series_in diff --git a/tests/jet_test.py b/tests/jet_test.py index 033f1fec6053..2e79e6d6791d 100644 --- a/tests/jet_test.py +++ b/tests/jet_test.py @@ -150,6 +150,10 @@ def test_stopgrad(self): self.unary_check(lax.stop_gradient) def test_abs(self): self.unary_check(np.abs) @jtu.skip_on_devices("tpu") def test_fft(self): self.unary_check(np.fft.fft) + @jtu.skip_on_devices("tpu") + def test_log1p(self): self.unary_check(np.log1p, lims=[0, 4.]) + @jtu.skip_on_devices("tpu") + def test_expm1(self): self.unary_check(np.expm1) @jtu.skip_on_devices("tpu") def test_div(self): self.binary_check(lambda x, y: x / y, lims=[0.8, 4.0]) From f0ab673d9e0cac0bc5ffa0bb5dbf6c2537fb51b8 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 7 Apr 2020 18:21:04 -0700 Subject: [PATCH 1047/1053] Fully stage out scan under jit. (#2638) This prevents creating large arrays from the results of partial_eval. --- jax/lax/lax_control_flow.py | 5 +++++ tests/api_test.py | 15 ++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/jax/lax/lax_control_flow.py b/jax/lax/lax_control_flow.py index a460e28c0335..9f981fca0322 100644 --- a/jax/lax/lax_control_flow.py +++ b/jax/lax/lax_control_flow.py @@ -971,6 +971,11 @@ def _prune_zeros(ts): def _scan_partial_eval(trace, *tracers, forward, length, num_consts, num_carry, jaxpr, linear): + if trace.master.trace_type is pe.StagingJaxprTrace: + params = {"forward": forward, "length": length, "num_consts": num_consts, + "num_carry": num_carry, "jaxpr": jaxpr, "linear": linear} + return trace.default_process_primitive(scan_p, tracers, params) + num_xs = len(jaxpr.in_avals) - num_carry - num_consts num_ys = len(jaxpr.out_avals) - num_carry diff --git a/tests/api_test.py b/tests/api_test.py index df1ab6db245b..ade011cefbdb 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1765,18 +1765,19 @@ def body(carry, aelems): return lax.scan(body, 0., (arr, ones)) jaxpr = api.make_jaxpr(func11)(onp.ones(16), 5.) + # TODO(#2640): update docs/jaxpr.rst to reflect new jaxpr self.assertMultiLineStrippedEqual(""" { lambda c ; a b. let d e = scan[ forward=True - jaxpr={ lambda ; a b c d e. - let f = mul c e - g = add b f - h = add g a - in (h, b) } + jaxpr={ lambda ; f a b c. + let d = mul b c + e = add a d + g = add e f + in (g, a) } length=16 - linear=(False, False, False, True, False) + linear=(False, False, False, False) num_carry=1 - num_consts=1 ] b 0.0 a * c + num_consts=1 ] b 0.0 a c in (d, e) } """, str(jaxpr)) From f8dc650b2a3aa06f27d02380ed455b20ff807215 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Tue, 7 Apr 2020 19:03:41 -0700 Subject: [PATCH 1048/1053] Update scan jaxpr documentation. (#2641) Closes #2640. --- docs/jaxpr.rst | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/jaxpr.rst b/docs/jaxpr.rst index 034e776761a8..c08de9b000ba 100644 --- a/docs/jaxpr.rst +++ b/docs/jaxpr.rst @@ -385,29 +385,39 @@ For the example consider the function ``func11`` below:: num_carry=1 num_consts=1 ] b 0.0 a * c in (d, e) } + { lambda c ; a b. + let d e = scan[ forward=True + jaxpr={ lambda ; f a b c. + let d = mul b c + e = add a d + g = add e f + in (g, a) } + length=16 + linear=(False, False, False, False) + num_carry=1 + num_consts=1 ] b 0.0 a c + in (d, e) } The top-level jaxpr has one constvar ``c`` corresponding to the ``ones`` constant, and two input variables corresponding to the arguments ``arr`` and ``extra``. -The body of the scan has 5 input variables, of which: +The body of the scan has 4 input variables, of which: - * one (``a``) is a constant (since ``num_consts = 1``), and stands for the + * one (``f``) is a constant (since ``num_consts = 1``), and stands for the captured variable ``extra`` used in the loop body, - * one (``b``) is the value of the carry (since ``num_carry = 1``) - * The remaining 3 are the input values. Notice that only ``c`` and ``e`` are used, - and stand respectively for the array element from the first array passed to - lax.scan (``arr``) and to the second array (``ones``). The input variables - (``d``) seems to be an artifact of the translation. + * one (``a``) is the value of the carry (since ``num_carry = 1``) + * The remaining 2 are the input values. ``b`` is the array element from the + first array passed to lax.scan (``arr``) and ``c`` is the second array + (``ones``). The ``linear`` parameter describes for each of the input variables whether they -are guaranteed to be used linearly in the body. Here, only the unused input -variable is marked linear. Once the scan goes through linearization, more arguments -will be linear. +are guaranteed to be used linearly in the body. Once the scan goes through +linearization, more arguments will be linear. -The scan primitive takes 5 arguments: ``b 0.0 a * c``, of which: +The scan primitive takes 4 arguments: ``b 0.0 a c``, of which: * one is the free variable for the body * one is the initial value of the carry - * The next 3 are the arrays over which the scan operates. The middle one is not used (*). + * The next 2 are the arrays over which the scan operates. XLA_call ^^^^^^^^ @@ -490,4 +500,3 @@ value of this parameter is a Jaxpr with 3 input variables: The parameter ``mapped_invars`` specify which of the input variables should be mapped and which should be broadcast. In our example, the value of ``extra`` is broadcast, the other input values are mapped. - From 46a89229fa5a53e631e14c30891e320c4da8b3bc Mon Sep 17 00:00:00 2001 From: Jake VanderPlas Date: Tue, 7 Apr 2020 20:50:23 -0700 Subject: [PATCH 1049/1053] Add implementation of np.trunc --- jax/numpy/lax_numpy.py | 6 ++++++ tests/lax_numpy_test.py | 1 + 2 files changed, 7 insertions(+) diff --git a/jax/numpy/lax_numpy.py b/jax/numpy/lax_numpy.py index b89658e6b638..84ea44b69c53 100644 --- a/jax/numpy/lax_numpy.py +++ b/jax/numpy/lax_numpy.py @@ -645,6 +645,12 @@ def signbit(x): x = lax.bitcast_convert_type(x, int_type) return lax.convert_element_type(x >> (info.nexp + info.nmant), onp.bool) + +@_wraps(onp.trunc) +def trunc(x): + return where(lax.lt(x, lax._const(x, 0)), lax.ceil(x), lax.floor(x)) + + def _normalize_float(x): info = finfo(_dtype(x)) cond = lax.abs(x) < info.tiny diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py index dfc322b5d474..663dce1b5749 100644 --- a/tests/lax_numpy_test.py +++ b/tests/lax_numpy_test.py @@ -132,6 +132,7 @@ def op_record(name, nargs, dtypes, shapes, rng_factory, diff_modes, op_record("subtract", 2, number_dtypes, all_shapes, jtu.rand_default, ["rev"]), op_record("signbit", 1, default_dtypes + bool_dtypes, all_shapes, jtu.rand_some_inf_and_nan, ["rev"]), + op_record("trunc", 1, float_dtypes, all_shapes, jtu.rand_some_inf_and_nan, []), op_record("sin", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], inexact=True), op_record("cos", 1, number_dtypes, all_shapes, jtu.rand_default, ["rev"], From fcefc7e8f17c67f5f7e9d0ceee7a165ee1f43cb2 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 8 Apr 2020 13:02:58 -0400 Subject: [PATCH 1050/1053] Add a link to Google's codesearch for JAX. (#2646) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ab903f6cc6ab..5e6f06727b99 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ | [**Install guide**](#installation) | [**Change logs**](https://jax.readthedocs.io/en/latest/CHANGELOG.html) | [**Reference docs**](https://jax.readthedocs.io/en/latest/) +| [**Code search**](https://cs.opensource.google/jax/jax) **Announcement:** JAX has dropped Python 2 support, and requires Python 3.6 or newer. See [docs/CHANGELOG.rst](https://jax.readthedocs.io/en/latest/CHANGELOG.html). From 5174f6d5dc6c46b89f1680278bd21a75935049dc Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Wed, 8 Apr 2020 14:13:15 -0400 Subject: [PATCH 1051/1053] Add type annotations to user-facing functions in lax.py (#2644) * Add type annotations to user-facing functions in lax.py * Remove redundant comment. --- jax/lax/lax.py | 530 ++++++++++++++++++++++++++++--------------------- 1 file changed, 300 insertions(+), 230 deletions(-) diff --git a/jax/lax/lax.py b/jax/lax/lax.py index 7da7622f6b73..076847ad2b12 100644 --- a/jax/lax/lax.py +++ b/jax/lax/lax.py @@ -20,7 +20,8 @@ import itertools import operator import string -from typing import Any, Callable +from typing import (Any, Callable, List, NamedTuple, Optional, Sequence, Union, + Tuple, Type) import warnings import numpy as onp @@ -56,6 +57,9 @@ _min = builtins.max _reduce = functools.reduce +Array = Any +DType = Any +Shape = Sequence[int] @cache() def broadcast_shapes(*shapes): @@ -76,11 +80,11 @@ def _identity(x): return x ### traceables -def neg(x): +def neg(x: Array) -> Array: r"""Elementwise negation: :math:`-x`.""" return neg_p.bind(x) -def sign(x): +def sign(x: Array) -> Array: r"""Elementwise sign. For floating-point inputs, returns @@ -104,26 +108,26 @@ def sign(x): """ return sign_p.bind(x) -def nextafter(x1, x2): +def nextafter(x1: Array, x2: Array) -> Array: r"""Returns the next representable value after `x1` in the direction of `x2`.""" return nextafter_p.bind(_brcast(x1, x2), _brcast(x2, x1)) -def floor(x): +def floor(x: Array) -> Array: r"""Elementwise floor: :math:`\left\lfloor x \right\rfloor`.""" return floor_p.bind(x) -def ceil(x): +def ceil(x: Array) -> Array: r"""Elementwise ceiling: :math:`\left\lceil x \right\rceil`.""" return ceil_p.bind(x) -def round(x): +def round(x: Array) -> Array: r"""Elementwise round. Rounds values to the nearest integer. Halfway values (e.g., `0.5`) are rounded away from zero.""" return round_p.bind(x) -def is_finite(x): +def is_finite(x: Array) -> Array: r"""Elementwise :math:`\mathrm{isfinite}`. For each element x returns `True` if and only if x is not :math:`\pm\infty` or @@ -131,215 +135,215 @@ def is_finite(x): """ return is_finite_p.bind(x) -def exp(x): +def exp(x: Array) -> Array: r"""Elementwise exponential: :math:`e^x`.""" return exp_p.bind(x) -def expm1(x): +def expm1(x: Array) -> Array: r"""Elementwise :math:`e^{x - 1}`.""" return expm1_p.bind(x) -def log(x): +def log(x: Array) -> Array: r"""Elementwise natural logarithm: :math:`\mathrm{log}(x)`.""" return log_p.bind(x) -def log1p(x): +def log1p(x: Array) -> Array: r"""Elementwise :math:`\mathrm{log}(1 + x)`.""" return log1p_p.bind(x) -def tanh(x): +def tanh(x: Array) -> Array: r"""Elementwise hyperbolic tangent: :math:`\mathrm{tanh}(x)`.""" return tanh_p.bind(x) -def sin(x): +def sin(x: Array) -> Array: r"""Elementwise sine: :math:`\mathrm{sin}(x)`.""" return sin_p.bind(x) -def cos(x): +def cos(x: Array) -> Array: r"""Elementwise cosine: :math:`\mathrm{cos}(x)`.""" return cos_p.bind(x) -def atan2(x, y): +def atan2(x: Array, y: Array) -> Array: r"""Elementwise arc tangent of two variables: :math:`\mathrm{atan}({x \over y})`.""" return atan2_p.bind(x, y) -def betainc(a, b, x): +def betainc(a: Array, b: Array, x: Array) -> Array: r"""Elementwise regularized incomplete beta integral.""" a = _brcast(_brcast(a, b), x) b = _brcast(b, a) x = _brcast(x, a) return regularized_incomplete_beta_p.bind(a, b, x) -def lgamma(x): +def lgamma(x: Array) -> Array: r"""Elementwise log gamma: :math:`\mathrm{log}(\Gamma(x))`.""" return lgamma_p.bind(x) -def digamma(x): +def digamma(x: Array) -> Array: r"""Elementwise digamma: :math:`\psi(x)`.""" return digamma_p.bind(x) -def igamma(a, x): +def igamma(a: Array, x: Array) -> Array: r"""Elementwise regularized incomplete gamma function.""" return igamma_p.bind(_brcast(a, x), _brcast(x, a)) -def igammac(a, x): +def igammac(a: Array, x: Array) -> Array: r"""Elementwise complementary regularized incomplete gamma function.""" return igammac_p.bind(_brcast(a, x), _brcast(x, a)) -def bessel_i0e(x): +def bessel_i0e(x: Array) -> Array: r"""Exponentially scaled modified Bessel function of order 0: :math:`\mathrm{i0e}(x) = e^{-|x|} \mathrm{i0}(x)` """ return bessel_i0e_p.bind(x) -def bessel_i1e(x): +def bessel_i1e(x: Array) -> Array: r"""Exponentially scaled modified Bessel function of order 1: :math:`\mathrm{i1e}(x) = e^{-|x|} \mathrm{i1}(x)` """ return bessel_i1e_p.bind(x) -def erf(x): +def erf(x: Array) -> Array: r"""Elementwise error function: :math:`\mathrm{erf}(x)`.""" return erf_p.bind(x) -def erfc(x): +def erfc(x: Array) -> Array: r"""Elementwise complementary error function: :math:`\mathrm{erfc}(x) = 1 - \mathrm{erf}(x)`.""" return erfc_p.bind(x) -def erf_inv(x): +def erf_inv(x: Array) -> Array: r"""Elementwise inverse error function: :math:`\mathrm{erf}^{-1}(x)`.""" return erf_inv_p.bind(x) -def real(x): +def real(x: Array) -> Array: r"""Elementwise extract real part: :math:`\mathrm{Re}(x)`. Returns the real part of a complex number. """ return real_p.bind(x) -def imag(x): +def imag(x: Array) -> Array: r"""Elementwise extract imaginary part: :math:`\mathrm{Im}(x)`. Returns the imaginary part of a complex number. """ return imag_p.bind(x) -def complex(x, y): +def complex(x: Array, y: Array) -> Array: r"""Elementwise make complex number: :math:`x + jy`. Builds a complex number from real and imaginary parts. """ return complex_p.bind(_brcast(x, y), _brcast(y, x)) -def conj(x): +def conj(x: Array) -> Array: r"""Elementwise complex conjugate function: :math:`\overline{x}`.""" return conj_p.bind(x, input_dtype=_dtype(x)) -def abs(x): +def abs(x: Array) -> Array: r"""Elementwise absolute value: :math:`|x|`.""" return abs_p.bind(x) -def pow(x, y): +def pow(x: Array, y: Array) -> Array: r"""Elementwise power: :math:`x^y`.""" return pow_p.bind(x, y) -def sqrt(x): +def sqrt(x: Array) -> Array: r"""Elementwise square root: :math:`\sqrt{x}`.""" return sqrt_p.bind(x) -def rsqrt(x): +def rsqrt(x: Array) -> Array: r"""Elementwise reciprocal square root: :math:`1 \over \sqrt{x}.""" return rsqrt_p.bind(x) -def bitwise_not(x): +def bitwise_not(x: Array) -> Array: r"""Elementwise NOT: :math:`\neg x`.""" return not_p.bind(x) -def bitwise_and(x, y): +def bitwise_and(x: Array, y: Array) -> Array: r"""Elementwise AND: :math:`x \wedge y`.""" return and_p.bind(x, y) -def bitwise_or(x, y): +def bitwise_or(x: Array, y: Array) -> Array: r"""Elementwise OR: :math:`x \vee y`.""" return or_p.bind(x, y) -def bitwise_xor(x, y): +def bitwise_xor(x: Array, y: Array) -> Array: r"""Elementwise exclusive OR: :math:`x \oplus y`.""" return xor_p.bind(x, y) -def add(x, y): +def add(x: Array, y: Array) -> Array: r"""Elementwise addition: :math:`x + y`.""" return add_p.bind(x, y) -def sub(x, y): +def sub(x: Array, y: Array) -> Array: r"""Elementwise subtraction: :math:`x - y`.""" return sub_p.bind(x, y) -def mul(x, y): +def mul(x: Array, y: Array) -> Array: r"""Elementwise multiplication: :math:`x \times y`.""" return mul_p.bind(x, y) -def div(x, y): +def div(x: Array, y: Array) -> Array: r"""Elementwise division: :math:`x \over y`.""" return div_p.bind(x, y) -def rem(x, y): +def rem(x: Array, y: Array) -> Array: r"""Elementwise remainder: :math:`x \bmod y`.""" return rem_p.bind(x, y) -def max(x, y): +def max(x: Array, y: Array) -> Array: r"""Elementwise maximum: :math:`\mathrm{max}(x, y)` For complex numbers, uses a lexicographic comparison on the `(real, imaginary)` pairs.""" return max_p.bind(x, y) -def min(x, y): +def min(x: Array, y: Array) -> Array: r"""Elementwise minimum: :math:`\mathrm{min}(x, y)` For complex numbers, uses a lexicographic comparison on the `(real, imaginary)` pairs.""" return min_p.bind(x, y) -def shift_left(x, y): +def shift_left(x: Array, y: Array) -> Array: r"""Elementwise left shift: :math:`x \ll y`.""" return shift_left_p.bind(x, y) -def shift_right_arithmetic(x, y): +def shift_right_arithmetic(x: Array, y: Array) -> Array: r"""Elementwise arithmetic right shift: :math:`x \gg y`.""" return shift_right_arithmetic_p.bind(x, y) -def shift_right_logical(x, y): +def shift_right_logical(x: Array, y: Array) -> Array: r"""Elementwise logical right shift: :math:`x \gg y`.""" return shift_right_logical_p.bind(x, y) -def eq(x, y): +def eq(x: Array, y: Array) -> Array: r"""Elementwise equals: :math:`x = y`.""" return eq_p.bind(x, y) -def ne(x, y): +def ne(x: Array, y: Array) -> Array: r"""Elementwise not-equals: :math:`x \neq y`.""" return ne_p.bind(x, y) -def ge(x, y): +def ge(x: Array, y: Array) -> Array: r"""Elementwise greater-than-or-equals: :math:`x \geq y`.""" return ge_p.bind(x, y) -def gt(x, y): +def gt(x: Array, y: Array) -> Array: r"""Elementwise greater-than: :math:`x > y`.""" return gt_p.bind(x, y) -def le(x, y): +def le(x: Array, y: Array) -> Array: r"""Elementwise less-than-or-equals: :math:`x \leq y`.""" return le_p.bind(x, y) -def lt(x, y): +def lt(x: Array, y: Array) -> Array: r"""Elementwise less-than: :math:`x < y`.""" return lt_p.bind(x, y) -def convert_element_type(operand, new_dtype): +def convert_element_type(operand: Array, new_dtype: DType) -> Array: """Elementwise cast. Wraps XLA's `ConvertElementType @@ -379,7 +383,7 @@ def convert_element_type(operand, new_dtype): return convert_element_type_p.bind( operand, new_dtype=new_dtype, old_dtype=old_dtype) -def bitcast_convert_type(operand, new_dtype): +def bitcast_convert_type(operand: Array, new_dtype: DType) -> Array: """Elementwise bitcast. Wraps XLA's `BitcastConvertType @@ -402,7 +406,7 @@ def bitcast_convert_type(operand, new_dtype): else: return operand -def clamp(min, x, max): +def clamp(min: Array, x: Array, max: Array) -> Array: r"""Elementwise clamp. Returns :math:`\mathrm{clamp}(x) = \begin{cases} @@ -413,7 +417,7 @@ def clamp(min, x, max): """ return clamp_p.bind(min, x, max) -def concatenate(operands, dimension): +def concatenate(operands: Sequence[Array], dimension: int) -> Array: """Concatenates a sequence of arrays along `dimension`. Wraps XLA's `Concatenate @@ -432,10 +436,33 @@ def concatenate(operands, dimension): Precision = xla_client.PrecisionConfig.Precision Precision.__str__ = lambda precision: precision.name +PrecisionType = Any -def conv_general_dilated(lhs, rhs, window_strides, padding, lhs_dilation=None, - rhs_dilation=None, dimension_numbers=None, - feature_group_count=1, precision=None): +class ConvDimensionNumbers(NamedTuple): + """Describes batch, spatial, and feature dimensions of a convolution. + + Args: + lhs_spec: a tuple of nonnegative integer dimension numbers containing + `(batch dimension, feature dimension, spatial dimensions...)`. + rhs_spec: a tuple of nonnegative integer dimension numbers containing + `(out feature dimension, in feature dimension, spatial dimensions...)`. + out_spec: a tuple of nonnegative integer dimension numbers containing + `(batch dimension, feature dimension, spatial dimensions...)`. + """ + lhs_spec: Sequence[int] + rhs_spec: Sequence[int] + out_spec: Sequence[int] + +ConvGeneralDilatedDimensionNumbers = Union[ + None, ConvDimensionNumbers, Tuple[str, str, str]] + +def conv_general_dilated( + lhs: Array, rhs: Array, window_strides: Sequence[int], + padding: Union[str, Sequence[Tuple[int, int]]], + lhs_dilation: Optional[Sequence[int]] = None, + rhs_dilation: Optional[Sequence[int]] = None, + dimension_numbers: ConvGeneralDilatedDimensionNumbers = None, + feature_group_count: int = 1, precision: Optional[PrecisionType] = None) -> Array: """General n-dimensional convolution operator, with optional dilation. Wraps XLA's `Conv @@ -490,9 +517,11 @@ def conv_general_dilated(lhs, rhs, window_strides, padding, lhs_dilation=None, If `dimension_numbers` is `None`, the default is `('NCHW', 'OIHW', 'NCHW')` (for a 2D convolution). """ - if type(dimension_numbers) is not ConvDimensionNumbers: - dimension_numbers = conv_dimension_numbers( - lhs.shape, rhs.shape, dimension_numbers) + dnums: ConvDimensionNumbers + if isinstance(dimension_numbers, ConvDimensionNumbers): + dnums = dimension_numbers + else: + dnums = conv_dimension_numbers(lhs.shape, rhs.shape, dimension_numbers) if lhs_dilation is None: lhs_dilation = (1,) * (lhs.ndim - 2) elif isinstance(padding, str) and not len(lhs_dilation) == lhs_dilation.count(1): @@ -503,7 +532,7 @@ def conv_general_dilated(lhs, rhs, window_strides, padding, lhs_dilation=None, if rhs_dilation is None: rhs_dilation = (1,) * (rhs.ndim - 2) if isinstance(padding, str): - lhs_perm, rhs_perm, _ = dimension_numbers + lhs_perm, rhs_perm, _ = dnums rhs_shape = onp.take(rhs.shape, rhs_perm)[2:] effective_rhs_shape = [(k-1) * r + 1 for k, r in zip(rhs_shape, rhs_dilation)] padding = padtype_to_pads( @@ -512,12 +541,12 @@ def conv_general_dilated(lhs, rhs, window_strides, padding, lhs_dilation=None, return conv_general_dilated_p.bind( lhs, rhs, window_strides=tuple(window_strides), padding=tuple(padding), lhs_dilation=tuple(lhs_dilation), rhs_dilation=tuple(rhs_dilation), - dimension_numbers=dimension_numbers, + dimension_numbers=dnums, feature_group_count=feature_group_count, lhs_shape=lhs.shape, rhs_shape=rhs.shape, precision=_canonicalize_precision(precision)) -def dot(lhs, rhs, precision=None): +def dot(lhs: Array, rhs: Array, precision: Optional[PrecisionType] = None) -> Array: """Vector/vector, matrix/vector, and matrix/matrix multiplication. Wraps XLA's `Dot @@ -542,7 +571,12 @@ def dot(lhs, rhs, precision=None): raise TypeError("Incompatible shapes for dot: got {} and {}.".format( lhs.shape, rhs.shape)) -def dot_general(lhs, rhs, dimension_numbers, precision=None): + +DotDimensionNumbers = Tuple[Tuple[Sequence[int], Sequence[int]], + Tuple[Sequence[int], Sequence[int]]] + +def dot_general(lhs: Array, rhs: Array, dimension_numbers: DotDimensionNumbers, + precision: Optional[PrecisionType] = None) -> Array: """More general contraction operator. Wraps XLA's `DotGeneral @@ -561,9 +595,9 @@ def dot_general(lhs, rhs, dimension_numbers, precision=None): Returns: An array containing the result. """ - contract_dims, batch_dims = dimension_numbers - contract_dims = tuple(map(tuple, contract_dims)) - batch_dims = tuple(map(tuple, batch_dims)) + contract_dims_seq, batch_dims_seq = dimension_numbers + contract_dims = tuple(map(lambda x: tuple(x), contract_dims_seq)) + batch_dims = tuple(map(lambda x: tuple(x), batch_dims_seq)) if not dtypes.issubdtype(lhs.dtype, onp.inexact): # TODO(b/134526360): XLA doesn't support bool or integer dots, so we emit a # sum of products instead. @@ -596,7 +630,7 @@ def dot_general(lhs, rhs, dimension_numbers, precision=None): dimension_numbers=(contract_dims, batch_dims), precision=_canonicalize_precision(precision)) -def broadcast(operand, sizes): +def broadcast(operand: Array, sizes: Sequence[int]) -> Array: """Broadcasts an array, adding new major dimensions. Wraps XLA's `Broadcast @@ -614,7 +648,8 @@ def broadcast(operand, sizes): dims = tuple(range(len(sizes), len(sizes) + onp.ndim(operand))) return broadcast_in_dim(operand, tuple(sizes) + onp.shape(operand), dims) -def broadcast_in_dim(operand, shape, broadcast_dimensions): +def broadcast_in_dim(operand: Array, shape: Shape, + broadcast_dimensions: Sequence[int]) -> Array: """Wraps XLA's `BroadcastInDim `_ operator. @@ -627,7 +662,8 @@ def broadcast_in_dim(operand, shape, broadcast_dimensions): operand, shape=tuple(shape), broadcast_dimensions=tuple(broadcast_dimensions)) -def reshape(operand, new_sizes, dimensions=None): +def reshape(operand: Array, new_sizes: Shape, + dimensions: Optional[Sequence[int]] = None) -> Array: """Wraps XLA's `Reshape `_ operator. @@ -639,31 +675,35 @@ def reshape(operand, new_sizes, dimensions=None): if onp.shape(operand) and same_shape and same_dims: return operand else: - return reshape_p.bind(operand, new_sizes=new_sizes, - dimensions=None if same_dims else tuple(dimensions)) + return reshape_p.bind( + operand, new_sizes=new_sizes, + dimensions=None if dimensions is None or same_dims else tuple(dimensions)) -def pad(operand, padding_value, padding_config): +def pad(operand: Array, padding_value: Array, + padding_config: Sequence[Tuple[int, int, int]]) -> Array: """Wraps XLA's `Pad `_ operator. """ return pad_p.bind(operand, padding_value, padding_config=tuple(padding_config)) -def rev(operand, dimensions): +def rev(operand: Array, dimensions: Sequence[int]) -> Array: """Wraps XLA's `Rev `_ operator. """ return rev_p.bind(operand, dimensions=tuple(dimensions)) -def select(pred, on_true, on_false): +def select(pred: Array, on_true: Array, on_false: Array) -> Array: """Wraps XLA's `Select `_ operator. """ return select_p.bind(pred, on_true, on_false) -def slice(operand: Any, start_indices, limit_indices, strides=None): +def slice(operand: Array, start_indices: Sequence[int], + limit_indices: Sequence[int], + strides: Optional[Sequence[int]] = None) -> Array: """Wraps XLA's `Slice `_ operator. @@ -677,7 +717,8 @@ def slice(operand: Any, start_indices, limit_indices, strides=None): limit_indices=tuple(limit_indices), strides=None if strides is None else tuple(strides)) -def dynamic_slice(operand, start_indices, slice_sizes): +def dynamic_slice(operand: Array, start_indices: Sequence[Array], + slice_sizes: Shape) -> Array: """Wraps XLA's `DynamicSlice `_ operator. @@ -695,7 +736,8 @@ def dynamic_slice(operand, start_indices, slice_sizes): return dynamic_slice_p.bind(operand, *start_indices, slice_sizes=tuple(slice_sizes)) -def dynamic_update_slice(operand, update, start_indices): +def dynamic_update_slice(operand: Array, update: Array, + start_indices: Array) -> Array: """Wraps XLA's `DynamicUpdateSlice `_ operator. @@ -711,7 +753,37 @@ def dynamic_update_slice(operand, update, start_indices): start_indices = _dynamic_slice_indices(operand, start_indices) return dynamic_update_slice_p.bind(operand, update, *start_indices) -def gather(operand, start_indices, dimension_numbers, slice_sizes): + +class GatherDimensionNumbers(NamedTuple): + """ + Describes the dimension number arguments to an `XLA's Gather operator + `_. See the XLA + documentation for more details of what the dimension numbers mean. + + Args: + offset_dims: the set of dimensions in the `gather` output that offset into + an array sliced from `operand`. Must be a tuple of integers in ascending + order, each representing a dimension number of the output. + collapsed_slice_dims: the set of dimensions `i` in `operand` that have + `slice_sizes[i] == 1` and that should not have a corresponding dimension + in the output of the gather. Must be a tuple of integers in ascending + order. + start_index_map: for each dimension in `start_indices`, gives the + corresponding dimension in `operand` that is to be sliced. Must be a + tuple of integers with size equal to `start_indices.shape[-1]`. + + Unlike XLA's `GatherDimensionNumbers` structure, `index_vector_dim` is + implicit; there is always an index vector dimension and it must always be the + last dimension. To gather scalar indices, add a trailing dimension of size 1. + """ + offset_dims: Sequence[int] + collapsed_slice_dims: Sequence[int] + start_index_map: Sequence[int] + + +def gather(operand: Array, start_indices: Array, + dimension_numbers: GatherDimensionNumbers, + slice_sizes: Shape) -> Array: """Gather operator. Wraps `XLA's Gather operator @@ -737,7 +809,35 @@ def gather(operand, start_indices, dimension_numbers, slice_sizes): operand, start_indices, dimension_numbers=dimension_numbers, slice_sizes=canonicalize_shape(slice_sizes)) -def scatter_add(operand, scatter_indices, updates, dimension_numbers): + +class ScatterDimensionNumbers(NamedTuple): + """ + Describes the dimension number arguments to an `XLA's Scatter operator + `_. See the XLA + documentation for more details of what the dimension numbers mean. + + Args: + update_window_dims: the set of dimensions in the `updates` that are window + dimensions. Must be a tuple of integers in ascending + order, each representing a dimension number. + inserted_window_dims: the set of size 1 window dimensions that must be inserted + into the shape of `updates`. Must be a tuple of integers in ascending + order, each representing a dimension number of the output. These are the + mirror image of `collapsed_slice_dims` in the case of `gather`. + scatter_dims_to_operand_dims: for each dimension in `scatter_indices`, gives + the corresponding dimension in `operand`. Must be a sequence of integers + with size equal to indices.shape[-1]. + + Unlike XLA's `ScatterDimensionNumbers` structure, `index_vector_dim` is + implicit; there is always an index vector dimension and it must always be the + last dimension. To scatter scalar indices, add a trailing dimension of size 1. + """ + update_window_dims: Sequence[int] + inserted_window_dims: Sequence[int] + scatter_dims_to_operand_dims: Sequence[int] + +def scatter_add(operand: Array, scatter_indices: Array, updates: Array, + dimension_numbers: ScatterDimensionNumbers) -> Array: """Scatter-add operator. Wraps `XLA's Scatter operator @@ -763,7 +863,8 @@ def scatter_add(operand, scatter_indices, updates, dimension_numbers): operand, scatter_indices, updates, update_jaxpr=jaxpr, update_consts=consts, dimension_numbers=dimension_numbers) -def scatter_min(operand, scatter_indices, updates, dimension_numbers): +def scatter_min(operand: Array, scatter_indices: Array, updates: Array, + dimension_numbers: ScatterDimensionNumbers) -> Array: """Scatter-min operator. Wraps `XLA's Scatter operator @@ -789,7 +890,8 @@ def scatter_min(operand, scatter_indices, updates, dimension_numbers): operand, scatter_indices, updates, update_jaxpr=jaxpr, update_consts=consts, dimension_numbers=dimension_numbers) -def scatter_max(operand, scatter_indices, updates, dimension_numbers): +def scatter_max(operand: Array, scatter_indices: Array, updates: Array, + dimension_numbers: ScatterDimensionNumbers) -> Array: """Scatter-max operator. Wraps `XLA's Scatter operator @@ -818,7 +920,8 @@ def scatter_max(operand, scatter_indices, updates, dimension_numbers): # Define this outside of scatter to ensure cache hits. _scatter_reduction_computation = lambda x, y: y -def scatter(operand, scatter_indices, updates, dimension_numbers): +def scatter(operand: Array, scatter_indices:Array, updates: Array, + dimension_numbers: ScatterDimensionNumbers) -> Array: """Scatter-update operator. Wraps `XLA's Scatter operator @@ -848,21 +951,21 @@ def scatter(operand, scatter_indices, updates, dimension_numbers): operand, scatter_indices, updates, update_jaxpr=jaxpr, update_consts=consts, dimension_numbers=dimension_numbers) -def index_take(src, idxs, axes): +def index_take(src: Array, idxs: Array, axes: Sequence[int]) -> Array: indices = concatenate([reshape(i, [i.shape[0], 1]) for i in idxs], 1) indices = indices % onp.array([src.shape[ax] for ax in axes]) slice_sizes = list(src.shape) for ax in axes: slice_sizes[ax] = 1 - slice_sizes = tuple(slice_sizes) offset_dims = tuple(range(1, src.ndim - indices.shape[1] + 1)) dnums = GatherDimensionNumbers( offset_dims=offset_dims, collapsed_slice_dims=axes, start_index_map=axes) - return gather(src, indices, dimension_numbers=dnums, slice_sizes=slice_sizes) + return gather(src, indices, dimension_numbers=dnums, + slice_sizes=tuple(slice_sizes)) -def transpose(operand, permutation): +def transpose(operand: Array, permutation: Sequence[int]) -> Array: """Wraps XLA's `Transpose `_ operator. @@ -873,7 +976,8 @@ def transpose(operand, permutation): else: return transpose_p.bind(operand, permutation=permutation) -def reduce(operand, init_value, computation, dimensions): +def reduce(operand: Array, init_value: Array, computation: Callable, + dimensions: Sequence[int]) -> Array: """Wraps XLA's `Reduce `_ operator. @@ -893,7 +997,7 @@ def _reduction_jaxpr(computation, aval): jaxpr, _, consts = pe.trace_to_jaxpr(comp, (pval, pval), instantiate=False) return jaxpr, consts -def _get_monoid_reducer(monoid_op, x): +def _get_monoid_reducer(monoid_op: Callable, x: Array) -> Optional[Callable]: aval = core.get_aval(x) dtype = _dtype(x) if (type(aval) is ConcreteArray) and aval.shape == (): @@ -909,8 +1013,9 @@ def _get_monoid_reducer(monoid_op, x): return aval.val == _get_max_identity(dtype) and _reduce_max elif monoid_op is min: return aval.val == _get_min_identity(dtype) and _reduce_min + return None -def _get_max_identity(dtype): +def _get_max_identity(dtype: DType) -> Array: if dtypes.issubdtype(dtype, onp.inexact): return onp.array(-onp.inf, dtype) elif dtypes.issubdtype(dtype, onp.integer): @@ -918,7 +1023,7 @@ def _get_max_identity(dtype): elif dtypes.issubdtype(dtype, onp.bool_): return onp.array(False, onp.bool_) -def _get_min_identity(dtype): +def _get_min_identity(dtype: DType) -> Array: if dtypes.issubdtype(dtype, onp.inexact): return onp.array(onp.inf, dtype) elif dtypes.issubdtype(dtype, onp.integer): @@ -926,26 +1031,27 @@ def _get_min_identity(dtype): elif dtypes.issubdtype(dtype, onp.bool_): return onp.array(True, onp.bool_) -def _reduce_sum(operand, axes): +def _reduce_sum(operand: Array, axes: Sequence[int]) -> Array: return reduce_sum_p.bind(operand, axes=tuple(axes)) -def _reduce_prod(operand, axes): +def _reduce_prod(operand: Array, axes: Sequence[int]) -> Array: return reduce_prod_p.bind(operand, axes=tuple(axes)) -def _reduce_max(operand, axes): +def _reduce_max(operand: Array, axes: Sequence[int]) -> Array: return reduce_max_p.bind(operand, axes=tuple(axes)) -def _reduce_min(operand, axes): +def _reduce_min(operand: Array, axes: Sequence[int]) -> Array: return reduce_min_p.bind(operand, axes=tuple(axes)) -def _reduce_or(operand, axes): +def _reduce_or(operand: Array, axes: Sequence[int]) -> Array: return reduce_or_p.bind(operand, axes=tuple(axes)) -def _reduce_and(operand, axes): +def _reduce_and(operand: Array, axes: Sequence[int]) -> Array: return reduce_and_p.bind(operand, axes=tuple(axes)) -def reduce_window(operand, init_value, computation, window_dimensions, - window_strides, padding): +def reduce_window(operand: Array, init_value: Array, computation: Callable, + window_dimensions: Shape, window_strides: Sequence[int], + padding: str) -> Array: """Wraps XLA's `ReduceWindow `_ operator. @@ -960,7 +1066,7 @@ def reduce_window(operand, init_value, computation, window_dimensions, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def _get_monoid_window_reducer(monoid_op, x): +def _get_monoid_window_reducer(monoid_op: Callable, x: Array) -> Optional[Callable]: aval = core.get_aval(x) if (type(aval) is ConcreteArray) and aval.shape == (): if monoid_op is add: @@ -969,13 +1075,16 @@ def _get_monoid_window_reducer(monoid_op, x): return aval.val == _get_max_identity(aval.dtype) and _reduce_window_max elif monoid_op is min: return aval.val == _get_min_identity(aval.dtype) and _reduce_window_min + return None -def _reduce_window_sum(operand, window_dimensions, window_strides, padding): +def _reduce_window_sum(operand: Array, window_dimensions: Shape, + window_strides: Sequence[int], padding: str) -> Array: return reduce_window_sum_p.bind( operand, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def _reduce_window_prod(operand, window_dimensions, window_strides, padding): +def _reduce_window_prod(operand: Array, window_dimensions: Shape, + window_strides: Sequence[int], padding: str) -> Array: init_value = _const(operand, 1) jaxpr, consts = _reduction_jaxpr(mul, _abstractify(init_value)) return reduce_window_p.bind( @@ -983,18 +1092,22 @@ def _reduce_window_prod(operand, window_dimensions, window_strides, padding): window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def _reduce_window_max(operand, window_dimensions, window_strides, padding): +def _reduce_window_max(operand: Array, window_dimensions: Shape, + window_strides: Sequence[int], padding: str) -> Array: return reduce_window_max_p.bind( operand, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def _reduce_window_min(operand, window_dimensions, window_strides, padding): +def _reduce_window_min(operand: Array, window_dimensions: Shape, + window_strides: Sequence[int], padding: str) -> Array: return reduce_window_min_p.bind( operand, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def _select_and_scatter(operand, select, window_dimensions, window_strides, - padding, source, init_value, scatter): +def _select_and_scatter(operand: Array, select: Callable, + window_dimensions: Shape, window_strides: Sequence[int], + padding: str, source: Array, init_value: Array, + scatter: Callable) -> Array: select_jaxpr, select_consts = _reduction_jaxpr(select, _abstractify(init_value)) scatter_jaxpr, scatter_consts = _reduction_jaxpr(scatter, _abstractify(init_value)) return select_and_scatter_p.bind( @@ -1003,48 +1116,54 @@ def _select_and_scatter(operand, select, window_dimensions, window_strides, scatter_consts=scatter_consts, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def _select_and_scatter_add(source, operand, select_prim, window_dimensions, - window_strides, padding): +def _select_and_scatter_add(source: Array, operand: Array, + select_prim: core.Primitive, + window_dimensions: Shape, + window_strides: Sequence[int], + padding: str) -> Array: return select_and_scatter_add_p.bind( source, operand, select_prim=select_prim, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def _select_and_gather_add(tangents, operand, select_prim, window_dimensions, - window_strides, padding): +def _select_and_gather_add(tangents: Array, operand: Array, + select_prim: core.Primitive, + window_dimensions: Shape, + window_strides: Sequence[int], + padding: str) -> Array: return select_and_gather_add_p.bind( tangents, operand, select_prim=select_prim, window_dimensions=tuple(window_dimensions), window_strides=tuple(window_strides), padding=padding) -def cumsum(operand, axis: int): +def cumsum(operand: Array, axis: int) -> Array: """Computes a cumulative sum along `axis`.""" return cumsum_p.bind(operand, axis=int(axis)) -def cumprod(operand, axis: int): +def cumprod(operand: Array, axis: int) -> Array: """Computes a cumulative product along `axis`.""" return cumprod_p.bind(operand, axis=int(axis)) -def sort(operand, dimension=-1): +def sort(operand: Array, dimension: int = -1) -> Array: """Wraps XLA's `Sort `_ operator. """ return sort_p.bind(operand, dimension=dimension) -def sort_key_val(keys, values, dimension=-1): +def sort_key_val(keys: Array, values: Array, dimension: int = -1) -> Array: # TODO(mattjj): new sort_key_val is variadic result = sort_key_val_p.bind(keys, values, dimension=dimension) sorted_keys, sorted_values = result return sorted_keys, sorted_values -def top_k(operand, k): +def top_k(operand: Array, k: int) -> Array: k = int(k) if k < 0: raise ValueError("k argument to top_k must be nonnegative, got {}".format(k)) return top_k_p.bind(operand, k=k) -def tie_in(x, y): +def tie_in(x: Array, y: Array) -> Array: """Gives ``y`` a fake data dependence on ``x``. When staging to XLA (e.g. running under jit or pmap), values that don't depend @@ -1059,7 +1178,7 @@ def tie_in(x, y): return tie_in_p.bind(x, y) -def full(shape, fill_value, dtype=None): +def full(shape: Shape, fill_value: Array, dtype: Optional[DType] = None) -> Array: """Returns an array of `shape` filled with `fill_value`. Arguments: @@ -1077,7 +1196,7 @@ def full(shape, fill_value, dtype=None): fill_value = xla.device_put_p.bind(convert_element_type(fill_value, dtype)) return broadcast(fill_value, shape) -def iota(dtype, size): +def iota(dtype: DType, size: int) -> Array: """Wraps XLA's `Iota `_ operator. @@ -1088,14 +1207,14 @@ def iota(dtype, size): aval = ShapedArray((size,), dtype) return xla.DeviceArray(aval, None, lazy_expr, xla.DeviceConstant()) -def broadcasted_iota(dtype, shape, dimension): +def broadcasted_iota(dtype: DType, shape: Shape, dimension: int) -> Array: """Convenience wrapper around ``iota``.""" dtype = dtypes.canonicalize_dtype(dtype) shape = canonicalize_shape(shape) dimension = int(dimension) return broadcast_in_dim(iota(dtype, shape[dimension]), shape, [dimension]) -def _eye(dtype, shape, offset): +def _eye(dtype: DType, shape: Shape, offset: int) -> Array: """Like numpy.eye, create a 2D array with ones on a diagonal. This function exists for creating lazy identity matrices; that is, @@ -1108,7 +1227,7 @@ def _eye(dtype, shape, offset): aval = ShapedArray((N, M), dtype) return xla.DeviceArray(aval, None, lazy_expr, xla.DeviceConstant()) -def _delta(dtype, shape, axes): +def _delta(dtype: DType, shape: Shape, axes: Sequence[int]) -> Array: """This function exists for creating lazy Kronecker delta arrays, particularly for use in jax.numpy.einsum to express traces. It differs from ``eye`` in that it can create arrays of any rank, but doesn't allow offsets.""" @@ -1120,7 +1239,7 @@ def _delta(dtype, shape, axes): aval = ShapedArray(shape, dtype) return xla.DeviceArray(aval, None, lazy_expr, xla.DeviceConstant()) -def _tri(dtype, shape, offset): +def _tri(dtype: DType, shape: Shape, offset: int) -> Array: """Like numpy.tri, create a 2D array with ones below a diagonal. This function exists for creating lazy triangular matrices, particularly for use in jax.numpy.tri.""" @@ -1157,7 +1276,8 @@ def stop_gradient(x): ### convenience wrappers around traceables -def conv(lhs, rhs, window_strides, padding, precision=None): +def conv(lhs: Array, rhs: Array, window_strides: Sequence[int], + padding: str, precision: Optional[PrecisionType] = None) -> Array: """Convenience wrapper around `conv_general_dilated`. Args: @@ -1176,8 +1296,12 @@ def conv(lhs, rhs, window_strides, padding, precision=None): return conv_general_dilated(lhs, rhs, window_strides, padding, precision=precision) -def conv_with_general_padding(lhs, rhs, window_strides, padding, - lhs_dilation, rhs_dilation, precision=None): +def conv_with_general_padding(lhs: Array, rhs: Array, + window_strides: Sequence[int], + padding: Union[str, Sequence[Tuple[int, int]]], + lhs_dilation: Optional[Sequence[int]], + rhs_dilation: Optional[Sequence[int]], + precision: Optional[PrecisionType] = None) -> Array: """Convenience wrapper around `conv_general_dilated`. Args: @@ -1238,8 +1362,12 @@ def _flip_axes(x, axes): return x -def conv_transpose(lhs, rhs, strides, padding, rhs_dilation=None, - dimension_numbers=None, transpose_kernel=False, precision=None): +def conv_transpose(lhs: Array, rhs: Array, strides: Sequence[int], + padding: Union[str, Sequence[Tuple[int, int]]], + rhs_dilation: Optional[Sequence[int]] = None, + dimension_numbers: ConvGeneralDilatedDimensionNumbers = None, + transpose_kernel: bool = False, + precision: Optional[PrecisionType] = None) -> Array: """Convenience wrapper for calculating the N-d convolution "transpose". This function directly calculates a fractionally strided conv rather than @@ -1286,6 +1414,7 @@ def conv_transpose(lhs, rhs, strides, padding, rhs_dilation=None, k_shape = onp.take(rhs.shape, dn.rhs_spec) k_sdims = k_shape[2:] # Calculate correct output shape given padding and strides. + pads: Union[str, Sequence[Tuple[int, int]]] if padding in {'SAME', 'VALID'}: if rhs_dilation is None: rhs_dilation = (1,) * (rhs.ndim - 2) @@ -1302,7 +1431,8 @@ def conv_transpose(lhs, rhs, strides, padding, rhs_dilation=None, precision=precision) -def full_like(x, fill_value, dtype=None, shape=None): +def full_like(x: Array, fill_value: Array, dtype: Optional[DType] = None, + shape: Optional[Shape] = None) -> Array: """Create a full array like np.full based on the example array `x`. Args: @@ -1315,19 +1445,21 @@ def full_like(x, fill_value, dtype=None, shape=None): An ndarray with the same shape as `x` with its entries set equal to `fill_value`, similar to the output of np.full. """ - shape = onp.shape(x) if shape is None else canonicalize_shape(shape) + fill_shape = onp.shape(x) if shape is None else canonicalize_shape(shape) fill_value = tie_in(x, fill_value) - return full(shape, fill_value, dtype or _dtype(x)) + return full(fill_shape, fill_value, dtype or _dtype(x)) -def collapse(operand, start_dimension, stop_dimension): +def collapse(operand: Array, start_dimension: int, stop_dimension: int) -> Array: lo, hi = start_dimension, stop_dimension size = prod(operand.shape[lo:hi]) new_shape = operand.shape[:lo] + (size,) + operand.shape[hi:] return reshape(operand, new_shape) -def slice_in_dim(operand, start_index, limit_index, stride=1, axis=0): +def slice_in_dim(operand: Array, start_index: Optional[int], + limit_index: Optional[int], + stride: int = 1, axis: int = 0)-> Array: """Convenience wrapper around slice applying to only one dimension.""" start_indices = [0] * operand.ndim limit_indices = list(operand.shape) @@ -1335,24 +1467,25 @@ def slice_in_dim(operand, start_index, limit_index, stride=1, axis=0): # translate `None` len_axis = operand.shape[axis] - start_index = start_index if start_index is not None else 0 - limit_index = limit_index if limit_index is not None else len_axis + start_index_int = int(start_index) if start_index is not None else 0 + limit_index_int = int(limit_index) if limit_index is not None else len_axis # translate negative indices - if start_index < 0: - start_index = start_index + len_axis - if limit_index < 0: - limit_index = limit_index + len_axis + if start_index_int < 0: + start_index_int = start_index_int + len_axis + if limit_index_int < 0: + limit_index_int = limit_index_int + len_axis axis = int(axis) - start_indices[axis] = int(start_index) - limit_indices[axis] = int(limit_index) + start_indices[axis] = start_index_int + limit_indices[axis] = limit_index_int strides[axis] = int(stride) return slice(operand, start_indices, limit_indices, strides) -def index_in_dim(operand, index, axis=0, keepdims=True): +def index_in_dim(operand: Array, index: int, axis: int = 0, + keepdims: bool = True) -> Array: """Convenience wrapper around slice to perform int indexing.""" index, axis = int(index), int(axis) axis_size = operand.shape[axis] @@ -1367,7 +1500,8 @@ def index_in_dim(operand, index, axis=0, keepdims=True): return reshape(result, onp.delete(operand.shape, axis)) -def dynamic_slice_in_dim(operand, start_index, slice_size, axis=0): +def dynamic_slice_in_dim(operand: Array, start_index: Array, + slice_size: int, axis: int = 0) -> Array: """Convenience wrapper around dynamic_slice applying to one dimension.""" start_indices = [_zero(start_index)] * operand.ndim slice_sizes = list(operand.shape) @@ -1378,7 +1512,8 @@ def dynamic_slice_in_dim(operand, start_index, slice_size, axis=0): return dynamic_slice(operand, start_indices, slice_sizes) -def dynamic_index_in_dim(operand, index, axis=0, keepdims=True): +def dynamic_index_in_dim(operand: Array, index: Array, axis: int = 0, + keepdims: bool = True) -> Array: """Convenience wrapper around dynamic_slice to perform int indexing.""" result = dynamic_slice_in_dim(operand, index, 1, axis) if keepdims: @@ -1387,14 +1522,16 @@ def dynamic_index_in_dim(operand, index, axis=0, keepdims=True): return reshape(result, onp.delete(operand.shape, axis)) -def dynamic_update_slice_in_dim(operand, update, start_index, axis): +def dynamic_update_slice_in_dim(operand: Array, update: Array, + start_index: Array, axis: int) -> Array: axis = int(axis) start_indices = [_zero(start_index)] * _ndim(operand) start_indices[axis] = start_index return dynamic_update_slice(operand, update, start_indices) -def dynamic_update_index_in_dim(operand, update, index, axis): +def dynamic_update_index_in_dim(operand: Array, update: Array, index: Array, + axis: int) -> Array: axis = int(axis) if _ndim(update) != _ndim(operand): assert _ndim(update) + 1 == _ndim(operand) @@ -1403,7 +1540,8 @@ def dynamic_update_index_in_dim(operand, update, index, axis): return dynamic_update_slice_in_dim(operand, update, index, axis) -def batch_matmul(lhs, rhs, precision=None): +def batch_matmul(lhs: Array, rhs: Array, + precision: Optional[PrecisionType] = None) -> Array: """Batch matrix multiplication.""" if _min(lhs.ndim, rhs.ndim) < 2: raise ValueError('Arguments to batch_matmul must be at least 2D, got {}, {}' @@ -1414,18 +1552,18 @@ def batch_matmul(lhs, rhs, precision=None): lhs_contract = (lhs.ndim - 1,) rhs_contract = (rhs.ndim - 2,) batch = tuple(range(lhs.ndim - 2)) - return dot_general(lhs, rhs, [(lhs_contract, rhs_contract), (batch, batch)], + return dot_general(lhs, rhs, ((lhs_contract, rhs_contract), (batch, batch)), precision=precision) # These functions also exist in the XLA client library, but we treat them # as non-primitive to maintain a smaller set of autodiff primitives. -def square(x): +def square(x: Array) -> Array: r"""Elementwise square: :math:`x^2`.""" return mul(x, x) -def reciprocal(x): +def reciprocal(x: Array) -> Array: r"""Elementwise reciprocal: :math:`1 \over x`.""" return div(_const(x, 1), x) @@ -1442,18 +1580,18 @@ def f_wrapped(x): @api.jit @_upcast_fp16_for_computation -def tan(x): +def tan(x: Array) -> Array: r"""Elementwise tangent: :math:`\mathrm{tan}(x)`.""" return div(sin(x), cos(x)) @api.jit -def asin(x): +def asin(x: Array) -> Array: r"""Elementwise arc sine: :math:`\mathrm{asin}(x)`.""" return mul(_const(x, 2), atan2(x, add(_const(x, 1), sqrt(sub(_const(x, 1), square(x)))))) @api.jit -def acos(x): +def acos(x: Array) -> Array: r"""Elementwise arc cosine: :math:`\mathrm{acos}(x)`.""" return select( ne(x, _const(x, -1.0)), @@ -1461,27 +1599,27 @@ def acos(x): atan2(sqrt(sub(_const(x, 1), square(x))), add(_const(x, 1), x))), full_like(x, onp.pi)) -def atan(x): +def atan(x: Array) -> Array: r"""Elementwise arc tangent: :math:`\mathrm{atan}(x)`.""" return atan2(x, _const(x, 1)) -def sinh(x): +def sinh(x: Array) -> Array: r"""Elementwise hyperbolic sine: :math:`\mathrm{sinh}(x)`.""" return sinh_p.bind(x) -def cosh(x): +def cosh(x: Array) -> Array: r"""Elementwise hyperbolic cosine: :math:`\mathrm{cosh}(x)`.""" return cosh_p.bind(x) -def asinh(x): +def asinh(x: Array) -> Array: r"""Elementwise inverse hyperbolic sine: :math:`\mathrm{asinh}(x)`.""" return asinh_p.bind(x) -def acosh(x): +def acosh(x: Array) -> Array: r"""Elementwise inverse hyperbolic cosine: :math:`\mathrm{acosh}(x)`.""" return acosh_p.bind(x) -def atanh(x): +def atanh(x: Array) -> Array: r"""Elementwise inverse hyperbolic tangent: :math:`\mathrm{atanh}(x)`.""" return atanh_p.bind(x) @@ -3029,31 +3167,6 @@ def _dynamic_update_slice_batching_rule(batched_args, batch_dims): _dynamic_update_slice_batching_rule -class GatherDimensionNumbers(collections.namedtuple( - "GatherDimensionNumbers", - ["offset_dims", "collapsed_slice_dims", "start_index_map"])): - """ - Describes the dimension number arguments to an `XLA's Gather operator - `_. See the XLA - documentation for more details of what the dimension numbers mean. - - Args: - offset_dims: the set of dimensions in the `gather` output that offset into - an array sliced from `operand`. Must be a tuple of integers in ascending - order, each representing a dimension number of the output. - collapsed_slice_dims: the set of dimensions `i` in `operand` that have - `slice_sizes[i] == 1` and that should not have a corresponding dimension - in the output of the gather. Must be a tuple of integers in ascending - order. - start_index_map: for each dimension in `start_indices`, gives the - corresponding dimension in `operand` that is to be sliced. Must be a - tuple of integers with size equal to `start_indices.shape[-1]`. - - Unlike XLA's `GatherDimensionNumbers` structure, `index_vector_dim` is - implicit; there is always an index vector dimension and it must always be the - last dimension. To gather scalar indices, add a trailing dimension of size 1. - """ - def _gather_dimensions_proto(indices_shape, dimension_numbers): assert type(dimension_numbers) is GatherDimensionNumbers proto = xla_client.GatherDimensionNumbers() @@ -3168,32 +3281,6 @@ def _gather_batching_rule(batched_args, batch_dims, *, dimension_numbers, batching.primitive_batchers[gather_p] = _gather_batching_rule -class ScatterDimensionNumbers(collections.namedtuple( - "ScatterDimensionNumbers", - ["update_window_dims", "inserted_window_dims", - "scatter_dims_to_operand_dims"])): - """ - Describes the dimension number arguments to an `XLA's Scatter operator - `_. See the XLA - documentation for more details of what the dimension numbers mean. - - Args: - update_window_dims: the set of dimensions in the `updates` that are window - dimensions. Must be a tuple of integers in ascending - order, each representing a dimension number. - inserted_window_dims: the set of size 1 window dimensions that must be inserted - into the shape of `updates`. Must be a tuple of integers in ascending - order, each representing a dimension number of the output. These are the - mirror image of `collapsed_slice_dims` in the case of `gather`. - scatter_dims_to_operand_dims: for each dimension in `scatter_indices`, gives - the corresponding dimension in `operand`. Must be a sequence of integers - with size equal to indices.shape[-1]. - - Unlike XLA's `ScatterDimensionNumbers` structure, `index_vector_dim` is - implicit; there is always an index vector dimension and it must always be the - last dimension. To scatter scalar indices, add a trailing dimension of size 1. - """ - def _scatter_dimensions_proto(indices_shape, dimension_numbers): assert type(dimension_numbers) is ScatterDimensionNumbers proto = xla_client.ScatterDimensionNumbers() @@ -4653,23 +4740,6 @@ def _canonicalize_precision(precision): raise ValueError(msg.format(precision)) -# lhs_spec and out_spec are lists containing -# [batch dim, feature dim, spatial dims ...] -# rhs_spec is a list containing: -# [out feature dim, in feature dim, spatial dims ...] -class ConvDimensionNumbers(collections.namedtuple( - "ConvDimensionNumbers", ["lhs_spec", "rhs_spec", "out_spec"])): - """Describes batch, spatial, and feature dimensions of a convolution. - - Args: - lhs_spec: a tuple of nonnegative integer dimension numbers containing - `(batch dimension, feature dimension, spatial dimensions...)`. - rhs_spec: a tuple of nonnegative integer dimension numbers containing - `(out feature dimension, in feature dimension, spatial dimensions...)`. - out_spec: a tuple of nonnegative integer dimension numbers containing - `(batch dimension, feature dimension, spatial dimensions...)`. - """ - def conv_dimension_numbers(lhs_shape, rhs_shape, dimension_numbers): """Converts convolution `dimension_numbers` to a `ConvDimensionNumbers`. From f37f235183a27279e10023e8b13b6ba833dbce23 Mon Sep 17 00:00:00 2001 From: Skye Wanderman-Milne Date: Wed, 8 Apr 2020 11:29:02 -0700 Subject: [PATCH 1052/1053] Fix up previous jaxpr.rst commit. (#2647) --- docs/jaxpr.rst | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/docs/jaxpr.rst b/docs/jaxpr.rst index c08de9b000ba..09bfdaae2051 100644 --- a/docs/jaxpr.rst +++ b/docs/jaxpr.rst @@ -1,4 +1,4 @@ -Understanding jaxprs +Understanding Jaxprs ==================== Updated: February 14, 2020 (for commit 9e6fe64). @@ -373,18 +373,6 @@ For the example consider the function ``func11`` below:: return lax.scan(body, 0., (arr, ones)) print(api.make_jaxpr(func11)(onp.ones(16), 5.)) - { lambda c ; a b. - let d e = scan[ forward=True - jaxpr={ lambda ; a b c d e. - let f = mul c e - g = add b f - h = add g a - in (h, b) } - length=16 - linear=(False, False, False, True, False) - num_carry=1 - num_consts=1 ] b 0.0 a * c - in (d, e) } { lambda c ; a b. let d e = scan[ forward=True jaxpr={ lambda ; f a b c. From 5f1f29e4060b9d319f53577c85854d8b21e9c442 Mon Sep 17 00:00:00 2001 From: Matthew Johnson Date: Wed, 8 Apr 2020 22:29:07 -0700 Subject: [PATCH 1053/1053] fix jaxpr invar avals When an input argument is known to partial_eval, the corresponding jaxpr (which represents only the staged-out, unknown part of the computation) has a dummy placeholder input with type (i.e. aval) abstract_unit. However, the avals attached to the invars were recording the aval of the known value in that case. cf. #2299 --- jax/interpreters/partial_eval.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/jax/interpreters/partial_eval.py b/jax/interpreters/partial_eval.py index 8df67df3744e..370f6e3d039c 100644 --- a/jax/interpreters/partial_eval.py +++ b/jax/interpreters/partial_eval.py @@ -446,8 +446,8 @@ def tracers_to_jaxpr(in_tracers, out_tracers): def getvar(t): var = t_to_var.get(id(t)) if var is None: - var = newvar(partial_val_aval(*t.pval)) - t_to_var[id(t)] = var + aval = t.pval[0] if t.pval[0] is not None else abstract_unit + var = t_to_var[id(t)] = newvar(aval) return var sorted_tracers = toposort(out_tracers) invars = map(getvar, in_tracers) @@ -458,8 +458,7 @@ def getvar(t): def getconstvar(c): var = const_to_var.get(id(c)) if var is None: - var = newvar(get_aval(c)) - const_to_var[id(c)] = var + var = const_to_var[id(c)] = newvar(get_aval(c)) return var processed_eqn_ids = set() for t in sorted_tracers:

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 z%0A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